From d52e4b3c6a20726f80763410def282d2616988ed Mon Sep 17 00:00:00 2001 From: naskya Date: Fri, 25 Aug 2023 07:19:12 +0900 Subject: [PATCH] Firefish v1.0.5-dev6 --- .config/example.yml | 3 + .vscode/extensions.json | 1 - .woodpecker/commit.yml | 22 - .woodpecker/dockerHubRelease.yml | 15 - .woodpecker/dockerHubReleaseCandidate.yml | 14 - .woodpecker/dockerHubTag.yml | 18 - .woodpecker/testDocker.yml | 11 - CHANGELOG.md | 8 +- Dockerfile | 17 +- docs/migrate.md | 2 +- locales/bul_BG.yml | 70 +- locales/ca-ES.yml | 6 +- locales/de-DE.yml | 12 +- locales/en-US.yml | 15 +- locales/es-ES.yml | 262 ++++++-- locales/fr-FR.yml | 74 ++- locales/id-ID.yml | 14 +- locales/it-IT.yml | 611 +++++++++++++++--- locales/ja-JP.yml | 13 +- locales/ja-KS.yml | 219 ++++--- locales/no-NO.yml | 410 +++++++++++- locales/ru-RU.yml | 39 +- locales/uk-UA.yml | 12 +- locales/zh-CN.yml | 28 +- neko/UPSTREAM_COMMIT_ID | 1 + package.json | 2 +- .../1692374635734-IncreaseHostCharLimit.js | 119 ++++ packages/backend/src/config/types.ts | 1 + packages/backend/src/misc/download-url.ts | 2 +- packages/backend/src/misc/fetch.ts | 4 + .../src/models/entities/abuse-user-report.ts | 4 +- .../backend/src/models/entities/drive-file.ts | 2 +- packages/backend/src/models/entities/emoji.ts | 2 +- .../backend/src/models/entities/following.ts | 4 +- .../backend/src/models/entities/instance.ts | 6 +- packages/backend/src/models/entities/note.ts | 6 +- packages/backend/src/models/entities/poll.ts | 2 +- .../src/models/entities/user-profile.ts | 2 +- .../src/models/entities/user-publickey.ts | 2 +- packages/backend/src/models/entities/user.ts | 2 +- .../src/remote/activitypub/deliver-manager.ts | 24 +- .../src/remote/activitypub/kernel/index.ts | 6 +- .../remote/activitypub/misc/ld-signature.ts | 8 +- .../src/remote/activitypub/models/person.ts | 50 +- .../api/endpoints/admin/emoji/import-zip.ts | 1 - .../api/endpoints/admin/send-mod-mail.ts | 2 +- .../api/endpoints/drive/folders/update.ts | 2 +- .../backend/src/server/api/endpoints/i/pin.ts | 2 +- .../server/api/endpoints/latest-version.ts | 4 +- .../api/endpoints/messaging/messages.ts | 2 +- .../endpoints/messaging/messages/create.ts | 4 +- .../src/server/api/endpoints/notes/create.ts | 4 +- .../src/server/api/endpoints/notes/edit.ts | 25 +- .../src/server/api/endpoints/notes/search.ts | 1 + .../api/endpoints/users/groups/leave.ts | 2 +- .../server/api/endpoints/users/groups/pull.ts | 2 +- .../api/endpoints/users/report-abuse.ts | 25 +- .../src/server/api/mastodon/converters.ts | 10 + .../server/api/mastodon/endpoints/timeline.ts | 11 +- .../src/server/file/send-drive-file.ts | 2 - .../src/services/drive/upload-from-url.ts | 12 +- packages/backend/src/services/i/pin.ts | 2 +- packages/backend/src/services/note/create.ts | 5 +- packages/client/package.json | 38 +- .../client/src/components/MkAbuseReport.vue | 6 +- .../client/src/components/MkAnalogClock.vue | 62 +- packages/client/src/components/MkButton.vue | 12 +- .../src/components/MkCheatSheetDialog.vue | 4 +- .../client/src/components/MkContextMenu.vue | 17 +- .../client/src/components/MkCropperDialog.vue | 16 +- packages/client/src/components/MkDialog.vue | 12 +- .../client/src/components/MkFollowButton.vue | 27 +- .../src/components/MkForgotPassword.vue | 18 +- packages/client/src/components/MkHeatmap.vue | 18 +- .../client/src/components/MkImageViewer.vue | 4 +- .../src/components/MkImgWithBlurhash.vue | 12 +- .../src/components/MkInstanceCardMini.vue | 6 +- .../src/components/MkInstanceSelectDialog.vue | 26 +- .../client/src/components/MkInstanceStats.vue | 16 +- .../src/components/MkInstanceTicker.vue | 7 +- .../client/src/components/MkLaunchPad.vue | 6 +- packages/client/src/components/MkLink.vue | 8 +- packages/client/src/components/MkMedia.vue | 4 +- .../client/src/components/MkMediaBanner.vue | 12 +- packages/client/src/components/MkMenu.vue | 33 +- .../client/src/components/MkMiniChart.vue | 20 +- packages/client/src/components/MkModal.vue | 111 ++-- .../src/components/MkModalPageWindow.vue | 38 +- .../client/src/components/MkModalWindow.vue | 10 +- packages/client/src/components/MkNote.vue | 86 +-- .../client/src/components/MkNoteDetailed.vue | 82 +-- .../client/src/components/MkNoteHeader.vue | 7 +- packages/client/src/components/MkNoteSub.vue | 47 +- .../MkNotificationSettingWindow.vue | 32 +- .../src/components/MkNotificationToast.vue | 6 +- .../client/src/components/MkPageWindow.vue | 36 +- .../client/src/components/MkPopupMenu.vue | 4 +- packages/client/src/components/MkPostForm.vue | 344 +++++----- .../src/components/MkPostFormDialog.vue | 8 +- .../MkPushNotificationAllowButton.vue | 44 +- .../client/src/components/MkReactedUsers.vue | 22 +- .../client/src/components/MkRenoteButton.vue | 18 +- packages/client/src/components/MkSignin.vue | 109 ++-- .../client/src/components/MkSigninDialog.vue | 8 +- packages/client/src/components/MkSignup.vue | 127 ++-- .../client/src/components/MkSignupDialog.vue | 8 +- .../src/components/MkSubNoteContent.vue | 14 +- packages/client/src/components/MkTagCloud.vue | 20 +- packages/client/src/components/MkTimeline.vue | 16 +- packages/client/src/components/MkToast.vue | 4 +- .../src/components/MkTokenGenerateWindow.vue | 28 +- .../src/components/MkTutorialDialog.vue | 6 +- packages/client/src/components/MkUpdated.vue | 16 +- .../client/src/components/MkUrlPreview.vue | 45 +- .../src/components/MkUrlPreviewPopup.vue | 10 +- .../client/src/components/MkUserCardMini.vue | 6 +- packages/client/src/components/MkUserInfo.vue | 6 +- .../src/components/MkUserOnlineIndicator.vue | 4 +- .../client/src/components/MkUserPreview.vue | 16 +- .../src/components/MkUserSelectDialog.vue | 38 +- .../components/MkUserSelectLocalDialog.vue | 34 +- .../client/src/components/MkVisibility.vue | 8 +- .../src/components/MkVisibilityPicker.vue | 16 +- packages/client/src/components/MkWindow.vue | 74 +-- .../client/src/components/form/checkbox.vue | 10 +- packages/client/src/components/form/radio.vue | 4 +- packages/client/src/components/form/range.vue | 6 +- .../client/src/components/form/textarea.vue | 2 +- packages/client/src/components/global/MkA.vue | 4 +- .../client/src/components/global/MkAvatar.vue | 8 +- .../src/components/global/MkPageHeader.vue | 50 +- .../client/src/components/global/MkSpacer.vue | 24 +- .../components/global/MkStickyContainer.vue | 23 +- .../client/src/components/global/MkTime.vue | 14 +- .../src/components/global/RouterView.vue | 14 +- .../src/components/page/page.textarea.vue | 6 +- packages/client/src/pages/_error_.vue | 22 +- packages/client/src/pages/about-firefish.vue | 22 +- .../client/src/pages/about.federation.vue | 26 +- packages/client/src/pages/about.vue | 24 +- packages/client/src/pages/admin-file.vue | 40 +- packages/client/src/pages/admin/_header_.vue | 8 +- packages/client/src/pages/admin/abuses.vue | 26 +- .../client/src/pages/admin/announcements.vue | 16 +- .../client/src/pages/admin/bot-protection.vue | 34 +- .../client/src/pages/admin/custom-css.vue | 6 +- packages/client/src/pages/admin/database.vue | 6 +- .../client/src/pages/admin/email-settings.vue | 48 +- .../src/pages/admin/emoji-edit-dialog.vue | 36 +- packages/client/src/pages/admin/emojis.vue | 20 +- .../client/src/pages/admin/experiments.vue | 19 +- .../client/src/pages/admin/federation.vue | 4 +- packages/client/src/pages/admin/files.vue | 27 +- packages/client/src/pages/admin/hashtags.vue | 13 +- packages/client/src/pages/admin/index.vue | 105 +-- .../client/src/pages/admin/instance-block.vue | 21 +- .../src/pages/admin/integrations.discord.vue | 24 +- .../src/pages/admin/integrations.github.vue | 24 +- .../client/src/pages/admin/integrations.vue | 18 +- .../client/src/pages/admin/object-storage.vue | 84 +-- .../client/src/pages/admin/other-settings.vue | 6 +- .../src/pages/admin/overview.active-users.vue | 10 +- .../src/pages/admin/overview.ap-requests.vue | 14 +- .../src/pages/admin/overview.federation.vue | 28 +- .../src/pages/admin/overview.heatmap.vue | 4 +- .../src/pages/admin/overview.metrics.vue | 46 +- .../src/pages/admin/overview.moderators.vue | 8 +- .../client/src/pages/admin/overview.queue.vue | 26 +- .../client/src/pages/admin/overview.stats.vue | 28 +- .../client/src/pages/admin/overview.user.vue | 6 +- .../client/src/pages/admin/overview.users.vue | 8 +- packages/client/src/pages/admin/overview.vue | 45 +- .../client/src/pages/admin/promotions.vue | 18 +- .../client/src/pages/admin/proxy-account.vue | 24 +- .../client/src/pages/admin/queue.chart.vue | 24 +- packages/client/src/pages/admin/queue.vue | 15 +- packages/client/src/pages/admin/relays.vue | 10 +- packages/client/src/pages/admin/security.vue | 83 +-- packages/client/src/pages/admin/settings.vue | 228 +++---- packages/client/src/pages/admin/users.vue | 30 +- packages/client/src/pages/announcements.vue | 6 +- .../client/src/pages/antenna-timeline.vue | 26 +- packages/client/src/pages/api-console.vue | 6 +- packages/client/src/pages/channel-editor.vue | 46 +- packages/client/src/pages/channel.vue | 20 +- packages/client/src/pages/channels.vue | 36 +- packages/client/src/pages/clip.vue | 67 +- packages/client/src/pages/drive.vue | 10 +- .../client/src/pages/explore.featured.vue | 4 +- packages/client/src/pages/explore.users.vue | 18 +- packages/client/src/pages/explore.vue | 14 +- packages/client/src/pages/follow-requests.vue | 4 +- packages/client/src/pages/gallery/edit.vue | 46 +- packages/client/src/pages/gallery/index.vue | 18 +- packages/client/src/pages/gallery/post.vue | 42 +- packages/client/src/pages/instance-info.vue | 74 ++- packages/client/src/pages/messaging/index.vue | 40 +- .../pages/messaging/messaging-room.form.vue | 69 +- .../messaging/messaging-room.message.vue | 6 +- .../src/pages/messaging/messaging-room.vue | 138 ++-- packages/client/src/pages/mfm-cheat-sheet.vue | 74 +-- packages/client/src/pages/miauth.vue | 10 +- .../client/src/pages/my-antennas/create.vue | 4 +- .../client/src/pages/my-antennas/edit.vue | 10 +- .../client/src/pages/my-antennas/editor.vue | 76 +-- .../client/src/pages/my-antennas/index.vue | 6 +- packages/client/src/pages/my-clips/index.vue | 14 +- packages/client/src/pages/my-groups/group.vue | 2 +- packages/client/src/pages/my-groups/index.vue | 2 +- packages/client/src/pages/my-lists/index.vue | 10 +- packages/client/src/pages/my-lists/list.vue | 38 +- packages/client/src/pages/not-found.vue | 6 +- packages/client/src/pages/note.vue | 96 +-- packages/client/src/pages/notifications.vue | 30 +- .../page-editor/els/page-editor.el.image.vue | 8 +- .../page-editor/els/page-editor.el.note.vue | 21 +- .../els/page-editor.el.radio-button.vue | 8 +- .../src/pages/page-editor/page-editor.vue | 166 ++--- packages/client/src/pages/page.vue | 68 +- packages/client/src/pages/pages.vue | 14 +- packages/client/src/pages/preview.vue | 4 +- packages/client/src/pages/registry.keys.vue | 18 +- packages/client/src/pages/registry.value.vue | 34 +- packages/client/src/pages/registry.vue | 10 +- packages/client/src/pages/reset-password.vue | 10 +- packages/client/src/pages/scratchpad.vue | 6 +- packages/client/src/pages/search.vue | 14 +- packages/client/src/pages/settings/2fa.vue | 4 +- .../src/pages/settings/account-info.vue | 6 +- .../client/src/pages/settings/accounts.vue | 6 +- packages/client/src/pages/settings/api.vue | 6 +- packages/client/src/pages/settings/apps.vue | 6 +- .../client/src/pages/settings/custom-css.vue | 6 +- .../src/pages/settings/custom-katex-macro.vue | 4 +- packages/client/src/pages/settings/deck.vue | 4 +- .../src/pages/settings/delete-account.vue | 6 +- packages/client/src/pages/settings/drive.vue | 12 +- packages/client/src/pages/settings/email.vue | 6 +- .../client/src/pages/settings/general.vue | 6 +- .../src/pages/settings/import-export.vue | 6 +- packages/client/src/pages/settings/index.vue | 68 +- .../src/pages/settings/instance-mute.vue | 6 +- .../client/src/pages/settings/integration.vue | 4 +- .../client/src/pages/settings/migration.vue | 16 +- .../client/src/pages/settings/mute-block.vue | 8 +- packages/client/src/pages/settings/navbar.vue | 4 +- .../src/pages/settings/notifications.vue | 24 +- packages/client/src/pages/settings/other.vue | 4 +- .../src/pages/settings/plugin.install.vue | 6 +- packages/client/src/pages/settings/plugin.vue | 6 +- .../pages/settings/preferences-backups.vue | 51 +- .../client/src/pages/settings/privacy.vue | 48 +- .../client/src/pages/settings/profile.vue | 8 +- .../client/src/pages/settings/reaction.vue | 42 +- .../client/src/pages/settings/security.vue | 6 +- packages/client/src/pages/settings/sounds.vue | 4 +- .../client/src/pages/settings/statusbar.vue | 8 +- .../src/pages/settings/theme.install.vue | 8 +- .../src/pages/settings/theme.manage.vue | 4 +- packages/client/src/pages/settings/theme.vue | 4 +- .../src/pages/settings/webhook.edit.vue | 50 +- .../client/src/pages/settings/webhook.new.vue | 46 +- .../client/src/pages/settings/webhook.vue | 6 +- .../client/src/pages/settings/word-mute.vue | 6 +- packages/client/src/pages/share.vue | 50 +- packages/client/src/pages/signup-complete.vue | 6 +- packages/client/src/pages/tag.vue | 14 +- packages/client/src/pages/theme-editor.vue | 65 +- packages/client/src/pages/timeline.vue | 24 +- packages/client/src/pages/user-info.vue | 125 ++-- .../client/src/pages/user-list-timeline.vue | 22 +- packages/client/src/pages/user/followers.vue | 27 +- packages/client/src/pages/user/following.vue | 27 +- packages/client/src/pages/user/home.vue | 32 +- .../client/src/pages/user/index.activity.vue | 6 +- .../client/src/pages/user/index.photos.vue | 10 +- packages/client/src/pages/user/index.vue | 43 +- packages/client/src/pages/verify-email.vue | 6 +- .../client/src/pages/welcome.entrance.a.vue | 22 +- packages/client/src/pages/welcome.setup.vue | 18 +- packages/client/src/pages/welcome.vue | 10 +- packages/client/src/scripts/mfm-tags.ts | 2 + packages/client/src/ui/_common_/navbar.vue | 8 +- .../src/ui/_common_/statusbar-federation.vue | 4 +- .../client/src/ui/_common_/statusbar-rss.vue | 4 +- .../src/ui/_common_/statusbar-user-list.vue | 4 +- .../src/ui/_common_/stream-indicator.vue | 8 +- packages/client/src/ui/deck.vue | 4 +- .../client/src/ui/deck/antenna-column.vue | 4 +- .../client/src/ui/deck/channel-column.vue | 4 +- packages/client/src/ui/deck/column.vue | 46 +- packages/client/src/ui/deck/list-column.vue | 4 +- packages/client/src/ui/deck/main-column.vue | 6 +- packages/client/src/ui/deck/tl-column.vue | 24 +- .../client/src/ui/deck/widgets-column.vue | 6 +- packages/client/src/ui/universal.vue | 24 +- packages/client/src/ui/universal.widgets.vue | 8 +- packages/client/src/ui/visitor/b.vue | 31 +- packages/client/src/ui/zen.vue | 10 +- .../client/src/widgets/activity.chart.vue | 60 +- packages/client/src/widgets/clock.vue | 14 +- packages/client/src/widgets/digital-clock.vue | 14 +- .../client/src/widgets/instance-cloud.vue | 10 +- packages/client/src/widgets/rss-ticker.vue | 4 +- .../src/widgets/server-metric/cpu-mem.vue | 78 +-- .../client/src/widgets/server-metric/cpu.vue | 6 +- .../client/src/widgets/server-metric/disk.vue | 10 +- .../src/widgets/server-metric/meilisearch.vue | 22 +- .../client/src/widgets/server-metric/mem.vue | 18 +- .../client/src/widgets/server-metric/net.vue | 81 +-- .../client/src/widgets/server-metric/pie.vue | 6 +- packages/client/src/widgets/user-list.vue | 18 +- pnpm-lock.yaml | 307 +++++---- 313 files changed, 5296 insertions(+), 3678 deletions(-) delete mode 100644 .woodpecker/commit.yml delete mode 100644 .woodpecker/dockerHubRelease.yml delete mode 100644 .woodpecker/dockerHubReleaseCandidate.yml delete mode 100644 .woodpecker/dockerHubTag.yml delete mode 100644 .woodpecker/testDocker.yml create mode 100644 neko/UPSTREAM_COMMIT_ID create mode 100644 packages/backend/migration/1692374635734-IncreaseHostCharLimit.js diff --git a/.config/example.yml b/.config/example.yml index e28a20a3..c4c63400 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -161,6 +161,9 @@ reservedUsernames: [ # deliverJobMaxAttempts: 12 # inboxJobMaxAttempts: 8 +# Local address used for outgoing requests +#outgoingAddress: 127.0.0.1 + # IP address family used for outgoing request (ipv4, ipv6 or dual) #outgoingAddressFamily: ipv4 diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 785d6e13..8c5cc5ba 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,6 @@ { "recommendations": [ "editorconfig.editorconfig", - "eg2.vscode-npm-script", "rome.rome", "Vue.volar", "Vue.vscode-typescript-vue-plugin", diff --git a/.woodpecker/commit.yml b/.woodpecker/commit.yml deleted file mode 100644 index f57fd9d1..00000000 --- a/.woodpecker/commit.yml +++ /dev/null @@ -1,22 +0,0 @@ -pipeline: - testCommit: - image: node:alpine - commands: - - apk add --no-cache cargo python3 make g++ - - cp .config/ci.yml .config/default.yml - - corepack enable - - corepack prepare pnpm@latest --activate - - pnpm i --frozen-lockfile - - pnpm run build - - pnpm run migrate - -services: - database: - image: postgres:15 - environment: - - POSTGRES_PASSWORD=test - redis: - image: redis - -branches: - include: [ main, beta, develop, feature/* ] diff --git a/.woodpecker/dockerHubRelease.yml b/.woodpecker/dockerHubRelease.yml deleted file mode 100644 index 77b1197d..00000000 --- a/.woodpecker/dockerHubRelease.yml +++ /dev/null @@ -1,15 +0,0 @@ -pipeline: - publish-docker-latest: - image: plugins/kaniko - settings: - repo: thatonecalculator/firefish - tags: latest - dockerfile: Dockerfile - username: - # Secret 'docker_username' needs to be set in the CI settings - from_secret: docker_username - password: - # Secret 'docker_password' needs to be set in the CI settings - from_secret: docker_password - -branches: main diff --git a/.woodpecker/dockerHubReleaseCandidate.yml b/.woodpecker/dockerHubReleaseCandidate.yml deleted file mode 100644 index dd0d9354..00000000 --- a/.woodpecker/dockerHubReleaseCandidate.yml +++ /dev/null @@ -1,14 +0,0 @@ -pipeline: - publish-docker-latest: - image: plugins/kaniko - settings: - repo: thatonecalculator/firefish - tags: rc - dockerfile: Dockerfile - username: - # Secret 'docker_username' needs to be set in the CI settings - from_secret: docker_username - password: - # Secret 'docker_password' needs to be set in the CI settings - from_secret: docker_password -branches: beta diff --git a/.woodpecker/dockerHubTag.yml b/.woodpecker/dockerHubTag.yml deleted file mode 100644 index 4ff3f050..00000000 --- a/.woodpecker/dockerHubTag.yml +++ /dev/null @@ -1,18 +0,0 @@ -pipeline: - publish-docker-tag: - image: plugins/kaniko - settings: - repo: thatonecalculator/firefish - # Uses the tag from git for the container tag - tags: ${CI_COMMIT_TAG} - dockerfile: Dockerfile - username: - # Secret 'docker_username' needs to be set in the CI settings - from_secret: docker_username - password: - # Secret 'docker_password' needs to be set in the CI settings - from_secret: docker_password - when: - # Push new version when version tag is created - event: tag - tag: v* diff --git a/.woodpecker/testDocker.yml b/.woodpecker/testDocker.yml deleted file mode 100644 index 8c5e2cf9..00000000 --- a/.woodpecker/testDocker.yml +++ /dev/null @@ -1,11 +0,0 @@ -pipeline: - docker-build: - image: plugins/kaniko - settings: - repo: thatonecalculator/firefish - tags: test - dockerfile: Dockerfile - no_push: true - -branches: - include: [ main, develop, beta ] diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a84c103..5fe0aef1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8900,7 +8900,7 @@ Resolve #7540 * truncate user information if it is too long Some AP software allows for user names or summaries to be very long. -Misskey can not handle this and the profile page can not be opened and +Misskey cannot handle this and the profile page cannot be opened and no activities from such users can be seen. Instead, the user name and summary are cut off after the maximum length @@ -9902,7 +9902,7 @@ This duplicated processing can be avoided by querying the database directly. Misskey will only use ActivityPub follow requests for users that are local and are requesting to follow a remote user. This check is to ensure that -this endpoint can not be used by other services or instances. +this endpoint cannot be used by other services or instances. * fix: missing import @@ -14921,7 +14921,7 @@ Defaults for `local` and `withFiles` are based on the behaviour of the endpoint. * fix: define required fields -- `notes/create`: the default for `text` has been removed because ajv can not handle +- `notes/create`: the default for `text` has been removed because ajv cannot handle `default` inside of `anyOf`, see https://ajv.js.org/guide/modifying-data.html#assigning-defaults and the default value cannot be `null` if text is `nullable: false` in the `anyOf` @@ -15551,7 +15551,7 @@ unnecessarily loaded. * remove duplicate null check The variable is checked for null in the lines above and the function -returns if so. Therefore, it can not be null at this point. +returns if so. Therefore, it cannot be null at this point. * simplify `getJsonSchema` diff --git a/Dockerfile b/Dockerfile index ec07bb21..c7d9a95d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,14 @@ ## Install dev and compilation dependencies, build files -FROM alpine:3.18 as build +FROM node:latest as build WORKDIR /firefish # Install compilation dependencies -RUN apk add --no-cache --no-progress git alpine-sdk python3 nodejs-current npm rust cargo vips +RUN apt-get update && apt-get install -y libvips42 python3 git wget curl build-essential +RUN mkdir -m777 /opt/rust /opt/cargo +ENV RUSTUP_HOME=/opt/rust CARGO_HOME=/opt/cargo PATH=/opt/cargo/bin:$PATH +RUN wget --https-only --secure-protocol=TLSv1_2 -O- https://sh.rustup.rs | sh /dev/stdin -y +RUN printf '#!/bin/sh\nexport CARGO_HOME=/opt/cargo\nexec /bin/sh "$@"\n' >/usr/local/bin/sh +RUN chmod +x /usr/local/bin/sh # Copy only the cargo dependency-related files first, to cache efficiently COPY packages/backend/native-utils/Cargo.toml packages/backend/native-utils/Cargo.toml @@ -26,7 +31,7 @@ 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, and install dev mode dependencies for compilation +# Configure pnpm, and install dev mode dependencies for compilation RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i --frozen-lockfile # Copy in the rest of the native-utils rust files @@ -43,11 +48,11 @@ RUN env NODE_ENV=production sh -c "pnpm run --filter '!native-utils' build && pn RUN pnpm i --prod --frozen-lockfile ## Runtime container -FROM alpine:3.18 +FROM node:latest WORKDIR /firefish # Install runtime dependencies -RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip nodejs-current +RUN apt-get update && apt-get install -y libvips-dev zip unzip tini ffmpeg COPY . ./ @@ -69,5 +74,5 @@ COPY --from=build /firefish/packages/backend/native-utils/built /firefish/packag RUN corepack enable && corepack prepare pnpm@latest --activate ENV NODE_ENV=production VOLUME "/firefish/files" -ENTRYPOINT [ "/sbin/tini", "--" ] +ENTRYPOINT [ "/usr/bin/tini", "--" ] CMD [ "pnpm", "run", "migrateandstart" ] diff --git a/docs/migrate.md b/docs/migrate.md index 3ead1402..6569d419 100644 --- a/docs/migrate.md +++ b/docs/migrate.md @@ -103,4 +103,4 @@ NODE_ENV=production pnpm run migrate ## Reverse -You ***cannot*** migrate back to Misskey from Firefish due to re-hashing passwords on signin with argon2. You can migrate from Calckey to FoundKey, although this is not recommended due to FoundKey being end-of-life, and may have some problems with alt-text. +You ***cannot*** migrate back to Misskey from Firefish due to re-hashing passwords on signin with argon2. You can migrate from Firefish to FoundKey, although this is not recommended due to FoundKey being end-of-life, and may have some problems with alt-text. diff --git a/locales/bul_BG.yml b/locales/bul_BG.yml index 6c700af4..471d7202 100644 --- a/locales/bul_BG.yml +++ b/locales/bul_BG.yml @@ -1,5 +1,5 @@ _lang_: Български -cancel: Отмяна +cancel: Отмени noNotes: Няма публикации settings: Настройки headlineFirefish: Децентрализирана социална медийна платформа с отворен код, която @@ -101,6 +101,10 @@ _filters: followersOnly: Само последователи notesAfter: Публикации след fromDomain: От домейн + fromUser: От потребител + withFile: С файл + notesBefore: Публикации преди + followingOnly: Само последвани _notification: _types: follow: Нови последователи @@ -113,10 +117,10 @@ noLists: Нямаш никакви списъци markAsReadAllUnreadNotes: Маркирай всички публикации като прочетени markAsReadAllTalkMessages: Маркирай всички съобщения като прочетени _time: - second: Секунд(а/и) - hour: Час(а) + second: Секунди + hour: Часа day: Дни - minute: Минут(а/и) + minute: Минути create: Създай lists: Списъци reportAbuseOf: Докладвай {name} @@ -134,9 +138,9 @@ rename: Преименувай customEmojis: Персонализирани емоджита emoji: Емоджи _aboutFirefish: - translation: Преведи Calckey + translation: Преведи Firefish translatedFrom: Преведено от {x} -i18nInfo: Calckey се превежда на различни езици от доброволци. Можете да помогнете +i18nInfo: Firefish се превежда на различни езици от доброволци. Можете да помогнете на адрес {link}. image: Изображение recipient: Получател(и) @@ -222,11 +226,11 @@ _mfm: _messaging: groups: Групи apps: Приложения -introFirefish: Добре дошли! Calckey е децентрализирана социална медийна платформа +introFirefish: Добре дошли! Firefish е децентрализирана социална медийна платформа с отворен код, която е безплатна завинаги! 🚀 monthAndDay: '{day}/{month}' search: Търсене -searchPlaceholder: Търсене в Calckey +searchPlaceholder: Търсене в Firefish username: Потребителско име password: Парола fetchingAsApObject: Извличане от федивърса @@ -257,7 +261,7 @@ alreadyFavorited: Вече е добавено в отметки. cantFavorite: Неуспешно добавяне в отметки. copyContent: Копирай съдържанието deleteAndEdit: Изтрий и редактирай -editNote: Редактирай бележка +editNote: Редактирай публикация edited: Редактирано на {date} {time} addToList: Добави в списък sendMessage: Изпрати съобщение @@ -422,3 +426,51 @@ _visibility: followers: Последователи explore: Разглеждане theme: Теми +wallpaper: Тапет +setWallpaper: Задай тапет +removeWallpaper: Премахни тапет +themeForLightMode: Тема за използване в светъл режим +themeForDarkMode: Тема за използване в тъмен режим +light: Светло +dark: Тъмно +darkThemes: Тъмни теми +invitations: Покани +invitationCode: Код на поканата +checking: Проверка... +available: Свободно +unavailable: Не е свободно +tooShort: Твърде кратко +tooLong: Твърде дълго +weakPassword: Слаба парола +strongPassword: Силна парола +passwordMatched: Съвпада +passwordNotMatched: Не съвпада +signinWith: Вписване с {x} +aboutX: Относно {x} +openInNewTab: Отвори в нов раздел +_tutorial: + step2_1: Първо, моля, попълнете своя профил. + step2_2: Предоставянето на известна информация за това кой сте вие ще улесни другите + да разберат дали искат да видят вашите публикации или да ви следват. + title: Как се използва Firefish + step1_1: Добре дошли! + step5_1: Инфопотоци, инфопотоци навсякъде! + step3_1: Сега е време да последвате няколко хора! + step1_2: Нека да ви настроим. Ще бъдете готови за нула време! +openImageInNewTab: Отваряй изображенията в нов раздел +showOnRemote: Отвори оригиналната страница +lightThemes: Светли теми +syncDeviceDarkMode: Синхронизиране на тъмния режим с настройките на устройството +text: Текст +normalPassword: Средна парола +usernameInvalidFormat: Можете да използвате главни и малки букви, цифри и долни черти. +signinFailed: Неуспешно вписване. Въведените потребителско име или парола са неправилни. +signinRequired: Моля, регистрирайте се или се впишете, преди да продължите +start: Започни +confirm: Потвърди +failedToUpload: Неуспешно качване +_preferencesBackups: + cannotSave: Неуспешно запазване + cannotLoad: Неуспешно зареждане +editWidgetsExit: Готово +done: Готово diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 951259dc..7911b610 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -2074,7 +2074,7 @@ _relayStatus: accepted: Acceptat rejected: Rebutjat deleted: Eliminat -editNote: Edita la nota +editNote: Edita la publicació edited: 'Editat a {date} {time}' findOtherInstance: Cercar un altre servidor signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades, @@ -2182,3 +2182,7 @@ delete2fa: Desactivar 2FA delete2faConfirm: Això suprimirà irreversiblement 2FA en aquest compte. Procedir? addRe: Afegeix "re:" al començament del comentari quant responguis a un missatge amb avís de contingut +confirm: Confirmar +importZip: Importar ZIP +exportZip: Exportar ZIP +emojiPackCreator: Creador de paquets Emoji diff --git a/locales/de-DE.yml b/locales/de-DE.yml index fbfa23db..03cc2c3c 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -77,7 +77,7 @@ lists: "Listen" noLists: "Du hast keine Listen angelegt" note: "Beitrag" notes: "Beiträge" -following: "Folge ich" +following: "Folgen" followers: "Folgen mir" followsYou: "Folgt dir" createList: "Liste erstellen" @@ -474,7 +474,7 @@ invitations: "Einladungen" invitationCode: "Einladungscode" checking: "Wird überprüft …" available: "Verfügbar" -unavailable: "Unverfügbar" +unavailable: "Nicht verfügbar" usernameInvalidFormat: "Du kannst Klein- und Großbuchstaben, Zahlen sowie Unterstriche verwenden." tooShort: "Zu kurz" @@ -1945,7 +1945,7 @@ _notification: renote: "Renote" voted: haben bei deiner Umfrage abgestimmt reacted: hat auf deinen Beitrag reagiert - renoted: hat Ihren Beitrag geteilt + renoted: hat deinen Beitrag geteilt _deck: alwaysShowMainColumn: "Hauptspalte immer zeigen" columnAlign: "Spaltenausrichtung" @@ -2099,7 +2099,7 @@ customKaTeXMacro: Individuelle KaTeX Makros enableCustomKaTeXMacro: Individuelle KaTeX-Makros aktivieren replayTutorial: Wiederhole die Benutzeranleitung apps: Apps -caption: Automatische Untertitelung +caption: Automatische Beschreibung pwa: PWA installieren cw: Inhaltswarnung older: älter @@ -2204,3 +2204,7 @@ deletePasskeysConfirm: Alle Passkeys und Security-Keys werden unwiderruflich von inputNotMatch: Eingabe stimmt nicht überein addRe: Ein "re:" am Anfang des Kommentars hinzufügen, um einem Beitrag mit einer Inhaltswarnung zu antworten +confirm: Bestätigen +importZip: ZIP Importieren +emojiPackCreator: Emoji-Pack Ersteller +exportZip: ZIP Exportieren diff --git a/locales/en-US.yml b/locales/en-US.yml index 5035ec5a..a1be51a0 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -51,7 +51,7 @@ deleted: "Deleted" 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" +editNote: "Edit post" edited: "Edited at {date} {time}" addToList: "Add to list" sendMessage: "Send a message" @@ -337,11 +337,11 @@ emptyDrive: "Your Drive is empty" emptyFolder: "This folder is empty" unableToDelete: "Unable to delete" inputNewFileName: "Enter a new filename" -inputNewDescription: "Enter new caption" +inputNewDescription: "Enter new description" inputNewFolderName: "Enter a new folder name" circularReferenceFolder: "The destination folder is a subfolder of the folder you wish to move." -hasChildFilesOrFolders: "Since this folder is not empty, it can not be deleted." +hasChildFilesOrFolders: "Since this folder is not empty, it cannot be deleted." copyUrl: "Copy URL" rename: "Rename" avatar: "Avatar" @@ -634,8 +634,8 @@ disablePlayer: "Close video player" expandTweet: "Expand tweet" themeEditor: "Theme editor" description: "Description" -describeFile: "Add caption" -enterFileDescription: "Enter caption" +describeFile: "Add description" +enterFileDescription: "Enter description" author: "Author" leaveConfirm: "There are unsaved changes. Do you want to discard them?" manage: "Management" @@ -1054,7 +1054,7 @@ showUpdates: "Show a popup when Firefish updates" recommendedInstances: "Recommended servers" recommendedInstancesDescription: "Recommended servers separated by line breaks to appear in the recommended timeline." -caption: "Auto Caption" +caption: "Auto description" splash: "Splash Screen" updateAvailable: "There might be an update available!" swipeOnMobile: "Allow swiping between pages" @@ -1147,6 +1147,9 @@ addRe: "Add \"re:\" at the beginning of comment in reply to a post with a conten showBigPostButton: "Show a bigger post button in the posting form" confirm: "Confirm" emphasizeFollowed: "Highlight the \"Follows you\" sign on your follower info" +importZip: "Import ZIP" +exportZip: "Export ZIP" +emojiPackCreator: "Emoji pack creator" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 6e022b95..717c6b6a 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -572,8 +572,8 @@ 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: "Al ejecutar esto todas las cuentas de {host} dejarán + de seguirse. Por favor, ejecuta esto si el servidor ya no existe." userSuspended: "Este usuario ha sido suspendido." userSilenced: "Este usuario ha sido silenciado." yourAccountSuspendedTitle: "Esta cuenta ha sido suspendida" @@ -838,7 +838,7 @@ gallery: "Galería" recentPosts: "Posts recientes" popularPosts: "Más vistos" shareWithNote: "Compartir con una publicación" -ads: "Banners" +ads: "Banners de la comunidad" expiration: "Termina el" memo: "Notas" priority: "Prioridad" @@ -892,7 +892,7 @@ unmuteThread: "Mostrar hilo" ffVisibility: "Visibilidad de seguidores y seguidos" ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes te siguen" -continueThread: "Ver la continuación del hilo" +continueThread: "Continuar hilo" deleteAccountConfirm: "La cuenta será borrada irreversiblemente. ¿Está seguro?" incorrectPassword: "La contraseña es incorrecta" voteConfirm: "¿Confirma su voto a {choice}?" @@ -906,12 +906,12 @@ overridedDeviceKind: "Tipo de dispositivo" smartphone: "Teléfono smartphone" tablet: "Tablet" auto: "Automático" -themeColor: "Color del tema" +themeColor: "Color de la marquesina del servidor" size: "Tamaño" numberOfColumn: "Cantidad de columnas" searchByGoogle: "Buscar" -instanceDefaultLightTheme: "Tema claro por defecto de la instancia" -instanceDefaultDarkTheme: "Tema oscuro por defecto de la instancia" +instanceDefaultLightTheme: "Tema claro por defecto del servidor" +instanceDefaultDarkTheme: "Tema oscuro por defecto del servidor" instanceDefaultThemeDescription: "Ingrese el código del tema en formato objeto" mutePeriod: "Período de silenciamiento" indefinitely: "Sin límite de tiempo" @@ -968,7 +968,7 @@ 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." + puede ser activado para todo el servidor." 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 @@ -1085,6 +1085,7 @@ _aboutFirefish: pleaseDonateToHost: También considera donar a tu propio servidor , {host}, para ayudar con los costos de operación. sponsors: Patrocinadores de Firefish + misskeyContributors: Contribuidores de Misskey _nsfw: respect: "Ocultar medios NSFW" ignore: "No esconder medios NSFW " @@ -1177,8 +1178,10 @@ _mfm: fade: Fundido advanced: MFM avanzado play: Reproducir MFM - foregroundDescription: Cambiar el color en primer plano del texto. + foregroundDescription: Cambiar el color del texto en primer plano. background: Color de fondo + positionDescription: Mueve el contenido en una cantidad especificada. + fadeDescription: Funde el contenido dentro y fuera. _instanceTicker: none: "No mostrar" remote: "Mostrar a usuarios remotos" @@ -1197,7 +1200,7 @@ _channel: owned: "Dueño" following: "Siguiendo" usersCount: "{n} participantes" - notesCount: "{n} publicaciones" + notesCount: "{n} Publicaciones" nameOnly: Nombre solamente nameAndDescription: Nombre y descripción _menuDisplay: @@ -1301,7 +1304,7 @@ _theme: fgHighlighted: "Texto resaltado" _sfx: note: "Nueva publicación" - noteMy: "Nota (a mí mismo)" + noteMy: "Publicación propia" notification: "Notificaciones" chat: "Chat" chatBg: "Chat (Fondo)" @@ -1310,11 +1313,11 @@ _sfx: _ago: future: "Futuro" justNow: "Recién ahora" - secondsAgo: "Hace {n} segundo(s)" - minutesAgo: "Hace {n} minuto(s)" + secondsAgo: "Hace {n} s" + minutesAgo: "Hace {n} m" hoursAgo: "Hace {n} hora(s)" - daysAgo: "Hace {n} día(s)" - weeksAgo: "Hace {n} semana(s)" + daysAgo: "Hace {n} d" + weeksAgo: "Hace {n} sem" monthsAgo: "Hace {n} mes(es)" yearsAgo: "Hace {n} año(s)" _time: @@ -1339,15 +1342,15 @@ _tutorial: step5_1: "¡Líneas de tiempo, líneas de tiempo por todas partes!" step5_2: "Tu servidor 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." + de personas que sigues." 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." + de todos los demás en este servidor." + step5_5: "La línea de tiempo {icon} social es una combinación de las líneas de tiempo + Inicio y Local." + step5_6: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones + de los servidores que los administradores recomiendan." + step5_7: "La línea de tiempo {icon} global es donde puedes ver las publicaciones + de todos los demás servidores a los cuales este servidor conecta." step6_1: "Entonces, ¿qué es este lugar?" step6_2: "Bueno, no sólo te has unido a Firefish. Te has unido a un portal del Fediverso, una red interconectada de miles de servidores, llamada \"instancias\"" @@ -1368,6 +1371,26 @@ _2fa: 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" + chromePasskeyNotSupported: Contraseñas de Chrome no están soportadas. + removeKeyConfirm: ¿Realmente deseas borrar la clave {name}? + step3Title: Ingresa un código de autorización + renewTOTP: Reconfigurar la aplicación autorizadora + whyTOTPOnlyRenew: La aplicación autorizadora no puede ser quitada mientras la clave + de seguridad siga registrada. + renewTOTPConfirm: Esto causará que los códigos de verificación de la aplicación + anterior dejen de funcionar + renewTOTPOk: Reconfigurar + securityKeyNotSupported: Tu navegador no soporta claves de seguridad. + step2Click: Presionar este código QR te permitirá registrar la autorización 2FA + a tu clave de seguridad o aplicación autorizadora. + registerTOTPBeforeKey: Por favor configura una aplicación autorizadora para registrar + una clave de seguridad o de paso. + securityKeyName: Ingresa el nombre de la clave + tapSecurityKey: Por favor, espera al navegador para registrar la clave de seguridad + o de paso + renewTOTPCancel: Cancelar + token: Token 2FA + removeKey: Quitar clave de seguridad _permissions: "read:account": "Ver información de la cuenta" "write:account": "Editar información de la cuenta" @@ -1383,7 +1406,7 @@ _permissions: "write:messaging": "Administrar chat" "read:mutes": "Ver usuarios silenciados" "write:mutes": "Administrar usuarios silenciados" - "write:notes": "Crear/borrar notas" + "write:notes": "Crear o borrar publicaciones" "read:notifications": "Ver notificaciones" "write:notifications": "Administrar notificaciones" "read:reactions": "Ver reacciones" @@ -1405,16 +1428,19 @@ _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?" - permissionAsk: "Esta aplicación requiere los siguientes permisos" + permissionAsk: "Esta aplicación requiere los siguientes permisos:" pleaseGoBack: "Por favor, vuelve a la aplicación" callback: "Volviendo a la aplicación" denied: "Acceso denegado" + copyAsk: 'Por favor, pega el siguiente código de autorización en la aplicación:' + allPermissions: Acceso completo _antennaSources: - all: "Todas las notas" - homeTimeline: "Notas de los usuarios que sigues" - users: "Notas de un usuario o varios" - userList: "Notas de los usuarios de una lista" - userGroup: "Notas de los usuarios de una grupo" + all: "Todas las publicaciones" + homeTimeline: "Publicaciones de los usuarios que sigues" + users: "Publicaciones de usuarios específicos" + userList: "Publicaciones de una lista de usuarios específica" + userGroup: "Publicaciones de usuarios de un grupo" + instances: Publicaciones de todos los usuarios en un servidor _weekday: sunday: "Domingo" monday: "Lunes" @@ -1431,24 +1457,28 @@ _widgets: trends: "Tendencias" clock: "Reloj" rss: "Lector RSS" - rssTicker: "Ticker-RSS" + rssTicker: "Marquesina RSS" activity: "Actividad" photos: "Fotos" digitalClock: "Reloj digital" unixClock: "Reloj UNIX" federation: "Federación" - instanceCloud: "Nube de palabras de la instancia" + instanceCloud: "Nube de servidores" postForm: "Formulario" slideshow: "Diapositivas" button: "Botón" - onlineUsers: "Usuarios en linea" + onlineUsers: "Usuarios en línea" jobQueue: "Cola de trabajos" serverMetric: "Estadísticas del servidor" aiscript: "Consola de AiScript" aichan: "indigo" - userList: Lista Usuarios + userList: Lista de usuarios _userList: chooseList: Seleccione una lista + serverInfo: Información del servidor + meiliStatus: Estado del servidor + meiliSize: Tamaño del índice + meiliIndexCount: Publicaciones indizadas _cw: hide: "Ocultar" show: "Ver más" @@ -1478,18 +1508,18 @@ _poll: remainingSeconds: "Quedan {s} segundos para que finalice" _visibility: public: "Público" - publicDescription: "Visible para todos los usuarios" - home: "Inicio" + publicDescription: "Tu publicación será visible en todas las líneas de tiempo" + home: "Sin listar (Inicio)" homeDescription: "Visible sólo en la linea de tiempo de inicio" followers: "Seguidores" - followersDescription: "Visible sólo para tus seguidores" + followersDescription: "Hacer sólo visible sólo para tus seguidores y usuarios mencionados" specified: "Mensaje directo" specifiedDescription: "Visible sólo para los usuarios elegidos" localOnly: "Solo local" localOnlyDescription: "Oculto para usuarios remotos" _postForm: - replyPlaceholder: "Responder a esta nota" - quotePlaceholder: "Citar esta nota" + replyPlaceholder: "Responder a esta publicación..." + quotePlaceholder: "Citar esta publicación..." channelPlaceholder: "Postear en el canal" _placeholders: a: "¿Qué haces?" @@ -1514,7 +1544,7 @@ _profile: locationDescription: Si ingresas tu ciudad primero, el tiempo local tuyo será visible para otros usuarios. _exportOrImport: - allNotes: "Todas las notas" + allNotes: "Todas las publicaciones" followingList: "Siguiendo" muteList: "Silenciados" blockingList: "Bloqueados" @@ -1527,10 +1557,10 @@ _charts: usersIncDec: "Variación de usuarios" usersTotal: "Total de usuarios" activeUsers: "Cantidad de usuarios activos" - notesIncDec: "Variación de la cantidad de notas" - localNotesIncDec: "Variación de la cantidad de notas locales" - remoteNotesIncDec: "Variación de la cantidad de notas remotas" - notesTotal: "Total de notas" + notesIncDec: "Diferencia en la cantidad de publicaciones" + localNotesIncDec: "Diferencia en la cantidad de publicaciones locales" + remoteNotesIncDec: "Diferencia en el número de publicaciones remotas" + notesTotal: "Total de publicaciones" filesIncDec: "Variación de cantidad de archivos" filesTotal: "Total de archivos" storageUsageIncDec: "Variación de uso del almacenamiento" @@ -1539,8 +1569,8 @@ _instanceCharts: requests: "Pedidos" users: "Variación de usuarios" usersTotal: "Total acumulado de usuarios" - notes: "Variación de la cantidad de notas" - notesTotal: "Total acumulado de la cantidad de notas" + notes: "Diferencia en el número de publicaciones" + notesTotal: "Total acumulado de publicaciones" ff: "Variación de cantidad de seguidos/seguidores" ffTotal: "Total acumulado de cantidad de seguidos/seguidores" cacheSize: "Variación del tamaño de la caché" @@ -1627,10 +1657,10 @@ _pages: id: "Lienzo ID" width: "Ancho" height: "Altura" - note: "Nota embebida" + note: "Publicación incrustada" _note: - id: "Id de la nota" - idDescription: "Pega la URL de la nota para configurarla" + id: "ID de la publicación" + idDescription: "Puedes también pegar la URL de la publicación aquí." detailed: "Ver Detalles" switch: "Interruptor" _switch: @@ -1853,7 +1883,7 @@ _notification: youGotMention: "Mención de {name}" youGotReply: "Respuesta de {name}" youGotQuote: "Citado por {name}" - youRenoted: "Renotado por {name}" + youRenoted: "Impulsado por {name}" youGotPoll: "Encuestado por {name}" youGotMessagingMessageFromUser: "{name} comenzó un chat contigo" youGotMessagingMessageFromGroup: "Tienes un chat de {name}" @@ -1868,7 +1898,7 @@ _notification: follow: "Siguiendo" mention: "Menciones" reply: "Respuestas" - renote: "Renotar" + renote: "Impulsos" quote: "Citar" reaction: "Reacción" pollVote: "Votado en la encuesta" @@ -1880,7 +1910,10 @@ _notification: _actions: followBack: "Te sigue de vuelta" reply: "Responder" - renote: "Renotar" + renote: "Impulsos" + renoted: impulsó tu publicación + reacted: reaccionó a tu publicación + voted: votó en tu encuesta _deck: alwaysShowMainColumn: "Siempre mostrar la columna principal" columnAlign: "Alinear columnas" @@ -1892,9 +1925,9 @@ _deck: swapDown: "Mover abajo" stackLeft: "Apilar a la izquierda" popRight: "Sacar a la derecha" - profile: "Perfil" - newProfile: "Nuevo perfil" - deleteProfile: "Eliminar perfil" + profile: "Espacio de trabajo" + newProfile: "Nuevo espacio de trabajo" + deleteProfile: "Eliminar espacio de trabajo" 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." @@ -1905,10 +1938,13 @@ _deck: widgets: "Widgets" notifications: "Notificaciones" tl: "Linea de tiempo" - antenna: "Antenas" + antenna: "Antena" list: "Listas" mentions: "Menciones" - direct: "Mensaje directo" + direct: "Mensajes directos" + channel: Canal + renameProfile: Renombrar espacio de trabajo + nameAlreadyExists: Este nombre de espacio de trabajo ya existe. manageGroups: Administrar grupos replayTutorial: Repetir Tutorial privateMode: Modo privado @@ -1923,11 +1959,13 @@ breakFollowConfirm: ¿Estás seguro de que quieres eliminar el seguidor? subscribePushNotification: Habilitar notificaciones unsubscribePushNotification: Desactivar notificaciones pushNotificationAlreadySubscribed: Las notificaciones ya están activados -pushNotificationNotSupported: Su navegador o instancia no admite notificaciones +pushNotificationNotSupported: Su navegador o servidor no admite notificaciones moveAccount: ¡Mover cuenta! moveFrom: Mueve a esta cuenta de una cuenta antigua moveFromLabel: 'La cuenta que estás moviendo de:' -moveAccountDescription: '' +moveAccountDescription: 'Este proceso es irreversible. Asegúrate de configurar un + alias para ésta cuenta en tu cuenta nueva antes de comenzar. Por favor, ingresa + la etiqueta de la cuenta en el formato siguiente: @persona@servidor.tld' license: Licencia noThankYou: No gracias userSaysSomethingReason: '{name} dijo {reason}' @@ -1938,7 +1976,7 @@ caption: Auto Subtítulos showAds: Mostrar banners enterSendsMessage: Presione "RETORNO" en los mensajes para enviar el mensaje (para apagarlo es Ctrl + RETORNO) -recommendedInstances: Instancias Recomendadas +recommendedInstances: Servidores recomendados instanceSecurity: Seguridad del servidor seperateRenoteQuote: Separar botones de Impulsar y Citar _messaging: @@ -1995,6 +2033,10 @@ _filters: fromUser: Del usuario fromDomain: Desde el dominio notesAfter: Publicaciones posteriores + followingOnly: Sólo seguidos + withFile: Con archivo + followersOnly: Sólo seguidores + notesBefore: Publicaciones anteriores userSaysSomethingReasonReply: '{name} respondió a una publicación que contiene {reason}' userSaysSomethingReasonQuote: '{name} citó una publicación que contiene {reason}' privateModeInfo: Al activar, solo servidores autorizados podrán federar con tu servidor. @@ -2022,3 +2064,103 @@ remindMeLater: Recordar nuevamente removeQuote: Eliminar cita removeRecipient: Eliminar destinatario removeMember: Eliminar miembro +_skinTones: + light: Claro + dark: Obscuro + yellow: Amarillo + medium: Medio + mediumLight: Claro medio + mediumDark: Obscuro medio +secureModeInfo: Al pedir a otros servidores, no mandar si no hay prueba de confianza. +enableIdenticonGeneration: Activar la generación de Identicon +sendModMail: Enviar aviso de moderación +reactionPickerSkinTone: Tono de piel preferido en emojis +_dialog: + charactersExceeded: '¡Límite de caracteres excedido! Actual: {current}/Límite: {max}' + charactersBelow: '¡Caracteres insuficientes! Actual: {current}/Límite: {min}' +expandOnNoteClick: Abrir publicación al hacer click +_experiments: + enablePostImports: Habilitar importación de publicaciones + title: Experimentos + postImportsCaption: Permite a los usuarios importar sus publicaciones desde Firefish, + Misskey, Mastodon, Akkoma y Pleroma. Puede causar una bajada en el rendimiento + del servidor si la cola de trabajos está atascada. +showUpdates: Mostrar una notificación emergente cuando Firefish se actualice +recommendedInstancesDescription: Servidores recomendados separador por saltos de línea + para que aparezcan el la línea de tiempo recomendados. +swipeOnMobile: Permitir el pase entre páginas +addRe: Añadir "re:" al comienzo del comentario en una respuesta a una publicación + sin aviso de contenido +showAdminUpdates: Avisar si hay una nueva versión de Firefish disponible (sólo adminsitrador) +_feeds: + rss: RSS + copyFeed: Copiar feed + atom: Atom + jsonFeed: Feed JSON +secureMode: Modo seguro (Recuperación Autorizada) +splash: Pantalla de bienvenida +moveToLabel: 'Cuenta a la cual estás migrando:' +alt: ALT +video: Video +audio: Audio +swipeOnDesktop: Permitir el pase de páginas del estilo móvil en el escritorio +enableCustomKaTeXMacro: Habilitar macros KaTeX personalizadas +noteId: ID de publicación +preventAiLearning: Prevenir el uso por parte de bots de IA +isLocked: Esta cuenta requiere aprobación de seguidores +origin: Origen +newer: reciente +older: antiguo +objectStorageS3ForcePathStyle: Usar URL de punto final basada en rutas +objectStorageS3ForcePathStyleDesc: Activa esto para construir puntos finales URL en + el formato 's3.amazonaws.com//' en lugar de '.s3.amazonaws.com'. +customSplashIconsDescription: URL para los iconos de la pantalla de bienvenida separadas + por saltos de línea para ser mostrados al azar cada vez que el usuario carga/recarga + la página. Por favor, asegúrate que las imágenes sean URL estáticas, preferentemente + a 192x192. +updateAvailable: ¡Quizá hay una actualización disponible! +moveTo: Mover la cuenta actual a una cuenta nueva +moveFromDescription: 'Esto pondrá un alias en tu cuenta antigua para así poder migrar + desde esa cuenta a la nueva. Haz esto ANTES de migrar tu cuenta antigua. Por favor, + ingresa la etiqueta de la cuenta con el formato siguiente: @persona@servidor.tld' +defaultReaction: Emoji por defecto para reaccionar a las publicaciones entrantes y + salientes +indexFromDescription: Deja en blanco para indizar todas las publicaciones +deletePasskeys: Borrar claves de paso +deletePasskeysConfirm: Esto borrará irreversiblemente todas las claves de paso y de + seguridad en esta cuenta, ¿Proceder? +inputNotMatch: Las entradas no coinciden +indexFrom: Indizar desde la ID de la publicación en adelante +indexPosts: Indizar publicaciones +isModerator: Moderador +isAdmin: Administrador +isPatron: Mecenas de Firefish +logoImageUrl: URL de la imagen del logotipo +xl: XL +migrationConfirm: "¿Estás absolutamente seguro de que quieres migrar a tu cuenta a + {account}? Una vez hecho esto, no podrás revertir el cambio, ni tampoco usar tu + cuenta normalmente.\nTambién, asegúrate de que has configurado ésta cuenta como + la cuenta desde la cual estás migrando." +indexNotice: Indizando ahora. Esto puede llevar bastante tiempo, por favor, no reinicies + el servidor por lo menos hasta dentro de una hora. +customKaTeXMacro: Macros KaTeX personalizadas +customKaTeXMacroDescription: '¡Configura macros para escribir expresiones matemáticas + fácilmente! La notación es conforme la las definiciones de comandos LaTeX y puede + ser escrita como \nuevocomando{\ nombre}{contenido} o \nuevocomando{\nombre}[número + de argumentos]{contenido}. Por ejemplo, \nuevocomando{\añadir}[2]{#1 + #2} expanderá + \añadir{3}{foo} a 3 + foo. Las llaves que contienen al nombre de la macro serán + cambiadas a paréntesis o corchetes. Esto afecta a los corchetes usados para argumentos. + Una (y sólo una) macro puede ser definida por línea, y no podrás saltar la línea + en medio de la definición. Líneas erróneas son ignoradas. Sólo funciones de sustitución + simple son soportadas; sintaxis avanzada, como ramificación condicional no puede + ser usada aquí.' +signupsDisabled: Los registros en esta instancia están desactivados, pero, ¡siempre + podrás registrarte en otro servidor! Si tienes un código de invitación para este + servidor, por favor, rellena el campo siguiente. +preventAiLearningDescription: Pedir a los modelos de IA no analizar el contenido de + publicas, como publicaciones e imágenes. +noGraze: Por favor desactiva la extensión de navegador "Graze for Mastodon" ya que + interfiere con Firefish. +silencedWarning: Esta página se muestra debido a que estos usuarios son de servidores + que tu administrador ha silenciado, ya que son presumiblemente fuente de spam. +isBot: Esta cuenta es un bot diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 558ac9c8..a4571a07 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -53,7 +53,7 @@ sendMessage: "Envoyer un message" copyUsername: "Copier le nom d’utilisateur·rice" searchUser: "Chercher un·e utilisateur·rice" reply: "Répondre" -loadMore: "Afficher plus" +loadMore: "Charger plus" showMore: "Afficher plus" showLess: "Fermer" youGotNewFollower: "Vous suit" @@ -120,8 +120,8 @@ reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, « + » pour ajouter." rememberNoteVisibility: "Se souvenir des paramètres de visibilité des publications" attachCancel: "Supprimer le fichier attaché" -markAsSensitive: "Marquer comme sensible" -unmarkAsSensitive: "Supprimer le marquage comme sensible" +markAsSensitive: "Marquer comme sensible (NSFW)" +unmarkAsSensitive: "Supprimer le marquage comme sensible (NSFW)" enterFileName: "Entrer le nom du fichier" mute: "Masquer" unmute: "Ne plus masquer" @@ -245,7 +245,7 @@ currentPassword: "Mot de passe actuel" newPassword: "Nouveau mot de passe" newPasswordRetype: "Répéter le nouveau mot de passe" attachFile: "Joindre un fichier" -more: "Plus" +more: "Plus !" featured: "Tendances" usernameOrUserId: "Nom d’utilisateur·rice ou ID utilisateur" noSuchUser: "Utilisateur·rice non trouvé·e" @@ -318,7 +318,7 @@ copyUrl: "Copier l’URL" rename: "Renommer" avatar: "Avatar" banner: "Bannière" -nsfw: "Contenu sensible" +nsfw: "Contenu sensible (NSFW)" whenServerDisconnected: "Lorsque la connexion au serveur est perdue" disconnectedFromServer: "Déconnecté·e du serveur" reload: "Rafraîchir" @@ -516,11 +516,11 @@ showFeaturedNotesInTimeline: "Afficher les publications des Tendances dans le fi d'actualité" objectStorage: "Stockage d'objets" useObjectStorage: "Utiliser le stockage d'objets" -objectStorageBaseUrl: "Base URL" +objectStorageBaseUrl: "URL racine" 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.\n - Ex: 'https://.s3.amazonaws.com' pour AWS S3 et 'https://storage.googleapis.com/' + Ex : 'https://.s3.amazonaws.com' pour AWS S3 et 'https://storage.googleapis.com/' pour GCS." objectStorageBucket: "Bucket" objectStorageBucketDesc: "Veuillez spécifier le nom du compartiment utilisé sur le @@ -591,7 +591,7 @@ divider: "Séparateur" addItem: "Ajouter un élément" relays: "Relais" addRelay: "Ajouter un relais" -inboxUrl: "Inbox URL" +inboxUrl: "URL de boîte de récéption" addedRelays: "Relais ajoutés" serviceworkerInfo: "Devrait être activé pour les notifications push." deletedNote: "Publication supprimée" @@ -729,7 +729,7 @@ noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre publication sur \"Abonné-e-s\", vos publications 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" +alwaysMarkSensitive: "Marquer les médias comme contenu sensible (NSFW) 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 @@ -839,7 +839,7 @@ gallery: "Galerie" recentPosts: "Publications récentes" popularPosts: "Publications populaires" shareWithNote: "Partager dans une publication" -ads: "Bannière communautaire" +ads: "Bannières communautaires" expiration: "Échéance" memo: "Pense-bête" priority: "Priorité" @@ -986,8 +986,8 @@ _plugin: manage: "Gestion des plugins" _registry: scope: "Portée" - key: "Clé " - keys: "Clé " + key: "Clé" + keys: "Clés" domain: "Domaine" createKey: "Créer une clé" _aboutFirefish: @@ -1011,8 +1011,8 @@ _aboutFirefish: le lien ci-dessus pour avoir votre nom affiché ici ! misskeyContributors: Contributeurs Misskey _nsfw: - respect: "Cacher les médias marqués comme contenu sensible" - ignore: "Afficher les médias sensibles" + respect: "Cacher les médias marqués comme contenu sensible (NSFW)" + ignore: "Afficher les médias sensibles (NSFW)" force: "Cacher tous les médias" _mfm: cheatSheet: "Antisèche MFM" @@ -1021,7 +1021,7 @@ _mfm: dummy: "La Fédiverse s'agrandit avec Firefish" mention: "Mentionner" mentionDescription: "Vous pouvez afficher un utilisateur spécifique en indiquant - une arobase suivie d'un nom d'utilisateur" + le symbole d'arobase (@) suivie d'un nom d'utilisateur." hashtag: "Hashtags" hashtagDescription: "Vous pouvez afficher les hashtags en utilisant un croisillon et du texte." @@ -1034,7 +1034,7 @@ _mfm: small: "Diminuer l'emphase" smallDescription: "Le contenu peut être affiché en petit et fin." center: "Centrer" - centerDescription: "Le contenu peut être centré" + centerDescription: "Centre le contenu sur la page." inlineCode: "Code (inline)" inlineCodeDescription: "Affiche la coloration syntaxique des lignes de code." blockCode: "Bloc de code" @@ -1105,7 +1105,7 @@ _mfm: background: Couleur d'arrière-plan plain: Simple _instanceTicker: - none: "Cacher " + none: "Cacher" remote: "Montrer pour les utilisateur·ice·s distant·e·s" always: "Toujours afficher" _serverDisconnectedBehavior: @@ -1170,17 +1170,17 @@ _theme: color: "Couleur" refProp: "Appeler une propriété" refConst: "Appeler une constante" - key: "Clé " + key: "Clé" func: "Fonction" funcKind: "Type de fonction" argument: "Argument" basedProp: "Nom de la propriété référencée" alpha: "Transparence" - darken: "Sombre" + darken: "Assombrir" 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." + son code ici" deleteConstantConfirm: "Êtes-vous sûr·e de vouloir supprimer la constante {const} ?" keys: @@ -1252,9 +1252,9 @@ _time: day: "j" _tutorial: title: "Comment utiliser Firefish" - 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" + 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 publcations ou vous suivre." step3_1: "Maintenant il est temps de suivre des gens !" @@ -1265,7 +1265,7 @@ _tutorial: step4_2: "Pour votre première publication, certaines personnes aiment faire une {introduction} ou un simple 'Bonjour tout le monde !'" step5_1: "Des fils, des fils d’actualité partout !" - step5_2: "Votre serveur a {timelines} fils différents disponibles !" + step5_2: "Votre serveur a {timelines} fils différents activés." step5_3: "Le fil {icon} Principal est l'endroit où vous pouvez voir les publications de vos abonnements." step5_4: "La fil {icon} Local est l'endroit où vous pouvez voir les publications @@ -1357,7 +1357,7 @@ _permissions: _auth: shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?" shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre - compte?" + compte ?" permissionAsk: "Cette application nécessite les autorisations suivantes :" pleaseGoBack: "Veuillez retourner à l’application" callback: "Retour vers l’application" @@ -1412,7 +1412,7 @@ _widgets: rssTicker: Bandeau RSS _cw: hide: "Masquer" - show: "Afficher plus …" + show: "Afficher contenu" chars: "{count} caractères" files: "{count} fichiers" _poll: @@ -1422,8 +1422,8 @@ _poll: canMultipleVote: "Autoriser le multi-choix" expiration: "Fin du sondage" infinite: "Illimité" - at: "Choisir une date" - after: "Choisir la durée" + at: "Expire le..." + after: "Expire après..." deadlineDate: "Date de fin" deadlineTime: "Heure de fin" duration: "Durée" @@ -1468,7 +1468,7 @@ _profile: metadataEdit: "Éditer les informations supplémentaires" metadataDescription: "Vous pouvez afficher jusqu'à quatre informations supplémentaires dans votre profil. Vous pouvez ajouter une balise {a} ou une balise {l} avec {rel} - pour vérifier le lien sur votre profil!" + pour vérifier le lien sur votre profil !" metadataLabel: "Étiquette" metadataContent: "Contenu" changeAvatar: "Changer l'image de profil" @@ -1503,7 +1503,7 @@ _instanceCharts: usersTotal: "Total cumulé du nombre d'utilisateur·rice·s" notes: "Variation du nombre de publications" notesTotal: "Nombre total cumulé des publications" - ff: "Variation des abonné·e·s / abonnements" + ff: "Variation des abonnements / abonné·e·s " ffTotal: "Total cumulé du nombre d'abonné·e·s / abonnements" cacheSize: "Variation de la taille du cache" cacheSizeTotal: "Total cumulé de la taille du cache" @@ -1812,7 +1812,7 @@ _relayStatus: accepted: "Accepté" rejected: "Refusée" _notification: - fileUploaded: "Le fichier a été téléversé !" + fileUploaded: "Le fichier a été téléversé" youGotMention: "{name} vous a mentionné" youGotReply: "Réponse de {name}" youGotQuote: "Cité·e par {name}" @@ -1993,7 +1993,7 @@ type: Type speed: Vitesse slow: Lent move: Déplacer -showAds: Afficher les bannières communautaire/publicités +showAds: Afficher les bannières communautaire (publicités) enterSendsMessage: Appuyer sur Entrée pendant la rédaction pour envoyer le message (sinon Ctrl+Entrée) allowedInstancesDescription: Noms des serveurs autorisés pour la fédération, chacun @@ -2071,14 +2071,14 @@ customKaTeXMacro: Macros KaTeX personnalisées enableCustomKaTeXMacro: Activer les macros KaTeX personnalisées noteId: ID des publications 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 + 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 + 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 le fil recommandé silenceThisInstance: Masquer ce serveur @@ -2197,7 +2197,7 @@ _skinTones: objectStorageS3ForcePathStyle: Utiliser des URL d'endpoints basées sur le chemin objectStorageS3ForcePathStyleDesc: Activez cette option pour construire les URL d'endpoints au format 's3.amazonaws.com//' au lieu de '.s3.amazonaws.com'. -delete2fa: Supprimer 2FA +delete2fa: Désativer A2F deletePasskeys: Supprimer les clés d'accès delete2faConfirm: Cela supprimera de manière irréversible la double authentification sur ce compte. Souhaitez-vous continuer ? @@ -2206,3 +2206,7 @@ deletePasskeysConfirm: Cela supprimera de manière irréversible toutes les clé et les clés de sécurité sur ce compte. Souhaitez-vous continuer ? addRe: Ajouter "re:" au début d’un avertissement de contenu (CW) en réponse à une publication avec un avertissement de contenu +confirm: Confirmer +importZip: Importer ZIP +exportZip: Exporter ZIP +emojiPackCreator: Créateur de pack d’emoji diff --git a/locales/id-ID.yml b/locales/id-ID.yml index ca40947b..39374c20 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -310,7 +310,7 @@ emptyDrive: "Drive kosong" emptyFolder: "Folder kosong" unableToDelete: "Tidak dapat menghapus" inputNewFileName: "Masukkan nama berkas yang baru" -inputNewDescription: "Masukkan keterangan disini" +inputNewDescription: "Masukkan deskripsi baru" inputNewFolderName: "Masukkan nama folder yang baru" circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu pindahkan." @@ -598,8 +598,8 @@ disablePlayer: "Tutup pemutar video" expandTweet: "Perluas utas" themeEditor: "Penyunting tema" description: "Deskripsi" -describeFile: "Tambahkan keterangan" -enterFileDescription: "Masukkan keterangan" +describeFile: "Tambahkan deskripsi" +enterFileDescription: "Masukkan deskripsi" author: "Pembuat" leaveConfirm: "Ada perubahan yang belum disimpan. Apakah kamu ingin membuangnya?" manage: "Manajemen" @@ -1904,7 +1904,7 @@ recommended: Direkomendasikan silenceThisInstance: Bisukan server ini hiddenTags: Tagar Tersembunyi preferencesBackups: Preferensi cadangan -editNote: Sunting catatan +editNote: Sunting kiriman deleted: Dihapus edited: Disunting pada {date} {time} selectInstance: Pilih server @@ -2019,7 +2019,7 @@ showAdminUpdates: Indikasi versi Firefish baru tersedia (hanya admin) indexFrom: Indeks dari Post ID berikutnya noteId: ID Postingan findOtherInstance: Cari server lain -caption: Keterangan Otomatis +caption: Deskripsi itomatis splash: Layar Percik migration: Migrasi moveTo: Pindahkan akun sekarang ke akun baru @@ -2165,3 +2165,7 @@ delete2faConfirm: Ini akan menghapus 2FA secara permanen pada akun ini. Lanjutka deletePasskeysConfirm: Ini akan menghapus semua passkeys dan kunci keamanan pada akun ini secara permanen. Lanjutkan? addRe: Tambahkan "re:" pada awal komentar balasan postingan dengan peringatan konten +confirm: Konfirmasi +importZip: Impor ZIP +exportZip: Ekspor ZIP +emojiPackCreator: Pembuat paket emoji diff --git a/locales/it-IT.yml b/locales/it-IT.yml index cd8105ea..cbea8b6d 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -1,17 +1,15 @@ _lang_: "Italiano" -headlineFirefish: "Rete collegata tramite note" -introFirefish: "Benvenut@! Firefish è 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! 🚀" +headlineFirefish: "Una piattaforma social open source, decentralizzata che sarà gratuita + per sempre! 🚀" +introFirefish: "Benvenuti! Firefish è una piattaforma social open source, decentralizzata + che sarà sempre gratuita! 🚀" monthAndDay: "{day}/{month}" search: "Cerca" notifications: "Notifiche" username: "Nome utente" password: "Password" -forgotPassword: "Hai dimenticato la tua password?" -fetchingAsApObject: "Recuperando dal Fediverso" +forgotPassword: "Password dimenticata" +fetchingAsApObject: "Caricamento dal Fediverso" ok: "OK" gotIt: "Ho capito!" cancel: "Annulla" @@ -19,7 +17,7 @@ enterUsername: "Inserisci un nome utente" renotedBy: "Rinotato da {user}" noNotes: "Nessuna nota!" noNotifications: "Nessuna notifica" -instance: "Istanza" +instance: "Server" settings: "Impostazioni" basicSettings: "Impostazioni generali" otherSettings: "Altre impostazioni" @@ -68,8 +66,8 @@ 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}\"? Sarà rimosso da + tutti i post che lo contengono." 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." @@ -108,7 +106,7 @@ renoted: "Rinotato!" cantRenote: "È impossibile rinotare questa nota." cantReRenote: "È impossibile rinotare una Rinota." quote: "Cita" -pinnedNote: "Nota fissata" +pinnedNote: "Post fissato" pinned: "Fissa sul profilo" you: "Tu" clickToShow: "Clicca per visualizzare" @@ -118,7 +116,7 @@ reaction: "Reazione" reactionSetting: "Reazioni visualizzate sul pannello" reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere." -rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note" +rememberNoteVisibility: "Ricorda le impostazioni di visibilità del post" attachCancel: "Rimuovi allegato" markAsSensitive: "Segna come sensibile" unmarkAsSensitive: "Segna come non sensibile" @@ -147,9 +145,8 @@ 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." + scaricati direttamente dal loro server. L'opzione permette di risparmiare spazio + ma aumenta il traffico di rete e 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 @@ -161,7 +158,7 @@ autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti ch già segui" addAccount: "Aggiungi account" loginFailed: "Accesso non riuscito" -showOnRemote: "Sfoglia sull'istanza remota" +showOnRemote: "Leggi sul sito origine" general: "Generali" wallpaper: "Sfondo" setWallpaper: "Imposta sfondo" @@ -171,15 +168,16 @@ 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." + sotto certe condizioni. Ad esempio, quando un utente aggiunge un utente remoto a + una lista, le attività di quell'utente potrebbero comunque non essere visualizzate + in locale se nessun altro utente lo segue su questo server, l'account proxy si occuperà + di seguire e acquisire i post." host: "Server remoto" selectUser: "Seleziona utente" recipient: "Destinatario" annotation: "Descrizione" federation: "Federazione" -instances: "Istanza" +instances: "Server" registeredAt: "Registrato presso" latestRequestSentAt: "Ultima richiesta inviata" latestRequestReceivedAt: "Ultima richiesta ricevuta" @@ -189,7 +187,7 @@ charts: "Grafici" perHour: "All'ora" perDay: "al giorno" stopActivityDelivery: "Interrompi la distribuzione di attività" -blockThisInstance: "Blocca l'istanza" +blockThisInstance: "Blocca questo server" operations: "Operazioni" software: "Software" version: "Versione" @@ -199,27 +197,27 @@ jobQueue: "Coda di lavoro" cpuAndMemory: "CPU e Memoria" network: "Rete" disk: "Disco" -instanceInfo: "Informazioni sull'istanza" +instanceInfo: "Informazioni sul server" statistics: "Statistiche" clearQueue: "Svuota coda" clearQueueConfirmTitle: "Vuoi davvero svuotare la coda?" -clearQueueConfirmText: "Le note ancora non distribuite non verranno rilasciate. Solitamente, +clearQueueConfirmText: "I post ancora in coda non verranno più federati. 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." +blockedInstances: "Server bloccati" +blockedInstancesDescription: "Elenca gli hostname dei server che vuoi bloccare. Non + potranno più comunicare con il tuo server." muteAndBlock: "Silenziati / Bloccati" mutedUsers: "Account silenziati" blockedUsers: "Account bloccati" noUsers: "Nessun utente trovato" editProfile: "Modifica profilo" -noteDeleteConfirm: "Eliminare questo Nota?" +noteDeleteConfirm: "Vuoi eliminare questo post?" pinLimitExceeded: "Non puoi fissare altre note " intro: "L'installazione di Firefish è finita! Si prega di creare un account amministratore." done: "Fine" -processing: "In elaborazione" +processing: "Elaborazione in corso" preview: "Anteprima" default: "Predefinito" noCustomEmojis: "Nessun emoji" @@ -231,9 +229,9 @@ all: "Tutti" subscribing: "Iscrivendo" publishing: "Pubblicando" notResponding: "Nessuna risposta" -instanceFollowing: "Seguiti dall'istanza" -instanceFollowers: "Followers dell'istanza" -instanceUsers: "Utenti dell'istanza" +instanceFollowing: "Seguiti su questo server" +instanceFollowers: "Follower del server" +instanceUsers: "Utenti del server" changePassword: "Aggiorna Password" security: "Sicurezza" retypedNotMatch: "Le password non corrispondono." @@ -323,8 +321,8 @@ unwatch: "Smetti di Osserva" accept: "Accetta" reject: "Rifiuta" normal: "Normale" -instanceName: "Nome dell'istanza" -instanceDescription: "Descrizione dell'istanza" +instanceName: "Nome del server" +instanceDescription: "Descrizione del server" maintainerName: "Nome dell'Amministratore" maintainerEmail: "Indirizzo e-mail dell'Amministratore" tosUrl: "Termini di servizio URL" @@ -335,7 +333,7 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Pagine" -integration: "App collegate" +integration: "Integrazioni" connectService: "Connessione" disconnectService: "Disconnessione " enableLocalTimeline: "Abilita Timeline locale" @@ -357,9 +355,9 @@ pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagi \"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." + alla home page del server. Una pagina per riga." pinnedClipId: "ID della clip in evidenza" -pinnedNotes: "Nota fissata" +pinnedNotes: "Post fissati" hcaptcha: "hCaptcha" enableHcaptcha: "Abilita hCaptcha" hcaptchaSiteKey: "Chiave del sito" @@ -379,14 +377,14 @@ 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\"." -notifyAntenna: "Invia notifiche delle nuove note" -withFileAntenna: "Solo note con file in allegato" +notifyAntenna: "Notifica i nuovi post" +withFileAntenna: "Solo post con file allegati" enableServiceworker: "Abilita ServiceWorker" antennaUsersDescription: "Inserisci solo un nome utente per riga" caseSensitive: "Sensibile alla distinzione tra maiuscole e minuscole" withReplies: "Includere le risposte" connectedTo: "Sei conness@ agli account qui sotto:" -notesAndReplies: "Note e risposte" +notesAndReplies: "Post e risposte" withFiles: "Con file in allegato" silence: "Silenzia" silenceConfirm: "Vuoi davvero silenziare l'utente?" @@ -422,7 +420,7 @@ notFoundDescription: "Nessuna pagina corrisponde all'URL indicata." uploadFolder: "Destinazione caricamento predefinita" cacheClear: "Svuota cache" markAsReadAllNotifications: "Segna tutte le notifiche come lette" -markAsReadAllUnreadNotes: "Segna tutte le note come lette" +markAsReadAllUnreadNotes: "Segna tutti post come letti" markAsReadAllTalkMessages: "Segna tutte le chat come lette" help: "Guida" inputMessageHere: "Scrivi messaggio qui" @@ -443,7 +441,7 @@ text: "Testo" enable: "Abilita" next: "Avanti" retype: "Conferma" -noteOf: "Note di {user}" +noteOf: "Post di {user}" inviteToGroup: "Invitare al gruppo" quoteAttached: "Citazione allegata" quoteQuestion: "Vuoi aggiungere una citazione?" @@ -501,8 +499,8 @@ accountSettings: "Impostazioni account" promotion: "Promossa" promote: "Pubblicizza" numberOfDays: "Numero di giorni" -hideThisNote: "Nasconda la nota" -showFeaturedNotesInTimeline: "Mostrare le note di tendenza nella tua timeline" +hideThisNote: "Nascondi questo post" +showFeaturedNotesInTimeline: "Mostra i post suggeriti nella tua timeline" objectStorage: "Stoccaggio oggetti" useObjectStorage: "Utilizza stoccaggio oggetti" objectStorageBaseUrl: "Base URL" @@ -530,7 +528,7 @@ objectStorageSetPublicRead: "Imposta \"visibilità pubblica\" al momento di cari serverLogs: "Log del server" deleteAll: "Cancella cronologia" showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline" -newNoteRecived: "Vedi le nuove note" +newNoteRecived: "Ci sono nuovi post" sounds: "Impostazioni suoni" listen: "Ascolta" none: "Niente" @@ -563,8 +561,8 @@ 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 follow verso il server {host}. È + utile soprattutto se per esempio il server non esiste più." userSuspended: "L'utente è sospes@." userSilenced: "L'utente è silenziat@." yourAccountSuspendedTitle: "Questo account è sospeso." @@ -579,8 +577,8 @@ addRelay: "Aggiungi ripetitore" inboxUrl: "Inbox URL" addedRelays: "Ripetitori configurati" serviceworkerInfo: "Deve essere abilitato per le notifiche push. " -deletedNote: "Nota eliminata" -invisibleNote: "Nota invisibile" +deletedNote: "Post rimosso" +invisibleNote: "Post invisibile" enableInfiniteScroll: "Abilita scorrimento infinito" visibility: "Visibilità" poll: "Sondaggio" @@ -590,7 +588,7 @@ disablePlayer: "Chiudi lettore video" expandTweet: "Espandi tweet" themeEditor: "Editor di temi" description: "Descrizione" -describeFile: "Aggiungi una descrizione d'immagine" +describeFile: "Aggiungi descrizione" enterFileDescription: "Inserisci descrizione" author: "Autore" leaveConfirm: "Ci sono delle modifiche ancora non salvate. Vuoi cancellarle?" @@ -631,7 +629,7 @@ smtpSecure: "Usare la porta SSL/TLS implicito per le connessioni SMTP" smtpSecureInfo: "Disabilitare quando è attivo STARTTLS." testEmail: "Testare la consegna di posta elettronica" wordMute: "Filtri parole" -instanceMute: "Silenzia l'istanza" +instanceMute: "Server silenziati" userSaysSomething: "{name} ha detto qualcosa" makeActive: "Attiva" display: "Visualizza" @@ -661,7 +659,7 @@ 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." + riguarda un post specifico, inserisci anche l'URL di riferimento." abuseReported: "La segnalazione è stata inviata. Grazie." reporter: "il corrispondente" reporteeOrigin: "Origine del segnalato" @@ -673,11 +671,11 @@ openInSideView: "Apri in vista laterale" defaultNavigationBehaviour: "Navigazione preimpostata" editTheseSettingsMayBreakAccount: "Modificare queste impostazioni può danneggiare l'account." -instanceTicker: "Informazioni sull'istanza da cui vengono le note" +instanceTicker: "Informazioni del server sui post" waitingFor: "Aspettando {x}" random: "Casuale" system: "Sistema" -switchUi: "Cambiare interfaccia utente" +switchUi: "Interfaccia" desktop: "Desktop" clip: "Clip" createNew: "Crea nuov@" @@ -704,8 +702,8 @@ 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." +noCrawleDescription: "Richiedi ai motori di ricerca di non indicizzare la tua pagina + del profilo, i tuoi post, 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." @@ -739,7 +737,7 @@ showTitlebar: "Visualizza la barra del titolo" clearCache: "Svuota cache" onlineUsersCount: "{n} utenti online" nUsers: "{n} utenti" -nNotes: "{n}Note" +nNotes: "{n} Post" sendErrorReports: "Invia segnalazioni di errori" sendErrorReportsDescription: "Quando abilitato, se si verifica un problema, informazioni dettagliate sugli errori verranno condivise con Firefish in modo da aiutare a migliorare @@ -766,7 +764,7 @@ capacity: "Capacità" inUse: "In utilizzo" editCode: "Modifica codice" apply: "Applica" -receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza" +receiveAnnouncementFromInstance: "Ricevi notifiche da questo server" emailNotification: "Eventi per notifiche via mail" publish: "Pubblico" inChannelSearch: "Cerca in canale" @@ -775,17 +773,17 @@ useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannel typingUsers: "{users} sta(nno) scrivendo" jumpToSpecifiedDate: "Vai alla data " showingPastTimeline: "Stai visualizzando una vecchia timeline" -clear: "Cancella" +clear: "Pulisci" markAllAsRead: "Segna tutti come già letti" goBack: "Indietro" 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: "Puoi fissare i post qui, premendo \"Fissa sul profilo\" nel menù + dei singoli post." +notSpecifiedMentionWarning: "Questo post menziona utenti che non sono inclusi fra + i destinatari" info: "Informazioni" userInfo: "Informazioni utente" unknown: "Sconosciuto" @@ -798,7 +796,7 @@ active: "Attiv@" offline: "Offline" notRecommended: "Sconsigliato" botProtection: "Protezione contro i bot" -instanceBlocking: "Istanze bloccate" +instanceBlocking: "Gestione della federazione" selectAccount: "Scegli account" enabled: "Attivo" disabled: "Inattivo" @@ -814,8 +812,8 @@ postToGallery: "Pubblicare nella galleria" gallery: "Galleria" recentPosts: "Le più recenti" popularPosts: "Le più visualizzate" -shareWithNote: "Condividere in nota" -ads: "Pubblicità" +shareWithNote: "Condividere in un post" +ads: "Banner della comunità" expiration: "Scadenza" memo: "Promemoria" priority: "Priorità" @@ -855,10 +853,10 @@ unread: "Non letto" filter: "Filtri" controlPanel: "Pannello di controllo" manageAccounts: "Gestisci account" -classic: "Classico" +classic: "Centrato" muteThread: "Silenzia la discussione" unmuteThread: "Riattiva la discussione" -deleteAccountConfirm: "L'account verrà cancellato. Procedere?" +deleteAccountConfirm: "L'account verrà rimosso in modo irreversibile. Procedere?" incorrectPassword: "La password è errata." voteConfirm: "Votare per「{choice}」?" hide: "Nascondere" @@ -1177,11 +1175,12 @@ _auth: callback: "Ritornando sulla app" denied: "Accesso negato" _antennaSources: - all: "Tutte le note" - homeTimeline: "Note dagli utenti che segui" - users: "Note dagli utenti selezionati" - userList: "Note dagli utenti della lista selezionata" - userGroup: "Note dagli utenti del gruppo selezionato" + all: "Tutti i post" + homeTimeline: "Post dagli utenti che segui" + users: "Post dagli utenti selezionati" + userList: "Post dagli utenti di una lista specifica" + userGroup: "Post dagli utenti in un gruppo specifico" + instances: Post di tutti gli utenti di un server _weekday: sunday: "Domenica" monday: "Lunedì" @@ -1191,24 +1190,34 @@ _weekday: friday: "Venerdì" saturday: "Sabato" _widgets: - memo: "Memo" + memo: "Promemoria" notifications: "Notifiche" timeline: "Timeline" calendar: "Calendario" trends: "Tendenze" clock: "Orologio" - rss: "Aggregatore rss" + rss: "Aggregatore RSS" activity: "Attività" photos: "Foto" digitalClock: "Orologio digitale" federation: "Federazione" - postForm: "Finestra di pubblicazione" + postForm: "Modulo del post" slideshow: "Diapositive" button: "Pulsante" onlineUsers: "Utenti online" jobQueue: "Coda di lavoro" serverMetric: "Statistiche server" aiscript: "Console AiScript" + _userList: + chooseList: Seleziona una lista + rssTicker: Riquadro RSS + instanceCloud: Cloud del server + unixClock: Orologio UNIX + serverInfo: Informazioni sul server + meiliIndexCount: Post indicizzati + meiliStatus: Stato del server + meiliSize: Dimensione indice + userList: Elenco utenti _cw: hide: "Nascondere" show: "Mostra di più" @@ -1238,18 +1247,18 @@ _poll: remainingSeconds: "Rimangono {s} secondi" _visibility: public: "Pubblica" - publicDescription: "Visibile per tutti sul Fediverso" + publicDescription: "Il tuo post sarà visibile in tutte le timeline pubbliche" home: "Home" homeDescription: "Visibile solo sulla timeline \"Home\"" followers: "Followers" - followersDescription: "Visibile solo per i tuoi followers" + followersDescription: "Visibile solo per i tuoi followers e gli utenti che menzioni" specified: "Diretta" specifiedDescription: "Visibile solo per gli/le utenti menzionatə" localOnly: "Soltanto locale" localOnlyDescription: "Nascosta per gli/le utenti remotə" _postForm: - replyPlaceholder: "Nota la tua risposta.." - quotePlaceholder: "Cita Nota..." + replyPlaceholder: "Rispondi a questo post..." + quotePlaceholder: "Citazione da questo post..." channelPlaceholder: "Pubblica in canale" _placeholders: a: "Che succede?" @@ -1266,27 +1275,32 @@ _profile: metadata: "Informazioni aggiuntive" metadataEdit: "Modifica informazioni aggiuntive" metadataDescription: "Puoi pubblicare fino a quattro informazioni aggiuntive sul - profilo. Puoi aggiungere un tag {a} o {l} con {rel} per verificare il link sul tuo profilo!" + profilo. Puoi aggiungere un tag {a} o {l} con {rel} per verificare il link sul + tuo profilo!" metadataLabel: "Etichetta" metadataContent: "Contenuto" changeAvatar: "Modifica immagine profilo" changeBanner: "Cambia intestazione" + locationDescription: Se prima inserisci la tua città, agli altri utenti sarà mostrata + l'ora locale in cui ti trovi. _exportOrImport: - allNotes: "Tutte le note" + allNotes: "Tutti i post" followingList: "Follows" muteList: "Account silenziati" blockingList: "Account bloccati" userLists: "Liste" + excludeInactiveUsers: Escludi utenti non attivi + excludeMutingUsers: Escludi utenti silenziati _charts: federation: "Federazione" apRequest: "Richieste" usersIncDec: "Variazione del numero di utenti" usersTotal: "Numero totale di utenti" activeUsers: "Numero di utenti attivi" - notesIncDec: "Variazione del numero di note" - localNotesIncDec: "Variazione del numero di note locali" - remoteNotesIncDec: "Variazione del numero di note distanti" - notesTotal: "Conteggio totale di note" + notesIncDec: "Variazione del numero di post" + localNotesIncDec: "Variazione del numero di post locali" + remoteNotesIncDec: "Variazione del numero di post remoti" + notesTotal: "Numero totale di post" filesIncDec: "Variazione del numero dei file" filesTotal: "Numero totale di file" storageUsageIncDec: "Variazione dell'utilizzo dell'immagazzinamento" @@ -1295,8 +1309,8 @@ _instanceCharts: requests: "Richieste" users: "Variazione del numero di utenti" usersTotal: "Totale cumulativo di utenti" - notes: "Variazione del numero di note" - notesTotal: "Totale cumulato di note" + notes: "Differenza nel numero di post" + notesTotal: "Totale cumulativo di post" ff: "Variazione dei follow/ follower" ffTotal: "Totale cumulato dei follow/ follower" cacheSize: "Variazione dello spazio occupato dalla cache" @@ -1308,6 +1322,7 @@ _timelines: local: "Locale" social: "Sociale" global: "Federata" + recommended: Raccomandato _pages: newPage: "Crea pagina" editPage: "Modifica pagina" @@ -1358,6 +1373,8 @@ _pages: post: "Finestra di pubblicazione" _post: text: "Contenuto" + canvasId: Canvas ID + attachCanvasImage: Allega una immagine canvas textInput: "Immissione testo" _textInput: name: "Nome della variabile" @@ -1376,10 +1393,11 @@ _pages: _canvas: width: "Larghezza" height: "Altezza" - note: "Nota integrata" + id: Canvas ID + note: "Post embedded" _note: - id: "ID nota" - idDescription: "Qui puoi anche incollare l'URL della nota che vuoi impostare." + id: "Post ID" + idDescription: "In alternativa puoi incollare qui l'URL del post." detailed: "Visualizzazione dettagliata" switch: "Interruttore" _switch: @@ -1414,6 +1432,8 @@ _pages: name: "Nome della variabile" title: "Titolo" default: "Valore predefinito" + values: Elenco di scelte, una per linea + canvas: Canvas script: categories: comparison: "Metodo comparativo" @@ -1421,6 +1441,11 @@ _pages: value: "Valore" fn: "Funzione" list: "Liste" + flow: Controllo del flusso + logical: Operazione logica + text: Operazioni sul testo + convert: Conversioni + operation: Operazione blocks: text: "Testo" multiLineText: "Testo (a più righe)" @@ -1429,12 +1454,16 @@ _pages: arg1: "Testo" _strPick: arg1: "Testo" + arg2: Posizione della stringa _strReplace: arg1: "Testo" + arg3: Sostituisci con + arg2: Testo da sostituire _strReverse: arg1: "Testo" _join: arg1: "Liste" + arg2: Separatore _add: arg1: "A" arg2: "B" @@ -1480,6 +1509,7 @@ _pages: _if: arg1: "Se" arg2: "Se" + arg3: ELSE random: "Aleatorietà" _randomPick: arg1: "Liste" @@ -1487,12 +1517,15 @@ _pages: arg1: "Liste" _seedRandom: arg2: "Probabilità" + arg1: Seme _seedRandomPick: arg2: "Liste" + arg1: Seme _DRPWPM: arg1: "Lista di testo" _pick: arg1: "Liste" + arg2: Posizione _listLen: arg1: "Liste" _stringToNumber: @@ -1501,10 +1534,87 @@ _pages: arg1: "Testo" ref: "Variabili" fn: "Funzione" + not: NOT + _not: + arg1: NOT + _fn: + slots: Slot + arg1: Output + slots-info: Scrivi uno slot per riga + _for: + arg2: Azione + arg1: Numero di ripetizioni + add: Somma + _dailyRandom: + arg1: Probabilità + _dailyRannum: + arg1: Valore minimo + arg2: Valore massimo + strLen: Lunghezza del testo + join: Concatenazione testo + splitStrByLine: Suddividi il testo al fine riga + subtract: Sottrazione + lt: < A è minore di B + gt: '> A è maggiore di B' + _seedRannum: + arg1: Seme + arg3: Valora massimo + arg2: Valore minimo + multiply: Moltiplicazione + _round: + arg1: Numero + numberToString: Da numero a testo + _numberToString: + arg1: Numero + strPick: Estrai stringa + _rannum: + arg2: Valore massimo + arg1: Valore minimo + listLen: Calcola la lunghezza della lista + strReverse: Ribalta il testo + _textList: + info: Inserisci un elemento per riga + strReplace: Stringa sostitutiva + ltEq: <= A è minore o uguale a B + divide: Divisione + mod: Resto + _random: + arg1: Probabilità + randomPick: Scegli a caso da una lista + number: Numero + gtEq: '>= A è maggiore o uguale a B' + rannum: Numero casuale + dailyRannum: Numero casuale (Cambia una volta al giorno per ogni utente) + dailyRandomPick: Scegli a caso da una lista (Cambia una volta al giorno per + ogni utente) + seedRandom: Casuale (con seme) + seedRannum: Numero casuale (con seme) + seedRandomPick: Scegli a caso da una lista (con seme) + aiScriptVar: Variabile AiScript + for: Ciclo for + if: IF + dailyRandom: Casuale (Cambia una volta al giorno per ogni utente) + DRPWPM: Scegli a caso da una lista pesata (Cambia una volta al giorno per ogni + utente) + pick: Seleziona da una lista + stringToNumber: Da testo a numero + round: Arrotondamento decimale + eq: A e B sono uguali types: string: "Testo" array: "Liste" stringArray: "Lista di testo" + number: Numero + boolean: Vero/Falso + emptySlot: Slot vuoto + typeError: Lo slot {slot} accetta valori di tipo "{expect}", ma il valore fornito + è di tipo "{actual}"! + enviromentVariables: Variabili d'ambiente + thereIsEmptySlot: Lo slot {slot} è vuoto! + pageVariables: Variabili di pagina + argVariables: Slot di input + inspector: Ispettore + alignCenter: Centra gli elementi _relayStatus: requesting: "In attesa di approvazione" accepted: "Approvato" @@ -1514,7 +1624,7 @@ _notification: youGotMention: "{name} ti ha menzionato" youGotReply: "{name} ti ha risposto" youGotQuote: "{name} ha citato il tuo Nota e ha detto" - youRenoted: "{name} ha rinotato" + youRenoted: "Boost da {name}" youGotPoll: "{name} ha votato" youGotMessagingMessageFromUser: "{name} ti ha mandato un messaggio" youGotMessagingMessageFromGroup: "{name} ti ha mandato un messaggio nella chat" @@ -1527,7 +1637,7 @@ _notification: follow: "Nuovə follower" mention: "Menzioni" reply: "Risposte" - renote: "Rinota" + renote: "Boost" quote: "Cita" reaction: "Reazioni" pollVote: "Voti ricevuti" @@ -1535,9 +1645,16 @@ _notification: followRequestAccepted: "Richiesta di follow accettata" groupInvited: "Invito a un gruppo" app: "Notifiche da applicazioni" + pollEnded: Fine del sondaggio _actions: reply: "Rispondi" - renote: "Rinota" + renote: "Boost" + followBack: ricambia il tuo follow + reacted: ha aggiunto una reazione al tuo post + renoted: ha rilanciato il tuo post con un boost + pollEnded: I risultati del sondaggio sono disponibili + voted: ha votato il tuo sondaggio + emptyPushNotificationMessage: Le notifiche push sono state aggiornate _deck: alwaysShowMainColumn: "Mostra sempre la colonna principale" columnAlign: "Allineare colonne" @@ -1548,7 +1665,7 @@ _deck: swapDown: "Sposta in basso" stackLeft: "Impila a sinistra" popRight: "Estrai a destra" - profile: "Profilo" + profile: "Workspace" _columns: main: "Principale" widgets: "Widget" @@ -1557,7 +1674,309 @@ _deck: antenna: "Antenne" list: "Liste" mentions: "Menzioni" - direct: "Diretta" + direct: "Messaggi diretti" + channel: Canale + introduction: Crea l'interfaccia perfetta ordinando liberamente le colonne! + deleteProfile: Rimuovi il workspace + nameAlreadyExists: Esiste già un workspace con questo nome. + widgetsIntroduction: Scegli "Modifica widget" nel menu della colonna per aggiungere + un widget. + newProfile: Nuovo workspace + renameProfile: Rinomina il workspace + introduction2: Fai clic sul + a destra dello schermo per aggiungere nuove colonne + quando vuoi. + configureColumn: Impostazioni della colonna noThankYou: No grazie addInstance: Aggiungi un'istanza deleted: Eliminato +editNote: Modifica post +edited: Modificato {date} {time} +_skinTones: + medium: Medio + yellow: Giallo + light: Chiaro + dark: Scuro + mediumLight: Chiaro medio + mediumDark: Scuro medio +removeReaction: Elimina la tua reazione +showEmojisInReactionNotifications: Mostra le emoji nelle notifiche delle reazioni +flagSpeakAsCatDescription: I tuoi post saranno "nyanified" quando sei in modalità + gatto +selectInstance: Scegli un server +keepOriginalUploading: Mantieni l'immagine originale +moderation: Moderazione +expandOnNoteClickDesc: Se disabilitato, potrai comunque aprire i post cliccando sull'orario + o con il tasto destro del mouse . +userSaysSomethingReasonQuote: '{name} ha citato un post che contiene {reason}' +narrow: Stretto +cropImageAsk: Vuoi ritagliare questa immagine? +recentNDays: Ultimi {n} giorni +noEmailServerWarning: Il server per le email non è configurato. +cannotUploadBecauseInappropriate: Non è stato possibile caricare questo contenuto + perché una o più parti sono state identificate come NSFW. +navbar: Barra di navigazione +activeEmailValidationDescription: Abilita la verifica rigorosa dell'indirizzo email, + che include il controllo di indirizzi usa e getta e dell'effettivo funzionamento. + Se non attivo, viene controllato solo il formato dell'indirizzo email. +customMOTDDescription: Messaggi personalizzati che sono mostrati sullo splash screen + durate il caricamento, uno per riga, saranno scelti a caso ogni volta che l'utente + carica o ricarica la pagina. +recommendedInstances: Server consigliati +customSplashIconsDescription: Elenco degli URL di icone personalizzate da mostrare + casualmente ogni volta che l'utente carica o ricarica la pagina. Assicurati che + le immagini siano su un URL statico, preferibilmente di dimensioni 192x192. +swipeOnDesktop: Permetti lo swipe su desktop simile alla versione mobile +logoImageUrl: URL del logo +indexFrom: Indicizza dal post ID +customKaTeXMacro: Macro KaTeX personalizzate +indexPosts: Crea indice dei post +signupsDisabled: Le iscrizioni su questo server al momento non sono possibili, ma + puoi sempre iscriverti su un altro server! Se invece hai un codice di invito per + questo server, inseriscilo qua sotto. +findOtherInstance: Scegli un altro server +apps: App +expandOnNoteClick: Apri i post con un click +userSaysSomethingReasonReply: '{name} ha risposto a un post che contiene {reason}' +userSaysSomethingReasonRenote: '{name} ha dato un boost al post che contiene {reason}' +forwardReport: Inoltra la segnalazione al server remoto +size: Dimensione +numberOfColumn: Numero di colonne +enableServerMachineStats: Abilita le statistiche hardware del server +enableRecommendedTimeline: Abilita la timeline degli utenti suggeriti +regexpError: Errore nell'espressione regolare +forwardReportIsAnonymous: Al posto del proprio account, nel server remoto verrà visualizzato + un account anonimo come autore della segnalazione. +unclip: Togli il clip +instanceSecurity: Sicurezza del server +recommended: Raccomandato +seperateRenoteQuote: Separa i bottoni di boost e citazione +ffVisibility: Visibilità dei follower +failedToFetchAccountInformation: Non è possibile ottenere informazioni sull'account +rateLimitExceeded: Limite di richieste superato +document: Documentazione +statusbar: Barra di stato +pleaseSelect: Seleziona un'opzione +cannotUploadBecauseNoFreeSpace: Caricamento fallito per mancanza di spazio sul drive. +migration: Migrazione +moveFromLabel: 'Account remoto da migrare:' +moveFrom: Migra verso questo account da uno vecchio +sendModMail: Invia un avviso di moderazione +isSystemAccount: Questo account è creato e gestito dal sistema. Non modificare, eliminare, + moderare o mettere mano a questo account altrimenti il sistema potrebbe smettere + di funzionare. +speed: Velocità +refreshInterval: 'Intervallo di aggiornamento ' +slow: Lento +customSplashIcons: URL icone personalizzate di caricamento (splash screen) +removeQuote: Rimuovi citazione +removeRecipient: Rimuovi destinatario +removeMember: Rimuovi membro +reactionPickerSkinTone: Tono della pelle preferito negli emoji +_experiments: + postImportsCaption: Permette agli utenti di importare i post da vecchi account Firefish, + Misskey, Mastodon, Akkoma e Pleroma. Potrebbe causare rallentamenti durante il + caricamento. + enablePostImports: Abilita l'importazione di post + title: Esperimenti +moveTo: Migra l'account corrente verso un nuovo account +searchPlaceholder: Cerca in Firefish +listsDesc: Le liste ti permettono di avere delle timeline con utenti specifici. Le + trovi sulla pagina timeline. +flagSpeakAsCat: Parla come un gatto +accountMoved: "L'utente si è trasferito su un nuovo account:" +flagShowTimelineRepliesDescription: Mostra le risposte degli utenti ai post di altri + utenti nella timeline, se attivata. +silencedInstances: Server silenziati +silencedInstancesDescription: Elenca gli hostname dei server che vuoi silenziare. + Tutti gli utenti di questi server saranno trattati come silenziati, possono fare + richieste di follow e non possono menzionare gli account locali che non li seguono. + I server bloccati non sono coinvolti. +hiddenTags: Hashtag nascosti +hiddenTagsDescription: 'Elenca gli hashtag (senza #) che vuoi nascondere da trending + ed esplora. Gli hashtag nascosti restano comunque accessibili in altre condizioni.' +defaultValueIs: 'Predefinito: {value}' +manageGroups: Gestisci i gruppi +antennasDesc: "Le antenne mostrano tutti i nuovi post che rientrano nei criteri che + imposti tu!\nSono visibili dalla pagina della timeline." +advanced: Avanzato +pubSub: Account Pub/Sub +driveCapOverrideLabel: Cambia lo spazio disco per questo utente +typeToConfirm: Inserisci {x} per confermare +check: Verifica +logoutConfirm: Confermi il log out? +lastActiveDate: Ultimo utilizzo +enterSendsMessage: Premi "Invio" nei messaggi per inviare (altrimenti è "Ctrl + Invio") +customMOTD: Messaggi di caricamento personalizzati (splash screen) +replayTutorial: Ripeti il tutorial +indexFromDescription: Lascia vuoto per indicizzare tutti i post +indexNotice: Creazione indice in corso. Sarà necessario del tempo, fai attenzione + a non riavviare il server per almeno un'ora. +enableCustomKaTeXMacro: Abilita le macro KaTeX personalizzate +preventAiLearningDescription: Richiedi ai bot di intelligenza artificiale di terze + parti di non studiare e acquisire il contenuto che carichi, come post e immagini. +preventAiLearning: Impedisci l'acquisizione dei contenuti da parte dei bot IA +confirmToUnclipAlreadyClippedNote: Questo post è già incluso nel clip "{name}". Vuoi + rimuoverlo dal clip piuttosto? +moveToLabel: 'Account dove vuoi migrare:' +migrationConfirm: "Hai l'assoluta sicurezza di voler migrare il tuo account verso + {account}? Quando lo avrai fatto, non sarai in grado di tornare indietro e non potrai + più usare questo account normalmente.\nInoltre assicurati che l'account su questo + server sia quello da cui vuoi migrare e non il contrario." +moveAccount: Migra l'account! +verifiedLink: Link verificato +_feeds: + copyFeed: Copia il feed + jsonFeed: Feed JSON + rss: RSS + atom: Atom +alt: ALT +themeColor: Colore dell'indicatore del server +instanceDefaultThemeDescription: Inserisci il codice del tema nel formato a oggetti. +failedToUpload: Caricamento fallito +sendPushNotificationReadMessage: Rimuovi le notifiche push dopo che sono state lette +splash: Splash screen di caricamento +noteId: Post ID +noInstances: Non ci sono server +antennaInstancesDescription: Elenca un server per riga +switchAccount: Cambia account +swipeOnMobile: Permetti di fare swipe orizzontale tra le pagine +showAdminUpdates: Segnala nuove versioni di Firefish (solo admin) +selectChannel: Seleziona un canale +clipsDesc: I clip sono come segnalibri categorizzati e condivisibili. Puoi creare + clip dal menu di ciascun post. +instanceDefaultDarkTheme: Tema scuro predefinito del server +origin: Origine +newer: più recente +older: più vecchio +silenceThisInstance: Silenzia questo server +silenced: Silenziato +keepOriginalUploadingDescription: Salva l'immagine caricata originariamente così com'è. + Se disattivato, al momento del caricamento verrà generata una versione da visualizzare + sul web. +accessibility: Accessibilità +ffVisibilityDescription: Puoi configurare chi può vedere chi segui e anche i tuoi + follower. +continueThread: Continua la conversazione +smartphone: Smartphone +tablet: Tablet +mutePeriod: Durata del silenziamento +updateAvailable: Potrebbe essere disponibile un aggiornamento! +enableAutoSensitive: Riconoscimento automatico contenuto NSFW +enableAutoSensitiveDescription: Permette il riconoscimento dei contenuti NSFW tramite + Machine Learning, quando possibile. Se disattivi questa opzione, considera che potrebbe + essere comunque attiva per tutto il server. +instanceDefaultLightTheme: Tema chiaro predefinito del server +objectStorageS3ForcePathStyle: Usa URL basati sul path per gli endpoint +objectStorageS3ForcePathStyleDesc: Attiva questa opzione per costruire un URL dell'endpoint + nel formato 's3.amazonaws.com//' invece che '.s3.amazonaws.com'. +regexpErrorDescription: "Si è verificato un errore nell'espressione regolare alla + riga {line} della parola muta {tab}:" +channelFederationWarn: I canali non possono essere federati con altri server +secureMode: Modalità sicura (Acquisizione autorizzata) +secureModeInfo: Le richieste dai server remoti non ricevono risposta senza prima una + verifica. +privateMode: Modalità privata +allowedInstancesDescription: Gli host dei server che saranno federati in esclusiva, + uno per riga (funziona solo in modalità privata). +privateModeInfo: Se abilitata, solo i server in una whitelist potranno essere federati + con questo server. Tutti i post saranno nascosti al pubblico. +allowedInstances: Whitelist dei server +customCssWarn: Questa impostazione dovrebbe essere usata solo se sai cosa stai facendo. + Inserire valori errati potrebbe bloccare il funzionamento del client. +lastCommunication: Ultima comunicazione +breakFollowConfirm: Vuoi veramente rimuovere il follower? +makeReactionsPublic: Rendi pubblica la storia di tutte le reazioni +makeReactionsPublicDescription: Questa opzione rende visibile a tutti l'elenco delle + tue reazioni ai post nel passato. +overridedDeviceKind: Tipo di dispositivo +auto: Auto +reflectMayTakeTime: Potrebbe servire del tempo perché il cambiamento sia effettivo. +cropImage: Ritaglia l'immagine +recentNHours: Ultime {n} ore +deleteAccount: Rimuovi l'account +numberOfPageCache: Numero di pagine nella cache +sensitiveMediaDetection: Riconoscimento dei contenuti NSFW +move: Sposta +caption: Descrizione automatica +sendPushNotificationReadMessageCaption: Una notifica con il testo "{emptyPushNotificationMessage}" + sarà mostrata per breve tempo. Potrebbe aumentare il consumo di batteria del tuo + dispositivo. +moveAccountDescription: È un processo irreversibile. Assicurati di aver prima impostato + un alias per questo account sul tuo nuovo server prima di migrare. Inserisci l'account + nel formato @nomeutente@server.com +enableIdenticonGeneration: Abilita la generazione di Identicon +donationLink: Link alla pagina per le donazioni +delete2fa: Disabilita 2FA, autenticazione con 2 passaggi +deletePasskeys: Rimuovi le passkey +pushNotification: Notifiche push +pushNotificationNotSupported: Il tuo browser non supporta le notifiche push +userSaysSomethingReason: '{name} ha detto {reason}' +image: Immagine +video: Video +audio: Audio +thereIsUnresolvedAbuseReportWarning: Ci sono segnalazioni non ancora gestite. +requireAdminForView: Devi avere un account amministratore per vedere questo contenuto. +jumpToPrevious: Vai al precedente +flagShowTimelineReplies: Mostra le risposte nella timeline +cw: Avviso sul contenuto +renoteMute: Silenzia i boost +renoteUnmute: Non silenziare i boost +enableEmojiReactions: Abilita le reazioni con emoji +preferencesBackups: Backup delle preferenze +adminCustomCssWarn: Questa impostazione dovrebbe essere usata solo se ne comprendi + le conseguenze. Valori impropri potrebbero impedire il funzionamento dei client + di TUTTI gli utenti. Assicurati prima che il CSS funzioni correttamente testandolo + nelle tue impostazioni utente. +accentColor: Colore di accento +showPopup: Notifica gli utenti con popup +showWithSparkles: Mostra con le scintille +youHaveUnreadAnnouncements: Hai un annuncio da leggere +_dialog: + charactersBelow: 'La lunghezza in caratteri non è sufficiente! Attuale: {current}/Minimo: + {min}' + charactersExceeded: 'Hai superato il massimo di caratteri! Attuale: {current}/Massimo: + {max}' +cannotUploadBecauseExceedsFileSizeLimit: Questo file non è stato caricato perché eccede + lo spazio disponibile. +xl: XL +shuffle: Mescola +subscribePushNotification: Abilita le notifiche push +unsubscribePushNotification: Disabilita le notifiche push +pushNotificationAlreadySubscribed: Le notifiche push sono già abilitate +driveCapOverrideCaption: Imposta la capacità predefinita inserendo il valore 0. +numberOfPageCacheDescription: Aumentare questo numero migliorerà l'esperienza degli + utenti ma aumenterà il carico sul server e l'uso di memoria. +type: Tipo +fast: Veloce +remoteOnly: Solo remoto +showAds: Mostra i banner della comunità +showUpdates: Mostra un popup mentre Firefish si aggiorna +recommendedInstancesDescription: Server consigliati, uno per riga, nell'ordine in + cui saranno mostrati nella timeline dei consigliati. +beta: Beta +neverShow: Non mostrare più +remindMeLater: Non adesso +noGraze: Per favore disattiva l'estenzione del browser "Graze for Mastodon", perché + interferisce con Firefish. +silencedWarning: Vedi questa pagina perché gli utenti sono su un server che il tuo + admin ha silenziato, quindi potrebbero essere spam. +isBot: Questo account è un bot +isLocked: Questo account richiede l'approvazione del follow +moveFromDescription: Questa operazione crea un alias del vecchio account in modo che + tu possa migrare su questo nuovo account. Fallo PRIMA di migrare il tuo vecchio + account. Usa il formato @nomeutente@server.com +defaultReaction: Emoji predefinita per le reazioni sui post ricevuti e inviati +license: Licenza +isModerator: Moderatore +isAdmin: Amministratore +isPatron: Firefish Patron +customKaTeXMacroDescription: 'Crea delle macro per scrivere facilmente espressioni + matematiche! La notazione rispetta i comandi definiti in LaTeX ed è scritta come + \newcommand{\ name}{content} oppure \newcommand{\name}[number of arguments]{content}. + Per esempio, \newcommand{\add}[2]{#1 + #2} espanderà \add{3}{foo} come 3 + foo. + Le parentesi graffe che circondano il nome della macro possono essere sostituite + con quelle tonde o quadre. Ciò implica di dover cambiare anche le parentesi degli + argomenti. Una (e solo una) macro può essere definita per ogni riga e non puoi andare + a capo nel mezzo di una definizione. Le linee non valide sono semplicemente ignorate. + Sono supportate solo funzioni semplici di sostituzione nella stringa; sintassi avanzate, + come comandi condizionali, non possono essere usate qui.' diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 90f1aa57..6c80e7ec 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1,6 +1,6 @@ _lang_: "日本語" headlineFirefish: "ずっと無料でオープンソースの非中央集権型ソーシャルメディアプラットフォーム🚀" -introFirefish: "ようこそ!Firefishは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\ +introFirefish: "ようこそ!Firefishは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信したりしましょう📡\n\ 「リアクション」機能で、皆の投稿に素早く反応を追加できます👍\n新しい世界を探検しよう🚀" monthAndDay: "{month}月 {day}日" search: "検索" @@ -303,7 +303,7 @@ emptyDrive: "ドライブは空です" emptyFolder: "フォルダーは空です" unableToDelete: "削除できません" inputNewFileName: "新しいファイル名を入力してください" -inputNewDescription: "新しい説明を入力してください" +inputNewDescription: "新しい説明を入力" inputNewFolderName: "新しいフォルダ名を入力してください" circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。" hasChildFilesOrFolders: "このフォルダは空でないため、削除できません。" @@ -577,7 +577,7 @@ disablePlayer: "プレイヤーを閉じる" expandTweet: "ツイートを展開する" themeEditor: "テーマエディター" description: "説明" -describeFile: "説明を付ける" +describeFile: "説明を追加" enterFileDescription: "説明を入力" author: "作者" leaveConfirm: "未保存の変更があります。破棄しますか?" @@ -849,7 +849,7 @@ filter: "フィルタ" controlPanel: "コントロールパネル" manageAccounts: "アカウントを管理" makeReactionsPublic: "リアクション一覧を公開する" -makeReactionsPublicDescription: "あなたがしたリアクション一覧を誰でも見れるようにします。" +makeReactionsPublicDescription: "あなたがしたリアクション一覧を誰でも見られるようにします。" classic: "中央寄せ" muteThread: "スレッドをミュート" unmuteThread: "スレッドのミュートを解除" @@ -949,7 +949,7 @@ customSplashIconsDescription: "ユーザがページをロード/リロードす showUpdates: "Firefishの更新時にポップアップを表示する" recommendedInstances: "おすすめサーバー" recommendedInstancesDescription: "おすすめタイムラインに表示するサーバーを改行区切りで入力してください。" -caption: "自動キャプション" +caption: "自動で説明をつける" splash: "スプラッシュスクリーン" updateAvailable: "アップデートがありますよ!" swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする" @@ -1996,3 +1996,6 @@ _emojiModPerm: add: "追加" mod: "追加と変更" full: "全て許可" +importZip: ZIPをインポート +emojiPackCreator: 絵文字パックの作者 +exportZip: ZIPをエクスポート diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 4e95bfc8..1ef1e4f0 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -1,7 +1,7 @@ ---- _lang_: "日本語 (関西弁)" -headlineFirefish: "ノートでつながるネットワーク" -introFirefish: "ようお越し!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか🚀" +headlineFirefish: "ずっとタダでオープンソースの非中央集権型ソーシャルメディアプラットフォーム!🚀" +introFirefish: "おいでやす。Firefishは、オープンソースの分散型ソーシャルメディアプラットフォームどす。\nいま起きたはるもんを共有したり、あんさんについて皆に発信したりしとくれやす👘\n\ + 「リアクション」機能があるさかい、皆の投稿に素早う反応を送ることもできます🎎\nほんなら、新しい世界を探検しまひょか🎴" monthAndDay: "{month}月 {day}日" search: "探す" notifications: "通知" @@ -13,10 +13,10 @@ ok: "OKや" gotIt: "ほい" cancel: "やめとく" enterUsername: "ユーザー名を入れてや" -renotedBy: "{user}がRenote" -noNotes: "ノートはあらへん" +renotedBy: "{user}がブースト" +noNotes: "投稿はありまへん" noNotifications: "通知はあらへん" -instance: "インスタンス" +instance: "サーバー" settings: "設定" basicSettings: "基本設定" otherSettings: "その他の設定" @@ -44,7 +44,7 @@ copyContent: "内容をコピー" copyLink: "リンクをコピー" delete: "ほかす" deleteAndEdit: "ほかして直す" -deleteAndEditConfirm: "このノートをほかして書き直すんか?このノートへのリアクション、Renote、返信も全部消えてまうで。" +deleteAndEditConfirm: "この投稿をほかして書き直すんか?この投稿へのリアクション、ブースト、返信もみんな消えてまうで。" addToList: "リストに入れたる" sendMessage: "メッセージを送る" copyUsername: "ユーザー名をコピー" @@ -64,26 +64,28 @@ import: "インポート" export: "エクスポート" files: "ファイル" download: "ダウンロード" -driveFileDeleteConfirm: "ファイル「{name}」を消してしもうてええか?このファイルを添付したノートも消えてまうで。" +driveFileDeleteConfirm: "ファイル「{name}」を消してしもうてええか?このファイルを添付した投稿も消えてまうで。" unfollowConfirm: "{name}のフォローを解除してもええんか?" exportRequested: "エクスポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。エクスポート終わったら「ドライブ」に突っ込んどくで。" importRequested: "インポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。" lists: "リスト" noLists: "リストなんてあらへんで" -note: "ノート" -notes: "ノート" +note: "投稿" +notes: "投稿" following: "フォロー" followers: "フォロワー" followsYou: "フォローされとるで" createList: "リスト作る" manageLists: "リストの管理" error: "エラー" -somethingHappened: "なんかアカンことが起こったで" +somethingHappened: "なんやアカンことが起きたで" retry: "もっぺんやる?" -pageLoadError: "ページの読み込みに失敗してしもうたで…" +pageLoadError: "ページの読み込みに失敗してもた… えろうすんまへん" pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?" -serverIsDead: "The server is not responding. Please wait for a while before trying again." -youShouldUpgradeClient: "To display this page, please reload and use a new version client. " +serverIsDead: "The server is not responding. Please wait for a while before trying + again." +youShouldUpgradeClient: "To display this page, please reload and use a new version + client. " enterListName: "リスト名を入れてや" privacy: "プライバシー" makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする" @@ -94,13 +96,13 @@ followRequests: "フォロー申請" unfollow: "フォローやめる" followRequestPending: "フォロー許してくれるん待っとる" enterEmoji: "絵文字を入れてや" -renote: "Renote" -unrenote: "Renoteやめる" -renoted: "Renoteしたで。" -cantRenote: "この投稿はRenoteできへんらしい。" -cantReRenote: "Renote自体はRenoteできへんで。" +renote: "ブースト" +unrenote: "ブーストやめる" +renoted: "ブーストしたで。" +cantRenote: "この投稿はブーストでけへんらしい。" +cantReRenote: "ブースト自体はブーストでけへんで。" quote: "引用" -pinnedNote: "ピン留めされとるノート" +pinnedNote: "ピン留めされとる投稿" pinned: "ピン留めしとく" you: "あんた" clickToShow: "押したら見えるで" @@ -138,12 +140,13 @@ addEmoji: "絵文字を追加" settingGuide: "ええ感じの設定" cacheRemoteFiles: "リモートのファイルをキャッシュする" cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルが作られんくなるから通信量が増えるで。" -flagAsBot: "Botやで" -flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。" -flagAsCat: "Catやで" -flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?" +flagAsBot: "ワイはBotや 🤖" +flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Firefishのシステム上での扱いがBotに合ったもんになったりするんやで。" +flagAsCat: "ワイはCatや 🐯" +flagAsCatDescription: "自分、猫ちゃんならこのフラグつけてみ?" flagShowTimelineReplies: "It will display the reply to the note in the timeline. " -flagShowTimelineRepliesDescription: "It will display the reply to notes other than the user notes in the timeline when you turn it on. " +flagShowTimelineRepliesDescription: "It will display the reply to notes other than + the user notes in the timeline when you turn it on. " autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく" addAccount: "アカウントを追加" loginFailed: "ログインに失敗してしもうた…" @@ -162,7 +165,7 @@ selectUser: "ユーザーを選ぶ" recipient: "宛先" annotation: "注釈" federation: "連合" -instances: "インスタンス" +instances: "サーバー" registeredAt: "初観測" latestRequestSentAt: "ちょっと前のリクエスト送信" latestRequestReceivedAt: "ちょっと前のリクエスト受信" @@ -172,7 +175,7 @@ charts: "チャート" perHour: "1時間ごと" perDay: "1日ごと" stopActivityDelivery: "アクティビティの配送をやめる" -blockThisInstance: "このインスタンスをブロック" +blockThisInstance: "このサーバーをブロック" operations: "操作" software: "ソフトウェア" version: "バージョン" @@ -182,23 +185,23 @@ jobQueue: "ジョブキュー" cpuAndMemory: "CPUとメモリ" network: "ネットワーク" disk: "ディスク" -instanceInfo: "インスタンス情報" +instanceInfo: "サーバー情報" statistics: "統計" clearQueue: "キューにさいなら" clearQueueConfirmTitle: "キューをクリアしまっか?" clearQueueConfirmText: "未配達の投稿は配送されなくなるで。通常この操作を行う必要はあらへんや。" clearCachedFiles: "キャッシュにさいなら" clearCachedFilesConfirm: "キャッシュされとるリモートファイルをみんなほかしてええか?" -blockedInstances: "インスタンスブロック" -blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定してな。ブロックされてもうたインスタンスとはもう金輪際やり取りできひんくなるで。" +blockedInstances: "ブロックしたサーバー" +blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定してな。ブロックされてもうたサーバーとはもう金輪際やり取りできんくなるで。" muteAndBlock: "ミュートとブロック" mutedUsers: "ミュートしたユーザー" blockedUsers: "ブロックしたユーザー" noUsers: "ユーザーはおらへん" editProfile: "プロフィールをいじる" -noteDeleteConfirm: "このノートを削除しまっか?" +noteDeleteConfirm: "この投稿を削除しまっか?" pinLimitExceeded: "これ以上ピン留めできひん" -intro: "Misskeyのインストールが完了してん!管理者アカウントを作ってや。" +intro: "Firefishのインストールが完了してん!管理者アカウントを作ってや。" done: "でけた" processing: "処理しとる" preview: "プレビュー" @@ -213,9 +216,9 @@ all: "みんな" subscribing: "購読しとる" publishing: "配信しとる" notResponding: "応答してへんで" -instanceFollowing: "インスタンスのフォロー" -instanceFollowers: "インスタンスのフォロワー\n" -instanceUsers: "インスタンスのユーザー" +instanceFollowing: "サーバーのフォロー" +instanceFollowers: "サーバーのフォロワー" +instanceUsers: "このサーバーの利用者" changePassword: "パスワード変える" security: "セキュリティ" retypedNotMatch: "そやないねん。" @@ -239,7 +242,8 @@ saved: "保存したで!" messaging: "チャット" upload: "アップロード" keepOriginalUploading: "Retain the original image. " -keepOriginalUploadingDescription: "When uploading the clip, the original version will be retained. Turning it of then uploading will produce images for public use. " +keepOriginalUploadingDescription: "When uploading the clip, the original version will + be retained. Turning it of then uploading will produce images for public use. " fromDrive: "ドライブから" fromUrl: "URLから" uploadFromUrl: "URLアップロード" @@ -286,7 +290,7 @@ emptyDrive: "ドライブにはなんも残っとらん" emptyFolder: "ふぉろだーにはなんも残っとらん" unableToDelete: "消そうおもってんけどな、あかんかったわ" inputNewFileName: "今度のファイル名は何にするん?" -inputNewDescription: "新しいキャプションを入力しましょ" +inputNewDescription: "新しい説明文を入力しまひょ" inputNewFolderName: "今度のフォルダ名は何にするん?" circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。" hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん" @@ -305,8 +309,8 @@ unwatch: "ウォッチやめる" accept: "ええで" reject: "あかん" normal: "ええ感じ" -instanceName: "インスタンス名" -instanceDescription: "インスタンスの紹介" +instanceName: "サーバー名" +instanceDescription: "サーバーの紹介" maintainerName: "管理者の名前" maintainerEmail: "管理者のメールアドレス" tosUrl: "利用規約のURL" @@ -336,9 +340,9 @@ basicInfo: "基本情報" pinnedUsers: "ピン留めしたユーザー" pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。" pinnedPages: "ピン留めページ" -pinnedPagesDescription: "インスタンスのいっちゃん上にピン留めしたいページのパスを改行で区切って記述してな" +pinnedPagesDescription: "サーバーのいっちゃん上にピン留めしたいページのパスを、改行で区切って記述してな。" pinnedClipId: "ピン留めするクリップのID" -pinnedNotes: "ピン留めされとるノート" +pinnedNotes: "ピン留めされとる投稿" hcaptcha: "hCaptcha(キャプチャ)" enableHcaptcha: "hCaptcha(キャプチャ)をつけとく" hcaptchaSiteKey: "サイトキー" @@ -355,8 +359,8 @@ antennaSource: "受信ソース(このソースは食われへん)" antennaKeywords: "受信キーワード" antennaExcludeKeywords: "除外キーワード" antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や" -notifyAntenna: "新しいノートを通知すんで" -withFileAntenna: "なんか添付されたノートだけ" +notifyAntenna: "新しい投稿を通知すんで" +withFileAntenna: "ファイルが添付された投稿のみ" enableServiceworker: "ServiceWorkerをつこて" antennaUsersDescription: "ユーザー名を改行で区切ったってな" caseSensitive: "大文字と小文字は別もんや" @@ -377,7 +381,7 @@ exploreFediverse: "Fediverseを探ってみる" popularTags: "人気のタグ" userList: "リスト" about: "情報" -aboutFirefish: "Misskeyってなんや?" +aboutFirefish: "Firefishってなんやねん?" administrator: "管理者" token: "トークン" twoStepAuthentication: "二段階認証" @@ -420,7 +424,7 @@ text: "テキスト" enable: "有効にするで" next: "次" retype: "もっかい入力" -noteOf: "{user}のノート" +noteOf: "{user}の投稿" inviteToGroup: "グループに招く" quoteAttached: "引用付いとるで" quoteQuestion: "引用として添付してもええか?" @@ -478,12 +482,13 @@ accountSettings: "アカウントの設定" promotion: "宣伝" promote: "宣伝" numberOfDays: "日数" -hideThisNote: "このノートは表示せんでいい" -showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを表示してや" +hideThisNote: "この投稿は表示せんでいい" +showFeaturedNotesInTimeline: "タイムラインにおすすめの投稿を表示してや" objectStorage: "オブジェクトストレージ" useObjectStorage: "オブジェクトストレージを使う" objectStorageBaseUrl: "Base URL" -objectStorageBaseUrlDesc: "参照に使うにURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://.s3.amazonaws.com'、GCSとかなら: 'https://storage.googleapis.com/'。" +objectStorageBaseUrlDesc: "参照に使うにURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://.s3.amazonaws.com'、GCSとかなら: + 'https://storage.googleapis.com/'。" objectStorageBucket: "Bucket" objectStorageBucketDesc: "使ってるサービスのbucket名を選んでな" objectStoragePrefix: "Prefix" @@ -500,7 +505,7 @@ objectStorageSetPublicRead: "アップロードした時に'public-read'を設 serverLogs: "サーバーログ" deleteAll: "全て削除してや" showFixedPostForm: "タイムラインの上の方で投稿できるようにやってくれへん?" -newNoteRecived: "新しいノートがあるで" +newNoteRecived: "新しい投稿があるで" sounds: "サウンド" listen: "聴く" none: "なし" @@ -523,7 +528,7 @@ sort: "仕分ける" ascendingOrder: "小さい順" descendingOrder: "大きい順" scratchpad: "スクラッチパッド" -scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。" +scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Firefishに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。" output: "出力" script: "スクリプト" disablePagesScript: "Pagesのスクリプトを無効にしてや" @@ -531,7 +536,7 @@ updateRemoteUser: "リモートユーザー情報の更新してくれん?" deleteAllFiles: "すべてのファイルを削除" deleteAllFilesConfirm: "ホンマにすべてのファイルを削除するん?消したもんはもう戻ってこんのやで?" removeAllFollowing: "フォローを全解除" -removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。" +removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのサーバーが消えて無くなった時とかに便利な機能やで。" userSuspended: "このユーザーは...凍結されとる。" userSilenced: "このユーザーは...サイレンスされとる。" yourAccountSuspendedTitle: "あんたのアカウント凍結されとるで" @@ -555,8 +560,8 @@ disablePlayer: "プレイヤーを閉じる" expandTweet: "ツイートを展開する" themeEditor: "テーマエディター" description: "説明" -describeFile: "キャプションを付ける" -enterFileDescription: "キャプションを入力" +describeFile: "画像説明文を付ける" +enterFileDescription: "" author: "作者" leaveConfirm: "未保存の変更があるで!ほかしてええか?" manage: "管理" @@ -595,7 +600,7 @@ testEmail: "配信テスト" wordMute: "ワードミュート" regexpError: "正規表現エラー" regexpErrorDescription: "{tab}ワードミュートの{line}行目の正規表現にエラーが出てきたで:" -instanceMute: "インスタンスミュート" +instanceMute: "サーバーミュート" userSaysSomething: "{name}が何か言ったようやで" makeActive: "使うで" display: "表示" @@ -621,20 +626,20 @@ sample: "サンプル" abuseReports: "通報" reportAbuse: "通報" reportAbuseOf: "{name}を通報する" -fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ノートがある時はそのURLも書いといてなー。" +fillAbuseReportDescription: "細かい通報理由を書いてなー。特定の投稿を通報するなら、そのURLも書いといてなー。" abuseReported: "無事内容が送信されたみたいやで。おおきに〜。" reporter: "通報者" reporteeOrigin: "通報先" reporterOrigin: "通報元" -forwardReport: "リモートインスタンスに通報を転送するで" -forwardReportIsAnonymous: "リモートインスタンスからはあんたの情報は見れへんくって、匿名のシステムアカウントとして表示されるで。" +forwardReport: "リモートサーバーに通報を転送するで" +forwardReportIsAnonymous: "リモートサーバーからはあんたの情報は見れへんくて、匿名のシステムアカウントとして表示されるで。" send: "送信" abuseMarkAsResolved: "対応したで" openInNewTab: "新しいタブで開く" openInSideView: "サイドビューで開く" defaultNavigationBehaviour: "デフォルトのナビゲーション" editTheseSettingsMayBreakAccount: "このへんの設定をようわからんままイジるとアカウントが壊れて使えんくなるかも知れへんで?" -instanceTicker: "ノートのインスタンス情報" +instanceTicker: "投稿のサーバー情報" waitingFor: "{x}を待っとるで" random: "ランダム" system: "システム" @@ -645,16 +650,16 @@ createNew: "新しく作るで" optional: "任意" createNewClip: "新しいクリップを作るで" unclip: "クリップ解除するで" -confirmToUnclipAlreadyClippedNote: "このノートはすでにクリップ「{name}」に含まれとるで。ノートをこのクリップから除外したる?" +confirmToUnclipAlreadyClippedNote: "この投稿はすでにクリップ「{name}」に含まれとるで。投稿をこのクリップから除外したる?" public: "パブリック" i18nInfo: "Firefishは有志によっていろんな言語に翻訳されとるで。{link}で翻訳に協力したってやー。" manageAccessTokens: "アクセストークンの管理" accountInfo: "アカウント情報" -notesCount: "ノートの数やで" +notesCount: "投稿の数やで" repliesCount: "返信した数やで" -renotesCount: "Renoteした数やで" +renotesCount: "ブーストした数やで" repliedCount: "返信された数やで" -renotedCount: "Renoteされた数やで" +renotedCount: "ブーストされた数やで" followingCount: "フォロー数やで" followersCount: "フォロワー数やで" sentReactionsCount: "リアクションした数やで" @@ -666,15 +671,15 @@ no: "いいえ" driveFilesCount: "ドライブのファイル数" driveUsage: "ドライブ使用量やで" noCrawle: "クローラーによるインデックスを拒否するで" -noCrawleDescription: "検索エンジンにあんたのユーザーページ、ノート、Pagesとかのコンテンツを登録(インデックス)せぇへんように頼むで。" -lockedAccountInfo: "フォローを承認制にしとっても、ノートの公開範囲を「フォロワー」にせぇへん限り、誰でもあんたのノートを見れるで。" +noCrawleDescription: "検索エンジンにあんたのプロフィール、投稿、ページとかのコンテンツを登録(インデックス)せぇへんように頼むで。" +lockedAccountInfo: "フォローを承認制にしとっても、投稿の公開範囲を「フォロワー」にせん限り、誰でもあんたの投稿を見れるで。" alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にするで" loadRawImages: "添付画像のサムネイルをオリジナル画質にするで" disableShowingAnimatedImages: "アニメーション画像を再生しやへんで" verificationEmailSent: "無事確認のメールを送れたで。メールに書いてあるリンクにアクセスして、設定を完了してなー。" notSet: "未設定" emailVerified: "メールアドレスは確認されたで" -noteFavoritesCount: "お気に入りノートの数やで" +noteFavoritesCount: "お気に入り投稿の数やで" pageLikesCount: "Pageにええやんと思った数" pageLikedCount: "Pageにええやんと思ってくれた数" contact: "連絡先" @@ -684,7 +689,7 @@ experimentalFeatures: "実験的機能やで" developer: "開発者やで" makeExplorable: "アカウントを見つけやすくするで" makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らんくなるで。" -showGapBetweenNotesInTimeline: "タイムラインのノートを放して表示するで" +showGapBetweenNotesInTimeline: "タイムライン上の投稿を離して表示するで" duplicate: "複製" left: "左" center: "中央" @@ -696,9 +701,10 @@ showTitlebar: "タイトルバーを見せる" clearCache: "キャッシュをほかす" onlineUsersCount: "{n}人が起きとるで" nUsers: "{n}ユーザー" -nNotes: "{n}ノート" +nNotes: "{n}投稿" sendErrorReports: "エラーリポートを送る" -sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたときにエラーの詳細がMisskeyに共有されて、ソフトウェアの品質向上に役立てられるんや。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれるで。" +sendErrorReportsDescription: "オンにしたら、なんやけったいなことが起きたときにエラーの詳細がFirefishに共有されて、ソフトウェアの品質向上に役立てられるんや。\n\ + エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれるで。" myTheme: "マイテーマ" backgroundColor: "背景" accentColor: "アクセント" @@ -722,7 +728,7 @@ capacity: "容量" inUse: "使用中" editCode: "コードを編集" apply: "適用" -receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る" +receiveAnnouncementFromInstance: "サーバーからのお知らせを受け取る" emailNotification: "メール通知" publish: "公開" inChannelSearch: "チャンネル内検索" @@ -737,7 +743,7 @@ unlikeConfirm: "いいね解除するんか?" fullView: "フルビュー" quitFullView: "フルビュー解除" addDescription: "説明を追加するで" -userPagePinTip: "個々のノートのメニューから「ピン留め」を選んどくと、ここにノートを表示しておけるで。" +userPagePinTip: "個々の投稿のメニューから「ピン留め」を選んどくと、ここにそいつを表示しておけるで。" notSpecifiedMentionWarning: "宛先に含まれてへんメンションがあるで" info: "情報" userInfo: "ユーザー情報やで" @@ -750,7 +756,7 @@ active: "アクティブ" offline: "オフライン" notRecommended: "あんま推奨しやんで" botProtection: "Botプロテクション" -instanceBlocking: "インスタンスブロック" +instanceBlocking: "連合の管理" selectAccount: "アカウントを選んでなー" switchAccount: "アカウントを変えるで" enabled: "有効" @@ -767,7 +773,7 @@ postToGallery: "ギャラリーへ投稿" gallery: "ギャラリー" recentPosts: "最近の投稿" popularPosts: "人気の投稿" -shareWithNote: "ノートで共有" +shareWithNote: "投稿で共有" ads: "広告" expiration: "期限" memo: "メモ" @@ -789,7 +795,7 @@ hashtags: "ハッシュタグ" troubleshooting: "トラブルシューティング" useBlurEffect: "UIにぼかし効果を使うで" learnMore: "詳しく" -misskeyUpdated: "Misskeyが更新されたで!\nモデレーターの人らに感謝せなあかんで" +misskeyUpdated: "Firefishが更新されたで!\nモデレーターの人らに感謝やね" whatIsNew: "更新情報を見るで" translate: "翻訳" translatedFrom: "{x}から翻訳するで" @@ -834,7 +840,7 @@ cannotUploadBecauseInappropriate: "不適切な内容を含むかもしれへん cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いでアップロードできまへん。" beta: "ベータ" enableAutoSensitive: "自動NSFW判定" -enableAutoSensitiveDescription: "使える時は、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、インスタンスによっては自動で設定されることがあるで。" +enableAutoSensitiveDescription: "いけるときは、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、サーバーによっては自動で設定されることがあるで。" activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかとかを判定して積極的に行うで。オフにすると単に文字列として正しいかどうかだけチェックするで。" navbar: "ナビゲーションバー" shuffle: "シャッフルするで" @@ -868,14 +874,15 @@ _registry: domain: "ドメイン" createKey: "キーを作る" _aboutFirefish: - about: "Misskeyはsyuiloが2014年からずっと作ってはる、オープンソースなソフトウェアや。" + about: "Firefishは、ThatOneCalculatorが2022年にMisskeyをいじって作った、オープンなソースのソフトウェアや。" contributors: "主な貢献者" allContributors: "全ての貢献者" source: "ソースコード" - translation: "Misskeyを翻訳" - donate: "Misskeyに寄付" + translation: "Firefishを翻訳" + donate: "Firefishに寄付" morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰" patrons: "支援者" + misskeyContributors: フォーク元のMisskeyを作らはった人ら _mfm: cheatSheet: "MFMチートシート" mention: "メンション" @@ -896,6 +903,7 @@ _mfm: blur: "ぼかし" font: "フォント" rotate: "回転" + intro: MFMは、MisskeyやFirefish、Akkomaなどの様々な場所で使用できるマークアップ言語なんよ。ここでは、MFMで使用可能な構文一覧が確認できるで。 _instanceTicker: none: "表示せん" remote: "リモートユーザーに表示" @@ -958,7 +966,7 @@ _theme: hashtag: "ハッシュタグ" mention: "メンション" mentionMe: "うち宛てのメンション" - renote: "Renote" + renote: "ブースト" modalBg: "モーダルの背景" divider: "分割線" scrollbarHandle: "スクロールバーの取っ手" @@ -985,8 +993,8 @@ _theme: accentLighten: "アクセント (明るめ)" fgHighlighted: "強調されとる文字" _sfx: - note: "ノート" - noteMy: "ノート(自分)" + note: "投稿" + noteMy: "投稿(自分)" notification: "通知" chat: "チャット" _ago: @@ -1017,8 +1025,8 @@ _permissions: _auth: permissionAsk: "このアプリは次の権限を要求しとるで" _antennaSources: - all: "みんなのノート" - homeTimeline: "フォローしとるユーザーのノート" + all: "みんなの投稿" + homeTimeline: "フォローしとるユーザーの投稿" _weekday: sunday: "日曜日" monday: "月曜日" @@ -1072,7 +1080,7 @@ _profile: name: "名前" username: "ユーザー名" _exportOrImport: - allNotes: "全てのノート" + allNotes: "すべての投稿" followingList: "フォロー" muteList: "ミュート" blockingList: "ブロック" @@ -1082,10 +1090,10 @@ _charts: apRequest: "リクエスト" usersTotal: "ユーザーの合計" activeUsers: "アクティブユーザー数" - notesIncDec: "ノートの増減" - localNotesIncDec: "ローカルのノートの増減" - remoteNotesIncDec: "リモートのノートの増減" - notesTotal: "ノートの合計" + notesIncDec: "投稿の増減" + localNotesIncDec: "ローカルの投稿の増減" + remoteNotesIncDec: "リモートの投稿の増減" + notesTotal: "投稿の合計" filesIncDec: "ファイルの増減" filesTotal: "ファイルの合計" storageUsageIncDec: "ストレージ使用量の増減" @@ -1094,8 +1102,8 @@ _instanceCharts: requests: "リクエスト" users: "ユーザーの増減" usersTotal: "ユーザーの累積" - notes: "ノートの増減" - notesTotal: "ノートの累積" + notes: "投稿の増減" + notesTotal: "投稿の累積" ff: "フォロー/フォロワーの増減" ffTotal: "フォロー/フォロワーの累積" cacheSize: "キャッシュサイズの増減" @@ -1165,9 +1173,9 @@ _pages: id: "キャンバスID" width: "幅" height: "高さ" - note: "ノート埋め込み" + note: "投稿の埋め込み" _note: - id: "ノートID" + id: "投稿のID" detailed: "詳細な表示" switch: "スイッチ" _switch: @@ -1385,14 +1393,14 @@ _notification: all: "すべて" follow: "フォロー" mention: "メンション" - renote: "Renote" + renote: "ブースト" quote: "引用" reaction: "リアクション" receiveFollowRequest: "フォロー許可してほしいみたいやで" followRequestAccepted: "フォローが受理されたで" _actions: reply: "返事" - renote: "Renote" + renote: "ブースト" _deck: alwaysShowMainColumn: "いつもメインカラムを表示" columnAlign: "カラムの寄せ" @@ -1413,3 +1421,28 @@ _deck: list: "リスト" mentions: "あんた宛て" direct: "ダイレクト" +_experiments: + postImportsCaption: + ユーザーが過去の投稿をFirefish・Misskey・Mastodon・Akkoma・Pleromaからインポートできるようにするで。キューが溜まっとるときにインポートするとサーバーに負荷がかかるかもしれんね。 +searchPlaceholder: Firefishを検索 +addInstance: サーバーを追加 +editNote: 投稿を編集 +edited: '編集済み: {date} {time}' +deleted: 削除済み +noThankYou: いらんわ +_tutorial: + step3_1: ほな、何人かフォローしてみまひょ + step1_1: おこしやす + step1_2: 使い始める前に、いくつか設定を済ませまひょ。すぐできますえ。 + step2_1: 最初に、あんさんのプロフィールを作りまひょ + step2_2: プロフィールを設定しはることで、他ん人があんさんの投稿を見たり、フォローしたりするときの助けになってます。 +_postForm: + _placeholders: + b: なんかおましたか? + e: ここに書いとくれやす + c: なに考えとりまっか? + d: なんや言いたいんちゃいますか? + f: あんさん書くんを待っとるんどす... +flagSpeakAsCat: 猫弁で話す +flagSpeakAsCatDescription: 猫モードが有効の場合にオンにすると、ワレの投稿の「な」を「にゃ」に変換するで。 +welcomeBackWithName: おおきに、{name}はん diff --git a/locales/no-NO.yml b/locales/no-NO.yml index 4c3294a4..ec4b2f57 100644 --- a/locales/no-NO.yml +++ b/locales/no-NO.yml @@ -44,7 +44,7 @@ lists: Lister listsDesc: Lister lar deg lage tidslinjer med utvalgte brukere. De kan hentes frem fra tidslinje-siden. deleted: Slettet -editNote: Rediger notat +editNote: Rediger post followsYou: Følger deg createList: Lag liste newer: nyere @@ -155,7 +155,7 @@ drive: Disk renameFile: Omdøp fil folderName: Katalognavn createFolder: Opprett katalog -inputNewDescription: Oppgi ny bildetekst +inputNewDescription: Skriv ny beskrivelse inputNewFolderName: Oppgi nytt katalognavn copyUrl: Kopier URL hcaptchaSiteKey: hCaptcha-nøkkel for nettstedet @@ -409,7 +409,7 @@ nothing: Ikke noe å se her deleteAllFilesConfirm: Er du sikker på at du vil slette alle filer? updateRemoteUser: Oppdater informasjon om ekstern bruker deleteAllFiles: Slett alle filer -enterFileDescription: Legg til bildetekst +enterFileDescription: Skriv inn beskrivelse leaveConfirm: Det er ulagrede endringer. Vil du forkaste dem? enableAll: Slå på alle generateAccessToken: Generer adgangstegn @@ -506,7 +506,7 @@ yourAccountSuspendedDescription: Denne kontoen er suspendert fordi den har brutt useCw: Skjul innhold enablePlayer: Åpne videospiller disablePlayer: Lukk videospiller -describeFile: Legg til tekst +describeFile: Legg til beskrivelse author: Forfatter useFullReactionPicker: Bruk reaksjonsvelger i full størrelse width: Bredde @@ -718,3 +718,405 @@ alwaysMarkSensitive: Merk som "Sensitivt innhold" som standard verificationEmailSent: En verifiserings-epost er sendt. Følg lenken i eposten for å fullføre verifiseringen. newNoteRecived: Det er nye poster +scratchpadDescription: Kladdeblokka gir deg et miljø for å eksperimentere med AiScript. + Du kan skrive, kjøre og sjekke resultatene av at koden interagerer med Firefish. +disablePagesScript: Slå av AiScript på Sider +expandTweet: Ekspander tweet +public: Offentlig +clearCache: Slett mellomlager +onlineUsersCount: '{n} brukere er innlogget' +nNotes: '{n} poster' +sendErrorReports: Send feilmeldinger +deleteConfirm: Virkelig slette? +latestVersion: Nyeste versjon +receiveAnnouncementFromInstance: Motta varsler fra denne tjeneren +inChannelSearch: Søk i kanal +selectAccount: Velg konto +switch: Bytt +instanceDefaultDarkTheme: Standard mørkt tema på tjeneren +oneDay: En dag +driveCapOverrideCaption: Tilbakestill kapasiteten til standardverdien ved å legge + inn en verdi på 0 eller lavere. +sendModMail: Send modereringsvarsel +enableServerMachineStats: Slå på hardware-statistikk for tjeneren +_gallery: + liked: Likte poster + unlike: Fjern lik + my: Mitt galleri + like: Lik +_preferencesBackups: + loadFile: Last fra fil + cannotSave: Lagring feilet + deleteConfirm: Vil du slette sikkerhetskopien "{name}"? + saveConfirm: Lagre sikkerhetskopi som "{name}"? + noBackups: Ingen sikkerhetskopier er tatt. Du kan ta en backup av klientinnstillingene + dine på denne tjeneren ved å trykke "Lag ny sikkerhetskopi". + applyConfirm: Ønsker du å laste inn sikkerhetskopien "{name}" på denne enheten? + Eksisterende innstillinger vil bli overskrevet. + save: Lagre endringer + nameAlreadyExists: En sikkerhetskopi med navnet "{name}" finnes allerede. Skriv + inn et annet navn. + createdAt: 'Opprettet: {date} {time}' + apply: Bruk på denne enheten + renameConfirm: Endre navn på sikkerhetskopien fra "{old}" to "{new}"? + list: Opprettede sikkerhetskopier + saveNew: Ta ny sikkerhetskopi + inputName: Gi sikkerhetskopien et navn + updatedAt: 'Oppdatert: {date} {time}' + cannotLoad: Innlasting feilet + invalidFile: Ugyldig filformat +_ad: + back: Tilbake + reduceFrequencyOfThisAd: Vis annonsen sjeldnere +_mfm: + cheatSheet: Jukseark for tekstmarkering (MFM) + stop: Stopp animert markeringsspråk (MFM) + warn: Markeringsspråket (MFM) kan inneholde bevegelige eller blinkende animasjoner + alwaysPlay: Alltid spill av animert tekstmarkering (MFM) + play: Spill animert markeringsspråk (MFM) + intro: MFM er et markeringsspråk som burkes av Misskey, Firefish, Akkoma og andre. + Her kan du se en liste over tilgjengelig MFM-syntaks. +reactionPickerSkinTone: Foretrukket hudfarge i emojier +switchUi: Visningsoppsett +usageAmount: Bruk +memo: Memo +priority: Prioritet +high: Høy +secureMode: Sikker modus (Autorisert henting) +requireAdminForView: Du må logge inn på en administratorkonto for å se dette. +typeToConfirm: Skriv inn {x} for å bekrefte +replayTutorial: Kjør introduksjon på nytt +moveTo: Flytt denne kontoen til en ny konto +objectStorageBucketDesc: Skriv inn navnet på bøtta hos lagringstjenesten. +notRecommended: Ikke anbefalt +voteConfirm: Bekreft din stemme på "{choice}"? +oneHour: En time +_plugin: + installWarn: Ikke installer utvidelser du ikke stoler på. + install: Installer innstikk + manage: Oppsett av innstikk +preventAiLearning: Hindre tråling fra AI-boter +reporterOrigin: Kilden til den som rapporterer +center: Sentrert +wide: Bred +value: Verdi +createdAt: Opprettet +active: Aktiv +hideOnlineStatus: Skjul om du er pålogget +troubleshooting: Problemløsing +useBlurEffect: Bruk diffuseringseffekter i brukergrensesnittet +learnMore: Lær mer +usernameInfo: Et navn som identifiserer din konto på denne tjeneren. Du kan bruke + alfabetet (a-z,A-Z), sifre (0-9) og understrek (_). Brukernavn kan ikke endres senere. +resolved: Løst +unresolved: Uløst +welcomeBackWithName: Velkommen tilbake, {name} +clickToFinishEmailVerification: Klikk [{ok}] for å fullføre epost-verifisering. +cropImage: Beskjær bilde +numberOfPageCacheDescription: En økning i dette tallet vil gjøre brukeropplevelsen + bedre, men gi mer jobb til tjeneren og kreve mer minne. +logoutConfirm: Vil du logge ut? +numberOfPageCache: Antall mellomlagrede sider +lastActiveDate: Sist brukt +refreshInterval: 'Oppdateringsintervall ' +swipeOnDesktop: Tillat mobil-lignende sveiping på skrivebords-PC +migration: Migrering +useDrawerReactionPickerForMobile: Vis reaksjosnvelger som en skuff på mobil +numberOfColumn: Antall kolonner +searchByGoogle: Søk +oneWeek: En uke +file: Fil +recentNHours: Siste {n} timer +noEmailServerWarning: E-post-tjener er ikke konfigurert. +thereIsUnresolvedAbuseReportWarning: Det er uløste rapporter. +colored: I farger +recommendedInstancesDescription: Anbefalte tjenere skilt med linjeskift for visning + i anbefalt-tidslinjen. +caption: Automatisk beskrivelse +updateAvailable: En oppdatering kan være tilgjengelig! +accentColor: Uthevet farge +textColor: Skriftfarge +saveAs: Lagre som... +swipeOnMobile: Tillat sveiping mellom sider +_accountDelete: + inProgress: Sletting pågår +remote: Ekstern +total: Total +registry: Register +closeAccount: Avslutt konto +currentVersion: Nåværende versjon +fullView: Full visning +gallery: Galleri +emailNotConfiguredWarning: E-post-adresse er ikke satt. +allowedInstancesDescription: Tjenernavn for tjenere som skal hvitelistes. En per linje. + (Vil bare bli brukt i privat modus). +previewNoteText: Forhåndsvisning +recentNDays: Siste {n} dager +indexPosts: Indekser poster +objectStorageUseProxy: Koble til gjennom en mellomtjener +objectStorageUseProxyDesc: Skru av dette dersom du ikke vil bruke mellomtjenere for + API-oppkoblinger +masterVolume: Hovedvolum +script: Skript +divider: Skille +addItem: Legg til element +manage: Oppsett +notificationType: Varseltype +useBlurEffectForModal: Bruk diffus-effekt for modale brukergrensesnitt-elementer +driveFilesCount: Antall filer på Disk +showGapBetweenNotesInTimeline: Legg inn et tomrom mellom postene i tidslinjen +newVersionOfClientAvailable: En nyere versjon av klienten er tilgjengelig. +capacity: Kapasitet +inUse: Brukt +publish: Publiser +quickAction: Hurtigvalg +privateMode: Privat modus +customCss: Egendefinert CSS +allowedInstances: Hvitelistede tjenere +lastCommunication: Siste kommunikasjon +breakFollowConfirm: Er du sikker på at du vil fjerne følgeren? +filter: Filter +makeReactionsPublicDescription: Dette vil gjøre listen over dine tidligere reaksjoner + synlige for alle. +indefinitely: Permanent +tenMinutes: 10 minutter +_email: + _follow: + title: Du har en ny følger + _receiveFollowRequest: + title: Du har mottatt en følgeforespørsel +_registry: + key: Nøkkel + scope: Omfang + domain: Domene + createKey: Opprettet nøkkel + keys: Nøkler +sendErrorReportsDescription: "Detaljert feilinformasjon vli bli delt med utviklerne + av Firefish, noe som hjelper til med feilretting og forbedring av programmet.\n + - Dette inkluderer informasjon som f.eks. versjonen på operativsystemet og nettleseren + din, og aktiviteten din i Firefish." +_aboutFirefish: + translation: Oversett Firefish + donate: Donér til Firefish + donateTitle: Liker du Firefish? + pleaseDonateToFirefish: Du kan vurdere å donere en slant til Firefish for å støtte + videre utvikling og feilretting. + donateHost: Donér til {host} + morePatrons: Vi er også takknemlige for bidragene fra mange andre som ikke er listet + her. Takk til dere alle! 🥰 + contributors: Hovedutviklere + source: Kildekode + allContributors: Alle bidragsytere + misskeyContributors: Misskeys bidragsytere + pleaseDonateToHost: Du kan også vurdere å donere til hjemme-tjeneren din, {host}, + for å hjelpe dem med driftskostnadene for tjenesten. + about: Firefish ble opprettet av ThatOneCalculator i 2022, basert på Misskey. + sponsors: Firefishs sponsorer + patrons: Firefishs patroner + patronsList: Listen er kronologisk, ikke etter donert beløp. Doner med lenken over + for å få navnet ditt her! +isBot: Denne kontoen er en bot +_nsfw: + respect: Skjul NSFW-merket media + force: Skjul alle media + ignore: Ikke skjul NSFW-media +disableAnimatedMfm: Slå av animert markeringsspråk +objectStorageBucket: Bøtte +scratchpad: Kladdeblokk +plugins: Innstikk +createNew: Lag ny +makeExplorable: Gjør kontoen synlig i "Utforsk" +needReloadToApply: Siden må lastes på nytt for at denne endringen skal tre inn. +customCssWarn: Bruk denne innstillingen bare hvis du vet hva den gjør. Feil innstilling + kan få klienten til å ikke fungere som den skal. +low: Lav +global: Global +recommended: Anbefalt +instanceSecurity: Tjenersikkerhet +squareAvatars: Vis firkantede avatarer +deleteAccount: Slett konto +customKaTeXMacro: Egne KaTeX-makroer +size: Størrelse +fast: Raskt +showAdminUpdates: Indikerer at en ny versjon av Firefish er tilgjengelig (bare admin) +moveAccount: Flytt konto! +license: Lisens +wordMute: Ordstumming +reporteeOrigin: Kilden til den som rapporteres +accountInfo: Kontoinformasjon +driveUsage: Brukt diskplass +noCrawle: Stopp robot-indeksering +noCrawleDescription: Be søkemotorer om å ikke indeksere din profil, poster, Sider + etc. +narrow: Smal +reloadToApplySetting: Denne innstillingen aktiveres ikke før du laster siden på nytt. + Vil du gjøre det nå? +showTitlebar: Vis tittellinje +nUsers: '{n} brukere' +myTheme: Mitt tema +backgroundColor: Bakgrunnsfarge +advanced: Avansert +updatedAt: Oppdatert +editCode: Rediger kode +addDescription: Legg til beskrivelse +userPagePinTip: Du kan vise poster her ved å klikke "Fest til profil" fra menyen til + en post. +unknown: Ukjent +onlineStatus: Påkoblet status +online: Pålogget +offline: Ikke pålogget +instanceBlocking: Innstillinger for føderering +accounts: Kontoer +noBotProtectionWarning: Bot-beskyttelse er ikke konfigurert. +configure: Konfigurer +postToGallery: Lag ny galleripost +recentPosts: Nylige sider +popularPosts: Populære sider +shareWithNote: Del med post +expiration: Frist +middle: Medium +sent: Sendt +makeReactionsPublic: La reaksjonshistorikken være offentlig +classic: Sentrert +muteThread: Stum en tråd +ffVisibilityDescription: Lar deg konfigurere hvem som kan se hvem du følger og hvem + som følger deg. +continueThread: Fortsett tråd +deleteAccountConfirm: Dette vil slette kontoen, og det går ikke å omgjøre etterpå. + Fortsette? +hide: Skjul +ffVisibility: Synlighet av følgere og folk du følger +leaveGroup: Forlat gruppe +leaveGroupConfirm: Er du sikker på at du vil forlate "{name}"? +overridedDeviceKind: Enhetstype +smartphone: Smarttelefon +tablet: Nettbrett +auto: Automatisk +image: Bilde +video: Video +driveCapOverrideLabel: Endre brukerens lagringskapasitet +isSystemAccount: Denne kontoen er opprettet og kontrollert av systemet. Ikke moderer, + rediger, slett eller på annen måte endre noe ved denne kontoen. Tjeneren kan slutte + å virke som den skal. +document: Dokumentasjon +statusbar: Statuslinje +pleaseSelect: Velg en innstilling +reverse: Reverser +slow: Sakte +moveFromLabel: 'Kontoen du flytter fra:' +silencedWarning: Denne siden vises fordi disse brukerne er fra tjenere administratoren + din har stummet, så de kan potensielt inneholde spam. +ads: Samfunnsbanner +_forgotPassword: + contactAdmin: Denne tjeneren støtter ikke bruk av e-post-adresser for gjenoppretting + av passord. Kontakt administratoren for tjeneren. + enterEmail: Skriv inn e-post-adressen du brukte da du registrerte kontoen. Du vil + motta en e-post med en lenke som lar deg endre passordet. + ifNoEmail: Dersom du ikke oppga en e-post-adresse da du registrerte kontoen, kontakt + administrator i stedet. +breakFollow: Slett følger +unmuteThread: Fjern stumming av tråden +incorrectPassword: Feil passord. +logoImageUrl: URL til logo-bilde +apps: Apper +audio: Lyd +moveToLabel: 'Kontoen du flytter til:' +moveFrom: Flytt fra en annen konto til denne kontoen +migrationConfirm: "Er du helt sikker på at du ønsker å flytte kontoen din til {account}? + Når du har gjort dette kan du ikke omgjøre det, og du vil ikke kunne bruke kontoen + normalt etterpå.\nPass på at du setter den kontoen du er innlogget på her som kontoen + du flytter fra." +jumpToSpecifiedDate: Hopp til en gitt dato +showingPastTimeline: Du ser nå en gammel tidslinje +noMaintainerInformationWarning: Eierinformasjon er ikke konfigueret. +notSpecifiedMentionWarning: Denne posten inneholder nevnelser av brukere som ikke + er inkludert som mottakere +saveConfirm: Lagre endringer? +clear: Tøm +switchAccount: Bytt konto +enabled: Påslått +disabled: Avslått +user: Bruker +administration: Konfigurasjon +invalidValue: Ugyldig verdi. +youAreRunningUpToDateClient: Du bruker nyeste versjon av klienten. +noteId: Post-id +noGraze: Slå av "Graze for Mastodon"-utdivdelsen i nettleseren. Den vil forstyrre + Firefish. +isModerator: Moderator +isAdmin: Administrator +objectStorageS3ForcePathStyle: Bruk sti-baserte URL-er til endepunktene +objectStorageS3ForcePathStyleDesc: Skru på dette for å lage endpunkts-URL-er i formatet + 's3.amazonaws.com//' i stedet for '.s3.amazonaws.com'. +output: Utputt +forwardReport: Videresend rapport til ekstern tjener +forwardReportIsAnonymous: I stedet for din konto vil en anonym systemkonto bli vist + som rapportør på den eksterne tjeneren. +optional: Valgfritt +manageAccessTokens: Styr adgangstegn +experimentalFeatures: Eksperimentelle funksjoner +developer: Utvikler +duplicate: Dupliser +left: Venstre +makeExplorableDescription: Dersom du slår av denne vil kontoen din ikke dukke opp + under "Utforsk". +apply: Bruk +emailNotification: Epostvarsler +useReactionPickerForContextMenu: Åpne reaksjonsvelger med høyreklikk +typingUsers: '{users} skriver' +markAllAsRead: Marker alle som lest +goBack: Tilbake +info: Om +userInfo: Brukerinformasjon +hideOnlineStatusDescription: Å skjule hvorvidt du er pålogget vil redusere enkelheten + av enkelte funksjoner slik som søk. +privateModeInfo: Bare hvitelistede tjenere kan federere med din tjener om du slår + på denne. Alle poster vil bli skjult for andre. +received: Mottatt +searchResult: Søkeresultater +hashtags: Emneknagger +keepCw: Behold innholdsadvarsler +misskeyUpdated: Firefish er oppdatert! +whatIsNew: Vis endringer +translate: Oversett +translatedFrom: Oversatt fra {x} +itsOn: Påslått +itsOff: Avslått +emailRequiredForSignup: Krev e-post-adresse for registrering +unread: Ulest +controlPanel: Kontrollpanel +manageAccounts: Styr kontoer +mutePeriod: Periode for stumming +instanceDefaultLightTheme: Standard lyst tema på tjeneren +reflectMayTakeTime: Det kan ta litt tid før endringen inntrer. +failedToFetchAccountInformation: Klarte ikke å hente kontoinformasjon +cropImageAsk: Ønsker du å beskjære dette bildet? +recommendedInstances: Anbefalte tjenere +moveAccountDescription: Denne prosessen er irreversibel! Vær sikker på at du har satt + opp et alias for denne kontoen på den nye kontoen før du fortsetter. Skriv inn navnet + på kontoen på formen @person@server.com +moveFromDescription: Dette vil sette opp et alias for din gamle kontoen slik at du + kan flytte fra den gamle kontoen til denne. Gjør dette FØR du flytter fra den gamle + kontoen. Skriv inn den gamle kontoen på formen @person@server.com +defaultReaction: Standard emoji-reaksjon for utgående og innkommende poster +indexFrom: Indekser poster fra post-id og fremover +indexNotice: Indekserer. Dette vil sannsynligvis ta litt tid, ikke restart tjeneren + før det har gått minst en time. +indexFromDescription: La stå tom for å indeksere alle poster +customKaTeXMacroDescription: 'Sett opp makroer for å skrive matematiske uttrykk enkelt. + Notasjonen følger LaTeX-kommandoer og er skrevet som \newcommand{\ navn}{uttrykk} + eller \newcommand{\navn}{antall argumenter}{uttrykk}. For eksempel vil \newcommand{\add}{2}{#1 + + #2} vil ekspandere \add{3}{foo} til 3 + foo. Klammeparentesene rundt makroen kan + også endres til parenteser eller hakeparenteser. Dette påvirker hvilken parentestype + du bruker for argumenter. En og bare en makro kan defineres pr linje, og du kan + ikke ha linjeskift inni definisjonen. Linjer som ikke inneholder gyldige makroer + vil bli ignorert. Bare enkle streng-erstatnings-makroer er støttet; avansert syntaks + f.eks. med flykontroll er ikke tillatt.' +signupsDisabled: Registreringer av nye konti på denne tjeneren er slått av, men du + kan alltids registrere deg på en annen tjener! Hvis du har en invitasjonskode for + denne tjeneren, skriv den inn under. +findOtherInstance: Finn en annen tjener +preventAiLearningDescription: Ber tredjeparts AI-språkmodeller om å ikke bruke innhold + du laster opp, sliks om poster og bilder. +enableCustomKaTeXMacro: Slå på egne KaTeX-makroer +showPopup: Varsle brukere med oppsprettsvindu diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 0b76bf78..926ab300 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -304,7 +304,7 @@ emptyDrive: "Диск пуст" emptyFolder: "Папка пуста" unableToDelete: "Удаление невозможно" inputNewFileName: "Введите имя нового файла" -inputNewDescription: "Введите новую подпись" +inputNewDescription: "Введите новое описание" inputNewFolderName: "Пожалуйста, введите новое имя папки" circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя." hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена." @@ -513,7 +513,7 @@ objectStorageBaseUrlDesc: "URL используемый для примера. CDN или прокси, если вы используете любой из них.\nДля S3 используйте 'https://.s3.amazonaws.com', а для GCS и подобных сервисов используйте 'https://storage.googleapis.com/', и т.п." -objectStorageBucket: "Bucket" +objectStorageBucket: "Хранилище (Bucket)" objectStorageBucketDesc: "Укажите название контейнера (Bucket) который используется на выбранном сервисе." objectStoragePrefix: "Префикс" @@ -596,8 +596,8 @@ disablePlayer: "Выключить проигрыватель" expandTweet: "Развернуть твит" themeEditor: "Редактор темы оформления" description: "Описание" -describeFile: "Добавить подпись" -enterFileDescription: "Введите подпись" +describeFile: "Добавить описание" +enterFileDescription: "Введите описание" author: "Автор" leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?" manage: "Управление" @@ -826,7 +826,7 @@ gallery: "Галерея" recentPosts: "Недавние публикации" popularPosts: "Популярные публикации" shareWithNote: "Поделиться постом" -ads: "Реклама" +ads: "Баннеры сообщества" expiration: "Опрос длится" memo: "Памятка" priority: "Приоритет" @@ -1001,6 +1001,7 @@ _aboutFirefish: pleaseDonateToHost: Также не забудьте поддержать ваш домашний сервер {host}, чтобы помочь с его операционными расходами. donateHost: Пожертвовать на {host} + misskeyContributors: Контрибьюторы Misskey _nsfw: respect: "Скрывать содержимое не для всех" ignore: "Показывать содержимое не для всех" @@ -1024,7 +1025,7 @@ _mfm: boldDescription: "Выделяет текст, делая буквы жирнее." small: "Мелкий шрифт" smallDescription: "Делает текст маленьким и незаметным." - center: "Выровнять элементы по центру" + center: "По центру" centerDescription: "Так можно выровнять что-то по центру." inlineCode: "Программа (в тексте)" inlineCodeDescription: "Подсвечивает фрагмент программы внутри сплошного текста." @@ -1267,8 +1268,8 @@ _tutorial: step6_1: "Итак, что это за место?" step6_2: "Ну, вы не просто присоединились к Firefish. Вы вошли в Fediverse, взаимосвязанную сеть из тысяч серверов." - step6_3: "Каждый сервер работает по-своему, и не на всех серверах работает Firefish. - Но этот работает! Это немного сложно, но вы быстро разберетесь." + step6_3: "Каждый сервер работает по-своему, и не все сервера работают на базе Firefish. + Но этот работает! Это сложновато, но вы быстро разберетесь." step6_4: "Теперь идите, изучайте и развлекайтесь!" _2fa: alreadyRegistered: "Двухфакторная аутентификация уже настроена." @@ -1475,7 +1476,7 @@ _charts: remoteNotesIncDec: "Изменения числа постов с других сайтов" notesTotal: "Общее количество постов" filesIncDec: "Изменения числа файлов" - filesTotal: "Суммарное количество файлов" + filesTotal: "Общее количество файлов" storageUsageIncDec: "Изменения заполнения хранилища" storageUsageTotal: "Суммарное заполнение хранилища" _instanceCharts: @@ -1903,12 +1904,12 @@ customMOTDDescription: Пользовательские сообщения дл загружает / перезагружает страницу. recommendedInstancesDescription: Рекомендуемые инстансы, разделенные разрывами строк, должны отображаться на рекомендуемой ленте. -caption: Автоматическая подпись +caption: Автоматическое описание splash: Заставка updateAvailable: Возможно, доступно обновление! move: Переместить swipeOnDesktop: Разрешить свайпы в мобильном стиле на десктопе -showAds: Показывать рекламу +showAds: Показывать баннеры сообщества noEmailServerWarning: Почтовый сервер не настроен. type: Тип numberOfPageCacheDescription: Увеличение этого числа повысит удобство для пользователей, @@ -2137,3 +2138,19 @@ donationLink: Ссылка на страницу для взносов isLocked: Этот аккаунт имеет одобрение запросов на подписку removeRecipient: Удалить получателя removeMember: Удалить участника +confirm: Подтвердить +importZip: Импортировать ZIP +exportZip: Экспортировать ZIP +emojiPackCreator: Генератор паков эмодзи +objectStorageS3ForcePathStyle: Использовать путь вместо домена в URL +objectStorageS3ForcePathStyleDesc: Включите, если хотите, чтобы URL был в формате + 's3.amazonaws.com//' вместо '.s3.amazonaws.com'. +origin: Источник +deletePasskeys: Удалить passkey +delete2faConfirm: Двухфакторная аутентификация на этом аккаунте будет безвозвратно + удалена. Продолжить? +delete2fa: Отключить двухфакторную аутентификацию +deletePasskeysConfirm: Это действие безвозвратно удалит все passkey и ключи безопасности + на этом аккаунте. Продолжить? +inputNotMatch: Введённые данные не совпадают +addRe: Добавить "re:" в начале комментария в ответ на запись с предупреждением о содержимом diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index 50910e82..f1c9dab4 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -305,7 +305,7 @@ emptyDrive: "Диск порожній" emptyFolder: "Тека порожня" unableToDelete: "Видалення неможливе" inputNewFileName: "Введіть ім'я нового файлу" -inputNewDescription: "Введіть новий заголовок" +inputNewDescription: "Введіть новий опис" inputNewFolderName: "Введіть ім'я нової теки" circularReferenceFolder: "Ви намагаєтесь перемістити папку в її підпапку." hasChildFilesOrFolders: "Ця тека не порожня і не може бути видалена." @@ -591,8 +591,8 @@ disablePlayer: "Закрити відеоплеєр" expandTweet: "Розгорнути твіт" themeEditor: "Редактор тем" description: "Опис" -describeFile: "Додати підпис" -enterFileDescription: "Введіть підпис" +describeFile: "Додати опис" +enterFileDescription: "Введіть опис" author: "Автор" leaveConfirm: "Зміни не збережені. Ви дійсно хочете скасувати зміни?" manage: "Управління" @@ -1985,7 +1985,7 @@ showUpdates: Показувати спливаюче вікно при онов updateAvailable: Можливо, є доступне оновлення! recommendedInstancesDescription: Рекомендовані сервери відокремлюються переведенням рядка, щоб з'явитися на стрічці рекомендацій. -caption: Автоматичний підпис +caption: Автоматичний опис showAdminUpdates: Вказати, що доступна нова версія Firefish (тільки для адміністратора) defaultReaction: Емодзі реакція за замовчуванням для вихідних і вхідних записів license: Ліцензія @@ -2151,3 +2151,7 @@ deletePasskeysConfirm: Це видалить усі ключ-паролі і к записі без можливости відмінити цю дію. Продовжити? addRe: Додати "re:" на початку коментаря у відповідь на запис із попередженням про вміст +confirm: Підтвердити +importZip: Імпортувати ZIP +exportZip: Експортувати ZIP +emojiPackCreator: Генератор паків емодзі diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index b283db0a..17ab858c 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -290,7 +290,7 @@ emptyDrive: "网盘中无文件" emptyFolder: "此文件夹中无文件" unableToDelete: "无法删除" inputNewFileName: "请输入新文件名" -inputNewDescription: "请输入新标题" +inputNewDescription: "请输入新描述" inputNewFolderName: "请输入新文件夹名" circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。" hasChildFilesOrFolders: "此文件夹中有文件,无法删除。" @@ -561,8 +561,8 @@ disablePlayer: "关闭播放器" expandTweet: "展开帖子" themeEditor: "主题编辑器" description: "描述" -describeFile: "添加标题" -enterFileDescription: "输入标题" +describeFile: "添加描述" +enterFileDescription: "输入描述" author: "作者" leaveConfirm: "存在未保存的更改。要放弃更改吗?" manage: "管理" @@ -776,7 +776,7 @@ gallery: "图库" recentPosts: "最新发布" popularPosts: "热门投稿" shareWithNote: "在帖子中分享" -ads: "广告" +ads: "社区横幅" expiration: "截止时间" memo: "便笺" priority: "优先级" @@ -825,7 +825,7 @@ unmuteThread: "取消静音帖子串" ffVisibility: "关注/关注者 可见性" ffVisibilityDescription: "您可以设置谁可以看到您的关注/关注者信息。" continueThread: "查看更多帖子" -deleteAccountConfirm: "将不可逆的删除账号,是否继续?" +deleteAccountConfirm: "这将不可逆转地删除账号,是否继续?" incorrectPassword: "密码错误。" voteConfirm: "确定投给 “{choice}” ?" hide: "隐藏" @@ -994,6 +994,7 @@ _aboutFirefish: pleaseDonateToFirefish: 请考虑赞助 Firefish 以支持其开发。 pleaseDonateToHost: 也请考虑赞助您的主服务器 {host},以帮助支持其运营成本。 donateHost: 赞助 {host} + misskeyContributors: Misskey 贡献者 _nsfw: respect: "隐藏敏感内容" ignore: "不隐藏敏感内容" @@ -1857,7 +1858,7 @@ seperateRenoteQuote: 单独的转发和引用按钮 customSplashIcons: 自定义启动屏幕图标(urls) alt: 替代文字 pushNotificationNotSupported: 您的浏览器或者服务器不支持推送通知 -showAds: 显示广告 +showAds: 显示社区横幅 enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Retun 发送) recommendedInstances: 推荐服务器 updateAvailable: 可能有可用更新! @@ -1876,7 +1877,7 @@ clipsDesc: 便签就像可共享的分类书签。您可以从各个帖子的菜 privateModeInfo: 当启用时,只有白名单上的服务器可以与您的服务器联合,所有的帖子都会对公共时间线隐藏。 allowedInstancesDescription: 要列入联合白名单的服务器的主机名,一行一个(仅适用于私密模式)。 breakFollowConfirm: 确定要移除关注者吗? -caption: 自动显示说明文字 +caption: 自动显示描述文字 newer: 更新的 older: 更旧的 noInstances: 没有服务器 @@ -1967,3 +1968,16 @@ removeQuote: 移除引用 removeRecipient: 移除接收者 removeMember: 移除成员 origin: 起源 +confirm: 确认 +importZip: 导入 ZIP +exportZip: 导出 ZIP +emojiPackCreator: 表情包创建工具 +objectStorageS3ForcePathStyleDesc: 打开此选项可构建格式为 's3.amazonaws.com//' 而非 '.s3.amazonaws.com' + 的端点 URL。 +objectStorageS3ForcePathStyle: 使用基于路径的端点 URL +delete2fa: 禁用 2FA +deletePasskeysConfirm: 这将不可逆转地删除此账号上的所有通行密钥和安全密钥。是否继续? +inputNotMatch: 输入不匹配 +deletePasskeys: 删除通行密钥 +delete2faConfirm: 这将不可逆转地删除此账户上的 2FA。是否继续? +addRe: 在回复有内容警告的帖子时,在评论开头添加 "re:" diff --git a/neko/UPSTREAM_COMMIT_ID b/neko/UPSTREAM_COMMIT_ID new file mode 100644 index 00000000..a9ecda09 --- /dev/null +++ b/neko/UPSTREAM_COMMIT_ID @@ -0,0 +1 @@ +f309d17667d827f44e9d914f43ddc7af2aef8268 diff --git a/package.json b/package.json index 598b7fa1..8733eaa9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firefish", - "version": "1.0.5-dev5", + "version": "1.0.5-dev6", "codename": "aqua", "repository": { "type": "git", diff --git a/packages/backend/migration/1692374635734-IncreaseHostCharLimit.js b/packages/backend/migration/1692374635734-IncreaseHostCharLimit.js new file mode 100644 index 00000000..feb0d18a --- /dev/null +++ b/packages/backend/migration/1692374635734-IncreaseHostCharLimit.js @@ -0,0 +1,119 @@ +export class IncreaseHostCharLimit1692374635734 { + name = "IncreaseHostCharLimit1692374635734"; + + async up(queryRunner) { + await queryRunner.query( + `ALTER TABLE "drive_file" ALTER COLUMN "userHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "user" ALTER COLUMN "host" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "user_profile" ALTER COLUMN "userHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "user_publickey" ALTER COLUMN "keyId" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "emoji" ALTER COLUMN "host" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "note" ALTER COLUMN "userHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "note" ALTER COLUMN "replyUserHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "note" ALTER COLUMN "renoteUserHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "instance" ALTER COLUMN "host" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "instance" ALTER COLUMN "iconUrl" TYPE character varying(4096)`, + ); + await queryRunner.query( + `ALTER TABLE "instance" ALTER COLUMN "faviconUrl" TYPE character varying(4096)`, + ); + + await queryRunner.query( + `ALTER TABLE "poll" ALTER COLUMN "userHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "abuse_user_report" ALTER COLUMN "targetUserHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "abuse_user_report" ALTER COLUMN "reporterHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "following" ALTER COLUMN "followeeHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "following" ALTER COLUMN "followerHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "follow_request" ALTER COLUMN "followeeHost" TYPE character varying(512)`, + ); + await queryRunner.query( + `ALTER TABLE "follow_request" ALTER COLUMN "followerHost" TYPE character varying(512)`, + ); + } + + async down(queryRunner) { + await queryRunner.query( + `ALTER TABLE "drive_file" ALTER COLUMN "userHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "user" ALTER COLUMN "host" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "user_profile" ALTER COLUMN "userHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "user_publickey" ALTER COLUMN "keyId" TYPE character varying(256)`, + ); + await queryRunner.query( + `ALTER TABLE "emoji" ALTER COLUMN "host" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "note" ALTER COLUMN "userHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "note" ALTER COLUMN "replyUserHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "note" ALTER COLUMN "renoteUserHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "instance" ALTER COLUMN "host" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "instance" ALTER COLUMN "iconUrl" TYPE character varying(256)`, + ); + await queryRunner.query( + `ALTER TABLE "instance" ALTER COLUMN "faviconUrl" TYPE character varying(256)`, + ); + + await queryRunner.query( + `ALTER TABLE "poll" ALTER COLUMN "userHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "abuse_user_report" ALTER COLUMN "targetUserHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "abuse_user_report" ALTER COLUMN "reporterHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "following" ALTER COLUMN "followeeHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "following" ALTER COLUMN "followerHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "follow_request" ALTER COLUMN "followeeHost" TYPE character varying(128)`, + ); + await queryRunner.query( + `ALTER TABLE "follow_request" ALTER COLUMN "followerHost" TYPE character varying(128)`, + ); + } +} diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 7ead804a..52854db5 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -78,6 +78,7 @@ export type Source = { fingerprint?: string; }; + outgoingAddress?: string; outgoingAddressFamily?: "ipv4" | "ipv6" | "dual"; deliverJobConcurrency?: number; diff --git a/packages/backend/src/misc/download-url.ts b/packages/backend/src/misc/download-url.ts index e9975f34..83680c17 100644 --- a/packages/backend/src/misc/download-url.ts +++ b/packages/backend/src/misc/download-url.ts @@ -92,7 +92,7 @@ export async function downloadUrl(url: string, path: string): Promise { logger.succ(`Download finished: ${chalk.cyan(url)}`); } -function isPrivateIp(ip: string): boolean { +export function isPrivateIp(ip: string): boolean { for (const net of config.allowedPrivateNetworks || []) { const cidr = new IPCIDR(net); if (cidr.contains(ip)) { diff --git a/packages/backend/src/misc/fetch.ts b/packages/backend/src/misc/fetch.ts index 0e673ba3..e47ef0d4 100644 --- a/packages/backend/src/misc/fetch.ts +++ b/packages/backend/src/misc/fetch.ts @@ -99,6 +99,7 @@ const _http = new http.Agent({ keepAlive: true, keepAliveMsecs: 30 * 1000, lookup: cache.lookup, + localAddress: config.outgoingAddress, } as http.AgentOptions); /** @@ -108,6 +109,7 @@ const _https = new https.Agent({ keepAlive: true, keepAliveMsecs: 30 * 1000, lookup: cache.lookup, + localAddress: config.outgoingAddress, } as https.AgentOptions); const maxSockets = Math.max(256, config.deliverJobConcurrency || 128); @@ -123,6 +125,7 @@ export const httpAgent = config.proxy maxFreeSockets: 256, scheduling: "lifo", proxy: config.proxy, + localAddress: config.outgoingAddress, }) : _http; @@ -137,6 +140,7 @@ export const httpsAgent = config.proxy maxFreeSockets: 256, scheduling: "lifo", proxy: config.proxy, + localAddress: config.outgoingAddress, }) : _https; diff --git a/packages/backend/src/models/entities/abuse-user-report.ts b/packages/backend/src/models/entities/abuse-user-report.ts index be183548..cb4d5585 100644 --- a/packages/backend/src/models/entities/abuse-user-report.ts +++ b/packages/backend/src/models/entities/abuse-user-report.ts @@ -71,7 +71,7 @@ export class AbuseUserReport { //#region Denormalized fields @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) @@ -79,7 +79,7 @@ export class AbuseUserReport { @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) diff --git a/packages/backend/src/models/entities/drive-file.ts b/packages/backend/src/models/entities/drive-file.ts index d8b54fa1..da93f32a 100644 --- a/packages/backend/src/models/entities/drive-file.ts +++ b/packages/backend/src/models/entities/drive-file.ts @@ -39,7 +39,7 @@ export class DriveFile { @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "The host of owner. It will be null if the user in local.", }) diff --git a/packages/backend/src/models/entities/emoji.ts b/packages/backend/src/models/entities/emoji.ts index 727ba2f1..87b525dc 100644 --- a/packages/backend/src/models/entities/emoji.ts +++ b/packages/backend/src/models/entities/emoji.ts @@ -20,7 +20,7 @@ export class Emoji { @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, }) public host: string | null; diff --git a/packages/backend/src/models/entities/following.ts b/packages/backend/src/models/entities/following.ts index fafcf888..ea8f3256 100644 --- a/packages/backend/src/models/entities/following.ts +++ b/packages/backend/src/models/entities/following.ts @@ -50,7 +50,7 @@ export class Following { //#region Denormalized fields @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) @@ -72,7 +72,7 @@ export class Following { @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) diff --git a/packages/backend/src/models/entities/instance.ts b/packages/backend/src/models/entities/instance.ts index 7e0b0858..7b7701d0 100644 --- a/packages/backend/src/models/entities/instance.ts +++ b/packages/backend/src/models/entities/instance.ts @@ -20,7 +20,7 @@ export class Instance { */ @Index({ unique: true }) @Column("varchar", { - length: 128, + length: 512, comment: "The host of the Instance.", }) public host: string; @@ -149,13 +149,13 @@ export class Instance { public maintainerEmail: string | null; @Column("varchar", { - length: 256, + length: 4096, nullable: true, }) public iconUrl: string | null; @Column("varchar", { - length: 256, + length: 4096, nullable: true, }) public faviconUrl: string | null; diff --git a/packages/backend/src/models/entities/note.ts b/packages/backend/src/models/entities/note.ts index edcfdb63..21fe64e9 100644 --- a/packages/backend/src/models/entities/note.ts +++ b/packages/backend/src/models/entities/note.ts @@ -217,7 +217,7 @@ export class Note { //#region Denormalized fields @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) @@ -231,7 +231,7 @@ export class Note { public replyUserId: User["id"] | null; @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) @@ -245,7 +245,7 @@ export class Note { public renoteUserId: User["id"] | null; @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) diff --git a/packages/backend/src/models/entities/poll.ts b/packages/backend/src/models/entities/poll.ts index 405cca22..c117d4e7 100644 --- a/packages/backend/src/models/entities/poll.ts +++ b/packages/backend/src/models/entities/poll.ts @@ -58,7 +58,7 @@ export class Poll { @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) diff --git a/packages/backend/src/models/entities/user-profile.ts b/packages/backend/src/models/entities/user-profile.ts index 002247d3..686fab34 100644 --- a/packages/backend/src/models/entities/user-profile.ts +++ b/packages/backend/src/models/entities/user-profile.ts @@ -242,7 +242,7 @@ export class UserProfile { //#region Denormalized fields @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "[Denormalized]", }) diff --git a/packages/backend/src/models/entities/user-publickey.ts b/packages/backend/src/models/entities/user-publickey.ts index 83a86b8a..e39b084d 100644 --- a/packages/backend/src/models/entities/user-publickey.ts +++ b/packages/backend/src/models/entities/user-publickey.ts @@ -22,7 +22,7 @@ export class UserPublickey { @Index({ unique: true }) @Column("varchar", { - length: 256, + length: 512, }) public keyId: string; diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index 7883ea6a..c8f14eee 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -214,7 +214,7 @@ export class User { @Index() @Column("varchar", { - length: 128, + length: 512, nullable: true, comment: "The host of the User. It will be null if the origin of the user is local.", diff --git a/packages/backend/src/remote/activitypub/deliver-manager.ts b/packages/backend/src/remote/activitypub/deliver-manager.ts index 400e0477..c97d1c99 100644 --- a/packages/backend/src/remote/activitypub/deliver-manager.ts +++ b/packages/backend/src/remote/activitypub/deliver-manager.ts @@ -122,19 +122,31 @@ export default class DeliverManager { ) .forEach((recipe) => inboxes.add(recipe.to.inbox!)); + // Validate Inboxes first + const validInboxes = []; + for (const inbox of inboxes) { + try { + validInboxes.push({ + inbox, + host: new URL(inbox).host, + }); + } catch (error) { + console.error(error); + console.error(`Invalid Inbox ${inbox}`); + } + } + const instancesToSkip = await skippedInstances( // get (unique) list of hosts - Array.from( - new Set(Array.from(inboxes).map((inbox) => new URL(inbox).host)), - ), + Array.from(new Set(validInboxes.map((valid) => valid.host))), ); // deliver - for (const inbox of inboxes) { + for (const valid of validInboxes) { // skip instances as indicated - if (instancesToSkip.includes(new URL(inbox).host)) continue; + if (instancesToSkip.includes(valid.host)) continue; - deliver(this.actor, this.activity, inbox); + deliver(this.actor, this.activity, valid.inbox); } } } diff --git a/packages/backend/src/remote/activitypub/kernel/index.ts b/packages/backend/src/remote/activitypub/kernel/index.ts index 58e354a5..a90ac023 100644 --- a/packages/backend/src/remote/activitypub/kernel/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/index.ts @@ -37,7 +37,7 @@ import remove from "./remove/index.js"; import block from "./block/index.js"; import flag from "./flag/index.js"; import move from "./move/index.js"; -import type { IObject } from "../type.js"; +import type { IObject, IActivity } from "../type.js"; import { extractDbHost } from "@/misc/convert-host.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; @@ -106,6 +106,8 @@ async function performOneActivity( } else if (isMove(activity)) { await move(actor, activity); } else { - apLogger.warn(`unrecognized activity type: ${(activity as any).type}`); + apLogger.warn( + `Unrecognized activity type: ${(activity as IActivity).type}`, + ); } } diff --git a/packages/backend/src/remote/activitypub/misc/ld-signature.ts b/packages/backend/src/remote/activitypub/misc/ld-signature.ts index 62707624..59551092 100644 --- a/packages/backend/src/remote/activitypub/misc/ld-signature.ts +++ b/packages/backend/src/remote/activitypub/misc/ld-signature.ts @@ -68,13 +68,13 @@ export class LdSignature { ...options, "@context": "https://w3id.org/identity/v1", }; - delete transformedOptions["type"]; - delete transformedOptions["id"]; - delete transformedOptions["signatureValue"]; + transformedOptions.type = undefined; + transformedOptions.id = undefined; + transformedOptions.signatureValue = undefined; const canonizedOptions = await this.normalize(transformedOptions); const optionsHash = this.sha256(canonizedOptions); const transformedData = { ...data }; - delete transformedData["signature"]; + transformedData.signature = undefined; const cannonidedData = await this.normalize(transformedData); if (this.debug) console.debug(`cannonidedData: ${cannonidedData}`); const documentHash = this.sha256(cannonidedData); diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 6987798f..538cf7f5 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -231,6 +231,21 @@ export async function createPerson( } } + let notesCount: number | undefined; + + if (typeof person.outbox === "string") { + try { + let data = await fetch(person.outbox, { + headers: { Accept: "application/json" }, + }); + let json_data = JSON.parse(await data.text()); + + notesCount = json_data.totalItems; + } catch (e) { + notesCount = undefined; + } + } + // Create user let user: IRemoteUser; try { @@ -274,6 +289,14 @@ export async function createPerson( isCollectionOrOrderedCollection(person.following) ? person.following.totalItems : undefined, + notesCount: + notesCount !== undefined + ? notesCount + : person.outbox && + typeof person.outbox !== "string" && + isCollectionOrOrderedCollection(person.outbox) + ? person.outbox.totalItems + : undefined, featured: person.featured ? getApId(person.featured) : undefined, uri: person.id, tags, @@ -472,6 +495,21 @@ export async function updatePerson( } } + let notesCount: number | undefined; + + if (typeof person.outbox === "string") { + try { + let data = await fetch(person.outbox, { + headers: { Accept: "application/json" }, + }); + let json_data = JSON.parse(await data.text()); + + notesCount = json_data.totalItems; + } catch (e) { + notesCount = undefined; + } + } + const updates = { lastFetchedAt: new Date(), inbox: person.inbox, @@ -495,6 +533,14 @@ export async function updatePerson( isCollectionOrOrderedCollection(person.following) ? person.following.totalItems : undefined, + notesCount: + notesCount !== undefined + ? notesCount + : person.outbox && + typeof person.outbox !== "string" && + isCollectionOrOrderedCollection(person.outbox) + ? person.outbox.totalItems + : undefined, featured: person.featured, emojis: emojiNames, name: truncate(person.name, nameLength), @@ -554,7 +600,7 @@ export async function updatePerson( { followerSharedInbox: person.sharedInbox || - (person.endpoints ? person.endpoints.sharedInbox : undefined), + (person.endpoints ? person.endpoints.sharedInbox : null), }, ); @@ -663,7 +709,7 @@ export async function updateFeatured(userId: User["id"], resolver?: Resolver) { ? collection.items : collection.orderedItems; const items = await Promise.all( - toArray(unresolvedItems).map((x) => resolver.resolve(x)), + toArray(unresolvedItems).map((x) => resolver?.resolve(x)), ); // Resolve and regist Notes diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts index 7879d495..f49f9461 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts @@ -1,7 +1,6 @@ import define from "../../../define.js"; import { createImportCustomEmojisJob } from "@/queue/index.js"; import { ApiError } from "../../../error.js"; -import ms from "ms"; export const meta = { tags: ["admin", "emoji"], diff --git a/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts b/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts index f7a9ad77..db12ab6c 100644 --- a/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts +++ b/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts @@ -1,4 +1,4 @@ -import * as sanitizeHtml from "sanitize-html"; +import sanitizeHtml from "sanitize-html"; import define from "../../define.js"; import { Users, UserProfiles } from "@/models/index.js"; import { ApiError } from "../../error.js"; diff --git a/packages/backend/src/server/api/endpoints/drive/folders/update.ts b/packages/backend/src/server/api/endpoints/drive/folders/update.ts index 929a69bd..13673e9f 100644 --- a/packages/backend/src/server/api/endpoints/drive/folders/update.ts +++ b/packages/backend/src/server/api/endpoints/drive/folders/update.ts @@ -24,7 +24,7 @@ export const meta = { }, recursiveNesting: { - message: "It can not be structured like nesting folders recursively.", + message: "It cannot be structured like nesting folders recursively.", code: "NO_SUCH_PARENT_FOLDER", id: "ce104e3a-faaf-49d5-b459-10ff0cbbcaa1", }, diff --git a/packages/backend/src/server/api/endpoints/i/pin.ts b/packages/backend/src/server/api/endpoints/i/pin.ts index 40aa5791..75207052 100644 --- a/packages/backend/src/server/api/endpoints/i/pin.ts +++ b/packages/backend/src/server/api/endpoints/i/pin.ts @@ -18,7 +18,7 @@ export const meta = { }, pinLimitExceeded: { - message: "You can not pin notes any more.", + message: "You cannot pin notes any more.", code: "PIN_LIMIT_EXCEEDED", id: "72dab508-c64d-498f-8740-a8eec1ba385a", }, diff --git a/packages/backend/src/server/api/endpoints/latest-version.ts b/packages/backend/src/server/api/endpoints/latest-version.ts index 1cf259c8..4d07406d 100644 --- a/packages/backend/src/server/api/endpoints/latest-version.ts +++ b/packages/backend/src/server/api/endpoints/latest-version.ts @@ -15,9 +15,7 @@ export const paramDef = { export default define(meta, paramDef, async () => { let tag_name; - await fetch( - "https://codeberg.org/api/v1/repos/firefish/firefish/releases?draft=false&pre-release=false&page=1&limit=1", - ) + await fetch("https://git.joinfirefish.org/api/v4/projects/7/releases") .then((response) => response.json()) .then((data) => { tag_name = data[0].tag_name; diff --git a/packages/backend/src/server/api/endpoints/messaging/messages.ts b/packages/backend/src/server/api/endpoints/messaging/messages.ts index 4b544038..17f626b6 100644 --- a/packages/backend/src/server/api/endpoints/messaging/messages.ts +++ b/packages/backend/src/server/api/endpoints/messaging/messages.ts @@ -48,7 +48,7 @@ export const meta = { }, groupAccessDenied: { - message: "You can not read messages of groups that you have not joined.", + message: "You cannot read messages of groups that you have not joined.", code: "GROUP_ACCESS_DENIED", id: "a053a8dd-a491-4718-8f87-50775aad9284", }, diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts index ed9ae16d..4ffbb069 100644 --- a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts +++ b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts @@ -28,7 +28,7 @@ export const meta = { errors: { recipientIsYourself: { - message: "You can not send a message to yourself.", + message: "You cannot send a message to yourself.", code: "RECIPIENT_IS_YOURSELF", id: "17e2ba79-e22a-4cbc-bf91-d327643f4a7e", }, @@ -46,7 +46,7 @@ export const meta = { }, groupAccessDenied: { - message: "You can not send messages to groups that you have not joined.", + message: "You cannot send messages to groups that you have not joined.", code: "GROUP_ACCESS_DENIED", id: "d96b3cca-5ad1-438b-ad8b-02f931308fbd", }, diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index e1522104..542f617b 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -52,7 +52,7 @@ export const meta = { }, cannotReRenote: { - message: "You can not Renote a pure Renote.", + message: "You cannot Renote a pure Renote.", code: "CANNOT_RENOTE_TO_A_PURE_RENOTE", id: "fd4cc33e-2a37-48dd-99cc-9b806eb2031a", }, @@ -64,7 +64,7 @@ export const meta = { }, cannotReplyToPureRenote: { - message: "You can not reply to a pure Renote.", + message: "You cannot reply to a pure Renote.", code: "CANNOT_REPLY_TO_A_PURE_RENOTE", id: "3ac74a84-8fd5-4bb0-870f-01804f82ce15", }, diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 70c5ceff..a80a08a4 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -70,7 +70,7 @@ export const meta = { }, cannotReRenote: { - message: "You can not Renote a pure Renote.", + message: "You cannot Renote a pure Renote.", code: "CANNOT_RENOTE_TO_A_PURE_RENOTE", id: "fd4cc33e-2a37-48dd-99cc-9b806eb2031a", }, @@ -82,7 +82,7 @@ export const meta = { }, cannotReplyToPureRenote: { - message: "You can not reply to a pure Renote.", + message: "You cannot reply to a pure Renote.", code: "CANNOT_REPLY_TO_A_PURE_RENOTE", id: "3ac74a84-8fd5-4bb0-870f-01804f82ce15", }, @@ -130,7 +130,7 @@ export const meta = { }, cannotPrivateRenote: { - message: "You can not perform a private renote.", + message: "You cannot perform a private renote.", code: "CANNOT_PRIVATE_RENOTE", id: "19a50f1c-84fa-4e33-81d3-17834ccc0ad8", }, @@ -140,6 +140,18 @@ export const meta = { code: "NOT_LOCAL_USER", id: "b907f407-2aa0-4283-800b-a2c56290b822", }, + + cannotChangeVisibility: { + message: "You cannot change the visibility of a note.", + code: "CANNOT_CHANGE_VISIBILITY", + id: "2917fd0b-da04-41de-949f-146835a006c6", + }, + + cannotQuoteOwnNote: { + message: "You cannot quote your own note.", + code: "CANNOT_QUOTE_OWN_NOTE", + id: "070eee98-5f8a-4eca-9dc0-830b4d4e52ac", + }, }, } as const; @@ -268,6 +280,10 @@ export default define(meta, paramDef, async (ps, user) => { throw e; }); + if (ps.renoteId === note.id) { + throw new ApiError(meta.errors.cannotQuoteOwnNote); + } + if (renote.renoteId && !renote.text && !renote.fileIds && !renote.hasPoll) { throw new ApiError(meta.errors.cannotReRenote); } @@ -523,7 +539,8 @@ export default define(meta, paramDef, async (ps, user) => { update.cw = null; } if (ps.visibility !== note.visibility) { - update.visibility = ps.visibility; + // update.visibility = ps.visibility; + throw new ApiError(meta.errors.cannotChangeVisibility); } if (ps.localOnly !== note.localOnly) { update.localOnly = ps.localOnly; diff --git a/packages/backend/src/server/api/endpoints/notes/search.ts b/packages/backend/src/server/api/endpoints/notes/search.ts index 21ee7f48..8c5798b6 100644 --- a/packages/backend/src/server/api/endpoints/notes/search.ts +++ b/packages/backend/src/server/api/endpoints/notes/search.ts @@ -85,6 +85,7 @@ export default define(meta, paramDef, async (ps, me) => { query .andWhere("note.text ILIKE :q", { q: `%${sqlLikeEscape(ps.query)}%` }) + .andWhere("note.visibility = 'public'") .innerJoinAndSelect("note.user", "user") .leftJoinAndSelect("user.avatar", "avatar") .leftJoinAndSelect("user.banner", "banner") diff --git a/packages/backend/src/server/api/endpoints/users/groups/leave.ts b/packages/backend/src/server/api/endpoints/users/groups/leave.ts index d963b182..fac0a47f 100644 --- a/packages/backend/src/server/api/endpoints/users/groups/leave.ts +++ b/packages/backend/src/server/api/endpoints/users/groups/leave.ts @@ -10,7 +10,7 @@ export const meta = { kind: "write:user-groups", description: - "Leave a group. The owner of a group can not leave. They must transfer ownership or delete the group instead.", + "Leave a group. The owner of a group cannot leave. They must transfer ownership or delete the group instead.", errors: { noSuchGroup: { diff --git a/packages/backend/src/server/api/endpoints/users/groups/pull.ts b/packages/backend/src/server/api/endpoints/users/groups/pull.ts index 1f79a2d2..ce294b8c 100644 --- a/packages/backend/src/server/api/endpoints/users/groups/pull.ts +++ b/packages/backend/src/server/api/endpoints/users/groups/pull.ts @@ -11,7 +11,7 @@ export const meta = { kind: "write:user-groups", description: - "Removes a specified user from a group. The owner can not be removed.", + "Removes a specified user from a group. The owner cannot be removed.", errors: { noSuchGroup: { diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts index 44d3f9b5..1368f9e2 100644 --- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts +++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts @@ -1,12 +1,14 @@ -import * as sanitizeHtml from "sanitize-html"; +import * as mfm from "mfm-js"; +import sanitizeHtml from "sanitize-html"; import { publishAdminStream } from "@/services/stream.js"; -import { AbuseUserReports, Users } from "@/models/index.js"; +import { AbuseUserReports, UserProfiles, Users } from "@/models/index.js"; import { genId } from "@/misc/gen-id.js"; import { sendEmail } from "@/services/send-email.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; import { getUser } from "../../common/getters.js"; import { ApiError } from "../../error.js"; import define from "../../define.js"; +import { toHtml } from "@/mfm/to-html.js"; export const meta = { tags: ["users"], @@ -84,6 +86,7 @@ export default define(meta, paramDef, async (ps, me) => { ], }); + const meta = await fetchMeta(); for (const moderator of moderators) { publishAdminStream(moderator.id, "newAbuseUserReport", { id: report.id, @@ -91,16 +94,16 @@ export default define(meta, paramDef, async (ps, me) => { reporterId: report.reporterId, comment: report.comment, }); - } - const meta = await fetchMeta(); - if (meta.email) { - sendEmail( - meta.email, - "New abuse report", - sanitizeHtml(ps.comment), - sanitizeHtml(ps.comment), - ); + const profile = await UserProfiles.findOneBy({ userId: moderator.id }); + if (profile?.email) { + sendEmail( + profile.email, + "New abuse report", + sanitizeHtml(toHtml(mfm.parse(ps.comment))!), + sanitizeHtml(toHtml(mfm.parse(ps.comment))!), + ); + } } }); }); diff --git a/packages/backend/src/server/api/mastodon/converters.ts b/packages/backend/src/server/api/mastodon/converters.ts index 90846437..6469d9c9 100644 --- a/packages/backend/src/server/api/mastodon/converters.ts +++ b/packages/backend/src/server/api/mastodon/converters.ts @@ -74,3 +74,13 @@ export function convertStatus(status: Entity.Status) { return status; } + +export function convertConversation(conversation: Entity.Conversation) { + conversation.id = convertId(conversation.id, IdType.MastodonId); + conversation.accounts = conversation.accounts.map(convertAccount); + if (conversation.last_status) { + conversation.last_status = convertStatus(conversation.last_status); + } + + return conversation; +} diff --git a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts index d5459432..0a4da322 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts @@ -1,7 +1,12 @@ import Router from "@koa/router"; import { getClient } from "../ApiMastodonCompatibleService.js"; import { ParsedUrlQuery } from "querystring"; -import { convertAccount, convertList, convertStatus } from "../converters.js"; +import { + convertAccount, + convertConversation, + convertList, + convertStatus, +} from "../converters.js"; import { convertId, IdType } from "../../index.js"; export function limitToInt(q: ParsedUrlQuery) { @@ -136,7 +141,9 @@ export function apiTimelineMastodon(router: Router): void { const data = await client.getConversationTimeline( convertTimelinesArgsId(limitToInt(ctx.query)), ); - ctx.body = data.data; + ctx.body = data.data.map((conversation) => + convertConversation(conversation), + ); } catch (e: any) { console.error(e); console.error(e.response.data); diff --git a/packages/backend/src/server/file/send-drive-file.ts b/packages/backend/src/server/file/send-drive-file.ts index 9c707709..1c4d4136 100644 --- a/packages/backend/src/server/file/send-drive-file.ts +++ b/packages/backend/src/server/file/send-drive-file.ts @@ -167,7 +167,6 @@ export default async function (ctx: Koa.Context) { return; } - ctx.length = file.size; ctx.set("Content-Disposition", contentDisposition("inline", filename)); ctx.set("Content-Type", contentType); @@ -192,7 +191,6 @@ export default async function (ctx: Koa.Context) { ctx.set("Accept-Ranges", "bytes"); } else { ctx.status = 206; - ctx.length = readable.size; readable.on("close", async () => { await fileHandle.close(); }); diff --git a/packages/backend/src/services/drive/upload-from-url.ts b/packages/backend/src/services/drive/upload-from-url.ts index 9d71757e..0638bcab 100644 --- a/packages/backend/src/services/drive/upload-from-url.ts +++ b/packages/backend/src/services/drive/upload-from-url.ts @@ -1,7 +1,7 @@ import { URL } from "node:url"; import type { User } from "@/models/entities/user.js"; import { createTemp } from "@/misc/create-temp.js"; -import { downloadUrl } from "@/misc/download-url.js"; +import { downloadUrl, isPrivateIp } from "@/misc/download-url.js"; import type { DriveFolder } from "@/models/entities/drive-folder.js"; import type { DriveFile } from "@/models/entities/drive-file.js"; import { DriveFiles } from "@/models/index.js"; @@ -35,7 +35,15 @@ export async function uploadFromUrl({ requestIp = null, requestHeaders = null, }: Args): Promise { - let name = new URL(url).pathname.split("/").pop() || null; + const parsedUrl = new URL(url); + if ( + process.env.NODE_ENV === "production" && + isPrivateIp(parsedUrl.hostname.replaceAll(/(\[)|(\])/g, "")) + ) { + throw new Error("Private IP is not allowed"); + } + + let name = parsedUrl.pathname.split("/").pop() || null; if (name == null || !DriveFiles.validateFileName(name)) { name = null; } diff --git a/packages/backend/src/services/i/pin.ts b/packages/backend/src/services/i/pin.ts index 64b9b159..37961459 100644 --- a/packages/backend/src/services/i/pin.ts +++ b/packages/backend/src/services/i/pin.ts @@ -38,7 +38,7 @@ export async function addPinned( if (pinings.length >= 15) { throw new IdentifiableError( "15a018eb-58e5-4da1-93be-330fcc5e4e1a", - "You can not pin notes any more.", + "You cannot pin notes any more.", ); } diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index adebc22a..689bd661 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -171,8 +171,7 @@ export default async ( ) => // rome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME new Promise(async (res, rej) => { - const dontFederateInitially = - data.localOnly || data.visibility?.startsWith("hidden"); + const dontFederateInitially = data.visibility === "hidden"; // If you reply outside the channel, match the scope of the target. // TODO (I think it's a process that could be done on the client side, but it's server side for now.) @@ -806,7 +805,7 @@ async function insertNote( } export async function index(note: Note, reindexing: boolean): Promise { - if (!note.text) return; + if (!note.text || note.visibility !== "public") return; if (config.elasticsearch && es) { es.index({ diff --git a/packages/client/package.json b/packages/client/package.json index 774197ce..28a12fd7 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -11,30 +11,30 @@ }, "devDependencies": { "@discordapp/twemoji": "14.1.2", - "@eslint-sets/eslint-config-vue3": "^5.7.0", + "@eslint-sets/eslint-config-vue3": "^5.8.0", "@eslint-sets/eslint-config-vue3-ts": "^3.3.0", "@phosphor-icons/web": "^2.0.3", - "@rollup/plugin-alias": "3.1.9", - "@rollup/plugin-json": "4.1.0", - "@rollup/pluginutils": "^4.2.1", + "@rollup/plugin-alias": "5.0.0", + "@rollup/plugin-json": "6.0.0", + "@rollup/pluginutils": "^5.0.3", "@syuilo/aiscript": "0.11.1", "@types/escape-regexp": "0.0.1", "@types/glob": "8.1.0", "@types/gulp": "4.0.13", "@types/gulp-rename": "2.0.2", - "@types/katex": "0.16.0", - "@types/matter-js": "0.18.2", + "@types/katex": "0.16.2", + "@types/matter-js": "0.19.0", "@types/punycode": "2.1.0", "@types/seedrandom": "3.0.5", "@types/throttle-debounce": "5.0.0", "@types/tinycolor2": "1.4.3", - "@types/uuid": "8.3.4", - "@vitejs/plugin-vue": "4.2.3", + "@types/uuid": "9.0.2", + "@vitejs/plugin-vue": "4.3.1", "@vue/compiler-sfc": "3.3.4", "autobind-decorator": "2.4.0", "autosize": "6.0.1", "blurhash": "2.0.5", - "broadcast-channel": "5.1.0", + "broadcast-channel": "5.2.0", "browser-image-resizer": "github:misskey-dev/browser-image-resizer", "chart.js": "4.3.3", "chartjs-adapter-date-fns": "3.0.0", @@ -49,7 +49,7 @@ "date-fns": "2.30.0", "emojilib": "github:thatonecalculator/emojilib", "escape-regexp": "0.0.1", - "eslint-config-prettier": "^8.9.0", + "eslint-config-prettier": "9.0.0", "eslint-plugin-file-progress": "^1.3.0", "eventemitter3": "5.0.1", "fast-blurhash": "^1.1.2", @@ -61,27 +61,25 @@ "insert-text-at-cursor": "0.3.0", "json5": "2.2.3", "katex": "0.16.8", - "matter-js": "0.18.0", + "matter-js": "0.19.0", "mfm-js": "0.23.3", "paralint": "^1.2.1", "photoswipe": "5.3.8", - "prettier": "3.0.1", + "prettier": "3.0.2", "prettier-plugin-vue": "1.1.6", "prismjs": "1.29.0", "punycode": "2.3.0", - "querystring": "0.2.1", "rndstr": "1.0.0", - "rollup": "3.27.2", + "rollup": "3.28.0", "s-age": "1.1.2", - "sass": "1.64.2", + "sass": "1.66.0", "seedrandom": "3.0.5", - "start-server-and-test": "1.15.2", "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", - "swiper": "10.1.0", + "swiper": "10.2.0", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", - "three": "0.146.0", + "three": "0.155.0", "throttle-debounce": "5.0.0", "tinycolor2": "1.6.0", "tinyld": "1.3.4", @@ -91,11 +89,11 @@ "typescript": "5.1.6", "unicode-emoji-json": "^0.4.0", "uuid": "9.0.0", - "vanilla-tilt": "1.8.0", + "vanilla-tilt": "1.8.1", "vite": "4.4.9", "vite-plugin-compression": "^0.5.1", "vue": "3.3.4", - "vue-draggable-plus": "^0.2.4", + "vue-draggable-plus": "^0.2.5", "vue-isyourpasswordsafe": "^2.0.0", "vue-plyr": "^7.0.0", "vue-prism-editor": "2.0.0-alpha.2" diff --git a/packages/client/src/components/MkAbuseReport.vue b/packages/client/src/components/MkAbuseReport.vue index b1029fac..55365239 100644 --- a/packages/client/src/components/MkAbuseReport.vue +++ b/packages/client/src/components/MkAbuseReport.vue @@ -65,6 +65,8 @@ diff --git a/packages/client/src/components/MkCheatSheetDialog.vue b/packages/client/src/components/MkCheatSheetDialog.vue index 753d1001..1176ffcd 100644 --- a/packages/client/src/components/MkCheatSheetDialog.vue +++ b/packages/client/src/components/MkCheatSheetDialog.vue @@ -11,6 +11,8 @@