mirror of
https://git.joinfirefish.org/firefish/firefish.git
synced 2024-05-19 17:11:12 +02:00
merge latest develop changes
This commit is contained in:
commit
a7bb42fce2
|
@ -35,7 +35,7 @@ port: 3000
|
|||
db:
|
||||
host: localhost
|
||||
port: 5432
|
||||
|
||||
#ssl: false
|
||||
# Database name
|
||||
db: calckey
|
||||
|
||||
|
@ -48,7 +48,9 @@ db:
|
|||
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl: true
|
||||
# ssl:
|
||||
# host: localhost
|
||||
# rejectUnauthorized: false
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
|
@ -56,6 +58,24 @@ db:
|
|||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
#tls:
|
||||
# host: localhost
|
||||
# rejectUnauthorized: false
|
||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
#db: 1
|
||||
#user: default
|
||||
|
||||
# ┌─────────────────────────────┐
|
||||
#───┘ Cache server configuration └─────────────────────────────────────
|
||||
|
||||
# A Redis-compatible server (DragonflyDB, Keydb, Redis) for caching
|
||||
# If left blank, it will use the Redis server from above
|
||||
|
||||
#cacheServer:
|
||||
#host: localhost
|
||||
#port: 6379
|
||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
|
|
|
@ -10,8 +10,12 @@ packages/backend/.idea/vcs.xml
|
|||
|
||||
# Node.js
|
||||
node_modules
|
||||
**/node_modules
|
||||
report.*.json
|
||||
|
||||
# Rust
|
||||
packages/backend/native-utils/target/*
|
||||
|
||||
# Cypress
|
||||
cypress/screenshots
|
||||
cypress/videos
|
||||
|
@ -24,9 +28,6 @@ coverage
|
|||
!/.config/example.yml
|
||||
!/.config/docker_example.env
|
||||
|
||||
#docker dev config
|
||||
/dev/docker-compose.yml
|
||||
|
||||
# misskey
|
||||
built
|
||||
db
|
||||
|
@ -46,3 +47,4 @@ packages/backend/assets/instance.css
|
|||
# dockerignore custom
|
||||
.git
|
||||
Dockerfile
|
||||
docker-compose.yml
|
||||
|
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -48,6 +48,9 @@ packages/backend/assets/sounds/None.mp3
|
|||
|
||||
!packages/backend/src/db
|
||||
|
||||
packages/megalodon/lib
|
||||
packages/megalodon/.idea
|
||||
|
||||
# blender backups
|
||||
*.blend1
|
||||
*.blend2
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
{
|
||||
"eslint.packageManager": "pnpm",
|
||||
"workspace.workspaceFolderCheckCwd": false
|
||||
}
|
33
CALCKEY.md
33
CALCKEY.md
|
@ -1,5 +1,8 @@
|
|||
# All the changes to Calckey from stock Misskey
|
||||
|
||||
> **Warning**
|
||||
> This list is incomplete. Please check the [Releases](https://codeberg.org/calckey/calckey/releases) and [Changelog](https://codeberg.org/calckey/calckey/src/branch/develop/CHANGELOG.md) for a more complete list of changes. There have been [>4000 commits (laggy link)](https://codeberg.org/calckey/calckey/compare/700a7110f7e34f314b070987aa761c451ec34efc...develop) since we forked Misskey!
|
||||
|
||||
## Planned
|
||||
|
||||
- Stucture
|
||||
|
@ -8,32 +11,25 @@
|
|||
- Rewrite backend in Rust and [Rocket](https://rocket.rs/)
|
||||
- Use [Magic RegExP](https://regexp.dev/) for RegEx 🦄
|
||||
- Function
|
||||
- Federate with note edits
|
||||
- User "choices" (recommended users) like Mastodon and Soapbox
|
||||
- User "choices" (recommended users) and featured hashtags like Mastodon and Soapbox
|
||||
- Join Reason system like Mastodon/Pleroma
|
||||
- Option to publicize server blocks
|
||||
- Build flag to remove NSFW/AI stuff
|
||||
- Filter notifications by user
|
||||
- Exclude self from antenna
|
||||
- More antenna options
|
||||
- Groups
|
||||
- Form
|
||||
- MFM button
|
||||
- Personal notes for all accounts
|
||||
- Fully revamp non-logged-in screen
|
||||
- Lookup/details for post/file/server
|
||||
- [Rat mode?](https://stop.voring.me/notes/933fx97bmd)
|
||||
|
||||
## Work in progress
|
||||
|
||||
- Weblate project
|
||||
- Customizable max note length
|
||||
- Link verification
|
||||
- Better Messaging UI
|
||||
- Better API Documentation
|
||||
- Remote follow button
|
||||
- Admin custom CSS
|
||||
- Add back time machine (jump to date)
|
||||
- Improve accesibility
|
||||
- Timeline filters
|
||||
- Events
|
||||
- Fully revamp non-logged-in screen
|
||||
|
||||
## Implemented
|
||||
|
||||
|
@ -74,7 +70,6 @@
|
|||
- Raw server info only for moderators
|
||||
- New spinner animation
|
||||
- Spinner instead of "Loading..."
|
||||
- SearchX instead of Google
|
||||
- Always signToActivityPubGet
|
||||
- Spacing on group items
|
||||
- Quotes have solid border
|
||||
|
@ -109,10 +104,6 @@
|
|||
- More antenna options
|
||||
- New dashboard
|
||||
- Backfill follower counts
|
||||
- Improved emoji licensing
|
||||
- This feature was ported from Misskey.
|
||||
- https://github.com/misskey-dev/misskey/commit/8ae9d2eaa8b0842671558370f787902e94b7f5a3: enhance: カスタム絵文字にライセンス情報を付与できるように
|
||||
- https://github.com/misskey-dev/misskey/commit/ed51209172441927d24339f0759a5badbee3c9b6: 絵文字のライセンスを表示できるように
|
||||
- Compile time compression
|
||||
- Sonic search
|
||||
- Popular color schemes, including Nord, Gruvbox, and Catppuccin
|
||||
|
@ -124,10 +115,16 @@
|
|||
- Improve system emails
|
||||
- Mod mail
|
||||
- Focus trapping and button labels
|
||||
- Meilisearch with filters
|
||||
- Post editing
|
||||
- Display remaining time on rate-limits
|
||||
- Proper 2FA input dialog
|
||||
- Let moderators see moderation nodes
|
||||
- Non-mangled unicode emojis
|
||||
- Skin tone selection support
|
||||
|
||||
## Implemented (remote)
|
||||
|
||||
|
||||
- MissV: [fix Misskey Forkbomb](https://code.vtopia.live/Vtopia/MissV/commit/40b23c070bd4adbb3188c73546c6c625138fb3c1)
|
||||
- [Make showing ads optional](https://github.com/misskey-dev/misskey/pull/8996)
|
||||
- [Tapping avatar in mobile opens account modal](https://github.com/misskey-dev/misskey/pull/9056)
|
||||
|
|
9736
CHANGELOG.md
9736
CHANGELOG.md
File diff suppressed because it is too large
Load diff
46
Dockerfile
46
Dockerfile
|
@ -1,10 +1,19 @@
|
|||
## Install dev and compilation dependencies, build files
|
||||
FROM node:19-alpine as build
|
||||
FROM alpine:3.18 as build
|
||||
WORKDIR /calckey
|
||||
|
||||
# Install compilation dependencies
|
||||
RUN apk update
|
||||
RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo vips
|
||||
RUN apk add --no-cache --no-progress git alpine-sdk python3 nodejs-current npm rust cargo vips
|
||||
|
||||
# Copy only the cargo dependency-related files first, to cache efficiently
|
||||
COPY packages/backend/native-utils/Cargo.toml packages/backend/native-utils/Cargo.toml
|
||||
COPY packages/backend/native-utils/Cargo.lock packages/backend/native-utils/Cargo.lock
|
||||
COPY packages/backend/native-utils/src/lib.rs packages/backend/native-utils/src/
|
||||
COPY packages/backend/native-utils/migration/Cargo.toml packages/backend/native-utils/migration/Cargo.toml
|
||||
COPY packages/backend/native-utils/migration/src/lib.rs packages/backend/native-utils/migration/src/
|
||||
|
||||
# Install cargo dependencies
|
||||
RUN cargo fetch --locked --manifest-path /calckey/packages/backend/native-utils/Cargo.toml
|
||||
|
||||
# Copy only the dependency-related files first, to cache efficiently
|
||||
COPY package.json pnpm*.yaml ./
|
||||
|
@ -16,27 +25,31 @@ COPY packages/backend/native-utils/package.json packages/backend/native-utils/pa
|
|||
COPY packages/backend/native-utils/npm/linux-x64-musl/package.json packages/backend/native-utils/npm/linux-x64-musl/package.json
|
||||
COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/backend/native-utils/npm/linux-arm64-musl/package.json
|
||||
|
||||
# Configure corepack and pnpm
|
||||
RUN corepack enable
|
||||
RUN corepack prepare pnpm@latest --activate
|
||||
# Configure corepack and pnpm, and install dev mode dependencies for compilation
|
||||
RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i --frozen-lockfile
|
||||
|
||||
# Install dev mode dependencies for compilation
|
||||
RUN pnpm i --frozen-lockfile
|
||||
# Copy in the rest of the native-utils rust files
|
||||
COPY packages/backend/native-utils/.cargo packages/backend/native-utils/.cargo
|
||||
COPY packages/backend/native-utils/build.rs packages/backend/native-utils/
|
||||
COPY packages/backend/native-utils/src packages/backend/native-utils/src/
|
||||
COPY packages/backend/native-utils/migration/src packages/backend/native-utils/migration/src/
|
||||
|
||||
# Copy in the rest of the files, to compile from TS to JS
|
||||
# Compile native-utils
|
||||
RUN pnpm run --filter native-utils build
|
||||
|
||||
# Copy in the rest of the files to compile
|
||||
COPY . ./
|
||||
RUN pnpm run build
|
||||
RUN env NODE_ENV=production sh -c "pnpm run --filter '!native-utils' build && pnpm run gulp"
|
||||
|
||||
# Trim down the dependencies to only the prod deps
|
||||
# Trim down the dependencies to only those for production
|
||||
RUN pnpm i --prod --frozen-lockfile
|
||||
|
||||
|
||||
## Runtime container
|
||||
FROM node:19-alpine
|
||||
FROM alpine:3.18
|
||||
WORKDIR /calckey
|
||||
|
||||
# Install runtime dependencies
|
||||
RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip rust cargo
|
||||
RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip nodejs-current
|
||||
|
||||
COPY . ./
|
||||
|
||||
|
@ -52,8 +65,9 @@ COPY --from=build /calckey/built /calckey/built
|
|||
COPY --from=build /calckey/packages/backend/built /calckey/packages/backend/built
|
||||
COPY --from=build /calckey/packages/backend/assets/instance.css /calckey/packages/backend/assets/instance.css
|
||||
COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages/backend/native-utils/built
|
||||
COPY --from=build /calckey/packages/backend/native-utils/target /calckey/packages/backend/native-utils/target
|
||||
|
||||
RUN corepack enable
|
||||
RUN corepack enable && corepack prepare pnpm@latest --activate
|
||||
ENV NODE_ENV=production
|
||||
VOLUME "/calckey/files"
|
||||
ENTRYPOINT [ "/sbin/tini", "--" ]
|
||||
CMD [ "pnpm", "run", "migrateandstart" ]
|
||||
|
|
43
README.md
43
README.md
|
@ -27,6 +27,8 @@
|
|||
- Read **[this document](./CALCKEY.md)** all for current and future differences.
|
||||
- Notable differences:
|
||||
- Improved UI/UX (especially on mobile)
|
||||
- Post editing
|
||||
- Content importing
|
||||
- Improved notifications
|
||||
- Improved server security
|
||||
- Improved accessibility
|
||||
|
@ -37,7 +39,7 @@
|
|||
- Better intro tutorial
|
||||
- Compatibility with Mastodon clients/apps
|
||||
- Backfill user information
|
||||
- Sonic search
|
||||
- Advanced search
|
||||
- Many more user and admin settings
|
||||
- [So much more!](./CALCKEY.md)
|
||||
|
||||
|
@ -47,17 +49,26 @@
|
|||
|
||||
# 🥂 Links
|
||||
|
||||
- 💸 OpenCollective: <https://opencollective.com/Calckey>
|
||||
- 💸 Liberapay: <https://liberapay.com/ThatOneCalculator>
|
||||
### Want to get involved? Great!
|
||||
|
||||
- If you have the means to, [donations](https://opencollective.com/Calckey) are a great way to keep us going.
|
||||
- If you know how to program in TypeScript, Vue, or Rust, read the [contributing](./CONTRIBUTING.md) document.
|
||||
- If you know a non-English language, translating Calckey on [Weblate](https://hosted.weblate.org/engage/calckey/) help bring Calckey to more people. No technical experience needed!
|
||||
- Want to write/report about us, have any professional inquiries, or just have questions to ask? Contact us [here!](https://calckey.org/contact/)
|
||||
|
||||
### All links
|
||||
|
||||
- 🌐 Homepage: <https://calckey.org>
|
||||
- 💸 Donations:
|
||||
- OpenCollective: <https://opencollective.com/Calckey>
|
||||
- Liberapay: <https://liberapay.com/ThatOneCalculator>
|
||||
- Donate publicly to get your name on the Patron list!
|
||||
- 🚢 Flagship server: <https://calckey.social>
|
||||
- 📣 Official account: <https://i.calckey.cloud/@calckey>
|
||||
- 💁 Matrix support room: <https://matrix.to/#/#calckey:matrix.fedibird.com>
|
||||
- 📜 Server list: <https://calckey.fediverse.observer/list>
|
||||
- 📖 JoinFediverse Wiki: <https://joinfediverse.wiki/What_is_Calckey%3F>
|
||||
- 🐋 Docker Hub: <https://hub.docker.com/r/thatonecalculator/calckey>
|
||||
- 📣 Official account: <https://i.calckey.cloud/@calckey>
|
||||
- 📜 Server list: <https://calckey.org/join>
|
||||
- ✍️ Weblate: <https://hosted.weblate.org/engage/calckey/>
|
||||
- 📦 Yunohost: <https://github.com/YunoHost-Apps/calckey_ynh>
|
||||
- ️️📬 Contact: <https://calckey.org/contact/>
|
||||
|
||||
# 🌠 Getting started
|
||||
|
||||
|
@ -84,6 +95,7 @@ If you have access to a server that supports one of the sources below, I recomme
|
|||
- 🍀 Nginx (recommended)
|
||||
- 🦦 Caddy
|
||||
- 🪶 Apache
|
||||
- ⚡ [libvips](https://www.libvips.org/)
|
||||
|
||||
### 😗 Optional dependencies
|
||||
|
||||
|
@ -92,10 +104,13 @@ If you have access to a server that supports one of the sources below, I recomme
|
|||
- 🦔 [Sonic](https://crates.io/crates/sonic-server)
|
||||
- [MeiliSearch](https://www.meilisearch.com/)
|
||||
- [ElasticSearch](https://www.elastic.co/elasticsearch/)
|
||||
|
||||
- Caching server
|
||||
- 🐲 At least [DragonflyDB](https://www.dragonflydb.io/) v1.4.0 (recommended)
|
||||
- 👻 At least [KeyDB](https://keydb.dev/) v6.3.3
|
||||
- 🍱 Another [Redis](https://redis.io/) server, at least v6
|
||||
### 🏗️ Build dependencies
|
||||
|
||||
- 🦀 At least [Rust](https://www.rust-lang.org/) v1.65.0
|
||||
- 🦀 At least [Rust](https://www.rust-lang.org/) v1.68.0
|
||||
- 🦬 C/C++ compiler & build tools
|
||||
- `build-essential` on Debian/Ubuntu Linux
|
||||
- `base-devel` on Arch Linux
|
||||
|
@ -149,11 +164,15 @@ psql postgres -c "create database calckey with encoding = 'UTF8';"
|
|||
|
||||
In Calckey's directory, fill out the `db` section of `.config/default.yml` with the correct information, where the `db` key is `calckey`.
|
||||
|
||||
## 💰 Caching server
|
||||
|
||||
If you experience a lot of traffic, it's a good idea to set up another Redis-compatible caching server. If you don't set one one up, it'll fall back to the mandatory Redis server. DragonflyDB is the recommended option due to its unrivaled performance and ease of use.
|
||||
|
||||
## 🔎 Set up search
|
||||
|
||||
### 🦔 Sonic
|
||||
|
||||
Sonic is better suited for self hosters with smaller deployments. It's easier to use, uses almost no resources, and takes barely any any disk space.
|
||||
Sonic is better suited for self hosters with smaller deployments. It uses almost no resources, barely any any disk space, and is relatively fast.
|
||||
|
||||
Follow sonic's [installation guide](https://github.com/valeriansaliou/sonic#installation)
|
||||
|
||||
|
@ -247,4 +266,4 @@ pm2 start "NODE_ENV=production pnpm run start" --name Calckey
|
|||
- Go back to Overview > click the clipboard icon next to the ID
|
||||
- Run `psql -d calckey` (or whatever the database name is)
|
||||
- Run `UPDATE "user" SET "isAdmin" = true WHERE id='999999';` (replace `999999` with the copied ID)
|
||||
- Have the new admin log out and log back in
|
||||
- Restart your Calckey server
|
||||
|
|
|
@ -137,7 +137,9 @@ db:
|
|||
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl: true
|
||||
# ssl:
|
||||
# host: localhost
|
||||
# rejectUnauthorized: false
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
|
@ -157,6 +159,10 @@ redis:
|
|||
{{- if .Values.redis.db }}
|
||||
db: {{ .Values.redis.db }}
|
||||
{{- end }}
|
||||
#user: default
|
||||
#tls:
|
||||
# host: localhost
|
||||
# rejectUnauthorized: false
|
||||
|
||||
# Please configure either MeiliSearch *or* Sonic.
|
||||
# If both MeiliSearch and Sonic configurations are present, MeiliSearch will take precedence.
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
import { defineConfig } from 'cypress'
|
||||
import { defineConfig } from "cypress";
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
// We've imported your old cypress plugins here.
|
||||
// You may want to clean this up later by importing these.
|
||||
setupNodeEvents(on, config) {
|
||||
return require('./cypress/plugins/index.js')(on, config)
|
||||
},
|
||||
baseUrl: 'http://localhost:61812',
|
||||
},
|
||||
})
|
||||
e2e: {
|
||||
// We've imported your old cypress plugins here.
|
||||
// You may want to clean this up later by importing these.
|
||||
setupNodeEvents(on, config) {
|
||||
return require("./cypress/plugins/index.js")(on, config);
|
||||
},
|
||||
baseUrl: "http://localhost:61812",
|
||||
},
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
describe('Before setup instance', () => {
|
||||
describe("Before setup instance", () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
});
|
||||
|
@ -9,31 +9,31 @@ describe('Before setup instance', () => {
|
|||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visit('/');
|
||||
});
|
||||
it("successfully loads", () => {
|
||||
cy.visit("/");
|
||||
});
|
||||
|
||||
it('setup instance', () => {
|
||||
cy.visit('/');
|
||||
it("setup instance", () => {
|
||||
cy.visit("/");
|
||||
|
||||
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||
|
||||
cy.get('[data-cy-admin-username] input').type('admin');
|
||||
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||
cy.get('[data-cy-admin-ok]').click();
|
||||
cy.intercept("POST", "/api/admin/accounts/create").as("signup");
|
||||
|
||||
cy.get("[data-cy-admin-username] input").type("admin");
|
||||
cy.get("[data-cy-admin-password] input").type("admin1234");
|
||||
cy.get("[data-cy-admin-ok]").click();
|
||||
|
||||
// なぜか動かない
|
||||
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
||||
cy.wait('@signup');
|
||||
});
|
||||
cy.wait("@signup");
|
||||
});
|
||||
});
|
||||
|
||||
describe('After setup instance', () => {
|
||||
describe("After setup instance", () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
cy.registerUser("admin", "pass", true);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
@ -42,34 +42,34 @@ describe('After setup instance', () => {
|
|||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visit('/');
|
||||
});
|
||||
it("successfully loads", () => {
|
||||
cy.visit("/");
|
||||
});
|
||||
|
||||
it('signup', () => {
|
||||
cy.visit('/');
|
||||
it("signup", () => {
|
||||
cy.visit("/");
|
||||
|
||||
cy.intercept('POST', '/api/signup').as('signup');
|
||||
cy.intercept("POST", "/api/signup").as("signup");
|
||||
|
||||
cy.get('[data-cy-signup]').click();
|
||||
cy.get('[data-cy-signup-username] input').type('alice');
|
||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-submit]').click();
|
||||
cy.get("[data-cy-signup]").click();
|
||||
cy.get("[data-cy-signup-username] input").type("alice");
|
||||
cy.get("[data-cy-signup-password] input").type("alice1234");
|
||||
cy.get("[data-cy-signup-password-retype] input").type("alice1234");
|
||||
cy.get("[data-cy-signup-submit]").click();
|
||||
|
||||
cy.wait('@signup');
|
||||
});
|
||||
cy.wait("@signup");
|
||||
});
|
||||
});
|
||||
|
||||
describe('After user signup', () => {
|
||||
describe("After user signup", () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
cy.registerUser("admin", "pass", true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
cy.registerUser("alice", "alice1234");
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
@ -78,51 +78,53 @@ describe('After user signup', () => {
|
|||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visit('/');
|
||||
});
|
||||
it("successfully loads", () => {
|
||||
cy.visit("/");
|
||||
});
|
||||
|
||||
it('signin', () => {
|
||||
cy.visit('/');
|
||||
it("signin", () => {
|
||||
cy.visit("/");
|
||||
|
||||
cy.intercept('POST', '/api/signin').as('signin');
|
||||
cy.intercept("POST", "/api/signin").as("signin");
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type('alice');
|
||||
cy.get("[data-cy-signin]").click();
|
||||
cy.get("[data-cy-signin-username] input").type("alice");
|
||||
// Enterキーでサインインできるかの確認も兼ねる
|
||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||
cy.get("[data-cy-signin-password] input").type("alice1234{enter}");
|
||||
|
||||
cy.wait('@signin');
|
||||
});
|
||||
cy.wait("@signin");
|
||||
});
|
||||
|
||||
it('suspend', function() {
|
||||
cy.request('POST', '/api/admin/suspend-user', {
|
||||
it("suspend", function () {
|
||||
cy.request("POST", "/api/admin/suspend-user", {
|
||||
i: this.admin.token,
|
||||
userId: this.alice.id,
|
||||
});
|
||||
|
||||
cy.visit('/');
|
||||
cy.visit("/");
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type('alice');
|
||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||
cy.get("[data-cy-signin]").click();
|
||||
cy.get("[data-cy-signin-username] input").type("alice");
|
||||
cy.get("[data-cy-signin-password] input").type("alice1234{enter}");
|
||||
|
||||
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
||||
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
||||
cy.contains(
|
||||
/アカウントが凍結されています|This account has been suspended due to/gi,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('After user singed in', () => {
|
||||
describe("After user singed in", () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
cy.registerUser("admin", "pass", true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
cy.registerUser("alice", "alice1234");
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
cy.login("alice", "alice1234");
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
@ -131,17 +133,17 @@ describe('After user singed in', () => {
|
|||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
||||
});
|
||||
it("successfully loads", () => {
|
||||
cy.get("[data-cy-open-post-form]").should("be.visible");
|
||||
});
|
||||
|
||||
it('note', () => {
|
||||
cy.get('[data-cy-open-post-form]').click();
|
||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||
cy.get('[data-cy-open-post-form-submit]').click();
|
||||
it("note", () => {
|
||||
cy.get("[data-cy-open-post-form]").click();
|
||||
cy.get("[data-cy-post-form-text]").type("Hello, Misskey!");
|
||||
cy.get("[data-cy-open-post-form-submit]").click();
|
||||
|
||||
cy.contains('Hello, Misskey!');
|
||||
});
|
||||
cy.contains("Hello, Misskey!");
|
||||
});
|
||||
});
|
||||
|
||||
// TODO: 投稿フォームの公開範囲指定のテスト
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
describe('After user signed in', () => {
|
||||
describe("After user signed in", () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
cy.viewport('macbook-16');
|
||||
cy.viewport("macbook-16");
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
cy.registerUser("admin", "pass", true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
cy.registerUser("alice", "alice1234");
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
cy.login("alice", "alice1234");
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
@ -17,47 +17,47 @@ describe('After user signed in', () => {
|
|||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('widget edit toggle is visible', () => {
|
||||
cy.get('.mk-widget-edit').should('be.visible');
|
||||
});
|
||||
it("widget edit toggle is visible", () => {
|
||||
cy.get(".mk-widget-edit").should("be.visible");
|
||||
});
|
||||
|
||||
it('widget select should be visible in edit mode', () => {
|
||||
cy.get('.mk-widget-edit').click();
|
||||
cy.get('.mk-widget-select').should('be.visible');
|
||||
});
|
||||
it("widget select should be visible in edit mode", () => {
|
||||
cy.get(".mk-widget-edit").click();
|
||||
cy.get(".mk-widget-select").should("be.visible");
|
||||
});
|
||||
|
||||
it('first widget should be removed', () => {
|
||||
cy.get('.mk-widget-edit').click();
|
||||
cy.get('.customize-container:first-child .remove._button').click();
|
||||
cy.get('.customize-container').should('have.length', 2);
|
||||
it("first widget should be removed", () => {
|
||||
cy.get(".mk-widget-edit").click();
|
||||
cy.get(".customize-container:first-child .remove._button").click();
|
||||
cy.get(".customize-container").should("have.length", 2);
|
||||
});
|
||||
|
||||
function buildWidgetTest(widgetName) {
|
||||
it(`${widgetName} widget should get added`, () => {
|
||||
cy.get('.mk-widget-edit').click();
|
||||
cy.get('.mk-widget-select select').select(widgetName, { force: true });
|
||||
cy.get('.bg._modalBg.transparent').click({ multiple: true, force: true });
|
||||
cy.get('.mk-widget-add').click({ force: true });
|
||||
cy.get(`.mkw-${widgetName}`).should('exist');
|
||||
cy.get(".mk-widget-edit").click();
|
||||
cy.get(".mk-widget-select select").select(widgetName, { force: true });
|
||||
cy.get(".bg._modalBg.transparent").click({ multiple: true, force: true });
|
||||
cy.get(".mk-widget-add").click({ force: true });
|
||||
cy.get(`.mkw-${widgetName}`).should("exist");
|
||||
});
|
||||
}
|
||||
|
||||
buildWidgetTest('memo');
|
||||
buildWidgetTest('notifications');
|
||||
buildWidgetTest('timeline');
|
||||
buildWidgetTest('calendar');
|
||||
buildWidgetTest('rss');
|
||||
buildWidgetTest('trends');
|
||||
buildWidgetTest('clock');
|
||||
buildWidgetTest('activity');
|
||||
buildWidgetTest('photos');
|
||||
buildWidgetTest('digitalClock');
|
||||
buildWidgetTest('federation');
|
||||
buildWidgetTest('postForm');
|
||||
buildWidgetTest('slideshow');
|
||||
buildWidgetTest('serverMetric');
|
||||
buildWidgetTest('onlineUsers');
|
||||
buildWidgetTest('jobQueue');
|
||||
buildWidgetTest('button');
|
||||
buildWidgetTest('aiscript');
|
||||
buildWidgetTest("memo");
|
||||
buildWidgetTest("notifications");
|
||||
buildWidgetTest("timeline");
|
||||
buildWidgetTest("calendar");
|
||||
buildWidgetTest("rss");
|
||||
buildWidgetTest("trends");
|
||||
buildWidgetTest("clock");
|
||||
buildWidgetTest("activity");
|
||||
buildWidgetTest("photos");
|
||||
buildWidgetTest("digitalClock");
|
||||
buildWidgetTest("federation");
|
||||
buildWidgetTest("postForm");
|
||||
buildWidgetTest("slideshow");
|
||||
buildWidgetTest("serverMetric");
|
||||
buildWidgetTest("onlineUsers");
|
||||
buildWidgetTest("jobQueue");
|
||||
buildWidgetTest("button");
|
||||
buildWidgetTest("aiscript");
|
||||
});
|
||||
|
|
|
@ -16,6 +16,6 @@
|
|||
* @type {Cypress.PluginConfig}
|
||||
*/
|
||||
module.exports = (on, config) => {
|
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
}
|
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
};
|
||||
|
|
|
@ -24,32 +24,34 @@
|
|||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
|
||||
Cypress.Commands.add('resetState', () => {
|
||||
cy.window(win => {
|
||||
win.indexedDB.deleteDatabase('keyval-store');
|
||||
Cypress.Commands.add("resetState", () => {
|
||||
cy.window((win) => {
|
||||
win.indexedDB.deleteDatabase("keyval-store");
|
||||
});
|
||||
cy.request('POST', '/api/reset-db').as('reset');
|
||||
cy.get('@reset').its('status').should('equal', 204);
|
||||
cy.request("POST", "/api/reset-db").as("reset");
|
||||
cy.get("@reset").its("status").should("equal", 204);
|
||||
cy.reload(true);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
||||
const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup';
|
||||
Cypress.Commands.add("registerUser", (username, password, isAdmin = false) => {
|
||||
const route = isAdmin ? "/api/admin/accounts/create" : "/api/signup";
|
||||
|
||||
cy.request('POST', route, {
|
||||
cy.request("POST", route, {
|
||||
username: username,
|
||||
password: password,
|
||||
}).its('body').as(username);
|
||||
})
|
||||
.its("body")
|
||||
.as(username);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('login', (username, password) => {
|
||||
cy.visit('/');
|
||||
Cypress.Commands.add("login", (username, password) => {
|
||||
cy.visit("/");
|
||||
|
||||
cy.intercept('POST', '/api/signin').as('signin');
|
||||
cy.intercept("POST", "/api/signin").as("signin");
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type(username);
|
||||
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
||||
cy.get("[data-cy-signin]").click();
|
||||
cy.get("[data-cy-signin-username] input").type(username);
|
||||
cy.get("[data-cy-signin-password] input").type(`${password}{enter}`);
|
||||
|
||||
cy.wait('@signin').as('signedIn');
|
||||
cy.wait("@signin").as("signedIn");
|
||||
});
|
||||
|
|
|
@ -14,19 +14,21 @@
|
|||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
import "./commands";
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
|
||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||
if ([
|
||||
// Chrome
|
||||
'ResizeObserver loop limit exceeded',
|
||||
Cypress.on("uncaught:exception", (err, runnable) => {
|
||||
if (
|
||||
[
|
||||
// Chrome
|
||||
"ResizeObserver loop limit exceeded",
|
||||
|
||||
// Firefox
|
||||
'ResizeObserver loop completed with undelivered notifications',
|
||||
].some(msg => err.message.includes(msg))) {
|
||||
// Firefox
|
||||
"ResizeObserver loop completed with undelivered notifications",
|
||||
].some((msg) => err.message.includes(msg))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
|
|
@ -19,8 +19,6 @@ services:
|
|||
environment:
|
||||
NODE_ENV: production
|
||||
volumes:
|
||||
- ./.cargo-cache:/root/.cargo
|
||||
- ./.cargo-target:/calckey/packages/backend/native-utils/target
|
||||
- ./files:/calckey/files
|
||||
- ./.config:/calckey/.config:ro
|
||||
|
||||
|
|
5
docs/api-doc.md
Normal file
5
docs/api-doc.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# API Documentation
|
||||
|
||||
You can find interactive API documentation at any Calckey instance. https://calckey.social/api-doc
|
||||
|
||||
You can also find auto-generated documentation for calckey-js [here](../packages/calckey-js/markdown/calckey-js.md).
|
|
@ -1,18 +1,28 @@
|
|||
name: Bug Report
|
||||
name: 🐛 Bug Report
|
||||
about: File a bug report
|
||||
title: "[Bug]: "
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: 💁 Support Matrix
|
||||
url: https://matrix.to/#/%23calckey:matrix.fedibird.com
|
||||
about: Having trouble with deployment? Ask the support chat.
|
||||
- name: 🔒 Resposible Disclosure
|
||||
url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md
|
||||
about: Found a security vulnerability? Please disclose it responsibly.
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this bug report!
|
||||
💖 Thanks for taking the time to fill out this bug report!
|
||||
💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com)
|
||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md)
|
||||
🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: What happened?
|
||||
description: Please give us a brief description of what happened.
|
||||
placeholder: Tell us what you see!
|
||||
value: "A bug happened!"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
@ -21,7 +31,6 @@ body:
|
|||
label: What did you expect to happen?
|
||||
description: Please give us a brief description of what you expected to happen.
|
||||
placeholder: Tell us what you wish happened!
|
||||
value: "Instead of x, y should happen instead!"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
|
@ -29,7 +38,7 @@ body:
|
|||
attributes:
|
||||
label: Version
|
||||
description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information.
|
||||
placeholder: Calckey Version 13.0.4
|
||||
placeholder: v13.1.4.1
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
|
@ -37,15 +46,26 @@ body:
|
|||
attributes:
|
||||
label: Instance
|
||||
description: What instance of calckey are you using?
|
||||
placeholder: stop.voring.me
|
||||
placeholder: calckey.social
|
||||
validations:
|
||||
required: false
|
||||
- type: dropdown
|
||||
id: browsers
|
||||
id: issue-type
|
||||
attributes:
|
||||
label: What browser are you using?
|
||||
label: What type of issue is this?
|
||||
description: If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side.
|
||||
multiple: false
|
||||
options:
|
||||
- Client-side
|
||||
- Server-side
|
||||
- Other (Please Specify)
|
||||
- type: dropdown
|
||||
id: browsers
|
||||
attributes:
|
||||
label: What browser are you using? (Client-side issues only)
|
||||
multiple: false
|
||||
options:
|
||||
- N/A
|
||||
- Firefox
|
||||
- Chrome
|
||||
- Brave
|
||||
|
@ -54,6 +74,50 @@ body:
|
|||
- Safari
|
||||
- Microsoft Edge
|
||||
- Other (Please Specify)
|
||||
- type: dropdown
|
||||
id: device
|
||||
attributes:
|
||||
label: What operating system are you using? (Client-side issues only)
|
||||
multiple: false
|
||||
options:
|
||||
- N/A
|
||||
- Windows
|
||||
- MacOS
|
||||
- Linux
|
||||
- Android
|
||||
- iOS
|
||||
- Other (Please Specify)
|
||||
- type: dropdown
|
||||
id: deplotment-method
|
||||
attributes:
|
||||
label: How do you deploy Calckey on your server? (Server-side issues only)
|
||||
multiple: false
|
||||
options:
|
||||
- N/A
|
||||
- Manual
|
||||
- Ubuntu Install Script
|
||||
- Docker Compose
|
||||
- Docker Prebuilt Image
|
||||
- Helm Chart
|
||||
- YunoHost
|
||||
- AUR Package
|
||||
- Other (Please Specify)
|
||||
- type: dropdown
|
||||
id: operating-system
|
||||
attributes:
|
||||
label: What operating system are you using? (Server-side issues only)
|
||||
multiple: false
|
||||
options:
|
||||
- N/A
|
||||
- Ubuntu >= 22.04
|
||||
- Ubuntu < 22.04
|
||||
- Debian
|
||||
- Arch
|
||||
- RHEL (CentOS/AlmaLinux/Rocky Linux)
|
||||
- FreeBSD
|
||||
- OpenBSD
|
||||
- Android
|
||||
- Other (Please Specify)
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
|
@ -68,5 +132,5 @@ body:
|
|||
options:
|
||||
- label: I agree to follow this project's Contribution Guidelines
|
||||
required: true
|
||||
- label: I have searched the issue tracker for similar issues, and this is not a duplicate.
|
||||
- label: I have searched the issue tracker for similar issues, and this is not a duplicate.
|
||||
required: true
|
||||
|
|
|
@ -1,18 +1,28 @@
|
|||
name: Feature Request
|
||||
name: ✨ Feature Request
|
||||
about: Request a Feature
|
||||
title: "[Feature]: "
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: 💁 Support Matrix
|
||||
url: https://matrix.to/#/%23calckey:matrix.fedibird.com
|
||||
about: Having trouble with deployment? Ask the support chat.
|
||||
- name: 🔒 Resposible Disclosure
|
||||
url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md
|
||||
about: Found a security vulnerability? Please disclose it responsibly.
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this feature request!
|
||||
💖 Thanks for taking the time to fill out this feature request!
|
||||
💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com)
|
||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md)
|
||||
🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
|
||||
- type: textarea
|
||||
id: what-feature
|
||||
attributes:
|
||||
label: What feature would you like implemented?
|
||||
description: Please give us a brief description of what you'd like.
|
||||
placeholder: Tell us what you want!
|
||||
value: "x feature would be great!"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
@ -21,7 +31,6 @@ body:
|
|||
label: Why should we add this feature?
|
||||
description: Please give us a brief description of why your feature is important.
|
||||
placeholder: Tell us why you want this feature!
|
||||
value: "x feature is super useful because y!"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
|
@ -29,7 +38,7 @@ body:
|
|||
attributes:
|
||||
label: Version
|
||||
description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information.
|
||||
placeholder: Calckey Version 13.0.4
|
||||
placeholder: Calckey Version 13.1.4.1
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
|
@ -37,29 +46,9 @@ body:
|
|||
attributes:
|
||||
label: Instance
|
||||
description: What instance of calckey are you using?
|
||||
placeholder: stop.voring.me
|
||||
placeholder: calckey.social
|
||||
validations:
|
||||
required: false
|
||||
- type: dropdown
|
||||
id: browsers
|
||||
attributes:
|
||||
label: What browser are you using?
|
||||
multiple: false
|
||||
options:
|
||||
- Firefox
|
||||
- Chrome
|
||||
- Brave
|
||||
- Librewolf
|
||||
- Chromium
|
||||
- Safari
|
||||
- Microsoft Edge
|
||||
- Other (Please Specify)
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks.
|
||||
render: shell
|
||||
- type: checkboxes
|
||||
id: terms
|
||||
attributes:
|
||||
|
@ -68,5 +57,5 @@ body:
|
|||
options:
|
||||
- label: I agree to follow this project's Contribution Guidelines
|
||||
required: true
|
||||
- label: I have searched the issue tracker for similar requests, and this is not a duplicate.
|
||||
- label: I have searched the issue tracker for similar requests, and this is not a duplicate.
|
||||
required: true
|
||||
|
|
|
@ -1049,8 +1049,8 @@ _tutorial:
|
|||
step6_4: "Now go, explore, and have fun!"
|
||||
_2fa:
|
||||
alreadyRegistered: "سجلت سلفًا جهازًا للاستيثاق بعاملين."
|
||||
registerDevice: "سجّل جهازًا جديدًا"
|
||||
registerKey: "تسجيل مفتاح أمان جديد"
|
||||
registerTOTP: "سجّل جهازًا جديدًا"
|
||||
registerSecurityKey: "تسجيل مفتاح أمان جديد"
|
||||
step1: "أولًا ثبّت تطبيق استيثاق على جهازك (مثل {a} و{b})."
|
||||
step2: "امسح رمز الاستجابة السريعة الموجد على الشاشة."
|
||||
step3: "أدخل الرمز الموجود في تطبيقك لإكمال التثبيت."
|
||||
|
|
|
@ -1130,8 +1130,8 @@ _tutorial:
|
|||
step6_4: "Now go, explore, and have fun!"
|
||||
_2fa:
|
||||
alreadyRegistered: "আপনি ইতিমধ্যে একটি 2-ফ্যাক্টর অথেনটিকেশন ডিভাইস নিবন্ধন করেছেন৷"
|
||||
registerDevice: "নতুন ডিভাইস নিবন্ধন করুন"
|
||||
registerKey: "সিকিউরিটি কী নিবন্ধন করুন"
|
||||
registerTOTP: "নতুন ডিভাইস নিবন্ধন করুন"
|
||||
registerSecurityKey: "সিকিউরিটি কী নিবন্ধন করুন"
|
||||
step1: "প্রথমে, আপনার ডিভাইসে {a} বা {b} এর মতো একটি অথেনটিকেশন অ্যাপ ইনস্টল করুন৷"
|
||||
step2: "এরপরে, অ্যাপের সাহায্যে প্রদর্শিত QR কোডটি স্ক্যান করুন।"
|
||||
step2Url: "ডেস্কটপ অ্যাপে, নিম্নলিখিত URL লিখুন:"
|
||||
|
|
|
@ -136,7 +136,7 @@ smtpUser: "Nom d'usuari"
|
|||
smtpPass: "Contrasenya"
|
||||
user: "Usuari"
|
||||
searchByGoogle: "Cercar"
|
||||
file: "Fitxers"
|
||||
file: "Fitxer"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Tens un nou seguidor"
|
||||
|
@ -228,6 +228,11 @@ _mfm:
|
|||
alwaysPlay: Reprodueix automàticament tots els MFM animats
|
||||
fade: Esvair
|
||||
fadeDescription: Esvaeix el contingut cap a dintre i cap en fora.
|
||||
crop: Retallar
|
||||
advanced: MFM avançat
|
||||
advancedDescription: Si està desactivat, només permet l'etiquetatge bàsic tret que
|
||||
es reproduïnt un MFM animat
|
||||
cropDescription: Retalla el contingut.
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Menció"
|
||||
|
@ -314,21 +319,41 @@ _sfx:
|
|||
_2fa:
|
||||
step2Url: "També pots inserir aquest enllaç i utilitzes una aplicació d'escriptori:"
|
||||
alreadyRegistered: Ja heu registrat un dispositiu d'autenticació de dos factors.
|
||||
registerDevice: Registrar un dispositiu nou
|
||||
registerTOTP: Registrar un dispositiu nou
|
||||
securityKeyInfo: A més de l'autenticació d'empremta digital o PIN, també podeu configurar
|
||||
l'autenticació mitjançant claus de seguretat de maquinari compatibles amb FIDO2
|
||||
per protegir encara més el vostre compte.
|
||||
step4: A partir d'ara, qualsevol intent d'inici de sessió futur demanarà aquest
|
||||
token d'inici de sessió.
|
||||
registerKey: Registra una clau de seguretat
|
||||
registerSecurityKey: Registrar una clau de seguretat o d'accés
|
||||
step1: En primer lloc, instal·la una aplicació d'autenticació (com ara {a} o {b})
|
||||
al dispositiu.
|
||||
step2: A continuació, escaneja el codi QR que es mostra en aquesta pantalla.
|
||||
step3: Introdueix el token que t'ha proporcionat l'aplicació per finalitzar la configuració.
|
||||
step3Title: Introduïu un codi d'autenticació
|
||||
chromePasskeyNotSupported: Les claus de pas de Chrome actualment no s'admeten.
|
||||
securityKeyName: Introduïu un nom de clau
|
||||
removeKey: Suprimeix la clau de seguretat
|
||||
removeKeyConfirm: Vols suprimir la clau {name}?
|
||||
renewTOTP: Tornar a configurar l'aplicació d'autenticació
|
||||
renewTOTPOk: Reconfigurar
|
||||
renewTOTPCancel: Cancel·lar
|
||||
step2Click: Fer clic en aquest codi QR us permetrà registrar 2FA a la vostra clau
|
||||
de seguretat o aplicació d'autenticació del telèfon.
|
||||
securityKeyNotSupported: El vostre navegador no admet claus de seguretat.
|
||||
registerTOTPBeforeKey: Configureu una aplicació d'autenticació per registrar una
|
||||
clau de seguretat o de passi.
|
||||
tapSecurityKey: Si us plau, seguiu el vostre navegador per registrar la clau de
|
||||
seguretat o d'accés
|
||||
renewTOTPConfirm: Això farà que els codis de verificació de l'aplicació anterior
|
||||
deixin de funcionar
|
||||
whyTOTPOnlyRenew: L’aplicació d’autenticació no es pot eliminar sempre que es hi
|
||||
hagi una clau de seguretat registrada.
|
||||
token: Token 2FA
|
||||
_widgets:
|
||||
notifications: "Notificacions"
|
||||
timeline: "Línia de temps"
|
||||
unixClock: Rellotge UNIX
|
||||
unixClock: Rellotge d'UNIX
|
||||
federation: Federació
|
||||
instanceCloud: Núvol de servidors
|
||||
trends: Tendència
|
||||
|
@ -340,9 +365,9 @@ _widgets:
|
|||
onlineUsers: Usuaris en línia
|
||||
memo: Notes adhesives
|
||||
digitalClock: Rellotge digital
|
||||
postForm: Formulari de notes
|
||||
postForm: Formulari per publicar
|
||||
slideshow: Presentació de diapositives
|
||||
serverMetric: Mètriques del servidor
|
||||
serverMetric: Estadístiques del servidor
|
||||
userList: Llista d'usuaris
|
||||
rss: Lector d'RSS
|
||||
jobQueue: Cua de treball
|
||||
|
@ -350,6 +375,10 @@ _widgets:
|
|||
chooseList: Selecciona una llista
|
||||
aiscript: Consola AiScript
|
||||
button: Botó
|
||||
serverInfo: Informació del servidor
|
||||
meiliStatus: Estat del servidor
|
||||
meiliSize: Mida de l'índex
|
||||
meiliIndexCount: Publicacions indexades
|
||||
_cw:
|
||||
show: "Carregar més"
|
||||
files: '{count} fitxers'
|
||||
|
@ -357,12 +386,13 @@ _cw:
|
|||
chars: '{count} caràcters'
|
||||
_visibility:
|
||||
followers: "Seguidors"
|
||||
publicDescription: La teva publicació serà visible per a tots els usuaris
|
||||
publicDescription: La teva publicació serà visible per a totes les línies de temps
|
||||
públiques
|
||||
localOnly: Només Local
|
||||
specified: Directe
|
||||
home: Sense llistar
|
||||
homeDescription: Publica només a la línea de temps local
|
||||
followersDescription: Fes visible només per als teus seguidors
|
||||
followersDescription: Fes visible només per als teus seguidors i usuaris mencionats
|
||||
specifiedDescription: Fer visible només per a usuaris determinats
|
||||
public: Públic
|
||||
localOnlyDescription: No és visible per als usuaris remots
|
||||
|
@ -725,8 +755,9 @@ _deck:
|
|||
mentions: "Mencions"
|
||||
widgets: Ginys
|
||||
main: Principal
|
||||
antenna: Antenes
|
||||
antenna: Antena
|
||||
direct: Missatges directes
|
||||
channel: Canal
|
||||
alwaysShowMainColumn: Mostra sempre la columna principal
|
||||
columnAlign: Alinear columnes
|
||||
introduction: Crea la interfície perfecta per a tu organitzant columnes lliurement!
|
||||
|
@ -978,7 +1009,7 @@ avoidMultiCaptchaConfirm: Fent servir diferents sistemes de Captcha pot causar i
|
|||
antennas: Antenes
|
||||
enableEmojiReactions: Activa reaccions amb emojis
|
||||
blockThisInstance: Bloqueja aquest servidor
|
||||
registration: Registre
|
||||
registration: Registra't
|
||||
showEmojisInReactionNotifications: Mostra els emojis a les notificacions de les reaccions
|
||||
renoteMute: Silencia els impulsos
|
||||
renoteUnmute: Treu el silenci als impulsos
|
||||
|
@ -1025,7 +1056,7 @@ recentlyRegisteredUsers: Usuaris registrats fa poc
|
|||
recentlyDiscoveredUsers: Nous suaris descoberts
|
||||
administrator: Administrador
|
||||
token: Token
|
||||
registerSecurityKey: Registra una clau de seguretat
|
||||
registerSecurityKey: Registreu una clau de seguretat
|
||||
securityKeyName: Nom clau
|
||||
lastUsed: Feta servir per última vegada
|
||||
unregister: Anul·lar el registre
|
||||
|
@ -1178,7 +1209,7 @@ large: Gran
|
|||
notificationSetting: Preferències de notificacions
|
||||
makeActive: Activar
|
||||
notificationSettingDesc: Tria el tipus de notificació que es veure.
|
||||
notifyAntenna: Notificar noves notes
|
||||
notifyAntenna: Notificar publicacions noves
|
||||
withFileAntenna: Només notes amb fitxers
|
||||
enableServiceworker: Activa les notificacions push per al teu navegador
|
||||
antennaUsersDescription: Escriu un nom d'usuari per línea
|
||||
|
@ -1570,6 +1601,8 @@ _aboutMisskey:
|
|||
morePatrons: També agraïm el suport de molts altres ajudants que no figuren aquí.
|
||||
Gràcies! 🥰
|
||||
patrons: Mecenes de Calckey
|
||||
patronsList: Llistats cronològicament, no per la quantitat donada. Fes una donació
|
||||
amb l'enllaç de dalt per veure el teu nom aquí!
|
||||
unknown: Desconegut
|
||||
pageLikesCount: Nombre de pàgines amb M'agrada
|
||||
youAreRunningUpToDateClient: Estás fent servir la versió del client més nova.
|
||||
|
@ -1618,7 +1651,7 @@ enableAutoSensitiveDescription: Permet la detecció i el marcatge automàtics de
|
|||
localOnly: Només local
|
||||
customKaTeXMacroDescription: "Configura macros per escriure expressions matemàtiques
|
||||
fàcilment! La notació s'ajusta a les definicions de l'ordre LaTeX i s'escriu com
|
||||
a \\newcommand{\\name}{content} o \\newcommand{\\name}[nombre d'arguments]{contingut}.
|
||||
a \\newcommand{\\ name}{content} o \\newcommand{\\name}[nombre d'arguments]{content}.
|
||||
Per exemple, \\newcommand{\\add}[2]{#1 + #2} ampliarà \\add{3}{foo} a 3 + foo. Els
|
||||
claudàtors que envolten el nom de la macro es poden canviar per claudàtors rodons
|
||||
o quadrats. Això afecta els claudàtors utilitzats per als arguments. Es pot definir
|
||||
|
@ -1639,9 +1672,9 @@ popout: Apareixa
|
|||
volume: Volum
|
||||
objectStorageUseSSLDesc: Desactiva això si no fas servir HTTPS per les connexions
|
||||
API
|
||||
objectStorageUseProxy: Conectarse mitjançant un Proxy
|
||||
objectStorageUseProxy: Connectar-se mitjançant un Proxy
|
||||
objectStorageUseProxyDesc: Desactiva això si no faràs servir un servidor Proxy per
|
||||
conexions API
|
||||
conexions amb l'API
|
||||
objectStorageSetPublicRead: Fixar com a "public-read" al pujar
|
||||
serverLogs: Registres del servidor
|
||||
deleteAll: Esborrar tot
|
||||
|
@ -1677,10 +1710,10 @@ removeAllFollowing: Deixar de seguir a tots els usuaris que segueixes
|
|||
accentColor: Color principal
|
||||
textColor: Color del text
|
||||
value: Valor
|
||||
sendErrorReportsDescription: "Quant està activat quant aparegui un error, es compartirà
|
||||
amb els desenvolupadors de Calckey, que ajudarà a millorar la qualitat.\nAixò inclourà
|
||||
informació com la versió del teu sistema operatiu, el navegador que estiguis fent
|
||||
servir, la teva activitat a Calckey, etc."
|
||||
sendErrorReportsDescription: "Quan està activat, quan es produeixi un problema la
|
||||
informació detallada d'errors es compartirà amb Calckey, ajudant a millorar la qualitat
|
||||
de Calckey.\nAixò inclourà informació com la versió del vostre sistema operatiu,
|
||||
quin navegador utilitzeu, la vostra activitat a Calckey, etc."
|
||||
myTheme: El meu tema
|
||||
backgroundColor: Color de fons
|
||||
saveAs: Desa com...
|
||||
|
@ -1757,7 +1790,7 @@ createNew: Crear una nova
|
|||
optional: Opcional
|
||||
jumpToSpecifiedDate: Vés a una data concreta
|
||||
showingPastTimeline: Ara es mostra un línea de temps antiga
|
||||
clear: Tornar
|
||||
clear: Netejar
|
||||
markAllAsRead: Marcar tot com a llegit
|
||||
recentPosts: Pàgines recents
|
||||
noMaintainerInformationWarning: La informació de l'administrador no està configurada.
|
||||
|
@ -1840,7 +1873,7 @@ _ago:
|
|||
hoursAgo: Fa {n}h
|
||||
daysAgo: Fa {n}d
|
||||
secondsAgo: Fa {n}s
|
||||
weeksAgo: Fa {n}s
|
||||
weeksAgo: Fa {n}set
|
||||
monthsAgo: Fa {n}me
|
||||
yearsAgo: Fa {n}a
|
||||
_time:
|
||||
|
@ -1855,7 +1888,7 @@ _tutorial:
|
|||
step5_3: La línea de temps d'inici {icon} es on pots veure les publicacions dels
|
||||
comptes que segueixes.
|
||||
step5_6: La línia de temps de Recomanats {icon} és on pots veure les publicacions
|
||||
dels servidors recomanen els administradors.
|
||||
dels servidors que recomanen els administradors.
|
||||
step5_7: La línia de temps Global {icon} és on pots veure les publicacions de tots
|
||||
els servidors connectats.
|
||||
step6_1: Aleshores, què és aquest lloc?
|
||||
|
@ -2002,11 +2035,12 @@ _auth:
|
|||
shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al
|
||||
teu compte?
|
||||
shareAccess: Vols autoritzar "{name}" per accedir a aquest compte?
|
||||
permissionAsk: Aquesta aplicació sol·licita els següents permisos
|
||||
permissionAsk: 'Aquesta aplicació sol·licita els següents permisos:'
|
||||
callback: Tornant a l'aplicació
|
||||
denied: Accés denegat
|
||||
pleaseGoBack: Si us plau, torneu a l'aplicació
|
||||
copyAsk: Posa el següent codi d'autorització a l'aplicació
|
||||
copyAsk: "Posa el següent codi d'autorització a l'aplicació:"
|
||||
allPermissions: Accés complet al compte
|
||||
_weekday:
|
||||
wednesday: Dimecres
|
||||
saturday: Dissabte
|
||||
|
@ -2031,7 +2065,7 @@ _relayStatus:
|
|||
rejected: Rebutjat
|
||||
deleted: Eliminat
|
||||
editNote: Edita la nota
|
||||
edited: Editat
|
||||
edited: 'Editat a {date} {time}'
|
||||
findOtherInstance: Cercar un altre servidor
|
||||
signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades,
|
||||
però sempre podeu registrar-vos en un altre servidor. Si teniu un codi d'invitació
|
||||
|
@ -2050,10 +2084,11 @@ _experiments:
|
|||
alpha: Alfa
|
||||
beta: Beta
|
||||
release: Publicà
|
||||
enablePostEditing: Activà l'edició de publicacions
|
||||
title: Experiments
|
||||
postEditingCaption: Mostra l'opció perquè els usuaris editin les seves publicacions
|
||||
existents mitjançant el menú d'opcions de publicació
|
||||
enablePostImports: Activar l'importació de publicacions
|
||||
postImportsCaption: Permet els usuaris importar publicacions desde comptes a Calckey,
|
||||
Misskey, Mastodon, Akkoma i Pleroma. Pot fer que el servidor vagi més lent durant
|
||||
la càrrega si tens un coll d'ampolla a la cua.
|
||||
noGraze: Si us plau, desactiva l'extensió del navegador "Graze for Mastodon", ja que
|
||||
interfereix amb Calckey.
|
||||
accessibility: Accessibilitat
|
||||
|
@ -2064,3 +2099,48 @@ silencedWarning: S'està mostrant aquesta pàgina per què aquest usuari és d'u
|
|||
que l'administrador a silenciat, així que pot ser spam.
|
||||
jumpToPrevious: Vés a l'anterior
|
||||
cw: Avís de contingut
|
||||
antennasDesc: "Les antenes mostren publicacions noves que coincideixen amb els criteris
|
||||
establerts!\nS'hi pot accedir des de la pàgina de línies de temps."
|
||||
expandOnNoteClick: Obre la publicació amb un clic
|
||||
expandOnNoteClickDesc: Si està desactivat, encara pots obrir les publicacions al menú
|
||||
del botó dret o fent clic a la marca de temps.
|
||||
channelFederationWarn: Els canals encara no es federen amb altres servidors
|
||||
searchPlaceholder: Cerca a Calckey
|
||||
listsDesc: Les llistes et permeten crear línies de temps amb usuaris específics. Es
|
||||
pot accedir des de la pàgina de línies de temps.
|
||||
clipsDesc: Els clips són com marcadors categoritzats que es poden compartir. Podeu
|
||||
crear clips des del menú de publicacions individuals.
|
||||
selectChannel: Selecciona un canal
|
||||
isLocked: Aquest compte té les següents aprovacions
|
||||
isPatron: Mecenes de Calkey
|
||||
isBot: Aquest compte és un bot
|
||||
isModerator: Moderador
|
||||
isAdmin: Administrador
|
||||
_filters:
|
||||
fromDomain: Des del domini
|
||||
notesBefore: Publicacions anteriors
|
||||
notesAfter: Publicacions posteriors
|
||||
followingOnly: Només seguint
|
||||
followersOnly: Només seguidors
|
||||
withFile: Amb arxiu
|
||||
fromUser: De l'usuari
|
||||
image: Imatge
|
||||
video: Vídeo
|
||||
audio: Àudio
|
||||
_dialog:
|
||||
charactersExceeded: "S'han superat el màxim de caràcters! Actual: {current}/Límit:
|
||||
{max}"
|
||||
charactersBelow: 'No hi ha caràcters suficients! Corrent: {current}/Limit: {min}'
|
||||
removeReaction: Elimina la teva reacció
|
||||
reactionPickerSkinTone: To de pell d'emoji preferit
|
||||
alt: ALT
|
||||
_skinTones:
|
||||
light: Clar
|
||||
mediumLight: Clar Mitx
|
||||
medium: Mitx
|
||||
mediumDark: Fosc Mitx
|
||||
dark: Fosc
|
||||
yellow: Groc
|
||||
swipeOnMobile: Permet lliscar entre pàgines
|
||||
enableIdenticonGeneration: Habilitar la generació d'Identicon
|
||||
enableServerMachineStats: Habilitar les estadístiques del maquinari del servidor
|
||||
|
|
|
@ -698,8 +698,8 @@ _time:
|
|||
minute: "Minut"
|
||||
hour: "Hodin"
|
||||
_2fa:
|
||||
registerDevice: "Přidat zařízení"
|
||||
registerKey: "Přidat bezpečnostní klíč"
|
||||
registerTOTP: "Přidat zařízení"
|
||||
registerSecurityKey: "Přidat bezpečnostní klíč"
|
||||
_weekday:
|
||||
sunday: "Neděle"
|
||||
monday: "Pondělí"
|
||||
|
@ -963,7 +963,7 @@ disablingTimelinesInfo: Administrátoři a moderátoři budou vždy mít příst
|
|||
časovým osám, i pokud jsou vypnuté.
|
||||
deleted: Vymazáno
|
||||
editNote: Upravit poznámku
|
||||
edited: Upraveno
|
||||
edited: 'Upraveno dne {date} {time}'
|
||||
silencedInstancesDescription: Vypište hostnames instancí, které chcete ztlumit. Účty
|
||||
v uvedených instancích jsou považovány za "ztlumené", mohou pouze zadávat požadavky
|
||||
na sledování a nemohou zmiňovat místní účty, pokud nejsou sledovány. Na blokované
|
||||
|
|
|
@ -83,7 +83,7 @@ deleteAndEditConfirm: Er du sikker på at du vil slet denne opslag og ændre det
|
|||
vil tabe alle reaktioner, forstærkninger og svarer indenfor denne opslag.
|
||||
editNote: Ændre note
|
||||
deleted: Slettet
|
||||
edited: Ændret
|
||||
edited: 'Ændret den {date} {time}'
|
||||
sendMessage: Send en besked
|
||||
youShouldUpgradeClient: Til at vise denne side, vær sød at refresh til at opdatere
|
||||
din brugerenhed.
|
||||
|
|
|
@ -663,7 +663,7 @@ display: "Anzeigeart"
|
|||
copy: "Kopieren"
|
||||
metrics: "Metriken"
|
||||
overview: "Übersicht"
|
||||
logs: "Logs"
|
||||
logs: "Protokolle"
|
||||
delayed: "Verzögert"
|
||||
database: "Datenbank"
|
||||
channel: "Channels"
|
||||
|
@ -693,8 +693,8 @@ abuseReported: "Deine Meldung wurde versendet. Vielen Dank."
|
|||
reporter: "Melder"
|
||||
reporteeOrigin: "Herkunft des Gemeldeten"
|
||||
reporterOrigin: "Herkunft des Meldenden"
|
||||
forwardReport: "Einen Meldung zusätzlich an den mit-beteiligten Server senden"
|
||||
forwardReportIsAnonymous: "Anstelle Ihres Nutzerkontos wird ein anonymes Systemkonto
|
||||
forwardReport: "Meldung auch an den mit-beteiligten Server weiterleiten"
|
||||
forwardReportIsAnonymous: "Anstelle deines Nutzerkontos wird ein anonymes Systemkonto
|
||||
als Hinweisgeber auf dem mit-beteiligten Server angezeigt."
|
||||
send: "Senden"
|
||||
abuseMarkAsResolved: "Meldung als gelöst markieren"
|
||||
|
@ -812,7 +812,7 @@ useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen"
|
|||
typingUsers: "{users} ist/sind am schreiben"
|
||||
jumpToSpecifiedDate: "Zu bestimmtem Datum springen"
|
||||
showingPastTimeline: "Es wird eine alte Timeline angezeigt"
|
||||
clear: "Zurückkehren"
|
||||
clear: "Leeren"
|
||||
markAllAsRead: "Alle als gelesen markieren"
|
||||
goBack: "Zurück"
|
||||
unlikeConfirm: "\"Gefällt mir\" wirklich entfernen?"
|
||||
|
@ -1189,6 +1189,8 @@ _mfm:
|
|||
stop: MFM anhalten
|
||||
warn: MFM können schnell bewegte oder anderweitig auffallende Animationen enthalten
|
||||
alwaysPlay: Alle animierten MFM immer automatisch abspielen
|
||||
advancedDescription: Wenn diese Funktion deaktiviert ist, können nur einfache Formatierungen
|
||||
vorgenommen werden, es sei denn, animiertes MFM ist aktiviert
|
||||
_instanceTicker:
|
||||
none: "Nie anzeigen"
|
||||
remote: "Für Nutzer eines anderen Servers anzeigen"
|
||||
|
@ -1356,8 +1358,8 @@ _tutorial:
|
|||
der/die auf diesem Server registriert ist."
|
||||
step5_5: "Die Social-Timeline {icon} ist eine Kombination aus der Home-Timeline
|
||||
und der Local-Timeline."
|
||||
step5_6: "In der {icon} \"Favoriten\"-Timeline können sie Beiträge von Servern sehen,
|
||||
die von den Server-Administratoren vorgeschlagen werden."
|
||||
step5_6: "In der Empfohlen-Timeline {icon} kannst du Posts sehen, die von den Admins
|
||||
vorgeschlagen wurden."
|
||||
step5_7: "In der {icon} Global-Timeline können Sie Beiträge von allen verknüpften
|
||||
Servern aus dem Fediverse sehen."
|
||||
step6_1: "Also, was ist das hier?"
|
||||
|
@ -1371,8 +1373,8 @@ _tutorial:
|
|||
_2fa:
|
||||
alreadyRegistered: "Du hast bereits ein Gerät für Zwei-Faktor-Authentifizierung
|
||||
registriert."
|
||||
registerDevice: "Neues Gerät registrieren"
|
||||
registerKey: "Neuen Sicherheitsschlüssel registrieren"
|
||||
registerTOTP: "Neues Gerät registrieren"
|
||||
registerSecurityKey: "Neuen Sicherheitsschlüssel registrieren"
|
||||
step1: "Installiere zuerst eine Authentifizierungsapp (z.B. {a} oder {b}) auf deinem
|
||||
Gerät."
|
||||
step2: "Dann, scanne den angezeigten QR-Code mit deinem Gerät."
|
||||
|
@ -1383,6 +1385,25 @@ _2fa:
|
|||
securityKeyInfo: "Du kannst neben Fingerabdruck- oder PIN-Authentifizierung auf
|
||||
deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels
|
||||
einrichten."
|
||||
step3Title: Gib deinen Authentifizierungscode ein
|
||||
renewTOTPOk: Neu konfigurieren
|
||||
securityKeyNotSupported: Dein Browser unterstützt Hardware-Security-Keys nicht.
|
||||
chromePasskeyNotSupported: Chrome Passkeys werden momentan nicht unterstützt.
|
||||
renewTOTP: Konfiguriere deine Authenticator App neu
|
||||
renewTOTPCancel: Abbrechen
|
||||
tapSecurityKey: Bitte folge den Anweisungen deines Browsers, um einen Hardware-Security-Key
|
||||
oder einen Passkey zu registrieren
|
||||
removeKey: Entferne deinen Hardware-Security-Key
|
||||
removeKeyConfirm: Möchtest du wirklich deinen Key mit der Bezeichnung {name} löschen?
|
||||
renewTOTPConfirm: Das wird dazu führen, dass du Verifizierungscodes deiner vorherigen
|
||||
Authenticator App nicht mehr nutzen kannst
|
||||
whyTOTPOnlyRenew: Die Authentificator App kann nicht entfernt werden, solange ein
|
||||
Hardware-Security-Key registriert ist.
|
||||
step2Click: Ein Klick auf diesen QR-Code erlaubt es dir eine 2FA-Methode zu deinem
|
||||
Security Key oder deiner Authenticator App hinzuzufügen.
|
||||
registerTOTPBeforeKey: Bitte registriere eine Authentificator App, um einen Hardware-Security-Key
|
||||
oder einen Passkey zu nutzen.
|
||||
securityKeyName: Gib einen Namen für den Key ein
|
||||
_permissions:
|
||||
"read:account": "Deine Nutzerkontoinformationen lesen"
|
||||
"write:account": "Deine Nutzerkontoinformationen bearbeiten"
|
||||
|
@ -1451,7 +1472,7 @@ _widgets:
|
|||
trends: "Trends"
|
||||
clock: "Uhr"
|
||||
rss: "RSS-Reader"
|
||||
rssTicker: "RSS-Laufschrift (Ticker)"
|
||||
rssTicker: "RSS Ticker"
|
||||
activity: "Aktivität"
|
||||
photos: "Fotos"
|
||||
digitalClock: "Digitaluhr"
|
||||
|
@ -1468,9 +1489,13 @@ _widgets:
|
|||
aichan: "Ai"
|
||||
_userList:
|
||||
chooseList: Wählen Sie eine Liste aus
|
||||
userList: Nutzerliste
|
||||
userList: Benutzerliste
|
||||
serverInfo: Server-Infos
|
||||
meiliStatus: Server-Status
|
||||
meiliSize: Indexgröße
|
||||
meiliIndexCount: Indexierte Beiträge
|
||||
_cw:
|
||||
hide: "Inhalt verbergen"
|
||||
hide: "Verbergen"
|
||||
show: "Inhalt anzeigen"
|
||||
chars: "{count} Zeichen"
|
||||
files: "{count} Datei(en)"
|
||||
|
@ -1929,10 +1954,11 @@ _deck:
|
|||
widgets: "Widgets"
|
||||
notifications: "Benachrichtigungen"
|
||||
tl: "Timeline"
|
||||
antenna: "News-Picker"
|
||||
antenna: "Antenne"
|
||||
list: "Listen"
|
||||
mentions: "Erwähnungen"
|
||||
direct: "Direktnachrichten"
|
||||
channel: Kanal
|
||||
renameProfile: Arbeitsbereich umbenennen
|
||||
nameAlreadyExists: Der Name für den Arbeitsbereich ist bereits vorhanden.
|
||||
enableRecommendedTimeline: '"Favoriten"-Timeline einschalten'
|
||||
|
@ -1957,8 +1983,8 @@ renoteMute: Boosts stummschalten
|
|||
renoteUnmute: Stummschaltung von Boosts aufheben
|
||||
noInstances: Keine Server gefunden
|
||||
privateModeInfo: Wenn diese Option aktiviert ist, können nur als vertrauenswürdig
|
||||
eingestufte Server mit diesem Server verknüpft werden. Alle Beiträge werden für
|
||||
die Öffentlichkeit verborgen.
|
||||
eingestufte Server mit diesem Server kommunizieren. Alle Beiträge werden für die
|
||||
Öffentlichkeit verborgen.
|
||||
allowedInstances: Vertrauenswürdige Server
|
||||
selectInstance: Wähle einen Server aus
|
||||
silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummschalten
|
||||
|
@ -1967,7 +1993,7 @@ silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummsc
|
|||
wenn sie nicht gefolgt werden. Dies wirkt sich nicht auf die blockierten Server
|
||||
aus.
|
||||
editNote: Beitrag bearbeiten
|
||||
edited: Bearbeitet
|
||||
edited: 'Bearbeitet um {date} {time}'
|
||||
silenceThisInstance: Diesen Server stummschalten
|
||||
silencedInstances: Stummgeschaltete Server
|
||||
silenced: Stummgeschaltet
|
||||
|
@ -2069,15 +2095,16 @@ jumpToPrevious: Zum Vorherigen springen
|
|||
silencedWarning: Diese Meldung wird angezeigt, weil diese Nutzer von Servern stammen,
|
||||
die Ihr Administrator abgeschaltet hat, so dass es sich möglicherweise um Spam handelt.
|
||||
_experiments:
|
||||
enablePostEditing: Beitragsbearbeitung ermöglichen
|
||||
title: Funktionstests
|
||||
postEditingCaption: Zeigt die Option für Nutzer an, ihre bestehenden Beiträge über
|
||||
das Menü "Beitragsoptionen" zu bearbeiten
|
||||
enablePostImports: Beitragsimporte aktivieren
|
||||
postImportsCaption: Erlaubt es Nutzer:innen ihre Posts von alten Calckey, Misskey,
|
||||
Mastodon, Akkoma und Pleroma Accounts zu importieren. Bei Engpässen in der Warteschlange
|
||||
kann es zu Verlangsamungen beim Laden während des Imports kommen.
|
||||
noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie
|
||||
die Funktion von Calckey stört.
|
||||
indexFrom: Indizieren ab Beitrags-ID (frei lassen, um jeden Beitrag zu indizieren)
|
||||
indexNotice: Indizierung gestartet. Dies wird wahrscheinlich eine Weile dauern. Bitte
|
||||
starte den Server für mindestens eine Stunde nicht neu.
|
||||
indexFrom: Indexieren ab Beitragskennung aufwärts
|
||||
indexNotice: Wird jetzt indexiert. Dies wird wahrscheinlich eine Weile dauern, bitte
|
||||
starten Sie Ihren Server für mindestens eine Stunde nicht neu.
|
||||
customKaTeXMacroDescription: "Richten Sie Makros ein, um mathematische Ausdrücke einfach
|
||||
zu schreiben! Die Notation entspricht den LaTeX-Befehlsdefinitionen und wird als\n
|
||||
\\newcommand{\\name}{content} or \\newcommand{\\name}[number of arguments]{content}\n
|
||||
|
@ -2089,3 +2116,37 @@ customKaTeXMacroDescription: "Richten Sie Makros ein, um mathematische Ausdrück
|
|||
Zeilen werden einfach ignoriert. Es werden nur einfache Funktionen zur Substitution
|
||||
von Zeichenketten unterstützt; erweiterte Syntax, wie z. B. bedingte Verzweigungen,
|
||||
können hier nicht verwendet werden."
|
||||
expandOnNoteClickDesc: Wenn deaktiviert, können Sie Beiträge trotzdem über das Rechtsklickmenü
|
||||
oder durch Anklicken des Zeitstempels öffnen.
|
||||
selectChannel: Wählen Sie einen Kanal aus
|
||||
expandOnNoteClick: Beitrag bei Klick öffnen
|
||||
image: Bild
|
||||
video: Video
|
||||
audio: Audio
|
||||
indexFromDescription: Leer lassen, um jeden Beitrag zu indexieren
|
||||
_filters:
|
||||
fromUser: Von Benutzer
|
||||
notesAfter: Beiträge nach
|
||||
withFile: Mit Datei
|
||||
fromDomain: Von Domain
|
||||
notesBefore: Beiträge vor
|
||||
followingOnly: Nur Folgende
|
||||
isBot: Dieses Konto ist ein Bot
|
||||
isModerator: Moderator
|
||||
isAdmin: Administrator
|
||||
_dialog:
|
||||
charactersExceeded: 'Maximale Anzahl an Zeichen aufgebraucht! Limit: {current} /
|
||||
{max}'
|
||||
charactersBelow: Nicht genug Zeichen! Du hast aktuell {current} von {min} Zeichen
|
||||
searchPlaceholder: Calckey durchsuchen
|
||||
antennasDesc: "Antennen zeigen neue Posts an, die deinen definierten Kriterien entsprechen!\n
|
||||
Sie können von der Timeline-Seite aufgerufen werden."
|
||||
isPatron: Calckey Patron
|
||||
removeReaction: Entferne deine Reaktion
|
||||
listsDesc: Listen lassen dich Timelines mit bestimmten Nutzer:innen erstellen. Sie
|
||||
können von der Timeline-Seite erreicht werden.
|
||||
clipsDesc: Clips sind wie teilbare, kategorisierte Lesezeichen. Du kannst Clips vom
|
||||
Menü individueller Posts aus erstellen.
|
||||
channelFederationWarn: Kanäle föderieren noch nicht zu anderen Servern
|
||||
reactionPickerSkinTone: Bevorzugte Emoji-Hautfarbe
|
||||
swipeOnMobile: Wischen zwischen den Seiten erlauben
|
||||
|
|
|
@ -52,7 +52,7 @@ deleteAndEdit: "Delete and edit"
|
|||
deleteAndEditConfirm: "Are you sure you want to delete this post and edit it? You
|
||||
will lose all reactions, boosts and replies to it."
|
||||
editNote: "Edit note"
|
||||
edited: "Edited"
|
||||
edited: "Edited at {date} {time}"
|
||||
addToList: "Add to list"
|
||||
sendMessage: "Send a message"
|
||||
copyUsername: "Copy username"
|
||||
|
@ -123,6 +123,7 @@ clickToShow: "Click to show"
|
|||
sensitive: "NSFW"
|
||||
add: "Add"
|
||||
reaction: "Reactions"
|
||||
removeReaction: "Remove your reaction"
|
||||
enableEmojiReactions: "Enable emoji reactions"
|
||||
showEmojisInReactionNotifications: "Show emojis in reaction notifications"
|
||||
reactionSetting: "Reactions to show in the reaction picker"
|
||||
|
@ -147,6 +148,7 @@ unsuspendConfirm: "Are you sure that you want to unsuspend this account?"
|
|||
selectList: "Select a list"
|
||||
selectAntenna: "Select an antenna"
|
||||
selectWidget: "Select a widget"
|
||||
selectChannel: "Select a channel"
|
||||
editWidgets: "Edit widgets"
|
||||
editWidgetsExit: "Done"
|
||||
customEmojis: "Custom Emoji"
|
||||
|
@ -828,7 +830,7 @@ useReactionPickerForContextMenu: "Open reaction picker on right-click"
|
|||
typingUsers: "{users} is typing"
|
||||
jumpToSpecifiedDate: "Jump to specific date"
|
||||
showingPastTimeline: "Currently displaying an old timeline"
|
||||
clear: "Return"
|
||||
clear: "Clear"
|
||||
markAllAsRead: "Mark all as read"
|
||||
goBack: "Back"
|
||||
unlikeConfirm: "Really remove your like?"
|
||||
|
@ -939,6 +941,7 @@ deleteAccountConfirm: "This will irreversibly delete your account. Proceed?"
|
|||
incorrectPassword: "Incorrect password."
|
||||
voteConfirm: "Confirm your vote for \"{choice}\"?"
|
||||
hide: "Hide"
|
||||
alt: "ALT"
|
||||
leaveGroup: "Leave group"
|
||||
leaveGroupConfirm: "Are you sure you want to leave \"{name}\"?"
|
||||
useDrawerReactionPickerForMobile: "Display reaction picker as drawer on mobile"
|
||||
|
@ -967,6 +970,9 @@ rateLimitExceeded: "Rate limit exceeded"
|
|||
cropImage: "Crop image"
|
||||
cropImageAsk: "Do you want to crop this image?"
|
||||
file: "File"
|
||||
image: "Image"
|
||||
video: "Video"
|
||||
audio: "Audio"
|
||||
recentNHours: "Last {n} hours"
|
||||
recentNDays: "Last {n} days"
|
||||
noEmailServerWarning: "Email server not configured."
|
||||
|
@ -1047,6 +1053,7 @@ recommendedInstancesDescription: "Recommended servers separated by line breaks t
|
|||
caption: "Auto Caption"
|
||||
splash: "Splash Screen"
|
||||
updateAvailable: "There might be an update available!"
|
||||
swipeOnMobile: "Allow swiping between pages"
|
||||
swipeOnDesktop: "Allow mobile-style swiping on desktop"
|
||||
logoImageUrl: "Logo image URL"
|
||||
showAdminUpdates: "Indicate a new Calckey version is avaliable (admin only)"
|
||||
|
@ -1099,6 +1106,14 @@ noGraze: "Please disable the \"Graze for Mastodon\" browser extension, as it int
|
|||
with Calckey."
|
||||
silencedWarning: "This page is showing because these users are from servers your admin
|
||||
silenced, so they may potentially be spam."
|
||||
isBot: "This account is a bot"
|
||||
isLocked: "This account has follow approvals"
|
||||
isModerator: "Moderator"
|
||||
isAdmin: "Administrator"
|
||||
isPatron: "Calckey Patron"
|
||||
reactionPickerSkinTone: "Preferred emoji skin tone"
|
||||
enableServerMachineStats: "Enable server hardware statistics"
|
||||
enableIdenticonGeneration: "Enable Identicon generation"
|
||||
|
||||
_sensitiveMediaDetection:
|
||||
description: "Reduces the effort of server moderation through automatically recognizing
|
||||
|
@ -1200,6 +1215,7 @@ _aboutMisskey:
|
|||
morePatrons: "We also appreciate the support of many other helpers not listed here.
|
||||
Thank you! 🥰"
|
||||
patrons: "Calckey patrons"
|
||||
patronsList: "Listed chronologically, not by donation size. Donate with the link above to get your name on here!"
|
||||
_nsfw:
|
||||
respect: "Hide NSFW media"
|
||||
ignore: "Don't hide NSFW media"
|
||||
|
@ -1436,6 +1452,14 @@ _time:
|
|||
minute: "Minute(s)"
|
||||
hour: "Hour(s)"
|
||||
day: "Day(s)"
|
||||
_filters:
|
||||
fromUser: "From user"
|
||||
withFile: "With file"
|
||||
fromDomain: "From domain"
|
||||
notesBefore: "Posts before"
|
||||
notesAfter: "Posts after"
|
||||
followingOnly: "Following only"
|
||||
followersOnly: "Followers only"
|
||||
_tutorial:
|
||||
title: "How to use Calckey"
|
||||
step1_1: "Welcome!"
|
||||
|
@ -1470,16 +1494,29 @@ _tutorial:
|
|||
step6_4: "Now go, explore, and have fun!"
|
||||
_2fa:
|
||||
alreadyRegistered: "You have already registered a 2-factor authentication device."
|
||||
registerDevice: "Register a new device"
|
||||
registerKey: "Register a security key"
|
||||
registerTOTP: "Register authenticator app"
|
||||
step1: "First, install an authentication app (such as {a} or {b}) on your device."
|
||||
step2: "Then, scan the QR code displayed on this screen."
|
||||
step2Click: "Clicking on this QR code will allow you to register 2FA to your security key or phone authenticator app."
|
||||
step2Url: "You can also enter this URL if you're using a desktop program:"
|
||||
step3Title: "Enter an authentication code"
|
||||
step3: "Enter the token provided by your app to finish setup."
|
||||
step4: "From now on, any future login attempts will ask for such a login token."
|
||||
securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup
|
||||
authentication via hardware security keys that support FIDO2 to further secure
|
||||
your account."
|
||||
securityKeyNotSupported: "Your browser does not support security keys."
|
||||
registerTOTPBeforeKey: "Please set up an authenticator app to register a security or pass key."
|
||||
securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup authentication via hardware security keys that support FIDO2 to further secure your account."
|
||||
chromePasskeyNotSupported: "Chrome passkeys are currently not supported."
|
||||
registerSecurityKey: "Register a security or pass key"
|
||||
securityKeyName: "Enter a key name"
|
||||
tapSecurityKey: "Please follow your browser to register the security or pass key"
|
||||
removeKey: "Remove security key"
|
||||
removeKeyConfirm: "Really delete the {name} key?"
|
||||
whyTOTPOnlyRenew: "The authenticator app cannot be removed as long as a security key is registered."
|
||||
renewTOTP: "Reconfigure authenticator app"
|
||||
renewTOTPConfirm: "This will cause verification codes from your previous app to stop working"
|
||||
renewTOTPOk: "Reconfigure"
|
||||
renewTOTPCancel: "Cancel"
|
||||
token: "2FA Token"
|
||||
_permissions:
|
||||
"read:account": "View your account information"
|
||||
"write:account": "Edit your account information"
|
||||
|
@ -1517,11 +1554,12 @@ _auth:
|
|||
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
|
||||
shareAccessAsk: "Are you sure you want to authorize this application to access your
|
||||
account?"
|
||||
permissionAsk: "This application requests the following permissions"
|
||||
permissionAsk: "This application requests the following permissions:"
|
||||
pleaseGoBack: "Please go back to the application"
|
||||
callback: "Returning to the application"
|
||||
denied: "Access denied"
|
||||
copyAsk: "Please paste the following authorization code to the application"
|
||||
copyAsk: "Please paste the following authorization code to the application:"
|
||||
allPermissions: "Full account access"
|
||||
_antennaSources:
|
||||
all: "All posts"
|
||||
homeTimeline: "Posts from followed users"
|
||||
|
@ -1596,11 +1634,11 @@ _poll:
|
|||
remainingSeconds: "{s} second(s) remaining"
|
||||
_visibility:
|
||||
public: "Public"
|
||||
publicDescription: "Your post will be visible for all users"
|
||||
publicDescription: "Your post will be visible in all public timelines"
|
||||
home: "Unlisted"
|
||||
homeDescription: "Post to home timeline only"
|
||||
followers: "Followers"
|
||||
followersDescription: "Make visible to your followers only"
|
||||
followersDescription: "Make visible to your followers and mentioned users only"
|
||||
specified: "Direct"
|
||||
specifiedDescription: "Make visible for specified users only"
|
||||
localOnly: "Local only"
|
||||
|
@ -2027,16 +2065,24 @@ _deck:
|
|||
widgets: "Widgets"
|
||||
notifications: "Notifications"
|
||||
tl: "Timeline"
|
||||
antenna: "Antennas"
|
||||
antenna: "Antenna"
|
||||
list: "List"
|
||||
channel: "Channel"
|
||||
mentions: "Mentions"
|
||||
direct: "Direct messages"
|
||||
_experiments:
|
||||
title: "Experiments"
|
||||
enablePostEditing: "Enable post editing"
|
||||
postEditingCaption: "Shows the option for users to edit their existing posts via\
|
||||
\ the post options menu, and allows post edits from other instances to be recieved."
|
||||
enablePostImports: "Enable post imports"
|
||||
postImportsCaption: "Allows users to import their posts from past Calckey,\
|
||||
\ Misskey, Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during\
|
||||
\ load if your queue is bottlenecked."
|
||||
_dialog:
|
||||
charactersExceeded: "Max characters exceeded! Current: {current}/Limit: {max}"
|
||||
charactersBelow: "Not enough characters! Current: {current}/Limit: {min}"
|
||||
_skinTones:
|
||||
yellow: "Yellow"
|
||||
light: "Light"
|
||||
mediumLight: "Medium Light"
|
||||
medium: "Medium"
|
||||
mediumDark: "Medium Dark"
|
||||
dark: "Dark"
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
_lang_: "Español"
|
||||
headlineMisskey: "¡Un proyecto de código abierto y una plataforma de medios de comunicación\
|
||||
\ descentralizada que es gratis para siempre! \U0001F680"
|
||||
introMisskey: "¡Bienvenido! ¡Calckey es un proyecto de código abierto, plataforma\
|
||||
\ descentralizado medios de comunicación social que es gratis para siempre! \U0001F680"
|
||||
headlineMisskey: "¡Un proyecto de código abierto y una plataforma de medios de comunicación
|
||||
descentralizada que es gratis para siempre! 🚀"
|
||||
introMisskey: "¡Bienvenido! ¡Calckey es un proyecto de código abierto, plataforma
|
||||
descentralizado medios de comunicación social que es gratis para siempre! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Buscar"
|
||||
notifications: "Notificaciones"
|
||||
|
@ -17,7 +17,7 @@ enterUsername: "Introduce el nombre de usuario"
|
|||
renotedBy: "Impulsado por {user}"
|
||||
noNotes: "No hay publicaciones"
|
||||
noNotifications: "No hay notificaciones"
|
||||
instance: "Instancia"
|
||||
instance: "Servidor"
|
||||
settings: "Configuración"
|
||||
basicSettings: "Configuración Básica"
|
||||
otherSettings: "Configuración avanzada"
|
||||
|
@ -45,8 +45,8 @@ copyContent: "Copiar contenido"
|
|||
copyLink: "Copiar enlace"
|
||||
delete: "Borrar"
|
||||
deleteAndEdit: "Borrar y editar"
|
||||
deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta publicación y editarla?\
|
||||
\ Perderás todas las reacciones, impulsos y respuestas."
|
||||
deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta publicación y editarla?
|
||||
Perderás todas las reacciones, impulsos y respuestas."
|
||||
addToList: "Agregar a lista"
|
||||
sendMessage: "Enviar un mensaje"
|
||||
copyUsername: "Copiar nombre de usuario"
|
||||
|
@ -66,11 +66,11 @@ import: "Importar"
|
|||
export: "Exportar"
|
||||
files: "Archivos"
|
||||
download: "Descargar"
|
||||
driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Las publicaciones que\
|
||||
\ tengan este archivo como adjunto serán eliminadas."
|
||||
driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Será removido de todas
|
||||
las publicaciones que tengan este archivo adjunto."
|
||||
unfollowConfirm: "¿Desea dejar de seguir a {name}?"
|
||||
exportRequested: "Se ha solicitado la exportación. Puede tomar un tiempo. Cuando termine\
|
||||
\ la exportación, se añadirá en el drive."
|
||||
exportRequested: "Se ha solicitado la exportación. Puede tomar un tiempo. Cuando termine
|
||||
la exportación, se añadirá en el drive."
|
||||
importRequested: "Se ha solicitado la importación. Puede tomar un tiempo."
|
||||
lists: "Listas"
|
||||
noLists: "No tiene listas"
|
||||
|
@ -85,11 +85,11 @@ error: "Error"
|
|||
somethingHappened: "Ocurrió un error"
|
||||
retry: "Reintentar"
|
||||
pageLoadError: "Error al cargar la página."
|
||||
pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador.\
|
||||
\ Por favor limpie el caché o intente más tarde."
|
||||
pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador.
|
||||
Por favor limpie el caché o intente más tarde."
|
||||
serverIsDead: "No hay respuesta del servidor. Espere un momento y vuelva a intentarlo."
|
||||
youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza\
|
||||
\ una versión más reciente del cliente."
|
||||
youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza
|
||||
una versión más reciente del cliente."
|
||||
enterListName: "Ingrese nombre de lista"
|
||||
privacy: "Privacidad"
|
||||
makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento"
|
||||
|
@ -114,8 +114,8 @@ sensitive: "Marcado como sensible"
|
|||
add: "Agregar"
|
||||
reaction: "Reacción"
|
||||
reactionSetting: "Reacciones para mostrar en el menú de reacciones"
|
||||
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete\
|
||||
\ la tecla + para añadir."
|
||||
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete
|
||||
la tecla + para añadir."
|
||||
rememberNoteVisibility: "Recordar la configuración de visibilidad de la publicación"
|
||||
attachCancel: "Quitar adjunto"
|
||||
markAsSensitive: "Marcar como sensible"
|
||||
|
@ -144,24 +144,24 @@ emojiUrl: "URL de la imágen del emoji"
|
|||
addEmoji: "Agregar emoji"
|
||||
settingGuide: "Configuración sugerida"
|
||||
cacheRemoteFiles: "Mantener en cache los archivos remotos"
|
||||
cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos\
|
||||
\ se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar\
|
||||
\ almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas."
|
||||
cacheRemoteFilesDescription: "Si desactiva esta configuración, los archivos remotos
|
||||
se cargarán desde el servidor remoto sin usar la caché. Con eso se puede ahorrar
|
||||
almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas."
|
||||
flagAsBot: "Esta cuenta es un bot"
|
||||
flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active\
|
||||
\ esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar\
|
||||
\ cadenas infinitas de reacciones, y ajustará los sistemas internos de Calckey para\
|
||||
\ que trate a esta cuenta como un bot."
|
||||
flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active
|
||||
esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar
|
||||
cadenas infinitas de reacciones, y ajustará los sistemas internos de Calckey para
|
||||
que trate a esta cuenta como un bot."
|
||||
flagAsCat: "Esta cuenta es un gato"
|
||||
flagAsCatDescription: "Vas a tener orejas de gato y hablar como un gato!"
|
||||
flagShowTimelineReplies: "Mostrar respuestas a las notas en la biografía"
|
||||
flagShowTimelineRepliesDescription: "Cuando se marca, la línea de tiempo muestra respuestas\
|
||||
\ a otras publicaciones además de las publicaciones del usuario."
|
||||
autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los\
|
||||
\ usuarios que sigues"
|
||||
flagShowTimelineRepliesDescription: "Cuando se marca, la línea de tiempo muestra respuestas
|
||||
a otras publicaciones además de las publicaciones del usuario."
|
||||
autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los
|
||||
usuarios que sigues"
|
||||
addAccount: "Agregar Cuenta"
|
||||
loginFailed: "Error al iniciar sesión"
|
||||
showOnRemote: "Ver en una instancia remota"
|
||||
showOnRemote: "Ver en servidor remoto"
|
||||
general: "General"
|
||||
wallpaper: "Fondo de pantalla"
|
||||
setWallpaper: "Establecer fondo de pantalla"
|
||||
|
@ -170,17 +170,17 @@ searchWith: "Buscar: {q}"
|
|||
youHaveNoLists: "No tienes listas"
|
||||
followConfirm: "¿Desea seguir a {name}?"
|
||||
proxyAccount: "Cuenta proxy"
|
||||
proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor\
|
||||
\ remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario\
|
||||
\ añade un usuario remoto a una lista, si ningún usuario local sigue al usuario\
|
||||
\ agregado a la lista, la instancia no puede obtener su actividad. Así que la cuenta\
|
||||
\ proxy sigue al usuario añadido a la lista."
|
||||
proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor
|
||||
remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario añade
|
||||
un usuario remoto a una lista, si ningún usuario local sigue al usuario agregado
|
||||
a la lista, el servidor no puede obtener su actividad. Así que la cuenta proxy sigue
|
||||
al usuario añadido a la lista."
|
||||
host: "Host"
|
||||
selectUser: "Elegir usuario"
|
||||
recipient: "Recipiente"
|
||||
annotation: "Anotación"
|
||||
federation: "Federación"
|
||||
instances: "Instancia"
|
||||
instances: "Servidores"
|
||||
registeredAt: "Registrado en"
|
||||
latestRequestSentAt: "Ultimo pedido enviado"
|
||||
latestRequestReceivedAt: "Ultimo pedido recibido"
|
||||
|
@ -190,7 +190,7 @@ charts: "Chat"
|
|||
perHour: "por hora"
|
||||
perDay: "por día"
|
||||
stopActivityDelivery: "Dejar de enviar actividades"
|
||||
blockThisInstance: "Bloquear instancia"
|
||||
blockThisInstance: "Bloquear este servidor"
|
||||
operations: "Operaciones"
|
||||
software: "Software"
|
||||
version: "Versión"
|
||||
|
@ -200,18 +200,17 @@ jobQueue: "Cola de trabajos"
|
|||
cpuAndMemory: "CPU y Memoria"
|
||||
network: "Red"
|
||||
disk: "Disco"
|
||||
instanceInfo: "información de la instancia"
|
||||
instanceInfo: "Información del servidor"
|
||||
statistics: "Estadísticas"
|
||||
clearQueue: "Limpiar cola"
|
||||
clearQueueConfirmTitle: "¿Desea limpiar la cola?"
|
||||
clearQueueConfirmText: "Las publicaciones aún no entregadas no se federarán. Normalmente\
|
||||
\ no se necesita ejecutar esta operación."
|
||||
clearQueueConfirmText: "Las publicaciones aún no entregadas no se federarán. Normalmente
|
||||
no se necesita ejecutar esta operación."
|
||||
clearCachedFiles: "Limpiar caché"
|
||||
clearCachedFilesConfirm: "¿Desea borrar todos los archivos remotos cacheados?"
|
||||
blockedInstances: "Instancias bloqueadas"
|
||||
blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear,\
|
||||
\ separadas por una linea nueva. Las instancias bloqueadas no podrán comunicarse\
|
||||
\ con esta instancia."
|
||||
blockedInstances: "Servidores bloqueados"
|
||||
blockedInstancesDescription: "Escriba los hosts de los servidores que desea bloquear.
|
||||
Los servidores bloqueados no podrán comunicarse con este servidor."
|
||||
muteAndBlock: "Silenciar y bloquear"
|
||||
mutedUsers: "Usuarios silenciados"
|
||||
blockedUsers: "Usuarios bloqueados"
|
||||
|
@ -234,9 +233,9 @@ all: "Todo"
|
|||
subscribing: "Suscribiendo"
|
||||
publishing: "Publicando"
|
||||
notResponding: "Sin respuestas"
|
||||
instanceFollowing: "Siguiendo instancias"
|
||||
instanceFollowers: "Seguidores de la instancia"
|
||||
instanceUsers: "Usuarios de la instancia"
|
||||
instanceFollowing: "Siguiendo en este servidor"
|
||||
instanceFollowers: "Seguidores del servidor"
|
||||
instanceUsers: "Usuarios de este servidor"
|
||||
changePassword: "Cambiar contraseña"
|
||||
security: "Seguridad"
|
||||
retypedNotMatch: "No hay coincidencia."
|
||||
|
@ -260,9 +259,9 @@ saved: "Guardado"
|
|||
messaging: "Chat"
|
||||
upload: "Subir"
|
||||
keepOriginalUploading: "Mantener la imagen original"
|
||||
keepOriginalUploadingDescription: "Mantener la versión original al cargar imágenes.\
|
||||
\ Si está desactivado, el navegador generará imágenes para la publicación web en\
|
||||
\ el momento de recargar la página."
|
||||
keepOriginalUploadingDescription: "Mantener la versión original al cargar imágenes.
|
||||
Si está desactivado, el navegador generará imágenes para la publicación web en el
|
||||
momento de recargar la página."
|
||||
fromDrive: "Desde el drive"
|
||||
fromUrl: "Desde la URL"
|
||||
uploadFromUrl: "Subir desde una URL"
|
||||
|
@ -311,8 +310,8 @@ unableToDelete: "No se puede borrar"
|
|||
inputNewFileName: "Ingrese un nuevo nombre de archivo"
|
||||
inputNewDescription: "Ingrese nueva descripción"
|
||||
inputNewFolderName: "Ingrese un nuevo nombre de la carpeta"
|
||||
circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que\
|
||||
\ quieres mover."
|
||||
circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que
|
||||
quieres mover."
|
||||
hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía."
|
||||
copyUrl: "Copiar URL"
|
||||
rename: "Renombrar"
|
||||
|
@ -329,8 +328,8 @@ unwatch: "Dejar de ver"
|
|||
accept: "Aceptar"
|
||||
reject: "Rechazar"
|
||||
normal: "Normal"
|
||||
instanceName: "Nombre de la instancia"
|
||||
instanceDescription: "Descripción de la instancia"
|
||||
instanceName: "Nombre del servidor"
|
||||
instanceDescription: "Descripción del servidor"
|
||||
maintainerName: "Nombre del administrador"
|
||||
maintainerEmail: "Correo del administrador"
|
||||
tosUrl: "URL de los términos de uso"
|
||||
|
@ -346,8 +345,8 @@ connectService: "Conectar"
|
|||
disconnectService: "Desconectar"
|
||||
enableLocalTimeline: "Habilitar linea de tiempo local"
|
||||
enableGlobalTimeline: "Habilitar linea de tiempo global"
|
||||
disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia\
|
||||
\ el administrador y los moderadores pueden seguir usándolos"
|
||||
disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia
|
||||
el administrador y los moderadores pueden seguir usándolos"
|
||||
registration: "Registro"
|
||||
enableRegistration: "Permitir nuevos registros"
|
||||
invite: "Invitar"
|
||||
|
@ -359,11 +358,11 @@ bannerUrl: "URL de la imagen del banner"
|
|||
backgroundImageUrl: "URL de la imagen de fondo"
|
||||
basicInfo: "Información básica"
|
||||
pinnedUsers: "Usuarios fijados"
|
||||
pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\"\
|
||||
\ separados por una linea nueva"
|
||||
pinnedUsersDescription: "Describir los usuarios que quiere fijar en la pestaña \"\
|
||||
Explorar\" separados por líneas nuevas."
|
||||
pinnedPages: "Páginas fijadas"
|
||||
pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página\
|
||||
\ principal de la instancia, separadas por lineas nuevas"
|
||||
pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página
|
||||
principal del servidor, separadas por líneas nuevas."
|
||||
pinnedClipId: "Id del clip fijado"
|
||||
pinnedNotes: "Publicación fijada"
|
||||
hcaptcha: "hCaptcha"
|
||||
|
@ -374,17 +373,17 @@ recaptcha: "reCAPTCHA"
|
|||
enableRecaptcha: "activar reCAPTCHA"
|
||||
recaptchaSiteKey: "Clave del sitio"
|
||||
recaptchaSecretKey: "Clave secreta"
|
||||
avoidMultiCaptchaConfirm: "El uso de múltiples Captchas puede causar interferencia.\
|
||||
\ ¿Desea desactivar el otro Captcha? Puede dejar múltiples Captchas habilitadas\
|
||||
\ presionando cancelar."
|
||||
avoidMultiCaptchaConfirm: "El uso de múltiples Captchas puede causar interferencia.
|
||||
¿Desea desactivar el otro Captcha? Puede dejar múltiples Captchas habilitadas presionando
|
||||
cancelar."
|
||||
antennas: "Antenas"
|
||||
manageAntennas: "Administrar antenas"
|
||||
name: "Nombre"
|
||||
antennaSource: "Origen de la antena"
|
||||
antennaKeywords: "Palabras clave para recibir"
|
||||
antennaExcludeKeywords: "Palabras clave para excluir"
|
||||
antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar\
|
||||
\ con una linea nueva es una declaración OR"
|
||||
antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar
|
||||
con una linea nueva es una declaración OR"
|
||||
notifyAntenna: "Notificar nueva publicación"
|
||||
withFileAntenna: "Sólo publicaciones con archivos adjuntados"
|
||||
enableServiceworker: "Activar ServiceWorker"
|
||||
|
@ -472,8 +471,8 @@ strongPassword: "Muy buena contraseña"
|
|||
passwordMatched: "Correcto"
|
||||
passwordNotMatched: "Las contraseñas no son las mismas"
|
||||
signinWith: "Inicie sesión con {x}"
|
||||
signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario\
|
||||
\ y contraseña correctos."
|
||||
signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario
|
||||
y contraseña correctos."
|
||||
tapSecurityKey: "Toque la clave de seguridad"
|
||||
or: "O"
|
||||
language: "Idioma"
|
||||
|
@ -483,8 +482,8 @@ aboutX: "Acerca de {x}"
|
|||
useOsNativeEmojis: "Usa los emojis nativos de la plataforma"
|
||||
disableDrawer: "No mostrar los menús en cajones"
|
||||
youHaveNoGroups: "Sin grupos"
|
||||
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su\
|
||||
\ propio grupo."
|
||||
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su
|
||||
propio grupo."
|
||||
noHistory: "No hay datos en el historial"
|
||||
signinHistory: "Historial de ingresos"
|
||||
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
|
||||
|
@ -515,28 +514,28 @@ showFeaturedNotesInTimeline: "Mostrar publicaciones destacadas en la línea de t
|
|||
objectStorage: "Almacenamiento de objetos"
|
||||
useObjectStorage: "Usar almacenamiento de objetos"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer\
|
||||
\ referencia a objetos (medios). Especifique su URL si está utilizando un CDN o\
|
||||
\ Proxy; de lo contrario, especifique la dirección a la que se puede acceder públicamente\
|
||||
\ de acuerdo con la guía de servicio que va a utilizar. i.g 'https://<bucket>.s3.amazonaws.com'\
|
||||
\ para AWS S3 y 'https://storage.googleapis.com/<bucket>' para GCS."
|
||||
objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer
|
||||
referencia a objetos (medios). Especifique su URL si está utilizando un CDN o Proxy;
|
||||
de lo contrario, especifique la dirección a la que se puede acceder públicamente
|
||||
de acuerdo con la guía de servicio que va a utilizar. i.g 'https://<bucket>.s3.amazonaws.com'
|
||||
para AWS S3 y 'https://storage.googleapis.com/<bucket>' para GCS."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio\
|
||||
\ configurado."
|
||||
objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio
|
||||
configurado."
|
||||
objectStoragePrefix: "Prefix"
|
||||
objectStoragePrefixDesc: "Los archivos se almacenarán en el directorio de este prefijo."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario,\
|
||||
\ especifique el punto final como '<host>' o '<host>: <port>' de acuerdo con la\
|
||||
\ guía de servicio que va a utilizar."
|
||||
objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario,
|
||||
especifique el punto final como '<host>' o '<host>: <port>' de acuerdo con la guía
|
||||
de servicio que va a utilizar."
|
||||
objectStorageRegion: "Region"
|
||||
objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio\
|
||||
\ no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'."
|
||||
objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio
|
||||
no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'."
|
||||
objectStorageUseSSL: "Usar SSL"
|
||||
objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión API"
|
||||
objectStorageUseProxy: "Conectarse a través de Proxy"
|
||||
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\
|
||||
\ de Almacenamiento de objetos"
|
||||
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión
|
||||
de Almacenamiento de objetos"
|
||||
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
|
||||
serverLogs: "Registros del servidor"
|
||||
deleteAll: "Eliminar todos"
|
||||
|
@ -564,8 +563,8 @@ sort: "Ordenar"
|
|||
ascendingOrder: "Ascendente"
|
||||
descendingOrder: "Descendente"
|
||||
scratchpad: "Scratch pad"
|
||||
scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript.\
|
||||
\ Puede escribir, ejecutar y verificar los resultados que interactúan con Calckey."
|
||||
scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript.
|
||||
Puede escribir, ejecutar y verificar los resultados que interactúan con Calckey."
|
||||
output: "Salida"
|
||||
script: "Script"
|
||||
disablePagesScript: "Deshabilitar AiScript en Páginas"
|
||||
|
@ -573,14 +572,14 @@ updateRemoteUser: "Actualizar información de usuario remoto"
|
|||
deleteAllFiles: "Borrar todos los archivos"
|
||||
deleteAllFilesConfirm: "¿Desea borrar todos los archivos?"
|
||||
removeAllFollowing: "Retener todos los siguientes"
|
||||
removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}.\
|
||||
\ Ejecutar en caso de que esta instancia haya dejado de existir."
|
||||
removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}.
|
||||
Ejecutar en caso de que esta instancia haya dejado de existir."
|
||||
userSuspended: "Este usuario ha sido suspendido."
|
||||
userSilenced: "Este usuario ha sido silenciado."
|
||||
yourAccountSuspendedTitle: "Esta cuenta ha sido suspendida"
|
||||
yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones\
|
||||
\ de los términos de servicio del servidor y otras razones. Para más información,\
|
||||
\ póngase en contacto con el administrador. Por favor, no cree una nueva cuenta."
|
||||
yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones
|
||||
de los términos de servicio del servidor y otras razones. Para más información,
|
||||
póngase en contacto con el administrador. Por favor, no cree una nueva cuenta."
|
||||
menu: "Menú"
|
||||
divider: "Divisor"
|
||||
addItem: "Agregar elemento"
|
||||
|
@ -634,15 +633,15 @@ smtpHost: "Host"
|
|||
smtpPort: "Puerto"
|
||||
smtpUser: "Nombre de usuario"
|
||||
smtpPass: "Contraseña"
|
||||
emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para\
|
||||
\ deshabilitar la autenticación SMTP"
|
||||
emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para
|
||||
deshabilitar la autenticación SMTP"
|
||||
smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP"
|
||||
smtpSecureInfo: "Apagar cuando se use STARTTLS"
|
||||
testEmail: "Prueba de envío"
|
||||
wordMute: "Silenciar palabras"
|
||||
regexpError: "Error de la expresión regular"
|
||||
regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line}\
|
||||
\ de las palabras muteadas {tab}"
|
||||
regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line}
|
||||
de las palabras muteadas {tab}"
|
||||
instanceMute: "Instancias silenciadas"
|
||||
userSaysSomething: "{name} dijo algo"
|
||||
makeActive: "Activar"
|
||||
|
@ -658,13 +657,13 @@ create: "Crear"
|
|||
notificationSetting: "Ajustes de Notificaciones"
|
||||
notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar"
|
||||
useGlobalSetting: "Usar ajustes globales"
|
||||
useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de\
|
||||
\ la cuenta, al desactivarse se pueden hacer configuraciones particulares."
|
||||
useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de
|
||||
la cuenta, al desactivarse se pueden hacer configuraciones particulares."
|
||||
other: "Otro"
|
||||
regenerateLoginToken: "Regenerar token de login"
|
||||
regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el\
|
||||
\ login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en\
|
||||
\ todos los dispositivos."
|
||||
regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el
|
||||
login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en todos
|
||||
los dispositivos."
|
||||
setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios."
|
||||
fileIdOrUrl: "Id del archivo o URL"
|
||||
behavior: "Comportamiento"
|
||||
|
@ -672,15 +671,15 @@ sample: "Muestra"
|
|||
abuseReports: "Reportes"
|
||||
reportAbuse: "Reportar"
|
||||
reportAbuseOf: "Reportar a {name}"
|
||||
fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en\
|
||||
\ particular, ingrese la URL de esta."
|
||||
fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en
|
||||
particular, ingrese la URL de esta."
|
||||
abuseReported: "Se ha enviado el reporte. Muchas gracias."
|
||||
reporter: "Reportador"
|
||||
reporteeOrigin: "Reportar a"
|
||||
reporterOrigin: "Origen del reporte"
|
||||
forwardReport: "Transferir un informe a una instancia remota"
|
||||
forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá\
|
||||
\ como una cuenta anónima del sistema"
|
||||
forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá
|
||||
como una cuenta anónima del sistema"
|
||||
send: "Enviar"
|
||||
abuseMarkAsResolved: "Marcar reporte como resuelto"
|
||||
openInNewTab: "Abrir en una Nueva Pestaña"
|
||||
|
@ -701,8 +700,8 @@ unclip: "Quitar clip"
|
|||
confirmToUnclipAlreadyClippedNote: "Esta nota ya está incluida en el clip \"{name}\"\
|
||||
. ¿Quiere quitar la nota del clip?"
|
||||
public: "Público"
|
||||
i18nInfo: "Calckey está siendo traducido a varios idiomas gracias a voluntarios. Se\
|
||||
\ puede colaborar traduciendo en {link}"
|
||||
i18nInfo: "Calckey está siendo traducido a varios idiomas gracias a voluntarios. Se
|
||||
puede colaborar traduciendo en {link}"
|
||||
manageAccessTokens: "Administrar tokens de acceso"
|
||||
accountInfo: "Información de la Cuenta"
|
||||
notesCount: "Cantidad de notas"
|
||||
|
@ -721,18 +720,18 @@ no: "No"
|
|||
driveFilesCount: "Cantidad de archivos en el drive"
|
||||
driveUsage: "Uso del drive"
|
||||
noCrawle: "Rechazar indexación del crawler"
|
||||
noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas,\
|
||||
\ páginas, etc."
|
||||
lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo\
|
||||
\ seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que\
|
||||
\ los seguidores sean aprobados manualmente."
|
||||
alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por\
|
||||
\ defecto"
|
||||
noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas,
|
||||
páginas, etc."
|
||||
lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo
|
||||
seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que
|
||||
los seguidores sean aprobados manualmente."
|
||||
alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por
|
||||
defecto"
|
||||
loadRawImages: "Cargar las imágenes originales en lugar de mostrar las miniaturas"
|
||||
disableShowingAnimatedImages: "No reproducir imágenes animadas"
|
||||
verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por\
|
||||
\ favor, acceda al enlace proporcionado en el correo electrónico para completar\
|
||||
\ la configuración."
|
||||
verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por
|
||||
favor, acceda al enlace proporcionado en el correo electrónico para completar la
|
||||
configuración."
|
||||
notSet: "Sin especificar"
|
||||
emailVerified: "Su dirección de correo electrónico ha sido verificada."
|
||||
noteFavoritesCount: "Número de notas favoritas"
|
||||
|
@ -744,16 +743,16 @@ clips: "Clip"
|
|||
experimentalFeatures: "Características experimentales"
|
||||
developer: "Desarrolladores"
|
||||
makeExplorable: "Hacer visible la cuenta en \"Explorar\""
|
||||
makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la\
|
||||
\ sección \"Explorar\"."
|
||||
makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la
|
||||
sección \"Explorar\"."
|
||||
showGapBetweenNotesInTimeline: "Mostrar un intervalo entre notas en la línea de tiempo"
|
||||
duplicate: "Duplicar"
|
||||
left: "Izquierda"
|
||||
center: "Centrar"
|
||||
wide: "Ancho"
|
||||
narrow: "Estrecho"
|
||||
reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la\
|
||||
\ página. ¿Recargar ahora?"
|
||||
reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la
|
||||
página. ¿Recargar ahora?"
|
||||
needReloadToApply: "Se requiere un reinicio para la aplicar los cambios"
|
||||
showTitlebar: "Mostrar la barra de título"
|
||||
clearCache: "Limpiar caché"
|
||||
|
@ -761,11 +760,11 @@ onlineUsersCount: "{n} usuarios en línea"
|
|||
nUsers: "{n} Usuarios"
|
||||
nNotes: "{n} Notas"
|
||||
sendErrorReports: "Envíar informe de errores"
|
||||
sendErrorReportsDescription: "Si habilita esta opción, los detalles de los errores\
|
||||
\ serán compartidos con Calckey cuando ocurra un problema, lo que ayudará a mejorar\
|
||||
\ la calidad de Calckey. \nEsto incluye información como la versión del sistema\
|
||||
\ operativo, el tipo de navegador que está utilizando y su historial en Calckey,\
|
||||
\ entre otros datos."
|
||||
sendErrorReportsDescription: "Si habilita esta opción, los detalles de los errores
|
||||
serán compartidos con Calckey cuando ocurra un problema, lo que ayudará a mejorar
|
||||
la calidad de Calckey. \nEsto incluye información como la versión del sistema operativo,
|
||||
el tipo de navegador que está utilizando y su historial en Calckey, entre otros
|
||||
datos."
|
||||
myTheme: "Mi Tema"
|
||||
backgroundColor: "Fondo"
|
||||
accentColor: "Acento"
|
||||
|
@ -793,8 +792,8 @@ receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia"
|
|||
emailNotification: "Notificaciones por correo electrónico"
|
||||
publish: "Publicar"
|
||||
inChannelSearch: "Buscar en el canal"
|
||||
useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\
|
||||
\ de reacciones"
|
||||
useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu
|
||||
de reacciones"
|
||||
typingUsers: "{users} está escribiendo"
|
||||
jumpToSpecifiedDate: "Saltar a una fecha específica"
|
||||
showingPastTimeline: "Mostrar líneas de tiempo antiguas"
|
||||
|
@ -805,16 +804,16 @@ unlikeConfirm: "¿Quitar como favorito?"
|
|||
fullView: "Vista completa"
|
||||
quitFullView: "quitar vista completa"
|
||||
addDescription: "Agregar descripción"
|
||||
userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú\
|
||||
\ de notas individuales"
|
||||
userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú
|
||||
de notas individuales"
|
||||
notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino"
|
||||
info: "Información"
|
||||
userInfo: "Información del usuario"
|
||||
unknown: "Desconocido"
|
||||
onlineStatus: "En línea"
|
||||
hideOnlineStatus: "mostrarse como desconectado"
|
||||
hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia\
|
||||
\ de algunas funciones, como la búsqueda"
|
||||
hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia
|
||||
de algunas funciones, como la búsqueda"
|
||||
online: "En línea"
|
||||
active: "Activo"
|
||||
offline: "Sin conexión"
|
||||
|
@ -849,8 +848,8 @@ emailNotConfiguredWarning: "No se ha configurado una dirección de correo electr
|
|||
ratio: "Proporción"
|
||||
previewNoteText: "Mostrar vista preliminar"
|
||||
customCss: "CSS personalizado"
|
||||
customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir\
|
||||
\ valores inadecuados puede hacer que el cliente deje de funcionar con normalidad."
|
||||
customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir
|
||||
valores inadecuados puede hacer que el cliente deje de funcionar con normalidad."
|
||||
global: "Global"
|
||||
squareAvatars: "Mostrar iconos cuadrados"
|
||||
sent: "Enviar"
|
||||
|
@ -865,9 +864,9 @@ whatIsNew: "Mostrar cambios"
|
|||
translate: "Traducir"
|
||||
translatedFrom: "Traducido de {x}"
|
||||
accountDeletionInProgress: "La eliminación de la cuenta está en curso"
|
||||
usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede\
|
||||
\ utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres\
|
||||
\ de usuario no se pueden cambiar posteriormente."
|
||||
usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede
|
||||
utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres
|
||||
de usuario no se pueden cambiar posteriormente."
|
||||
aiChanMode: "Modo Ai"
|
||||
keepCw: "Mantener la advertencia de contenido"
|
||||
pubSub: "Cuentas Pub/Sub"
|
||||
|
@ -877,21 +876,21 @@ unresolved: "Sin resolver"
|
|||
breakFollow: "Dejar de seguir"
|
||||
itsOn: "¡Está encendido!"
|
||||
itsOff: "¡Está apagado!"
|
||||
emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro\
|
||||
\ de la cuenta"
|
||||
emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro
|
||||
de la cuenta"
|
||||
unread: "No leído"
|
||||
filter: "Filtro"
|
||||
controlPanel: "Panel de control"
|
||||
manageAccounts: "Administrar cuenta"
|
||||
makeReactionsPublic: "Hacer el historial de reacciones público"
|
||||
makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente\
|
||||
\ visibles."
|
||||
makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente
|
||||
visibles."
|
||||
classic: "Clásico"
|
||||
muteThread: "Ocultar hilo"
|
||||
unmuteThread: "Mostrar hilo"
|
||||
ffVisibility: "Visibilidad de seguidores y seguidos"
|
||||
ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes\
|
||||
\ te siguen"
|
||||
ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes
|
||||
te siguen"
|
||||
continueThread: "Ver la continuación del hilo"
|
||||
deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?"
|
||||
incorrectPassword: "La contraseña es incorrecta"
|
||||
|
@ -932,16 +931,16 @@ thereIsUnresolvedAbuseReportWarning: "Hay reportes sin resolver"
|
|||
recommended: "Recomendado"
|
||||
check: "Verificar"
|
||||
driveCapOverrideLabel: "Cambiar la capacidad de la unidad para este usuario"
|
||||
driveCapOverrideCaption: "Restablecer la capacidad a su predeterminado ingresando\
|
||||
\ un valor de 0 o menos"
|
||||
driveCapOverrideCaption: "Restablecer la capacidad a su predeterminado ingresando
|
||||
un valor de 0 o menos"
|
||||
requireAdminForView: "Necesitas iniciar sesión como administrador para ver esto."
|
||||
isSystemAccount: "Cuenta creada y operada automáticamente por el sistema"
|
||||
typeToConfirm: "Ingrese {x} para confirmar"
|
||||
deleteAccount: "Borrar cuenta"
|
||||
document: "Documento"
|
||||
numberOfPageCache: "Cantidad de páginas cacheadas"
|
||||
numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien\
|
||||
\ puede aumentar la carga y la memoria a usarse"
|
||||
numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien
|
||||
puede aumentar la carga y la memoria a usarse"
|
||||
logoutConfirm: "¿Cerrar sesión?"
|
||||
lastActiveDate: "Utilizado por última vez el"
|
||||
statusbar: "Barra de estado"
|
||||
|
@ -958,37 +957,36 @@ sensitiveMediaDetection: "Detección de contenido NSFW"
|
|||
localOnly: "Solo local"
|
||||
remoteOnly: "Sólo remoto"
|
||||
failedToUpload: "La subida falló"
|
||||
cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas\
|
||||
\ partes han sido detectadas comoNSFW."
|
||||
cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en\
|
||||
\ la unidad del usuario."
|
||||
cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas
|
||||
partes han sido detectadas comoNSFW."
|
||||
cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en
|
||||
la unidad del usuario."
|
||||
beta: "Beta"
|
||||
enableAutoSensitive: "Marcar automáticamente contenido NSFW"
|
||||
enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido\
|
||||
\ NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está\
|
||||
\ desactivada, puede ser activado para toda la instancia."
|
||||
activeEmailValidationDescription: "Habilita la validación estricta de direcciones\
|
||||
\ de correo electrónico, lo cual incluye la revisión de direcciones desechables\
|
||||
\ y si se puede comunicar con éstas. Cuando está deshabilitado, sólo el formato\
|
||||
\ de la dirección es validado."
|
||||
enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido
|
||||
NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está desactivada,
|
||||
puede ser activado para toda la instancia."
|
||||
activeEmailValidationDescription: "Habilita la validación estricta de direcciones
|
||||
de correo electrónico, lo cual incluye la revisión de direcciones desechables y
|
||||
si se puede comunicar con éstas. Cuando está deshabilitado, sólo el formato de la
|
||||
dirección es validado."
|
||||
navbar: "Barra de navegación"
|
||||
shuffle: "Aleatorio"
|
||||
account: "Cuentas"
|
||||
move: "Mover"
|
||||
_sensitiveMediaDetection:
|
||||
description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento\
|
||||
\ automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar\
|
||||
\ ligeramente la carga en el servidor."
|
||||
description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento
|
||||
automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar
|
||||
ligeramente la carga en el servidor."
|
||||
sensitivity: "Sensibilidad de detección"
|
||||
sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos\
|
||||
\ positivos, mientras que incrementarla puede reducir las detecciones (falsos\
|
||||
\ negativos)."
|
||||
sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos
|
||||
positivos, mientras que incrementarla puede reducir las detecciones (falsos negativos)."
|
||||
setSensitiveFlagAutomatically: "Marcar como NSFW"
|
||||
setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna\
|
||||
\ pueden ser retenidos incluso si la opción está desactivada."
|
||||
setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna
|
||||
pueden ser retenidos incluso si la opción está desactivada."
|
||||
analyzeVideos: "Habilitar el análisis de videos"
|
||||
analyzeVideosDescription: "Analizar videos en adición a las imágenes. Esto puede\
|
||||
\ incrementar ligeramente la carga del servidor."
|
||||
analyzeVideosDescription: "Analizar videos en adición a las imágenes. Esto puede
|
||||
incrementar ligeramente la carga del servidor."
|
||||
_emailUnavailable:
|
||||
used: "Ya fue usado"
|
||||
format: "El formato de este correo electrónico no es válido"
|
||||
|
@ -1002,15 +1000,15 @@ _ffVisibility:
|
|||
_signup:
|
||||
almostThere: "Ya falta poco"
|
||||
emailAddressInfo: "Ingrese el correo electrónico que usa. Este no se hará público."
|
||||
emailSent: "Se envió un correo de verificación a la dirección {email}. Acceda al\
|
||||
\ link enviado en el correo para completar el ingreso."
|
||||
emailSent: "Se envió un correo de verificación a la dirección {email}. Acceda al
|
||||
link enviado en el correo para completar el ingreso."
|
||||
_accountDelete:
|
||||
accountDelete: "Eliminar Cuenta"
|
||||
mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede\
|
||||
\ pasar un tiempo hasta que se complete si es mucho el contenido creado y los\
|
||||
\ archivos subidos."
|
||||
sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección\
|
||||
\ usada para el registro."
|
||||
mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede
|
||||
pasar un tiempo hasta que se complete si es mucho el contenido creado y los archivos
|
||||
subidos."
|
||||
sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección
|
||||
usada para el registro."
|
||||
requestAccountDelete: "Pedir la eliminación de la cuenta."
|
||||
started: "El proceso de eliminación ha comenzado."
|
||||
inProgress: "La eliminación está en proceso."
|
||||
|
@ -1018,12 +1016,11 @@ _ad:
|
|||
back: "Deseleccionar"
|
||||
reduceFrequencyOfThisAd: "Mostrar menos este anuncio."
|
||||
_forgotPassword:
|
||||
enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link\
|
||||
\ para resetear la contraseña."
|
||||
enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link
|
||||
para resetear la contraseña."
|
||||
ifNoEmail: "Si no utilizó un correo para crear la cuenta, contáctese con el administrador."
|
||||
contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\
|
||||
\ póngase en contacto con el administrador de la instancia para restablecer su\
|
||||
\ contraseña"
|
||||
contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,
|
||||
póngase en contacto con el administrador de la instancia para restablecer su contraseña"
|
||||
_gallery:
|
||||
my: "Mi galería"
|
||||
liked: "Publicaciones que me gustan"
|
||||
|
@ -1046,15 +1043,15 @@ _preferencesBackups:
|
|||
save: "Guardar cambios"
|
||||
inputName: "Por favor, ingresa un nombre para este respaldo"
|
||||
cannotSave: "Fallo al guardar"
|
||||
nameAlreadyExists: "Un respaldo llamado \"{name}\" ya existe. Por favor ingresa\
|
||||
\ un nombre diferente"
|
||||
nameAlreadyExists: "Un respaldo llamado \"{name}\" ya existe. Por favor ingresa
|
||||
un nombre diferente"
|
||||
applyConfirm: "¿Realmente quieres aplicar los cambios desde el archivo \"{name}\"\
|
||||
\ a este dispositivo? Las configuraciones existentes serán sobreescritas. "
|
||||
saveConfirm: "¿Guardar respaldo como \"{name}\"?"
|
||||
deleteConfirm: "¿Borrar el respaldo \"{name}\"?"
|
||||
renameConfirm: "¿Renombrar este respaldo de \"{old}\" a \"{new}\"?"
|
||||
noBackups: "No existen respaldos. Deberás respaldar las configuraciones del cliente\
|
||||
\ en este servidor usando \"Crear nuevo respaldo\""
|
||||
noBackups: "No existen respaldos. Deberás respaldar las configuraciones del cliente
|
||||
en este servidor usando \"Crear nuevo respaldo\""
|
||||
createdAt: "Creado: {date} {time}"
|
||||
updatedAt: "Actualizado: {date} {time}"
|
||||
cannotLoad: "La carga falló"
|
||||
|
@ -1066,15 +1063,15 @@ _registry:
|
|||
domain: "Dominio"
|
||||
createKey: "Crear una llave"
|
||||
_aboutMisskey:
|
||||
about: "Calckey es una bifurcación de Misskey creada por ThatOneCalculator, que\
|
||||
\ ha estado en desarrollo desde el 2022."
|
||||
about: "Calckey es una bifurcación de Misskey creada por ThatOneCalculator, que
|
||||
ha estado en desarrollo desde el 2022."
|
||||
contributors: "Principales colaboradores"
|
||||
allContributors: "Todos los colaboradores"
|
||||
source: "Código fuente"
|
||||
translation: "Traducir Calckey"
|
||||
donate: "Donar a Calckey"
|
||||
morePatrons: "También apreciamos el apoyo de muchos más que no están enlistados\
|
||||
\ aquí. ¡Gracias! \U0001F970"
|
||||
morePatrons: "También apreciamos el apoyo de muchos más que no están enlistados
|
||||
aquí. ¡Gracias! 🥰"
|
||||
patrons: "Mecenas de Calckey"
|
||||
_nsfw:
|
||||
respect: "Ocultar medios NSFW"
|
||||
|
@ -1082,13 +1079,13 @@ _nsfw:
|
|||
force: "Ocultar todos los medios"
|
||||
_mfm:
|
||||
cheatSheet: "Hoja de referencia de MFM"
|
||||
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares\
|
||||
\ dentro de Misskey, Calckey, Akkoma, y mucho más. Aquí puede ver una lista de\
|
||||
\ sintaxis disponibles en MFM."
|
||||
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares
|
||||
dentro de Misskey, Calckey, Akkoma, y mucho más. Aquí puede ver una lista de sintaxis
|
||||
disponibles en MFM."
|
||||
dummy: "Calckey expande el mundo de la Fediverso"
|
||||
mention: "Menciones"
|
||||
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar\
|
||||
\ para notificar a un usuario en particular."
|
||||
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar
|
||||
para notificar a un usuario en particular."
|
||||
hashtag: "Hashtag"
|
||||
hashtagDescription: "Puede especificar un hashtag con un numeral y el texto."
|
||||
url: "URL"
|
||||
|
@ -1104,8 +1101,8 @@ _mfm:
|
|||
inlineCode: "Código (insertado)"
|
||||
inlineCodeDescription: "Muestra el código de un programa resaltando su sintaxis"
|
||||
blockCode: "Código (bloque)"
|
||||
blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias\
|
||||
\ líneas con bloques."
|
||||
blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias
|
||||
líneas con bloques."
|
||||
inlineMath: "Fórmula (insertado)"
|
||||
inlineMathDescription: "Muestra fórmulas (KaTeX) insertadas"
|
||||
blockMath: "Fórmula (bloque)"
|
||||
|
@ -1117,8 +1114,8 @@ _mfm:
|
|||
search: "Buscar"
|
||||
searchDescription: "Muestra una caja de búsqueda con texto pre-escrito"
|
||||
flip: "Echar de un capirotazo"
|
||||
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda\
|
||||
\ / derecha."
|
||||
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda
|
||||
/ derecha."
|
||||
jelly: "Animación (gelatina)"
|
||||
jellyDescription: "Aplica un efecto de animación tipo gelatina"
|
||||
tada: "Animación (tadá)"
|
||||
|
@ -1140,8 +1137,8 @@ _mfm:
|
|||
x4: "Totalmente grande"
|
||||
x4Description: "Muestra el contenido totalmente grande"
|
||||
blur: "Desenfoque"
|
||||
blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar\
|
||||
\ el puntero encima."
|
||||
blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar
|
||||
el puntero encima."
|
||||
font: "Fuente"
|
||||
fontDescription: "Elegir la fuente del contenido"
|
||||
rainbow: "Arcoíris"
|
||||
|
@ -1151,8 +1148,8 @@ _mfm:
|
|||
rotate: "Rotar"
|
||||
rotateDescription: "Rota el contenido a un ángulo especificado."
|
||||
plain: "Plano"
|
||||
plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto\
|
||||
\ MFM."
|
||||
plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto
|
||||
MFM."
|
||||
position: Posición
|
||||
_instanceTicker:
|
||||
none: "No mostrar"
|
||||
|
@ -1182,20 +1179,19 @@ _menuDisplay:
|
|||
hide: "Ocultar"
|
||||
_wordMute:
|
||||
muteWords: "Palabras que silenciar"
|
||||
muteWordsDescription: "Separar con espacios indica una declaracion And, separar\
|
||||
\ con lineas nuevas indica una declaracion Or。"
|
||||
muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones\
|
||||
\ regulares"
|
||||
muteWordsDescription: "Separar con espacios indica una declaracion And, separar
|
||||
con lineas nuevas indica una declaracion Or。"
|
||||
muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones
|
||||
regulares"
|
||||
softDescription: "Ocultar en la linea de tiempo las notas que cumplen las condiciones"
|
||||
hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen\
|
||||
\ las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las\
|
||||
\ condiciones."
|
||||
hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen
|
||||
las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las condiciones."
|
||||
soft: "Suave"
|
||||
hard: "Duro"
|
||||
mutedNotes: "Notas silenciadas"
|
||||
_instanceMute:
|
||||
instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas,\
|
||||
\ incluyendo respuestas a los usuarios de las mismas"
|
||||
instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas,
|
||||
incluyendo respuestas a los usuarios de las mismas"
|
||||
instanceMuteDescription2: "Separar por líneas"
|
||||
title: "Oculta las notas de las instancias listadas."
|
||||
heading: "Instancias a silenciar"
|
||||
|
@ -1301,47 +1297,47 @@ _tutorial:
|
|||
step1_1: "¡Bienvenido!"
|
||||
step1_2: "Vamos a configurarte. Estarás listo y funcionando en poco tiempo"
|
||||
step2_1: "En primer lugar, rellena tu perfil"
|
||||
step2_2: "Proporcionar algo de información sobre quién eres hará que sea más fácil\
|
||||
\ para los demás saber si quieren ver tus notas o seguirte."
|
||||
step2_2: "Proporcionar algo de información sobre quién eres hará que sea más fácil
|
||||
para los demás saber si quieren ver tus notas o seguirte."
|
||||
step3_1: "¡Ahora es el momento de seguir a algunas personas!"
|
||||
step3_2: "Tu página de inicio y tus líneas de tiempo sociales se basan en quién\
|
||||
\ sigues, así que intenta seguir un par de cuentas para empezar.\nHaz clic en\
|
||||
\ el círculo más en la parte superior derecha de un perfil para seguirlos."
|
||||
step3_2: "Tu página de inicio y tus líneas de tiempo sociales se basan en quién
|
||||
sigues, así que intenta seguir un par de cuentas para empezar.\nHaz clic en el
|
||||
círculo más en la parte superior derecha de un perfil para seguirlos."
|
||||
step4_1: "Vamos a salir a la calle"
|
||||
step4_2: "Para tu primer post, a algunas personas les gusta hacer un post de {introduction}\
|
||||
\ o un simple \"¡Hola mundo!\""
|
||||
step4_2: "Para tu primer post, a algunas personas les gusta hacer un post de {introduction}
|
||||
o un simple \"¡Hola mundo!\""
|
||||
step5_1: "¡Líneas de tiempo, líneas de tiempo por todas partes!"
|
||||
step5_2: "Su instancia tiene {timelines} diferentes líneas de tiempo habilitadas"
|
||||
step5_3: "La línea de tiempo Inicio {icon} es donde puedes ver las publicaciones\
|
||||
\ de tus seguidores."
|
||||
step5_4: "La línea de tiempo Local {icon} es donde puedes ver las publicaciones\
|
||||
\ de todos los demás en esta instancia."
|
||||
step5_5: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones\
|
||||
\ de las instancias que los administradores recomiendan."
|
||||
step5_6: "La línea de tiempo Social {icon} es donde puedes ver las publicaciones\
|
||||
\ de los amigos de tus seguidores."
|
||||
step5_7: "La línea de tiempo Global {icon} es donde puedes ver las publicaciones\
|
||||
\ de todas las demás instancias conectadas."
|
||||
step5_3: "La línea de tiempo Inicio {icon} es donde puedes ver las publicaciones
|
||||
de tus seguidores."
|
||||
step5_4: "La línea de tiempo Local {icon} es donde puedes ver las publicaciones
|
||||
de todos los demás en esta instancia."
|
||||
step5_5: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones
|
||||
de las instancias que los administradores recomiendan."
|
||||
step5_6: "La línea de tiempo Social {icon} es donde puedes ver las publicaciones
|
||||
de los amigos de tus seguidores."
|
||||
step5_7: "La línea de tiempo Global {icon} es donde puedes ver las publicaciones
|
||||
de todas las demás instancias conectadas."
|
||||
step6_1: "Entonces, ¿qué es este lugar?"
|
||||
step6_2: "Bueno, no sólo te has unido a Calckey. Te has unido a un portal del Fediverso,\
|
||||
\ una red interconectada de miles de servidores, llamada \"instancias\""
|
||||
step6_3: "Cada servidor funciona de forma diferente, y no todos los servidores ejecutan\
|
||||
\ Calckey. Sin embargo, ¡éste lo hace! Es un poco complicado, pero le cogerás\
|
||||
\ el tranquillo enseguida"
|
||||
step6_2: "Bueno, no sólo te has unido a Calckey. Te has unido a un portal del Fediverso,
|
||||
una red interconectada de miles de servidores, llamada \"instancias\""
|
||||
step6_3: "Cada servidor funciona de forma diferente, y no todos los servidores ejecutan
|
||||
Calckey. Sin embargo, ¡éste lo hace! Es un poco complicado, pero le cogerás el
|
||||
tranquillo enseguida"
|
||||
step6_4: "¡Ahora ve, explora y diviértete!"
|
||||
_2fa:
|
||||
alreadyRegistered: "Ya has completado la configuración."
|
||||
registerDevice: "Registrar dispositivo"
|
||||
registerKey: "Registrar clave"
|
||||
step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o\
|
||||
\ {b} u otra."
|
||||
registerTOTP: "Registrar dispositivo"
|
||||
registerSecurityKey: "Registrar clave"
|
||||
step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o
|
||||
{b} u otra."
|
||||
step2: "Luego, escanee con la aplicación el código QR mostrado en pantalla."
|
||||
step2Url: "En una aplicación de escritorio se puede ingresar la siguiente URL:"
|
||||
step3: "Para terminar, ingrese el token mostrado en la aplicación."
|
||||
step4: "Ahora cuando inicie sesión, ingrese el mismo token"
|
||||
securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad\
|
||||
\ de hardware que soporte FIDO2 o con un certificado de huella digital o con un\
|
||||
\ PIN"
|
||||
securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad
|
||||
de hardware que soporte FIDO2 o con un certificado de huella digital o con un
|
||||
PIN"
|
||||
_permissions:
|
||||
"read:account": "Ver información de la cuenta"
|
||||
"write:account": "Editar información de la cuenta"
|
||||
|
@ -1377,8 +1373,8 @@ _permissions:
|
|||
"write:gallery-likes": "Editar favoritos de la galería"
|
||||
_auth:
|
||||
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
|
||||
shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder\
|
||||
\ a su cuenta?"
|
||||
shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder
|
||||
a su cuenta?"
|
||||
permissionAsk: "Esta aplicación requiere los siguientes permisos"
|
||||
pleaseGoBack: "Por favor, vuelve a la aplicación"
|
||||
callback: "Volviendo a la aplicación"
|
||||
|
@ -1772,8 +1768,8 @@ _pages:
|
|||
_seedRandomPick:
|
||||
arg1: "Semilla"
|
||||
arg2: "Listas"
|
||||
DRPWPM: "Elegir aleatoriamente de la lista ponderada (Diariamente para cada\
|
||||
\ usuario)"
|
||||
DRPWPM: "Elegir aleatoriamente de la lista ponderada (Diariamente para cada
|
||||
usuario)"
|
||||
_DRPWPM:
|
||||
arg1: "Lista de texto"
|
||||
pick: "Elegir de la lista"
|
||||
|
@ -1804,8 +1800,8 @@ _pages:
|
|||
_for:
|
||||
arg1: "Cantidad de repeticiones"
|
||||
arg2: "Acción"
|
||||
typeError: "El slot {slot} acepta el tipo {expect} pero fue ingresado el tipo\
|
||||
\ {actual}"
|
||||
typeError: "El slot {slot} acepta el tipo {expect} pero fue ingresado el tipo
|
||||
{actual}"
|
||||
thereIsEmptySlot: "El slot {slot} está vacío"
|
||||
types:
|
||||
string: "Texto"
|
||||
|
@ -1869,10 +1865,10 @@ _deck:
|
|||
newProfile: "Nuevo perfil"
|
||||
deleteProfile: "Eliminar perfil"
|
||||
introduction: "¡Crea la interfaz perfecta para tí organizando las columnas libremente!"
|
||||
introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas\
|
||||
\ columnas donde quieras."
|
||||
widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna\
|
||||
\ y agrega un widget."
|
||||
introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas
|
||||
columnas donde quieras."
|
||||
widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna
|
||||
y agrega un widget."
|
||||
_columns:
|
||||
main: "Principal"
|
||||
widgets: "Widgets"
|
||||
|
@ -1885,11 +1881,11 @@ _deck:
|
|||
manageGroups: Administrar grupos
|
||||
replayTutorial: Repetir Tutorial
|
||||
privateMode: Modo privado
|
||||
addInstance: Añadir una instancia
|
||||
addInstance: Añadir un servidor
|
||||
renoteMute: Silenciar impulsos
|
||||
renoteUnmute: Dejar de silenciar impulsos
|
||||
flagSpeakAsCat: Habla como un gato
|
||||
selectInstance: Selectiona una instancia
|
||||
selectInstance: Selecciona un servidor
|
||||
flagSpeakAsCatDescription: Tu publicación se "nyanified" cuando esté en modo gato
|
||||
allowedInstances: Instancias en la lista blanca
|
||||
breakFollowConfirm: ¿Estás seguro de que quieres eliminar el seguidor?
|
||||
|
@ -1905,7 +1901,7 @@ license: Licencia
|
|||
noThankYou: No gracias
|
||||
userSaysSomethingReason: '{name} dijo {reason}'
|
||||
hiddenTags: Etiquetas Ocultas
|
||||
noInstances: No hay instancias
|
||||
noInstances: No hay servidores
|
||||
accountMoved: 'Usuario ha movido a una cuenta nueva:'
|
||||
caption: Auto Subtítulos
|
||||
showAds: Mostrar Anuncios
|
||||
|
@ -1922,8 +1918,26 @@ apps: Aplicaciones
|
|||
migration: Migración
|
||||
silenced: Silenciado
|
||||
deleted: Eliminado
|
||||
edited: Editado
|
||||
edited: 'Editado a las {date} {time}'
|
||||
editNote: Editar nota
|
||||
silenceThisInstance: Silenciar esta instancia
|
||||
silenceThisInstance: Silenciar este servidor
|
||||
findOtherInstance: Buscar otro servidor
|
||||
userSaysSomethingReasonRenote: '{name} impulsó una publicación que contiene {reason]'
|
||||
enableRecommendedTimeline: Habilitar línea de tiempo "Recomendado"
|
||||
searchPlaceholder: Buscar en Calckey
|
||||
listsDesc: Las listas te permiten crear líneas de tiempo con usuarios específicos.
|
||||
Puedes acceder a ellas desde la pestaña "Línea de tiempo".
|
||||
removeReaction: Quitar tu reacción
|
||||
selectChannel: Seleccionar canal
|
||||
showEmojisInReactionNotifications: Mostrar emojis en notificaciones de reacciones
|
||||
silencedInstancesDescription: Escriba los hosts de los servidores que desea bloquear.
|
||||
Las cuentas en estos servidores serán tratadas como "silenciadas", solo podrán hacer
|
||||
solicitudes de seguimiento, y no podrán mencionar a usuarios de este servidor si
|
||||
no les siguen. Esto no afecta los servidores bloqueados.
|
||||
silencedInstances: Servidores silenciados
|
||||
hiddenTagsDescription: 'Escriba los hashtags (sin el #) que desea ocultar de las secciones
|
||||
de Tendencias y Explorar. Los hashtags ocultos seguirán siendo descubribles por
|
||||
otros métodos.'
|
||||
jumpToPrevious: Ver anterior
|
||||
enableEmojiReactions: Habilitar reacciones de emoji
|
||||
cw: Aviso de contenido
|
||||
|
|
|
@ -831,7 +831,7 @@ makeReactionsPublic: Aseta reaktiohistoria julkiseksi
|
|||
unread: Lukematon
|
||||
deleted: Poistettu
|
||||
editNote: Muokkaa viestiä
|
||||
edited: Muokattu
|
||||
edited: 'Muokattu klo {date} {time}'
|
||||
avoidMultiCaptchaConfirm: Useiden Captcha-järjestelmien käyttö voi aiheuttaa häiriöitä
|
||||
niiden välillä. Haluatko poistaa käytöstä muut tällä hetkellä käytössä olevat Captcha-järjestelmät?
|
||||
Jos haluat, että ne pysyvät käytössä, paina peruutusnäppäintä.
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
_lang_: "Français"
|
||||
headlineMisskey: "Réseau relié par des notes"
|
||||
introMisskey: "Bienvenue ! Calckey est un service de microblogage décentralisé, libre\
|
||||
\ et ouvert.\nÉcrivez des « notes » et partagez ce qui se passe à l’instant présent,\
|
||||
\ autour de vous avec les autres \U0001F4E1\nLa fonction « réactions », vous permet\
|
||||
\ également d’ajouter une réaction rapide aux notes des autres utilisateur·rice·s\
|
||||
\ \U0001F44D\nExplorons un nouveau monde \U0001F680"
|
||||
introMisskey: "Bienvenue ! Calckey est un service de microblogage décentralisé, libre
|
||||
et ouvert.\nÉcrivez des « notes » et partagez ce qui se passe à l’instant présent,
|
||||
autour de vous avec les autres 📡\nLa fonction « réactions », vous permet également
|
||||
d’ajouter une réaction rapide aux notes des autres utilisateur·rice·s 👍\nExplorons
|
||||
un nouveau monde 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Rechercher"
|
||||
notifications: "Notifications"
|
||||
|
@ -26,8 +26,8 @@ otherSettings: "Paramètres avancés"
|
|||
openInWindow: "Ouvrir dans une nouvelle fenêtre"
|
||||
profile: "Profil"
|
||||
timeline: "Fil"
|
||||
noAccountDescription: "L’utilisateur·rice n’a pas encore renseigné de biographie de\
|
||||
\ présentation sur son profil."
|
||||
noAccountDescription: "L’utilisateur·rice n’a pas encore renseigné de biographie de
|
||||
présentation sur son profil."
|
||||
login: "Se connecter"
|
||||
loggingIn: "Connexion en cours"
|
||||
logout: "Se déconnecter"
|
||||
|
@ -48,8 +48,8 @@ copyContent: "Copier le contenu"
|
|||
copyLink: "Copier le lien"
|
||||
delete: "Supprimer"
|
||||
deleteAndEdit: "Supprimer et réécrire"
|
||||
deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la reformuler\
|
||||
\ ? Vous perdrez toutes les réactions, renotes et réponses y afférentes."
|
||||
deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la reformuler
|
||||
? Vous perdrez toutes les réactions, renotes et réponses y afférentes."
|
||||
addToList: "Ajouter à une liste"
|
||||
sendMessage: "Envoyer un message"
|
||||
copyUsername: "Copier le nom d’utilisateur·rice"
|
||||
|
@ -72,8 +72,8 @@ download: "Télécharger"
|
|||
driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{name}\"\
|
||||
\ ? Il sera retiré de toutes ses notes liées."
|
||||
unfollowConfirm: "Désirez-vous vous désabonner de {name} ?"
|
||||
exportRequested: "Vous avez demandé une exportation. L’opération pourrait prendre\
|
||||
\ un peu de temps. Une terminée, le fichier résultant sera ajouté au Drive."
|
||||
exportRequested: "Vous avez demandé une exportation. L’opération pourrait prendre
|
||||
un peu de temps. Une terminée, le fichier résultant sera ajouté au Drive."
|
||||
importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps."
|
||||
lists: "Listes"
|
||||
noLists: "Vous n’avez aucune liste"
|
||||
|
@ -88,12 +88,12 @@ error: "Erreur"
|
|||
somethingHappened: "Une erreur est survenue"
|
||||
retry: "Réessayer"
|
||||
pageLoadError: "Le chargement de la page a échoué."
|
||||
pageLoadErrorDescription: "Cela est généralement causé par le cache du navigateur\
|
||||
\ ou par un problème réseau. Veuillez vider votre cache ou attendre un peu et réessayer."
|
||||
serverIsDead: "Le serveur ne répond pas. Patientez quelques instants puis essayez\
|
||||
\ à nouveau."
|
||||
youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la pour\
|
||||
\ mettre votre client à jour."
|
||||
pageLoadErrorDescription: "Cela est généralement causé par le cache du navigateur
|
||||
ou par un problème réseau. Veuillez vider votre cache ou attendre un peu et réessayer."
|
||||
serverIsDead: "Le serveur ne répond pas. Patientez quelques instants puis essayez
|
||||
à nouveau."
|
||||
youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la pour
|
||||
mettre votre client à jour."
|
||||
enterListName: "Nom de la liste"
|
||||
privacy: "Confidentialité"
|
||||
makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement"
|
||||
|
@ -118,11 +118,11 @@ sensitive: "Contenu sensible"
|
|||
add: "Ajouter"
|
||||
reaction: "Réactions"
|
||||
reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
|
||||
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser\
|
||||
\ « + » pour ajouter."
|
||||
rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilité des notes\
|
||||
\ \" vous permet de réutiliser automatiquement la visibilité utilisée lors de la\
|
||||
\ publication de votre note précédente."
|
||||
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser
|
||||
« + » pour ajouter."
|
||||
rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilité des notes
|
||||
\" vous permet de réutiliser automatiquement la visibilité utilisée lors de la publication
|
||||
de votre note précédente."
|
||||
attachCancel: "Supprimer le fichier attaché"
|
||||
markAsSensitive: "Marquer comme sensible"
|
||||
unmarkAsSensitive: "Supprimer le marquage comme sensible"
|
||||
|
@ -150,20 +150,20 @@ emojiUrl: "URL de l’émoji"
|
|||
addEmoji: "Ajouter un émoji"
|
||||
settingGuide: "Configuration proposée"
|
||||
cacheRemoteFiles: "Mise en cache des fichiers distants"
|
||||
cacheRemoteFilesDescription: "Lorsque cette option est désactivée, les fichiers distants\
|
||||
\ sont chargés directement depuis l’instance distante. La désactiver diminuera certes\
|
||||
\ l’utilisation de l’espace de stockage local mais augmentera le trafic réseau puisque\
|
||||
\ les miniatures ne seront plus générées."
|
||||
cacheRemoteFilesDescription: "Lorsque cette option est désactivée, les fichiers distants
|
||||
sont chargés directement depuis l’instance distante. La désactiver diminuera certes
|
||||
l’utilisation de l’espace de stockage local mais augmentera le trafic réseau puisque
|
||||
les miniatures ne seront plus générées."
|
||||
flagAsBot: "Ce compte est un robot"
|
||||
flagAsBotDescription: "Si ce compte est géré de manière automatisée, choisissez cette\
|
||||
\ option. Si elle est activée, elle agira comme un marqueur pour les autres développeurs\
|
||||
\ afin d'éviter des chaînes d'interaction sans fin avec d'autres robots et d'ajuster\
|
||||
\ les systèmes internes de Calckey pour traiter ce compte comme un robot."
|
||||
flagAsBotDescription: "Si ce compte est géré de manière automatisée, choisissez cette
|
||||
option. Si elle est activée, elle agira comme un marqueur pour les autres développeurs
|
||||
afin d'éviter des chaînes d'interaction sans fin avec d'autres robots et d'ajuster
|
||||
les systèmes internes de Calckey pour traiter ce compte comme un robot."
|
||||
flagAsCat: "Ce compte est un chat"
|
||||
flagAsCatDescription: "Activer l'option \" Je suis un chat \" pour ce compte."
|
||||
flagShowTimelineReplies: "Afficher les réponses dans le fil"
|
||||
autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s\
|
||||
\ que vous suivez"
|
||||
autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s
|
||||
que vous suivez"
|
||||
addAccount: "Ajouter un compte"
|
||||
loginFailed: "Échec de la connexion"
|
||||
showOnRemote: "Voir sur l’instance distante"
|
||||
|
@ -175,12 +175,12 @@ searchWith: "Recherche : {q}"
|
|||
youHaveNoLists: "Vous n’avez aucune liste"
|
||||
followConfirm: "Êtes-vous sûr·e de vouloir suivre {name} ?"
|
||||
proxyAccount: "Compte proxy"
|
||||
proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions,\
|
||||
\ comme un·e abonné·e distant·e pour les utilisateurs d'autres instances. Par exemple,\
|
||||
\ quand un·e utilisateur·rice ajoute un·e utilisateur·rice distant·e à une liste,\
|
||||
\ ses notes ne seront pas visibles sur l'instance si personne ne suit cet·te utilisateur·rice.\
|
||||
\ Le compte proxy va donc suivre cet·te utilisateur·rice pour que ses notes soient\
|
||||
\ acheminées."
|
||||
proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions,
|
||||
comme un·e abonné·e distant·e pour les utilisateurs d'autres instances. Par exemple,
|
||||
quand un·e utilisateur·rice ajoute un·e utilisateur·rice distant·e à une liste,
|
||||
ses notes ne seront pas visibles sur l'instance si personne ne suit cet·te utilisateur·rice.
|
||||
Le compte proxy va donc suivre cet·te utilisateur·rice pour que ses notes soient
|
||||
acheminées."
|
||||
host: "Serveur distant"
|
||||
selectUser: "Sélectionner un·e utilisateur·rice"
|
||||
recipient: "Destinataire"
|
||||
|
@ -210,14 +210,14 @@ instanceInfo: "Informations sur l’instance"
|
|||
statistics: "Statistiques"
|
||||
clearQueue: "Vider la file d’attente"
|
||||
clearQueueConfirmTitle: "Êtes-vous sûr·e de vouloir vider la file d’attente ?"
|
||||
clearQueueConfirmText: "Les notes non distribuées ne seront pas délivrées. Normalement,\
|
||||
\ vous n'avez pas besoin d'effectuer cette opération."
|
||||
clearQueueConfirmText: "Les notes non distribuées ne seront pas délivrées. Normalement,
|
||||
vous n'avez pas besoin d'effectuer cette opération."
|
||||
clearCachedFiles: "Vider le cache"
|
||||
clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de fichiers\
|
||||
\ distants ?"
|
||||
clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de fichiers
|
||||
distants ?"
|
||||
blockedInstances: "Instances bloquées"
|
||||
blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par\
|
||||
\ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance."
|
||||
blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par
|
||||
ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance."
|
||||
muteAndBlock: "Masqué·e·s / Bloqué·e·s"
|
||||
mutedUsers: "Utilisateur·rice·s en sourdine"
|
||||
blockedUsers: "Utilisateur·rice·s bloqué·e·s"
|
||||
|
@ -270,8 +270,8 @@ fromUrl: "Depuis une URL"
|
|||
uploadFromUrl: "Téléverser via une URL"
|
||||
uploadFromUrlDescription: "URL du fichier que vous souhaitez téléverser"
|
||||
uploadFromUrlRequested: "Téléversement demandé"
|
||||
uploadFromUrlMayTakeTime: "Le téléversement de votre fichier peut prendre un certain\
|
||||
\ temps."
|
||||
uploadFromUrlMayTakeTime: "Le téléversement de votre fichier peut prendre un certain
|
||||
temps."
|
||||
explore: "Découvrir"
|
||||
messageRead: "Lu"
|
||||
noMoreHistory: "Il n’y a plus d’historique"
|
||||
|
@ -281,8 +281,8 @@ agreeTo: "J’accepte {0}"
|
|||
tos: "les conditions d’utilisation"
|
||||
start: "Commencer"
|
||||
home: "Principal"
|
||||
remoteUserCaution: "Les informations de ce compte risqueraient d’être incomplètes\
|
||||
\ du fait que l’utilisateur·rice provient d’une instance distante."
|
||||
remoteUserCaution: "Les informations de ce compte risqueraient d’être incomplètes
|
||||
du fait que l’utilisateur·rice provient d’une instance distante."
|
||||
activity: "Activité"
|
||||
images: "Images"
|
||||
birthday: "Date de naissance"
|
||||
|
@ -315,8 +315,8 @@ unableToDelete: "Suppression impossible"
|
|||
inputNewFileName: "Entrez un nouveau nom de fichier"
|
||||
inputNewDescription: "Veuillez entrer une nouvelle description"
|
||||
inputNewFolderName: "Entrez un nouveau nom de dossier"
|
||||
circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier\
|
||||
\ que vous souhaitez déplacer."
|
||||
circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier
|
||||
que vous souhaitez déplacer."
|
||||
hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide."
|
||||
copyUrl: "Copier l’URL"
|
||||
rename: "Renommer"
|
||||
|
@ -350,8 +350,8 @@ connectService: "Connexion"
|
|||
disconnectService: "Déconnexion"
|
||||
enableLocalTimeline: "Activer le fil local"
|
||||
enableGlobalTimeline: "Activer le fil global"
|
||||
disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s\
|
||||
\ et les modérateur·rice·s pourront toujours y accéder."
|
||||
disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s
|
||||
et les modérateur·rice·s pourront toujours y accéder."
|
||||
registration: "S’inscrire"
|
||||
enableRegistration: "Autoriser les nouvelles inscriptions"
|
||||
invite: "Inviter"
|
||||
|
@ -363,11 +363,11 @@ bannerUrl: "URL de l’image de la bannière"
|
|||
backgroundImageUrl: "URL de l'image d'arrière-plan"
|
||||
basicInfo: "Informations basiques"
|
||||
pinnedUsers: "Utilisateur·rice épinglé·e"
|
||||
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s\
|
||||
\ sur la page \"Découvrir\", un·e par ligne."
|
||||
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s
|
||||
sur la page \"Découvrir\", un·e par ligne."
|
||||
pinnedPages: "Pages épinglées"
|
||||
pinnedPagesDescription: "Inscrivez le chemin des pages que vous souhaitez épingler\
|
||||
\ en haut de la page de l'instance. Séparez les pages d'un retour à la ligne."
|
||||
pinnedPagesDescription: "Inscrivez le chemin des pages que vous souhaitez épingler
|
||||
en haut de la page de l'instance. Séparez les pages d'un retour à la ligne."
|
||||
pinnedClipId: "Identifiant du clip épinglé"
|
||||
pinnedNotes: "Note épinglée"
|
||||
hcaptcha: "hCaptcha"
|
||||
|
@ -378,17 +378,17 @@ recaptcha: "reCAPTCHA"
|
|||
enableRecaptcha: "Activer reCAPTCHA"
|
||||
recaptchaSiteKey: "Clé du site"
|
||||
recaptchaSecretKey: "Clé secrète"
|
||||
avoidMultiCaptchaConfirm: "L’utilisation de plusieurs Captchas peut provoquer des\
|
||||
\ interférences. Souhaitez-vous désactiver l’autre Captcha ? Vous pouvez laisser\
|
||||
\ plusieurs Captcha activés en appuyant sur Annuler."
|
||||
avoidMultiCaptchaConfirm: "L’utilisation de plusieurs Captchas peut provoquer des
|
||||
interférences. Souhaitez-vous désactiver l’autre Captcha ? Vous pouvez laisser plusieurs
|
||||
Captcha activés en appuyant sur Annuler."
|
||||
antennas: "Antennes"
|
||||
manageAntennas: "Gestion des antennes"
|
||||
name: "Nom"
|
||||
antennaSource: "Source de l’antenne"
|
||||
antennaKeywords: "Mots clés à recevoir"
|
||||
antennaExcludeKeywords: "Mots clés à exclure"
|
||||
antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer\
|
||||
\ avec un saut de ligne pour une condition OR."
|
||||
antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer
|
||||
avec un saut de ligne pour une condition OR."
|
||||
notifyAntenna: "Je souhaite recevoir les notifications des nouvelles notes"
|
||||
withFileAntenna: "Notes ayant des attachements uniquement"
|
||||
enableServiceworker: "Activer ServiceWorker"
|
||||
|
@ -399,11 +399,11 @@ connectedTo: "Vous êtes connectés aux services suivants"
|
|||
notesAndReplies: "Notes et Réponses"
|
||||
withFiles: "Avec fichiers joints"
|
||||
silence: "Mettre en sourdine"
|
||||
silenceConfirm: "Êtes-vous sûr·e de vouloir mettre l’utilisateur·rice en sourdine\
|
||||
\ ?"
|
||||
silenceConfirm: "Êtes-vous sûr·e de vouloir mettre l’utilisateur·rice en sourdine
|
||||
?"
|
||||
unsilence: "Annuler la sourdine"
|
||||
unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cet·te\
|
||||
\ utilisateur·rice ?"
|
||||
unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cet·te
|
||||
utilisateur·rice ?"
|
||||
popularUsers: "Utilisateur·rice·s populaires"
|
||||
recentlyUpdatedUsers: "Utilisateur·rice·s actif·ve·s récemment"
|
||||
recentlyRegisteredUsers: "Utilisateur·rice·s récemment inscrit·e·s"
|
||||
|
@ -468,8 +468,8 @@ invitationCode: "Code d’invitation"
|
|||
checking: "Vérification en cours..."
|
||||
available: "Disponible"
|
||||
unavailable: "Non disponible"
|
||||
usernameInvalidFormat: "Le nom d'utilisateur peut contenir uniquement des lettres\
|
||||
\ (minuscules et/ou majuscules), des chiffres et des _"
|
||||
usernameInvalidFormat: "Le nom d'utilisateur peut contenir uniquement des lettres
|
||||
(minuscules et/ou majuscules), des chiffres et des _"
|
||||
tooShort: "Trop court"
|
||||
tooLong: "Trop long"
|
||||
weakPassword: "Mot de passe faible"
|
||||
|
@ -478,8 +478,8 @@ strongPassword: "Mot de passe fort"
|
|||
passwordMatched: "Les mots de passe correspondent"
|
||||
passwordNotMatched: "Les mots de passe ne correspondent pas"
|
||||
signinWith: "Se connecter avec {x}"
|
||||
signinFailed: "Échec d’authentification. Veuillez vérifier que votre nom d’utilisateur\
|
||||
\ et mot de passe sont corrects."
|
||||
signinFailed: "Échec d’authentification. Veuillez vérifier que votre nom d’utilisateur
|
||||
et mot de passe sont corrects."
|
||||
tapSecurityKey: "Appuyez sur votre clé de sécurité"
|
||||
or: "OU"
|
||||
language: "Langue"
|
||||
|
@ -488,8 +488,8 @@ groupInvited: "Invité au groupe"
|
|||
aboutX: "À propos de {x}"
|
||||
useOsNativeEmojis: "Utiliser les émojis natifs du système"
|
||||
youHaveNoGroups: "Vous n’avez aucun groupe"
|
||||
joinOrCreateGroup: "Vous pouvez être invité·e à rejoindre des groupes existants ou\
|
||||
\ créer votre propre nouveau groupe."
|
||||
joinOrCreateGroup: "Vous pouvez être invité·e à rejoindre des groupes existants ou
|
||||
créer votre propre nouveau groupe."
|
||||
noHistory: "Pas d'historique"
|
||||
signinHistory: "Historique de connexion"
|
||||
disableAnimatedMfm: "Désactiver MFM ayant des animations"
|
||||
|
@ -520,29 +520,29 @@ showFeaturedNotesInTimeline: "Afficher les notes des Tendances dans le fil d'act
|
|||
objectStorage: "Stockage d'objets"
|
||||
useObjectStorage: "Utiliser le stockage d'objets"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "Préfixe d’URL utilisé pour construire l’URL vers le référencement\
|
||||
\ d’objet (média). Spécifiez son URL si vous utilisez un CDN ou un proxy, sinon\
|
||||
\ spécifiez l’adresse accessible au public selon le guide de service que vous allez\
|
||||
\ utiliser. P.ex. 'https://<bucket>.s3.amazonaws.com' pour AWS S3 et 'https://storage.googleapis.com/<bucket>'\
|
||||
\ pour GCS."
|
||||
objectStorageBaseUrlDesc: "Préfixe d’URL utilisé pour construire l’URL vers le référencement
|
||||
d’objet (média). Spécifiez son URL si vous utilisez un CDN ou un proxy, sinon spécifiez
|
||||
l’adresse accessible au public selon le guide de service que vous allez utiliser.
|
||||
P.ex. 'https://<bucket>.s3.amazonaws.com' pour AWS S3 et 'https://storage.googleapis.com/<bucket>'
|
||||
pour GCS."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Veuillez spécifier le nom du compartiment utilisé sur le\
|
||||
\ service configuré."
|
||||
objectStorageBucketDesc: "Veuillez spécifier le nom du compartiment utilisé sur le
|
||||
service configuré."
|
||||
objectStoragePrefix: "Prefix"
|
||||
objectStoragePrefixDesc: "Les fichiers seront stockés sous le répertoire de ce préfixe."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "Laissez ce champ vide si vous utilisez AWS S3, sinon spécifiez\
|
||||
\ le point de terminaison comme '<host>' ou '<host>: <port>' selon le guide de service\
|
||||
\ que vous allez utiliser."
|
||||
objectStorageEndpointDesc: "Laissez ce champ vide si vous utilisez AWS S3, sinon spécifiez
|
||||
le point de terminaison comme '<host>' ou '<host>: <port>' selon le guide de service
|
||||
que vous allez utiliser."
|
||||
objectStorageRegion: "Région"
|
||||
objectStorageRegionDesc: "Spécifiez une région comme 'xx-east-1'. Si votre service\
|
||||
\ ne fait pas de distinction entre les régions, laissez-le vide ou remplissez 'us-east-1'."
|
||||
objectStorageRegionDesc: "Spécifiez une région comme 'xx-east-1'. Si votre service
|
||||
ne fait pas de distinction entre les régions, laissez-le vide ou remplissez 'us-east-1'."
|
||||
objectStorageUseSSL: "Utiliser SSL"
|
||||
objectStorageUseSSLDesc: "Désactivez cette option si vous n'utilisez pas HTTPS pour\
|
||||
\ la connexion API"
|
||||
objectStorageUseSSLDesc: "Désactivez cette option si vous n'utilisez pas HTTPS pour
|
||||
la connexion API"
|
||||
objectStorageUseProxy: "Se connecter via proxy"
|
||||
objectStorageUseProxyDesc: "Désactivez cette option si vous n'utilisez pas de proxy\
|
||||
\ pour la connexion API"
|
||||
objectStorageUseProxyDesc: "Désactivez cette option si vous n'utilisez pas de proxy
|
||||
pour la connexion API"
|
||||
objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi"
|
||||
serverLogs: "Journal du serveur"
|
||||
deleteAll: "Supprimer tout"
|
||||
|
@ -570,9 +570,9 @@ sort: "Trier"
|
|||
ascendingOrder: "Ascendant"
|
||||
descendingOrder: "Descendant"
|
||||
scratchpad: "ScratchPad"
|
||||
scratchpadDescription: "ScratchPad fournit un environnement expérimental pour AiScript.\
|
||||
\ Vous pouvez vérifier la rédaction de votre code, sa bonne exécution et le résultat\
|
||||
\ de son interaction avec Calckey."
|
||||
scratchpadDescription: "ScratchPad fournit un environnement expérimental pour AiScript.
|
||||
Vous pouvez vérifier la rédaction de votre code, sa bonne exécution et le résultat
|
||||
de son interaction avec Calckey."
|
||||
output: "Sortie"
|
||||
script: "Script"
|
||||
disablePagesScript: "Désactiver AiScript sur les Pages"
|
||||
|
@ -580,15 +580,15 @@ updateRemoteUser: "Mettre à jour les informations de l’utilisateur·rice dist
|
|||
deleteAllFiles: "Supprimer tous les fichiers"
|
||||
deleteAllFilesConfirm: "Êtes-vous sûr·e de vouloir supprimer tous les fichiers ?"
|
||||
removeAllFollowing: "Retenir tous les abonnements"
|
||||
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez\
|
||||
\ lancer cette action uniquement si l’instance n’existe plus."
|
||||
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez
|
||||
lancer cette action uniquement si l’instance n’existe plus."
|
||||
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
|
||||
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
||||
yourAccountSuspendedTitle: "Ce compte est suspendu"
|
||||
yourAccountSuspendedDescription: "Ce compte est suspendu car vous avez enfreint les\
|
||||
\ conditions d'utilisation de l'instance, ou pour un motif similaire. Si vous souhaitez\
|
||||
\ connaître en détail les raisons de cette suspension, renseignez-vous auprès de\
|
||||
\ l'administrateur·rice de votre instance. Merci de ne pas créer de nouveau compte."
|
||||
yourAccountSuspendedDescription: "Ce compte est suspendu car vous avez enfreint les
|
||||
conditions d'utilisation de l'instance, ou pour un motif similaire. Si vous souhaitez
|
||||
connaître en détail les raisons de cette suspension, renseignez-vous auprès de l'administrateur·rice
|
||||
de votre instance. Merci de ne pas créer de nouveau compte."
|
||||
menu: "Menu"
|
||||
divider: "Séparateur"
|
||||
addItem: "Ajouter un élément"
|
||||
|
@ -611,8 +611,8 @@ description: "Description"
|
|||
describeFile: "Ajouter une description d'image"
|
||||
enterFileDescription: "Saisissez une description"
|
||||
author: "Auteur·rice"
|
||||
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer\
|
||||
\ ?"
|
||||
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer
|
||||
?"
|
||||
manage: "Gestion"
|
||||
plugins: "Extensions"
|
||||
deck: "Deck"
|
||||
|
@ -629,14 +629,14 @@ permission: "Autorisations"
|
|||
enableAll: "Tout activer"
|
||||
disableAll: "Tout désactiver"
|
||||
tokenRequested: "Autoriser l'accès au compte"
|
||||
pluginTokenRequestedDescription: "Ce plugin pourra utiliser les autorisations définies\
|
||||
\ ici."
|
||||
pluginTokenRequestedDescription: "Ce plugin pourra utiliser les autorisations définies
|
||||
ici."
|
||||
notificationType: "Type de notifications"
|
||||
edit: "Editer"
|
||||
emailServer: "Serveur mail"
|
||||
enableEmail: "Activer la distribution de courriel"
|
||||
emailConfigInfo: "Utilisé pour confirmer votre adresse de courriel et la réinitialisation\
|
||||
\ de votre mot de passe en cas d’oubli."
|
||||
emailConfigInfo: "Utilisé pour confirmer votre adresse de courriel et la réinitialisation
|
||||
de votre mot de passe en cas d’oubli."
|
||||
email: "E-mail "
|
||||
emailAddress: "Adresses e-mail"
|
||||
smtpConfig: "Paramètres du serveur SMTP"
|
||||
|
@ -644,8 +644,8 @@ smtpHost: "Serveur distant"
|
|||
smtpPort: "Port"
|
||||
smtpUser: "Nom d’utilisateur·rice"
|
||||
smtpPass: "Mot de passe"
|
||||
emptyToDisableSmtpAuth: "Laisser le nom d’utilisateur et le mot de passe vides pour\
|
||||
\ désactiver la vérification SMTP"
|
||||
emptyToDisableSmtpAuth: "Laisser le nom d’utilisateur et le mot de passe vides pour
|
||||
désactiver la vérification SMTP"
|
||||
smtpSecure: "Utiliser SSL/TLS implicitement dans les connexions SMTP"
|
||||
smtpSecureInfo: "Désactiver cette option lorsque STARTTLS est utilisé"
|
||||
testEmail: "Tester la distribution de courriel"
|
||||
|
@ -666,24 +666,24 @@ create: "Créer"
|
|||
notificationSetting: "Paramètres des notifications "
|
||||
notificationSettingDesc: "Sélectionnez le type de notification à afficher"
|
||||
useGlobalSetting: "Utiliser paramètre général"
|
||||
useGlobalSettingDesc: "S'il est activé, les paramètres de notification de votre compte\
|
||||
\ seront utilisés. S'il est désactivé, des configurations individuelles peuvent\
|
||||
\ être effectuées."
|
||||
useGlobalSettingDesc: "S'il est activé, les paramètres de notification de votre compte
|
||||
seront utilisés. S'il est désactivé, des configurations individuelles peuvent être
|
||||
effectuées."
|
||||
other: "Autre"
|
||||
regenerateLoginToken: "Régénérer le jeton de connexion"
|
||||
regenerateLoginTokenDescription: "Générer un nouveau jeton d'authentification. Cette\
|
||||
\ opération ne devrait pas être nécessaire ; lors de la génération d'un nouveau\
|
||||
\ jeton, tous les appareils seront déconnectés. "
|
||||
setMultipleBySeparatingWithSpace: "Vous pouvez en définir plusieurs, en les séparant\
|
||||
\ par des espaces."
|
||||
regenerateLoginTokenDescription: "Générer un nouveau jeton d'authentification. Cette
|
||||
opération ne devrait pas être nécessaire ; lors de la génération d'un nouveau jeton,
|
||||
tous les appareils seront déconnectés. "
|
||||
setMultipleBySeparatingWithSpace: "Vous pouvez en définir plusieurs, en les séparant
|
||||
par des espaces."
|
||||
fileIdOrUrl: "ID du fichier ou URL"
|
||||
behavior: "Comportement"
|
||||
sample: "Exemple"
|
||||
abuseReports: "Signalements"
|
||||
reportAbuse: "Signaler"
|
||||
reportAbuseOf: "Signaler {name}"
|
||||
fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit\
|
||||
\ d'une note précise, veuillez en donner le lien."
|
||||
fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit
|
||||
d'une note précise, veuillez en donner le lien."
|
||||
abuseReported: "Le rapport est envoyé. Merci."
|
||||
reporter: "Signalé par"
|
||||
reporteeOrigin: "Origine du signalement"
|
||||
|
@ -694,8 +694,8 @@ abuseMarkAsResolved: "Marquer le signalement comme résolu"
|
|||
openInNewTab: "Ouvrir dans un nouvel onglet"
|
||||
openInSideView: "Ouvrir en vue latérale"
|
||||
defaultNavigationBehaviour: "Navigation par défaut"
|
||||
editTheseSettingsMayBreakAccount: "La modification de ces paramètres peut endommager\
|
||||
\ votre compte."
|
||||
editTheseSettingsMayBreakAccount: "La modification de ces paramètres peut endommager
|
||||
votre compte."
|
||||
instanceTicker: "Nom de l'instance d'origine des notes"
|
||||
waitingFor: "En attente de {x}"
|
||||
random: "Aléatoire"
|
||||
|
@ -707,8 +707,8 @@ createNew: "Créer nouveau"
|
|||
optional: "Facultatif"
|
||||
createNewClip: "Créer un nouveau clip"
|
||||
public: "Public"
|
||||
i18nInfo: "Calckey est traduit dans différentes langues par des bénévoles. Vous pouvez\
|
||||
\ contribuer à {link}."
|
||||
i18nInfo: "Calckey est traduit dans différentes langues par des bénévoles. Vous pouvez
|
||||
contribuer à {link}."
|
||||
manageAccessTokens: "Gérer les jetons d'accès"
|
||||
accountInfo: " Informations du compte "
|
||||
notesCount: "Nombre de notes"
|
||||
|
@ -727,16 +727,16 @@ no: "Non"
|
|||
driveFilesCount: "Nombre de fichiers dans le Drive"
|
||||
driveUsage: "Utilisation du Drive"
|
||||
noCrawle: "Refuser l'indexation par les robots"
|
||||
noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page\
|
||||
\ de profil, vos notes, vos pages, etc."
|
||||
lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre note sur\
|
||||
\ \"Abonné-e-s\", vos notes sont visibles par tous, même si vous exigez que les\
|
||||
\ demandes d'abonnement soient approuvées manuellement."
|
||||
noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page
|
||||
de profil, vos notes, vos pages, etc."
|
||||
lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre note sur
|
||||
\"Abonné-e-s\", vos notes sont visibles par tous, même si vous exigez que les demandes
|
||||
d'abonnement soient approuvées manuellement."
|
||||
alwaysMarkSensitive: "Marquer les médias comme contenu sensible par défaut"
|
||||
loadRawImages: "Affichage complet des images jointes au lieu des vignettes"
|
||||
disableShowingAnimatedImages: "Désactiver l'animation des images"
|
||||
verificationEmailSent: "Un e-mail de vérification a été envoyé. Veuillez accéder au\
|
||||
\ lien pour compléter la vérification."
|
||||
verificationEmailSent: "Un e-mail de vérification a été envoyé. Veuillez accéder au
|
||||
lien pour compléter la vérification."
|
||||
notSet: "Non défini"
|
||||
emailVerified: "Votre adresse e-mail a été vérifiée."
|
||||
noteFavoritesCount: "Nombre de notes dans les favoris"
|
||||
|
@ -748,16 +748,16 @@ clips: "Clips"
|
|||
experimentalFeatures: "Fonctionnalités expérimentales"
|
||||
developer: "Développeur"
|
||||
makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"."
|
||||
makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra\
|
||||
\ pas sur la page \"Découvrir\"."
|
||||
makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra
|
||||
pas sur la page \"Découvrir\"."
|
||||
showGapBetweenNotesInTimeline: "Afficher un écart entre les notes sur la Timeline"
|
||||
duplicate: "Duliquer"
|
||||
left: "Gauche"
|
||||
center: "Centrer"
|
||||
wide: "Large"
|
||||
narrow: "Condensé"
|
||||
reloadToApplySetting: "Vos paramètres seront appliqués lorsque vous rechargerez la\
|
||||
\ page. Souhaitez-vous recharger ?"
|
||||
reloadToApplySetting: "Vos paramètres seront appliqués lorsque vous rechargerez la
|
||||
page. Souhaitez-vous recharger ?"
|
||||
needReloadToApply: "Ce paramètre s'appliquera après un rechargement."
|
||||
showTitlebar: "Afficher la barre de titre"
|
||||
clearCache: "Vider le cache"
|
||||
|
@ -765,11 +765,11 @@ onlineUsersCount: "{n} utilisateur(s) en ligne"
|
|||
nUsers: "{n} utilisateur·rice·s"
|
||||
nNotes: "{n} Notes"
|
||||
sendErrorReports: "Envoyer les rapports d’erreur"
|
||||
sendErrorReportsDescription: "Si vous activez l'envoi des rapports d'erreur, vous\
|
||||
\ contribuerez à améliorer la qualité de Calckey grâce au partage d'informations\
|
||||
\ détaillées sur les erreurs lorsqu'un problème survient.\nCela inclut des informations\
|
||||
\ telles que la version de votre système d'exploitation, le type de navigateur que\
|
||||
\ vous utilisez, votre historique d'activité, etc."
|
||||
sendErrorReportsDescription: "Si vous activez l'envoi des rapports d'erreur, vous
|
||||
contribuerez à améliorer la qualité de Calckey grâce au partage d'informations détaillées
|
||||
sur les erreurs lorsqu'un problème survient.\nCela inclut des informations telles
|
||||
que la version de votre système d'exploitation, le type de navigateur que vous utilisez,
|
||||
votre historique d'activité, etc."
|
||||
myTheme: "Mes thèmes"
|
||||
backgroundColor: "Arrière-plan"
|
||||
accentColor: "Accentuation"
|
||||
|
@ -808,17 +808,17 @@ unlikeConfirm: "Êtes-vous sûr·e de ne plus vouloir aimer cette publication ?"
|
|||
fullView: "Plein écran"
|
||||
quitFullView: "Quitter le plein écran"
|
||||
addDescription: "Ajouter une description"
|
||||
userPagePinTip: "Vous pouvez afficher des notes ici en sélectionnant l'option « Épingler\
|
||||
\ au profil » dans le menu de chaque note."
|
||||
notSpecifiedMentionWarning: "Vous avez mentionné des utilisateur·rice·s qui ne font\
|
||||
\ pas partie de la liste des destinataires"
|
||||
userPagePinTip: "Vous pouvez afficher des notes ici en sélectionnant l'option « Épingler
|
||||
au profil » dans le menu de chaque note."
|
||||
notSpecifiedMentionWarning: "Vous avez mentionné des utilisateur·rice·s qui ne font
|
||||
pas partie de la liste des destinataires"
|
||||
info: "Informations"
|
||||
userInfo: "Informations sur l'utilisateur"
|
||||
unknown: "Inconnu"
|
||||
onlineStatus: "Statut"
|
||||
hideOnlineStatus: "Se rendre invisible"
|
||||
hideOnlineStatusDescription: "Rendre votre statut invisible peut diminuer les performances\
|
||||
\ de certaines fonctionnalités, telles que la Recherche."
|
||||
hideOnlineStatusDescription: "Rendre votre statut invisible peut diminuer les performances
|
||||
de certaines fonctionnalités, telles que la Recherche."
|
||||
online: "En ligne"
|
||||
active: "Actif·ve"
|
||||
offline: "Hors ligne"
|
||||
|
@ -853,9 +853,9 @@ emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
|
|||
ratio: "Ratio"
|
||||
previewNoteText: "Voir l'aperçu"
|
||||
customCss: "CSS personnalisé"
|
||||
customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement\
|
||||
\ ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter\
|
||||
\ normalement."
|
||||
customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement
|
||||
ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter
|
||||
normalement."
|
||||
global: "Global"
|
||||
squareAvatars: "Avatars carrés"
|
||||
sent: "Envoyer"
|
||||
|
@ -870,10 +870,10 @@ whatIsNew: "Voir les derniers changements"
|
|||
translate: "Traduire"
|
||||
translatedFrom: "Traduit depuis {x}"
|
||||
accountDeletionInProgress: "La suppression de votre compte est en cours"
|
||||
usernameInfo: "C'est un nom qui identifie votre compte sur l'instance de manière unique.\
|
||||
\ Vous pouvez utiliser des lettres de l'alphabet (minuscules et majuscules), des\
|
||||
\ chiffres (de 0 à 9), ou bien le tiret « _ ». Vous ne pourrez pas modifier votre\
|
||||
\ nom d'utilisateur·rice par la suite."
|
||||
usernameInfo: "C'est un nom qui identifie votre compte sur l'instance de manière unique.
|
||||
Vous pouvez utiliser des lettres de l'alphabet (minuscules et majuscules), des chiffres
|
||||
(de 0 à 9), ou bien le tiret « _ ». Vous ne pourrez pas modifier votre nom d'utilisateur·rice
|
||||
par la suite."
|
||||
aiChanMode: "Mode Ai"
|
||||
keepCw: "Garder le CW"
|
||||
pubSub: "Comptes Pub/Sub"
|
||||
|
@ -889,14 +889,14 @@ filter: "Filtre"
|
|||
controlPanel: "Panneau de contrôle"
|
||||
manageAccounts: "Gérer les comptes"
|
||||
makeReactionsPublic: "Rendre les réactions publiques"
|
||||
makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions données\
|
||||
\ publique."
|
||||
makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions données
|
||||
publique."
|
||||
classic: "Classique"
|
||||
muteThread: "Masquer cette discussion"
|
||||
unmuteThread: "Ne plus masquer le fil"
|
||||
ffVisibility: "Visibilité des abonnés/abonnements"
|
||||
ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu\
|
||||
\ suis et les personnes qui te suivent."
|
||||
ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu
|
||||
suis et les personnes qui te suivent."
|
||||
continueThread: "Afficher la suite du fil"
|
||||
deleteAccountConfirm: "Votre compte sera supprimé. Êtes vous certain ?"
|
||||
incorrectPassword: "Le mot de passe est incorrect."
|
||||
|
@ -904,11 +904,11 @@ voteConfirm: "Confirmez-vous votre vote pour « {choice} » ?"
|
|||
hide: "Masquer"
|
||||
leaveGroup: "Quitter le groupe"
|
||||
leaveGroupConfirm: "Êtes vous sûr de vouloir quitter \"{name}\" ?"
|
||||
useDrawerReactionPickerForMobile: "Afficher le sélecteur de réactions en tant que\
|
||||
\ panneau sur mobile"
|
||||
useDrawerReactionPickerForMobile: "Afficher le sélecteur de réactions en tant que
|
||||
panneau sur mobile"
|
||||
welcomeBackWithName: "Heureux de vous revoir, {name}"
|
||||
clickToFinishEmailVerification: "Veuillez cliquer sur [{ok}] afin de compléter la\
|
||||
\ vérification par courriel."
|
||||
clickToFinishEmailVerification: "Veuillez cliquer sur [{ok}] afin de compléter la
|
||||
vérification par courriel."
|
||||
overridedDeviceKind: "Type d’appareil"
|
||||
smartphone: "Smartphone"
|
||||
tablet: "Tablette"
|
||||
|
@ -948,16 +948,16 @@ _ffVisibility:
|
|||
_signup:
|
||||
almostThere: "Bientôt fini"
|
||||
emailAddressInfo: "Insérez votre adresse e-mail."
|
||||
emailSent: "Un courriel de confirmation vient d'être envoyé à l'adresse que vous\
|
||||
\ avez renseignée ({email}). Cliquez sur le lien contenu dans le message pour\
|
||||
\ terminer la création de votre compte."
|
||||
emailSent: "Un courriel de confirmation vient d'être envoyé à l'adresse que vous
|
||||
avez renseignée ({email}). Cliquez sur le lien contenu dans le message pour terminer
|
||||
la création de votre compte."
|
||||
_accountDelete:
|
||||
accountDelete: "Supprimer le compte"
|
||||
mayTakeTime: "La suppression de compte nécessitant beaucoup de ressources, l'exécution\
|
||||
\ du processus peut prendre du temps, en fonction de la quantité de contenus que\
|
||||
\ vous avez créés et du nombre de fichiers que vous avez téléversés."
|
||||
sendEmail: "Une fois la suppression de votre compte effectuée, un courriel sera\
|
||||
\ envoyé à l'adresse que vous aviez enregistrée."
|
||||
mayTakeTime: "La suppression de compte nécessitant beaucoup de ressources, l'exécution
|
||||
du processus peut prendre du temps, en fonction de la quantité de contenus que
|
||||
vous avez créés et du nombre de fichiers que vous avez téléversés."
|
||||
sendEmail: "Une fois la suppression de votre compte effectuée, un courriel sera
|
||||
envoyé à l'adresse que vous aviez enregistrée."
|
||||
requestAccountDelete: "Demander la suppression de votre compte"
|
||||
started: "La procédure de suppression a commencé."
|
||||
inProgress: "Suppression en cours"
|
||||
|
@ -965,14 +965,14 @@ _ad:
|
|||
back: "Retour"
|
||||
reduceFrequencyOfThisAd: "Voir cette publicité moins souvent"
|
||||
_forgotPassword:
|
||||
enterEmail: "Entrez ici l'adresse e-mail que vous avez enregistrée pour votre compte.\
|
||||
\ Un lien vous permettant de réinitialiser votre mot de passe sera envoyé à cette\
|
||||
\ adresse."
|
||||
ifNoEmail: "Si vous n'avez pas enregistré d'adresse e-mail, merci de contacter l'administrateur·rice\
|
||||
\ de votre instance."
|
||||
contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,\
|
||||
\ prenez contact avec l'administrateur·rice pour procéder à la réinitialisation\
|
||||
\ de votre mot de passe."
|
||||
enterEmail: "Entrez ici l'adresse e-mail que vous avez enregistrée pour votre compte.
|
||||
Un lien vous permettant de réinitialiser votre mot de passe sera envoyé à cette
|
||||
adresse."
|
||||
ifNoEmail: "Si vous n'avez pas enregistré d'adresse e-mail, merci de contacter l'administrateur·rice
|
||||
de votre instance."
|
||||
contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,
|
||||
prenez contact avec l'administrateur·rice pour procéder à la réinitialisation
|
||||
de votre mot de passe."
|
||||
_gallery:
|
||||
my: "Mes publications"
|
||||
liked: " Publications que j'ai aimées"
|
||||
|
@ -1000,8 +1000,8 @@ _aboutMisskey:
|
|||
source: "Code source"
|
||||
translation: "Traduire Calckey"
|
||||
donate: "Soutenir Calckey"
|
||||
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes\
|
||||
\ non mentionnées ici. Merci à toutes et à tous ! \U0001F970"
|
||||
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes
|
||||
non mentionnées ici. Merci à toutes et à tous ! 🥰"
|
||||
patrons: "Contributeurs"
|
||||
_nsfw:
|
||||
respect: "Cacher les médias marqués comme contenu sensible"
|
||||
|
@ -1009,22 +1009,22 @@ _nsfw:
|
|||
force: "Cacher tous les médias"
|
||||
_mfm:
|
||||
cheatSheet: "Antisèche MFM"
|
||||
intro: "MFM est un langage Markdown spécifique utilisable ici et là dans Calckey.\
|
||||
\ Vous pouvez vérifier ici les structures utilisables avec MFM."
|
||||
intro: "MFM est un langage Markdown spécifique utilisable ici et là dans Calckey.
|
||||
Vous pouvez vérifier ici les structures utilisables avec MFM."
|
||||
dummy: "La Fédiverse s'agrandit avec Calckey"
|
||||
mention: "Mentionner"
|
||||
mentionDescription: "Vous pouvez afficher un utilisateur spécifique en indiquant\
|
||||
\ une arobase suivie d'un nom d'utilisateur"
|
||||
mentionDescription: "Vous pouvez afficher un utilisateur spécifique en indiquant
|
||||
une arobase suivie d'un nom d'utilisateur"
|
||||
hashtag: "Hashtags"
|
||||
hashtagDescription: "Vous pouvez afficher un mot-dièse en utilisant un croisillon\
|
||||
\ et du texte"
|
||||
hashtagDescription: "Vous pouvez afficher un mot-dièse en utilisant un croisillon
|
||||
et du texte"
|
||||
url: "URL"
|
||||
urlDescription: "L'adresse web peut être affichée."
|
||||
link: "Lien"
|
||||
linkDescription: "Une partie précise d'une phrase peut être liée à l'adresse web."
|
||||
bold: "Gras"
|
||||
boldDescription: "Il est possible de mettre le texte en exergue en le mettant en\
|
||||
\ gras."
|
||||
boldDescription: "Il est possible de mettre le texte en exergue en le mettant en
|
||||
gras."
|
||||
small: "Diminuer l'emphase"
|
||||
smallDescription: "Le contenu peut être affiché en petit et fin."
|
||||
center: "Centrer"
|
||||
|
@ -1036,8 +1036,8 @@ _mfm:
|
|||
inlineMath: "Formule mathématique (inline)"
|
||||
inlineMathDescription: "Afficher les formules mathématiques (KaTeX)."
|
||||
blockMath: "Formule mathématique (bloc)"
|
||||
blockMathDescription: "Afficher les formules mathématiques (KaTeX) multi-lignes\
|
||||
\ dans un bloc."
|
||||
blockMathDescription: "Afficher les formules mathématiques (KaTeX) multi-lignes
|
||||
dans un bloc."
|
||||
quote: "Citer"
|
||||
quoteDescription: "Affiche le contenu sous forme de citation."
|
||||
emoji: "Émojis personnalisés"
|
||||
|
@ -1067,8 +1067,8 @@ _mfm:
|
|||
x4: "Plus grand"
|
||||
x4Description: "Afficher le contenu en plus grand."
|
||||
blur: "Flou"
|
||||
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant\
|
||||
\ avec le curseur."
|
||||
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant
|
||||
avec le curseur."
|
||||
font: "Police de caractères"
|
||||
fontDescription: "Il est possible de choisir la police."
|
||||
rainbow: "Arc-en-ciel"
|
||||
|
@ -1109,14 +1109,14 @@ _menuDisplay:
|
|||
hide: "Masquer"
|
||||
_wordMute:
|
||||
muteWords: "Mots à filtrer"
|
||||
muteWordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec\
|
||||
\ un saut de ligne pour une condition OR."
|
||||
muteWordsDescription2: "Pour utiliser des expressions régulières (regex), mettez\
|
||||
\ les mots-clés entre barres obliques."
|
||||
muteWordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec
|
||||
un saut de ligne pour une condition OR."
|
||||
muteWordsDescription2: "Pour utiliser des expressions régulières (regex), mettez
|
||||
les mots-clés entre barres obliques."
|
||||
softDescription: "Masquez les notes de votre fil selon les paramètres que vous définissez."
|
||||
hardDescription: "Empêchez votre fil de charger les notes selon les paramètres que\
|
||||
\ vous définissez. Cette action est irréversible : si vous modifiez ces paramètres\
|
||||
\ plus tard, les notes précédemment filtrées ne seront pas récupérées."
|
||||
hardDescription: "Empêchez votre fil de charger les notes selon les paramètres que
|
||||
vous définissez. Cette action est irréversible : si vous modifiez ces paramètres
|
||||
plus tard, les notes précédemment filtrées ne seront pas récupérées."
|
||||
soft: "Doux"
|
||||
hard: "Strict"
|
||||
mutedNotes: "Notes filtrées"
|
||||
|
@ -1155,10 +1155,10 @@ _theme:
|
|||
darken: "Sombre"
|
||||
lighten: "Clair"
|
||||
inputConstantName: "Insérez un nom de constante"
|
||||
importInfo: "Vous pouvez importer un thème vers l’éditeur de thèmes en saisissant\
|
||||
\ son code ici."
|
||||
deleteConstantConfirm: "Êtes-vous sûr·e de vouloir supprimer la constante {const}\
|
||||
\ ?"
|
||||
importInfo: "Vous pouvez importer un thème vers l’éditeur de thèmes en saisissant
|
||||
son code ici."
|
||||
deleteConstantConfirm: "Êtes-vous sûr·e de vouloir supprimer la constante {const}
|
||||
?"
|
||||
keys:
|
||||
accent: "Accentuation"
|
||||
bg: "Arrière-plan"
|
||||
|
@ -1231,51 +1231,51 @@ _tutorial:
|
|||
step1_1: "Bienvenue!"
|
||||
step1_2: "On va vous installer. Vous serez opérationnel en un rien de temps"
|
||||
step2_1: "Tout d'abord, remplissez votre profil"
|
||||
step2_2: "En fournissant quelques informations sur qui vous êtes, il sera plus facile\
|
||||
\ pour les autres de savoir s'ils veulent voir vos notes ou vous suivre."
|
||||
step2_2: "En fournissant quelques informations sur qui vous êtes, il sera plus facile
|
||||
pour les autres de savoir s'ils veulent voir vos notes ou vous suivre."
|
||||
step3_1: "Maintenant il est temps de suivre des gens !"
|
||||
step3_2: "Votre page d'accueil et vos timelines sociales sont basées sur les personnes\
|
||||
\ que vous suivez, alors essayez de suivre quelques comptes pour commencer.\n\
|
||||
Cliquez sur le cercle plus en haut à droite d'un profil pour le suivre."
|
||||
step3_2: "Votre page d'accueil et vos timelines sociales sont basées sur les personnes
|
||||
que vous suivez, alors essayez de suivre quelques comptes pour commencer.\nCliquez
|
||||
sur le cercle plus en haut à droite d'un profil pour le suivre."
|
||||
step4_1: "On y va."
|
||||
step4_2: "Pour votre premier post, certaines personnes aiment faire un post {introduction}\
|
||||
\ ou un simple post 'Hello world'."
|
||||
step4_2: "Pour votre premier post, certaines personnes aiment faire un post {introduction}
|
||||
ou un simple post 'Hello world'."
|
||||
step5_1: "Lignes de temps, lignes de temps partout !"
|
||||
step5_2: "Votre instance a {timelines} différentes chronologies activées !"
|
||||
step5_3: "La timeline Home {icon} est l'endroit où vous pouvez voir les publications\
|
||||
\ de vos followers."
|
||||
step5_4: "La timeline locale {icon} est l'endroit où vous pouvez voir les messages\
|
||||
\ de tout le monde sur cette instance."
|
||||
step5_5: "La chronologie {icon} sociale est l'endroit où vous pouvez voir uniquement\
|
||||
\ les publications des comptes que vous suivez."
|
||||
step5_6: "La chronologie {icon} recommandée est l'endroit où vous pouvez voir les\
|
||||
\ publications des instances recommandées par les administrateurs."
|
||||
step5_7: "La timeline globale {icon} est l'endroit où vous pouvez voir les messages\
|
||||
\ de toutes les autres instances connectées."
|
||||
step5_3: "La timeline Home {icon} est l'endroit où vous pouvez voir les publications
|
||||
de vos followers."
|
||||
step5_4: "La timeline locale {icon} est l'endroit où vous pouvez voir les messages
|
||||
de tout le monde sur cette instance."
|
||||
step5_5: "La chronologie {icon} sociale est l'endroit où vous pouvez voir uniquement
|
||||
les publications des comptes que vous suivez."
|
||||
step5_6: "La chronologie {icon} recommandée est l'endroit où vous pouvez voir les
|
||||
publications des instances recommandées par les administrateurs."
|
||||
step5_7: "La timeline globale {icon} est l'endroit où vous pouvez voir les messages
|
||||
de toutes les autres instances connectées."
|
||||
step6_1: "Alors quel est cet endroit ?"
|
||||
step6_2: "Eh bien, vous ne venez pas de rejoindre Calckey. Vous avez rejoint un\
|
||||
\ portail vers le Fediverse, un réseau interconnecté de milliers de serveurs,\
|
||||
\ appelés \"instances\"."
|
||||
step6_3: "Chaque serveur fonctionne différemment, et tous les serveurs n'utilisent\
|
||||
\ pas Calckey. Cependant, celui-ci le fait ! C'est un peu délicat, mais vous aurez\
|
||||
\ le coup de main en un rien de temps."
|
||||
step6_2: "Eh bien, vous ne venez pas de rejoindre Calckey. Vous avez rejoint un
|
||||
portail vers le Fediverse, un réseau interconnecté de milliers de serveurs, appelés
|
||||
\"instances\"."
|
||||
step6_3: "Chaque serveur fonctionne différemment, et tous les serveurs n'utilisent
|
||||
pas Calckey. Cependant, celui-ci le fait ! C'est un peu délicat, mais vous aurez
|
||||
le coup de main en un rien de temps."
|
||||
step6_4: "Maintenant, allez-y, explorez et amusez-vous !"
|
||||
_2fa:
|
||||
alreadyRegistered: "Configuration déjà achevée."
|
||||
registerDevice: "Ajouter un nouvel appareil"
|
||||
registerKey: "Enregistrer une clef"
|
||||
step1: "Tout d'abord, installez une application d'authentification, telle que {a}\
|
||||
\ ou {b}, sur votre appareil."
|
||||
registerTOTP: "Ajouter un nouvel appareil"
|
||||
registerSecurityKey: "Enregistrer une clef"
|
||||
step1: "Tout d'abord, installez une application d'authentification, telle que {a}
|
||||
ou {b}, sur votre appareil."
|
||||
step2: "Ensuite, scannez le code QR affiché sur l’écran."
|
||||
step2Url: "Vous pouvez également saisir cette URL si vous utilisez un programme\
|
||||
\ de bureau :"
|
||||
step2Url: "Vous pouvez également saisir cette URL si vous utilisez un programme
|
||||
de bureau :"
|
||||
step3: "Entrez le jeton affiché sur votre application pour compléter la configuration."
|
||||
step4: "À partir de maintenant, ce même jeton vous sera demandé à chacune de vos\
|
||||
\ connexions."
|
||||
securityKeyInfo: "Vous pouvez configurer l'authentification WebAuthN pour sécuriser\
|
||||
\ davantage le processus de connexion grâce à une clé de sécurité matérielle qui\
|
||||
\ prend en charge FIDO2, ou bien en configurant l'authentification par empreinte\
|
||||
\ digitale ou par code PIN sur votre appareil."
|
||||
step4: "À partir de maintenant, ce même jeton vous sera demandé à chacune de vos
|
||||
connexions."
|
||||
securityKeyInfo: "Vous pouvez configurer l'authentification WebAuthN pour sécuriser
|
||||
davantage le processus de connexion grâce à une clé de sécurité matérielle qui
|
||||
prend en charge FIDO2, ou bien en configurant l'authentification par empreinte
|
||||
digitale ou par code PIN sur votre appareil."
|
||||
_permissions:
|
||||
"read:account": "Afficher les informations du compte"
|
||||
"write:account": "Mettre à jour les informations de votre compte"
|
||||
|
@ -1311,8 +1311,8 @@ _permissions:
|
|||
"write:gallery-likes": "Gérer les mentions « J'aime » dans la galerie"
|
||||
_auth:
|
||||
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
|
||||
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\
|
||||
\ compte?"
|
||||
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre
|
||||
compte?"
|
||||
permissionAsk: "Cette application nécessite les autorisations suivantes :"
|
||||
pleaseGoBack: "Veuillez retourner à l’application"
|
||||
callback: "Retour vers l’application"
|
||||
|
@ -1412,8 +1412,8 @@ _profile:
|
|||
youCanIncludeHashtags: "Vous pouvez également inclure des hashtags."
|
||||
metadata: "Informations supplémentaires"
|
||||
metadataEdit: "Éditer les informations supplémentaires"
|
||||
metadataDescription: "Vous pouvez afficher jusqu'à quatre informations supplémentaires\
|
||||
\ dans votre profil."
|
||||
metadataDescription: "Vous pouvez afficher jusqu'à quatre informations supplémentaires
|
||||
dans votre profil."
|
||||
metadataLabel: "Étiquette"
|
||||
metadataContent: "Contenu"
|
||||
changeAvatar: "Changer l'image de profil"
|
||||
|
@ -1487,8 +1487,8 @@ _pages:
|
|||
url: "URL de la page"
|
||||
summary: "Résumé de page"
|
||||
alignCenter: "Centrée"
|
||||
hideTitleWhenPinned: "Masquer le titre de la page lorsque celle-ci est épinglée\
|
||||
\ au profil"
|
||||
hideTitleWhenPinned: "Masquer le titre de la page lorsque celle-ci est épinglée
|
||||
au profil"
|
||||
font: "Police de caractères"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
|
@ -1538,8 +1538,8 @@ _pages:
|
|||
note: "Note intégrée"
|
||||
_note:
|
||||
id: "Identifiant de la note"
|
||||
idDescription: "Pour configurer la note, vous pouvez aussi coller ici l'URL\
|
||||
\ correspondante."
|
||||
idDescription: "Pour configurer la note, vous pouvez aussi coller ici l'URL
|
||||
correspondante."
|
||||
detailed: "Afficher les détails"
|
||||
switch: "Interrupteur"
|
||||
_switch:
|
||||
|
@ -1692,8 +1692,8 @@ _pages:
|
|||
_dailyRannum:
|
||||
arg1: "Minimum"
|
||||
arg2: "Maximum"
|
||||
dailyRandomPick: "Sélectionné au hasard dans la liste (Quotidien pour chaque\
|
||||
\ utilisateur)"
|
||||
dailyRandomPick: "Sélectionné au hasard dans la liste (Quotidien pour chaque
|
||||
utilisateur)"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listes"
|
||||
seedRandom: "Aléatoire (graine)"
|
||||
|
@ -1709,8 +1709,8 @@ _pages:
|
|||
_seedRandomPick:
|
||||
arg1: "Graine"
|
||||
arg2: "Listes"
|
||||
DRPWPM: "Sélectionné au hasard dans une liste de probabilités (Quotidien pour\
|
||||
\ chaque utilisateur)"
|
||||
DRPWPM: "Sélectionné au hasard dans une liste de probabilités (Quotidien pour
|
||||
chaque utilisateur)"
|
||||
_DRPWPM:
|
||||
arg1: "Liste de texte"
|
||||
pick: "Sélectionner dans la liste"
|
||||
|
@ -1889,10 +1889,10 @@ adminCustomCssWarn: Ce paramètre ne devrait être utilisé que si vous savez ce
|
|||
dans vos paramètres utilisateur.
|
||||
swipeOnDesktop: Permettre le style de glissement de fenêtre de mobile sur PC
|
||||
moveFromLabel: 'Compte depuis lequel vous migrez :'
|
||||
migrationConfirm: "Êtes-vous absolument certain⋅e que vous voulez migrer votre compte\
|
||||
\ vers {account} ? Une fois fait, vous ne pourrez pas revenir en arrière, et vous\
|
||||
\ ne pourrez plus utiliser le compte actuel normalement à nouveau.\nAussi, assurez-vous\
|
||||
\ d'avoir configuré le compte actuel comme le compte depuis lequel vous migrez."
|
||||
migrationConfirm: "Êtes-vous absolument certain⋅e que vous voulez migrer votre compte
|
||||
vers {account} ? Une fois fait, vous ne pourrez pas revenir en arrière, et vous
|
||||
ne pourrez plus utiliser le compte actuel normalement à nouveau.\nAussi, assurez-vous
|
||||
d'avoir configuré le compte actuel comme le compte depuis lequel vous migrez."
|
||||
_preferencesBackups:
|
||||
updatedAt: 'Mis à jour le : {date} {time}'
|
||||
cannotLoad: Le chargement a échoué
|
||||
|
@ -1934,8 +1934,8 @@ enterSendsMessage: Appuyer sur Entrée pendant la rédaction pour envoyer le mes
|
|||
allowedInstancesDescription: Hôtes des instances autorisées pour la fédération, chacun
|
||||
séparé par une nouvelle ligne (s'applique uniquement en mode privé).
|
||||
enableAutoSensitive: Marquage automatique du contenu sensible (NSFW)
|
||||
regexpErrorDescription: "Il y a eu une erreur dans l'expression régulière à la ligne\
|
||||
\ {line} de votre {tab} des mots masqués :"
|
||||
regexpErrorDescription: "Il y a eu une erreur dans l'expression régulière à la ligne
|
||||
{line} de votre {tab} des mots masqués :"
|
||||
forwardReportIsAnonymous: À la place de votre compte, un compte système anonyme sera
|
||||
affiché comme rapporteur à l'instance distante.
|
||||
noThankYou: Non merci
|
||||
|
@ -1944,10 +1944,10 @@ renoteMute: Mettre en silence les renotes
|
|||
flagSpeakAsCat: Parler comme un chat
|
||||
flagSpeakAsCatDescription: Vos messages seront nyanifiés en mode chat
|
||||
hiddenTags: Hashtags cachés
|
||||
hiddenTagsDescription: "Lister les hashtags (sans le #) que vous souhaitez cacher\
|
||||
\ de tendances et explorer. Les hashtags cachés sont toujours découvrables par d'autres\
|
||||
\ moyens. Les instances bloqués ne sont pas ne sont pas affectés, même si ils sont\
|
||||
\ présent dans cette liste."
|
||||
hiddenTagsDescription: "Lister les hashtags (sans le #) que vous souhaitez cacher
|
||||
de tendances et explorer. Les hashtags cachés sont toujours découvrables par d'autres
|
||||
moyens. Les instances bloqués ne sont pas ne sont pas affectés, même si ils sont
|
||||
présent dans cette liste."
|
||||
antennaInstancesDescription: Lister un hôte d'instance par ligne
|
||||
userSaysSomethingReason: '{name} a dit {reason}'
|
||||
breakFollowConfirm: Êtes vous sur de vouloir retirer l'abonné ?
|
||||
|
@ -2005,30 +2005,29 @@ indexNotice: Indexation en cours. Cela prendra certainement du temps, veuillez n
|
|||
customKaTeXMacro: Macros KaTeX personnalisées
|
||||
enableCustomKaTeXMacro: Activer les macros KaTeX personnalisées
|
||||
noteId: ID de note
|
||||
customKaTeXMacroDescription: "Définissez des macros pour écrire des expressions mathématiques\
|
||||
\ simplement ! La notation se conforme aux définitions de commandes LaTeX et s'écrit\
|
||||
\ \\newcommand{\\name}{content} ou \\newcommand{\\name}[number of arguments]{content}.\
|
||||
\ Par exemple, \\newcommand{\\add}[2]{#1 + #2} étendra \\add{3}{foo} en 3 + foo.\
|
||||
\ Les accolades entourant le nom de la macro peuvent être changés pour des parenthèses\
|
||||
\ ou des crochets. Cela affectera les types de parenthèses utilisées pour les arguments.\
|
||||
\ Une (et une seule) macro peut être définie par ligne, et vous ne pouvez pas couper\
|
||||
\ la ligne au milieu d'une définition. Les lignes invalides sont simplement ignorées.\
|
||||
\ Seulement de simples fonctions de substitution de chaines sont supportées; la\
|
||||
\ syntaxe avancée, telle que la ramification conditionnelle, ne peut pas être utilisée\
|
||||
\ ici."
|
||||
customKaTeXMacroDescription: "Définissez des macros pour écrire des expressions mathématiques
|
||||
simplement ! La notation se conforme aux définitions de commandes LaTeX et s'écrit
|
||||
\\newcommand{\\name}{content} ou \\newcommand{\\name}[number of arguments]{content}.
|
||||
Par exemple, \\newcommand{\\add}[2]{#1 + #2} étendra \\add{3}{foo} en 3 + foo. Les
|
||||
accolades entourant le nom de la macro peuvent être changés pour des parenthèses
|
||||
ou des crochets. Cela affectera les types de parenthèses utilisées pour les arguments.
|
||||
Une (et une seule) macro peut être définie par ligne, et vous ne pouvez pas couper
|
||||
la ligne au milieu d'une définition. Les lignes invalides sont simplement ignorées.
|
||||
Seulement de simples fonctions de substitution de chaines sont supportées; la syntaxe
|
||||
avancée, telle que la ramification conditionnelle, ne peut pas être utilisée ici."
|
||||
enableRecommendedTimeline: Activer la chronologie recommandée
|
||||
silenceThisInstance: Ne plus montrer cet instance
|
||||
silencedInstances: Instances silencieuses
|
||||
silenced: Silencieux
|
||||
deleted: Effacé
|
||||
editNote: Modifier note
|
||||
edited: Modifié
|
||||
edited: 'Modifié à {date} {time}'
|
||||
flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des
|
||||
personnes aux publications des autres.
|
||||
_experiments:
|
||||
alpha: Alpha
|
||||
beta: Beta
|
||||
enablePostEditing: Autoriser l'édition de note
|
||||
enablePostImports: Autoriser l'importation de messages
|
||||
title: Expérimentations
|
||||
findOtherInstance: Trouver un autre serveur
|
||||
userSaysSomethingReasonQuote: '{name} a cité une note contenant {reason}'
|
||||
|
@ -2038,3 +2037,4 @@ signupsDisabled: Les inscriptions sur ce serveur sont actuellement désactivés,
|
|||
apps: Applications
|
||||
userSaysSomethingReasonReply: '{noms} a répondu à une note contenant {raison}'
|
||||
defaultValueIs: 'défaut : {valeur}'
|
||||
searchPlaceholder: Recherchez sur Calckey
|
||||
|
|
|
@ -1254,8 +1254,8 @@ _tutorial:
|
|||
step7_3: "Semoga berhasil dan bersenang-senanglah! \U0001F680"
|
||||
_2fa:
|
||||
alreadyRegistered: "Kamu telah mendaftarkan perangkat otentikasi dua faktor."
|
||||
registerDevice: "Daftarkan perangkat baru"
|
||||
registerKey: "Daftarkan kunci keamanan baru"
|
||||
registerTOTP: "Daftarkan perangkat baru"
|
||||
registerSecurityKey: "Daftarkan kunci keamanan baru"
|
||||
step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat\
|
||||
\ kamu."
|
||||
step2: "Lalu, pindai kode QR yang ada di layar."
|
||||
|
|
113
locales/index.js
113
locales/index.js
|
@ -2,59 +2,90 @@
|
|||
* Languages Loader
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
let languages = []
|
||||
let languages_custom = []
|
||||
|
||||
const merge = (...args) => args.reduce((a, c) => ({
|
||||
...a,
|
||||
...c,
|
||||
...Object.entries(a)
|
||||
.filter(([k]) => c && typeof c[k] === 'object')
|
||||
.reduce((a, [k, v]) => (a[k] = merge(v, c[k]), a), {})
|
||||
}), {});
|
||||
const fs = require("fs");
|
||||
const yaml = require("js-yaml");
|
||||
const languages = [];
|
||||
const languages_custom = [];
|
||||
|
||||
const merge = (...args) =>
|
||||
args.reduce(
|
||||
(a, c) => ({
|
||||
...a,
|
||||
...c,
|
||||
...Object.entries(a)
|
||||
.filter(([k]) => c && typeof c[k] === "object")
|
||||
.reduce((a, [k, v]) => ((a[k] = merge(v, c[k])), a), {}),
|
||||
}),
|
||||
{},
|
||||
);
|
||||
|
||||
fs.readdirSync(__dirname).forEach((file) => {
|
||||
if (file.includes('.yml')){
|
||||
file = file.slice(0, file.indexOf('.'))
|
||||
if (file.includes(".yml")) {
|
||||
file = file.slice(0, file.indexOf("."));
|
||||
languages.push(file);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
fs.readdirSync(__dirname + '/../custom/locales').forEach((file) => {
|
||||
if (file.includes('.yml')){
|
||||
file = file.slice(0, file.indexOf('.'))
|
||||
fs.readdirSync(__dirname + "/../custom/locales").forEach((file) => {
|
||||
if (file.includes(".yml")) {
|
||||
file = file.slice(0, file.indexOf("."));
|
||||
languages_custom.push(file);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
const primaries = {
|
||||
'en': 'US',
|
||||
'ja': 'JP',
|
||||
'zh': 'CN',
|
||||
en: "US",
|
||||
ja: "JP",
|
||||
zh: "CN",
|
||||
};
|
||||
|
||||
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
||||
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
||||
const clean = (text) =>
|
||||
text.replace(new RegExp(String.fromCodePoint(0x08), "g"), "");
|
||||
|
||||
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8'))) || {}, a), {});
|
||||
const locales_custom = languages_custom.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, 'utf-8'))) || {}, a), {});
|
||||
Object.assign(locales, locales_custom)
|
||||
const locales = languages.reduce(
|
||||
(a, c) => (
|
||||
(a[c] =
|
||||
yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, "utf-8"))) ||
|
||||
{}),
|
||||
a
|
||||
),
|
||||
{},
|
||||
);
|
||||
const locales_custom = languages_custom.reduce(
|
||||
(a, c) => (
|
||||
(a[c] =
|
||||
yaml.load(
|
||||
clean(
|
||||
fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, "utf-8"),
|
||||
),
|
||||
) || {}),
|
||||
a
|
||||
),
|
||||
{},
|
||||
);
|
||||
Object.assign(locales, locales_custom);
|
||||
|
||||
module.exports = Object.entries(locales)
|
||||
.reduce((a, [k ,v]) => (a[k] = (() => {
|
||||
const [lang] = k.split('-');
|
||||
switch (k) {
|
||||
case 'ja-JP': return v;
|
||||
case 'ja-KS':
|
||||
case 'en-US': return merge(locales['ja-JP'], v);
|
||||
default: return merge(
|
||||
locales['ja-JP'],
|
||||
locales['en-US'],
|
||||
locales[`${lang}-${primaries[lang]}`] || {},
|
||||
v
|
||||
);
|
||||
}
|
||||
})(), a), {});
|
||||
module.exports = Object.entries(locales).reduce(
|
||||
(a, [k, v]) => (
|
||||
(a[k] = (() => {
|
||||
const [lang] = k.split("-");
|
||||
switch (k) {
|
||||
case "ja-JP":
|
||||
return v;
|
||||
case "ja-KS":
|
||||
case "en-US":
|
||||
return merge(locales["ja-JP"], v);
|
||||
default:
|
||||
return merge(
|
||||
locales["ja-JP"],
|
||||
locales["en-US"],
|
||||
locales[`${lang}-${primaries[lang]}`] || {},
|
||||
v,
|
||||
);
|
||||
}
|
||||
})()),
|
||||
a
|
||||
),
|
||||
{},
|
||||
);
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
---
|
||||
_lang_: "Italiano"
|
||||
headlineMisskey: "Rete collegata tramite note"
|
||||
introMisskey: "Benvenut@! Calckey è un servizio di microblogging decentralizzato, libero e aperto. \nScrivi \"note\" per condividere ciò che sta succedendo adesso o per dire a tutti qualcosa di te. 📡\nGrazie alla funzione \"reazioni\" puoi anche mandare reazioni rapide alle note delle altre persone del Fediverso. 👍\nEsplora un nuovo mondo! 🚀"
|
||||
introMisskey: "Benvenut@! Calckey è un servizio di microblogging decentralizzato,
|
||||
libero e aperto. \nScrivi \"note\" per condividere ciò che sta succedendo adesso
|
||||
o per dire a tutti qualcosa di te. 📡\nGrazie alla funzione \"reazioni\" puoi anche
|
||||
mandare reazioni rapide alle note delle altre persone del Fediverso. 👍\nEsplora
|
||||
un nuovo mondo! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Cerca"
|
||||
notifications: "Notifiche"
|
||||
|
@ -10,7 +13,7 @@ password: "Password"
|
|||
forgotPassword: "Hai dimenticato la tua password?"
|
||||
fetchingAsApObject: "Recuperando dal Fediverso"
|
||||
ok: "OK"
|
||||
gotIt: "Ho capito"
|
||||
gotIt: "Ho capito!"
|
||||
cancel: "Annulla"
|
||||
enterUsername: "Inserisci un nome utente"
|
||||
renotedBy: "Rinotato da {user}"
|
||||
|
@ -30,9 +33,9 @@ logout: "Esci"
|
|||
signup: "Iscriviti"
|
||||
uploading: "Caricamento..."
|
||||
save: "Salva"
|
||||
users: "Utente"
|
||||
users: "Utenti"
|
||||
addUser: "Aggiungi utente"
|
||||
favorite: "Preferiti"
|
||||
favorite: "Aggiungi ai preferiti"
|
||||
favorites: "Preferiti"
|
||||
unfavorite: "Rimuovi nota dai preferiti"
|
||||
favorited: "Aggiunta ai tuoi preferiti."
|
||||
|
@ -44,7 +47,8 @@ copyContent: "Copia il contenuto"
|
|||
copyLink: "Copia il link"
|
||||
delete: "Elimina"
|
||||
deleteAndEdit: "Elimina e modifica"
|
||||
deleteAndEditConfirm: "Vuoi davvero cancellare questa nota e scriverla di nuovo? Verrano eliminate anche tutte le reazioni, Rinote e risposte collegate."
|
||||
deleteAndEditConfirm: "Vuoi davvero cancellare questa nota e scriverla di nuovo? Verrano
|
||||
eliminate anche tutte le reazioni, Rinote e risposte collegate."
|
||||
addToList: "Aggiungi alla lista"
|
||||
sendMessage: "Invia messaggio"
|
||||
copyUsername: "Copia nome utente"
|
||||
|
@ -54,7 +58,7 @@ loadMore: "Mostra di più"
|
|||
showMore: "Mostra di più"
|
||||
showLess: "Chiudi"
|
||||
youGotNewFollower: "Ha iniziato a seguirti"
|
||||
receiveFollowRequest: "Hai ricevuto una richiesta di follow."
|
||||
receiveFollowRequest: "Hai ricevuto una richiesta di follow"
|
||||
followRequestAccepted: "Richiesta di follow accettata"
|
||||
mention: "Menzioni"
|
||||
mentions: "Menzioni"
|
||||
|
@ -64,9 +68,11 @@ import: "Importa"
|
|||
export: "Esporta"
|
||||
files: "Allegati"
|
||||
download: "Scarica"
|
||||
driveFileDeleteConfirm: "Vuoi davvero eliminare il file「{name}? Anche gli allegati verranno eliminati."
|
||||
driveFileDeleteConfirm: "Vuoi davvero eliminare il file「{name}? Anche gli allegati
|
||||
verranno eliminati."
|
||||
unfollowConfirm: "Vuoi davvero smettere di seguire {name}?"
|
||||
exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando sarà compiuta, il file verrà aggiunto direttamente al Drive."
|
||||
exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando
|
||||
sarà compiuta, il file verrà aggiunto direttamente al Drive."
|
||||
importRequested: "Hai richiesto un'importazione. Può volerci tempo. "
|
||||
lists: "Liste"
|
||||
noLists: "Nessuna lista"
|
||||
|
@ -81,9 +87,11 @@ error: "Errore"
|
|||
somethingHappened: "Si è verificato un problema"
|
||||
retry: "Riprova"
|
||||
pageLoadError: "Caricamento pagina non riuscito. "
|
||||
pageLoadErrorDescription: "Questo viene normalmente causato dalla rete o dalla cache del browser. Si prega di pulire la cache, o di attendere e riprovare più tardi."
|
||||
pageLoadErrorDescription: "Questo viene normalmente causato dalla rete o dalla cache
|
||||
del browser. Si prega di pulire la cache, o di attendere e riprovare più tardi."
|
||||
serverIsDead: "Il server non risponde. Si prega di attendere e riprovare più tardi."
|
||||
youShouldUpgradeClient: "Per visualizzare la pagina è necessario aggiornare il client alla nuova versione e ricaricare."
|
||||
youShouldUpgradeClient: "Per visualizzare la pagina è necessario aggiornare il client
|
||||
alla nuova versione e ricaricare."
|
||||
enterListName: "Nome della lista"
|
||||
privacy: "Privacy"
|
||||
makeFollowManuallyApprove: "Richiedi di approvare i follower manualmente"
|
||||
|
@ -108,7 +116,8 @@ sensitive: "Contenuto sensibile"
|
|||
add: "Aggiungi"
|
||||
reaction: "Reazione"
|
||||
reactionSetting: "Reazioni visualizzate sul pannello"
|
||||
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
|
||||
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa
|
||||
il pulsante \"+\" per aggiungere."
|
||||
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
|
||||
attachCancel: "Rimuovi allegato"
|
||||
markAsSensitive: "Segna come sensibile"
|
||||
|
@ -137,12 +146,19 @@ emojiUrl: "URL dell'emoji"
|
|||
addEmoji: "Aggiungi un emoji"
|
||||
settingGuide: "Configurazione suggerita"
|
||||
cacheRemoteFiles: "Memorizzazione nella cache dei file remoti"
|
||||
cacheRemoteFilesDescription: "Disabilitando questa opzione, i file remoti verranno linkati direttamente senza essere memorizzati nella cache. Sarà possibile risparmiare spazio di archiviazione sul server, ma il traffico aumenterà in quanto non verranno generate anteprime."
|
||||
cacheRemoteFilesDescription: "Disabilitando questa opzione, i file remoti verranno
|
||||
linkati direttamente senza essere memorizzati nella cache. Sarà possibile risparmiare
|
||||
spazio di archiviazione sul server, ma il traffico aumenterà in quanto non verranno
|
||||
generate anteprime."
|
||||
flagAsBot: "Io sono un robot"
|
||||
flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche, attiva quest'opzione. Quando attivata, opera come un segnalatore per gli altri sviluppatori allo scopo di prevenire catene d’interazione senza fine con altri bot, e di adeguare i sistemi interni di Calckey perché trattino questo account come un bot."
|
||||
flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche,
|
||||
attiva quest'opzione. Quando attivata, opera come un segnalatore per gli altri sviluppatori
|
||||
allo scopo di prevenire catene d’interazione senza fine con altri bot, e di adeguare
|
||||
i sistemi interni di Calckey perché trattino questo account come un bot."
|
||||
flagAsCat: "Io sono un gatto"
|
||||
flagAsCatDescription: "Abilita l'opzione \"Io sono un gatto\" per l'account."
|
||||
autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che già segui"
|
||||
autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che
|
||||
già segui"
|
||||
addAccount: "Aggiungi account"
|
||||
loginFailed: "Accesso non riuscito"
|
||||
showOnRemote: "Sfoglia sull'istanza remota"
|
||||
|
@ -154,7 +170,10 @@ searchWith: "Cerca: {q}"
|
|||
youHaveNoLists: "Non hai ancora creato nessuna lista"
|
||||
followConfirm: "Sei sicur@ di voler seguire {name}?"
|
||||
proxyAccount: "Account proxy"
|
||||
proxyAccountDescription: "Un account proxy è un account che funziona da follower remoto per gli utenti sotto certe condizioni. Ad esempio, quando un utente aggiunge un utente remoto alla lista, dato che se nessun utente locale segue quell'utente le sue attività non verranno distribuite, al suo posto lo seguirà un account proxy."
|
||||
proxyAccountDescription: "Un account proxy è un account che funziona da follower remoto
|
||||
per gli utenti sotto certe condizioni. Ad esempio, quando un utente aggiunge un
|
||||
utente remoto alla lista, dato che se nessun utente locale segue quell'utente le
|
||||
sue attività non verranno distribuite, al suo posto lo seguirà un account proxy."
|
||||
host: "Server remoto"
|
||||
selectUser: "Seleziona utente"
|
||||
recipient: "Destinatario"
|
||||
|
@ -184,11 +203,13 @@ instanceInfo: "Informazioni sull'istanza"
|
|||
statistics: "Statistiche"
|
||||
clearQueue: "Svuota coda"
|
||||
clearQueueConfirmTitle: "Vuoi davvero svuotare la coda?"
|
||||
clearQueueConfirmText: "Le note ancora non distribuite non verranno rilasciate. Solitamente, non è necessario eseguire questa operazione."
|
||||
clearQueueConfirmText: "Le note ancora non distribuite non verranno rilasciate. Solitamente,
|
||||
non è necessario eseguire questa operazione."
|
||||
clearCachedFiles: "Svuota cache"
|
||||
clearCachedFilesConfirm: "Vuoi davvero svuotare la cache da tutti i file remoti?"
|
||||
blockedInstances: "Istanze bloccate"
|
||||
blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga. Esse non potranno più interagire con la tua istanza."
|
||||
blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga. Esse
|
||||
non potranno più interagire con la tua istanza."
|
||||
muteAndBlock: "Silenziati / Bloccati"
|
||||
mutedUsers: "Account silenziati"
|
||||
blockedUsers: "Account bloccati"
|
||||
|
@ -250,7 +271,8 @@ agreeTo: "Sono d'accordo con {0}"
|
|||
tos: "Termini di servizio"
|
||||
start: "Inizia!"
|
||||
home: "Home"
|
||||
remoteUserCaution: "Può darsi che le informazioni siano incomplete perché questo è un utente remoto."
|
||||
remoteUserCaution: "Può darsi che le informazioni siano incomplete perché questo è
|
||||
un utente remoto."
|
||||
activity: "Attività"
|
||||
images: "Immagini"
|
||||
birthday: "Compleanno"
|
||||
|
@ -283,7 +305,8 @@ unableToDelete: "Eliminazione impossibile"
|
|||
inputNewFileName: "Inserisci nome del nuovo file"
|
||||
inputNewDescription: "Inserisci una nuova descrizione"
|
||||
inputNewFolderName: "Inserisci nome della nuova cartella"
|
||||
circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella che vuoi spostare."
|
||||
circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella
|
||||
che vuoi spostare."
|
||||
hasChildFilesOrFolders: "Impossibile eliminare la cartella perché non è vuota"
|
||||
copyUrl: "Copia URL"
|
||||
rename: "Modifica nome"
|
||||
|
@ -317,7 +340,8 @@ connectService: "Connessione"
|
|||
disconnectService: "Disconnessione "
|
||||
enableLocalTimeline: "Abilita Timeline locale"
|
||||
enableGlobalTimeline: "Abilita Timeline federata"
|
||||
disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e i moderatori potranno sempre accederci."
|
||||
disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e
|
||||
i moderatori potranno sempre accederci."
|
||||
registration: "Iscriviti"
|
||||
enableRegistration: "Permettere nuove registrazioni"
|
||||
invite: "Invita"
|
||||
|
@ -329,9 +353,11 @@ bannerUrl: "URL dell'immagine d'intestazione"
|
|||
backgroundImageUrl: "URL dello sfondo"
|
||||
basicInfo: "Informazioni fondamentali"
|
||||
pinnedUsers: "Utenti in evidenza"
|
||||
pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagina \"Esplora\", un@ per riga."
|
||||
pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagina
|
||||
\"Esplora\", un@ per riga."
|
||||
pinnedPages: "Pagine in evidenza"
|
||||
pinnedPagesDescription: "Specifica il percorso delle pagine che vuoi fissare in cima alla pagina dell'istanza. Una pagina per riga."
|
||||
pinnedPagesDescription: "Specifica il percorso delle pagine che vuoi fissare in cima
|
||||
alla pagina dell'istanza. Una pagina per riga."
|
||||
pinnedClipId: "ID della clip in evidenza"
|
||||
pinnedNotes: "Nota fissata"
|
||||
hcaptcha: "hCaptcha"
|
||||
|
@ -342,14 +368,17 @@ recaptcha: "reCAPTCHA"
|
|||
enableRecaptcha: "Abilita reCAPTCHA"
|
||||
recaptchaSiteKey: "Chiave del sito"
|
||||
recaptchaSecretKey: "Chiave segreta"
|
||||
avoidMultiCaptchaConfirm: "Utilizzare diversi Captcha può causare interferenze. Vuoi disattivare l'altro Captcha? Puoi lasciare diversi Captcha attivi premendo \"Cancella\"."
|
||||
avoidMultiCaptchaConfirm: "Utilizzare diversi Captcha può causare interferenze. Vuoi
|
||||
disattivare l'altro Captcha? Puoi lasciare diversi Captcha attivi premendo \"Cancella\"\
|
||||
."
|
||||
antennas: "Antenne"
|
||||
manageAntennas: "Gestore delle antenne"
|
||||
name: "Nome"
|
||||
antennaSource: "Fonte dell'antenna"
|
||||
antennaKeywords: "Parole chiavi da ricevere"
|
||||
antennaExcludeKeywords: "Parole chiavi da escludere"
|
||||
antennaKeywordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare con un'interruzzione riga indica la condizione \"O\"."
|
||||
antennaKeywordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare
|
||||
con un'interruzzione riga indica la condizione \"O\"."
|
||||
notifyAntenna: "Invia notifiche delle nuove note"
|
||||
withFileAntenna: "Solo note con file in allegato"
|
||||
enableServiceworker: "Abilita ServiceWorker"
|
||||
|
@ -477,19 +506,26 @@ showFeaturedNotesInTimeline: "Mostrare le note di tendenza nella tua timeline"
|
|||
objectStorage: "Stoccaggio oggetti"
|
||||
useObjectStorage: "Utilizza stoccaggio oggetti"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "URL di riferimento. In caso di utilizzo di proxy o CDN l'URL è 'https://<bucket>.s3.amazonaws.com' per S3, 'https://storage.googleapis.com/<bucket>' per GCS eccetera. "
|
||||
objectStorageBaseUrlDesc: "URL di riferimento. In caso di utilizzo di proxy o CDN
|
||||
l'URL è 'https://<bucket>.s3.amazonaws.com' per S3, 'https://storage.googleapis.com/<bucket>'
|
||||
per GCS eccetera. "
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Specificare il nome del bucket utilizzato dal provider."
|
||||
objectStoragePrefix: "Prefix"
|
||||
objectStoragePrefixDesc: "I file saranno conservati sotto la directory di questo prefisso."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "Lasciare vuoto se si sta utilizzando S3. In caso contrario si prega di specificare l'endpoint come '<host>' oppure '<host>:<port>' a seconda del servizio utilizzato."
|
||||
objectStorageEndpointDesc: "Lasciare vuoto se si sta utilizzando S3. In caso contrario
|
||||
si prega di specificare l'endpoint come '<host>' oppure '<host>:<port>' a seconda
|
||||
del servizio utilizzato."
|
||||
objectStorageRegion: "Region"
|
||||
objectStorageRegionDesc: "Specificate una regione, quale 'xx-east-1'. Se il servizio in utilizzo non distingue tra regioni, lasciate vuoto o inserite 'us-east-1'."
|
||||
objectStorageRegionDesc: "Specificate una regione, quale 'xx-east-1'. Se il servizio
|
||||
in utilizzo non distingue tra regioni, lasciate vuoto o inserite 'us-east-1'."
|
||||
objectStorageUseSSL: "Usare SSL"
|
||||
objectStorageUseSSLDesc: "Disabilita quest'opzione se non utilizzi HTTPS per le connessioni API."
|
||||
objectStorageUseSSLDesc: "Disabilita quest'opzione se non utilizzi HTTPS per le connessioni
|
||||
API."
|
||||
objectStorageUseProxy: "Usa proxy"
|
||||
objectStorageUseProxyDesc: "Disabilita quest'opzione se non usi proxy per la connessione API."
|
||||
objectStorageUseProxyDesc: "Disabilita quest'opzione se non usi proxy per la connessione
|
||||
API."
|
||||
objectStorageSetPublicRead: "Imposta \"visibilità pubblica\" al momento di caricare"
|
||||
serverLogs: "Log del server"
|
||||
deleteAll: "Cancella cronologia"
|
||||
|
@ -517,7 +553,9 @@ sort: "Ordina per"
|
|||
ascendingOrder: "Ascendente"
|
||||
descendingOrder: "Discendente"
|
||||
scratchpad: "ScratchPad"
|
||||
scratchpadDescription: "Lo Scratchpad offre un ambiente per esperimenti di AiScript. È possibile scrivere, eseguire e confermare i risultati dell'interazione del codice con Calckey."
|
||||
scratchpadDescription: "Lo Scratchpad offre un ambiente per esperimenti di AiScript.
|
||||
È possibile scrivere, eseguire e confermare i risultati dell'interazione del codice
|
||||
con Calckey."
|
||||
output: "Uscita"
|
||||
script: "Script"
|
||||
disablePagesScript: "Disabilita AiScript nelle pagine"
|
||||
|
@ -525,11 +563,14 @@ updateRemoteUser: "Aggiornare le informazioni di utente remot@"
|
|||
deleteAllFiles: "Elimina tutti i file"
|
||||
deleteAllFilesConfirm: "Vuoi davvero eliminare tutti i file?"
|
||||
removeAllFollowing: "Cancella tutti i follows"
|
||||
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
|
||||
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore,
|
||||
esegui se, ad esempio, l'istanza non esiste più."
|
||||
userSuspended: "L'utente è sospes@."
|
||||
userSilenced: "L'utente è silenziat@."
|
||||
yourAccountSuspendedTitle: "Questo account è sospeso."
|
||||
yourAccountSuspendedDescription: "Questo account è stato sospeso a causa di una violazione dei termini di servizio del server. Contattare l'amministrazione per i dettagli. Si prega di non creare un nuovo account."
|
||||
yourAccountSuspendedDescription: "Questo account è stato sospeso a causa di una violazione
|
||||
dei termini di servizio del server. Contattare l'amministrazione per i dettagli.
|
||||
Si prega di non creare un nuovo account."
|
||||
menu: "Menù"
|
||||
divider: "Linea di separazione"
|
||||
addItem: "Aggiungi elemento"
|
||||
|
@ -569,12 +610,14 @@ permission: "Autorizzazioni "
|
|||
enableAll: "Abilita tutto"
|
||||
disableAll: "Disabilita tutto"
|
||||
tokenRequested: "Autorizza accesso all'account"
|
||||
pluginTokenRequestedDescription: "Il plugin potrà utilizzare le autorizzazioni impostate qui."
|
||||
pluginTokenRequestedDescription: "Il plugin potrà utilizzare le autorizzazioni impostate
|
||||
qui."
|
||||
notificationType: "Tipo di notifiche"
|
||||
edit: "Modifica"
|
||||
emailServer: "Server email"
|
||||
enableEmail: "Abilita consegna email"
|
||||
emailConfigInfo: "Utilizzato per verificare il tuo indirizzo di posta elettronica e per reimpostare la tua password"
|
||||
emailConfigInfo: "Utilizzato per verificare il tuo indirizzo di posta elettronica
|
||||
e per reimpostare la tua password"
|
||||
email: "Email"
|
||||
emailAddress: "Indirizzo di posta elettronica"
|
||||
smtpConfig: "Impostazioni del server SMTP"
|
||||
|
@ -582,7 +625,8 @@ smtpHost: "Server remoto"
|
|||
smtpPort: "Porta"
|
||||
smtpUser: "Nome utente"
|
||||
smtpPass: "Password"
|
||||
emptyToDisableSmtpAuth: "Lasciare il nome utente e la password vuoti per disabilitare la verifica SMTP"
|
||||
emptyToDisableSmtpAuth: "Lasciare il nome utente e la password vuoti per disabilitare
|
||||
la verifica SMTP"
|
||||
smtpSecure: "Usare la porta SSL/TLS implicito per le connessioni SMTP"
|
||||
smtpSecureInfo: "Disabilitare quando è attivo STARTTLS."
|
||||
testEmail: "Testare la consegna di posta elettronica"
|
||||
|
@ -602,10 +646,13 @@ create: "Crea"
|
|||
notificationSetting: "Impostazioni notifiche"
|
||||
notificationSettingDesc: "Seleziona il tipo di notifiche da visualizzare."
|
||||
useGlobalSetting: "Usa impostazioni generali"
|
||||
useGlobalSettingDesc: "Se abilitato, le impostazioni notifiche dell'account verranno utilizzate. Se disabilitato, si possono definire diverse singole impostazioni."
|
||||
useGlobalSettingDesc: "Se abilitato, le impostazioni notifiche dell'account verranno
|
||||
utilizzate. Se disabilitato, si possono definire diverse singole impostazioni."
|
||||
other: "Avanzate"
|
||||
regenerateLoginToken: "Genera di nuovo un token di connessione"
|
||||
regenerateLoginTokenDescription: "Genera un nuovo token di autenticazione. Solitamente questa operazione non è necessaria: quando si genera un nuovo token, tutti i dispositivi vanno disconnessi."
|
||||
regenerateLoginTokenDescription: "Genera un nuovo token di autenticazione. Solitamente
|
||||
questa operazione non è necessaria: quando si genera un nuovo token, tutti i dispositivi
|
||||
vanno disconnessi."
|
||||
setMultipleBySeparatingWithSpace: "È possibile creare multiple voci separate da spazi."
|
||||
fileIdOrUrl: "ID o URL del file"
|
||||
behavior: "Comportamento"
|
||||
|
@ -613,7 +660,8 @@ sample: "Esempio"
|
|||
abuseReports: "Segnalazioni"
|
||||
reportAbuse: "Segnalazioni"
|
||||
reportAbuseOf: "Segnala {name}"
|
||||
fillAbuseReportDescription: "Si prega di spiegare il motivo della segnalazione. Se riguarda una nota precisa, si prega di collegare anche l'URL della nota."
|
||||
fillAbuseReportDescription: "Si prega di spiegare il motivo della segnalazione. Se
|
||||
riguarda una nota precisa, si prega di collegare anche l'URL della nota."
|
||||
abuseReported: "La segnalazione è stata inviata. Grazie."
|
||||
reporter: "il corrispondente"
|
||||
reporteeOrigin: "Origine del segnalato"
|
||||
|
@ -623,7 +671,8 @@ abuseMarkAsResolved: "Contrassegna la segnalazione come risolta"
|
|||
openInNewTab: "Apri in una nuova scheda"
|
||||
openInSideView: "Apri in vista laterale"
|
||||
defaultNavigationBehaviour: "Navigazione preimpostata"
|
||||
editTheseSettingsMayBreakAccount: "Modificare queste impostazioni può danneggiare l'account."
|
||||
editTheseSettingsMayBreakAccount: "Modificare queste impostazioni può danneggiare
|
||||
l'account."
|
||||
instanceTicker: "Informazioni sull'istanza da cui vengono le note"
|
||||
waitingFor: "Aspettando {x}"
|
||||
random: "Casuale"
|
||||
|
@ -635,7 +684,8 @@ createNew: "Crea nuov@"
|
|||
optional: "Opzionale"
|
||||
createNewClip: "Nuova clip"
|
||||
public: "Pubblica"
|
||||
i18nInfo: "Calckey è tradotto in diverse lingue da volontari. Anche tu puoi contribuire su {link}."
|
||||
i18nInfo: "Calckey è tradotto in diverse lingue da volontari. Anche tu puoi contribuire
|
||||
su {link}."
|
||||
manageAccessTokens: "Gestisci token di accesso"
|
||||
accountInfo: "Informazioni account"
|
||||
notesCount: "Conteggio note"
|
||||
|
@ -654,12 +704,16 @@ no: "No"
|
|||
driveFilesCount: "Numero di file nel Drive"
|
||||
driveUsage: "Utilizzazione del Drive"
|
||||
noCrawle: "Rifiuta l'indicizzazione dai robot."
|
||||
noCrawleDescription: "Richiedi che i motori di ricerca non indicizzino la tua pagina di profilo, le tue note, pagine, ecc."
|
||||
lockedAccountInfo: "A meno che non imposti la visibilità delle tue note su \"Solo ai follower\", le tue note sono visibili da tutti, anche se hai configurato l'account per confermare manualmente le richieste di follow."
|
||||
noCrawleDescription: "Richiedi che i motori di ricerca non indicizzino la tua pagina
|
||||
di profilo, le tue note, pagine, ecc."
|
||||
lockedAccountInfo: "A meno che non imposti la visibilità delle tue note su \"Solo
|
||||
ai follower\", le tue note sono visibili da tutti, anche se hai configurato l'account
|
||||
per confermare manualmente le richieste di follow."
|
||||
alwaysMarkSensitive: "Segnare i media come sensibili per impostazione predefinita"
|
||||
loadRawImages: "Visualizza le intere immagini allegate invece delle miniature."
|
||||
disableShowingAnimatedImages: "Disabilita le immagini animate"
|
||||
verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere al collegamento per compiere la verifica."
|
||||
verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere
|
||||
al collegamento per compiere la verifica."
|
||||
notSet: "Non impostato"
|
||||
emailVerified: "Il tuo indirizzo email è stato verificato"
|
||||
noteFavoritesCount: "Conteggio note tra i preferiti"
|
||||
|
@ -671,13 +725,15 @@ clips: "Clip"
|
|||
experimentalFeatures: "Funzioni sperimentali"
|
||||
developer: "Sviluppatore"
|
||||
makeExplorable: "Account visibile sulla pagina \"Esplora\""
|
||||
makeExplorableDescription: "Se disabiliti l'opzione, il tuo account non verrà visualizzato sulla pagina \"Esplora\"."
|
||||
makeExplorableDescription: "Se disabiliti l'opzione, il tuo account non verrà visualizzato
|
||||
sulla pagina \"Esplora\"."
|
||||
showGapBetweenNotesInTimeline: "Mostrare un intervallo tra le note sulla timeline"
|
||||
duplicate: "Duplica"
|
||||
left: "Sinistra"
|
||||
center: "Centro"
|
||||
wide: "Largo"
|
||||
reloadToApplySetting: "Le tue preferenze verranno impostate dopo il ricaricamento della pagina. Vuoi ricaricare adesso?"
|
||||
reloadToApplySetting: "Le tue preferenze verranno impostate dopo il ricaricamento
|
||||
della pagina. Vuoi ricaricare adesso?"
|
||||
needReloadToApply: "È necessario riavviare per rendere effettive le modifiche."
|
||||
showTitlebar: "Visualizza la barra del titolo"
|
||||
clearCache: "Svuota cache"
|
||||
|
@ -685,7 +741,10 @@ onlineUsersCount: "{n} utenti online"
|
|||
nUsers: "{n} utenti"
|
||||
nNotes: "{n}Note"
|
||||
sendErrorReports: "Invia segnalazioni di errori"
|
||||
sendErrorReportsDescription: "Quando abilitato, se si verifica un problema, informazioni dettagliate sugli errori verranno condivise con Calckey in modo da aiutare a migliorare la qualità del software.\nCiò include informazioni come la versione del sistema operativo, il tipo di navigatore web che usi, la cronologia delle attività, ecc."
|
||||
sendErrorReportsDescription: "Quando abilitato, se si verifica un problema, informazioni
|
||||
dettagliate sugli errori verranno condivise con Calckey in modo da aiutare a migliorare
|
||||
la qualità del software.\nCiò include informazioni come la versione del sistema
|
||||
operativo, il tipo di navigatore web che usi, la cronologia delle attività, ecc."
|
||||
myTheme: "I miei temi"
|
||||
backgroundColor: "Sfondo"
|
||||
textColor: "Testo"
|
||||
|
@ -711,7 +770,8 @@ receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza"
|
|||
emailNotification: "Eventi per notifiche via mail"
|
||||
publish: "Pubblico"
|
||||
inChannelSearch: "Cerca in canale"
|
||||
useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello di reazioni"
|
||||
useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello
|
||||
di reazioni"
|
||||
typingUsers: "{users} sta(nno) scrivendo"
|
||||
jumpToSpecifiedDate: "Vai alla data "
|
||||
showingPastTimeline: "Stai visualizzando una vecchia timeline"
|
||||
|
@ -722,14 +782,17 @@ unlikeConfirm: "Non ti piace più?"
|
|||
fullView: "Schermo intero"
|
||||
quitFullView: "Esci dalla modalità a schermo intero"
|
||||
addDescription: "Aggiungi descrizione"
|
||||
userPagePinTip: "Qui puoi appuntare note, premendo \"Fissa sul profilo\" nel menù delle singole note."
|
||||
notSpecifiedMentionWarning: "Sono menzionati account che non vengono inclusi fra i destinatari"
|
||||
userPagePinTip: "Qui puoi appuntare note, premendo \"Fissa sul profilo\" nel menù
|
||||
delle singole note."
|
||||
notSpecifiedMentionWarning: "Sono menzionati account che non vengono inclusi fra i
|
||||
destinatari"
|
||||
info: "Informazioni"
|
||||
userInfo: "Informazioni utente"
|
||||
unknown: "Sconosciuto"
|
||||
onlineStatus: "Stato di connessione"
|
||||
hideOnlineStatus: "Stato invisibile"
|
||||
hideOnlineStatusDescription: "Abilitare l'opzione di stato invisibile può guastare la praticità di singole funzioni, come la ricerca."
|
||||
hideOnlineStatusDescription: "Abilitare l'opzione di stato invisibile può guastare
|
||||
la praticità di singole funzioni, come la ricerca."
|
||||
online: "Online"
|
||||
active: "Attiv@"
|
||||
offline: "Offline"
|
||||
|
@ -777,7 +840,9 @@ whatIsNew: "Visualizza le informazioni sull'aggiornamento"
|
|||
translate: "Traduzione"
|
||||
translatedFrom: "Tradotto da {x}"
|
||||
accountDeletionInProgress: "La cancellazione dell'account è in corso"
|
||||
usernameInfo: "Un nome per identificare univocamente il tuo account sul server. È possibile utilizzare caratteri alfanumerici (a~z, A~Z, 0~9) e il trattino basso (_). Non sarà possibile cambiare il nome utente in seguito."
|
||||
usernameInfo: "Un nome per identificare univocamente il tuo account sul server. È
|
||||
possibile utilizzare caratteri alfanumerici (a~z, A~Z, 0~9) e il trattino basso
|
||||
(_). Non sarà possibile cambiare il nome utente in seguito."
|
||||
aiChanMode: "Modalità Ai"
|
||||
keepCw: "Mantieni il CW"
|
||||
resolved: "Risolto"
|
||||
|
@ -801,7 +866,8 @@ leaveGroup: "Esci dal gruppo"
|
|||
leaveGroupConfirm: "Uscire da「{name}」?"
|
||||
useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile"
|
||||
welcomeBackWithName: "Bentornato/a, {name}"
|
||||
clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo email."
|
||||
clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo
|
||||
email."
|
||||
searchByGoogle: "Cerca"
|
||||
indefinitely: "Non scade"
|
||||
tenMinutes: "10 minuti"
|
||||
|
@ -829,7 +895,8 @@ _signup:
|
|||
emailAddressInfo: "Inserisci il tuo indirizzo email. Non verrà reso pubblico."
|
||||
_accountDelete:
|
||||
accountDelete: "Cancellazione account"
|
||||
sendEmail: "Al termine della cancellazione dell'account, verrà inviata una mail all'indirizzo a cui era registrato."
|
||||
sendEmail: "Al termine della cancellazione dell'account, verrà inviata una mail
|
||||
all'indirizzo a cui era registrato."
|
||||
requestAccountDelete: "Richiesta di cancellazione account"
|
||||
started: "Il processo di cancellazione è iniziato."
|
||||
inProgress: "Cancellazione in corso"
|
||||
|
@ -837,9 +904,13 @@ _ad:
|
|||
back: "Indietro"
|
||||
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
|
||||
_forgotPassword:
|
||||
enterEmail: "Inserisci l'indirizzo di posta elettronica che hai registrato nel tuo profilo. Il collegamento necessario per ripristinare la password verrà inviato a questo indirizzo."
|
||||
ifNoEmail: "Se nessun indirizzo e-mail è stato registrato, si prega di contattare l'amministratore·trice dell'istanza."
|
||||
contactAdmin: "Poiché questa istanza non permette l'utilizzo di una mail, si prega di contattare l'amministratore·trice dell'istanza per poter ripristinare la password."
|
||||
enterEmail: "Inserisci l'indirizzo di posta elettronica che hai registrato nel tuo
|
||||
profilo. Il collegamento necessario per ripristinare la password verrà inviato
|
||||
a questo indirizzo."
|
||||
ifNoEmail: "Se nessun indirizzo e-mail è stato registrato, si prega di contattare
|
||||
l'amministratore·trice dell'istanza."
|
||||
contactAdmin: "Poiché questa istanza non permette l'utilizzo di una mail, si prega
|
||||
di contattare l'amministratore·trice dell'istanza per poter ripristinare la password."
|
||||
_gallery:
|
||||
my: "Le mie pubblicazioni"
|
||||
liked: "Pubblicazioni che mi piacciono"
|
||||
|
@ -852,7 +923,8 @@ _email:
|
|||
title: "Hai ricevuto una richiesta di follow"
|
||||
_plugin:
|
||||
install: "Installa estensioni"
|
||||
installWarn: "Si prega di installare soltanto estensioni che provengono da fonti affidabili."
|
||||
installWarn: "Si prega di installare soltanto estensioni che provengono da fonti
|
||||
affidabili."
|
||||
manage: "Gestisci estensioni"
|
||||
_registry:
|
||||
key: "Dati"
|
||||
|
@ -866,7 +938,8 @@ _aboutMisskey:
|
|||
source: "Codice sorgente"
|
||||
translation: "Tradurre Calckey"
|
||||
donate: "Sostieni Calckey"
|
||||
morePatrons: "Apprezziamo sinceramente il supporto di tante altre persone. Grazie mille! 🥰"
|
||||
morePatrons: "Apprezziamo sinceramente il supporto di tante altre persone. Grazie
|
||||
mille! 🥰"
|
||||
patrons: "Sostenitori"
|
||||
_nsfw:
|
||||
respect: "Nascondere i media segnati come sensibli"
|
||||
|
@ -874,10 +947,12 @@ _nsfw:
|
|||
force: "Nascondere tutti i media"
|
||||
_mfm:
|
||||
cheatSheet: "Bigliettino MFM"
|
||||
intro: "MFM è un linguaggio Markdown particolare che si può usare in diverse parti di Calckey. Qui puoi visualizzare a colpo d'occhio tutta la sintassi MFM utile."
|
||||
intro: "MFM è un linguaggio Markdown particolare che si può usare in diverse parti
|
||||
di Calckey. Qui puoi visualizzare a colpo d'occhio tutta la sintassi MFM utile."
|
||||
dummy: "Il Fediverso si espande con Calckey"
|
||||
mention: "Menzioni"
|
||||
mentionDescription: "Si può menzionare un utente specifico digitando il suo nome utente subito dopo il segno @."
|
||||
mentionDescription: "Si può menzionare un utente specifico digitando il suo nome
|
||||
utente subito dopo il segno @."
|
||||
hashtag: "Hashtag"
|
||||
url: "URL"
|
||||
link: "Link"
|
||||
|
@ -904,7 +979,8 @@ _mfm:
|
|||
x4: "Estremamente più grande"
|
||||
x4Description: "Mostra il contenuto estremamente più ingrandito."
|
||||
blur: "Sfocatura"
|
||||
blurDescription: "È possibile rendere sfocato il contenuto. Spostando il cursore su di esso tornerà visibile chiaramente."
|
||||
blurDescription: "È possibile rendere sfocato il contenuto. Spostando il cursore
|
||||
su di esso tornerà visibile chiaramente."
|
||||
font: "Tipo di carattere"
|
||||
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
|
||||
rainbow: "Arcobaleno"
|
||||
|
@ -933,10 +1009,15 @@ _menuDisplay:
|
|||
hide: "Nascondere"
|
||||
_wordMute:
|
||||
muteWords: "Parole da filtrare"
|
||||
muteWordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare con un'interruzzione riga indica la condizione \"O\"."
|
||||
muteWordsDescription2: "Metti le parole chiavi tra slash per usare espressioni regolari (regexp)."
|
||||
softDescription: "Nascondi della timeline note che rispondono alle condizioni impostate qui."
|
||||
hardDescription: "Impedisci alla timeline di caricare le note che rispondono alle condizioni impostate qui. Inoltre, le note scompariranno in modo irreversibile, anche se le condizioni verranno successivamente rimosse."
|
||||
muteWordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare
|
||||
con un'interruzzione riga indica la condizione \"O\"."
|
||||
muteWordsDescription2: "Metti le parole chiavi tra slash per usare espressioni regolari
|
||||
(regexp)."
|
||||
softDescription: "Nascondi della timeline note che rispondono alle condizioni impostate
|
||||
qui."
|
||||
hardDescription: "Impedisci alla timeline di caricare le note che rispondono alle
|
||||
condizioni impostate qui. Inoltre, le note scompariranno in modo irreversibile,
|
||||
anche se le condizioni verranno successivamente rimosse."
|
||||
soft: "Moderato"
|
||||
hard: "Severo"
|
||||
mutedNotes: "Note silenziate"
|
||||
|
@ -1030,24 +1111,35 @@ _tutorial:
|
|||
step1_1: "Benvenuto!"
|
||||
step1_2: "Vediamo di configurarla. Sarete operativi in men che non si dica!"
|
||||
step2_1: "Per prima cosa, compila il tuo profilo"
|
||||
step2_2: "Fornendo alcune informazioni su chi siete, sarà più facile per gli altri capire se vogliono vedere le vostre note o seguirvi"
|
||||
step2_2: "Fornendo alcune informazioni su chi siete, sarà più facile per gli altri
|
||||
capire se vogliono vedere le vostre note o seguirvi"
|
||||
step3_1: "Ora è il momento di seguire alcune persone!"
|
||||
step3_2: "La vostra home e le vostre timeline social si basano su chi seguite, quindi provate a seguire un paio di account per iniziare.\nCliccate sul cerchio più in alto a destra di un profilo per seguirlo"
|
||||
step3_2: "La vostra home e le vostre timeline social si basano su chi seguite, quindi
|
||||
provate a seguire un paio di account per iniziare.\nCliccate sul cerchio più in
|
||||
alto a destra di un profilo per seguirlo"
|
||||
step4_1: "Fatevi conoscere"
|
||||
step4_2: "Per il vostro primo post, alcuni preferiscono fare un post di {introduction} o un semplice \"Ciao mondo!\""
|
||||
step4_2: "Per il vostro primo post, alcuni preferiscono fare un post di {introduction}
|
||||
o un semplice \"Ciao mondo!\""
|
||||
step5_1: "Linee temporali, linee temporali dappertutto!"
|
||||
step5_2: "La tua istanza ha attivato {timelines} diverse timelines"
|
||||
step5_3: "La timeline Home {icon} è quella in cui si possono vedere i post dei propri follower"
|
||||
step5_4: "La timeline Locale {icon} è quella in cui si possono vedere i post di tutti gli altri utenti di questa istanza"
|
||||
step5_5: "La timeline Raccomandati {icon} è quella in cui si possono vedere i post delle istanze raccomandate dagli amministratori"
|
||||
step5_6: "La timeline Social {icon} è quella in cui si possono vedere i post degli amici dei propri follower"
|
||||
step5_7: "La timeline Globale {icon} è quella in cui si possono vedere i post di ogni altra istanza collegata"
|
||||
step5_3: "La timeline Home {icon} è quella in cui si possono vedere i post dei propri
|
||||
follower"
|
||||
step5_4: "La timeline Locale {icon} è quella in cui si possono vedere i post di
|
||||
tutti gli altri utenti di questa istanza"
|
||||
step5_5: "La timeline Raccomandati {icon} è quella in cui si possono vedere i post
|
||||
delle istanze raccomandate dagli amministratori"
|
||||
step5_6: "La timeline Social {icon} è quella in cui si possono vedere i post degli
|
||||
amici dei propri follower"
|
||||
step5_7: "La timeline Globale {icon} è quella in cui si possono vedere i post di
|
||||
ogni altra istanza collegata"
|
||||
step6_1: "Allora, cos'è questo posto?"
|
||||
step6_2: "Beh, non ti sei semplicemente unito a Calckey. Sei entrato in un portale del Fediverse, una rete interconnessa di migliaia di server, chiamata \"istanze\""
|
||||
step6_3: "Ogni server funziona in modo diverso, e non tutti i server eseguono Calckey. Questo però lo fa! È un po' complicato, ma ci riuscirete in poco tempo"
|
||||
step6_2: "Beh, non ti sei semplicemente unito a Calckey. Sei entrato in un portale
|
||||
del Fediverse, una rete interconnessa di migliaia di server, chiamata \"istanze\""
|
||||
step6_3: "Ogni server funziona in modo diverso, e non tutti i server eseguono Calckey.
|
||||
Questo però lo fa! È un po' complicato, ma ci riuscirete in poco tempo"
|
||||
step6_4: "Ora andate, esplorate e divertitevi!"
|
||||
_2fa:
|
||||
registerDevice: "Aggiungi dispositivo"
|
||||
registerTOTP: "Aggiungi dispositivo"
|
||||
_permissions:
|
||||
"read:account": "Visualizzare le informazioni dell'account"
|
||||
"write:account": "Modificare le informazioni dell'account"
|
||||
|
@ -1173,7 +1265,8 @@ _profile:
|
|||
youCanIncludeHashtags: "Puoi anche includere hashtag."
|
||||
metadata: "Informazioni aggiuntive"
|
||||
metadataEdit: "Modifica informazioni aggiuntive"
|
||||
metadataDescription: "Puoi pubblicare fino a quattro informazioni aggiuntive sul profilo."
|
||||
metadataDescription: "Puoi pubblicare fino a quattro informazioni aggiuntive sul
|
||||
profilo."
|
||||
metadataLabel: "Etichetta"
|
||||
metadataContent: "Contenuto"
|
||||
changeAvatar: "Modifica immagine profilo"
|
||||
|
@ -1465,3 +1558,6 @@ _deck:
|
|||
list: "Liste"
|
||||
mentions: "Menzioni"
|
||||
direct: "Diretta"
|
||||
noThankYou: No grazie
|
||||
addInstance: Aggiungi un'istanza
|
||||
deleted: Eliminato
|
||||
|
|
|
@ -133,6 +133,7 @@ unsuspendConfirm: "解凍しますか?"
|
|||
selectList: "リストを選択"
|
||||
selectAntenna: "アンテナを選択"
|
||||
selectWidget: "ウィジェットを選択"
|
||||
selectChannel: "チャンネルを選択"
|
||||
editWidgets: "ウィジェットを編集"
|
||||
editWidgetsExit: "編集を終了"
|
||||
customEmojis: "カスタム絵文字"
|
||||
|
@ -722,7 +723,8 @@ onlineUsersCount: "{n}人がオンライン"
|
|||
nUsers: "{n}ユーザー"
|
||||
nNotes: "{n}投稿"
|
||||
sendErrorReports: "エラーリポートを送信"
|
||||
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てられます。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。"
|
||||
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てられます。\n\
|
||||
エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。"
|
||||
myTheme: "マイテーマ"
|
||||
backgroundColor: "背景"
|
||||
accentColor: "アクセント"
|
||||
|
@ -976,6 +978,8 @@ enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする"
|
|||
preventAiLearning: "AIによる学習を防止"
|
||||
preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。"
|
||||
noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。"
|
||||
enableServerMachineStats: "サーバーのマシン情報を公開する"
|
||||
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
|
||||
|
||||
_sensitiveMediaDetection:
|
||||
description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。"
|
||||
|
@ -1144,6 +1148,10 @@ _mfm:
|
|||
foregroundDescription: 文字の色を変更します。
|
||||
fade: フェード
|
||||
fadeDescription: フェードインとフェードアウトする。
|
||||
crop: 切り抜き
|
||||
cropDescription: 内容を切り抜く。
|
||||
advancedDescription: オフにすると、アニメーション再生中を除いて基本的なMFMだけ表示します。
|
||||
advanced: 高度なMFM
|
||||
_instanceTicker:
|
||||
none: "表示しない"
|
||||
remote: "リモートユーザーに表示"
|
||||
|
@ -1308,14 +1316,29 @@ _tutorial:
|
|||
step6_4: "これで完了です。お楽しみください!"
|
||||
_2fa:
|
||||
alreadyRegistered: "既に設定は完了しています。"
|
||||
registerDevice: "デバイスを登録"
|
||||
registerKey: "キーを登録"
|
||||
registerTOTP: "認証アプリの設定を開始"
|
||||
step1: "まず、{a}や{b}などの認証アプリをお使いのデバイスにインストールします。"
|
||||
step2: "次に、表示されているQRコードをアプリでスキャンします。"
|
||||
step2Url: "デスクトップアプリでは次のURLを入力します:"
|
||||
step3: "アプリに表示されているトークンを入力して完了です。"
|
||||
step4: "これからログインするときも、同じようにトークンを入力します。"
|
||||
securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキーもしくは端末の指紋認証やPINを使用してログインするように設定できます。"
|
||||
step2Click: "QRコードをクリックすると、お使いの端末にインストールされている認証アプリやキーリングに登録できます。"
|
||||
step2Url: "デスクトップアプリでは次のURIを入力します:"
|
||||
step3Title: "確認コードを入力"
|
||||
step3: "アプリに表示されている確認コード(トークン)を入力して完了です。"
|
||||
step4: "これからログインするときも、同じように確認コードを入力します。"
|
||||
securityKeyNotSupported: "お使いのブラウザはセキュリティキーに対応していません。"
|
||||
registerTOTPBeforeKey: "セキュリティキー・パスキーを登録するには、まず認証アプリの設定を行なってください。"
|
||||
securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキー、端末の生体認証やPINロック、パスキーといった、WebAuthn由来の鍵を登録します。"
|
||||
chromePasskeyNotSupported: "Chromeのパスキーは現在サポートしていません。"
|
||||
registerSecurityKey: "セキュリティキー・パスキーを登録する"
|
||||
securityKeyName: "キーの名前を入力"
|
||||
tapSecurityKey: "ブラウザの指示に従い、セキュリティキーやパスキーを登録してください"
|
||||
removeKey: "セキュリティキーを削除"
|
||||
removeKeyConfirm: "{name}を削除しますか?"
|
||||
whyTOTPOnlyRenew: "セキュリティキーが登録されている場合、認証アプリの設定は解除できません。"
|
||||
renewTOTP: "認証アプリを再設定"
|
||||
renewTOTPConfirm: "今までの認証アプリの確認コードは使用できなくなります"
|
||||
renewTOTPOk: "再設定する"
|
||||
renewTOTPCancel: "やめておく"
|
||||
token: "多要素認証トークン"
|
||||
_permissions:
|
||||
"read:account": "アカウントの情報を見る"
|
||||
"write:account": "アカウントの情報を変更する"
|
||||
|
@ -1397,6 +1420,10 @@ _widgets:
|
|||
userList: "ユーザーリスト"
|
||||
_userList:
|
||||
chooseList: "リストを選択"
|
||||
meiliStatus: サーバーステータス
|
||||
serverInfo: サーバー情報
|
||||
meiliSize: インデックスサイズ
|
||||
meiliIndexCount: インデックス済みの投稿
|
||||
_cw:
|
||||
hide: "隠す"
|
||||
show: "もっと見る"
|
||||
|
@ -1854,6 +1881,7 @@ _deck:
|
|||
tl: "タイムライン"
|
||||
antenna: "アンテナ"
|
||||
list: "リスト"
|
||||
channel: "チャンネル"
|
||||
mentions: "あなた宛て"
|
||||
direct: "ダイレクト"
|
||||
noteId: 投稿のID
|
||||
|
@ -1861,14 +1889,15 @@ hiddenTagsDescription: 'トレンドと「みつける」から除外したい
|
|||
hiddenTags: 非表示にするハッシュタグ
|
||||
apps: "アプリ"
|
||||
_experiments:
|
||||
enablePostEditing: 投稿の編集機能を有効にする
|
||||
title: 試験的な機能
|
||||
postEditingCaption: 投稿のメニューに既存の投稿を編集するボタンを表示します。
|
||||
sendModMail: モデレーションノートを送る
|
||||
postImportsCaption:
|
||||
ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。
|
||||
enablePostImports: 投稿のインポートを有効にする
|
||||
sendModMail: モデレーション通知を送る
|
||||
deleted: 削除済み
|
||||
editNote: 投稿を編集
|
||||
edited: 編集済み
|
||||
signupsDisabled:
|
||||
edited: '編集済み: {date} {time}'
|
||||
signupsDisabled:
|
||||
現在、このサーバーでは新規登録が一般開放されていません。招待コードをお持ちの場合には、以下の欄に入力してください。招待コードをお持ちでない場合にも、新規登録を開放している他のサーバーには入れますよ!
|
||||
findOtherInstance: 他のサーバーを探す
|
||||
newer: 新しい投稿
|
||||
|
@ -1877,3 +1906,29 @@ accessibility: アクセシビリティ
|
|||
jumpToPrevious: 前に戻る
|
||||
cw: 閲覧注意
|
||||
silencedWarning: スパムの可能性があるため、これらのユーザーが所属するサーバーは管理者によりサイレンスされています。
|
||||
searchPlaceholder: Calckeyを検索
|
||||
channelFederationWarn: 現時点では、チャンネルは他のサーバーへ連合しません
|
||||
listsDesc: リストでは指定したユーザーだけのタイムラインを作れます。リストには「タイムライン」のページからアクセスできます。
|
||||
antennasDesc: "アンテナでは指定した条件に合致する投稿が表示されます。\nアンテナには「タイムライン」のページからアクセスできます。"
|
||||
expandOnNoteClickDesc: オフの場合、右クリックメニューか日付をクリックすることで開けます。
|
||||
expandOnNoteClick: クリックで投稿の詳細を開く
|
||||
clipsDesc: クリップは分類と共有ができるブックマークです。各投稿のメニューからクリップを作成できます。
|
||||
_dialog:
|
||||
charactersExceeded: "最大文字数を超えています! 現在 {current} / 制限 {max}"
|
||||
charactersBelow: "最小文字数を下回っています! 現在 {current} / 制限 {min}"
|
||||
_filters:
|
||||
followersOnly: フォロワーのみ
|
||||
fromUser: ユーザーを指定
|
||||
withFile: 添付ファイルあり
|
||||
fromDomain: ドメインを指定
|
||||
notesBefore: 指定の日付以前
|
||||
notesAfter: 指定の日付以降
|
||||
followingOnly: フォロー中のみ
|
||||
isModerator: モデレーター
|
||||
audio: 音声
|
||||
image: 画像
|
||||
video: 動画
|
||||
isBot: このアカウントはBotです
|
||||
isLocked: このアカウントのフォローは承認制です
|
||||
isAdmin: 管理者
|
||||
isPatron: Calckey 後援者
|
||||
|
|
|
@ -1179,8 +1179,8 @@ _time:
|
|||
day: "일"
|
||||
_2fa:
|
||||
alreadyRegistered: "이미 설정이 완료되었습니다."
|
||||
registerDevice: "디바이스 등록"
|
||||
registerKey: "키를 등록"
|
||||
registerTOTP: "디바이스 등록"
|
||||
registerSecurityKey: "키를 등록"
|
||||
step1: "먼저, {a}나 {b}등의 인증 앱을 사용 중인 디바이스에 설치합니다."
|
||||
step2: "그 후, 표시되어 있는 QR코드를 앱으로 스캔합니다."
|
||||
step2Url: "데스크톱 앱에서는 다음 URL을 입력하세요:"
|
||||
|
|
|
@ -413,7 +413,7 @@ selectList: Selecteer een lijst
|
|||
selectAntenna: Selecteer een antenne
|
||||
deleted: Verwijderd
|
||||
editNote: Bewerk notitie
|
||||
edited: Bewerkt
|
||||
edited: 'Bewerkt om {date} {time}'
|
||||
emojis: Emojis
|
||||
emojiName: Emoji naam
|
||||
emojiUrl: Emoji URL
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
_lang_: "Polski"
|
||||
headlineMisskey: "Otwartoźródłowa, zdecentralizowana sieć społecznościowa, która zawsze\
|
||||
\ będzie darmowa! \U0001F680"
|
||||
introMisskey: "Hej! Calckey to otwartoźródłowa oraz zdecentralizowana sieć społecznościowa,\
|
||||
\ która zawsze będzie darmowa! \U0001F680"
|
||||
headlineMisskey: "Otwartoźródłowa, zdecentralizowana sieć społecznościowa, która zawsze
|
||||
będzie darmowa! 🚀"
|
||||
introMisskey: "Hej! Calckey to otwartoźródłowa oraz zdecentralizowana sieć społecznościowa,
|
||||
która zawsze będzie darmowa! 🚀"
|
||||
monthAndDay: "{month}-{day}"
|
||||
search: "Szukaj"
|
||||
notifications: "Powiadomienia"
|
||||
|
@ -17,7 +17,7 @@ enterUsername: "Wprowadź nazwę użytkownika"
|
|||
renotedBy: "Podbito przez {user}"
|
||||
noNotes: "Brak wpisów"
|
||||
noNotifications: "Brak powiadomień"
|
||||
instance: "Instancja"
|
||||
instance: "Serwer"
|
||||
settings: "Ustawienia"
|
||||
basicSettings: "Podstawowe ustawienia"
|
||||
otherSettings: "Pozostałe ustawienia"
|
||||
|
@ -45,8 +45,8 @@ copyContent: "Skopiuj zawartość"
|
|||
copyLink: "Skopiuj odnośnik"
|
||||
delete: "Usuń"
|
||||
deleteAndEdit: "Usuń i edytuj"
|
||||
deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz\
|
||||
\ wszystkie reakcje, podbicia i odpowiedzi do tego wpisu."
|
||||
deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz
|
||||
wszystkie reakcje, podbicia i odpowiedzi do tego wpisu."
|
||||
addToList: "Dodaj do listy"
|
||||
sendMessage: "Wyślij wiadomość"
|
||||
copyUsername: "Kopiuj nazwę użytkownika"
|
||||
|
@ -66,11 +66,11 @@ import: "Importuj"
|
|||
export: "Eksportuj"
|
||||
files: "Pliki"
|
||||
download: "Pobierz"
|
||||
driveFileDeleteConfirm: "Czy chcesz usunąć plik \"{name}\"? Wszystkie wpisy zawierające\
|
||||
\ ten plik również zostaną usunięte."
|
||||
driveFileDeleteConfirm: "Czy chcesz usunąć plik \"{name}\"? Wszystkie wpisy zawierające
|
||||
ten plik również zostaną usunięte."
|
||||
unfollowConfirm: "Czy na pewno chcesz przestać obserwować {name}?"
|
||||
exportRequested: "Zażądałeś eksportu. Może to zająć chwilę. Po zakończeniu eksportu\
|
||||
\ zostanie on dodany do Twojego dysku."
|
||||
exportRequested: "Zażądałeś eksportu. Może to zająć chwilę. Po zakończeniu eksportu
|
||||
zostanie on dodany do Twojego dysku."
|
||||
importRequested: "Zażądano importu. Może to zająć chwilę."
|
||||
lists: "Listy"
|
||||
noLists: "Nie masz żadnych list"
|
||||
|
@ -85,8 +85,8 @@ error: "Błąd"
|
|||
somethingHappened: "Coś poszło nie tak"
|
||||
retry: "Spróbuj ponownie"
|
||||
pageLoadError: "Nie udało się załadować strony."
|
||||
pageLoadErrorDescription: "Zwykle jest to spowodowane problemem z siecią lub cache\
|
||||
\ przeglądarki. Spróbuj wyczyścić cache i sprawdź jeszcze raz za chwilę."
|
||||
pageLoadErrorDescription: "Zwykle jest to spowodowane problemem z siecią lub cache
|
||||
przeglądarki. Spróbuj wyczyścić cache i sprawdź jeszcze raz za chwilę."
|
||||
serverIsDead: "Serwer nie odpowiada. Zaczekaj chwilę i spróbuj ponownie."
|
||||
youShouldUpgradeClient: "Aby zobaczyć tą stronę, odśwież ją, by zaaktualizować klienta."
|
||||
enterListName: "Wpisz nazwę listy"
|
||||
|
@ -113,8 +113,8 @@ sensitive: "NSFW"
|
|||
add: "Dodaj"
|
||||
reaction: "Reakcja"
|
||||
reactionSetting: "Reakcje do pokazania w wyborniku reakcji"
|
||||
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć,\
|
||||
\ naciśnij „+” aby dodać."
|
||||
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć,
|
||||
naciśnij „+” aby dodać."
|
||||
rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu"
|
||||
attachCancel: "Usuń załącznik"
|
||||
markAsSensitive: "Oznacz jako NSFW"
|
||||
|
@ -143,22 +143,22 @@ emojiUrl: "Adres URL emoji"
|
|||
addEmoji: "Dodaj emoji"
|
||||
settingGuide: "Proponowana konfiguracja"
|
||||
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
|
||||
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane\
|
||||
\ bezpośrednio ze zdalnych instancji. Wyłączenie the opcji zmniejszy użycie powierzchni\
|
||||
\ dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
|
||||
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane
|
||||
bezpośrednio ze zdalnego serwera. Wyłączenie tej opcji zmniejszy użycie powierzchni
|
||||
dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
|
||||
flagAsBot: "To konto jest botem"
|
||||
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw\
|
||||
\ tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów,\
|
||||
\ aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne\
|
||||
\ systemy Calckey, traktując konto jako bota."
|
||||
flagAsCat: "Czy jesteś kotem? \U0001F63A"
|
||||
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw
|
||||
tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów,
|
||||
aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne
|
||||
systemy Calckey, traktując konto jako bota."
|
||||
flagAsCat: "Czy jesteś kotem? 😺"
|
||||
flagAsCatDescription: "Dostaniesz kocie uszka, oraz będziesz mówić jak kot!"
|
||||
flagShowTimelineReplies: "Pokazuj odpowiedzi na osi czasu"
|
||||
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników,\
|
||||
\ których obserwujesz"
|
||||
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników,
|
||||
których obserwujesz"
|
||||
addAccount: "Dodaj konto"
|
||||
loginFailed: "Nie udało się zalogować"
|
||||
showOnRemote: "Zobacz na zdalnej instancji"
|
||||
showOnRemote: "Zobacz na zdalnym serwerze"
|
||||
general: "Ogólne"
|
||||
wallpaper: "Tapeta"
|
||||
setWallpaper: "Ustaw tapetę"
|
||||
|
@ -172,7 +172,7 @@ selectUser: "Wybierz użytkownika"
|
|||
recipient: "Odbiorca(-y)"
|
||||
annotation: "Komentarze"
|
||||
federation: "Federacja"
|
||||
instances: "Instancja"
|
||||
instances: "Serwery"
|
||||
registeredAt: "Zarejestrowano"
|
||||
latestRequestSentAt: "Ostatnie żądanie wysłano o"
|
||||
latestRequestReceivedAt: "Ostatnie żądanie otrzymano o"
|
||||
|
@ -182,7 +182,7 @@ charts: "Wykresy"
|
|||
perHour: "co godzinę"
|
||||
perDay: "co dzień"
|
||||
stopActivityDelivery: "Przestań przesyłać aktywności"
|
||||
blockThisInstance: "Zablokuj tę instancję"
|
||||
blockThisInstance: "Zablokuj ten serwer"
|
||||
operations: "Działania"
|
||||
software: "Oprogramowanie"
|
||||
version: "Wersja"
|
||||
|
@ -192,18 +192,18 @@ jobQueue: "Kolejka zadań"
|
|||
cpuAndMemory: "CPU i pamięć"
|
||||
network: "Sieć"
|
||||
disk: "Dysk"
|
||||
instanceInfo: "Informacje o instancji"
|
||||
instanceInfo: "Informacje o serwerze"
|
||||
statistics: "Statystyki"
|
||||
clearQueue: "Wyczyść kolejkę"
|
||||
clearQueueConfirmTitle: "Czy na pewno chcesz wyczyścić kolejkę?"
|
||||
clearQueueConfirmText: "Wszystkie niewysłane wpisy z kolejki nie zostaną wysłane.\
|
||||
\ Zwykle to nie jest konieczne."
|
||||
clearQueueConfirmText: "Wszystkie niewysłane wpisy z kolejki nie zostaną wysłane.
|
||||
Zwykle to nie jest konieczne."
|
||||
clearCachedFiles: "Wyczyść pamięć podręczną"
|
||||
clearCachedFilesConfirm: "Czy na pewno chcesz usunąć wszystkie zdalne pliki z pamięci\
|
||||
\ podręcznej?"
|
||||
blockedInstances: "Zablokowane instancje"
|
||||
blockedInstancesDescription: "Wypisz nazwy hostów instancji, które powinny zostać\
|
||||
\ zablokowane. Wypisane instancje nie będą mogły dłużej komunikować się z tą instancją."
|
||||
clearCachedFilesConfirm: "Czy na pewno chcesz usunąć wszystkie zdalne pliki z pamięci
|
||||
podręcznej?"
|
||||
blockedInstances: "Zablokowane serwery"
|
||||
blockedInstancesDescription: "Wypisz nazwy hostów serwerów, które chcesz zablokować.
|
||||
Wymienione serwery nie będą mogły dłużej komunikować się z tym serwerem."
|
||||
muteAndBlock: "Wyciszenia i blokady"
|
||||
mutedUsers: "Wyciszeni użytkownicy"
|
||||
blockedUsers: "Zablokowani użytkownicy"
|
||||
|
@ -213,7 +213,7 @@ noteDeleteConfirm: "Czy na pewno chcesz usunąć ten wpis?"
|
|||
pinLimitExceeded: "Nie możesz przypiąć więcej wpisów"
|
||||
intro: "Zakończono instalację Calckey! Utwórz konto administratora."
|
||||
done: "Gotowe"
|
||||
processing: "Przetwarzanie..."
|
||||
processing: "Przetwarzanie"
|
||||
preview: "Podgląd"
|
||||
default: "Domyślne"
|
||||
defaultValueIs: "Domyślne: {value}"
|
||||
|
@ -226,9 +226,9 @@ all: "Wszystkie"
|
|||
subscribing: "Subskrybowanie"
|
||||
publishing: "Publikowanie"
|
||||
notResponding: "Nie odpowiada"
|
||||
instanceFollowing: "Obserwowani na instancji"
|
||||
instanceFollowers: "Obserwujący na instancji"
|
||||
instanceUsers: "Użytkownicy tej instancji"
|
||||
instanceFollowing: "Obserwowani na serwerze"
|
||||
instanceFollowers: "Obserwujący na serwerze"
|
||||
instanceUsers: "Użytkownicy tego serwera"
|
||||
changePassword: "Zmień hasło"
|
||||
security: "Bezpieczeństwo"
|
||||
retypedNotMatch: "Wejście nie zgadza się."
|
||||
|
@ -267,8 +267,8 @@ agreeTo: "Wyrażam zgodę na {0}"
|
|||
tos: "Regulamin"
|
||||
start: "Rozpocznij"
|
||||
home: "Strona główna"
|
||||
remoteUserCaution: "Te informacje mogą nie być aktualne, ponieważ użytkownik pochodzi\
|
||||
\ ze zdalnej instancji."
|
||||
remoteUserCaution: "Te informacje mogą nie być aktualne, ponieważ użytkownik pochodzi
|
||||
ze zdalnej instancji."
|
||||
activity: "Aktywność"
|
||||
images: "Zdjęcia"
|
||||
birthday: "Data urodzenia"
|
||||
|
@ -301,8 +301,8 @@ unableToDelete: "Nie można usunąć"
|
|||
inputNewFileName: "Wprowadź nową nazwę pliku"
|
||||
inputNewDescription: "Proszę wpisać nowy napis"
|
||||
inputNewFolderName: "Wprowadź nową nazwę katalogu"
|
||||
circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz\
|
||||
\ przenieść."
|
||||
circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz
|
||||
przenieść."
|
||||
hasChildFilesOrFolders: "Ponieważ ten katalog nie jest pusty, nie może być usunięty."
|
||||
copyUrl: "Skopiuj adres URL"
|
||||
rename: "Zmień nazwę"
|
||||
|
@ -319,8 +319,8 @@ unwatch: "Przestań śledzić"
|
|||
accept: "Akceptuj"
|
||||
reject: "Odrzuć"
|
||||
normal: "Normalny"
|
||||
instanceName: "Nazwa instancji"
|
||||
instanceDescription: "Opis instancji"
|
||||
instanceName: "Nazwa serwera"
|
||||
instanceDescription: "Opis serwera"
|
||||
maintainerName: "Administrator"
|
||||
maintainerEmail: "E-mail administratora"
|
||||
tosUrl: "Adres URL regulaminu"
|
||||
|
@ -336,8 +336,8 @@ connectService: "Połącz"
|
|||
disconnectService: "Rozłącz"
|
||||
enableLocalTimeline: "Włącz lokalną oś czasu"
|
||||
enableGlobalTimeline: "Włącz globalną oś czasu"
|
||||
disablingTimelinesInfo: "Administratorzy i moderatorzy będą zawsze mieć dostęp do\
|
||||
\ wszystkich osi czasu, nawet gdy są one wyłączone."
|
||||
disablingTimelinesInfo: "Administratorzy i moderatorzy będą zawsze mieć dostęp do
|
||||
wszystkich osi czasu, nawet gdy są one wyłączone."
|
||||
registration: "Zarejestruj się"
|
||||
enableRegistration: "Włącz rejestrację nowych użytkowników"
|
||||
invite: "Zaproś"
|
||||
|
@ -349,11 +349,11 @@ bannerUrl: "Adres URL banera"
|
|||
backgroundImageUrl: "Adres URL tła"
|
||||
basicInfo: "Podstawowe informacje"
|
||||
pinnedUsers: "Przypięty użytkownik"
|
||||
pinnedUsersDescription: "Wypisz po jednej nazwie użytkownika w wierszu. Podani użytkownicy\
|
||||
\ zostaną przypięci pod kartą „Eksploruj”."
|
||||
pinnedUsersDescription: "Wypisz po jednej nazwie użytkownika w wierszu. Podani użytkownicy
|
||||
zostaną przypięci pod kartą „Eksploruj”."
|
||||
pinnedPages: "Przypięte strony"
|
||||
pinnedPagesDescription: "Wprowadź ścieżki stron które chcesz przypiąć na głównej stronie\
|
||||
\ instancji, oddzielone znakiem nowego wiersza."
|
||||
pinnedPagesDescription: "Wprowadź ścieżki stron, które chcesz przypiąć do górnej strony
|
||||
tego serwera, oddzielając je znakami końca wiersza."
|
||||
pinnedClipId: "ID przypiętego klipu"
|
||||
pinnedNotes: "Przypięty wpis"
|
||||
hcaptcha: "hCaptcha"
|
||||
|
@ -364,16 +364,16 @@ recaptcha: "reCAPTCHA"
|
|||
enableRecaptcha: "Włącz reCAPTCHA"
|
||||
recaptchaSiteKey: "Klucz strony"
|
||||
recaptchaSecretKey: "Tajny klucz"
|
||||
avoidMultiCaptchaConfirm: "Używanie wielu Captchy może spowodować zakłócenia. Czy\
|
||||
\ chcesz wyłączyć inną Captchę? Możesz zostawić wiele jednocześnie, klikając Anuluj."
|
||||
avoidMultiCaptchaConfirm: "Używanie wielu Captchy może spowodować zakłócenia. Czy
|
||||
chcesz wyłączyć inną Captchę? Możesz zostawić wiele jednocześnie, klikając Anuluj."
|
||||
antennas: "Anteny"
|
||||
manageAntennas: "Zarządzaj antenami"
|
||||
name: "Nazwa"
|
||||
antennaSource: "Źródło anteny"
|
||||
antennaKeywords: "Słowa kluczowe do obserwacji"
|
||||
antennaExcludeKeywords: "Wykluczone słowa kluczowe"
|
||||
antennaKeywordsDescription: "Oddziel spacjami dla warunku AND, albo wymuś koniec linii\
|
||||
\ dla warunku OR."
|
||||
antennaKeywordsDescription: "Oddziel spacjami dla warunku AND, albo wymuś koniec linii
|
||||
dla warunku OR."
|
||||
notifyAntenna: "Powiadamiaj o nowych wpisach"
|
||||
withFileAntenna: "Filtruj tylko wpisy z załączonym plikiem"
|
||||
enableServiceworker: "Włącz powiadomienia push dla twojej przeglądarki"
|
||||
|
@ -461,8 +461,8 @@ strongPassword: "Silne hasło"
|
|||
passwordMatched: "Pasuje"
|
||||
passwordNotMatched: "Hasła nie pasują do siebie"
|
||||
signinWith: "Zaloguj się z {x}"
|
||||
signinFailed: "Nie udało się zalogować. Wprowadzona nazwa użytkownika lub hasło są\
|
||||
\ nieprawidłowe."
|
||||
signinFailed: "Nie udało się zalogować. Wprowadzona nazwa użytkownika lub hasło są
|
||||
nieprawidłowe."
|
||||
tapSecurityKey: "Wybierz swój klucz bezpieczeństwa"
|
||||
or: "Lub"
|
||||
language: "Język"
|
||||
|
@ -508,18 +508,18 @@ objectStorageBucketDesc: "Podaj nazwę „wiadra” używaną przez konfigurowan
|
|||
objectStoragePrefix: "Prefiks"
|
||||
objectStoragePrefixDesc: "Pliki będą przechowywane w katalogu z tym prefiksem."
|
||||
objectStorageEndpoint: "Punkt końcowy"
|
||||
objectStorageEndpointDesc: "Pozostaw puste jeżeli używasz AWS S3, w innym wypadku\
|
||||
\ określ punkt końcowy jako '<host>' lub '<host>:<port>' zgodnie z instrukcjami\
|
||||
\ usługi, której używasz."
|
||||
objectStorageEndpointDesc: "Pozostaw puste jeżeli używasz AWS S3, w innym wypadku
|
||||
określ punkt końcowy jako '<host>' lub '<host>:<port>' zgodnie z instrukcjami usługi,
|
||||
której używasz."
|
||||
objectStorageRegion: "Region"
|
||||
objectStorageRegionDesc: "Określ region, np. 'xx-east-1'. Jeżeli usługa której używasz\
|
||||
\ nie zawiera rozróżnienia regionów, pozostaw to pustym lub wprowadź 'us-east-1'."
|
||||
objectStorageRegionDesc: "Określ region, np. 'xx-east-1'. Jeżeli usługa której używasz
|
||||
nie zawiera rozróżnienia regionów, pozostaw to pustym lub wprowadź 'us-east-1'."
|
||||
objectStorageUseSSL: "Użyj SSL"
|
||||
objectStorageUseSSLDesc: "Wyłącz, jeżeli nie zamierzasz używać HTTPS dla połączenia\
|
||||
\ z API"
|
||||
objectStorageUseSSLDesc: "Wyłącz, jeżeli nie zamierzasz używać HTTPS dla połączenia
|
||||
z API"
|
||||
objectStorageUseProxy: "Połącz przez proxy"
|
||||
objectStorageUseProxyDesc: "Wyłącz, jeżeli nie zamierzasz używać proxy dla połączenia\
|
||||
\ z pamięcią blokową"
|
||||
objectStorageUseProxyDesc: "Wyłącz, jeżeli nie zamierzasz używać proxy dla połączenia
|
||||
z pamięcią blokową"
|
||||
serverLogs: "Dziennik zdarzeń"
|
||||
deleteAll: "Usuń wszystkie"
|
||||
showFixedPostForm: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||
|
@ -546,22 +546,22 @@ sort: "Sortuj"
|
|||
ascendingOrder: "Rosnąco"
|
||||
descendingOrder: "Malejąco"
|
||||
scratchpad: "Brudnopis"
|
||||
scratchpadDescription: "Brudnopis to środowisko dla eksperymentów z AiScript. Możesz\
|
||||
\ pisać, wykonywać i sprawdzać wyniki interakcji skryptu z Calckey."
|
||||
scratchpadDescription: "Brudnopis to środowisko dla eksperymentów z AiScript. Możesz
|
||||
pisać, wykonywać i sprawdzać wyniki interakcji skryptu z Calckey."
|
||||
output: "Wyjście"
|
||||
script: "Skrypt"
|
||||
disablePagesScript: "Wyłącz AiScript na Stronach"
|
||||
updateRemoteUser: "Aktualizuj zdalne dane o użytkowniku"
|
||||
deleteAllFiles: "Usuń wszystkie pliki"
|
||||
deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
|
||||
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj\
|
||||
\ to, jeżeli instancja już nie istnieje."
|
||||
removeAllFollowingDescription: "Wykonanie tego polecenia spowoduje usunięcie wszystkich
|
||||
kont z {host}. Zrób to, jeśli serwer np. już nie istnieje."
|
||||
userSuspended: "To konto zostało zawieszone."
|
||||
userSilenced: "Ten użytkownik został wyciszony."
|
||||
yourAccountSuspendedTitle: "To konto jest zawieszone"
|
||||
yourAccountSuspendedDescription: "To konto zostało zawieszone z powodu złamania regulaminu\
|
||||
\ serwera lub innych podobnych. Skontaktuj się z administratorem, jeśli chciałbyś\
|
||||
\ poznać bardziej szczegółowy powód. Proszę nie zakładać nowego konta."
|
||||
yourAccountSuspendedDescription: "To konto zostało zawieszone z powodu złamania regulaminu
|
||||
serwera lub innych podobnych. Skontaktuj się z administratorem, jeśli chciałbyś
|
||||
poznać bardziej szczegółowy powód. Proszę nie zakładać nowego konta."
|
||||
menu: "Menu"
|
||||
divider: "Rozdzielacz"
|
||||
addItem: "Dodaj element"
|
||||
|
@ -600,14 +600,14 @@ permission: "Uprawnienia"
|
|||
enableAll: "Włącz wszystko"
|
||||
disableAll: "Wyłącz wszystko"
|
||||
tokenRequested: "Przydziel dostęp do konta"
|
||||
pluginTokenRequestedDescription: "Ta wtyczka będzie mogła korzystać z ustawionych\
|
||||
\ tu uprawnień."
|
||||
pluginTokenRequestedDescription: "Ta wtyczka będzie mogła korzystać z ustawionych
|
||||
tu uprawnień."
|
||||
notificationType: "Rodzaj powiadomień"
|
||||
edit: "Edytuj"
|
||||
emailServer: "Serwer poczty e-mail"
|
||||
enableEmail: "Włącz dostarczanie wiadomości e-mail"
|
||||
emailConfigInfo: "Wykorzystywany do potwierdzenia adresu e-mail w trakcie rejestracji,\
|
||||
\ lub gdy zapomnisz hasła"
|
||||
emailConfigInfo: "Wykorzystywany do potwierdzenia adresu e-mail w trakcie rejestracji,
|
||||
lub gdy zapomnisz hasła"
|
||||
email: "Adres e-mail"
|
||||
emailAddress: "Adres e-mail"
|
||||
smtpConfig: "Konfiguracja serwera SMTP"
|
||||
|
@ -615,12 +615,12 @@ smtpHost: "Host"
|
|||
smtpPort: "Port"
|
||||
smtpUser: "Nazwa użytkownika"
|
||||
smtpPass: "Hasło"
|
||||
emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację\
|
||||
\ SMTP"
|
||||
emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację
|
||||
SMTP"
|
||||
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
|
||||
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
|
||||
wordMute: "Wyciszenie słowa"
|
||||
instanceMute: "Wyciszone instancje"
|
||||
instanceMute: "Wyciszenie serwera"
|
||||
userSaysSomething: "{name} powiedział* coś"
|
||||
makeActive: "Aktywuj"
|
||||
display: "Wyświetlanie"
|
||||
|
@ -635,12 +635,12 @@ create: "Utwórz"
|
|||
notificationSetting: "Ustawienia powiadomień"
|
||||
notificationSettingDesc: "Wybierz rodzaj powiadomień do wyświetlania."
|
||||
useGlobalSetting: "Użyj globalnych ustawień"
|
||||
useGlobalSettingDesc: "Jeżeli włączone, zostaną wykorzystane ustawienia powiadomień\
|
||||
\ Twojego konta. Jeżeli wyłączone, mogą zostać wykonane oddzielne konfiguracje."
|
||||
useGlobalSettingDesc: "Jeżeli włączone, zostaną wykorzystane ustawienia powiadomień
|
||||
Twojego konta. Jeżeli wyłączone, mogą zostać wykonane oddzielne konfiguracje."
|
||||
other: "Inne"
|
||||
regenerateLoginToken: "Generuj token logowania ponownie"
|
||||
regenerateLoginTokenDescription: "Regeneruje token używany wewnętrznie podczas logowania.\
|
||||
\ Zazwyczaj nie jest to konieczne. Po regeneracji wszystkie urządzenia zostaną wylogowane."
|
||||
regenerateLoginTokenDescription: "Regeneruje token używany wewnętrznie podczas logowania.
|
||||
Zazwyczaj nie jest to konieczne. Po regeneracji wszystkie urządzenia zostaną wylogowane."
|
||||
setMultipleBySeparatingWithSpace: "Możesz ustawić wiele, oddzielając je spacjami."
|
||||
fileIdOrUrl: "ID pliku albo URL"
|
||||
behavior: "Zachowanie"
|
||||
|
@ -648,19 +648,19 @@ sample: "Przykład"
|
|||
abuseReports: "Zgłoszenia"
|
||||
reportAbuse: "Zgłoś"
|
||||
reportAbuseOf: "Zgłoś {name}"
|
||||
fillAbuseReportDescription: "Wypełnij szczegóły zgłoszenia. Jeżeli dotyczy ono określonego\
|
||||
\ wpisu, uwzględnij jego adres URL."
|
||||
fillAbuseReportDescription: "Wypełnij szczegóły zgłoszenia. Jeżeli dotyczy ono określonego
|
||||
wpisu, uwzględnij jego adres URL."
|
||||
abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy."
|
||||
reporteeOrigin: "Pochodzenie osoby zgłoszonej"
|
||||
reporterOrigin: "Pochodzenie osoby zgłaszającej"
|
||||
forwardReport: "Przekaż zgłoszenie do innej instancji"
|
||||
forwardReport: "Przekaż zgłoszenie do zdalnego serwera"
|
||||
send: "Wyślij"
|
||||
abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
|
||||
openInNewTab: "Otwórz w nowej karcie"
|
||||
openInSideView: "Otwórz w bocznym widoku"
|
||||
defaultNavigationBehaviour: "Domyślne zachowanie nawigacji"
|
||||
editTheseSettingsMayBreakAccount: "Edycja tych ustawień może uszkodzić Twoje konto."
|
||||
instanceTicker: "Informacje o wpisach instancji"
|
||||
instanceTicker: "Informacje o wpisach serwera"
|
||||
waitingFor: "Oczekiwanie na {x}"
|
||||
random: "Losowe"
|
||||
system: "System"
|
||||
|
@ -671,11 +671,11 @@ createNew: "Utwórz nowy"
|
|||
optional: "Nieobowiązkowe"
|
||||
createNewClip: "Utwórz nowy klip"
|
||||
unclip: "Odczep"
|
||||
confirmToUnclipAlreadyClippedNote: "Ten wpis jest już częścią klipu \"{name}\". Czy\
|
||||
\ chcesz ją usunąć z tego klipu?"
|
||||
confirmToUnclipAlreadyClippedNote: "Ten wpis jest już częścią klipu \"{name}\". Czy
|
||||
chcesz ją usunąć z tego klipu?"
|
||||
public: "Publiczny"
|
||||
i18nInfo: "Calckey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc\
|
||||
\ na {link}."
|
||||
i18nInfo: "Calckey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc
|
||||
na {link}."
|
||||
manageAccessTokens: "Zarządzaj tokenami dostępu"
|
||||
accountInfo: "Informacje o koncie"
|
||||
notesCount: "Liczba wpisów"
|
||||
|
@ -694,16 +694,15 @@ no: "Nie"
|
|||
driveFilesCount: "Liczba plików na dysku"
|
||||
driveUsage: "Użycie przestrzeni dyskowej"
|
||||
noCrawle: "Odrzuć indeksowanie przez crawlery"
|
||||
noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twojego profilu,\
|
||||
\ wpisów, stron itd."
|
||||
lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\", twoje\
|
||||
\ wpisy będą mogli widzieć wszyscy, nawet jeśli ustawisz manualne zatwierdzanie\
|
||||
\ obserwujących."
|
||||
noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twojego profilu,
|
||||
wpisów, stron itd."
|
||||
lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\", twoje
|
||||
wpisy będą mogli widzieć wszyscy, nawet jeśli ustawisz manualne zatwierdzanie obserwujących."
|
||||
alwaysMarkSensitive: "Oznacz domyślnie jako NSFW"
|
||||
loadRawImages: "Wyświetlaj zdjęcia w załącznikach w całości zamiast miniatur"
|
||||
disableShowingAnimatedImages: "Nie odtwarzaj animowanych obrazów"
|
||||
verificationEmailSent: "Wiadomość weryfikacyjna została wysłana. Odwiedź uwzględniony\
|
||||
\ odnośnik, aby ukończyć weryfikację."
|
||||
verificationEmailSent: "Wiadomość weryfikacyjna została wysłana. Odwiedź uwzględniony
|
||||
odnośnik, aby ukończyć weryfikację."
|
||||
notSet: "Nie ustawiono"
|
||||
emailVerified: "Adres e-mail został potwierdzony"
|
||||
noteFavoritesCount: "Liczba zakładek"
|
||||
|
@ -715,16 +714,16 @@ clips: "Klipy"
|
|||
experimentalFeatures: "Eksperymentalne funkcje"
|
||||
developer: "Programista"
|
||||
makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
|
||||
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać\
|
||||
\ się w sekcji „Eksploruj”."
|
||||
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać
|
||||
się w sekcji „Eksploruj”."
|
||||
showGapBetweenNotesInTimeline: "Pokazuj odstęp między wpisami na osi czasu"
|
||||
duplicate: "Duplikuj"
|
||||
left: "Lewo"
|
||||
center: "Wyśrodkuj"
|
||||
wide: "Szerokie"
|
||||
narrow: "Wąskie"
|
||||
reloadToApplySetting: "To ustawienie zostanie zastosowane po odświeżeniu strony. Chcesz\
|
||||
\ odświeżyć?"
|
||||
reloadToApplySetting: "To ustawienie zostanie zastosowane po odświeżeniu strony. Chcesz
|
||||
odświeżyć?"
|
||||
needReloadToApply: "To ustawienie zostanie zastosowane po odświeżeniu strony."
|
||||
showTitlebar: "Pokazuj pasek tytułowy"
|
||||
clearCache: "Wyczyść pamięć podręczną"
|
||||
|
@ -755,7 +754,7 @@ capacity: "Pojemność"
|
|||
inUse: "Użyto"
|
||||
editCode: "Edytuj kod"
|
||||
apply: "Zastosuj"
|
||||
receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tej instancji"
|
||||
receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tego serwera"
|
||||
emailNotification: "Powiadomienia e-mail"
|
||||
publish: "Publikuj"
|
||||
inChannelSearch: "Szukaj na kanale"
|
||||
|
@ -772,21 +771,21 @@ quitFullView: "Opuść pełny widok"
|
|||
addDescription: "Dodaj opis"
|
||||
userPagePinTip: "Możesz wyświetlać wpisy w tym miejscu po wybraniu \"Przypnij do profilu\"\
|
||||
\ z menu pojedynczego wpisu."
|
||||
notSpecifiedMentionWarning: "Ten wpis zawiera wzmianki o użytkownikach niezawartych\
|
||||
\ jako odbiorcy"
|
||||
notSpecifiedMentionWarning: "Ten wpis zawiera wzmianki o użytkownikach niezawartych
|
||||
jako odbiorcy"
|
||||
info: "Informacje"
|
||||
userInfo: "Informacje o użykowniku"
|
||||
unknown: "Nieznane"
|
||||
onlineStatus: "Status online"
|
||||
hideOnlineStatus: "Ukryj status online"
|
||||
hideOnlineStatusDescription: "Ukrywanie statusu online ogranicza wygody niektórych\
|
||||
\ funkcji, takich jak wyszukiwanie."
|
||||
hideOnlineStatusDescription: "Ukrywanie statusu online ogranicza wygody niektórych
|
||||
funkcji, takich jak wyszukiwanie."
|
||||
online: "Online"
|
||||
active: "Aktywny"
|
||||
offline: "Offline"
|
||||
notRecommended: "Nie zalecane"
|
||||
botProtection: "Zabezpieczenie przed botami"
|
||||
instanceBlocking: "Zablokowane/wyciszone instancje"
|
||||
instanceBlocking: "Zarządzanie federacją"
|
||||
selectAccount: "Wybierz konto"
|
||||
switchAccount: "Przełącz konto"
|
||||
enabled: "Właczono"
|
||||
|
@ -815,8 +814,8 @@ emailNotConfiguredWarning: "Nie podano adresu e-mail."
|
|||
ratio: "Stosunek"
|
||||
previewNoteText: "Pokaż podgląd"
|
||||
customCss: "Własny CSS"
|
||||
customCssWarn: "Używaj tego ustawienia tylko wtedy, gdy wiesz co ono robi. Nieprawidłowe\
|
||||
\ wpisy mogą spowodować, że klient przestanie działać poprawnie."
|
||||
customCssWarn: "Używaj tego ustawienia tylko wtedy, gdy wiesz co ono robi. Nieprawidłowe
|
||||
wpisy mogą spowodować, że klient przestanie działać poprawnie."
|
||||
global: "Globalna"
|
||||
squareAvatars: "Wyświetlaj kwadratowe awatary"
|
||||
sent: "Wysłane"
|
||||
|
@ -832,8 +831,8 @@ translate: "Przetłumacz"
|
|||
translatedFrom: "Przetłumaczone z {x}"
|
||||
accountDeletionInProgress: "Trwa usuwanie konta"
|
||||
usernameInfo: "Nazwa, która identyfikuje Twoje konto spośród innych na tym serwerze.\
|
||||
\ Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika\
|
||||
\ nie mogą być później zmieniane."
|
||||
\ Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika
|
||||
nie mogą być później zmieniane."
|
||||
aiChanMode: "Ai-chan w klasycznym interfejsie"
|
||||
keepCw: "Zostaw ostrzeżenia o zawartości"
|
||||
pubSub: "Konta Pub/Sub"
|
||||
|
@ -847,14 +846,14 @@ filter: "Filtr"
|
|||
controlPanel: "Panel sterowania"
|
||||
manageAccounts: "Zarządzaj kontami"
|
||||
makeReactionsPublic: "Ustaw historię reakcji jako publiczną"
|
||||
makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotychczasowych\
|
||||
\ reakcji będzie publicznie widoczna."
|
||||
classic: "Klasyczny"
|
||||
makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotychczasowych
|
||||
reakcji będzie publicznie widoczna."
|
||||
classic: "Wyśrodkowany"
|
||||
muteThread: "Wycisz wątek"
|
||||
unmuteThread: "Wyłącz wyciszenie wątku"
|
||||
ffVisibility: "Widoczność obserwowanych/obserwujących"
|
||||
ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz\
|
||||
\ i kto Cię obserwuje."
|
||||
ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz
|
||||
i kto Cię obserwuje."
|
||||
continueThread: "Kontynuuj wątek"
|
||||
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
|
||||
incorrectPassword: "Nieprawidłowe hasło."
|
||||
|
@ -862,8 +861,8 @@ voteConfirm: "Potwierdzić swój głos na \"{choice}\"?"
|
|||
hide: "Ukryj"
|
||||
leaveGroup: "Opuść grupę"
|
||||
leaveGroupConfirm: "Czy na pewno chcesz opuścić \"{name}\"?"
|
||||
useDrawerReactionPickerForMobile: "Wyświetlaj wybornik reakcji jako szufladę na urządzeniach\
|
||||
\ mobilnych"
|
||||
useDrawerReactionPickerForMobile: "Wyświetlaj wybornik reakcji jako szufladę na urządzeniach
|
||||
mobilnych"
|
||||
welcomeBackWithName: "Witaj z powrotem, {name}"
|
||||
clickToFinishEmailVerification: "Kliknij [{ok}], aby zakończyć weryfikację e-mail."
|
||||
overridedDeviceKind: "Typ urządzenia"
|
||||
|
@ -886,22 +885,22 @@ type: "Typ"
|
|||
speed: "Prędkość"
|
||||
localOnly: "Tylko lokalne"
|
||||
failedToUpload: "Przesyłanie nie powiodło się"
|
||||
cannotUploadBecauseInappropriate: "Nie można przesłać tego pliku, ponieważ jego części\
|
||||
\ zostały wykryte jako potencjalnie nieodpowiednie."
|
||||
cannotUploadBecauseNoFreeSpace: "Przesyłanie nie powiodło się z powodu braku miejsca\
|
||||
\ na dysku."
|
||||
cannotUploadBecauseInappropriate: "Nie można przesłać tego pliku, ponieważ jego części
|
||||
zostały wykryte jako potencjalnie nieodpowiednie."
|
||||
cannotUploadBecauseNoFreeSpace: "Przesyłanie nie powiodło się z powodu braku miejsca
|
||||
na dysku."
|
||||
beta: "Beta"
|
||||
enableAutoSensitive: "Automatyczne oznaczanie NSFW"
|
||||
enableAutoSensitiveDescription: "Umożliwia automatyczne wykrywanie i oznaczanie zawartości\
|
||||
\ NSFW za pomocą uczenia maszynowego. Nawet jeśli ta opcja jest wyłączona, może\
|
||||
\ być włączona na całej instancji."
|
||||
enableAutoSensitiveDescription: "Umożliwia automatyczne wykrywanie i oznaczanie zawartości
|
||||
NSFW za pomocą uczenia maszynowego tam, gdzie to możliwe. Nawet jeśli ta opcja jest
|
||||
wyłączona, może być włączona na całym serwerze."
|
||||
navbar: "Pasek nawigacyjny"
|
||||
account: "Konta"
|
||||
move: "Przenieś"
|
||||
_sensitiveMediaDetection:
|
||||
description: "Zmniejsza wysiłek związany z moderacją serwera dzięki automatycznemu\
|
||||
\ rozpoznawaniu zawartości NSFW za pomocą uczenia maszynowego. To nieznacznie\
|
||||
\ zwiększy obciążenie serwera."
|
||||
description: "Zmniejsza wysiłek związany z moderacją serwera dzięki automatycznemu
|
||||
rozpoznawaniu zawartości NSFW za pomocą uczenia maszynowego. To nieznacznie zwiększy
|
||||
obciążenie serwera."
|
||||
setSensitiveFlagAutomatically: "Oznacz jako NSFW"
|
||||
sensitivity: Czułość wykrywania
|
||||
analyzeVideosDescription: Analizuje filmy, w dodatku do zdjęć. Zwiększy to nieznacznie
|
||||
|
@ -925,15 +924,15 @@ _ffVisibility:
|
|||
_signup:
|
||||
almostThere: "Prawie na miejscu"
|
||||
emailAddressInfo: "Podaj swój adres e-mail. Nie zostanie on upubliczniony."
|
||||
emailSent: "E-mail z potwierdzeniem został wysłany na Twój adres e-mail ({email}).\
|
||||
\ Kliknij dołączony link, aby dokończyć tworzenie konta."
|
||||
emailSent: "E-mail z potwierdzeniem został wysłany na Twój adres e-mail ({email}).
|
||||
Kliknij dołączony link, aby dokończyć tworzenie konta."
|
||||
_accountDelete:
|
||||
accountDelete: "Usuń konto"
|
||||
mayTakeTime: "Ponieważ usuwanie konta jest procesem wymagającym dużej ilości zasobów,\
|
||||
\ jego ukończenie może zająć trochę czasu, w zależności od ilości utworzonej zawartości\
|
||||
\ i liczby przesłanych plików."
|
||||
sendEmail: "Po zakończeniu usuwania konta na adres e-mail zarejestrowany na tym\
|
||||
\ koncie zostanie wysłana wiadomość e-mail."
|
||||
mayTakeTime: "Ponieważ usuwanie konta jest procesem wymagającym dużej ilości zasobów,
|
||||
jego ukończenie może zająć trochę czasu, w zależności od ilości utworzonej zawartości
|
||||
i liczby przesłanych plików."
|
||||
sendEmail: "Po zakończeniu usuwania konta na adres e-mail zarejestrowany na tym
|
||||
koncie zostanie wysłana wiadomość e-mail."
|
||||
requestAccountDelete: "Poproś o usunięcie konta"
|
||||
started: "Usuwanie się rozpoczęło."
|
||||
inProgress: "Usuwanie jest obecnie w toku"
|
||||
|
@ -941,12 +940,12 @@ _ad:
|
|||
back: "Wróć"
|
||||
reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej"
|
||||
_forgotPassword:
|
||||
enterEmail: "Wpisz adres e-mail użyty do rejestracji. Zostanie do niego wysłany\
|
||||
\ link, za pomocą którego możesz zresetować hasło."
|
||||
ifNoEmail: "Jeżeli nie podano adresu e-mail podczas rejestracji, skontaktuj się\
|
||||
\ z administratorem zamiast tego."
|
||||
contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się\
|
||||
\ zamiast tego z administratorem, aby zresetować hasło."
|
||||
enterEmail: "Wpisz adres e-mail użyty do rejestracji. Zostanie do niego wysłany
|
||||
link, za pomocą którego możesz zresetować hasło."
|
||||
ifNoEmail: "Jeśli nie użyłeś adresu e-mail podczas rejestracji, skontaktuj się z
|
||||
administratorem serwera."
|
||||
contactAdmin: "Ten serwer nie obsługuje adresów e-mail, zamiast tego skontaktuj
|
||||
się z administratorem serwera, aby zresetować hasło."
|
||||
_gallery:
|
||||
my: "Moja galeria"
|
||||
liked: "Polubione wpisy"
|
||||
|
@ -969,10 +968,10 @@ _preferencesBackups:
|
|||
save: "Zapisz zmiany"
|
||||
inputName: "Proszę podać nazwę dla tej kopii zapasowej"
|
||||
cannotSave: "Zapisanie nie powiodło się"
|
||||
nameAlreadyExists: "Kopia zapasowa o nazwie \"{name}\" już istnieje. Proszę podać\
|
||||
\ inną nazwę."
|
||||
applyConfirm: "Czy na pewno chcesz zastosować kopię zapasową \"{name}\" na tym urządzeniu?\
|
||||
\ Istniejące ustawienia tego urządzenia zostaną nadpisane."
|
||||
nameAlreadyExists: "Kopia zapasowa o nazwie \"{name}\" już istnieje. Proszę podać
|
||||
inną nazwę."
|
||||
applyConfirm: "Czy na pewno chcesz zastosować kopię zapasową \"{name}\" na tym urządzeniu?
|
||||
Istniejące ustawienia tego urządzenia zostaną nadpisane."
|
||||
saveConfirm: "Zapisać kopię zapasową jako {name}?"
|
||||
deleteConfirm: "Usunąć kopię zapasową {name}?"
|
||||
renameConfirm: "Zmienić nazwę kopii zapasowej z \"{old}\" na \"{new}\"?"
|
||||
|
@ -989,15 +988,15 @@ _registry:
|
|||
domain: "Domena"
|
||||
createKey: "Utwórz klucz"
|
||||
_aboutMisskey:
|
||||
about: "Calckey jest forkiem Misskey utworzonym przez ThatOneCalculator, rozwijanym\
|
||||
\ od 2022."
|
||||
about: "Calckey jest forkiem Misskey utworzonym przez ThatOneCalculator, rozwijanym
|
||||
od 2022."
|
||||
contributors: "Główni twórcy"
|
||||
allContributors: "Wszyscy twórcy"
|
||||
source: "Kod źródłowy"
|
||||
translation: "Tłumacz Calckey"
|
||||
donate: "Przekaż darowiznę na Calckey"
|
||||
morePatrons: "Naprawdę doceniam wsparcie ze strony wielu niewymienionych tu osób.\
|
||||
\ Dziękuję! \U0001F970"
|
||||
morePatrons: "Naprawdę doceniam wsparcie ze strony wielu niewymienionych tu osób.
|
||||
Dziękuję! 🥰"
|
||||
patrons: "Wspierający"
|
||||
_nsfw:
|
||||
respect: "Ukrywaj media NSFW"
|
||||
|
@ -1005,13 +1004,13 @@ _nsfw:
|
|||
force: "Ukrywaj wszystkie media"
|
||||
_mfm:
|
||||
cheatSheet: "Ściąga MFM"
|
||||
intro: "MFM jest językiem składniowym używanym przez m.in. Calckey, forki *key (w\
|
||||
\ tym Calckey), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz\
|
||||
\ listę wszystkich możliwych elementów składni MFM."
|
||||
intro: "MFM jest językiem składniowym używanym przez m.in. Calckey, forki *key (w
|
||||
tym Calckey), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz
|
||||
listę wszystkich możliwych elementów składni MFM."
|
||||
dummy: "Calckey rozszerza świat Fediwersum"
|
||||
mention: "Wspomnij"
|
||||
mentionDescription: "Używając znaku @ i nazwy użytkownika, możesz określić danego\
|
||||
\ użytkownika."
|
||||
mentionDescription: "Używając znaku @ i nazwy użytkownika, możesz określić danego
|
||||
użytkownika."
|
||||
hashtag: "Hashtag"
|
||||
hashtagDescription: "Używając kratki i tekstu, możesz określić hashtag."
|
||||
url: "Adres URL"
|
||||
|
@ -1026,14 +1025,14 @@ _mfm:
|
|||
centerDescription: "Wyśrodkowuje zawartość."
|
||||
inlineCode: "Kod (w wierszu)"
|
||||
blockCode: "Kod (blok)"
|
||||
blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu\
|
||||
\ linii."
|
||||
blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu
|
||||
linii."
|
||||
blockMath: "Matematyka (Blok)"
|
||||
quote: "Cytuj"
|
||||
quoteDescription: "Wyświetla treść jako cytat."
|
||||
emoji: "Niestandardowe emoji"
|
||||
emojiDescription: "Otaczając nazwę niestandardowego emoji dwukropkami, możesz użyć\
|
||||
\ niestandardowego emoji."
|
||||
emojiDescription: "Otaczając nazwę niestandardowego emoji dwukropkami, możesz użyć
|
||||
niestandardowego emoji."
|
||||
search: "Szukaj"
|
||||
searchDescription: "Wyświetla pole wyszukiwania z wcześniej wpisanym tekstem."
|
||||
flip: "Odwróć"
|
||||
|
@ -1077,7 +1076,7 @@ _mfm:
|
|||
background: Kolor tła
|
||||
backgroundDescription: Zmień kolor tła tekstu.
|
||||
foregroundDescription: Zmień kolor pierwszoplanowy tekstu.
|
||||
positionDescription: Przesuń treść o określoną odległość.
|
||||
positionDescription: Przesuń zawartość o określoną wartość.
|
||||
position: Pozycjonuj
|
||||
foreground: Kolor pierwszoplanowy
|
||||
scaleDescription: Skaluj treść o określoną wielkość.
|
||||
|
@ -1154,8 +1153,8 @@ _theme:
|
|||
darken: "Ściemnij"
|
||||
lighten: "Rozjaśnij"
|
||||
inputConstantName: "Wprowadź nazwę stałej"
|
||||
importInfo: "Jeżeli wprowadzisz tu kod motywu, możesz zaimportować go w edytorze\
|
||||
\ motywu"
|
||||
importInfo: "Jeżeli wprowadzisz tu kod motywu, możesz zaimportować go w edytorze
|
||||
motywu"
|
||||
deleteConstantConfirm: "Czy na pewno chcesz usunąć stałą {const}?"
|
||||
keys:
|
||||
accent: "Akcent"
|
||||
|
@ -1229,42 +1228,42 @@ _tutorial:
|
|||
step1_1: "Witamy!"
|
||||
step1_2: "Pozwól, że Cię skonfigurujemy. Będziesz działać w mgnieniu oka!"
|
||||
step2_1: "Najpierw, proszę wypełnij swój profil."
|
||||
step2_2: "Podanie kilku informacji o tym, kim jesteś, ułatwi innym stwierdzenie,\
|
||||
\ czy chcą zobaczyć Twoje wpisy lub śledzić Cię."
|
||||
step2_2: "Podanie kilku informacji o tym, kim jesteś, ułatwi innym stwierdzenie,
|
||||
czy chcą zobaczyć Twoje wpisy lub śledzić Cię."
|
||||
step3_1: "Pora znaleźć osoby do śledzenia!"
|
||||
step3_2: "Twoje domowe i społeczne linie czasu opierają się na tym, kogo śledzisz,\
|
||||
\ więc spróbuj śledzić kilka kont, aby zacząć.\nKliknij kółko z plusem w prawym\
|
||||
\ górnym rogu profilu, aby go śledzić."
|
||||
step3_2: "Twoje domowe i społeczne linie czasu opierają się na tym, kogo śledzisz,
|
||||
więc spróbuj śledzić kilka kont, aby zacząć.\nKliknij kółko z plusem w prawym
|
||||
górnym rogu profilu, aby go śledzić."
|
||||
step4_1: "Pozwól, że zabierzemy Cię tam."
|
||||
step4_2: "W pierwszym wpisie możesz się przedstawić lub wysłać powitanie - \"Witaj,\
|
||||
\ świecie!\""
|
||||
step4_2: "W pierwszym wpisie możesz się przedstawić lub wysłać powitanie - \"Witaj,
|
||||
świecie!\""
|
||||
step5_1: "Osie czasu, wszędzie widzę osie czasu!"
|
||||
step5_2: "Twoja instancja ma włączone {timelines} różne osie czasu."
|
||||
step5_3: "Główna {icon} oś czasu to miejsce, w którym możesz zobaczyć posty od użytkowników\
|
||||
\ których obserwujesz, oraz innych użytkowników z tej instancji. Jeśli wolisz,\
|
||||
\ by główna oś czasu pokazywała tylko posty od użytkowników których obserwujesz,\
|
||||
\ możesz łatwo to zmienić w ustawieniach!"
|
||||
step5_4: "Lokalna {icon} oś czasu to miejsce, w którym możesz zobaczyć posty od\
|
||||
\ wszystkich innych osób na tej instancji."
|
||||
step5_5: "Społeczna {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z instancji,\
|
||||
\ które admini polecają."
|
||||
step5_6: "Polecana {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z instancji,\
|
||||
\ które admini polecają."
|
||||
step5_7: "Globalna {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z każdej\
|
||||
\ innej połączonej instancji."
|
||||
step5_3: "Główna {icon} oś czasu to miejsce, w którym możesz zobaczyć posty od użytkowników
|
||||
których obserwujesz, oraz innych użytkowników z tej instancji. Jeśli wolisz, by
|
||||
główna oś czasu pokazywała tylko posty od użytkowników których obserwujesz, możesz
|
||||
łatwo to zmienić w ustawieniach!"
|
||||
step5_4: "Lokalna {icon} oś czasu to miejsce, w którym możesz zobaczyć posty od
|
||||
wszystkich innych osób na tej instancji."
|
||||
step5_5: "Społeczna {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z instancji,
|
||||
które admini polecają."
|
||||
step5_6: "Polecana {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z instancji,
|
||||
które admini polecają."
|
||||
step5_7: "Globalna {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z każdej
|
||||
innej połączonej instancji."
|
||||
step6_1: "Więc, czym to jest to miejsce?"
|
||||
step6_2: "Cóż, nie dołączył*ś po prostu do Calckey. Dołączył*ś do portalu do Fediverse,\
|
||||
\ połączonej sieci tysięcy serwerów, zwanych instancjami."
|
||||
step6_3: "Każdy serwer działa w inny sposób, i nie wszystkie serwery używają Calckey.\
|
||||
\ Ten jednak używa! Jest to trochę skomplikowane, ale w krótkim czasie załapiesz\
|
||||
\ o co chodzi."
|
||||
step6_2: "Cóż, nie dołączył*ś po prostu do Calckey. Dołączył*ś do portalu do Fediverse,
|
||||
połączonej sieci tysięcy serwerów, zwanych instancjami."
|
||||
step6_3: "Każdy serwer działa w inny sposób, i nie wszystkie serwery używają Calckey.
|
||||
Ten jednak używa! Jest to trochę skomplikowane, ale w krótkim czasie załapiesz
|
||||
o co chodzi."
|
||||
step6_4: "A teraz idź, odkrywaj i baw się dobrze!"
|
||||
_2fa:
|
||||
alreadyRegistered: "Zarejestrowałeś już urządzenie do uwierzytelniania dwuskładnikowego."
|
||||
registerDevice: "Zarejestruj nowe urządzenie"
|
||||
registerKey: "Zarejestruj klucz bezpieczeństwa"
|
||||
step1: "Najpierw, zainstaluj aplikację uwierzytelniającą (taką jak {a} lub {b})\
|
||||
\ na swoim urządzeniu."
|
||||
registerTOTP: "Zarejestruj nowe urządzenie"
|
||||
registerSecurityKey: "Zarejestruj klucz bezpieczeństwa"
|
||||
step1: "Najpierw, zainstaluj aplikację uwierzytelniającą (taką jak {a} lub {b})
|
||||
na swoim urządzeniu."
|
||||
step2: "Następnie, zeskanuje kod QR z ekranu."
|
||||
step3: "Wprowadź token podany w aplikacji, aby ukończyć konfigurację."
|
||||
step4: "Od teraz, przy każdej próbie logowania otrzymasz prośbę o token logowania."
|
||||
|
@ -1404,8 +1403,8 @@ _profile:
|
|||
youCanIncludeHashtags: "Możesz umieścić hashtagi w swoim opisie."
|
||||
metadata: "Dodatkowe informacje"
|
||||
metadataEdit: "Edytuj dodatkowe informacje"
|
||||
metadataDescription: "Możesz wyświetlać do czterech sekcji dodatkowych informacji\
|
||||
\ na swoim profilu."
|
||||
metadataDescription: "Możesz wyświetlać do czterech sekcji dodatkowych informacji
|
||||
na swoim profilu."
|
||||
metadataLabel: "Etykieta"
|
||||
metadataContent: "Treść"
|
||||
changeAvatar: "Zmień awatar"
|
||||
|
@ -1815,12 +1814,12 @@ objectStorageSetPublicRead: Ustaw "public-read" podczas wysyłania
|
|||
removeAllFollowing: Przestań obserwować wszystkich obserwowanych użytkowników
|
||||
smtpSecure: Użyj implicit SSL/TLS dla połączeń SMTP
|
||||
secureMode: Tryb bezpieczny (Authorized Fetch)
|
||||
instanceSecurity: Bezpieczeństwo instancji
|
||||
instanceSecurity: Bezpieczeństwo serwera
|
||||
privateMode: Tryb prywatny
|
||||
allowedInstances: Dopuszczone instancje
|
||||
allowedInstances: Dopuszczone serwery
|
||||
recommended: Polecane
|
||||
allowedInstancesDescription: Hosty instancji które mają być dopuszczone do federacji,
|
||||
każdy separowany nową linią (dotyczy tylko trybu prywatnego).
|
||||
allowedInstancesDescription: Hosty serwerów, które mają być dopuszczone do federacji,
|
||||
każdy oddzielony nowym wierszem (dotyczy tylko trybu prywatnego).
|
||||
seperateRenoteQuote: Oddziel przyciski podbicia i cytowania
|
||||
refreshInterval: 'Częstotliwość aktualizacji '
|
||||
slow: Wolna
|
||||
|
@ -1846,34 +1845,34 @@ moveToLabel: 'Konto na które się przenosisz:'
|
|||
moveAccount: Przenieś konto!
|
||||
moveAccountDescription: Ten proces jest nieodwracalny. Upewnij się, że utworzył*ś
|
||||
alias dla tego konta na nowym koncie, przed rozpoczęciem. Proszę wpisz tag konta
|
||||
w formacie @person@instance.com
|
||||
w formacie @osoba@serwer.com
|
||||
moveFrom: Przejdź ze starego konta na obecne
|
||||
moveFromLabel: 'Konto które przenosisz:'
|
||||
showUpdates: Pokaż pop-up po aktualizacji Calckey
|
||||
swipeOnDesktop: Zezwól na przeciąganie w stylu mobilnym na desktopie
|
||||
moveFromDescription: To utworzy alias twojego starego konta, w celu umożliwienia migracji
|
||||
z tamtego konta na to. Zrób to ZANIM rozpoczniesz przenoszenie się z tamtego konta.
|
||||
Proszę wpisz tag konta w formacie @person@instance.com
|
||||
migrationConfirm: "Czy jesteś absolutnie pewn* tego, że chcesz przenieść swoje konto\
|
||||
\ na {account}? Tego działania nie można odwrócić. Nieodwracalnie stracisz możliwość\
|
||||
\ normalnego korzystania z konta.\nUpewnij się, że to konto zostało ustawione jako\
|
||||
\ konto z którego się przenosisz."
|
||||
Proszę wpisz tag konta w formacie @osoba@serwer.com
|
||||
migrationConfirm: "Czy jesteś absolutnie pewn* tego, że chcesz przenieść swoje konto
|
||||
na {account}? Tego działania nie można odwrócić. Nieodwracalnie stracisz możliwość
|
||||
normalnego korzystania z konta.\nUpewnij się, że to konto zostało ustawione jako
|
||||
konto z którego się przenosisz."
|
||||
noThankYou: Nie, dziękuję
|
||||
addInstance: Dodaj instancję
|
||||
addInstance: Dodaj serwer
|
||||
renoteMute: Wycisz podbicia
|
||||
renoteUnmute: Odcisz podbicia
|
||||
flagSpeakAsCat: Mów jak kot
|
||||
flagSpeakAsCatDescription: Twoje posty zostaną znya-izowane, gdy w trybie kota
|
||||
selectInstance: Wybierz instancję
|
||||
noInstances: Brak instancji
|
||||
selectInstance: Wybierz serwer
|
||||
noInstances: Brak serwerów
|
||||
keepOriginalUploadingDescription: Zapisuje oryginalne zdjęcie. Jeśli wyłączone, wersja
|
||||
do wyświetlania w sieci zostanie wygenerowana podczas wysłania.
|
||||
antennaInstancesDescription: Wypisz jednego hosta instancji na linię
|
||||
antennaInstancesDescription: Wymień jeden host serwera w każdym wierszu
|
||||
regexpError: Błąd regularnego wyrażenia
|
||||
regexpErrorDescription: 'Wystąpił błąd w regularnym wyrażeniu znajdującym się w linijce
|
||||
{line} Twoich {tab} wyciszeń słownych:'
|
||||
forwardReportIsAnonymous: Zamiast Twojego konta, anonimowe konto systemowe zostanie
|
||||
wyświetlone na zdalnej instancji jako zgłaszający.
|
||||
forwardReportIsAnonymous: Zamiast twojego konta, anonimowe konto systemowe będzie
|
||||
wyświetlane jako zgłaszający na zdalnym serwerze.
|
||||
breakFollowConfirm: Czy na pewno chcesz usunąć obserwującego?
|
||||
instanceDefaultThemeDescription: Wpisz kod motywu w formacie obiektowym.
|
||||
mutePeriod: Długość wyciszenia
|
||||
|
@ -1887,7 +1886,7 @@ pushNotification: Powiadomienia push
|
|||
subscribePushNotification: Włącz powiadomienia push
|
||||
unsubscribePushNotification: Wyłącz powiadomienia push
|
||||
pushNotificationAlreadySubscribed: Powiadomienia push są już włączone
|
||||
pushNotificationNotSupported: Twoja przeglądarka lub instancja nie obsługuje powiadomień
|
||||
pushNotificationNotSupported: Twoja przeglądarka lub serwer nie obsługuje powiadomień
|
||||
push
|
||||
sendPushNotificationReadMessage: Usuń powiadomienia push, gdy odpowiednie powiadomienia
|
||||
lub wiadomości zostaną odczytane
|
||||
|
@ -1912,21 +1911,20 @@ proxyAccountDescription: Konto proxy jest kontem które w określonych sytuacjac
|
|||
do listy, oraz żaden lokalny użytkownik nie obserwuje tego konta, aktywność owego
|
||||
użytkownika nie zostanie dostarczona na oś czasu. W takim razie, użytkownika zaobserwuje
|
||||
konto proxy.
|
||||
objectStorageBaseUrlDesc: "URL stosowany jako odniesienie. Podaj URL twojego CDN,\
|
||||
\ albo proxy, jeśli używasz któregokolwiek.\nDla S3 użyj 'https://<bucket>.s3.amazonaws.com',\
|
||||
\ a dla GCS i jego odpowiedników użyj 'https://storage.googleapis.com/<bucket>',\
|
||||
\ itd."
|
||||
sendErrorReportsDescription: "Gdy ta opcja jest włączona, szczegółowe informacje o\
|
||||
\ błędach będą udostępnianie z Calckey gdy wystąpi problem, pomagając w ulepszaniu\
|
||||
\ Calckey.\nZawrze to informacje takie jak wersja twojego systemu operacyjnego,\
|
||||
\ przeglądarki, Twoja aktywność na Calckey itd."
|
||||
privateModeInfo: Jeśli włączone, tylko dopuszczone instancje będą mogły federować
|
||||
z Twoją instancją. Wszystkie posty będą jedynie widoczne na Twojej instancji.
|
||||
objectStorageBaseUrlDesc: "URL stosowany jako odniesienie. Podaj URL twojego CDN,
|
||||
albo proxy, jeśli używasz któregokolwiek.\nDla S3 użyj 'https://<bucket>.s3.amazonaws.com',
|
||||
a dla GCS i jego odpowiedników użyj 'https://storage.googleapis.com/<bucket>', itd."
|
||||
sendErrorReportsDescription: "Gdy ta opcja jest włączona, szczegółowe informacje o
|
||||
błędach będą udostępnianie z Calckey gdy wystąpi problem, pomagając w ulepszaniu
|
||||
Calckey.\nZawrze to informacje takie jak wersja twojego systemu operacyjnego, przeglądarki,
|
||||
Twoja aktywność na Calckey itd."
|
||||
privateModeInfo: Gdy ta opcja jest włączona, tylko serwery z białej listy mogą federować
|
||||
się z twoim serwerem. Wszystkie posty będą ukryte publicznie.
|
||||
oneHour: Godzina
|
||||
oneDay: Dzień
|
||||
oneWeek: Tydzień
|
||||
recommendedInstances: Polecane instancje
|
||||
recommendedInstancesDescription: Polecane instancje, mające pojawić się w odpowiedniej
|
||||
recommendedInstances: Polecane serwery
|
||||
recommendedInstancesDescription: Polecane serwery, mające pojawić się w odpowiedniej
|
||||
osi czasu, oddzielane nowymi liniami. NIE dodawaj “https://”, TYLKO samą domenę.
|
||||
rateLimitExceeded: Przekroczono ratelimit
|
||||
cropImage: Kadruj zdjęcie
|
||||
|
@ -1936,7 +1934,9 @@ noEmailServerWarning: Serwer email nie jest skonfigurowany.
|
|||
thereIsUnresolvedAbuseReportWarning: Istnieją nierozwiązane zgłoszenia.
|
||||
check: Sprawdź
|
||||
driveCapOverrideLabel: Zmień pojemność dysku dla tego użytkownika
|
||||
isSystemAccount: Konto założone i automatycznie zarządzane przez system.
|
||||
isSystemAccount: To konto jest tworzone i automatycznie obsługiwane przez system.
|
||||
Nie moderuj, nie edytuj, nie usuwaj, ani w żaden inny sposób nie ingeruj w to konto,
|
||||
bowiem może to uszkodzić twój serwer.
|
||||
typeToConfirm: Wpisz {x} by potwierdzić
|
||||
deleteAccount: Usuń konto
|
||||
document: Dokumentacja
|
||||
|
@ -1982,34 +1982,51 @@ customKaTeXMacroDescription: 'Skonfiguruj makra, aby łatwo pisać wyrażenia ma
|
|||
nie można przerwać linii w środku definicji. Nieprawidłowe linie są po prostu ignorowane.
|
||||
Obsługiwane są tylko proste funkcje podstawiania łańcuchów; nie można tu stosować
|
||||
zaawansowanej składni, takiej jak warunkowe rozgałęzienia.'
|
||||
secureModeInfo: Nie odsyłaj bez dowodu przy żądaniu z innych instancji.
|
||||
secureModeInfo: W przypadku żądań z innych serwerów nie odsyłaj bez dowodu.
|
||||
preferencesBackups: Kopie zapasowe ustawień
|
||||
undeck: Opuść tablicę
|
||||
reporter: Osoba zgłaszająca
|
||||
instanceDefaultDarkTheme: Domyślny ciemny motyw instancji
|
||||
instanceDefaultDarkTheme: Domyślny ciemny motyw serwera
|
||||
lastCommunication: Ostatnie połączenie
|
||||
emailRequiredForSignup: Wymagaj adresu email przy rejestracji
|
||||
themeColor: Kolor znacznika instancji
|
||||
instanceDefaultLightTheme: Domyślny jasny motyw instancji
|
||||
themeColor: Kolor znacznika serwera
|
||||
instanceDefaultLightTheme: Domyślny jasny motyw serwera
|
||||
enableEmojiReactions: Włącz reakcje emoji
|
||||
showEmojisInReactionNotifications: Pokazuj emoji w powiadomieniach reakcyjnych
|
||||
apps: Aplikacje
|
||||
silenceThisInstance: Wycisz tę instancję
|
||||
silencedInstances: Wyciszone instancje
|
||||
silenceThisInstance: Wycisz ten serwer
|
||||
silencedInstances: Wyciszone serwery
|
||||
deleted: Usunięte
|
||||
editNote: Edytuj wpis
|
||||
edited: Edytowany
|
||||
edited: 'Edytowano o {date} {time}'
|
||||
silenced: Wyciszony
|
||||
findOtherInstance: Znajdź inny serwer
|
||||
userSaysSomethingReasonReply: '{name} odpowiedział na wpis zawierający {reason}'
|
||||
userSaysSomethingReasonRenote: '{name} podbił post zawierający {reason}'
|
||||
signupsDisabled: Rejestracja na tym serwerze jest obecnie zamknięta, ale zawsze możesz
|
||||
się zapisać na innym! Jeśli masz kod zaproszeniowy na ten serwer, wpisz go poniżej.
|
||||
zarejestrować się na innym serwerze! Jeśli masz kod zaproszenia na ten serwer, wpisz
|
||||
go poniżej.
|
||||
userSaysSomethingReasonQuote: '{name} zacytował wpis zawierający {reason}'
|
||||
silencedInstancesDescription: Wymień nazwy domenowe instancji, które chcesz wyciszyć.
|
||||
Profile w wyciszonych instancjach są traktowane jako "Wyciszony", mogą jedynie wysyłać
|
||||
prośby obserwacji, i nie mogą oznaczać w wzmiankach profili lokalnych jeśli nie
|
||||
są obserwowane. To nie będzie miało wpływu na zablokowane instancje.
|
||||
silencedInstancesDescription: Wypisz nazwy hostów serwerów, które chcesz wyciszyć.
|
||||
Konta na wymienionych serwerach są traktowane jako "Wyciszone", mogą jedynie wysyłać
|
||||
prośby obserwacji i nie mogą oznaczać we wzmiankach profili lokalnych jeśli nie
|
||||
są obserwowane. To nie będzie miało wpływu na zablokowane serwery.
|
||||
cannotUploadBecauseExceedsFileSizeLimit: Ten plik nie mógł być przesłany, ponieważ
|
||||
jego wielkość przekracza dozwolony limit.
|
||||
sendModMail: Wyślij Powiadomienie Moderacyjne
|
||||
searchPlaceholder: Szukaj Calckey
|
||||
jumpToPrevious: Przejdź do poprzedniej sekcji
|
||||
listsDesc: Listy umożliwiają tworzenie osi czasu z określonymi użytkownikami. Dostęp
|
||||
do nich można uzyskać na stronie osi czasu.
|
||||
accessibility: Dostępność
|
||||
selectChannel: Wybierz kanał
|
||||
antennasDesc: "Anteny wyświetlają nowe posty spełniające ustawione przez Ciebie kryteria!\n
|
||||
Dostęp do nich można uzyskać ze strony osi czasu."
|
||||
expandOnNoteClick: Otwórz post przy kliknięciu
|
||||
expandOnNoteClickDesc: Jeśli opcja ta jest wyłączona, nadal będzie można otwierać
|
||||
posty w menu po kliknięciu prawym przyciskiem myszy lub klikając znacznik czasowy.
|
||||
channelFederationWarn: Kanały nie są jeszcze federowane z innymi serwerami
|
||||
newer: nowsze
|
||||
older: starsze
|
||||
cw: Ostrzeżenie zawartości
|
||||
removeReaction: Usuń reakcję
|
||||
|
|
87
locales/pt_BR.yml
Normal file
87
locales/pt_BR.yml
Normal file
|
@ -0,0 +1,87 @@
|
|||
username: Nome de usuário
|
||||
ok: OK
|
||||
_lang_: Inglês
|
||||
headlineMisskey: Uma plataforma de mídia social descentralizada e de código aberto
|
||||
que é gratuita para sempre! 🚀
|
||||
search: Pesquisar
|
||||
gotIt: Entendi!
|
||||
introMisskey: Bem vinde! Calckey é uma plataforma de mídia social descentralizada
|
||||
e de código aberto que é gratuita para sempre! 🚀
|
||||
searchPlaceholder: Pesquise no Calckey
|
||||
notifications: Notificações
|
||||
password: Senha
|
||||
forgotPassword: Esqueci a senha
|
||||
cancel: Cancelar
|
||||
noThankYou: Não, obrigade
|
||||
save: Salvar
|
||||
enterUsername: Insira nome de usuário
|
||||
cw: Aviso de conteúdo
|
||||
driveFileDeleteConfirm: Tem a certeza de que pretende apagar o arquivo "{name}"? O
|
||||
arquivo será removido de todas as mensagens que o contenham como anexo.
|
||||
deleteAndEdit: Deletar e editar
|
||||
import: Importar
|
||||
exportRequested: Você pediu uma exportação. Isso pode demorar um pouco. Será adicionado
|
||||
ao seu Drive quando for completo.
|
||||
note: Postar
|
||||
notes: Postagens
|
||||
deleteAndEditConfirm: Você tem certeza que quer deletar esse post e edita-lo? Você
|
||||
vai perder todas as reações, impulsionamentos e respostas dele.
|
||||
showLess: Fechar
|
||||
importRequested: Você requisitou uma importação. Isso pode demorar um pouco.
|
||||
listsDesc: Listas deixam você criar linhas do tempo com usuários específicos. Elas
|
||||
podem ser acessadas pela página de linhas do tempo.
|
||||
edited: 'Editado às {date} {time}'
|
||||
sendMessage: Enviar uma mensagem
|
||||
older: antigo
|
||||
createList: Criar lista
|
||||
loadMore: Carregar mais
|
||||
mentions: Menções
|
||||
importAndExport: Importar/Exportar Dados
|
||||
files: Arquivos
|
||||
lists: Listas
|
||||
manageLists: Gerenciar listas
|
||||
error: Erro
|
||||
somethingHappened: Ocorreu um erro
|
||||
retry: Tentar novamente
|
||||
renotedBy: Impulsionado por {user}
|
||||
noNotes: Nenhum post
|
||||
noNotifications: Nenhuma notificação
|
||||
instance: Servidor
|
||||
settings: Configurações
|
||||
basicSettings: Configurações Básicas
|
||||
otherSettings: Outras Configurações
|
||||
openInWindow: Abrir em janela
|
||||
profile: Perfil
|
||||
noAccountDescription: Esse usuário ainda não escreveu sua bio.
|
||||
login: Entrar
|
||||
loggingIn: Entrando
|
||||
logout: Sair
|
||||
signup: Criar conta
|
||||
uploading: Enviando...
|
||||
users: Usuários
|
||||
addUser: Adicione um usuário
|
||||
addInstance: Adicionar um servidor
|
||||
cantFavorite: Não foi possível adicionar aos marcadores.
|
||||
pin: Fixar no perfil
|
||||
unpin: Desfixar do perfil
|
||||
copyContent: Copiar conteúdos
|
||||
copyLink: Copiar link
|
||||
delete: Deletar
|
||||
deleted: Deletado
|
||||
editNote: Editar anotação
|
||||
addToList: Adicionar a lista
|
||||
copyUsername: Copiar nome de usuário
|
||||
searchUser: Procurar por um usuário
|
||||
reply: Responder
|
||||
jumpToPrevious: Pular para o anterior
|
||||
showMore: Mostrar mais
|
||||
newer: novo
|
||||
youGotNewFollower: seguiu você
|
||||
mention: Mencionar
|
||||
directNotes: Mensagens diretas
|
||||
export: Exportar
|
||||
unfollowConfirm: Você tem certez que deseja para de seguir {name}?
|
||||
noLists: Você não possui nenhuma lista
|
||||
following: Seguindo
|
||||
followers: Seguidores
|
||||
followsYou: Segue você
|
|
@ -1249,8 +1249,8 @@ _tutorial:
|
|||
step6_4: "Теперь идите, изучайте и развлекайтесь!"
|
||||
_2fa:
|
||||
alreadyRegistered: "Двухфакторная аутентификация уже настроена."
|
||||
registerDevice: "Зарегистрируйте ваше устройство"
|
||||
registerKey: "Зарегистрировать ключ"
|
||||
registerTOTP: "Зарегистрируйте ваше устройство"
|
||||
registerSecurityKey: "Зарегистрировать ключ"
|
||||
step1: "Прежде всего, установите на устройство приложение для аутентификации, например,\
|
||||
\ {a} или {b}."
|
||||
step2: "Далее отсканируйте отображаемый QR-код при помощи приложения."
|
||||
|
@ -1987,5 +1987,5 @@ apps: Приложения
|
|||
silenceThisInstance: Заглушить инстанс
|
||||
silencedInstances: Заглушенные инстансы
|
||||
editNote: Редактировать заметку
|
||||
edited: Редактировано
|
||||
edited: 'Редактировано в {date} {time}'
|
||||
deleted: Удалённое
|
||||
|
|
|
@ -1196,8 +1196,8 @@ _tutorial:
|
|||
step6_4: "Now go, explore, and have fun!"
|
||||
_2fa:
|
||||
alreadyRegistered: "Už ste zaregistrovali 2-faktorové autentifikačné zariadenie."
|
||||
registerDevice: "Registrovať nové zariadenie"
|
||||
registerKey: "Registrovať bezpečnostný kľúč"
|
||||
registerTOTP: "Registrovať nové zariadenie"
|
||||
registerSecurityKey: "Registrovať bezpečnostný kľúč"
|
||||
step1: "Najprv si nainštalujte autentifikačnú aplikáciu (napríklad {a} alebo {b}) na svoje zariadenie."
|
||||
step2: "Potom, naskenujte QR kód zobrazený na obrazovke."
|
||||
step2Url: "Do aplikácie zadajte nasledujúcu URL adresu:"
|
||||
|
|
|
@ -959,7 +959,7 @@ _tutorial:
|
|||
step6_3: "Кожен сервер працює по-своєму, і не на всіх серверах працює Calckey. Але цей працює! Це трохи складно, але ви швидко розберетеся"
|
||||
step6_4: "Тепер ідіть, вивчайте і розважайтеся!"
|
||||
_2fa:
|
||||
registerKey: "Зареєструвати новий ключ безпеки"
|
||||
registerSecurityKey: "Зареєструвати новий ключ безпеки"
|
||||
_permissions:
|
||||
"read:account": "Переглядати дані профілю"
|
||||
"write:account": "Змінити дані акаунту"
|
||||
|
|
|
@ -1201,8 +1201,8 @@ _tutorial:
|
|||
step6_4: "Now go, explore, and have fun!"
|
||||
_2fa:
|
||||
alreadyRegistered: "Bạn đã đăng ký thiết bị xác minh 2 bước."
|
||||
registerDevice: "Đăng ký một thiết bị"
|
||||
registerKey: "Đăng ký một mã bảo vệ"
|
||||
registerTOTP: "Đăng ký một thiết bị"
|
||||
registerSecurityKey: "Đăng ký một mã bảo vệ"
|
||||
step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn."
|
||||
step2: "Sau đó, quét mã QR hiển thị trên màn hình này."
|
||||
step2Url: "Bạn cũng có thể nhập URL này nếu sử dụng một chương trình máy tính:"
|
||||
|
|
1189
locales/zh-CN.yml
1189
locales/zh-CN.yml
File diff suppressed because it is too large
Load diff
|
@ -1219,8 +1219,8 @@ _tutorial:
|
|||
step6_4: "現在開始探索吧!"
|
||||
_2fa:
|
||||
alreadyRegistered: "你已註冊過一個雙重認證的裝置。"
|
||||
registerDevice: "註冊裝置"
|
||||
registerKey: "註冊鍵"
|
||||
registerTOTP: "註冊裝置"
|
||||
registerSecurityKey: "註冊鍵"
|
||||
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
|
||||
step2: "然後,掃描螢幕上的QR code。"
|
||||
step2Url: "在桌面版應用中,請輸入以下的URL:"
|
||||
|
@ -1816,7 +1816,6 @@ silenceThisInstance: 靜音此伺服器
|
|||
silencedInstances: 已靜音的伺服器
|
||||
silenced: 已靜音
|
||||
_experiments:
|
||||
enablePostEditing: 啟用帖子編輯
|
||||
title: 試驗功能
|
||||
findOtherInstance: 找找另一個伺服器
|
||||
noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Calckey發生衝突,請停用該擴展。
|
||||
|
@ -1829,7 +1828,7 @@ indexPosts: 索引帖子
|
|||
indexNotice: 現在開始索引。 這可能需要一段時間,請不要在一個小時內重啟你的伺服器。
|
||||
deleted: 已刪除
|
||||
editNote: 編輯筆記
|
||||
edited: 已修改
|
||||
edited: '於 {date} {time} 編輯'
|
||||
userSaysSomethingReason: '{name} 說了 {reason}'
|
||||
allowedInstancesDescription: 要加入聯邦白名單的服務器,每台伺服器用新行分隔(僅適用於私有模式)。
|
||||
defaultReaction: 默認的表情符號反應
|
||||
|
@ -1840,3 +1839,12 @@ subscribePushNotification: 啟用推送通知
|
|||
unsubscribePushNotification: 禁用推送通知
|
||||
pushNotificationAlreadySubscribed: 推送通知已經啟用
|
||||
recommendedInstancesDescription: 以每行分隔的推薦服務器出現在推薦的時間軸中。 不要添加 `https://`,只添加域名。
|
||||
searchPlaceholder: 搜尋 Calckey
|
||||
cw: 內容警告
|
||||
selectChannel: 選擇一個頻道
|
||||
newer: 較新
|
||||
older: 較舊
|
||||
jumpToPrevious: 跳到上一個
|
||||
removeReaction: 移除你的反應
|
||||
listsDesc: 清單可以創建一個只有您指定用戶的時間線。 可以從時間線頁面訪問它們。
|
||||
flagSpeakAsCatDescription: 在喵咪模式下你的貼文會被喵化ヾ(•ω•`)o
|
||||
|
|
10
package.json
10
package.json
|
@ -1,16 +1,16 @@
|
|||
{
|
||||
"name": "calckey",
|
||||
"version": "14.0.0-dev44",
|
||||
"version": "14.0.0-rc3",
|
||||
"codename": "aqua",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/calckey/calckey.git"
|
||||
},
|
||||
"packageManager": "pnpm@8.6.1",
|
||||
"packageManager": "pnpm@8.6.6",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp",
|
||||
"build": "pnpm -r run build && pnpm run gulp",
|
||||
"rebuild": "pnpm run clean && pnpm node ./scripts/build-greet.js && pnpm -r run build && pnpm run gulp",
|
||||
"build": "pnpm node ./scripts/build-greet.js && pnpm -r run build && pnpm run gulp",
|
||||
"start": "pnpm --filter backend run start",
|
||||
"start:test": "pnpm --filter backend run start:test",
|
||||
"init": "pnpm run migrate",
|
||||
|
@ -44,8 +44,10 @@
|
|||
"seedrandom": "^3.0.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "18.11.18",
|
||||
"@types/gulp": "4.0.10",
|
||||
"@types/gulp-rename": "2.0.1",
|
||||
"chalk": "4.1.2",
|
||||
"cross-env": "7.0.3",
|
||||
"cypress": "10.11.0",
|
||||
"execa": "5.1.1",
|
||||
|
|
10
packages/README.md
Normal file
10
packages/README.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
# 📦 Packages
|
||||
|
||||
This directory contains all of the packages Calckey uses.
|
||||
|
||||
- `backend`: Main backend code written in TypeScript for NodeJS
|
||||
- `backend/native-utils`: Backend code written in Rust, bound to NodeJS by [NAPI-RS](https://napi.rs/)
|
||||
- `client`: Web interface written in Vue3 and TypeScript
|
||||
- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript
|
||||
- `calckey-js`: TypeScript SDK for both backend and client, also published on [NPM](https://www.npmjs.com/package/calckey-js) for public use
|
||||
- `megalodon`: TypeScript library used for partial Mastodon API compatibility
|
|
@ -1,15 +1,15 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/swcrc",
|
||||
"jsc": {
|
||||
"parser": {
|
||||
"syntax": "typescript",
|
||||
"dynamicImport": true,
|
||||
"decorators": true
|
||||
},
|
||||
"transform": {
|
||||
"legacyDecorator": true,
|
||||
"decoratorMetadata": true
|
||||
},
|
||||
"$schema": "https://json.schemastore.org/swcrc",
|
||||
"jsc": {
|
||||
"parser": {
|
||||
"syntax": "typescript",
|
||||
"dynamicImport": true,
|
||||
"decorators": true
|
||||
},
|
||||
"transform": {
|
||||
"legacyDecorator": true,
|
||||
"decoratorMetadata": true
|
||||
},
|
||||
"experimental": {
|
||||
"keepImportAssertions": true
|
||||
},
|
||||
|
@ -20,6 +20,6 @@
|
|||
]
|
||||
},
|
||||
"target": "es2022"
|
||||
},
|
||||
"minify": false
|
||||
},
|
||||
"minify": false
|
||||
}
|
||||
|
|
BIN
packages/backend/assets/avatar.png
Normal file
BIN
packages/backend/assets/avatar.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.7 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2 KiB |
BIN
packages/backend/assets/transparent.png
Normal file
BIN
packages/backend/assets/transparent.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 68 B |
|
@ -220,7 +220,7 @@ export class Init1000000000000 {
|
|||
`CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON "notification" ("notifieeId") `,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/static-assets/badges/info.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT '/static-assets/badges/error.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT true, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`,
|
||||
`CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/static-assets/badges/info.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT '/static-assets/badges/error.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT false, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TABLE "following" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_c76c6e044bdf76ecf8bfb82a645" PRIMARY KEY ("id"))`,
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
export class RemoveShowTimelineReplies1684206886988 {
|
||||
name = "RemoveShowTimelineReplies1684206886988";
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "user" DROP COLUMN "showTimelineReplies"`,
|
||||
);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "user" ADD "showTimelineReplies" boolean NOT NULL DEFAULT false`,
|
||||
);
|
||||
}
|
||||
}
|
21
packages/backend/migration/1688280713783-add-meta-options.js
Normal file
21
packages/backend/migration/1688280713783-add-meta-options.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
export class AddMetaOptions1688280713783 {
|
||||
name = "AddMetaOptions1688280713783";
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`,
|
||||
);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`,
|
||||
);
|
||||
}
|
||||
}
|
|
@ -10,14 +10,14 @@ path = "src/lib.rs"
|
|||
|
||||
[features]
|
||||
default = []
|
||||
convert = ["dep:native-utils"]
|
||||
convert = ["dep:native-utils", "dep:indicatif", "dep:futures"]
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.96"
|
||||
native-utils = { path = "../", optional = true }
|
||||
indicatif = { version = "0.17.4", features = ["tokio"] }
|
||||
indicatif = { version = "0.17.4", features = ["tokio"], optional = true }
|
||||
tokio = { version = "1.28.2", features = ["full"] }
|
||||
futures = "0.3.28"
|
||||
futures = { version = "0.3.28", optional = true }
|
||||
serde_yaml = "0.9.21"
|
||||
serde = { version = "1.0.163", features = ["derive"] }
|
||||
urlencoding = "2.1.2"
|
||||
|
|
|
@ -1,3 +1,17 @@
|
|||
# Making migrations
|
||||
|
||||
For more information, please read https://www.sea-ql.org/SeaORM/docs/migration/setting-up-migration/
|
||||
|
||||
- Install `sea-orm-cli`
|
||||
```sh
|
||||
cargo install sea-orm-cli
|
||||
```
|
||||
|
||||
- Generate
|
||||
```sh
|
||||
sea-orm-cli migrate generate ****
|
||||
```
|
||||
|
||||
# Running Migrator CLI
|
||||
|
||||
- Generate a new migration file
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
pub use sea_orm_migration::prelude::*;
|
||||
|
||||
mod m20230531_180824_drop_reversi;
|
||||
mod m20230627_185451_index_note_url;
|
||||
|
||||
pub struct Migrator;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigratorTrait for Migrator {
|
||||
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||
vec![Box::new(m20230531_180824_drop_reversi::Migration)]
|
||||
vec![
|
||||
Box::new(m20230531_180824_drop_reversi::Migration),
|
||||
Box::new(m20230627_185451_index_note_url::Migration),
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[derive(DeriveMigrationName)]
|
||||
pub struct Migration;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.create_index(
|
||||
Index::create()
|
||||
.name("IDX_note_url")
|
||||
.table(Note::Table)
|
||||
.col(Note::Url)
|
||||
.if_not_exists()
|
||||
.to_owned(),
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.drop_index(
|
||||
Index::drop()
|
||||
.name("IDX_note_url")
|
||||
.table(Note::Table)
|
||||
.to_owned(),
|
||||
)
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
/// Learn more at https://docs.rs/sea-query#iden
|
||||
#[derive(Iden)]
|
||||
enum Note {
|
||||
Table,
|
||||
Url,
|
||||
}
|
|
@ -1,48 +1,50 @@
|
|||
{
|
||||
"name": "native-utils",
|
||||
"version": "0.0.0",
|
||||
"main": "built/index.js",
|
||||
"types": "built/index.d.ts",
|
||||
"napi": {
|
||||
"name": "native-utils",
|
||||
"triples": {
|
||||
"additional": [
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-linux-android",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"aarch64-unknown-linux-musl",
|
||||
"aarch64-pc-windows-msvc",
|
||||
"armv7-unknown-linux-gnueabihf",
|
||||
"x86_64-unknown-linux-musl",
|
||||
"x86_64-unknown-freebsd",
|
||||
"i686-pc-windows-msvc",
|
||||
"armv7-linux-androideabi",
|
||||
"universal-apple-darwin"
|
||||
]
|
||||
}
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@napi-rs/cli": "2.16.1",
|
||||
"ava": "5.1.1"
|
||||
},
|
||||
"ava": {
|
||||
"timeout": "3m"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"scripts": {
|
||||
"artifacts": "napi artifacts",
|
||||
"build": "napi build --features napi --platform --release ./built/",
|
||||
"build:debug": "napi build --platform",
|
||||
"prepublishOnly": "napi prepublish -t npm",
|
||||
"test": "pnpm run cargo:test && pnpm run build && ava",
|
||||
"universal": "napi universal",
|
||||
"version": "napi version",
|
||||
"name": "native-utils",
|
||||
"version": "0.0.0",
|
||||
"main": "built/index.js",
|
||||
"types": "built/index.d.ts",
|
||||
"napi": {
|
||||
"name": "native-utils",
|
||||
"triples": {
|
||||
"additional": [
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-linux-android",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"aarch64-unknown-linux-musl",
|
||||
"aarch64-pc-windows-msvc",
|
||||
"armv7-unknown-linux-gnueabihf",
|
||||
"x86_64-unknown-linux-musl",
|
||||
"x86_64-unknown-freebsd",
|
||||
"i686-pc-windows-msvc",
|
||||
"armv7-linux-androideabi",
|
||||
"universal-apple-darwin"
|
||||
]
|
||||
}
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@napi-rs/cli": "2.16.1",
|
||||
"ava": "5.1.1"
|
||||
},
|
||||
"ava": {
|
||||
"timeout": "3m"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"scripts": {
|
||||
"artifacts": "napi artifacts",
|
||||
"build": "pnpm run build:napi && pnpm run build:migration",
|
||||
"build:napi": "napi build --features napi --platform --release ./built/",
|
||||
"build:migration": "cargo build --locked --release --manifest-path ./migration/Cargo.toml && cp ./target/release/migration ./built/migration",
|
||||
"build:debug": "napi build --platform ./built/ && cargo build --manifest-path ./migration/Cargo.toml",
|
||||
"prepublishOnly": "napi prepublish -t npm",
|
||||
"test": "pnpm run cargo:test && pnpm run build:napi && ava",
|
||||
"universal": "napi universal",
|
||||
"version": "napi version",
|
||||
"format": "cargo fmt --all",
|
||||
"cargo:test": "pnpm run cargo:unit && pnpm run cargo:integration",
|
||||
"cargo:unit": "cargo test unit_test && cargo test -F napi unit_test",
|
||||
"cargo:integration": "cargo test -F noarray int_test -- --test-threads=1"
|
||||
}
|
||||
"cargo:unit": "cargo test unit_test && cargo test -F napi unit_test",
|
||||
"cargo:integration": "cargo test -F noarray int_test -- --test-threads=1"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,20 +16,20 @@ pub fn convert_id(in_id: String, id_convert_type: IdConvertType) -> napi::Result
|
|||
use IdConvertType::*;
|
||||
match id_convert_type {
|
||||
MastodonId => {
|
||||
let mut out: i64 = 0;
|
||||
let mut out: i128 = 0;
|
||||
for (i, c) in in_id.to_lowercase().chars().rev().enumerate() {
|
||||
out += num_from_char(c)? as i64 * 36_i64.pow(i as u32);
|
||||
out += num_from_char(c)? as i128 * 36_i128.pow(i as u32);
|
||||
}
|
||||
|
||||
Ok(out.to_string())
|
||||
}
|
||||
CalckeyId => {
|
||||
let mut input: i64 = match in_id.parse() {
|
||||
let mut input: i128 = match in_id.parse() {
|
||||
Ok(s) => s,
|
||||
Err(_) => {
|
||||
return Err(Error::new(
|
||||
Status::InvalidArg,
|
||||
"Unable to parse ID as MasstodonId",
|
||||
"Unable to parse ID as MastodonId",
|
||||
))
|
||||
}
|
||||
};
|
||||
|
|
|
@ -63,8 +63,6 @@ pub struct Model {
|
|||
pub hide_online_status: bool,
|
||||
#[sea_orm(column_name = "isDeleted")]
|
||||
pub is_deleted: bool,
|
||||
#[sea_orm(column_name = "showTimelineReplies")]
|
||||
pub show_timeline_replies: bool,
|
||||
#[sea_orm(column_name = "driveCapacityOverrideMb")]
|
||||
pub drive_capacity_override_mb: Option<i32>,
|
||||
#[sea_orm(column_name = "movedToUri")]
|
||||
|
|
|
@ -8,20 +8,17 @@
|
|||
"start:test": "NODE_ENV=test pnpm node ./built/index.js",
|
||||
"migrate": "pnpm run migrate:typeorm && pnpm run migrate:cargo",
|
||||
"migrate:typeorm": "typeorm migration:run -d ormconfig.js",
|
||||
"migrate:cargo": "cargo run --manifest-path ./native-utils/migration/Cargo.toml -- up",
|
||||
"migrate:cargo": "./native-utils/built/migration up",
|
||||
"revertmigration": "pnpm run revertmigration:cargo && pnpm run revertmigration:typeorm",
|
||||
"revertmigration:typeorm": "typeorm migration:revert -d ormconfig.js",
|
||||
"revertmigration:cargo": "cargo run --manifest-path ./native-utils/migration/Cargo.toml -- down",
|
||||
"revertmigration:cargo": "./native-utils/built/migration down",
|
||||
"check:connect": "node ./check_connect.js",
|
||||
"build": "pnpm swc src -d built -D",
|
||||
"watch": "pnpm swc src -d built -D -w",
|
||||
"lint": "pnpm rome check \"src/**/*.ts\"",
|
||||
"lint": "pnpm rome check --apply *",
|
||||
"mocha": "cross-env NODE_ENV=test TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha",
|
||||
"test": "pnpm run mocha",
|
||||
"format": "pnpm rome format * --write && pnpm rome check --apply *"
|
||||
},
|
||||
"resolutions": {
|
||||
"chokidar": "^3.3.1"
|
||||
"format": "pnpm rome format * --write"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@swc/core-android-arm64": "1.3.11",
|
||||
|
@ -31,7 +28,6 @@
|
|||
"@bull-board/api": "5.2.0",
|
||||
"@bull-board/koa": "5.2.0",
|
||||
"@bull-board/ui": "5.2.0",
|
||||
"@calckey/megalodon": "5.2.0",
|
||||
"@discordapp/twemoji": "14.1.2",
|
||||
"@elastic/elasticsearch": "7.17.0",
|
||||
"@koa/cors": "3.4.3",
|
||||
|
@ -46,7 +42,6 @@
|
|||
"ajv": "8.12.0",
|
||||
"archiver": "5.3.1",
|
||||
"argon2": "^0.30.3",
|
||||
"async-mutex": "^0.4.0",
|
||||
"autobind-decorator": "2.4.0",
|
||||
"autolinker": "4.0.0",
|
||||
"autwh": "0.1.0",
|
||||
|
@ -90,9 +85,11 @@
|
|||
"koa-send": "5.0.1",
|
||||
"koa-slow": "2.1.0",
|
||||
"koa-views": "7.0.2",
|
||||
"megalodon": "workspace:*",
|
||||
"meilisearch": "0.33.0",
|
||||
"mfm-js": "0.23.3",
|
||||
"mime-types": "2.1.35",
|
||||
"msgpackr": "1.9.5",
|
||||
"multer": "1.4.4-lts.1",
|
||||
"native-utils": "link:native-utils",
|
||||
"nested-property": "4.0.0",
|
||||
|
@ -101,6 +98,7 @@
|
|||
"nsfwjs": "2.4.2",
|
||||
"oauth": "^0.10.0",
|
||||
"os-utils": "0.0.14",
|
||||
"otpauth": "^9.1.2",
|
||||
"parse5": "7.1.2",
|
||||
"pg": "8.11.0",
|
||||
"private-ip": "2.3.4",
|
||||
|
@ -114,6 +112,7 @@
|
|||
"ratelimiter": "3.4.1",
|
||||
"re2": "1.19.0",
|
||||
"redis-lock": "0.1.4",
|
||||
"redis-semaphore": "5.3.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rename": "1.0.4",
|
||||
"rndstr": "1.0.0",
|
||||
|
@ -123,7 +122,6 @@
|
|||
"semver": "7.5.1",
|
||||
"sharp": "0.32.1",
|
||||
"sonic-channel": "^1.3.1",
|
||||
"speakeasy": "2.0.0",
|
||||
"stringz": "2.1.0",
|
||||
"summaly": "2.7.0",
|
||||
"syslog-pro": "1.0.0",
|
||||
|
@ -181,7 +179,6 @@
|
|||
"@types/semver": "7.5.0",
|
||||
"@types/sharp": "0.31.1",
|
||||
"@types/sinonjs__fake-timers": "8.1.2",
|
||||
"@types/speakeasy": "2.0.7",
|
||||
"@types/tinycolor2": "1.4.3",
|
||||
"@types/tmp": "0.2.3",
|
||||
"@types/uuid": "8.3.4",
|
||||
|
|
|
@ -55,6 +55,8 @@ export default function load() {
|
|||
mixin.clientEntry = clientManifest["src/init.ts"];
|
||||
|
||||
if (!config.redis.prefix) config.redis.prefix = mixin.host;
|
||||
if (config.cacheServer && !config.cacheServer.prefix)
|
||||
config.cacheServer.prefix = mixin.host;
|
||||
|
||||
return Object.assign(config, mixin);
|
||||
}
|
||||
|
|
|
@ -20,9 +20,21 @@ export type Source = {
|
|||
host: string;
|
||||
port: number;
|
||||
family?: number;
|
||||
pass: string;
|
||||
pass?: string;
|
||||
db?: number;
|
||||
prefix?: string;
|
||||
user?: string;
|
||||
tls?: { [y: string]: string };
|
||||
};
|
||||
cacheServer?: {
|
||||
host: string;
|
||||
port: number;
|
||||
family?: number;
|
||||
pass?: string;
|
||||
db?: number;
|
||||
prefix?: string;
|
||||
user?: string;
|
||||
tls?: { [z: string]: string };
|
||||
};
|
||||
elasticsearch: {
|
||||
host: string;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import si from "systeminformation";
|
||||
import Xev from "xev";
|
||||
import * as osUtils from "os-utils";
|
||||
import { fetchMeta } from "@/misc/fetch-meta.js";
|
||||
import meilisearch from "../db/meilisearch.js";
|
||||
|
||||
const ev = new Xev();
|
||||
|
@ -20,6 +21,9 @@ export default function () {
|
|||
ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50));
|
||||
});
|
||||
|
||||
const meta = fetchMeta();
|
||||
if (!meta.enableServerMachineStats) return;
|
||||
|
||||
async function tick() {
|
||||
const cpu = await cpuUsage();
|
||||
const memStats = await mem();
|
||||
|
|
|
@ -135,6 +135,24 @@ export type MeilisearchNote = {
|
|||
createdAt: number;
|
||||
};
|
||||
|
||||
function timestampToUnix(timestamp: string) {
|
||||
let unix = 0;
|
||||
|
||||
// Only contains numbers => UNIX timestamp
|
||||
if (/^\d+$/.test(timestamp)) {
|
||||
unix = Number.parseInt(timestamp);
|
||||
}
|
||||
|
||||
if (unix === 0) {
|
||||
// Try to parse the timestamp as JavaScript Date
|
||||
const date = Date.parse(timestamp);
|
||||
if (isNaN(date)) return 0;
|
||||
unix = date / 1000;
|
||||
}
|
||||
|
||||
return unix;
|
||||
}
|
||||
|
||||
export default hasConfig
|
||||
? {
|
||||
search: async (
|
||||
|
@ -166,8 +184,29 @@ export default hasConfig
|
|||
constructedFilters.push(`mediaAttachment = "${fileType}"`);
|
||||
return null;
|
||||
} else if (term.startsWith("from:")) {
|
||||
const user = term.slice(5);
|
||||
constructedFilters.push(`userName = ${user}`);
|
||||
let user = term.slice(5);
|
||||
|
||||
if (user.length === 0) return null;
|
||||
|
||||
// Cut off leading @, those aren't saved in the DB
|
||||
if (user.charAt(0) === "@") {
|
||||
user = user.slice(1);
|
||||
}
|
||||
|
||||
// Determine if we got a webfinger address or a single username
|
||||
if (user.split("@").length > 1) {
|
||||
let splitUser = user.split("@");
|
||||
|
||||
let domain = splitUser.pop();
|
||||
user = splitUser.join("@");
|
||||
|
||||
constructedFilters.push(
|
||||
`userName = ${user} AND userHost = ${domain}`,
|
||||
);
|
||||
} else {
|
||||
constructedFilters.push(`userName = ${user}`);
|
||||
}
|
||||
|
||||
return null;
|
||||
} else if (term.startsWith("domain:")) {
|
||||
const domain = term.slice(7);
|
||||
|
@ -175,17 +214,18 @@ export default hasConfig
|
|||
return null;
|
||||
} else if (term.startsWith("after:")) {
|
||||
const timestamp = term.slice(6);
|
||||
// Try to parse the timestamp as JavaScript Date
|
||||
const date = Date.parse(timestamp);
|
||||
if (isNaN(date)) return null;
|
||||
constructedFilters.push(`createdAt > ${date / 1000}`);
|
||||
|
||||
let unix = timestampToUnix(timestamp);
|
||||
|
||||
if (unix !== 0) constructedFilters.push(`createdAt > ${unix}`);
|
||||
|
||||
return null;
|
||||
} else if (term.startsWith("before:")) {
|
||||
const timestamp = term.slice(7);
|
||||
// Try to parse the timestamp as JavaScript Date
|
||||
const date = Date.parse(timestamp);
|
||||
if (isNaN(date)) return null;
|
||||
constructedFilters.push(`createdAt < ${date / 1000}`);
|
||||
|
||||
let unix = timestampToUnix(timestamp);
|
||||
if (unix !== 0) constructedFilters.push(`createdAt < ${unix}`);
|
||||
|
||||
return null;
|
||||
} else if (term.startsWith("filter:following")) {
|
||||
// Check if we got a context user
|
||||
|
|
|
@ -207,9 +207,11 @@ export const db = new DataSource({
|
|||
host: config.redis.host,
|
||||
port: config.redis.port,
|
||||
family: config.redis.family == null ? 0 : config.redis.family,
|
||||
username: config.redis.user ?? "default",
|
||||
password: config.redis.pass,
|
||||
keyPrefix: `${config.redis.prefix}:query:`,
|
||||
db: config.redis.db || 0,
|
||||
tls: config.redis.tls,
|
||||
},
|
||||
}
|
||||
: false,
|
||||
|
|
|
@ -2,13 +2,19 @@ import Redis from "ioredis";
|
|||
import config from "@/config/index.js";
|
||||
|
||||
export function createConnection() {
|
||||
let source = config.redis;
|
||||
if (config.cacheServer) {
|
||||
source = config.cacheServer;
|
||||
}
|
||||
return new Redis({
|
||||
port: config.redis.port,
|
||||
host: config.redis.host,
|
||||
family: config.redis.family == null ? 0 : config.redis.family,
|
||||
password: config.redis.pass,
|
||||
keyPrefix: `${config.redis.prefix}:`,
|
||||
db: config.redis.db || 0,
|
||||
port: source.port,
|
||||
host: source.host,
|
||||
family: source.family ?? 0,
|
||||
password: source.pass,
|
||||
username: source.user ?? "default",
|
||||
keyPrefix: `${source.prefix}:`,
|
||||
db: source.db || 0,
|
||||
tls: source.tls,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -5,8 +5,6 @@ import config from "@/config/index.js";
|
|||
|
||||
const logger = dbLogger.createSubLogger("sonic", "gray", false);
|
||||
|
||||
logger.info("Connecting to Sonic");
|
||||
|
||||
const handlers = (type: string): SonicChannel.Handlers => ({
|
||||
connected: () => {
|
||||
logger.succ(`Connected to Sonic ${type}`);
|
||||
|
@ -28,6 +26,10 @@ const handlers = (type: string): SonicChannel.Handlers => ({
|
|||
const hasConfig =
|
||||
config.sonic && (config.sonic.host || config.sonic.port || config.sonic.auth);
|
||||
|
||||
if (hasConfig) {
|
||||
logger.info("Connecting to Sonic");
|
||||
}
|
||||
|
||||
const host = hasConfig ? config.sonic.host ?? "localhost" : "";
|
||||
const port = hasConfig ? config.sonic.port ?? 1491 : 0;
|
||||
const auth = hasConfig ? config.sonic.auth ?? "SecretPassword" : "";
|
||||
|
|
|
@ -1,43 +1,85 @@
|
|||
import { redisClient } from "@/db/redis.js";
|
||||
import { encode, decode } from "msgpackr";
|
||||
import { ChainableCommander } from "ioredis";
|
||||
|
||||
export class Cache<T> {
|
||||
public cache: Map<string | null, { date: number; value: T }>;
|
||||
private lifetime: number;
|
||||
private ttl: number;
|
||||
private prefix: string;
|
||||
|
||||
constructor(lifetime: Cache<never>["lifetime"]) {
|
||||
this.cache = new Map();
|
||||
this.lifetime = lifetime;
|
||||
constructor(name: string, ttlSeconds: number) {
|
||||
this.ttl = ttlSeconds;
|
||||
this.prefix = `cache:${name}`;
|
||||
}
|
||||
|
||||
public set(key: string | null, value: T): void {
|
||||
this.cache.set(key, {
|
||||
date: Date.now(),
|
||||
value,
|
||||
});
|
||||
private prefixedKey(key: string | null): string {
|
||||
return key ? `${this.prefix}:${key}` : this.prefix;
|
||||
}
|
||||
|
||||
public get(key: string | null): T | undefined {
|
||||
const cached = this.cache.get(key);
|
||||
if (cached == null) return undefined;
|
||||
if (Date.now() - cached.date > this.lifetime) {
|
||||
this.cache.delete(key);
|
||||
return undefined;
|
||||
public async set(
|
||||
key: string | null,
|
||||
value: T,
|
||||
transaction?: ChainableCommander,
|
||||
): Promise<void> {
|
||||
const _key = this.prefixedKey(key);
|
||||
const _value = Buffer.from(encode(value));
|
||||
const commander = transaction ?? redisClient;
|
||||
await commander.set(_key, _value, "EX", this.ttl);
|
||||
}
|
||||
|
||||
public async get(key: string | null, renew = false): Promise<T | undefined> {
|
||||
const _key = this.prefixedKey(key);
|
||||
const cached = await redisClient.getBuffer(_key);
|
||||
if (cached === null) return undefined;
|
||||
|
||||
if (renew) await redisClient.expire(_key, this.ttl);
|
||||
|
||||
return decode(cached) as T;
|
||||
}
|
||||
|
||||
public async getAll(renew = false): Promise<Map<string, T>> {
|
||||
const keys = await redisClient.keys(`${this.prefix}*`);
|
||||
const map = new Map<string, T>();
|
||||
if (keys.length === 0) {
|
||||
return map;
|
||||
}
|
||||
return cached.value;
|
||||
const values = await redisClient.mgetBuffer(keys);
|
||||
|
||||
for (const [i, key] of keys.entries()) {
|
||||
const val = values[i];
|
||||
if (val !== null) {
|
||||
map.set(key, decode(val) as T);
|
||||
}
|
||||
}
|
||||
|
||||
if (renew) {
|
||||
const trans = redisClient.multi();
|
||||
for (const key of map.keys()) {
|
||||
trans.expire(key, this.ttl);
|
||||
}
|
||||
await trans.exec();
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
public delete(key: string | null) {
|
||||
this.cache.delete(key);
|
||||
public async delete(...keys: (string | null)[]): Promise<void> {
|
||||
if (keys.length > 0) {
|
||||
const _keys = keys.map(this.prefixedKey);
|
||||
await redisClient.del(_keys);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します
|
||||
* optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします
|
||||
* Returns if cached value exists. Otherwise, calls fetcher and caches.
|
||||
* Overwrites cached value if invalidated by the optional validator.
|
||||
*/
|
||||
public async fetch(
|
||||
key: string | null,
|
||||
fetcher: () => Promise<T>,
|
||||
renew = false,
|
||||
validator?: (cachedValue: T) => boolean,
|
||||
): Promise<T> {
|
||||
const cachedValue = this.get(key);
|
||||
const cachedValue = await this.get(key, renew);
|
||||
if (cachedValue !== undefined) {
|
||||
if (validator) {
|
||||
if (validator(cachedValue)) {
|
||||
|
@ -52,20 +94,21 @@ export class Cache<T> {
|
|||
|
||||
// Cache MISS
|
||||
const value = await fetcher();
|
||||
this.set(key, value);
|
||||
await this.set(key, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します
|
||||
* optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします
|
||||
* Returns if cached value exists. Otherwise, calls fetcher and caches if the fetcher returns a value.
|
||||
* Overwrites cached value if invalidated by the optional validator.
|
||||
*/
|
||||
public async fetchMaybe(
|
||||
key: string | null,
|
||||
fetcher: () => Promise<T | undefined>,
|
||||
renew = false,
|
||||
validator?: (cachedValue: T) => boolean,
|
||||
): Promise<T | undefined> {
|
||||
const cachedValue = this.get(key);
|
||||
const cachedValue = await this.get(key, renew);
|
||||
if (cachedValue !== undefined) {
|
||||
if (validator) {
|
||||
if (validator(cachedValue)) {
|
||||
|
@ -81,7 +124,7 @@ export class Cache<T> {
|
|||
// Cache MISS
|
||||
const value = await fetcher();
|
||||
if (value !== undefined) {
|
||||
this.set(key, value);
|
||||
await this.set(key, value);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import * as Acct from "@/misc/acct.js";
|
|||
import type { Packed } from "./schema.js";
|
||||
import { Cache } from "./cache.js";
|
||||
|
||||
const blockingCache = new Cache<User["id"][]>(1000 * 60 * 5);
|
||||
const blockingCache = new Cache<User["id"][]>("blocking", 60 * 5);
|
||||
|
||||
// NOTE: フォローしているユーザーのノート、リストのユーザーのノート、グループのユーザーのノート指定はパフォーマンス上の理由で無効になっている
|
||||
|
||||
|
|
17
packages/backend/src/misc/convert-milliseconds.ts
Normal file
17
packages/backend/src/misc/convert-milliseconds.ts
Normal file
|
@ -0,0 +1,17 @@
|
|||
export function convertMilliseconds(ms: number) {
|
||||
let seconds = Math.round(ms / 1000);
|
||||
let minutes = Math.round(seconds / 60);
|
||||
let hours = Math.round(minutes / 60);
|
||||
const days = Math.round(hours / 24);
|
||||
seconds %= 60;
|
||||
minutes %= 60;
|
||||
hours %= 24;
|
||||
|
||||
const result = [];
|
||||
if (days > 0) result.push(`${days} day(s)`);
|
||||
if (hours > 0) result.push(`${hours} hour(s)`);
|
||||
if (minutes > 0) result.push(`${minutes} minute(s)`);
|
||||
if (seconds > 0) result.push(`${seconds} second(s)`);
|
||||
|
||||
return result.join(", ");
|
||||
}
|
|
@ -1,33 +1,41 @@
|
|||
import probeImageSize from "probe-image-size";
|
||||
import { Mutex, withTimeout } from "async-mutex";
|
||||
import { Mutex } from "redis-semaphore";
|
||||
|
||||
import { FILE_TYPE_BROWSERSAFE } from "@/const.js";
|
||||
import Logger from "@/services/logger.js";
|
||||
import { Cache } from "./cache.js";
|
||||
import { redisClient } from "@/db/redis.js";
|
||||
|
||||
export type Size = {
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
|
||||
const cache = new Cache<boolean>(1000 * 60 * 10); // once every 10 minutes for the same url
|
||||
const mutex = withTimeout(new Mutex(), 1000);
|
||||
const cache = new Cache<boolean>("emojiMeta", 60 * 10); // once every 10 minutes for the same url
|
||||
const logger = new Logger("emoji");
|
||||
|
||||
export async function getEmojiSize(url: string): Promise<Size> {
|
||||
const logger = new Logger("emoji");
|
||||
let attempted = true;
|
||||
|
||||
await mutex.runExclusive(() => {
|
||||
const attempted = cache.get(url);
|
||||
if (!attempted) {
|
||||
cache.set(url, true);
|
||||
} else {
|
||||
logger.warn(`Attempt limit exceeded: ${url}`);
|
||||
throw new Error("Too many attempts");
|
||||
}
|
||||
});
|
||||
const lock = new Mutex(redisClient, "getEmojiSize");
|
||||
await lock.acquire();
|
||||
|
||||
try {
|
||||
logger.info(`Retrieving emoji size from ${url}`);
|
||||
attempted = (await cache.get(url)) === true;
|
||||
if (!attempted) {
|
||||
await cache.set(url, true);
|
||||
}
|
||||
} finally {
|
||||
await lock.release();
|
||||
}
|
||||
|
||||
if (attempted) {
|
||||
logger.warn(`Attempt limit exceeded: ${url}`);
|
||||
throw new Error("Too many attempts");
|
||||
}
|
||||
|
||||
try {
|
||||
logger.debug(`Retrieving emoji size from ${url}`);
|
||||
const { width, height, mime } = await probeImageSize(url, {
|
||||
timeout: 5000,
|
||||
});
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Meta } from "@/models/entities/meta.js";
|
|||
|
||||
let cache: Meta;
|
||||
|
||||
export function metaToPugArgs(meta: Meta) : object {
|
||||
export function metaToPugArgs(meta: Meta): object {
|
||||
let motd = ["Loading..."];
|
||||
if (meta.customMOTD.length > 0) {
|
||||
motd = meta.customMOTD;
|
||||
|
@ -26,7 +26,7 @@ export function metaToPugArgs(meta: Meta) : object {
|
|||
themeColor: meta.themeColor,
|
||||
randomMOTD: motd[Math.floor(Math.random() * motd.length)],
|
||||
privateMode: meta.privateMode,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export async function fetchMeta(noCache = false): Promise<Meta> {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
export function isDuplicateKeyValueError(e: unknown | Error): boolean {
|
||||
return (e as Error).message?.startsWith("duplicate key value");
|
||||
const nodeError = e as NodeJS.ErrnoException;
|
||||
return nodeError.code === "23505";
|
||||
}
|
||||
|
|
|
@ -3,10 +3,12 @@ import type { User } from "@/models/entities/user.js";
|
|||
import type { UserKeypair } from "@/models/entities/user-keypair.js";
|
||||
import { Cache } from "./cache.js";
|
||||
|
||||
const cache = new Cache<UserKeypair>(Infinity);
|
||||
const cache = new Cache<UserKeypair>("keypairStore", 60 * 30);
|
||||
|
||||
export async function getUserKeypair(userId: User["id"]): Promise<UserKeypair> {
|
||||
return await cache.fetch(userId, () =>
|
||||
UserKeypairs.findOneByOrFail({ userId: userId }),
|
||||
return await cache.fetch(
|
||||
userId,
|
||||
() => UserKeypairs.findOneByOrFail({ userId: userId }),
|
||||
true,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -7,8 +7,9 @@ import { isSelfHost, toPunyNullable } from "./convert-host.js";
|
|||
import { decodeReaction } from "./reaction-lib.js";
|
||||
import config from "@/config/index.js";
|
||||
import { query } from "@/prelude/url.js";
|
||||
import { redisClient } from "@/db/redis.js";
|
||||
|
||||
const cache = new Cache<Emoji | null>(1000 * 60 * 60 * 12);
|
||||
const cache = new Cache<Emoji | null>("populateEmojis", 60 * 60 * 12);
|
||||
|
||||
/**
|
||||
* 添付用絵文字情報
|
||||
|
@ -75,7 +76,7 @@ export async function populateEmoji(
|
|||
|
||||
if (emoji && !(emoji.width && emoji.height)) {
|
||||
emoji = await queryOrNull();
|
||||
cache.set(cacheKey, emoji);
|
||||
await cache.set(cacheKey, emoji);
|
||||
}
|
||||
|
||||
if (emoji == null) return null;
|
||||
|
@ -150,7 +151,7 @@ export async function prefetchEmojis(
|
|||
emojis: { name: string; host: string | null }[],
|
||||
): Promise<void> {
|
||||
const notCachedEmojis = emojis.filter(
|
||||
(emoji) => cache.get(`${emoji.name} ${emoji.host}`) == null,
|
||||
async (emoji) => !(await cache.get(`${emoji.name} ${emoji.host}`)),
|
||||
);
|
||||
const emojisQuery: any[] = [];
|
||||
const hosts = new Set(notCachedEmojis.map((e) => e.host));
|
||||
|
@ -169,7 +170,9 @@ export async function prefetchEmojis(
|
|||
select: ["name", "host", "originalUrl", "publicUrl"],
|
||||
})
|
||||
: [];
|
||||
const trans = redisClient.multi();
|
||||
for (const emoji of _emojis) {
|
||||
cache.set(`${emoji.name} ${emoji.host}`, emoji);
|
||||
cache.set(`${emoji.name} ${emoji.host}`, emoji, trans);
|
||||
}
|
||||
await trans.exec();
|
||||
}
|
||||
|
|
|
@ -198,7 +198,7 @@ export class Meta {
|
|||
public iconUrl: string | null;
|
||||
|
||||
@Column("boolean", {
|
||||
default: true,
|
||||
default: false,
|
||||
})
|
||||
public cacheRemoteFiles: boolean;
|
||||
|
||||
|
@ -546,4 +546,14 @@ export class Meta {
|
|||
default: {},
|
||||
})
|
||||
public experimentalFeatures: Record<string, unknown>;
|
||||
|
||||
@Column("boolean", {
|
||||
default: false,
|
||||
})
|
||||
public enableServerMachineStats: boolean;
|
||||
|
||||
@Column("boolean", {
|
||||
default: true,
|
||||
})
|
||||
public enableIdenticonGeneration: boolean;
|
||||
}
|
||||
|
|
|
@ -249,12 +249,6 @@ export class User {
|
|||
})
|
||||
public followersUri: string | null;
|
||||
|
||||
@Column("boolean", {
|
||||
default: false,
|
||||
comment: "Whether to show users replying to other users in the timeline.",
|
||||
})
|
||||
public showTimelineReplies: boolean;
|
||||
|
||||
@Index({ unique: true })
|
||||
@Column("char", {
|
||||
length: 16,
|
||||
|
|
|
@ -28,7 +28,7 @@ import {
|
|||
import { db } from "@/db/postgre.js";
|
||||
import { IdentifiableError } from "@/misc/identifiable-error.js";
|
||||
|
||||
async function populatePoll(note: Note, meId: User["id"] | null) {
|
||||
export async function populatePoll(note: Note, meId: User["id"] | null) {
|
||||
const poll = await Polls.findOneByOrFail({ noteId: note.id });
|
||||
const choices = poll.choices.map((c) => ({
|
||||
text: c,
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import { URL } from "url";
|
||||
import { In, Not } from "typeorm";
|
||||
import Ajv from "ajv";
|
||||
import type { ILocalUser, IRemoteUser } from "@/models/entities/user.js";
|
||||
|
@ -40,7 +39,10 @@ import {
|
|||
} from "../index.js";
|
||||
import type { Instance } from "../entities/instance.js";
|
||||
|
||||
const userInstanceCache = new Cache<Instance | null>(1000 * 60 * 60 * 3);
|
||||
const userInstanceCache = new Cache<Instance | null>(
|
||||
"userInstance",
|
||||
60 * 60 * 3,
|
||||
);
|
||||
|
||||
type IsUserDetailed<Detailed extends boolean> = Detailed extends true
|
||||
? Packed<"UserDetailed">
|
||||
|
@ -567,7 +569,6 @@ export const UserRepository = db.getRepository(User).extend({
|
|||
mutedInstances: profile!.mutedInstances,
|
||||
mutingNotificationTypes: profile!.mutingNotificationTypes,
|
||||
emailNotificationTypes: profile!.emailNotificationTypes,
|
||||
showTimelineReplies: user.showTimelineReplies || falsy,
|
||||
}
|
||||
: {}),
|
||||
|
||||
|
|
|
@ -482,7 +482,8 @@ export function createCleanRemoteFilesJob() {
|
|||
export function createIndexAllNotesJob(data = {}) {
|
||||
return backgroundQueue.add("indexAllNotes", data, {
|
||||
removeOnComplete: true,
|
||||
removeOnFail: true,
|
||||
removeOnFail: false,
|
||||
timeout: 1000 * 60 * 60 * 24,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -7,8 +7,10 @@ export function initialize<T>(name: string, limitPerSec = -1) {
|
|||
port: config.redis.port,
|
||||
host: config.redis.host,
|
||||
family: config.redis.family == null ? 0 : config.redis.family,
|
||||
username: config.redis.user ?? "default",
|
||||
password: config.redis.pass,
|
||||
db: config.redis.db || 0,
|
||||
tls: config.redis.tls,
|
||||
},
|
||||
prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : "queue",
|
||||
limiter:
|
||||
|
|
|
@ -20,7 +20,7 @@ export default async function indexAllNotes(
|
|||
let total: number = (job.data.total as number) ?? 0;
|
||||
|
||||
let running = true;
|
||||
const take = 50000;
|
||||
const take = 100000;
|
||||
const batch = 100;
|
||||
while (running) {
|
||||
logger.info(
|
||||
|
|
|
@ -17,9 +17,7 @@ export async function deleteAccount(
|
|||
logger.info(`Deleting account of ${job.data.user.id} ...`);
|
||||
|
||||
const user = await Users.findOneBy({ id: job.data.user.id });
|
||||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (!user) return;
|
||||
|
||||
{
|
||||
// Delete notes
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import type Bull from "bull";
|
||||
import { In } from "typeorm";
|
||||
import { Notes, Polls, PollVotes } from "@/models/index.js";
|
||||
import { Notes, PollVotes } from "@/models/index.js";
|
||||
import { queueLogger } from "../logger.js";
|
||||
import type { EndedPollNotificationJobData } from "@/queue/types.js";
|
||||
import { createNotification } from "@/services/create-notification.js";
|
||||
import { deliverQuestionUpdate } from "@/services/note/polls/update.js";
|
||||
|
||||
const logger = queueLogger.createSubLogger("ended-poll-notification");
|
||||
|
||||
|
@ -32,5 +32,8 @@ export async function endedPollNotification(
|
|||
});
|
||||
}
|
||||
|
||||
// Broadcast the poll result once it ends
|
||||
if (!note.localOnly) await deliverQuestionUpdate(note.id);
|
||||
|
||||
done();
|
||||
}
|
||||
|
|
|
@ -34,6 +34,12 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
|
|||
const info = Object.assign({}, activity) as any;
|
||||
info["@context"] = undefined;
|
||||
logger.debug(JSON.stringify(info, null, 2));
|
||||
|
||||
if (!signature?.keyId) {
|
||||
const err = `Invalid signature: ${signature}`;
|
||||
job.moveToFailed({ message: err });
|
||||
return err;
|
||||
}
|
||||
//#endregion
|
||||
const host = toPuny(new URL(signature.keyId).hostname);
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@ import DbResolver from "@/remote/activitypub/db-resolver.js";
|
|||
import { getApId } from "@/remote/activitypub/type.js";
|
||||
import { shouldBlockInstance } from "@/misc/should-block-instance.js";
|
||||
import type { IncomingMessage } from "http";
|
||||
import type { CacheableRemoteUser } from "@/models/entities/user.js";
|
||||
import type { UserPublickey } from "@/models/entities/user-publickey.js";
|
||||
|
||||
export async function hasSignature(req: IncomingMessage): Promise<string> {
|
||||
const meta = await fetchMeta();
|
||||
|
@ -95,3 +97,22 @@ export async function checkFetch(req: IncomingMessage): Promise<number> {
|
|||
}
|
||||
return 200;
|
||||
}
|
||||
|
||||
export async function getSignatureUser(req: IncomingMessage): Promise<{
|
||||
user: CacheableRemoteUser;
|
||||
key: UserPublickey | null;
|
||||
} | null> {
|
||||
const signature = httpSignature.parseRequest(req, { headers: [] });
|
||||
const keyId = new URL(signature.keyId);
|
||||
const dbResolver = new DbResolver();
|
||||
|
||||
// Retrieve from DB by HTTP-Signature keyId
|
||||
const authUser = await dbResolver.getAuthUserFromKeyId(signature.keyId);
|
||||
if (authUser) {
|
||||
return authUser;
|
||||
}
|
||||
|
||||
// Resolve if failed to retrieve by keyId
|
||||
keyId.hash = "";
|
||||
return await dbResolver.getAuthUserFromApId(getApId(keyId.toString()));
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import type {
|
|||
CacheableRemoteUser,
|
||||
CacheableUser,
|
||||
} from "@/models/entities/user.js";
|
||||
import { User, IRemoteUser } from "@/models/entities/user.js";
|
||||
import type { UserPublickey } from "@/models/entities/user-publickey.js";
|
||||
import type { MessagingMessage } from "@/models/entities/messaging-message.js";
|
||||
import {
|
||||
|
@ -20,8 +19,11 @@ import type { IObject } from "./type.js";
|
|||
import { getApId } from "./type.js";
|
||||
import { resolvePerson } from "./models/person.js";
|
||||
|
||||
const publicKeyCache = new Cache<UserPublickey | null>(Infinity);
|
||||
const publicKeyByUserIdCache = new Cache<UserPublickey | null>(Infinity);
|
||||
const publicKeyCache = new Cache<UserPublickey | null>("publicKey", 60 * 30);
|
||||
const publicKeyByUserIdCache = new Cache<UserPublickey | null>(
|
||||
"publicKeyByUserId",
|
||||
60 * 30,
|
||||
);
|
||||
|
||||
export type UriParseResult =
|
||||
| {
|
||||
|
@ -80,8 +82,15 @@ export default class DbResolver {
|
|||
id: parsed.id,
|
||||
});
|
||||
} else {
|
||||
return await Notes.findOneBy({
|
||||
uri: parsed.uri,
|
||||
return await Notes.findOne({
|
||||
where: [
|
||||
{
|
||||
uri: parsed.uri,
|
||||
},
|
||||
{
|
||||
url: parsed.uri,
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -116,17 +125,23 @@ export default class DbResolver {
|
|||
if (parsed.type !== "users") return null;
|
||||
|
||||
return (
|
||||
(await userByIdCache.fetchMaybe(parsed.id, () =>
|
||||
Users.findOneBy({
|
||||
id: parsed.id,
|
||||
}).then((x) => x ?? undefined),
|
||||
(await userByIdCache.fetchMaybe(
|
||||
parsed.id,
|
||||
() =>
|
||||
Users.findOneBy({
|
||||
id: parsed.id,
|
||||
}).then((x) => x ?? undefined),
|
||||
true,
|
||||
)) ?? null
|
||||
);
|
||||
} else {
|
||||
return await uriPersonCache.fetch(parsed.uri, () =>
|
||||
Users.findOneBy({
|
||||
uri: parsed.uri,
|
||||
}),
|
||||
return await uriPersonCache.fetch(
|
||||
parsed.uri,
|
||||
() =>
|
||||
Users.findOneBy({
|
||||
uri: parsed.uri,
|
||||
}),
|
||||
true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -149,14 +164,17 @@ export default class DbResolver {
|
|||
|
||||
return key;
|
||||
},
|
||||
true,
|
||||
(key) => key != null,
|
||||
);
|
||||
|
||||
if (key == null) return null;
|
||||
|
||||
return {
|
||||
user: (await userByIdCache.fetch(key.userId, () =>
|
||||
Users.findOneByOrFail({ id: key.userId }),
|
||||
user: (await userByIdCache.fetch(
|
||||
key.userId,
|
||||
() => Users.findOneByOrFail({ id: key.userId }),
|
||||
true,
|
||||
)) as CacheableRemoteUser,
|
||||
key,
|
||||
};
|
||||
|
@ -176,6 +194,7 @@ export default class DbResolver {
|
|||
const key = await publicKeyByUserIdCache.fetch(
|
||||
user.id,
|
||||
() => UserPublickeys.findOneBy({ userId: user.id }),
|
||||
true,
|
||||
(v) => v != null,
|
||||
);
|
||||
|
||||
|
|
|
@ -15,9 +15,11 @@ export async function deleteActor(
|
|||
return `skip: delete actor ${actor.uri} !== ${uri}`;
|
||||
}
|
||||
|
||||
const user = await Users.findOneByOrFail({ id: actor.id });
|
||||
if (user.isDeleted) {
|
||||
logger.info("skip: already deleted");
|
||||
const user = await Users.findOneBy({ id: actor.id });
|
||||
if (!user) {
|
||||
return `skip: actor ${actor.id} not found in the local database`;
|
||||
} else if (user.isDeleted) {
|
||||
return `skip: user ${user.id} already deleted`;
|
||||
}
|
||||
|
||||
const job = await createDeleteAccountJob(actor);
|
||||
|
|
|
@ -26,11 +26,11 @@ export async function createImage(
|
|||
const image = (await new Resolver().resolve(value)) as any;
|
||||
|
||||
if (image.url == null) {
|
||||
throw new Error("invalid image: url not privided");
|
||||
throw new Error("Invalid image, URL not provided");
|
||||
}
|
||||
|
||||
if (!image.url.startsWith("https://") && !image.url.startsWith("http://")) {
|
||||
throw new Error("invalid image: unexpected shcema of url: " + image.url);
|
||||
throw new Error(`Invalid image, unexpected schema: ${image.url}`);
|
||||
}
|
||||
|
||||
logger.info(`Creating the Image: ${image.url}`);
|
||||
|
|
|
@ -13,11 +13,10 @@ import type {
|
|||
import { htmlToMfm } from "../misc/html-to-mfm.js";
|
||||
import { extractApHashtags } from "./tag.js";
|
||||
import { unique, toArray, toSingle } from "@/prelude/array.js";
|
||||
import { extractPollFromQuestion, updateQuestion } from "./question.js";
|
||||
import { extractPollFromQuestion } from "./question.js";
|
||||
import vote from "@/services/note/polls/vote.js";
|
||||
import { apLogger } from "../logger.js";
|
||||
import { DriveFile } from "@/models/entities/drive-file.js";
|
||||
import { deliverQuestionUpdate } from "@/services/note/polls/update.js";
|
||||
import { extractDbHost, toPuny } from "@/misc/convert-host.js";
|
||||
import {
|
||||
Emojis,
|
||||
|
@ -334,9 +333,6 @@ export async function createNote(
|
|||
`vote from AP: actor=${actor.username}@${actor.host}, note=${note.id}, choice=${name}`,
|
||||
);
|
||||
await vote(actor, reply, index);
|
||||
|
||||
// リモートフォロワーにUpdate配信
|
||||
deliverQuestionUpdate(reply.id);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
@ -545,10 +541,6 @@ function notEmpty(partial: Partial<any>) {
|
|||
export async function updateNote(value: string | IObject, resolver?: Resolver) {
|
||||
const uri = typeof value === "string" ? value : value.id;
|
||||
if (!uri) throw new Error("Missing note uri");
|
||||
const instanceMeta = await fetchMeta();
|
||||
if (instanceMeta.experimentalFeatures?.postEdits === false) {
|
||||
throw new Error("Post edits disabled.");
|
||||
}
|
||||
|
||||
// Skip if URI points to this server
|
||||
if (uri.startsWith(`${config.url}/`)) throw new Error("uri points local");
|
||||
|
|
|
@ -135,14 +135,14 @@ export async function fetchPerson(
|
|||
): Promise<CacheableUser | null> {
|
||||
if (typeof uri !== "string") throw new Error("uri is not string");
|
||||
|
||||
const cached = uriPersonCache.get(uri);
|
||||
const cached = await uriPersonCache.get(uri, true);
|
||||
if (cached) return cached;
|
||||
|
||||
// Fetch from the database if the URI points to this server
|
||||
if (uri.startsWith(`${config.url}/`)) {
|
||||
const id = uri.split("/").pop();
|
||||
const u = await Users.findOneBy({ id });
|
||||
if (u) uriPersonCache.set(uri, u);
|
||||
if (u) await uriPersonCache.set(uri, u);
|
||||
return u;
|
||||
}
|
||||
|
||||
|
@ -150,7 +150,7 @@ export async function fetchPerson(
|
|||
const exist = await Users.findOneBy({ uri });
|
||||
|
||||
if (exist) {
|
||||
uriPersonCache.set(uri, exist);
|
||||
await uriPersonCache.set(uri, exist);
|
||||
return exist;
|
||||
}
|
||||
//#endregion
|
||||
|
@ -279,7 +279,6 @@ export async function createPerson(
|
|||
tags,
|
||||
isBot,
|
||||
isCat: (person as any).isCat === true,
|
||||
showTimelineReplies: false,
|
||||
}),
|
||||
)) as IRemoteUser;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import config from "@/config/index.js";
|
||||
import Resolver from "../resolver.js";
|
||||
import type { IObject, IQuestion } from "../type.js";
|
||||
import { isQuestion } from "../type.js";
|
||||
import { getApId, isQuestion } from "../type.js";
|
||||
import { apLogger } from "../logger.js";
|
||||
import { Notes, Polls } from "@/models/index.js";
|
||||
import type { IPoll } from "@/models/entities/poll.js";
|
||||
|
@ -47,11 +47,14 @@ export async function extractPollFromQuestion(
|
|||
|
||||
/**
|
||||
* Update votes of Question
|
||||
* @param uri URI of AP Question object
|
||||
* @param value URI of AP Question object or object itself
|
||||
* @returns true if updated
|
||||
*/
|
||||
export async function updateQuestion(value: any, resolver?: Resolver) {
|
||||
const uri = typeof value === "string" ? value : value.id;
|
||||
export async function updateQuestion(
|
||||
value: string | IQuestion,
|
||||
resolver?: Resolver,
|
||||
): Promise<boolean> {
|
||||
const uri = typeof value === "string" ? value : getApId(value);
|
||||
|
||||
// Skip if URI points to this server
|
||||
if (uri.startsWith(`${config.url}/`)) throw new Error("uri points local");
|
||||
|
@ -65,22 +68,23 @@ export async function updateQuestion(value: any, resolver?: Resolver) {
|
|||
//#endregion
|
||||
|
||||
// resolve new Question object
|
||||
if (resolver == null) resolver = new Resolver();
|
||||
const question = (await resolver.resolve(value)) as IQuestion;
|
||||
const _resolver = resolver ?? new Resolver();
|
||||
const question = (await _resolver.resolve(value)) as IQuestion;
|
||||
apLogger.debug(`fetched question: ${JSON.stringify(question, null, 2)}`);
|
||||
|
||||
if (question.type !== "Question") throw new Error("object is not a Question");
|
||||
|
||||
const apChoices = question.oneOf || question.anyOf;
|
||||
if (!apChoices) return false;
|
||||
|
||||
let changed = false;
|
||||
|
||||
for (const choice of poll.choices) {
|
||||
const oldCount = poll.votes[poll.choices.indexOf(choice)];
|
||||
const newCount = apChoices!.filter((ap) => ap.name === choice)[0].replies!
|
||||
.totalItems;
|
||||
const newCount = apChoices.filter((ap) => ap.name === choice)[0].replies
|
||||
?.totalItems;
|
||||
|
||||
if (oldCount !== newCount) {
|
||||
if (newCount !== undefined && oldCount !== newCount) {
|
||||
changed = true;
|
||||
poll.votes[poll.choices.indexOf(choice)] = newCount;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ import { getUserKeypair } from "@/misc/keypair-store.js";
|
|||
import type { User } from "@/models/entities/user.js";
|
||||
import { getResponse } from "../../misc/fetch.js";
|
||||
import { createSignedPost, createSignedGet } from "./ap-request.js";
|
||||
import { apLogger } from "@/remote/activitypub/logger.js";
|
||||
|
||||
export default async (user: { id: User["id"] }, url: string, object: any) => {
|
||||
const body = JSON.stringify(object);
|
||||
|
@ -35,6 +36,7 @@ export default async (user: { id: User["id"] }, url: string, object: any) => {
|
|||
* @param url URL to fetch
|
||||
*/
|
||||
export async function signedGet(url: string, user: { id: User["id"] }) {
|
||||
apLogger.debug(`Running signedGet on url: ${url}`);
|
||||
const keypair = await getUserKeypair(user.id);
|
||||
|
||||
const req = createSignedGet({
|
||||
|
|
|
@ -23,6 +23,7 @@ import renderCreate from "@/remote/activitypub/renderer/create.js";
|
|||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
import renderFollow from "@/remote/activitypub/renderer/follow.js";
|
||||
import { shouldBlockInstance } from "@/misc/should-block-instance.js";
|
||||
import { apLogger } from "@/remote/activitypub/logger.js";
|
||||
|
||||
export default class Resolver {
|
||||
private history: Set<string>;
|
||||
|
@ -34,6 +35,15 @@ export default class Resolver {
|
|||
this.recursionLimit = recursionLimit;
|
||||
}
|
||||
|
||||
public setUser(user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public reset(): Resolver {
|
||||
this.history = new Set();
|
||||
return this;
|
||||
}
|
||||
|
||||
public getHistory(): string[] {
|
||||
return Array.from(this.history);
|
||||
}
|
||||
|
@ -56,15 +66,20 @@ export default class Resolver {
|
|||
}
|
||||
|
||||
if (typeof value !== "string") {
|
||||
apLogger.debug("Object to resolve is not a string");
|
||||
if (typeof value.id !== "undefined") {
|
||||
const host = extractDbHost(getApId(value));
|
||||
if (await shouldBlockInstance(host)) {
|
||||
throw new Error("instance is blocked");
|
||||
}
|
||||
}
|
||||
apLogger.debug("Returning existing object:");
|
||||
apLogger.debug(JSON.stringify(value, null, 2));
|
||||
return value;
|
||||
}
|
||||
|
||||
apLogger.debug(`Resolving: ${value}`);
|
||||
|
||||
if (value.includes("#")) {
|
||||
// URLs with fragment parts cannot be resolved correctly because
|
||||
// the fragment part does not get transmitted over HTTP(S).
|
||||
|
@ -102,6 +117,9 @@ export default class Resolver {
|
|||
this.user = await getInstanceActor();
|
||||
}
|
||||
|
||||
apLogger.debug("Getting object from remote, authenticated as user:");
|
||||
apLogger.debug(JSON.stringify(this.user, null, 2));
|
||||
|
||||
const object = (
|
||||
this.user
|
||||
? await signedGet(value, this.user)
|
||||
|
|
|
@ -20,7 +20,11 @@ import {
|
|||
import type { ILocalUser, User } from "@/models/entities/user.js";
|
||||
import { renderLike } from "@/remote/activitypub/renderer/like.js";
|
||||
import { getUserKeypair } from "@/misc/keypair-store.js";
|
||||
import { checkFetch, hasSignature } from "@/remote/activitypub/check-fetch.js";
|
||||
import {
|
||||
checkFetch,
|
||||
hasSignature,
|
||||
getSignatureUser,
|
||||
} from "@/remote/activitypub/check-fetch.js";
|
||||
import { getInstanceActor } from "@/services/instance-actor.js";
|
||||
import { fetchMeta } from "@/misc/fetch-meta.js";
|
||||
import renderFollow from "@/remote/activitypub/renderer/follow.js";
|
||||
|
@ -28,6 +32,7 @@ import Featured from "./activitypub/featured.js";
|
|||
import Following from "./activitypub/following.js";
|
||||
import Followers from "./activitypub/followers.js";
|
||||
import Outbox, { packActivity } from "./activitypub/outbox.js";
|
||||
import { serverLogger } from "./index.js";
|
||||
|
||||
// Init router
|
||||
const router = new Router();
|
||||
|
@ -84,7 +89,7 @@ router.get("/notes/:note", async (ctx, next) => {
|
|||
|
||||
const note = await Notes.findOneBy({
|
||||
id: ctx.params.note,
|
||||
visibility: In(["public" as const, "home" as const]),
|
||||
visibility: In(["public" as const, "home" as const, "followers" as const]),
|
||||
localOnly: false,
|
||||
});
|
||||
|
||||
|
@ -103,6 +108,37 @@ router.get("/notes/:note", async (ctx, next) => {
|
|||
return;
|
||||
}
|
||||
|
||||
if (note.visibility === "followers") {
|
||||
serverLogger.debug(
|
||||
"Responding to request for follower-only note, validating access...",
|
||||
);
|
||||
const remoteUser = await getSignatureUser(ctx.req);
|
||||
serverLogger.debug("Local note author user:");
|
||||
serverLogger.debug(JSON.stringify(note, null, 2));
|
||||
serverLogger.debug("Authenticated remote user:");
|
||||
serverLogger.debug(JSON.stringify(remoteUser, null, 2));
|
||||
|
||||
if (remoteUser == null) {
|
||||
serverLogger.debug("Rejecting: no user");
|
||||
ctx.status = 401;
|
||||
return;
|
||||
}
|
||||
|
||||
const relation = await Users.getRelation(remoteUser.user.id, note.userId);
|
||||
serverLogger.debug("Relation:");
|
||||
serverLogger.debug(JSON.stringify(relation, null, 2));
|
||||
|
||||
if (!relation.isFollowing || relation.isBlocked) {
|
||||
serverLogger.debug(
|
||||
"Rejecting: authenticated user is not following us or was blocked by us",
|
||||
);
|
||||
ctx.status = 403;
|
||||
return;
|
||||
}
|
||||
|
||||
serverLogger.debug("Accepting: access criteria met");
|
||||
}
|
||||
|
||||
ctx.body = renderActivity(await renderNote(note, false));
|
||||
|
||||
const meta = await fetchMeta();
|
||||
|
|
|
@ -9,7 +9,7 @@ import {
|
|||
localUserByNativeTokenCache,
|
||||
} from "@/services/user-cache.js";
|
||||
|
||||
const appCache = new Cache<App>(Infinity);
|
||||
const appCache = new Cache<App>("app", 60 * 30);
|
||||
|
||||
export class AuthenticationError extends Error {
|
||||
constructor(message: string) {
|
||||
|
@ -49,6 +49,7 @@ export default async (
|
|||
const user = await localUserByNativeTokenCache.fetch(
|
||||
token,
|
||||
() => Users.findOneBy({ token }) as Promise<ILocalUser | null>,
|
||||
true,
|
||||
);
|
||||
|
||||
if (user == null) {
|
||||
|
@ -82,11 +83,14 @@ export default async (
|
|||
Users.findOneBy({
|
||||
id: accessToken.userId,
|
||||
}) as Promise<ILocalUser>,
|
||||
true,
|
||||
);
|
||||
|
||||
if (accessToken.appId) {
|
||||
const app = await appCache.fetch(accessToken.appId, () =>
|
||||
Apps.findOneByOrFail({ id: accessToken.appId! }),
|
||||
const app = await appCache.fetch(
|
||||
accessToken.appId,
|
||||
() => Apps.findOneByOrFail({ id: accessToken.appId! }),
|
||||
true,
|
||||
);
|
||||
|
||||
return [
|
||||
|
|
|
@ -66,8 +66,11 @@ export default async (
|
|||
limit as IEndpointMeta["limit"] & { key: NonNullable<string> },
|
||||
limitActor,
|
||||
).catch((e) => {
|
||||
const remainingTime = e.remainingTime
|
||||
? `Please try again in ${e.remainingTime}.`
|
||||
: "Please try again later.";
|
||||
throw new ApiError({
|
||||
message: "Rate limit exceeded. Please try again later.",
|
||||
message: `Rate limit exceeded. ${remainingTime}`,
|
||||
code: "RATE_LIMIT_EXCEEDED",
|
||||
id: "d5826d14-3982-4d2e-8011-b9e9f02499ef",
|
||||
httpStatusCode: 429,
|
||||
|
@ -94,7 +97,7 @@ export default async (
|
|||
}
|
||||
|
||||
if (ep.meta.requireAdmin && !user!.isAdmin) {
|
||||
throw new ApiError(accessDenied, { reason: "You are not the admin." });
|
||||
throw new ApiError(accessDenied, { reason: "You are not an admin." });
|
||||
}
|
||||
|
||||
if (ep.meta.requireModerator && !isModerator) {
|
||||
|
|
|
@ -4,7 +4,8 @@ import { Brackets } from "typeorm";
|
|||
|
||||
export function generateRepliesQuery(
|
||||
q: SelectQueryBuilder<any>,
|
||||
me?: Pick<User, "id" | "showTimelineReplies"> | null,
|
||||
withReplies: boolean,
|
||||
me?: Pick<User, "id"> | null,
|
||||
) {
|
||||
if (me == null) {
|
||||
q.andWhere(
|
||||
|
@ -20,25 +21,21 @@ export function generateRepliesQuery(
|
|||
);
|
||||
}),
|
||||
);
|
||||
} else if (!me.showTimelineReplies) {
|
||||
} else if (!withReplies) {
|
||||
q.andWhere(
|
||||
new Brackets((qb) => {
|
||||
qb.where("note.replyId IS NULL") // 返信ではない
|
||||
.orWhere("note.replyUserId = :meId", { meId: me.id }) // 返信だけど自分のノートへの返信
|
||||
.orWhere(
|
||||
new Brackets((qb) => {
|
||||
qb.where(
|
||||
// 返信だけど自分の行った返信
|
||||
"note.replyId IS NOT NULL",
|
||||
).andWhere("note.userId = :meId", { meId: me.id });
|
||||
qb.where("note.replyId IS NOT NULL") // 返信だけど自分の行った返信
|
||||
.andWhere("note.userId = :meId", { meId: me.id });
|
||||
}),
|
||||
)
|
||||
.orWhere(
|
||||
new Brackets((qb) => {
|
||||
qb.where(
|
||||
// 返信だけど投稿者自身への返信
|
||||
"note.replyId IS NOT NULL",
|
||||
).andWhere("note.replyUserId = note.userId");
|
||||
qb.where("note.replyId IS NOT NULL") // 返信だけど投稿者自身への返信
|
||||
.andWhere("note.replyUserId = note.userId");
|
||||
}),
|
||||
);
|
||||
}),
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
import type { IEndpoint } from "./endpoints";
|
||||
|
||||
import * as cp___instanceInfo from "./endpoints/compatibility/instance-info.js";
|
||||
import * as cp___customEmojis from "./endpoints/compatibility/custom-emojis.js";
|
||||
import * as cp___instance_info from "./endpoints/compatibility/instance-info.js";
|
||||
import * as cp___custom_emojis from "./endpoints/compatibility/custom-emojis.js";
|
||||
import * as ep___instance_peers from "./endpoints/compatibility/peers.js";
|
||||
|
||||
const cps = [
|
||||
["v1/instance", cp___instanceInfo],
|
||||
["v1/custom_emojis", cp___customEmojis],
|
||||
["v1/instance", cp___instance_info],
|
||||
["v1/custom_emojis", cp___custom_emojis],
|
||||
["v1/instance/peers", ep___instance_peers],
|
||||
];
|
||||
|
||||
const compatibility: IEndpoint[] = cps.map(([name, cp]) => {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue