From 8c7f3c53324a7808650c7d82f030f290e692c1e3 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 14 Aug 2023 09:38:08 +0200 Subject: [PATCH 01/13] Remove old non-unique index on preview_cards statuses join table (#26447) --- ...ew_cards_statuses_on_status_id_and_preview_card_id.rb | 9 +++++++++ db/schema.rb | 3 +-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 db/post_migrate/20230811103651_remove_index_preview_cards_statuses_on_status_id_and_preview_card_id.rb diff --git a/db/post_migrate/20230811103651_remove_index_preview_cards_statuses_on_status_id_and_preview_card_id.rb b/db/post_migrate/20230811103651_remove_index_preview_cards_statuses_on_status_id_and_preview_card_id.rb new file mode 100644 index 0000000000..11e0bf6f1b --- /dev/null +++ b/db/post_migrate/20230811103651_remove_index_preview_cards_statuses_on_status_id_and_preview_card_id.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RemoveIndexPreviewCardsStatusesOnStatusIdAndPreviewCardId < ActiveRecord::Migration[7.0] + disable_ddl_transaction! + + def change + remove_index :preview_cards_statuses, column: [:status_id, :preview_card_id], name: :index_preview_cards_statuses_on_status_id_and_preview_card_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 79bebb5ed5..fc997f6340 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_08_03_112520) do +ActiveRecord::Schema[7.0].define(version: 2023_08_11_103651) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -809,7 +809,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_08_03_112520) do create_table "preview_cards_statuses", primary_key: ["status_id", "preview_card_id"], force: :cascade do |t| t.bigint "preview_card_id", null: false t.bigint "status_id", null: false - t.index ["status_id", "preview_card_id"], name: "index_preview_cards_statuses_on_status_id_and_preview_card_id" end create_table "relays", force: :cascade do |t| From 1eac3a60debea645d2f6205628221a0f2db503e3 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 14 Aug 2023 09:40:07 +0200 Subject: [PATCH 02/13] Upgrade `@types/react` (#26457) --- yarn.lock | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7b799cda19..76031d9597 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2427,16 +2427,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.9.11", "@types/react@^18.0.26": - version "18.2.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.12.tgz#95d584338610b78bb9ba0415e3180fb03debdf97" - integrity sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^18.2.7": +"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.9.11", "@types/react@^18.0.26", "@types/react@^18.2.7": version "18.2.20" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.20.tgz#1605557a83df5c8a2cc4eeb743b3dfc0eb6aaeb2" integrity sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw== @@ -11167,6 +11158,7 @@ string-length@^4.0.1: strip-ansi "^6.0.0" "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11265,6 +11257,7 @@ stringz@^2.1.0: char-regex "^1.0.2" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -12751,6 +12744,7 @@ workbox-window@7.0.0, workbox-window@^7.0.0: workbox-core "7.0.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From a664e1570242c98abcfd7d74e78473bdb8b85587 Mon Sep 17 00:00:00 2001 From: mogaminsk Date: Mon, 14 Aug 2023 19:04:04 +0900 Subject: [PATCH 03/13] Fix "Create Account" button in interaction modal (#26459) --- .../mastodon/features/interaction_modal/index.jsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/features/interaction_modal/index.jsx b/app/javascript/mastodon/features/interaction_modal/index.jsx index 220719a94a..84e4309254 100644 --- a/app/javascript/mastodon/features/interaction_modal/index.jsx +++ b/app/javascript/mastodon/features/interaction_modal/index.jsx @@ -21,12 +21,16 @@ const messages = defineMessages({ const mapStateToProps = (state, { accountId }) => ({ displayNameHtml: state.getIn(['accounts', accountId, 'display_name_html']), + signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up', }); const mapDispatchToProps = (dispatch) => ({ onSignupClick() { - dispatch(closeModal()); - dispatch(openModal('CLOSED_REGISTRATIONS')); + dispatch(closeModal({ + modalType: undefined, + ignoreFocus: false, + })); + dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' })); }, }); @@ -294,6 +298,7 @@ class InteractionModal extends React.PureComponent { url: PropTypes.string, type: PropTypes.oneOf(['reply', 'reblog', 'favourite', 'follow']), onSignupClick: PropTypes.func.isRequired, + signupUrl: PropTypes.string.isRequired, }; handleSignupClick = () => { @@ -301,7 +306,7 @@ class InteractionModal extends React.PureComponent { }; render () { - const { url, type, displayNameHtml } = this.props; + const { url, type, displayNameHtml, signupUrl } = this.props; const name = ; @@ -340,7 +345,7 @@ class InteractionModal extends React.PureComponent { ); } else if (registrationsOpen) { signupButton = ( - + ); From c48506d8d43309835c6b4e932954ebed6fceaa82 Mon Sep 17 00:00:00 2001 From: HonkingGoose <34918129+HonkingGoose@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:08:43 +0200 Subject: [PATCH 04/13] Improve Renovate configuration (#26306) --- .github/renovate.json5 | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 78530d65b4..3131083ca1 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,20 +1,21 @@ { $schema: 'https://docs.renovatebot.com/renovate-schema.json', extends: [ - 'config:base', - ':dependencyDashboard', + 'config:recommended', ':labels(dependencies)', ':maintainLockFilesMonthly', // update non-direct dependencies monthly - ':prConcurrentLimit10', // only 10 open PRs at the same time + ':prConcurrentLimitNone', // Remove limit for open PRs at any time. + ':prHourlyLimit2' // Rate limit PR creation to a maximum of two per hour. ], - stabilityDays: 3, // Wait 3 days after the package has been published before upgrading it + minimumReleaseAge: "3", // Wait 3 days after the package has been published before upgrading it // packageRules order is important, they are applied from top to bottom and are merged, // meaning the most important ones must be at the bottom, for example grouping rules // If we do not want a package to be grouped with others, we need to set its groupName // to `null` after any other rule set it to something. + dependencyDashboardHeader: 'This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. Before approving any upgrade: read the description and comments in the [`renovate.json5` file](https://github.com/mastodon/mastodon/blob/main/.github/renovate.json5).', packageRules: [ { - // Ignore major version bumps for these node packages + // Require Dependency Dashboard Approval for major version bumps of these node packages matchManagers: ['npm'], matchPackageNames: [ 'tesseract.js', // Requires code changes @@ -41,10 +42,10 @@ 'react-router-dom', ], matchUpdateTypes: ['major'], - enabled: false, + "dependencyDashboardApproval": true }, { - // Ignore major version bumps for these Ruby packages + // Require Dependency Dashboard Approval for major version bumps of these Ruby packages matchManagers: ['bundler'], matchPackageNames: [ 'rack', // Needs to be synced with Rails version @@ -55,7 +56,7 @@ 'redis', // Requires manual upgrade and sync with Sidekiq version ], matchUpdateTypes: ['major'], - enabled: false, + "dependencyDashboardApproval": true }, { // Update Github Actions and Docker images weekly @@ -63,25 +64,25 @@ extends: ['schedule:weekly'], }, { - // Ignore major & minor bumps for the ruby image, this needs to be synced with .ruby-version + // Require Dependency Dashboard Approval for major & minor bumps for the ruby image, this needs to be synced with .ruby-version matchManagers: ['dockerfile'], matchPackageNames: ['moritzheiber/ruby-jemalloc'], matchUpdateTypes: ['minor', 'major'], - enabled: false, + "dependencyDashboardApproval": true }, { - // Ignore major bump for the node image, this needs to be synced with .nvmrc + // Require Dependency Dashboard Approval for major bumps for the node image, this needs to be synced with .nvmrc matchManagers: ['dockerfile'], matchPackageNames: ['node'], matchUpdateTypes: ['major'], - enabled: false, + "dependencyDashboardApproval": true }, { - // Ignore major postgres bumps in the docker-compose file, as those break dev environments + // Require Dependency Dashboard Approval for major postgres bumps in the docker-compose file, as those break dev environments matchManagers: ['docker-compose'], matchPackageNames: ['postgres'], matchUpdateTypes: ['major'], - enabled: false, + "dependencyDashboardApproval": true }, { // Update devDependencies every week, with one grouped PR From 273730c4e893162d61ca0c02d64dfc82754cbb95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 13:38:41 +0200 Subject: [PATCH 05/13] Update dependency faker to v3.2.1 (#26474) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9eef038557..b5b57bfaf0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -269,7 +269,7 @@ GEM tzinfo excon (0.100.0) fabrication (2.30.0) - faker (3.2.0) + faker (3.2.1) i18n (>= 1.8.11, < 2) faraday (1.10.3) faraday-em_http (~> 1.0) From c65032fb11cd33a70eaa01d315f7419ae617630c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 13:39:28 +0200 Subject: [PATCH 06/13] Update dependency autoprefixer to v10.4.15 (#26473) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index 76031d9597..09deddc764 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3286,12 +3286,12 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^10.4.14: - version "10.4.14" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + version "10.4.15" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -3705,7 +3705,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.21.4, browserslist@^4.21.5: +browserslist@^4.0.0, browserslist@^4.21.4: version "4.21.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.8.tgz#db2498e1f4b80ed199c076248a094935860b6017" integrity sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw== @@ -3715,7 +3715,7 @@ browserslist@^4.0.0, browserslist@^4.21.4, browserslist@^4.21.5: node-releases "^2.0.12" update-browserslist-db "^1.0.11" -browserslist@^4.21.9: +browserslist@^4.21.10, browserslist@^4.21.9: version "4.21.10" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== @@ -3885,7 +3885,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464: +caniuse-lite@^1.0.0: version "1.0.30001503" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001503.tgz#88b6ff1b2cf735f1f3361dc1a15b59f0561aa398" integrity sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw== @@ -3895,10 +3895,10 @@ caniuse-lite@^1.0.30001502: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== -caniuse-lite@^1.0.30001517: - version "1.0.30001519" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" - integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== +caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: + version "1.0.30001520" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz#62e2b7a1c7b35269594cf296a80bdf8cb9565006" + integrity sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA== chalk@5.2.0: version "5.2.0" From 07f43daadc1aab04bb255cea7be07715ae2660b8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:10:46 +0200 Subject: [PATCH 07/13] Update dependency nokogiri to v1.15.4 (#26476) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b5b57bfaf0..c8a945da2d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -478,7 +478,7 @@ GEM net-protocol net-ssh (7.1.0) nio4r (2.5.9) - nokogiri (1.15.3) + nokogiri (1.15.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) oj (3.15.0) From 9262cfc57f334314cabc461ba437cf2aa0b0c78f Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 14 Aug 2023 14:53:13 +0200 Subject: [PATCH 08/13] Fix `lint:json` not processing `json5` extension (#26481) --- .github/renovate.json5 | 14 +++++++------- package.json | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 3131083ca1..879a564e1c 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -5,9 +5,9 @@ ':labels(dependencies)', ':maintainLockFilesMonthly', // update non-direct dependencies monthly ':prConcurrentLimitNone', // Remove limit for open PRs at any time. - ':prHourlyLimit2' // Rate limit PR creation to a maximum of two per hour. + ':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour. ], - minimumReleaseAge: "3", // Wait 3 days after the package has been published before upgrading it + minimumReleaseAge: '3', // Wait 3 days after the package has been published before upgrading it // packageRules order is important, they are applied from top to bottom and are merged, // meaning the most important ones must be at the bottom, for example grouping rules // If we do not want a package to be grouped with others, we need to set its groupName @@ -42,7 +42,7 @@ 'react-router-dom', ], matchUpdateTypes: ['major'], - "dependencyDashboardApproval": true + dependencyDashboardApproval: true, }, { // Require Dependency Dashboard Approval for major version bumps of these Ruby packages @@ -56,7 +56,7 @@ 'redis', // Requires manual upgrade and sync with Sidekiq version ], matchUpdateTypes: ['major'], - "dependencyDashboardApproval": true + dependencyDashboardApproval: true, }, { // Update Github Actions and Docker images weekly @@ -68,21 +68,21 @@ matchManagers: ['dockerfile'], matchPackageNames: ['moritzheiber/ruby-jemalloc'], matchUpdateTypes: ['minor', 'major'], - "dependencyDashboardApproval": true + dependencyDashboardApproval: true, }, { // Require Dependency Dashboard Approval for major bumps for the node image, this needs to be synced with .nvmrc matchManagers: ['dockerfile'], matchPackageNames: ['node'], matchUpdateTypes: ['major'], - "dependencyDashboardApproval": true + dependencyDashboardApproval: true, }, { // Require Dependency Dashboard Approval for major postgres bumps in the docker-compose file, as those break dev environments matchManagers: ['docker-compose'], matchPackageNames: ['postgres'], matchUpdateTypes: ['major'], - "dependencyDashboardApproval": true + dependencyDashboardApproval: true, }, { // Update devDependencies every week, with one grouped PR diff --git a/package.json b/package.json index 5c109c2588..0dbd84ee85 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack", "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", "fix:js": "yarn lint:js --fix", - "fix:json": "prettier --write \"**/*.json\"", + "fix:json": "prettier --write \"**/*.{json,json5}\"", "fix:md": "prettier --write \"**/*.md\"", "fix:sass": "stylelint --fix \"**/*.{css,scss}\" && prettier --write \"**/*.{css,scss}\"", "fix:yml": "prettier --write \"**/*.{yaml,yml}\"", @@ -16,7 +16,7 @@ "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' '--ignore=**/*.d.ts' --out-file app/javascript/mastodon/locales/en.json --format config/formatjs-formatter.js", "jest": "cross-env NODE_ENV=test jest", "lint:js": "eslint . --ext=.js,.jsx,.ts,.tsx --cache --report-unused-disable-directives", - "lint:json": "prettier --check \"**/*.json\"", + "lint:json": "prettier --check \"**/*.{json,json5}\"", "lint:md": "prettier --check \"**/*.md\"", "lint:sass": "stylelint \"**/*.{css,scss}\" && prettier --check \"**/*.{css,scss}\"", "lint:yml": "prettier --check \"**/*.{yaml,yml}\"", From c452ccd9139f8fb2545bcca281d6fc33b594c50e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:54:31 +0200 Subject: [PATCH 09/13] New Crowdin Translations (automated) (#26444) Co-authored-by: GitHub Actions Co-authored-by: Claire --- app/javascript/mastodon/locales/ar.json | 2 + app/javascript/mastodon/locales/ast.json | 1 + app/javascript/mastodon/locales/fr.json | 6 +- app/javascript/mastodon/locales/gd.json | 40 +++---- app/javascript/mastodon/locales/hu.json | 2 +- app/javascript/mastodon/locales/kab.json | 13 +++ app/javascript/mastodon/locales/ko.json | 2 +- app/javascript/mastodon/locales/lv.json | 7 ++ app/javascript/mastodon/locales/ms.json | 38 +++++++ app/javascript/mastodon/locales/nn.json | 6 +- app/javascript/mastodon/locales/no.json | 2 +- app/javascript/mastodon/locales/sk.json | 2 + app/javascript/mastodon/locales/tr.json | 14 +-- app/javascript/mastodon/locales/vi.json | 76 ++++++------- config/locales/ar.yml | 6 ++ config/locales/de.yml | 2 +- config/locales/devise.vi.yml | 2 +- config/locales/doorkeeper.vi.yml | 2 +- config/locales/gd.yml | 18 ++-- config/locales/kab.yml | 17 +-- config/locales/ko.yml | 4 +- config/locales/ms.yml | 129 +++++++++++++++++++++++ config/locales/nn.yml | 14 +-- config/locales/simple_form.gd.yml | 8 +- config/locales/simple_form.ms.yml | 39 +++++++ config/locales/simple_form.vi.yml | 48 ++++----- config/locales/vi.yml | 60 +++++------ config/locales/zh-CN.yml | 20 ++-- 28 files changed, 410 insertions(+), 170 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 035ba3f68f..f5843d7d83 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -201,6 +201,7 @@ "dismissable_banner.community_timeline": "هذه هي أحدث المشاركات العامة من الأشخاص الذين تُستضاف حساباتهم على {domain}.", "dismissable_banner.dismiss": "رفض", "dismissable_banner.explore_links": "هذه القصص الإخبارية يتحدث عنها حاليًا أشخاص على هذا الخادم وكذا على الخوادم الأخرى للشبكة اللامركزية.", + "dismissable_banner.explore_statuses": "هذه هي المنشورات الرائجة على الشبكات الاجتماعيّة اليوم. تظهر المنشورات التي أعيد مشاركتها وحازت على مفضّلات أكثر في مرتبة عليا.", "dismissable_banner.explore_tags": "هذه الوسوم تكتسب جذب اهتمام الناس حاليًا على هذا الخادم وكذا على الخوادم الأخرى للشبكة اللامركزية.", "dismissable_banner.public_timeline": "هذه هي أحدث المنشورات العامة من الناس على الشبكة الاجتماعية التي يتبعها الناس على {domain}.", "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", @@ -315,6 +316,7 @@ "interaction_modal.on_another_server": "على خادم مختلف", "interaction_modal.on_this_server": "على هذا الخادم", "interaction_modal.sign_in": "لم تقم بتسجيل الدخول إلى هذا الخادم. أين هو مستضاف حسابك؟", + "interaction_modal.sign_in_hint": "تلميح: هذا هو الموقع الذي سجّلت عن طريقه. إن لم تتذكّر/ين اسم الموقع، يمكنك البحث عن الرسالة الترحيبيّة في بريدك الالكتروني. يمكنك أيضاً استخدام إسم المستخدم/ـة الكامل! (مثلاً: @Mastadon@mastadon.social)", "interaction_modal.title.favourite": "إضافة منشور {name} إلى المفضلة", "interaction_modal.title.follow": "اتبع {name}", "interaction_modal.title.reblog": "مشاركة منشور {name}", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 597d294a6f..af52135ac0 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -212,6 +212,7 @@ "hashtag.column_header.tag_mode.none": "ensin {additional}", "hashtag.column_settings.select.no_options_message": "Nun s'atopó nenguna suxerencia", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}", "hashtag.follow": "Siguir a la etiqueta", "hashtag.unfollow": "Dexar de siguir a la etiqueta", "home.column_settings.basic": "Configuración básica", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 157d984191..2bef3bb4b3 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -38,7 +38,7 @@ "account.following_counter": "{count, plural, one {{counter} Abonnement} other {{counter} Abonnements}}", "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.", "account.follows_you": "Vous suit", - "account.go_to_profile": "Voir le profil", + "account.go_to_profile": "Aller au profil", "account.hide_reblogs": "Masquer les partages de @{name}", "account.in_memoriam": "En mémoire de.", "account.joined_short": "Ici depuis", @@ -50,9 +50,9 @@ "account.moved_to": "{name} a indiqué que son nouveau compte est maintenant :", "account.mute": "Masquer @{name}", "account.mute_notifications_short": "Désactiver les alertes", - "account.mute_short": "Mettre en sourdine", + "account.mute_short": "Masquer", "account.muted": "Masqué·e", - "account.no_bio": "Aucune description enregistrée.", + "account.no_bio": "Aucune description fournie.", "account.open_original_page": "Ouvrir la page d'origine", "account.posts": "Messages", "account.posts_with_replies": "Messages et réponses", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 3f088b2ea7..ba859498f6 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -13,14 +13,14 @@ "about.rules": "Riaghailtean an fhrithealaiche", "account.account_note_header": "Nòta", "account.add_or_remove_from_list": "Cuir ris no thoir air falbh o na liostaichean", - "account.badges.bot": "Bot", + "account.badges.bot": "Fèin-obrachail", "account.badges.group": "Buidheann", "account.block": "Bac @{name}", "account.block_domain": "Bac an àrainn {domain}", "account.block_short": "Bac", "account.blocked": "’Ga bhacadh", "account.browse_more_on_origin_server": "Rùraich barrachd dheth air a’ phròifil thùsail", - "account.cancel_follow_request": "Cuir d’ iarrtas leantainn dhan dàrna taobh", + "account.cancel_follow_request": "Sguir dhen leantainn", "account.direct": "Thoir iomradh air @{name} gu prìobhaideach", "account.disable_notifications": "Na cuir brath thugam tuilleadh nuair a chuireas @{name} post ris", "account.domain_blocked": "Chaidh an àrainn a bhacadh", @@ -114,7 +114,7 @@ "column.directory": "Rùraich sna pròifilean", "column.domain_blocks": "Àrainnean bacte", "column.favourites": "Annsachdan", - "column.firehose": "Inbhirean beòtha", + "column.firehose": "An saoghal poblach", "column.follow_requests": "Iarrtasan leantainn", "column.home": "Dachaigh", "column.lists": "Liostaichean", @@ -150,7 +150,7 @@ "compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh", "compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh", "compose_form.publish": "Foillsich", - "compose_form.publish_form": "Foillsich", + "compose_form.publish_form": "Post ùr", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "Sàbhail na h-atharraichean", "compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}", @@ -200,9 +200,9 @@ "disabled_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas aig an àm seo.", "dismissable_banner.community_timeline": "Seo na postaichean poblach as ùire o dhaoine aig a bheil cunntas air {domain}.", "dismissable_banner.dismiss": "Leig seachad", - "dismissable_banner.explore_links": "Seo na naidheachdan air a bhithear a’ bruidhinn an-dràsta fhèin air an fhrithealaiche seo is frithealaichean eile dhen lìonra sgaoilte.", - "dismissable_banner.explore_statuses": "Tha fèill air na postaichean seo a’ fàs an-diugh thar an lìona shòisealta. Gheibh postaichean nas ùire le barrachd brosnaichean is annsachdan rangachadh nas àirde.", - "dismissable_banner.explore_tags": "Tha fèill air na tagaichean hais seo a’ fàs an-diugh air an fhrithealaich seo is frithealaichean eile dhen lìonra sgaoilte. Gheibh tagaichean hais a tha gan cleachdadh le daoine eadar-dhealaichte rangachadh nas àirde.", + "dismissable_banner.explore_links": "Seo na cinn-naidheachd a tha ’gan co-roinneadh as trice thar an lìona shòisealta an-diugh. Gheibh naidheachdan nas ùire a tha ’gan co-roinneadh le daoine eadar-dhealaichte rangachadh nas àirde.", + "dismissable_banner.explore_statuses": "Tha fèill air na postaichean seo a’ fàs thar an lìona shòisealta an-diugh. Gheibh postaichean nas ùire le barrachd brosnaichean is annsachdan rangachadh nas àirde.", + "dismissable_banner.explore_tags": "Tha fèill air na tagaichean hais seo a’ fàs air an fhrithealaiche seo is frithealaichean eile dhen lìonra sgaoilte an-diugh. Gheibh tagaichean hais a tha ’gan cleachdadh le daoine eadar-dhealaichte rangachadh nas àirde.", "dismissable_banner.public_timeline": "Seo na postaichean poblach as ùire o dhaoine air an lìonra sòisealta tha ’gan leantainn le daoine air {domain}.", "embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.", "embed.preview": "Seo an coltas a bhios air:", @@ -235,7 +235,7 @@ "empty_column.follow_requests": "Chan eil iarrtas leantainn agad fhathast. Nuair a gheibh thu fear, nochdaidh e an-seo.", "empty_column.followed_tags": "Cha do lean thu taga hais sam bith fhathast. Nuair a leanas tu, nochdaidh iad an-seo.", "empty_column.hashtag": "Chan eil dad san taga hais seo fhathast.", - "empty_column.home": "Tha loidhne-ama na dachaigh agad falamh! Lean barrachd dhaoine gus a lìonadh. {suggestions}", + "empty_column.home": "Tha loidhne-ama na dachaigh agad falamh! Lean barrachd dhaoine gus a lìonadh.", "empty_column.list": "Chan eil dad air an liosta seo fhathast. Nuair a phostaicheas buill a tha air an liosta seo postaichean ùra, nochdaidh iad an-seo.", "empty_column.lists": "Chan eil liosta agad fhathast. Nuair chruthaicheas tu tè, nochdaidh i an-seo.", "empty_column.mutes": "Cha do mhùch thu cleachdaiche sam bith fhathast.", @@ -301,7 +301,7 @@ "hashtag.follow": "Lean an taga hais", "hashtag.unfollow": "Na lean an taga hais tuilleadh", "home.actions.go_to_explore": "Faic na tha a’ treandadh", - "home.actions.go_to_suggestions": "Lorg daoine a leanas tu", + "home.actions.go_to_suggestions": "Lorg daoine gus an leantainn", "home.column_settings.basic": "Bunasach", "home.column_settings.show_reblogs": "Seall na brosnachaidhean", "home.column_settings.show_replies": "Seall na freagairtean", @@ -333,7 +333,7 @@ "keyboard_shortcuts.column": "Cuir am fòcas air colbh", "keyboard_shortcuts.compose": "Cuir am fòcas air raon teacsa an sgrìobhaidh", "keyboard_shortcuts.description": "Tuairisgeul", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "a dh’fhosgladh colbh nan iomraidhean prìobhaideach", "keyboard_shortcuts.down": "Gluais sìos air an liosta", "keyboard_shortcuts.enter": "Fosgail post", "keyboard_shortcuts.favourite": "Cuir am post ris na h-annsachdan", @@ -380,7 +380,7 @@ "lists.replies_policy.followed": "Cleachdaiche sam bith a leanas mi", "lists.replies_policy.list": "Buill na liosta", "lists.replies_policy.none": "Na seall idir", - "lists.replies_policy.title": "Seall na freagairtean gu:", + "lists.replies_policy.title": "Seall freagairtean do:", "lists.search": "Lorg am measg nan daoine a leanas tu", "lists.subheading": "Na liostaichean agad", "load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}", @@ -418,7 +418,7 @@ "not_signed_in_indicator.not_signed_in": "Feumaidh tu clàradh a-steach mus fhaigh thu cothrom air a’ ghoireas seo.", "notification.admin.report": "Rinn {name} gearan mu {target}", "notification.admin.sign_up": "Chlàraich {name}", - "notification.favourite": "Chuir {name} am post agad ris na h-annsachdan", + "notification.favourite": "Is annsa le {name} am post agad", "notification.follow": "Tha {name} ’gad leantainn a-nis", "notification.follow_request": "Dh’iarr {name} ’gad leantainn", "notification.mention": "Thug {name} iomradh ort", @@ -466,12 +466,12 @@ "notifications_permission_banner.title": "Na caill dad gu bràth tuilleadh", "onboarding.action.back": "Air ais leam", "onboarding.actions.back": "Air ais leam", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", + "onboarding.actions.go_to_explore": "Thoir dha na treandaichean mi", + "onboarding.actions.go_to_home": "Thoir dhachaigh mi", "onboarding.compose.template": "Shin thu, a #Mhastodon!", "onboarding.follows.empty": "Gu mì-fhortanach, chan urrainn dhuinn toradh a shealltainn an-dràsta. Feuch gleus an luirg no duilleag an rùrachaidh airson daoine ri leantainn a lorg no feuch ris a-rithist an ceann tamaill.", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", + "onboarding.follows.title": "Cuir dreach pearsanta air do dhachaigh", "onboarding.share.lead": "Innis do dhaoine mar a gheibh iad grèim ort air Mastodon!", "onboarding.share.message": "Is mise {username} air #Mastodon! Thig ’gam leantainn air {url}", "onboarding.share.next_steps": "Ceuman eile as urrainn dhut gabhail:", @@ -480,13 +480,13 @@ "onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.title": "Rinn thu a’ chùis air!", "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", - "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", + "onboarding.steps.follow_people.title": "Cuir dreach pearsanta air do dhachaigh", "onboarding.steps.publish_status.body": "Say hello to the world.", "onboarding.steps.publish_status.title": "Dèan a’ chiad phost agad", "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.steps.setup_profile.title": "Gnàthaich a’ phròifil agad", + "onboarding.steps.share_profile.body": "Leig fios dha do charaidean mar a gheibh iad lorg ort air Mastodon", + "onboarding.steps.share_profile.title": "Co-roinn a’ phròifil Mastodon agad", "onboarding.tips.2fa": "An robh fios agad? ’S urrainn dhut an cunntas agad a dhìon is tu a’ suidheachadh dearbhadh dà-cheumnach ann an roghainnean a’ chunntais agad. Obraichidh e le aplacaid dearbhaidh dhà-cheumnaich sam bith a thogras tu gun fheum air àireamh fòn!", "onboarding.tips.accounts_from_other_servers": "An robh fios agad? On a tha Mastodon sgaoilte, tachraidh tu air pròifilean a tha ’gan òstadh air frithealaichean eile. ’S urrainn dhut bruidhinn riutha gun chnap-starra co-dhiù! ’S e ainm an fhrithealaiche a tha san dàrna leth dhen ainm-chleachdaiche aca!", "onboarding.tips.migration": "An robh fios agad? Ma thig an latha nach eil thu toilichte le {domain} mar an fhrithealaiche agad tuilleadh, ’s urrainn dhut imrich gu frithealaiche Mastodon eile gun a bhith a’ call an luchd-leantainn agad. ’S urrainn dhut fiù frithealaiche agad fhèin òstadh!", @@ -655,7 +655,7 @@ "status.show_more": "Seall barrachd dheth", "status.show_more_all": "Seall barrachd dhen a h-uile", "status.show_original": "Seall an tionndadh tùsail", - "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", + "status.title.with_attachments": "Phostaich {user} {attachmentCount, plural, one {{attachmentCount} cheanglachan} two {{attachmentCount} cheanglachan} few {{attachmentCount} ceanglachain} other {{attachmentCount} ceanglachan}}", "status.translate": "Eadar-theangaich", "status.translated_from_with": "Air eadar-theangachadh o {lang} le {provider}", "status.uncached_media_warning": "Chan eil ro-shealladh ri fhaighinn", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 4b32af595b..5645f4806c 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -114,7 +114,7 @@ "column.directory": "Profilok böngészése", "column.domain_blocks": "Letiltott tartománynevek", "column.favourites": "Kedvencek", - "column.firehose": "Élő hírfolyamok", + "column.firehose": "Hírfolyamok", "column.follow_requests": "Követési kérelmek", "column.home": "Kezdőlap", "column.lists": "Listák", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 487fede3fe..0f200cf6fb 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -7,6 +7,7 @@ "account.badges.group": "Agraw", "account.block": "Seḥbes @{name}", "account.block_domain": "Ffer kra i d-yekkan seg {domain}", + "account.block_short": "Sewḥel", "account.blocked": "Yettusewḥel", "account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli", "account.cancel_follow_request": "Withdraw follow request", @@ -28,6 +29,7 @@ "account.media": "Timidyatin", "account.mention": "Bder-d @{name}", "account.mute": "Sgugem @{name}", + "account.mute_short": "Sgugem", "account.muted": "Yettwasgugem", "account.open_original_page": "Ldi asebter anasli", "account.posts": "Tisuffaɣ", @@ -70,6 +72,7 @@ "column.community": "Tasuddemt tadigant", "column.directory": "Inig deg imaɣnuten", "column.domain_blocks": "Taɣulin yeffren", + "column.favourites": "Imenyafen", "column.follow_requests": "Isuturen n teḍfeṛt", "column.home": "Agejdan", "column.lists": "Tibdarin", @@ -90,6 +93,7 @@ "community.column_settings.remote_only": "Anmeggag kan", "compose.language.change": "Beddel tutlayt", "compose.language.search": "Nadi tutlayin …", + "compose.published.open": "Ldi", "compose_form.direct_message_warning_learn_more": "Issin ugar", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", @@ -177,6 +181,7 @@ "errors.unexpected_crash.copy_stacktrace": "Nɣel stacktrace ɣef wafus", "errors.unexpected_crash.report_issue": "Mmel ugur", "explore.search_results": "Igemmaḍ n unadi", + "explore.suggested_follows": "Imdanen", "explore.title": "Snirem", "explore.trending_links": "Isallen", "explore.trending_statuses": "Tisuffiɣin", @@ -184,6 +189,8 @@ "filter_modal.added.settings_link": "asebter n yiɣewwaṛen", "filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}", "filter_modal.select_filter.search": "Nadi neɣ snulfu-d", + "firehose.all": "Akk", + "firehose.local": "Deg uqeddac-ayi", "follow_request.authorize": "Ssireg", "follow_request.reject": "Agi", "footer.about": "Γef", @@ -252,6 +259,7 @@ "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna", "lightbox.next": "Γer zdat", "lightbox.previous": "Γer deffir", + "link_preview.author": "S-ɣur {name}", "lists.account.add": "Rnu ɣer tebdart", "lists.account.remove": "Kkes seg tebdart", "lists.delete": "Kkes tabdart", @@ -280,6 +288,7 @@ "navigation_bar.domain_blocks": "Tiɣula yeffren", "navigation_bar.edit_profile": "Ẓreg amaɣnu", "navigation_bar.explore": "Snirem", + "navigation_bar.favourites": "Imenyafen", "navigation_bar.filters": "Awalen i yettwasgugmen", "navigation_bar.follow_requests": "Isuturen n teḍfeṛt", "navigation_bar.follows_and_followers": "Imeḍfaṛen akked wid i teṭṭafaṛeḍ", @@ -303,6 +312,7 @@ "notifications.clear": "Sfeḍ tilɣa", "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?", "notifications.column_settings.alert": "Tilɣa n tnarit", + "notifications.column_settings.favourite": "Imenyafen:", "notifications.column_settings.filter_bar.advanced": "Ssken-d meṛṛa tiggayin", "notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib", "notifications.column_settings.follow": "Imeḍfaṛen imaynuten:", @@ -316,6 +326,7 @@ "notifications.column_settings.status": "Tiẓenẓunin timaynutin:", "notifications.filter.all": "Akk", "notifications.filter.boosts": "Seǧhed", + "notifications.filter.favourites": "Imenyafen", "notifications.filter.follows": "Yeṭafaṛ", "notifications.filter.mentions": "Abdar", "notifications.filter.polls": "Igemmaḍ n usenqed", @@ -328,6 +339,7 @@ "notifications_permission_banner.title": "Ur zeggel acemma", "onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_home": "Go to your home feed", + "onboarding.compose.template": "Azul a #Mastodon!", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Popular on Mastodon", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", @@ -396,6 +408,7 @@ "server_banner.learn_more": "Issin ugar", "sign_in_banner.create_account": "Snulfu-d amiḍan", "sign_in_banner.sign_in": "Qqen", + "sign_in_banner.sso_redirect": "Qqen neɣ jerred", "status.admin_status": "Open this status in the moderation interface", "status.block": "Seḥbes @{name}", "status.bookmark": "Creḍ", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index b0b2e68a16..72195770b4 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -623,7 +623,7 @@ "status.filter": "이 게시물을 필터", "status.filtered": "필터로 걸러짐", "status.hide": "게시물 숨기기", - "status.history.created": "{name} 님이 {date}에 생성함", + "status.history.created": "{name} 님이 {date}에 처음 게시함", "status.history.edited": "{name} 님이 {date}에 수정함", "status.load_more": "더 보기", "status.media.open": "클릭하여 열기", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index cff2aa4adf..f45b0427e0 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -17,6 +17,7 @@ "account.badges.group": "Grupa", "account.block": "Bloķēt @{name}", "account.block_domain": "Bloķēt domēnu {domain}", + "account.block_short": "Bloķēt", "account.blocked": "Bloķēts", "account.browse_more_on_origin_server": "Pārlūkot vairāk sākotnējā profilā", "account.cancel_follow_request": "Atsaukt sekošanas pieprasījumu", @@ -48,7 +49,9 @@ "account.mention": "Pieminēt @{name}", "account.moved_to": "{name} norādīja, ka viņu jaunais konts tagad ir:", "account.mute": "Apklusināt @{name}", + "account.mute_short": "Apklusināt", "account.muted": "Apklusināts", + "account.no_bio": "Apraksts nav sniegts.", "account.open_original_page": "Atvērt oriģinālo lapu", "account.posts": "Ieraksti", "account.posts_with_replies": "Ieraksti un atbildes", @@ -104,6 +107,7 @@ "column.direct": "Privāti pieminēti", "column.directory": "Pārlūkot profilus", "column.domain_blocks": "Bloķētie domēni", + "column.favourites": "Iecienīti", "column.follow_requests": "Sekošanas pieprasījumi", "column.home": "Sākums", "column.lists": "Saraksti", @@ -124,6 +128,7 @@ "community.column_settings.remote_only": "Tikai attālinātie", "compose.language.change": "Mainīt valodu", "compose.language.search": "Meklēt valodas...", + "compose.published.open": "Atvērt", "compose_form.direct_message_warning_learn_more": "Uzzināt vairāk", "compose_form.encryption_warning": "Ziņas vietnē Mastodon nav pilnībā šifrētas. Nedalies ar sensitīvu informāciju caur Mastodon.", "compose_form.hashtag_warning": "Šī ziņa netiks norādīta zem nevienas atsauces, jo tā nav publiska. Tikai publiskās ziņās var meklēt pēc atsauces.", @@ -251,6 +256,7 @@ "filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu", "filter_modal.select_filter.title": "Filtrēt šo ziņu", "filter_modal.title.status": "Filtrēt ziņu", + "firehose.remote": "Citi serveri", "follow_request.authorize": "Autorizēt", "follow_request.reject": "Noraidīt", "follow_requests.unlocked_explanation": "Lai gan tavs konts nav bloķēts, {domain} darbinieki iedomājās, ka, iespējams, vēlēsies pārskatīt pieprasījumus no šiem kontiem.", @@ -452,6 +458,7 @@ "picture_in_picture.restore": "Novietot atpakaļ", "poll.closed": "Pabeigta", "poll.refresh": "Atsvaidzināt", + "poll.reveal": "Skatīt rezultātus", "poll.total_people": "{count, plural, zero {# cilvēku} one {# persona} other {# cilvēki}}", "poll.total_votes": "{count, plural, zero {# balsojumu} one {# balsojums} other {# balsojumi}}", "poll.vote": "Balsot", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 2e02e6af0d..8b389c48fa 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -21,6 +21,7 @@ "account.blocked": "Disekat", "account.browse_more_on_origin_server": "Layari selebihnya di profil asal", "account.cancel_follow_request": "Menarik balik permintaan mengikut", + "account.direct": "Sebut secara persendirian @{name}", "account.disable_notifications": "Berhenti maklumkan saya apabila @{name} mengirim hantaran", "account.domain_blocked": "Domain disekat", "account.edit_profile": "Sunting profil", @@ -39,6 +40,7 @@ "account.follows_you": "Mengikuti anda", "account.go_to_profile": "Pergi ke profil", "account.hide_reblogs": "Sembunyikan galakan daripada @{name}", + "account.in_memoriam": "Dalam Memoriam.", "account.joined_short": "Menyertai", "account.languages": "Tukar bahasa yang dilanggan", "account.link_verified_on": "Pemilikan pautan ini telah disemak pada {date}", @@ -74,6 +76,7 @@ "admin.dashboard.retention.cohort": "Bulan pendaftaran", "admin.dashboard.retention.cohort_size": "Pengguna baru", "admin.impact_report.instance_accounts": "Profil akaun ini akan dipadamkan", + "admin.impact_report.title": "Ringkasan kesan", "alert.rate_limited.message": "Sila cuba semula selepas {retry_time, time, medium}.", "alert.rate_limited.title": "Kadar terhad", "alert.unexpected.message": "Berlaku ralat di luar jangkaan.", @@ -127,6 +130,7 @@ "community.column_settings.remote_only": "Jauh sahaja", "compose.language.change": "Tukar bahasa", "compose.language.search": "Cari bahasa...", + "compose.published.body": "Pos telah diterbitkan.", "compose.published.open": "Buka", "compose_form.direct_message_warning_learn_more": "Ketahui lebih lanjut", "compose_form.encryption_warning": "Hantaran pada Mastodon tidak disulitkan hujung ke hujung. Jangan berkongsi sebarang maklumat sensitif melalui Mastodon.", @@ -171,6 +175,7 @@ "confirmations.mute.explanation": "Ini akan menyembunyikan hantaran daripada mereka dan juga hantaran yang menyebut mereka, tetapi ia masih membenarkan mereka melihat hantaran anda dan mengikuti anda.", "confirmations.mute.message": "Adakah anda pasti anda ingin membisukan {name}?", "confirmations.redraft.confirm": "Padam & rangka semula", + "confirmations.redraft.message": "Adakah anda pasti anda ingin memadam pos ini dan merangkanya semula? Kegemaran dan galakan akan hilang, dan balasan ke pos asal akan menjadi yatim.", "confirmations.reply.confirm": "Balas", "confirmations.reply.message": "Membalas sekarang akan menulis ganti mesej yang anda sedang karang. Adakah anda pasti anda ingin teruskan?", "confirmations.unfollow.confirm": "Nyahikut", @@ -180,6 +185,7 @@ "conversation.open": "Lihat perbualan", "conversation.with": "Dengan {names}", "copypaste.copied": "Disalin", + "copypaste.copy_to_clipboard": "Salin ke papan klip", "directory.federated": "Dari fediverse yang diketahui", "directory.local": "Dari {domain} sahaja", "directory.new_arrivals": "Ketibaan baharu", @@ -189,7 +195,9 @@ "dismissable_banner.community_timeline": "Inilah hantaran awam terkini daripada orang yang akaun dihos oleh {domain}.", "dismissable_banner.dismiss": "Ketepikan", "dismissable_banner.explore_links": "Berita-berita ini sedang dibualkan oleh orang di pelayar ini dan pelayar lain dalam rangkaian terpencar sekarang.", + "dismissable_banner.explore_statuses": "Ini adalah pos dari seluruh web sosial yang semakin menarik perhatian hari ini. Pos baharu dengan lebih banyak rangsangan dan kegemaran diberi kedudukan lebih tinggi.", "dismissable_banner.explore_tags": "Tanda-tanda pagar ini daripada pelayar ini dan pelayar lain dalam rangkaian terpencar sedang hangat pada pelayar ini sekarang.", + "dismissable_banner.public_timeline": "Ini ialah pos awam terbaharu daripada orang di web sosial yang diikuti oleh orang di {domain}.", "embed.instructions": "Benam hantaran ini di laman sesawang anda dengan menyalin kod berikut.", "embed.preview": "Begini rupanya nanti:", "emoji_button.activity": "Aktiviti", @@ -231,6 +239,7 @@ "errors.unexpected_crash.copy_stacktrace": "Salin surih tindanan ke papan keratan", "errors.unexpected_crash.report_issue": "Laporkan masalah", "explore.search_results": "Hasil carian", + "explore.suggested_follows": "Orang", "explore.title": "Terokai", "explore.trending_links": "Baru", "explore.trending_statuses": "Hantar", @@ -279,10 +288,12 @@ "hashtag.column_settings.tag_toggle": "Sertakan tag tambahan untuk lajur ini", "hashtag.follow": "Ikuti hashtag", "hashtag.unfollow": "Nyahikut tanda pagar", + "home.actions.go_to_explore": "Lihat apa yand sedang tren", "home.actions.go_to_suggestions": "Cari orang untuk diikuti", "home.column_settings.basic": "Asas", "home.column_settings.show_reblogs": "Tunjukkan galakan", "home.column_settings.show_replies": "Tunjukkan balasan", + "home.explore_prompt.title": "Ini adalah pusat operasi anda dalam Mastodon.", "home.hide_announcements": "Sembunyikan pengumuman", "home.show_announcements": "Tunjukkan pengumuman", "interaction_modal.description.follow": "Dengan akaun pada Mastodon, anda boleh mengikut {name} untuk menerima hantaran mereka di suapan rumah anda.", @@ -338,6 +349,7 @@ "lightbox.previous": "Sebelumnya", "limited_account_hint.action": "Paparkan profil", "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator {domain}.", + "link_preview.author": "Dengan {name}", "lists.account.add": "Tambah ke senarai", "lists.account.remove": "Buang daripada senarai", "lists.delete": "Padam senarai", @@ -367,6 +379,7 @@ "navigation_bar.domain_blocks": "Domain disekat", "navigation_bar.edit_profile": "Sunting profil", "navigation_bar.explore": "Teroka", + "navigation_bar.favourites": "Kegemaran", "navigation_bar.filters": "Perkataan yang dibisukan", "navigation_bar.follow_requests": "Permintaan ikutan", "navigation_bar.followed_tags": "Ikuti hashtag", @@ -396,6 +409,7 @@ "notifications.column_settings.admin.report": "Laporan baru:", "notifications.column_settings.admin.sign_up": "Pendaftaran baru:", "notifications.column_settings.alert": "Pemberitahuan atas meja", + "notifications.column_settings.favourite": "Kegemaran:", "notifications.column_settings.filter_bar.advanced": "Papar semua kategori", "notifications.column_settings.filter_bar.category": "Bar penapis pantas", "notifications.column_settings.filter_bar.show_bar": "Paparkan bar penapis", @@ -413,6 +427,7 @@ "notifications.column_settings.update": "Suntingan:", "notifications.filter.all": "Semua", "notifications.filter.boosts": "Galakan", + "notifications.filter.favourites": "Kegemaran", "notifications.filter.follows": "Ikutan", "notifications.filter.mentions": "Sebutan", "notifications.filter.polls": "Keputusan undian", @@ -433,19 +448,29 @@ "onboarding.compose.template": "Hello #Mastodon!", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Popular on Mastodon", + "onboarding.share.next_steps": "Langkah seterusnya yang mungkin:", + "onboarding.share.title": "Berkongsi profil anda", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", "onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.title": "Anda telah berjaya!", "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", "onboarding.steps.publish_status.body": "Say hello to the world.", + "onboarding.steps.publish_status.title": "Buat pos pertama anda", "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", "onboarding.steps.setup_profile.title": "Customize your profile", "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.tips.2fa": "Tahukah anda? Anda boleh melindungi akaun anda dengan menyediakan pengesahan dua faktor dalam tetapan akaun anda. Ia berfungsi dengan mana-mana aplikasi TOTP pilihan anda, tiada nombor telefon diperlukan!", + "onboarding.tips.accounts_from_other_servers": "Tahukah anda? Memandangkan Mastodon tidak berpusat, beberapa profil yang anda temui akan dihoskan pada server selain anda. Namun anda boleh berinteraksi dengan mereka dengan lancar! Server mereka berada di separuh kedua nama pengguna mereka!", + "onboarding.tips.migration": "Tahukah anda? Jika anda rasa {domain} bukan pilihan server yang bagus untuk anda pada masa hadapan, anda boleh beralih ke server Mastodon yang lain tanpa kehilangan pengikut anda. Anda juga boleh mengehoskan server anda sendiri!", + "onboarding.tips.verification": "Tahukah anda? Anda boleh mengesahkan akaun anda dengan meletakkan pautan ke profil Mastodon anda pada tapak web anda sendiri dan menambah tapak web pada profil anda. Tiada bayaran atau dokumen diperlukan!", + "password_confirmation.exceeds_maxlength": "Pengesahan kata laluan melebihi panjang kata laluan maksimum", + "password_confirmation.mismatching": "Pengesahan kata laluan tidak sepadan", "picture_in_picture.restore": "Letak semula", "poll.closed": "Ditutup", "poll.refresh": "Muat semula", + "poll.reveal": "Hasil carian", "poll.total_people": "{count, plural, other {# orang}}", "poll.total_votes": "{count, plural, other {# undian}}", "poll.vote": "Undi", @@ -499,6 +524,7 @@ "report.reasons.dislike": "Saya tidak suka", "report.reasons.dislike_description": "Inilah sesuatu yang anda tidak ingin lihat", "report.reasons.legal": "Ia haram", + "report.reasons.legal_description": "Anda percaya ia melanggar undang-undang negara anda atau negara server", "report.reasons.other": "Inilah sesuatu yang lain", "report.reasons.other_description": "Isu ini tidak sesuai untuk kategori lain", "report.reasons.spam": "Inilah spam", @@ -523,8 +549,16 @@ "report_notification.categories.spam": "Spam", "report_notification.categories.violation": "Langgaran peraturan", "report_notification.open": "Buka laporan", + "search.no_recent_searches": "Tiada carian terkini", "search.placeholder": "Cari", + "search.quick_action.account_search": "Pos sepadan {x}", + "search.quick_action.go_to_account": "Pergi ke profil {x}", + "search.quick_action.go_to_hashtag": "Pergi ke hashtag {x}", + "search.quick_action.open_url": "Buka URL dalam Mastadon", + "search.quick_action.status_search": "Pos sepadan {x}", "search.search_or_paste": "Cari atau tampal URL", + "search_popout.quick_actions": "Tindakan pantas", + "search_popout.recent": "Carian terkini", "search_results.accounts": "Profil", "search_results.all": "Semua", "search_results.hashtags": "Tanda pagar", @@ -556,8 +590,10 @@ "status.edited": "Disunting {date}", "status.edited_x_times": "Disunting {count, plural, other {{count} kali}}", "status.embed": "Benaman", + "status.favourite": "Kegemaran", "status.filter": "Tapiskan hantaran ini", "status.filtered": "Ditapis", + "status.hide": "Sembunyikan pos", "status.history.created": "{name} mencipta pada {date}", "status.history.edited": "{name} menyunting pada {date}", "status.load_more": "Muatkan lagi", @@ -593,6 +629,7 @@ "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", "status.translate": "Menterjemah", "status.translated_from_with": "Diterjemah daripada {lang} dengan {provider}", + "status.uncached_media_warning": "Pratonton tidak tersedia", "status.unmute_conversation": "Nyahbisukan perbualan", "status.unpin": "Nyahsemat daripada profil", "subscribed_languages.lead": "Hanya hantaran dalam bahasa-bahasa terpilih akan dipaparkan pada garis masa rumah dan senarai selepas perubahan. Pilih tiada untuk menerima hantaran dalam semua bahasa.", @@ -640,6 +677,7 @@ "upload_modal.preview_label": "Pratonton ({ratio})", "upload_progress.label": "Memuat naik...", "upload_progress.processing": "Memproses…", + "username.taken": "Nama pengguna tersebut sudah digunakan. Sila cuba lagi", "video.close": "Tutup video", "video.download": "Muat turun fail", "video.exit_fullscreen": "Keluar skrin penuh", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 62c7c5d531..731a5b95f5 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -295,9 +295,9 @@ "hashtag.column_settings.tag_mode.any": "Kva som helst av desse", "hashtag.column_settings.tag_mode.none": "Ingen av desse", "hashtag.column_settings.tag_toggle": "Inkluder fleire emneord for denne kolonna", - "hashtag.counter_by_accounts": "{count, plural, one {{counter} deltaker} other {{counter} deltakere}}", - "hashtag.counter_by_uses": "{count, plural, one {ett innlegg} other {{counter} innlegg}}", - "hashtag.counter_by_uses_today": "{count, plural, one {ett innlegg} other {{counter} innlegg}} i dag", + "hashtag.counter_by_accounts": "{count, plural,one {{counter} deltakar} other {{counter} deltakarar}}", + "hashtag.counter_by_uses": "{count, plural,one {{counter} innlegg} other {{counter} innlegg}}", + "hashtag.counter_by_uses_today": "{count, plural,one {{counter} innlegg} other {{counter} innlegg}} i dag", "hashtag.follow": "Fylg emneknagg", "hashtag.unfollow": "Slutt å fylgje emneknaggen", "home.actions.go_to_explore": "Sjå kva som er populært", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 85460b916e..e2563b60c8 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -13,7 +13,7 @@ "about.rules": "Regler for serveren", "account.account_note_header": "Notat", "account.add_or_remove_from_list": "Legg til eller fjern fra lister", - "account.badges.bot": "Robot", + "account.badges.bot": "Automatisert", "account.badges.group": "Gruppe", "account.block": "Blokker @{name}", "account.block_domain": "Blokker domenet {domain}", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 75153b4694..94562d2bb2 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -358,6 +358,7 @@ "lightbox.previous": "Predchádzajúci", "limited_account_hint.action": "Ukáž profil aj tak", "limited_account_hint.title": "Tento profil bol skrytý moderátormi stránky {domain}.", + "link_preview.author": "Podľa {name}", "lists.account.add": "Pridaj do zoznamu", "lists.account.remove": "Odober zo zoznamu", "lists.delete": "Vymaž list", @@ -574,6 +575,7 @@ "server_banner.server_stats": "Serverové štatistiky:", "sign_in_banner.create_account": "Vytvor účet", "sign_in_banner.sign_in": "Prihlás sa", + "sign_in_banner.sso_redirect": "Prihlás sa, alebo zaregistruj", "status.admin_account": "Otvor moderovacie rozhranie užívateľa @{name}", "status.admin_status": "Otvor tento príspevok v moderovacom rozhraní", "status.block": "Blokuj @{name}", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index f1c3d6c374..991d3f8c92 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -200,8 +200,8 @@ "disabled_account_banner.text": "{disabledAccount} hesabınız şu an devre dışı.", "dismissable_banner.community_timeline": "Bunlar, {domain} sunucusunda hesabı olanların yakın zamandaki herkese açık gönderileridir.", "dismissable_banner.dismiss": "Yoksay", - "dismissable_banner.explore_links": "Bu haberler, merkeziyetsiz ağın bu ve diğer sunucularındaki insanlar tarafından şimdilerde konuşuluyor.", - "dismissable_banner.explore_statuses": "Merkeziyetsiz ağın bu ve diğer sunucularındaki bu gönderiler, mevcut sunucuda şimdilerde ilgi çekiyorlar.", + "dismissable_banner.explore_links": "Bunlar şimdilerde sosyal ağlarda en çok paylaşılan haberler. Farklı kişilerin yayınladığı daha yeni haberler daha üst sıralarda yer alır.", + "dismissable_banner.explore_statuses": "Bunlar, sosyal ağ genelinde bugün ilgi gören gönderiler. Daha çok yinelenen ve favorilenen yeni gönderiler daha üst sıralarda yer alır.", "dismissable_banner.explore_tags": "Bu etiketler, merkeziyetsiz ağda bulunan bu ve diğer sunuculardaki insanların şimdilerde ilgisini çekiyor.", "dismissable_banner.public_timeline": "Bunlar, {domain} üzerindeki insanların, sosyal ağ da takip ettiği insanlarca gönderilen en son ve herkese açık gönderilerdir.", "embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.", @@ -227,7 +227,7 @@ "empty_column.blocks": "Henüz herhangi bir kullanıcıyı engellemedin.", "empty_column.bookmarked_statuses": "Henüz yer imine eklediğin toot yok. Bir tanesi yer imine eklendiğinde burada görünür.", "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!", - "empty_column.direct": "Henüz doğrudan değinmeniz yok. Bir tane gönderdiğinizde veya aldığınızda burada listelenecekler.", + "empty_column.direct": "Henüz doğrudan değinmeniz yok. Bir tane gönderdiğinizde veya aldığınızda burada listelenecek.", "empty_column.domain_blocks": "Henüz engellenmiş bir alan adı yok.", "empty_column.explore_statuses": "Şu an öne çıkan birşey yok. Daha sonra tekrar bakın!", "empty_column.favourited_statuses": "Henüz bir gönderiyi favorilerinize eklememişsiniz. Bir gönderiyi favorilerinize eklediğinizde burada görünecek.", @@ -418,7 +418,7 @@ "not_signed_in_indicator.not_signed_in": "Bu kaynağa erişmek için oturum açmanız gerekir.", "notification.admin.report": "{name}, {target} kişisini bildirdi", "notification.admin.sign_up": "{name} kaydoldu", - "notification.favourite": "{name} gönderinizden hoşlandı", + "notification.favourite": "{name} gönderinizi beğendi", "notification.follow": "{name} seni takip etti", "notification.follow_request": "{name} size takip isteği gönderdi", "notification.mention": "{name} senden bahsetti", @@ -582,7 +582,7 @@ "search.quick_action.go_to_hashtag": "Etikete git {x}", "search.quick_action.open_url": "Bağlantıyı Mastodon'da Aç", "search.quick_action.status_search": "Eşleşen gönderiler {x}", - "search.search_or_paste": "Ara veya Bağlantıyı yapıştır", + "search.search_or_paste": "Ara veya bağlantıyı yapıştır", "search_popout.quick_actions": "Hızlı eylemler", "search_popout.recent": "Son aramalar", "search_results.accounts": "Profiller", @@ -610,7 +610,7 @@ "status.bookmark": "Yer işareti ekle", "status.cancel_reblog_private": "Yeniden paylaşımı geri al", "status.cannot_reblog": "Bu gönderi yeniden paylaşılamaz", - "status.copy": "Bağlantı durumunu kopyala", + "status.copy": "Gönderi bağlantısını kopyala", "status.delete": "Sil", "status.detailed_status": "Ayrıntılı sohbet görünümü", "status.direct": "@{name} kullanıcısına özelden değin", @@ -643,7 +643,7 @@ "status.reblogs.empty": "Henüz hiç kimse bu Gönderiyi Yeniden Paylaşmadı. Herhangi bir kullanıcı yeniden paylaştığında burada görüntülenecek.", "status.redraft": "Sil,Düzenle ve Yeniden paylaş", "status.remove_bookmark": "Yer işaretini kaldır", - "status.replied_to": "{name} kullanıcısına yanıt verildi", + "status.replied_to": "{name} kullanıcısına yanıt verdi", "status.reply": "Yanıtla", "status.replyAll": "Konuyu yanıtla", "status.report": "@{name} adlı kişiyi bildir", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 6b5533bfb0..df632ac02e 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -12,7 +12,7 @@ "about.powered_by": "Mạng xã hội liên hợp {mastodon}", "about.rules": "Nội quy máy chủ", "account.account_note_header": "Ghi chú", - "account.add_or_remove_from_list": "Thêm hoặc xóa khỏi danh sách", + "account.add_or_remove_from_list": "Thêm vào danh sách", "account.badges.bot": "Bot", "account.badges.group": "Nhóm", "account.block": "Chặn @{name}", @@ -29,7 +29,7 @@ "account.endorse": "Tôn vinh người này", "account.featured_tags.last_status_at": "Tút gần nhất {date}", "account.featured_tags.last_status_never": "Chưa có tút", - "account.featured_tags.title": "Hashtag {name} thường dùng", + "account.featured_tags.title": "Hashtag của {name}", "account.follow": "Theo dõi", "account.followers": "Người theo dõi", "account.followers.empty": "Chưa có người theo dõi nào.", @@ -116,7 +116,7 @@ "column.favourites": "Lượt thích", "column.firehose": "Bảng tin", "column.follow_requests": "Yêu cầu theo dõi", - "column.home": "Bảng tin", + "column.home": "Trang chính", "column.lists": "Danh sách", "column.mutes": "Người đã ẩn", "column.notifications": "Thông báo", @@ -131,7 +131,7 @@ "column_header.unpin": "Không ghim", "column_subheading.settings": "Cài đặt", "community.column_settings.local_only": "Chỉ máy chủ của bạn", - "community.column_settings.media_only": "Chỉ xem media", + "community.column_settings.media_only": "Chỉ hiện tút có media", "community.column_settings.remote_only": "Chỉ người ở máy chủ khác", "compose.language.change": "Chọn ngôn ngữ tút", "compose.language.search": "Tìm ngôn ngữ...", @@ -185,7 +185,7 @@ "confirmations.reply.confirm": "Trả lời", "confirmations.reply.message": "Nội dung bạn đang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?", "confirmations.unfollow.confirm": "Bỏ theo dõi", - "confirmations.unfollow.message": "Bạn thật sự muốn ngưng theo dõi {name}?", + "confirmations.unfollow.message": "Bạn thật sự muốn bỏ theo dõi {name}?", "conversation.delete": "Xóa tin nhắn này", "conversation.mark_as_read": "Đánh dấu là đã đọc", "conversation.open": "Xem toàn bộ tin nhắn", @@ -198,12 +198,12 @@ "directory.recently_active": "Hoạt động gần đây", "disabled_account_banner.account_settings": "Cài đặt tài khoản", "disabled_account_banner.text": "Tài khoản {disabledAccount} của bạn hiện không khả dụng.", - "dismissable_banner.community_timeline": "Đây là những tút gần đây từ những người thuộc máy chủ {domain}.", + "dismissable_banner.community_timeline": "Đây là những tút công khai gần đây trong mạng liên hợp của máy chủ {domain}.", "dismissable_banner.dismiss": "Bỏ qua", - "dismissable_banner.explore_links": "Những sự kiện đang được thảo luận nhiều trên máy chủ này và những máy chủ khác thuộc mạng liên hợp của nó.", - "dismissable_banner.explore_statuses": "Những tút đang phổ biến trên máy chủ này và mạng liên hợp của nó.", - "dismissable_banner.explore_tags": "Những hashtag đang được sử dụng nhiều trên máy chủ này và những máy chủ khác thuộc mạng liên hợp của nó.", - "dismissable_banner.public_timeline": "Đây là những tút công khai gần đây từ những người trong mạng liên hợp của {domain}.", + "dismissable_banner.explore_links": "Đây là những liên kết đang được chia sẻ nhiều trong mạng liên hợp của máy chủ này.", + "dismissable_banner.explore_statuses": "Đây là những tút đang phổ biến trong mạng liên hợp của máy chủ này.", + "dismissable_banner.explore_tags": "Đây là những hashtag đang được sử dụng nhiều trong mạng liên hợp của máy chủ này.", + "dismissable_banner.public_timeline": "Đây là những tút công khai gần đây trong mạng liên hợp của máy chủ {domain}.", "embed.instructions": "Sao chép đoạn mã dưới đây và chèn vào trang web của bạn.", "embed.preview": "Nó sẽ hiển thị như vầy:", "emoji_button.activity": "Hoạt động", @@ -235,11 +235,11 @@ "empty_column.follow_requests": "Bạn chưa có yêu cầu theo dõi nào.", "empty_column.followed_tags": "Bạn chưa theo dõi hashtag nào. Khi bạn theo dõi, chúng sẽ hiện lên ở đây.", "empty_column.hashtag": "Chưa có tút nào dùng hashtag này.", - "empty_column.home": "Bảng tin của bạn đang trống! Hãy theo dõi nhiều người hơn. {suggestions}", + "empty_column.home": "Trang chính của bạn đang trống! Hãy theo dõi nhiều người hơn để lấp đầy.", "empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.", "empty_column.lists": "Bạn chưa tạo danh sách nào.", "empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.", - "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho một ai đó.", + "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho ai đó.", "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi những người khác", "error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.", "error.unexpected_crash.explanation_addons": "Trang này không thể hiển thị do xung khắc với add-on của trình duyệt hoặc công cụ tự động dịch ngôn ngữ.", @@ -299,16 +299,16 @@ "hashtag.counter_by_uses": "{count, plural, other {{counter} tút}}", "hashtag.counter_by_uses_today": "{count, plural, other {{counter} tút}} hôm nay", "hashtag.follow": "Theo dõi hashtag", - "hashtag.unfollow": "Ngưng theo dõi hashtag", + "hashtag.unfollow": "Bỏ theo dõi hashtag", "home.actions.go_to_explore": "Khám phá xu hướng", - "home.actions.go_to_suggestions": "Đề xuất theo dõi", + "home.actions.go_to_suggestions": "Tìm người theo dõi", "home.column_settings.basic": "Tùy chỉnh", "home.column_settings.show_reblogs": "Hiện những lượt đăng lại", "home.column_settings.show_replies": "Hiện những tút dạng trả lời", - "home.explore_prompt.body": "Bảng tin của bạn sẽ có sự kết hợp của các tút gắn hashtag mà bạn đã chọn để theo dõi, những người bạn đã chọn để theo dõi và các bài đăng lại từ họ. Lúc này có vẻ hơi trống, sao bạn không:", + "home.explore_prompt.body": "Bảng tin của bạn sẽ bao gồm các tút có hashtag bạn theo dõi, những người bạn theo dõi và các tút mà họ đăng lại. Lúc này có vẻ hơi trống, sao bạn không:", "home.explore_prompt.title": "Đây là ngôi nhà Mastodon của bạn.", "home.hide_announcements": "Ẩn thông báo máy chủ", - "home.show_announcements": "Hiện thông báo máy chủ", + "home.show_announcements": "Xem thông báo máy chủ", "interaction_modal.description.favourite": "Với tài khoản Mastodon, bạn có thể cho người đăng biết bạn thích tút này và lưu lại tút.", "interaction_modal.description.follow": "Với tài khoản Mastodon, bạn có thể theo dõi {name} để tút của họ hiện trên bảng tin của mình.", "interaction_modal.description.reblog": "Với tài khoản Mastodon, bạn có thể đăng lại tút này để chia sẻ nó với những người đang theo dõi bạn.", @@ -340,7 +340,7 @@ "keyboard_shortcuts.favourites": "Mở lượt thích", "keyboard_shortcuts.federated": "mở mạng liên hợp", "keyboard_shortcuts.heading": "Danh sách phím tắt", - "keyboard_shortcuts.home": "mở bảng tin", + "keyboard_shortcuts.home": "mở trang chính", "keyboard_shortcuts.hotkey": "Phím tắt", "keyboard_shortcuts.legend": "hiện bảng hướng dẫn này", "keyboard_shortcuts.local": "mở máy chủ của bạn", @@ -467,26 +467,26 @@ "onboarding.action.back": "Quay lại", "onboarding.actions.back": "Quay lại", "onboarding.actions.go_to_explore": "Xem những gì đang thịnh hành", - "onboarding.actions.go_to_home": "Đi đến bảng tin", + "onboarding.actions.go_to_home": "Đến trang chính", "onboarding.compose.template": "Xin chào #Mastodon!", "onboarding.follows.empty": "Không có kết quả có thể được hiển thị lúc này. Bạn có thể thử sử dụng tính năng tìm kiếm hoặc duyệt qua trang khám phá để tìm những người theo dõi hoặc thử lại sau.", - "onboarding.follows.lead": "Bạn quản lý bảng tin của riêng bạn. Bạn càng theo dõi nhiều người, nó sẽ càng sôi động và thú vị. Những hồ sơ này có thể là một điểm khởi đầu tốt—bạn luôn có thể hủy theo dõi họ sau!", + "onboarding.follows.lead": "Bạn quản lý bảng tin của riêng bạn. Bạn càng theo dõi nhiều người, nó sẽ càng sôi động và thú vị. Để bắt đầu, đây là vài gợi ý:", "onboarding.follows.title": "Thịnh hành trên Mastodon", "onboarding.share.lead": "Hãy cho mọi người biết làm thế nào họ có thể tìm thấy bạn trên Mastodon!", "onboarding.share.message": "Tôi là {username} trên #Mastodon! Hãy theo dõi tôi tại {url}", "onboarding.share.next_steps": "Các bước kế tiếp:", - "onboarding.share.title": "Chia sẻ hồ sơ của bạn", + "onboarding.share.title": "Chia sẻ hồ sơ", "onboarding.start.lead": "Tài khoản Mastodon mới của bạn đã sẵn sàng hoạt động. Đây là cách bạn có thể tận dụng tối đa nó:", "onboarding.start.skip": "Muốn bỏ qua luôn?", "onboarding.start.title": "Xong rồi bạn!", - "onboarding.steps.follow_people.body": "Bạn quản lý bảng tin của riêng bạn. Hãy lấp đầy nó với những người thú vị.", - "onboarding.steps.follow_people.title": "Theo dõi {count, plural, other {# người}}", - "onboarding.steps.publish_status.body": "Gửi lời chào tới thế giới mới.", - "onboarding.steps.publish_status.title": "Đăng tút đầu tiên của bạn", - "onboarding.steps.setup_profile.body": "Những người khác có nhiều khả năng tương tác với bạn hơn nếu hồ sơ bạn được điền đầy đủ thông tin.", + "onboarding.steps.follow_people.body": "Theo dõi những người thú vị trên Mastodon.", + "onboarding.steps.follow_people.title": "Cá nhân hóa trang chính", + "onboarding.steps.publish_status.body": "Chào cộng đồng bằng lời nói, ảnh hoặc video {emoji}", + "onboarding.steps.publish_status.title": "Đăng tút đầu tiên", + "onboarding.steps.setup_profile.body": "Tạo sự tương tác bằng một hồ sơ hoàn chỉnh.", "onboarding.steps.setup_profile.title": "Tùy biến hồ sơ", "onboarding.steps.share_profile.body": "Hãy để bạn bè của bạn biết cách tìm thấy bạn trên Mastodon!", - "onboarding.steps.share_profile.title": "Chia sẻ hồ sơ của bạn", + "onboarding.steps.share_profile.title": "Chia sẻ hồ sơ Mastodon của bạn", "onboarding.tips.2fa": "Bạn có biết? Bạn có thể bảo mật tài khoản của mình bằng cách thiết lập xác thực hai yếu tố trong cài đặt tài khoản của mình. Nó hoạt động với bất kỳ ứng dụng OTP nào bạn chọn, không cần số điện thoại!", "onboarding.tips.accounts_from_other_servers": "Bạn có biết? Vì Mastodon liên hợp, một số hồ sơ bạn gặp sẽ được lưu trữ trên các máy chủ không giống bạn. Tuy nhiên, bạn có thể tương tác với họ một cách liền mạch! Máy chủ của họ nằm ở nửa sau tên người dùng của họ!", "onboarding.tips.migration": "Bạn có biết? Nếu bạn thấy {domain} không phải là lựa chọn máy chủ tuyệt vời cho bạn trong tương lai, bạn có thể chuyển sang máy chủ Mastodon khác mà không bị mất người theo dõi. Bạn thậm chí có thể lưu trữ máy chủ của riêng bạn!", @@ -494,7 +494,7 @@ "password_confirmation.exceeds_maxlength": "Mật khẩu vượt quá độ dài mật khẩu tối đa", "password_confirmation.mismatching": "Mật khẩu không trùng khớp", "picture_in_picture.restore": "Hiển thị bình thường", - "poll.closed": "Kết thúc", + "poll.closed": "Đóng", "poll.refresh": "Làm mới", "poll.reveal": "Xem kết quả", "poll.total_people": "{count, plural, other {# người bình chọn}}", @@ -504,7 +504,7 @@ "poll.votes": "{votes, plural, other {# lượt bình chọn}}", "poll_button.add_poll": "Tạo bình chọn", "poll_button.remove_poll": "Hủy cuộc bình chọn", - "privacy.change": "Thay đổi quyền riêng tư", + "privacy.change": "Chọn kiểu tút", "privacy.direct.long": "Chỉ người được nhắc đến mới thấy", "privacy.direct.short": "Nhắn riêng", "privacy.private.long": "Dành riêng cho người theo dõi", @@ -517,7 +517,7 @@ "privacy_policy.title": "Chính sách bảo mật", "refresh": "Làm mới", "regeneration_indicator.label": "Đang tải…", - "regeneration_indicator.sublabel": "Bảng tin của bạn đang được cập nhật!", + "regeneration_indicator.sublabel": "Trang chính của bạn đang được cập nhật!", "relative_time.days": "{number} ngày", "relative_time.full.days": "{number, plural, other {# ngày}}", "relative_time.full.hours": "{number, plural, other {# giờ}}", @@ -537,8 +537,8 @@ "report.categories.violation": "Vi phạm nội quy máy chủ", "report.category.subtitle": "Chọn lý do phù hợp nhất:", "report.category.title": "{type} này có vấn đề gì?", - "report.category.title_account": "người này", - "report.category.title_status": "tút", + "report.category.title_account": "Người", + "report.category.title_status": "Tút", "report.close": "Xong", "report.comment.title": "Có điều gì mà chúng tôi cần biết không?", "report.forward": "Chuyển đến {target}", @@ -567,8 +567,8 @@ "report.thanks.take_action_actionable": "Trong lúc chờ chúng tôi xem xét, bạn có thể áp dụng hành động với @{name}:", "report.thanks.title": "Không muốn xem thứ này?", "report.thanks.title_actionable": "Cảm ơn đã báo cáo, chúng tôi sẽ xem xét kỹ.", - "report.unfollow": "Ngưng theo dõi @{name}", - "report.unfollow_explanation": "Bạn đang theo dõi người này. Để không thấy tút của họ trong bảng tin nữa, hãy ngưng theo dõi.", + "report.unfollow": "Bỏ theo dõi @{name}", + "report.unfollow_explanation": "Bạn đang theo dõi người này. Để không thấy tút của họ trên trang chính nữa, hãy bỏ theo dõi.", "report_notification.attached_statuses": "{count, plural, other {{count} tút}} đính kèm", "report_notification.categories.legal": "Pháp lý", "report_notification.categories.other": "Khác", @@ -623,14 +623,14 @@ "status.filter": "Lọc tút này", "status.filtered": "Bộ lọc", "status.hide": "Ẩn tút", - "status.history.created": "{name} tạo vào {date}", - "status.history.edited": "{name} sửa vào {date}", + "status.history.created": "{name} đăng {date} trước", + "status.history.edited": "{name} đã sửa {date} trước", "status.load_more": "Tải thêm", "status.media.open": "Nhấn để mở", "status.media.show": "Nhấn để xem", "status.media_hidden": "Đã ẩn", "status.mention": "Nhắc đến @{name}", - "status.more": "Thêm", + "status.more": "Xem thêm", "status.mute": "Ẩn @{name}", "status.mute_conversation": "Không quan tâm nữa", "status.open": "Đọc tút", @@ -658,7 +658,7 @@ "status.title.with_attachments": "{user} đã đăng {attachmentCount, plural, other {{attachmentCount} đính kèm}}", "status.translate": "Dịch tút", "status.translated_from_with": "Dịch từ {lang} bằng {provider}", - "status.uncached_media_warning": "Xem trước không sẵn có", + "status.uncached_media_warning": "Không bản xem trước", "status.unmute_conversation": "Quan tâm", "status.unpin": "Bỏ ghim trên hồ sơ", "subscribed_languages.lead": "Chỉ các tút đăng bằng các ngôn ngữ đã chọn mới được xuất hiện trên bảng tin của bạn. Không chọn gì cả để đọc tút đăng bằng mọi ngôn ngữ.", @@ -666,7 +666,7 @@ "subscribed_languages.target": "Đổi ngôn ngữ mong muốn cho {target}", "suggestions.dismiss": "Tắt đề xuất", "suggestions.header": "Có thể bạn quan tâm…", - "tabs_bar.home": "Bảng tin", + "tabs_bar.home": "Trang chính", "tabs_bar.notifications": "Thông báo", "time_remaining.days": "{number, plural, other {# ngày}}", "time_remaining.hours": "{number, plural, other {# giờ}}", diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 348521ae82..11d368f77e 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -399,6 +399,12 @@ ar: confirm_suspension: cancel: إلغاء confirm: علّق الحساب + permanent_action: لن يستعيد رفع الحظر أي بيانات أو علاقات. + preamble_html: أنت على وشك تعليق %{domain} وجميع نطاقاته الفرعيّة. + remove_all_data: ستُحذف كل المحتوى والوسائط وبيانات حسابات هذا النطاق من خادومك. + stop_communication: سيتوقّف خادومك عن التواصل مع كل هذه الخادومات. + title: تأكيد حظر نطاق %{domain} + undo_relationships: سيتم التراجع عن أي علاقات متابعة ما بين الحسابات على هذه الخادومات وخادومك. created_msg: إنّ حجب النطاق حيز التشغيل destroyed_msg: تم إلغاء الحجب المفروض على النطاق domain: النطاق diff --git a/config/locales/de.yml b/config/locales/de.yml index e1501e1d1d..8bbc33f3a1 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1018,7 +1018,7 @@ de: privacy_policy_agreement_html: Ich habe die Datenschutzerklärung gelesen und stimme ihr zu progress: confirm: E-Mail-Adresse bestätigen - details: Deine Daten + details: Deine Details review: Unsere Überprüfung rules: Regeln akzeptieren providers: diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml index 2139daca75..904cc51fe9 100644 --- a/config/locales/devise.vi.yml +++ b/config/locales/devise.vi.yml @@ -14,7 +14,7 @@ vi: not_found_in_database: "%{authentication_keys} không có trong dữ liệu." pending: Tài khoản của bạn vẫn đang được xem xét. timeout: Phiên của bạn đã hết hạn. Vui lòng đăng nhập lại để tiếp tục. - unauthenticated: Bạn cần đăng nhập hoặc đăng ký trước khi tiếp tục. + unauthenticated: Bạn cần đăng nhập để tiếp tục. unconfirmed: Bạn phải xác minh địa chỉ email trước khi tiếp tục. mailer: confirmation_instructions: diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index aecedbe443..d6e62d82b1 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -71,7 +71,7 @@ vi: confirmations: revoke: Bạn có chắc không? index: - authorized_at: Cho phép vào %{date} + authorized_at: Cho phép %{date} description_html: Đây là những ứng dụng có thể truy cập tài khoản của bạn bằng API. Nếu có ứng dụng bạn không nhận ra ở đây hoặc ứng dụng hoạt động sai, bạn có thể thu hồi quyền truy cập của ứng dụng đó. last_used_at: Dùng lần cuối %{date} never_used: Chưa dùng diff --git a/config/locales/gd.yml b/config/locales/gd.yml index e08939e146..4dff8629b0 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -593,7 +593,7 @@ gd: pending: A’ feitheamh ri aontachadh an ath-sheachadain save_and_enable: Sàbhail ’s cuir an comas setup: Suidhich ceangal ri ath-sheachadain - signatures_not_enabled: Chan obraich ath-sheachadain mar bu chòir nuair a bhios am modh tèarainte no modh a’ cho-nasgaidh chuingichte an comas + signatures_not_enabled: Dh’fhaoidte nach obraich ath-sheachadain mar bu chòir nuair a bhios am modh tèarainte no modh a’ cho-nasgaidh chuingichte an comas status: Staid title: Ath-sheachadain report_notes: @@ -900,10 +900,10 @@ gd: no_status_selected: Cha deach post a’ treandadh sam bith atharrachadh o nach deach gin dhiubh a thaghadh not_discoverable: Cha do chuir an t-ùghdar roimhe gun gabh a rùrachadh shared_by: - few: Chaidh a cho-roinneadh no ’na annsachd %{friendly_count} tursan - one: Chaidh a cho-roinneadh no ’na annsachd %{friendly_count} turas - other: Chaidh a cho-roinneadh no ’na annsachd %{friendly_count} turas - two: Chaidh a cho-roinneadh no ’na annsachd %{friendly_count} thuras + few: Chaidh a cho-roinneadh no a chur ris na h-annsachdan %{friendly_count} tursan + one: Chaidh a cho-roinneadh no a chur ris na h-annsachdan %{friendly_count} turas + other: Chaidh a cho-roinneadh no a chur ris na h-annsachdan %{friendly_count} turas + two: Chaidh a cho-roinneadh no a chur ris na h-annsachdan %{friendly_count} thuras title: Postaichean a’ treandadh tags: current_score: Sgòr làithreach de %{score} @@ -1631,7 +1631,7 @@ gd: migrate: Imrich cunntais notifications: Brathan preferences: Roghainnean - profile: Pròifil + profile: Pròifil phoblach relationships: Dàimhean leantainn statuses_cleanup: Sguabadh às fèin-obrachail phostaichean strikes: Rabhaidhean na maorsainneachd @@ -1717,7 +1717,7 @@ gd: keep_polls_hint: Cha dèid gin dhe na cunntasan-bheachd agad a sguabadh às keep_self_bookmark: Cùm na chuir thu ris comharran-lìn keep_self_bookmark_hint: Cha dèid gin dhe na postaichean agad fhèin a chuir thu ris na comharran-lìn agad a sguabadh às - keep_self_fav: Cùm na chuir thu ris na h-annsachdan + keep_self_fav: Cùm na postaichean a chuir thu ris na h-annsachdan keep_self_fav_hint: Cha dèid gin dhe na postaichean agad fhèin a chuir thu ris na h-annsachdan agad a sguabadh às min_age: '1209600': 2 sheachdain @@ -1729,8 +1729,8 @@ gd: '63113904': 2 bhliadhna '7889238': 3 mìosan min_age_label: Stairsneach aoise - min_favs: Cùm na tha ’na annsachd aig co-dhiù - min_favs_hint: Cha dèid gin dhe na postaichean agad a sguabadh às a tha ’nan annsachd an àireamh de thursan seo air a char as lugha. Fàg seo bàn airson postaichean a sguabadh às ge b’ e co mheud turas a tha iad ’nan annsachd + min_favs: Cùm na postaichean a chaidh a chur ris na h-annsachdan co-dhiù + min_favs_hint: Cha dèid gin dhe na postaichean agad a sguabadh às a chaidh a chur ris na h-annsachdan an àireamh seo de thursan air a char as lugha. Fàg seo bàn airson na postaichean a sguabadh às ge b’ e co mheud neach a chuir ris na h-annsachdan iad min_reblogs: Cùm na tha ’ga bhrosnachadh le co-dhiù min_reblogs_hint: Cha dèid gin dhe na postaichean agad a sguabadh às a tha ’gam brosnachadh an àireamh de thursan seo air a char as lugha. Fàg seo bàn airson postaichean a sguabadh às ge b’ e co mheud turas a tha iad ’gam brosnachadh stream_entries: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 4223467032..eeb8f16ae4 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -101,6 +101,7 @@ kab: search: Nadi search_same_email_domain: Iseqdacen-nniḍen s yiwet n taɣult n yimayl search_same_ip: Imseqdacen-nniḍen s tansa IP am tinn-ik + security: Taɣellist security_measures: only_password: Awal uffir kan password_and_2fa: Awal uffir d 2FA @@ -253,6 +254,8 @@ kab: undo: Kkes seg tebdart tamellalt domain_blocks: add_new: Rni iḥder amaynut n taɣult + confirm_suspension: + cancel: Sefsex domain: Taγult export: Sifeḍ import: Kter @@ -283,6 +286,7 @@ kab: instances: back_to_all: Akk back_to_limited: Ɣur-s talast + back_to_warning: Γur-wat by_domain: Taγult content_policies: policy: Tasertit @@ -353,6 +357,7 @@ kab: category: Taggayt comment: none: Ula yiwen + confirm: Sentem mark_as_resolved: Creḍ-it yefra mark_as_unresolved: Creḍ-it ur yefra ara notes: @@ -407,6 +412,7 @@ kab: application: Asnas back_to_account: Tuγalin γer usebter n umiḍan deleted: Yettwakkes + favourites: Imenyafen language: Tutlayt media: title: Taγwalt @@ -437,9 +443,11 @@ kab: view_profile: Ssken-d amaɣnu view_status: Ssken-d tasuffiɣt applications: + logout: Ffeɣ token_regenerated: Ajuṭu n unekcum yettusirew i tikkelt-nniḍen akken iwata your_token: Ajiṭun-ik·im n unekcum auth: + apply_for_account: Suter amiḍan delete_account: Kkes amiḍan description: prefix_invited_by_user: "@%{name} inced-ik·ikem ad ternuḍ ɣer uqeddac-a n Mastodon!" @@ -456,6 +464,8 @@ kab: register: Jerred registration_closed: "%{instance} ur yeqbil ara imttekkiyen imaynuten" reset_password: Wennez awal uffir + rules: + back: Tuɣalin security: Taγellist set_new_password: Egr-d awal uffir amaynut status: @@ -489,15 +499,8 @@ kab: username_available: Isem-ik·im n useqdac ad yuɣal yella i tikkelt-nniḍen username_unavailable: Isem-ik·im n useqdac ad yeqqim ulac-it errors: - '400': The request you submitted was invalid or malformed. - '403': You don't have permission to view this page. - '404': The page you are looking for isn't here. - '406': This page is not available in the requested format. - '410': The page you were looking for doesn't exist here anymore. - '429': Too many requests '500': title: Asebter-ayi d arameγtu - '503': The page could not be served due to a temporary server failure. existing_username_validator: not_found_multiple: ur yezmir ara ad yaf %{usernames} exports: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 6cce9b9937..b784dad25c 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1395,8 +1395,8 @@ ko: title: 새 팔로우 요청 mention: action: 답장 - body: "%{name} 님이 나를 언급했습니다:" - subject: "%{name} 님이 나를 언급했습니다" + body: "%{name} 님이 나를 멘션했습니다:" + subject: "%{name} 님이 나를 멘션했습니다" title: 새 답글 poll: subject: "%{name}의 투표가 종료되었습니다" diff --git a/config/locales/ms.yml b/config/locales/ms.yml index e7d20891b7..c0d0c1eecc 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -115,6 +115,7 @@ ms: reject: Tolak rejected_msg: Berjaya menolak permohonan pendaftaran %{username} remote_suspension_irreversible: Data akaun ini telah dipadamkan secara tidak dapat dipulihkan. + remote_suspension_reversible_hint_html: Akaun telah digantung pada server mereka dan data akan dialih keluar sepenuhnya pada %{date}. Sehingga itu, server jauh boleh memulihkan akaun ini tanpa sebarang kesan buruk. Jika anda ingin mengalih keluar semua data akaun dengan segera, anda boleh berbuat demikian di bawah. remove_avatar: Buang avatar remove_header: Buang pengepala removed_avatar_msg: Berjaya membuang imej avatar %{username} @@ -380,6 +381,9 @@ ms: permanent_action: Membuat asal penggantungan tidak akan memulihkan sebarang data atau perhubungan. preamble_html: Anda akan menggantung %{domain} dan subdomainnya. remove_all_data: Ini akan mengalih keluar semua kandungan, media dan data profil untuk akaun domain ini daripada sever anda. + stop_communication: Server anda akan berhenti berkomunikasi dengan server ini. + title: Sahkan blok domain untuk %{domain} + undo_relationships: Ini akan membuat asal sebarang hubungan ikut antara akaun server ini dan akaun anda. created_msg: Sekatan domain sedang diproses destroyed_msg: Sekatan domain telah diundurkan domain: Domain @@ -392,6 +396,7 @@ ms: create: Cipta sekatan hint: Sekatan domain tidak akan menghindarkan penciptaan entri akaun dalam pangkalan data, tetapi akan dikenakan kaedah penyederhanaan khusus tertentu pada akaun-akaun tersebut secara retroaktif dan automatik. severity: + desc_html: "Had akan menjadikan siaran daripada akaun di domain ini tidak kelihatan kepada sesiapa sahaja yang tidak mengikutinya. Tangguhkan akan mengalih keluar semua kandungan, media dan data profil untuk akaun domain ini daripada server anda. Gunakan Tiada jika anda hanya mahu menolak fail media." noop: Tiada silence: Hadkan suspend: Gantungkan @@ -426,6 +431,7 @@ ms: title: Sekat domain e-mel baharu no_email_domain_block_selected: Tiada sekatan domain e-mel diubah kerana tiada yang dipilih not_permitted: Tidak dibenarkan + resolved_dns_records_hint_html: Nama domain diselesaikan kepada domain MX berikut, yang akhirnya bertanggungjawab untuk menerima e-mel. Menyekat domain MX akan menyekat pendaftaran daripada mana-mana alamat e-mel yang menggunakan domain MX yang sama, walaupun nama domain yang kelihatan berbeza. Berhati-hati untuk tidak menyekat penyedia e-mel utama. resolved_through_html: Diselesaikan melalui %{domain} title: Domain e-mel disekat export_domain_allows: @@ -434,8 +440,12 @@ ms: no_file: Tiada fail dipilih export_domain_blocks: import: + description_html: Anda akan mengimport senarai blok domain. Sila semak senarai ini dengan teliti, terutamanya jika anda belum mengarang senarai ini sendiri. existing_relationships_warning: Hubungan ikut sedia ada + private_comment_description_html: 'Untuk membantu anda menjejak dari mana datangnya blok yang diimport, blok yang diimport akan dibuat dengan ulasan peribadi berikut: %{comment}' + private_comment_template: Diimport daripada %{source} pada %{date} title: Import blok domain + invalid_domain_block: 'Satu atau lebih blok domain telah dilangkau kerana ralat berikut: %{error}' new: title: Import blok domain no_file: Tiada fail yang dipilih @@ -449,6 +459,8 @@ ms: unsuppress: Tetap semula saranan ikutan instances: availability: + failure_threshold_reached: Ambang kegagalan dicapai pada %{date}. + no_failures_recorded: Tiada kegagalan dalam rekod. title: Ketersediaan warning: Percubaan terakhir untuk menyambung ke pelayan ini tidak berjaya back_to_all: Semua @@ -458,6 +470,8 @@ ms: confirm_purge: Adakah anda pasti mahu menghapuskan senarai ini secara kekal daripada domain ini? content_policies: comment: Catatan dalaman + description_html: Anda boleh menentukan dasar kandungan yang akan digunakan pada semua akaun daripada domain ini dan mana-mana subdomainnya. + limited_federation_mode_description_html: Anda boleh memilih sama ada untuk membenarkan persekutuan dengan domain ini. policies: reject_media: Tolak media reject_reports: Tolak laporan @@ -485,6 +499,7 @@ ms: delivery_available: Penghantaran tersedia delivery_error_days: Hari ralat penghantaran delivery_error_hint: Jika penghantaran tidak berjaya selama %{count} hari, ia akan ditanda sebagai tidak boleh dihantar. + destroyed_msg: Data daripada %{domain} kini beratur untuk pemadaman segera. empty: Tiada domain dijumpai. known_accounts: other: "%{count} akaun dikenali" @@ -494,12 +509,15 @@ ms: title: Penyederhanaan private_comment: Ulasan peribadi public_comment: Ulasan awam + purge: Singkir + purge_description_html: Jika anda percaya domain ini berada di luar talian selama-lamanya, anda boleh memadamkan semua rekod akaun dan data yang berkaitan daripada domain ini daripada storan anda. Ini mungkin mengambil sedikit masa. title: Persekutuan total_blocked_by_us: Disekati kami total_followed_by_them: Diikuti mereka total_followed_by_us: Diikuti kami total_reported: Laporan tentang mereka total_storage: Lampiran media + totals_time_period_hint_html: Jumlah yang dipaparkan di bawah termasuk data untuk sepanjang masa. invites: deactivate_all: Nyahaktifkan semua filter: @@ -553,7 +571,12 @@ ms: actions: delete_description_html: Hantaran yang dilaporkan akan dihapuskan dan pelanggaran itu akan direkodkan bagi membantu anda menguruskan pelanggaran pada akaun yang sama di masa akan datang. mark_as_sensitive_description_html: Media di dalam hantaran yang dilaporkan akan ditandakan sebagai sensitif dan pelanggaran itu akan direkodkan bagi membantu anda menguruskan pelanggaran pada akaun yang sama di masa akan datang. + other_description_html: Lihat lebih banyak pilihan untuk mengawal tingkah laku akaun dan menyesuaikan komunikasi ke akaun yang dilaporkan. resolve_description_html: Tiada tindakan akan diambil terhadap akaun yang dilaporkan, tiada pelanggaran direkodkan dan laporan akan ditutup. + silence_description_html: Akaun itu akan kelihatan hanya kepada mereka yang telah mengikutinya atau mencarinya secara manual, mengehadkan capaiannya dengan teruk. Sentiasa boleh dikembalikan. Menutup semua laporan terhadap akaun ini. + suspend_description_html: Akaun dan semua kandungannya akan tidak boleh diakses dan akhirnya dipadamkan, dan berinteraksi dengannya adalah mustahil. Boleh diterbalikkan dalam masa 30 hari. Menutup semua laporan terhadap akaun ini. + actions_description_html: Tentukan tindakan yang perlu diambil untuk menyelesaikan laporan ini. Jika anda mengambil tindakan menghukum terhadap akaun yang dilaporkan, pemberitahuan e-mel akan dihantar kepada mereka, kecuali apabila kategori Spam dipilih. + actions_description_remote_html: Tentukan tindakan yang perlu diambil untuk menyelesaikan laporan ini. Ini hanya akan menjejaskan cara serveranda berkomunikasi dengan akaun jauh ini dan mengendalikan kandungannya. add_to_report: Tambahkan lebih banyak pada laporan are_you_sure: Adakah anda pasti? assign_to_self: Menugaskan kepada saya @@ -561,9 +584,12 @@ ms: by_target_domain: Domain bagi akaun yang dilaporkan cancel: Batal category: Kumpulan + category_description_html: Sebab akaun dan/atau kandungan ini dilaporkan akan disebut dalam komunikasi dengan akaun yang dilaporkan comment: none: Tiada + comment_description_html: 'Untuk memberikan maklumat lanjut, %{name} menulis:' confirm: Konfirm + confirm_action: Sahkan tindakan penyederhanaan terhadap @%{acct} created_at: Dilaporkan delete_and_resolve: Padam hantaran forwarded: Dipanjangkan @@ -579,7 +605,10 @@ ms: delete: Padam placeholder: Terangkan tindakan apa yang telah diambil, atau sebarang kemas kini lain yang berkaitan... title: Catatan + notes_description_html: Lihat dan tinggalkan nota kepada moderator lain dan diri masa depan anda processed_msg: 'Laporan #%{id} berjaya diproses' + quick_actions_description_html: 'Ambil tindakan pantas atau tatal ke bawah untuk melihat kandungan yang dilaporkan:' + remote_user_placeholder: pengguna jauh dari %{instance} reopen: Buka semula laporan report: 'Laporan #%{id}' reported_account: Akaun yang dilaporkan @@ -589,9 +618,29 @@ ms: skip_to_actions: Langkau ke tindakan status: Status statuses: Kandungan yang dilaporkan + statuses_description_html: Kandungan yang menyinggung perasaan akan disebut dalam komunikasi dengan akaun yang dilaporkan + summary: + action_preambles: + delete_html: 'Anda akan mengalih keluar beberapa siaran @%{acct}. Ini akan:' + mark_as_sensitive_html: 'Anda akan menandai beberapa siaran @%{acct} sebagai sensitif. Ini akan:' + silence_html: 'Anda akan menghadkan akaun @%{acct}. Ini akan:' + suspend_html: 'Anda akan menggantung akaun @%{acct}. Ini akan:' + actions: + delete_html: Alih keluar pos yang menyinggung perasaan + mark_as_sensitive_html: Tandai media pos yang menyinggung perasaan sebagai sensitif + silence_html: Hadkan capaian @%{acct} dengan ketat dengan menjadikan profil dan kandungan mereka hanya kelihatan kepada orang yang sudah mengikuti mereka atau melihat profil itu secara manual + suspend_html: Gantung @%{acct}, menjadikan profil dan kandungan mereka tidak boleh diakses dan mustahil untuk berinteraksi dengannya + close_report: 'Tandai laporan #%{id} sebagai diselesaikan' + close_reports_html: Tandai semua laporan terhadap @%{acct} sebagai telah diselesaikan + delete_data_html: Padamkan profil dan kandungan @%{acct} 30 hari dari sekarang melainkan mereka dibatalkan penggantungan buat sementara waktu + preview_preamble_html: "@%{acct} akan menerima amaran dengan kandungan berikut:" + record_strike_html: Rakam bantahan terhadap @%{acct} untuk membantu anda mempertingkatkan tentang pelanggaran akaun ini pada masa hadapan + send_email_html: Hantar @%{acct} e-mel amaran + warning_placeholder: Penaakulan tambahan pilihan untuk tindakan penyederhanaan. target_origin: Asalan akaun yang dilaporkan title: Laporan unassign: Nyahtugaskan + unknown_action_msg: 'Tindakan tidak diketahui: %{action}' unresolved: Nyahselesaikan updated_at: Dikemaskini view_profile: Lihat profil @@ -606,12 +655,15 @@ ms: moderation: Penyederhanaan special: Khas delete: Padam + description_html: Dengan peranan pengguna, anda boleh menyesuaikan fungsi dan kawasan Mastodon yang boleh diakses oleh pengguna anda. edit: Sunting peranan '%{name}' everyone: Kebenaran lalai + everyone_full_description_html: Ini ialah peranan asas yang mempengaruhi semua pengguna, walaupun mereka yang tidak mempunyai peranan yang ditetapkan. Semua peranan lain mewarisi kebenaran daripadanya. permissions_count: other: "%{count} kebenaran" privileges: administrator: Pentadbir + administrator_description: Users with this permission will bypass every permission delete_user_data: Padamkan Data Pengguna delete_user_data_description: Membenarkan pengguna menghapuskan data pengguna lain tanpa bertangguh invite_users: Mengundang pengguna @@ -668,12 +720,24 @@ ms: preamble: Menyesuaikan antara muka web Mastodon. title: Penampilan branding: + preamble: Penjenamaan server anda membezakannya daripada server lain dalam rangkaian. Maklumat ini mungkin dipaparkan merentasi pelbagai persekitaran, seperti antara muka web Mastodon, aplikasi asli, dalam pratonton pautan di tapak web lain dan dalam aplikasi pemesejan, dan sebagainya. Atas sebab ini, adalah lebih baik untuk memastikan maklumat ini jelas, pendek dan padat. title: Penjenamaan + captcha_enabled: + desc_html: Ini bergantung pada skrip luaran daripada hCaptcha, yang mungkin menjadi kebimbangan keselamatan dan privasi. Selain itu, ini boleh menjadikan proses pendaftaran menjadi kurang dapat diakses oleh sesetengah orang (terutamanya orang kurang upaya). Atas sebab ini, sila pertimbangkan langkah alternatif seperti pendaftaran berasaskan kelulusan atau jemputan. + title: Memerlukan pengguna baharu menyelesaikan CAPTCHA untuk mengesahkan akaun mereka content_retention: + preamble: Kawal cara kandungan yang dijana pengguna disimpan dalam Mastodon. title: Pengekalan kandungan + default_noindex: + desc_html: Mempengaruhi semua pengguna yang tidak menukar tetapan ini sendiri + title: Tarik pengguna keluar daripada pengindeksan enjin carian secara lalai discovery: + follow_recommendations: Ikut cadangan + preamble: Memaparkan kandungan yang menarik adalah penting dalam memasukkan pengguna baharu yang mungkin tidak mengenali sesiapa Mastodon. Kawal cara pelbagai ciri penemuan berfungsi pada server anda. profile_directory: Direktori profil public_timelines: Garis masa awam + publish_discovered_servers: Terbitkan pelayan yang ditemui + publish_statistics: Terbitkan statistik title: Penemuan trends: Sohor kini domain_blocks: @@ -688,16 +752,22 @@ ms: approved: Kelulusan diperlukan untuk pendaftaran none: Tiada siapa boleh mendaftar open: Sesiapapun boleh mendaftar + title: Tetapan server site_uploads: delete: Hapuskan fail yang dimuat naik destroyed_msg: Muat naik tapak berjaya dihapuskan! statuses: account: Penulis + application: Aplikasi + back_to_account: Kembali ke halaman akaun + back_to_report: Kembali ke halaman laporan batch: + remove_from_report: Alih keluar daripada laporan report: Laporan deleted: Dipadamkan favourites: Gemaran history: Sejarah versi + in_reply_to: Membalas kepada language: Bahasa media: title: Media @@ -709,6 +779,8 @@ ms: status_changed: Hantaran diubah title: Hantaran akaun trending: Sohor kini + visibility: Visibiliti + with_media: Dengan media strikes: actions: delete_statuses: "%{name} memadam hantaran %{target}" @@ -720,15 +792,29 @@ ms: suspend: "%{name} telah menggantungkan akaun %{target}" appeal_approved: Dirayu appeal_pending: Rayuan yang belum selesai + appeal_rejected: Rayuan ditolak system_checks: + database_schema_check: + message_html: Terdapat migrasi pangkalan data yang belum selesai. Sila jalankannya untuk memastikan aplikasi berfungsi seperti yang diharapkan + elasticsearch_running_check: + message_html: Tidak dapat menyambung ke Elasticsearch. Sila semak sama ada ia sedang berjalan atau lumpuhkan carian teks penuh + elasticsearch_version_check: + message_html: 'Versi Elasticsearch tidak serasi: %{value}' + version_comparison: Elasticsearch %{running_version} sedang berjalan manakala %{required_version} diperlukan + rules_check: + action: Urus peraturan server + message_html: Anda belum menentukan sebarang peraturan server. sidekiq_process_check: message_html: Tiada proses Sidekiq berjalan untuk baris gilir %{value}. Sila semak konfigurasi Sidekiq anda upload_check_privacy_error: + action: Semak di sini untuk maklumat lanjut message_html: "Server web anda salah konfigurasi. Privasi pengguna anda berisiko" upload_check_privacy_error_object_storage: + action: Semak di sini untuk maklumat lanjut message_html: "Ruang objek anda salah konfigurasi. Privasi pengguna anda berisiko" tags: review: Semak status + updated_msg: Tetapan hashtag berjaya dikemas kini title: Pentadbiran trends: allow: Izin @@ -737,11 +823,19 @@ ms: links: allow: Membenarkan pautan allow_provider: Membenarkan penerbit + description_html: Ini ialah pautan yang sedang banyak dikongsi oleh akaun tempat server anda melihat siaran daripadanya. Ia boleh membantu pengguna anda mengetahui perkara yang berlaku di dunia. Tiada pautan dipaparkan secara terbuka sehingga anda meluluskan penerbit. Anda juga boleh membenarkan atau menolak pautan individu. disallow: Tidak membenarkan pautan + disallow_provider: Tolak penerbit + no_link_selected: Tiada pautan ditukar kerana tiada pautan dipilih + publishers: + no_publisher_selected: Tiada penerbit ditukar kerana tiada penerbit dipilih title: Pautan yang sedang sohor kini + usage_comparison: Dikongsi %{today} kali hari ini, berbanding %{yesterday} semalam not_allowed_to_trend: Tidak dibenarkan menjadi trend only_allowed: Hanya dibenarkan + pending_review: Menunggu semak semula preview_card_providers: + description_html: Ini adalah domain dari mana pautan sering dikongsi pada server anda. Pautan tidak akan menjadi aliran secara terbuka melainkan domain pautan itu diluluskan. Kelulusan (atau penolakan) anda dilanjutkan kepada subdomain. rejected: Pautan daripada penerbit ini tidak akan menjadi sohor kini title: Penerbit rejected: Ditolak @@ -775,10 +869,41 @@ ms: empty: You don't have any webhook endpoints configured yet. enable: Dayakan enabled: Aktif + new: Webhook baru + rotate_secret: Putar rahsia + secret: Menandatangani rahsia + status: Status + title: Webhook + webhook: Webhook admin_mailer: new_appeal: actions: + delete_statuses: untuk memadamkan pos mereka + disable: untuk membekukan akaun mereka + mark_statuses_as_sensitive: untuk menandakan pos mereka sebagai sensitif + none: amaran + sensitive: untuk menandakan akaun mereka sebagai sensitif silence: untuk mengehadkan akaun mereka + suspend: untuk menggantung akaun mereka + body: "%{target} sedang merayu keputusan penyederhanaan sebanyak %{action_taken_by} dari %{date}, iaitu %{type}. Mereka tulis:" + next_steps: Anda boleh meluluskan rayuan untuk membuat asal keputusan penyederhanaan atau mengabaikannya. + subject: "%{username} sedang merayu keputusan penyederhanaan pada %{instance}" + new_pending_account: + body: Butiran akaun baharu ada di bawah. Anda boleh meluluskan atau menolak aplikasi ini. + subject: Akaun baharu disediakan untuk semakan pada %{instance} (%{username}) + new_report: + body: "%{reporter} telah melaporkan %{target}" + body_remote: Seseorang daripada %{domain} telah melaporkan %{target} + subject: Laporan baharu untuk %{instance} (#%{id}) + new_trends: + body: 'Item berikut memerlukan semakan sebelum boleh dipaparkan secara terbuka:' + new_trending_links: + title: Pautan sohor kini + new_trending_statuses: + title: Pos sohor kini + new_trending_tags: + no_approved_tags: Pada masa ini tiada hashtag sohor kini yang diluluskan. + requirements: 'Mana-mana calon ini boleh melepasi hashtag arah aliran #%{rank} yang diluluskan, yang pada masa ini ialah #%{lowest_tag_name} dengan markah %{lowest_tag_score}.' appearance: advanced_web_interface_hint: 'Jika anda ingin menggunakan keseluruhan lebar skrin anda, antara muka web lanjutan membolehkan anda mengkonfigurasi banyak lajur berbeza untuk melihat seberapa banyak maklumat pada masa yang sama seperti yang anda mahu: Laman Utama, pemberitahuan, garis masa bersekutu, sebarang bilangan senarai dan hashteg.' discovery: Penemuan @@ -801,7 +926,11 @@ ms: delete_account: Padam akaun description: prefix_sign_up: Daftar pada Mastodon hari ini! + suffix: Dengan akaun, anda akan dapat mengikuti orang, menyiarkan kemas kini dan bertukar-tukar mesej dengan pengguna dari mana-mana server Mastodon dan banyak lagi! + didnt_get_confirmation: Tidak menerima pautan pengesahan? + dont_have_your_security_key: Tiada kunci keselamatan anda? forgot_password: Terlupa kata laluan anda? + invalid_reset_password_token: Token tetapan semula kata laluan tidak sah atau tamat tempoh. Sila minta yang baharu. log_in_with: Daftar masuk dengan login: Daftar masuk logout: Daftar keluar diff --git a/config/locales/nn.yml b/config/locales/nn.yml index b6f0d8bfe3..5c81e83976 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1349,10 +1349,10 @@ nn: favourite: e-postar om favorittmarkeringar follow: e-postar om nye fylgjarar follow_request: e-postar om fylgjeførespurnadar - mention: e-poster om nevninger - reblog: e-poster om fremhevinger - resubscribe_html: Hvis du har avsluttet abonnementet ved en feiltakelse, kan du abonnere på nytt i innstillinger for e-postvarsling. - success_html: Du vil ikke lenger motta %{type} fra Mastodon på %{domain} i e-posten din på %{email}. + mention: e-postar om nemningar + reblog: e-postar om framhevingar + resubscribe_html: Om du har avslutta avslutta abonnementet ved ein feil, kan du abonnera på nytt i innstillingar for e-postvarsling. + success_html: Du vil ikkje lenger motta %{type} frå Mastodon på %{domain} til din e-post %{email}. title: Meld av media_attachments: validations: @@ -1770,10 +1770,10 @@ nn: seamless_external_login: Du er logga inn gjennom eit eksternt reiskap, so passord og e-postinstillingar er ikkje tilgjengelege. signed_in_as: 'Logga inn som:' verification: - extra_instructions_html: Tips: Lenken på din nettside kan være usynlig. Den viktige delen er rel="me" som sikrer at nettsteder med brukergenerert innhold ikke kan utgi seg for å være deg. Du kan til og med bruke en link lenke i sidens topptekst i stedet for a, men HTML-koden må være tilgjengelig uten å kjøre JavaScript. + extra_instructions_html: Tips: Linken på nettsida di kan vera usynleg. Den viktige delen er rel="me", som på nettstader med brukargenerert innhald vil hindra at andre kan låst som dei er deg. Du kan til og med bruka link i staden for a i toppteksten til sida, men HTML-koden må vera tilgjengeleg utan å måtte køyra JavaScript. here_is_how: Slik gjer du - hint_html: "Verifisering av identiteten din på Mastodon er for alle. Basert på åpne nettstandarder, gratis nå og for alltid. Alt du trenger er en personlig nettside som gjør at folk kjenner deg igjen. Når du lenker til dette nettstedet fra din profil, vil vi sjekke at nettstedet lenker tilbake til profilen din og viser dette på profilen din." - instructions_html: Kopier og lim inn koden nedenfor i HTML til ditt nettsted. Deretter legger du til adressen til nettstedet ditt i et av ekstrafeltene på profilen din fra fanen "Rediger profil" og lagre endringer. + hint_html: "Stadfesting av eigen identitet på Mastodon er for alle. Basert på opne nettstandardar, gratis no og for alltid. Alt du treng er ei personleg nettside der folk kjenner deg att. Om du lagar ein link som peikar på denne nettsida frå profilen din, vil profilen din få ein synleg indikator i dei tilfella der nettsida har ein link som peikar attende på profilen." + instructions_html: Kopier og lim inn i koden nedanfor i HTML-koden for nettsida di. Legg deretter adressa til nettsida di til i ei av ekstrafelta på profilen din frå fana "Rediger profil" og lagre endringane. verification: Stadfesting verified_links: Dine verifiserte lenker webauthn_credentials: diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index f1b1e06ad1..ce7a87cf9e 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -170,8 +170,8 @@ gd: text: Mìnich carson a bu chòir an caochladh a chur orra defaults: autofollow: Thoir cuireadh dhaibh airson an cunntas agad a leantainn - avatar: Avatar - bot: Seo cunntas bot + avatar: Dealbh na pròifil + bot: Seo cunntas fèin-obrachail chosen_languages: Criathraich na cànain confirm_new_password: Dearbh am facal-faire ùr confirm_password: Dearbh am facal-faire @@ -182,8 +182,8 @@ gd: display_name: Ainm-taisbeanaidh email: Seòladh puist-d expires_in: Falbhaidh an ùine air às dèidh - fields: Meata-dàta na pròifile - header: Bann-cinn + fields: Raointean a bharrachd + header: Dealbh a’ bhanna-chinn honeypot: "%{label} (na lìon seo)" inbox_url: URL bogsa a-steach an ath-sheachadain irreversible: Leig seachad seach falach diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index 8f4854858d..511742fdff 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -4,6 +4,8 @@ ms: hints: account: display_name: Nama penuh anda atau nama anda yang menyeronokkan. + fields: Halaman utama anda, kata ganti nama, umur, apa sahaja yang anda mahukan. + note: 'Anda boleh @menyebut orang lain atau #hashtags.' account_alias: acct: Tentukan namapengguna@domain akaun yang ingin anda alihkan daripada account_migration: @@ -20,6 +22,8 @@ ms: disable: Halang pengguna daripada menggunakan akaun mereka, tetapi jangan hapus atau sorokkan kandungan mereka. none: Gunakan ini untuk menghantar amaran kepada pengguna, tanpa mencetuskan sebarang tindakan lain. sensitive: Memaksa semua lampiran media pengguna ini ditandakan sebagai sensitif. + silence: Halang pengguna daripada dapat membuat siaran dengan keterlihatan awam, menyembunyikan siaran dan pemberitahuan mereka daripada orang yang tidak mengikutinya. Menutup semua laporan terhadap akaun ini. + suspend: Halang sebarang interaksi daripada atau ke akaun ini dan padamkan kandungannya. Boleh diterbalikkan dalam masa 30 hari. Menutup semua laporan terhadap akaun ini. warning_preset_id: Pilihan. Anda masih boleh menambah teks tersuai pada akhir praset announcement: all_day: Apabila diperiksa, hanya tarikh dalam julat masa yang akan dipaparkan @@ -32,22 +36,43 @@ ms: defaults: autofollow: Orang yang mendaftar melalui undangan akan mengikuti anda secara automatik avatar: PNG, GIF atau JPG. Kebanyakannya %{size}. Saiz akan dikecilkan kepada %{dimensions}px + bot: Memberi isyarat kepada orang lain bahawa akaun itu kebanyakannya melakukan tindakan automatik dan mungkin tidak dipantau + context: Satu atau berbilang konteks di mana penapis harus digunakan + current_password: Untuk tujuan keselamatan sila masukkan kata laluan akaun semasa + current_username: Untuk mengesahkan, sila masukkan nama pengguna akaun semasa + digest: Hanya dihantar selepas tempoh yang lama tidak aktif dan hanya jika anda telah menerima sebarang mesej peribadi semasa ketiadaan anda + discoverable: Benarkan akaun anda ditemui oleh orang yang tidak dikenali melalui pengesyoran, aliran dan ciri lain email: Anda akan dihantar e-mel pengesahan + header: PNG, GIF atau JPG. Paling banyak %{size}. Akan diturunkan skala kepada %{dimensions}px + inbox_url: Salin URL dari muka depan geganti yang anda mahu gunakan + irreversible: Siaran yang ditapis akan hilang secara tidak dapat dipulihkan, walaupun penapis dialih keluar kemudian locale: Bahasa untuk antara muka pengguna, e-mel dan pemberitahuan segera + locked: Kawal orang yang boleh mengikuti anda secara manual dengan meluluskan permintaan ikuti password: Gunakan sekurang-kurangnya 8 aksara + phrase: Akan dipadankan tanpa mengira sarung dalam teks atau amaran kandungan siaran + scopes: API mana yang akan dibenarkan untuk diakses oleh aplikasi. Jika anda memilih skop peringkat atasan, anda tidak perlu memilih skop individu. + setting_aggregate_reblogs: Jangan tunjukkan rangsangan baharu untuk siaran yang telah dirangsang baru-baru ini (hanya menjejaskan rangsangan yang baru diterima) setting_always_send_emails: Biasanya pemberitahuan e-mel tidak akan dihantar apabila anda selalu menggunakan Mastodon + setting_default_sensitive: Media sensitif disembunyikan secara lalai dan boleh didedahkan dengan satu klik setting_display_media_default: Sembunyikan media yang ditanda sebagai sensitif setting_display_media_hide_all: Sentiasa sembunyikan media setting_display_media_show_all: Sentiasa paparkan media setting_hide_network: Sesiapa yang anda ikuti dan sesiapa yang mengikuti anda akan disembunyi daripada profil anda setting_noindex: Menjejaskan profil awam dan laman hantaran anda + setting_show_application: Aplikasi yang anda gunakan untuk menyiarkan akan dipaparkan dalam paparan terperinci siaran anda form_admin_settings: closed_registrations_message: Dipaparkan semasa pendaftaran ditutup + site_contact_email: Cara orang boleh menghubungi anda untuk pertanyaan undang-undang atau sokongan. site_contact_username: Bagaimana orang boleh menghubungi anda pada Mastodon. site_extended_description: Apa-apa maklumat tambahan yang mungkin berguna untuk pelawat dan pengguna anda. Boleh distruktur dengan sintaks Markdown. + site_short_description: Penerangan ringkas untuk membantu mengenal pasti server anda. Siapa yang menjalankannya, untuk siapa? site_terms: Gunakan dasar polisi anda atau biarkan kosong untuk menggunakan lalai. Boleh distruktur dengan sintaks Markdown. site_title: Bagaimana orang boleh merujuk kepada server anda selain nama domainnya. status_page_url: URL halaman yang membolehkan orang ramai melihat status server ini semasa gangguan + theme: Tema yang pelawat log keluar dan pengguna baharu lihat. + thumbnail: Imej kira-kira 2:1 dipaparkan bersama maklumat server anda. + timeline_preview: Pelawat yang log keluar akan dapat menyemak imbas siaran awam terkini yang tersedia pada server. + trendable_by_default: Langkau semakan manual kandungan sohor kini. Item individu masih boleh dialih keluar daripada trend selepas fakta itu. form_challenge: current_password: Anda sedang memasuki kawasan selamat imports: @@ -63,9 +88,12 @@ ms: color: Warna yang akan digunakan untuk peranan ini dalam seluruh UI, sebagai RGB dalam format hex highlighted: Ini menjadikan peranan ini dipaparkan secara umum permissions_as_keys: Pengguna dengan peranan ini akan mempunyai akses kepada... + webhook: + url: Di mana acara akan dihantar labels: account: fields: + name: Label value: Kandungan account_warning_preset: title: Tajuk @@ -79,10 +107,14 @@ ms: suspend: Gantung warning_preset_id: Gunakan amaran yang ditetapkan announcement: + all_day: Acara sepanjang hari + ends_at: Tamat acara + starts_at: Permulaan acara text: Pengumuman appeal: text: Jelaskan mengapa keputusan ini patut diterbalikkan defaults: + avatar: Gambar profil bot: Ini ialah akaun bot chosen_languages: Tapis bahasa confirm_new_password: Sahkan kata laluan baru @@ -95,8 +127,11 @@ ms: email: Alamat e-mel expires_in: Tamat tempoh selepas fields: Metadata profil + honeypot: "%{label} (jangan isi)" + irreversible: Sebaliknya sembunyikan, jatuhkan locale: Bahasa antara muka new_password: Kata laluan baru + note: Bio otp_attempt: Kod dua faktor password: Kata laluan phrase: Kata kunci atau frasa @@ -108,6 +143,7 @@ ms: setting_display_media_default: Lalai setting_display_media_hide_all: Sembunyikan semua setting_display_media_show_all: Paparkan semua + setting_hide_network: Sembunyikan graf sosial anda setting_system_font_ui: Gunakan fon lalai sistem setting_theme: Tema halaman setting_trends: Paparkan trend hari ini @@ -136,6 +172,7 @@ ms: site_short_description: Penerangan pelayan site_terms: Dasar Privasi site_title: Nama pelayan + status_page_url: URL halaman status theme: Tema asal trends: Dayakan trend invite: @@ -166,6 +203,7 @@ ms: usable: Benarkan siaran untuk menggunakan tanda pagar ini user: role: Peranan + time_zone: Zon masa user_role: color: Warna lencana name: Nama @@ -175,5 +213,6 @@ ms: not_recommended: Tidak disyorkan recommended: Disyorkan required: + mark: "*" text: diperlukan 'yes': Ya diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index b35c11f362..80333c96e5 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -4,7 +4,7 @@ vi: hints: account: display_name: Tên đầy đủ hoặc biệt danh đều được. - fields: Trang blog của bạn, nghề nghiệp, tuổi hay bất cứ thứ gì. + fields: Trang blog của bạn, nghề nghiệp, tuổi hoặc bất cứ thứ gì. note: 'Bạn có thể @nhắnriêng ai đó hoặc #hashtags.' account_alias: acct: Nhập tên_người_dùng@máy chủ của tài khoản cũ @@ -19,9 +19,9 @@ vi: text_html: Tùy chọn. Bạn nên dùng mẫu có sẵn để tiết kiệm thời gian type_html: Chọn làm gì với %{acct} types: - disable: Tạm khóa đăng nhập tài khoản, nhưng không xóa hoặc ẩn tút. + disable: Tạm không cho đăng nhập tài khoản. none: Cảnh cáo tài khoản này, không áp đặt trừng phạt. - sensitive: Mọi tập tin của tài khoản này tải lên đều sẽ bị gắn nhãn nhạy cảm. + sensitive: Tất cả media tải lên sẽ bị gắn nhãn nhạy cảm. silence: Cấm người này đăng tút công khai, ẩn tút của họ hiện ra với những người chưa theo dõi họ. suspend: Vô hiệu hóa và xóa sạch dữ liệu của tài khoản này. Có thể khôi phục trước 30 ngày. warning_preset_id: Tùy chọn. Bạn vẫn có thể thêm chú thích riêng @@ -53,14 +53,14 @@ vi: scopes: API nào ứng dụng sẽ được phép truy cập. Nếu bạn chọn quyền hạn cấp cao nhất, bạn không cần chọn từng phạm vi. setting_aggregate_reblogs: Nếu một tút đã được đăng lại thì những lượt đăng lại sau sẽ không hiện trên bảng tin nữa setting_always_send_emails: Bình thường thì email thông báo sẽ không gửi khi bạn đang dùng Mastodon - setting_default_sensitive: Mặc định là nội dung nhạy cảm và chỉ hiện nếu nhấn vào - setting_display_media_default: Làm mờ nội dung nhạy cảm - setting_display_media_hide_all: Ẩn - setting_display_media_show_all: Luôn hiển thị + setting_default_sensitive: Bắt buộc nhấn vào mới có thể xem + setting_display_media_default: Click để xem + setting_display_media_hide_all: Luôn ẩn + setting_display_media_show_all: Luôn hiện setting_hide_network: Ẩn những người bạn theo dõi và những người theo dõi bạn setting_noindex: Ảnh hưởng đến trang cá nhân và tút của bạn - setting_show_application: Tên ứng dụng bạn dùng để đăng tút sẽ hiện trong chi tiết của tút - setting_use_blurhash: Lớp phủ mờ dựa trên màu sắc của hình ảnh nhạy cảm + setting_show_application: Nó sẽ hiện trong chi tiết của tút + setting_use_blurhash: Phủ lớp màu làm nhòe đi hình ảnh nhạy cảm setting_use_pending_items: Dồn lại toàn bộ tút mới và chỉ hiển thị khi nhấn vào username: Chỉ dùng ký tự, số và dấu gạch dưới whole_word: Khi từ khóa hoặc cụm từ là chữ và số, nó sẽ chỉ hiện ra những từ chính xác như vậy @@ -124,7 +124,7 @@ vi: tag: name: Bạn có thể thay đổi cách viết hoa các chữ cái để giúp nó dễ đọc hơn user: - chosen_languages: Chỉ hiển thị những tút viết bằng các ngôn ngữ được chọn sau + chosen_languages: Chỉ hiển thị những tút viết bằng các ngôn ngữ sau role: Vai trò kiểm soát những quyền mà người dùng có user_role: color: Màu được sử dụng cho vai trò trong toàn bộ giao diện người dùng, dưới dạng RGB ở định dạng hex @@ -199,26 +199,26 @@ vi: setting_aggregate_reblogs: Không hiện lượt đăng lại trùng lặp setting_always_send_emails: Luôn gửi email thông báo setting_auto_play_gif: Tự động phát ảnh GIF - setting_boost_modal: Yêu cầu xác nhận trước khi đăng lại tút + setting_boost_modal: Hỏi trước khi đăng lại tút setting_default_language: Ngôn ngữ đăng setting_default_privacy: Kiểu đăng - setting_default_sensitive: Ảnh/video là nội dung nhạy cảm - setting_delete_modal: Yêu cầu xác nhận trước khi xóa tút - setting_disable_swiping: Vô hiệu hóa vuốt màn hình - setting_display_media: Nội dung nhạy cảm + setting_default_sensitive: Đánh dấu media nhạy cảm + setting_delete_modal: Hỏi trước khi xóa tút + setting_disable_swiping: Không dùng chuyển động vuốt + setting_display_media: Media nhạy cảm setting_display_media_default: Mặc định setting_display_media_hide_all: Ẩn toàn bộ setting_display_media_show_all: Hiện toàn bộ - setting_expand_spoilers: Luôn hiển thị tút có nội dung ẩn + setting_expand_spoilers: Luôn mở rộng tút chứa nội dung ẩn setting_hide_network: Ẩn quan hệ của bạn setting_noindex: Không xuất hiện trong công cụ tìm kiếm setting_reduce_motion: Giảm chuyển động ảnh GIF - setting_show_application: Hiện ứng dụng đã dùng để đăng tút - setting_system_font_ui: Dùng phông chữ mặc định của hệ thống + setting_show_application: Hiện tên ứng dụng đăng tút + setting_system_font_ui: Dùng phông chữ mặc định hệ thống setting_theme: Giao diện setting_trends: Hiển thị thịnh hành hôm nay - setting_unfollow_modal: Yêu cầu xác nhận trước khi ngưng theo dõi ai đó - setting_use_blurhash: Làm mờ trước ảnh/video nhạy cảm + setting_unfollow_modal: Hỏi trước khi bỏ theo dõi ai đó + setting_use_blurhash: Phủ màu media nhạy cảm setting_use_pending_items: Không tự động cập nhật bảng tin severity: Mức độ nghiêm trọng sign_in_token_attempt: Mã an toàn @@ -264,9 +264,9 @@ vi: trends: Bật thịnh hành trends_as_landing_page: Dùng trang thịnh hành làm trang chào mừng interactions: - must_be_follower: Chặn thông báo từ những người không theo dõi bạn - must_be_following: Chặn thông báo từ những người bạn không theo dõi - must_be_following_dm: Chặn tin nhắn từ những người bạn không theo dõi + must_be_follower: Những người không theo dõi bạn + must_be_following: Những người bạn không theo dõi + must_be_following_dm: những người bạn không theo dõi (nhắn riêng) invite: comment: Bình luận invite_request: @@ -315,7 +315,7 @@ vi: recommended: Đề xuất required: mark: "*" - text: yêu cầu + text: Bắt buộc title: sessions: webauthn: Dùng một trong những khóa bảo mật của bạn để đăng nhập diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 54f9f7a805..57bf046983 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -168,14 +168,14 @@ vi: action_logs: action_types: approve_appeal: Chấp nhận kháng cáo - approve_user: Chấp nhận người dùng + approve_user: Chấp nhận đăng ký assigned_to_self_report: Tự xử lý báo cáo change_email_user: Đổi email - change_role_user: Thay đổi vai trò + change_role_user: Đổi vai trò confirm_user: Xác minh create_account_warning: Cảnh cáo create_announcement: Tạo thông báo mới - create_canonical_email_block: Tạo chặn tên miền email mới + create_canonical_email_block: Tạo chặn tên miền email create_custom_emoji: Tạo emoji create_domain_allow: Cho phép máy chủ create_domain_block: Chặn máy chủ @@ -187,7 +187,7 @@ vi: destroy_announcement: Xóa thông báo destroy_canonical_email_block: Bỏ chặn tên miền email destroy_custom_emoji: Xóa emoji - destroy_domain_allow: Bỏ cho phép máy chủ + destroy_domain_allow: Bỏ thanh trừng máy chủ destroy_domain_block: Bỏ chặn máy chủ destroy_email_domain_block: Bỏ chặn tên miền email destroy_instance: Thanh trừng máy chủ @@ -205,7 +205,7 @@ vi: memorialize_account: Đánh dấu tưởng niệm promote_user: Chỉ định vai trò reject_appeal: Từ chối kháng cáo - reject_user: Từ chối người dùng + reject_user: Từ chối đăng ký remove_avatar_user: Xóa ảnh đại diện reopen_report: Mở lại báo cáo resend_user: Gửi lại email xác nhận @@ -343,9 +343,9 @@ vi: dashboard: active_users: người hoạt động interactions: tương tác - media_storage: Dung lượng lưu trữ + media_storage: Media new_users: người mới - opened_reports: tổng báo cáo + opened_reports: báo cáo pending_appeals_html: other: "%{count} kháng cáo đang chờ" pending_reports_html: @@ -357,7 +357,7 @@ vi: resolved_reports: báo cáo đã xử lí software: Phần mềm sources: Nguồn đăng ký - space: Dung lượng lưu trữ + space: Lưu trữ title: Thống kê top_languages: Ngôn ngữ phổ biến top_servers: Máy chủ phổ biến @@ -450,7 +450,7 @@ vi: title: Nhập máy chủ chặn no_file: Không có tập tin nào được chọn follow_recommendations: - description_html: "Gợi ý theo dõi là cách giúp những người mới nhanh chóng tìm thấy những nội dung thú vị. Khi một người chưa đủ tương tác với những người khác để hình thành các đề xuất theo dõi được cá nhân hóa, thì những người này sẽ được đề xuất. Nó bao gồm những người có số lượt tương tác gần đây cao nhất và số lượng người theo dõi cao nhất cho một ngôn ngữ nhất định trong máy chủ." + description_html: "Gợi ý theo dõi giúp những người mới nhanh chóng tìm thấy những nội dung thú vị. Khi một người chưa đủ tương tác với những người khác để hình thành các đề xuất theo dõi được cá nhân hóa, thì những người này sẽ được đề xuất. Nó bao gồm những người có số lượt tương tác gần đây cao nhất và số lượng người theo dõi cao nhất cho một ngôn ngữ nhất định trong máy chủ." language: Theo ngôn ngữ status: Trạng thái suppress: Tắt gợi ý theo dõi @@ -835,15 +835,15 @@ vi: no_publisher_selected: Không có nguồn đăng nào thay đổi vì không có nguồn đăng nào được chọn shared_by_over_week: other: "%{count} người chia sẻ tuần rồi" - title: Liên kết nổi bật + title: Tin tức nổi bật usage_comparison: Chia sẻ %{today} lần hôm nay, so với %{yesterday} lần hôm qua not_allowed_to_trend: Không được phép thành xu hướng only_allowed: Chỉ cho phép pending_review: Đang chờ preview_card_providers: - allowed: Liên kết từ nguồn đăng này có thể nổi bật + allowed: Tin tức từ nguồn này có thể lên xu hướng description_html: Đây là những nguồn mà từ đó các liên kết thường được chia sẻ trên máy chủ của bạn. Các liên kết sẽ không thể thịnh hành trừ khi bạn cho phép nguồn. Sự cho phép (hoặc cấm) của bạn áp dụng luôn cho các tên miền phụ. - rejected: Liên kết từ nguồn đăng không thể nổi bật + rejected: Tin tức từ nguồn này không thể lên xu hướng title: Nguồn đăng rejected: Đã cấm statuses: @@ -929,7 +929,7 @@ vi: new_trends: body: 'Các mục sau đây cần được xem xét trước khi chúng hiển thị công khai:' new_trending_links: - title: Liên kết nổi bật + title: Tin tức nổi bật new_trending_statuses: title: Tút nổi bật new_trending_tags: @@ -946,8 +946,8 @@ vi: remove: Bỏ liên kết bí danh appearance: advanced_web_interface: Bố cục - advanced_web_interface_hint: 'Bố cục nhiều cột cho phép bạn chuyển bố cục hiển thị thành nhiều cột khác nhau. Bao gồm: Bảng tin, thông báo, thế giới, cũng như danh sách và hashtag. Thích hợp nếu bạn đang dùng màn hình rộng.' - animations_and_accessibility: Bảng tin + advanced_web_interface_hint: Bố cục nhiều cột cho phép bạn chuyển bố cục hiển thị thành nhiều cột khác nhau. Thích hợp với màn hình rộng. + animations_and_accessibility: Hiệu ứng confirmation_dialogs: Hộp thoại xác nhận discovery: Khám phá localization: @@ -1027,7 +1027,7 @@ vi: new_confirmation_instructions_sent: Bạn sẽ nhận được một email mới với liên kết xác nhận sau vài phút! title: Kiểm tra email của bạn sign_in: - preamble_html: Đăng nhập bằng tài khoản %{domain}. Nếu tài khoản của bạn được lưu trữ trên một máy chủ khác, bạn sẽ không thể đăng nhập tại đây. + preamble_html: Đăng nhập bằng tài khoản %{domain}. Nếu đăng ký trên một máy chủ khác, bạn sẽ không thể đăng nhập tại đây. title: Đăng nhập %{domain} sign_up: manual_review: "%{domain} sẽ duyệt đăng ký thủ công. Để giúp chúng tôi duyệt nhanh, hãy viết một chút về bản thân và lý do bạn muốn có một tài khoản trên %{domain}." @@ -1120,9 +1120,9 @@ vi: invalid_domain: không phải là một tên miền hợp lệ edit_profile: basic_information: Thông tin cơ bản - hint_html: "Tùy chỉnh những gì mọi người nhìn thấy trên hồ sơ công khai của bạn và bên cạnh tút của bạn. Mọi người sẽ muốn theo dõi lại bạn và tương tác với bạn hơn khi bạn có một hồ sơ đầy đủ và một ảnh hồ sơ." + hint_html: "Tùy chỉnh những gì mọi người nhìn thấy trên hồ sơ công khai và bên cạnh tút của bạn. Mọi người sẽ muốn theo dõi và tương tác với bạn hơn nếu bạn có ảnh đại diện và một hồ sơ hoàn chỉnh." other: Khác - safety_and_privacy: An toàn và bảo mật + safety_and_privacy: Sự riêng tư errors: '400': Yêu cầu bạn gửi không hợp lệ hoặc sai hình thức. '403': Bạn không có quyền xem trang này. @@ -1160,11 +1160,11 @@ vi: add_new: Thêm mới errors: limit: Bạn đã đạt tới số lượng hashtag tối đa - hint_html: "Hashtag thường dùng là gì? Chúng là những hashtag sẽ được hiển thị nổi bật trên trang hồ sơ của bạn, cho phép mọi người tìm kiếm các bài đăng công khai của bạn có chứa các hashtag đó. Tính năng này có thể dùng để đánh dấu chuỗi tác phẩm sáng tạo hoặc dự án dài hạn." + hint_html: "Làm nổi bật những hashtag thường dùng. Một công cụ tuyệt vời để theo dõi các tác phẩm sáng tạo và dự án dài hạn của bạn, các hashtag thường dùng sẽ hiển thị nổi bật trên hồ sơ của bạn và cho phép truy cập nhanh vào các tút." filters: contexts: account: Trang hồ sơ - home: Bảng tin + home: Trang chính và danh sách notifications: Thông báo public: Tin công khai thread: Thảo luận @@ -1213,7 +1213,7 @@ vi: delete: Xóa deselect: Bỏ chọn tất cả none: Trống - order_by: Sắp xếp + order_by: Xếp theo save_changes: Lưu thay đổi select_all_matching_items: other: Chọn tất cả%{count} mục trùng hợp với tìm kiếm của bạn. @@ -1409,7 +1409,7 @@ vi: notifications: email_events: Email email_events_hint: 'Chọn những hoạt động sẽ gửi thông báo qua email:' - other_settings: Thông báo khác + other_settings: Chặn thông báo từ number: human: decimal_units: @@ -1469,14 +1469,14 @@ vi: invited: Đã mời last_active: Hoạt động lần cuối most_recent: Mới nhất - moved: Đã xóa + moved: Đã chuyển mutual: Đồng thời - primary: Hoạt động + primary: Còn relationship: Quan hệ remove_selected_domains: Xóa hết người theo dõi từ các máy chủ đã chọn remove_selected_followers: Xóa những người theo dõi đã chọn remove_selected_follows: Bỏ theo dõi những người đã chọn - status: Trạng thái của họ + status: Trạng thái remote_follow: missing_resource: Không tìm thấy URL chuyển hướng cho tài khoản của bạn reports: @@ -1493,7 +1493,7 @@ vi: too_soon: Ngày lên lịch phải trong tương lai sessions: activity: Gần đây nhất - browser: Trình duyệt + browser: Ứng dụng browsers: alipay: Alipay blackberry: BlackBerry @@ -1501,7 +1501,7 @@ vi: edge: Edge electron: Electron firefox: Firefox - generic: Trình duyệt khác + generic: Chưa rõ huawei_browser: Huawei Browser ie: Internet Explorer micro_messenger: MicroMes hành khách @@ -1516,7 +1516,7 @@ vi: weibo: Weibo current_session: Phiên hiện tại description: "%{browser} trên %{platform}" - explanation: Đây là các trình duyệt web đã từng đăng nhập vào tài khoản Mastodon của bạn. + explanation: Đây là các ứng dụng đã từng đăng nhập vào tài khoản Mastodon của bạn. ip: IP platforms: adobe_air: Adobe Air @@ -1645,7 +1645,7 @@ vi: tags: does_not_match_previous_name: không khớp với tên trước themes: - contrast: Mastodon (Độ tương phản cao) + contrast: Mastodon (Tương phản) default: Mastodon (Tối) mastodon-light: Mastodon (Sáng) time: @@ -1741,7 +1741,7 @@ vi: extra_instructions_html: Mẹo: Liên kết trên trang web của bạn có thể ẩn. Phần quan trọng là rel="me" ngăn chặn việc mạo danh trên các trang web có nội dung do người dùng tạo. Bạn thậm chí có thể sử dụng một thẻ link trên header của trang thay vì a, nhưng HTML phải có thể truy cập được mà không cần thực thi JavaScript. here_is_how: Cách thực hiện hint_html: "Xác minh danh tính trên Mastodon là dành cho tất cả mọi người. Dựa trên các tiêu chuẩn web mở, miễn phí bây giờ và mãi mãi. Tất cả những gì bạn cần là một trang web cá nhân để mọi người nhận ra bạn. Khi bạn liên kết đến trang web này từ hồ sơ của mình, chúng tôi sẽ kiểm tra xem trang web đó có liên kết lại với hồ sơ của bạn hay không và hiển thị một chỉ báo trực quan trên đó." - instructions_html: Sao chép và dán mã bên dưới vào HTML của trang web của bạn. Sau đó, thêm địa chỉ trang web của bạn vào một trong các trường bổ sung trên hồ sơ của bạn từ tab "Chỉnh sửa hồ sơ" và lưu các thay đổi. + instructions_html: Sao chép và dán mã bên dưới vào mã nguồn trang web của bạn. Sau đó, thêm địa chỉ trang web của bạn vào một trong các trường metadata trên hồ sơ của bạn từ tab "Sửa hồ sơ" và lưu thay đổi. verification: Xác minh verified_links: Những liên kết bạn đã xác minh webauthn_credentials: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index bed748d81e..2004c3a6c4 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1057,18 +1057,18 @@ zh-CN: with_month_name: "%Y年%m月%d日" datetime: distance_in_words: - about_x_hours: "%{count}时" - about_x_months: "%{count}个月" - about_x_years: "%{count}年" - almost_x_years: "%{count}年" + about_x_hours: "%{count}小时前" + about_x_months: "%{count}个月前" + about_x_years: "%{count}年前" + almost_x_years: "%{count}年前" half_a_minute: 刚刚 - less_than_x_minutes: "%{count}分" + less_than_x_minutes: "%{count}分钟前" less_than_x_seconds: 刚刚 - over_x_years: "%{count}年" - x_days: "%{count}天" - x_minutes: "%{count}分" - x_months: "%{count}个月" - x_seconds: "%{count}秒" + over_x_years: "%{count}年前" + x_days: "%{count}天前" + x_minutes: "%{count}分钟前" + x_months: "%{count}个月前" + x_seconds: "%{count}秒前" deletes: challenge_not_passed: 你输入的信息不正确 confirm_password: 输入你当前的密码来验证身份 From f5778caa3acde205e55df6a8ec00b28a691f8c19 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 14 Aug 2023 17:46:16 +0200 Subject: [PATCH 10/13] Add `ES_PRESET` option to customize numbers of shards and replicas (#26483) Co-authored-by: Eugen Rochko --- app/chewy/accounts_index.rb | 2 +- app/chewy/instances_index.rb | 2 +- app/chewy/statuses_index.rb | 2 +- app/chewy/tags_index.rb | 2 +- config/application.rb | 2 ++ config/initializers/chewy.rb | 8 -------- lib/chewy/index_extensions.rb | 18 ++++++++++++++++++ lib/chewy/settings_extensions.rb | 11 +++++++++++ 8 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 lib/chewy/index_extensions.rb create mode 100644 lib/chewy/settings_extensions.rb diff --git a/app/chewy/accounts_index.rb b/app/chewy/accounts_index.rb index 61f5277d2b..1f8571c09d 100644 --- a/app/chewy/accounts_index.rb +++ b/app/chewy/accounts_index.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class AccountsIndex < Chewy::Index - settings index: { refresh_interval: '30s' }, analysis: { + settings index: index_preset(refresh_interval: '30s'), analysis: { filter: { english_stop: { type: 'stop', diff --git a/app/chewy/instances_index.rb b/app/chewy/instances_index.rb index 2bce4043c9..0d58167dc8 100644 --- a/app/chewy/instances_index.rb +++ b/app/chewy/instances_index.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class InstancesIndex < Chewy::Index - settings index: { refresh_interval: '30s' } + settings index: index_preset(refresh_interval: '30s') index_scope ::Instance.searchable diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index 6dd4fb18b0..9f680efa52 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -3,7 +3,7 @@ class StatusesIndex < Chewy::Index include FormattingHelper - settings index: { refresh_interval: '30s' }, analysis: { + settings index: index_preset(refresh_interval: '30s', number_of_shards: 5), analysis: { filter: { english_stop: { type: 'stop', diff --git a/app/chewy/tags_index.rb b/app/chewy/tags_index.rb index df3d9e4cce..b2d50a000c 100644 --- a/app/chewy/tags_index.rb +++ b/app/chewy/tags_index.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class TagsIndex < Chewy::Index - settings index: { refresh_interval: '30s' }, analysis: { + settings index: index_preset(refresh_interval: '30s'), analysis: { analyzer: { content: { tokenizer: 'keyword', diff --git a/config/application.rb b/config/application.rb index a3bd3dfa4e..372adc1680 100644 --- a/config/application.rb +++ b/config/application.rb @@ -41,6 +41,8 @@ require_relative '../lib/mastodon/rack_middleware' require_relative '../lib/public_file_server_middleware' require_relative '../lib/devise/two_factor_ldap_authenticatable' require_relative '../lib/devise/two_factor_pam_authenticatable' +require_relative '../lib/chewy/settings_extensions' +require_relative '../lib/chewy/index_extensions' require_relative '../lib/chewy/strategy/mastodon' require_relative '../lib/chewy/strategy/bypass_with_warning' require_relative '../lib/webpacker/manifest_extensions' diff --git a/config/initializers/chewy.rb b/config/initializers/chewy.rb index dc90176213..7d51a08457 100644 --- a/config/initializers/chewy.rb +++ b/config/initializers/chewy.rb @@ -25,14 +25,6 @@ Chewy.root_strategy = :bypass_with_warning if Rails.env.production? Chewy.request_strategy = :mastodon Chewy.use_after_commit_callbacks = false -module Chewy - class << self - def enabled? - settings[:enabled] - end - end -end - # Elasticsearch uses Faraday internally. Faraday interprets the # http_proxy env variable by default which leads to issues when # Mastodon is run with hidden services enabled, because diff --git a/lib/chewy/index_extensions.rb b/lib/chewy/index_extensions.rb new file mode 100644 index 0000000000..064fd56b3e --- /dev/null +++ b/lib/chewy/index_extensions.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Chewy + module IndexExtensions + def index_preset(base_options = {}) + case ENV['ES_PRESET'].presence + when 'single_node_cluster', nil + base_options.merge(number_of_replicas: 0) + when 'small_cluster' + base_options.merge(number_of_replicas: 1) + when 'large_cluster' + base_options.merge(number_of_replicas: 1, number_of_shards: (base_options[:number_of_shards] || 1) * 2) + end + end + end +end + +Chewy::Index.extend(Chewy::IndexExtensions) diff --git a/lib/chewy/settings_extensions.rb b/lib/chewy/settings_extensions.rb new file mode 100644 index 0000000000..0eb8b336f3 --- /dev/null +++ b/lib/chewy/settings_extensions.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Chewy + module SettingsExtensions + def enabled? + settings[:enabled] + end + end +end + +Chewy.extend(Chewy::SettingsExtensions) From 3a8370e1f459f5cf9695a610102ae6e53df36714 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 14 Aug 2023 18:47:43 +0200 Subject: [PATCH 11/13] Fix `repo:changelog` task matching strings that are not Pull Request identifiers (#26280) --- lib/tasks/repo.rake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake index 33c454444e..1ed1ee5c32 100644 --- a/lib/tasks/repo.rake +++ b/lib/tasks/repo.rake @@ -49,8 +49,8 @@ namespace :repo do File.open(path, 'r') do |file| file.each_line do |line| if line.start_with?('-') - new_line = line.gsub(/#([[:digit:]]+)*/) do |pull_request_reference| - pull_request_number = pull_request_reference[1..] + new_line = line.gsub(/[(]#([[:digit:]]+)[)]\Z/) do |pull_request_reference| + pull_request_number = pull_request_reference[2..-2] response = nil loop do @@ -66,7 +66,7 @@ namespace :repo do end pull_request = Oj.load(response.to_s) - "[#{pull_request['user']['login']}](#{pull_request['html_url']})" + "([#{pull_request['user']['login']}](#{pull_request['html_url']}))" end tmp.puts new_line From 724d77384415d6bc162b3f9c3846925bd5a79739 Mon Sep 17 00:00:00 2001 From: mogaminsk Date: Mon, 14 Aug 2023 19:04:04 +0900 Subject: [PATCH 12/13] [Glitch] Fix "Create Account" button in interaction modal Port a664e1570242c98abcfd7d74e78473bdb8b85587 to glitch-soc Signed-off-by: Claire --- .../glitch/features/interaction_modal/index.jsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/features/interaction_modal/index.jsx b/app/javascript/flavours/glitch/features/interaction_modal/index.jsx index 3375afde6f..bbfa9af8d4 100644 --- a/app/javascript/flavours/glitch/features/interaction_modal/index.jsx +++ b/app/javascript/flavours/glitch/features/interaction_modal/index.jsx @@ -21,12 +21,16 @@ const messages = defineMessages({ const mapStateToProps = (state, { accountId }) => ({ displayNameHtml: state.getIn(['accounts', accountId, 'display_name_html']), + signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up', }); const mapDispatchToProps = (dispatch) => ({ onSignupClick() { - dispatch(closeModal()); - dispatch(openModal('CLOSED_REGISTRATIONS')); + dispatch(closeModal({ + modalType: undefined, + ignoreFocus: false, + })); + dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' })); }, }); @@ -294,6 +298,7 @@ class InteractionModal extends React.PureComponent { url: PropTypes.string, type: PropTypes.oneOf(['reply', 'reblog', 'favourite', 'follow']), onSignupClick: PropTypes.func.isRequired, + signupUrl: PropTypes.string.isRequired, }; handleSignupClick = () => { @@ -301,7 +306,7 @@ class InteractionModal extends React.PureComponent { }; render () { - const { url, type, displayNameHtml } = this.props; + const { url, type, displayNameHtml, signupUrl } = this.props; const name = ; @@ -340,7 +345,7 @@ class InteractionModal extends React.PureComponent { ); } else if (registrationsOpen) { signupButton = ( - + ); From 128daefc7af64cf23b3968075d45351c6d95398a Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 22 Aug 2023 18:24:03 +0200 Subject: [PATCH 13/13] Remove leftover `.orig` files that were mistakenly included (#2379) --- .../glitch/features/status/index.jsx.orig | 761 --------- .../glitch/styles/components/modal.scss.orig | 1425 ----------------- 2 files changed, 2186 deletions(-) delete mode 100644 app/javascript/flavours/glitch/features/status/index.jsx.orig delete mode 100644 app/javascript/flavours/glitch/styles/components/modal.scss.orig diff --git a/app/javascript/flavours/glitch/features/status/index.jsx.orig b/app/javascript/flavours/glitch/features/status/index.jsx.orig deleted file mode 100644 index d35b3a522a..0000000000 --- a/app/javascript/flavours/glitch/features/status/index.jsx.orig +++ /dev/null @@ -1,761 +0,0 @@ -import PropTypes from 'prop-types'; - -import { defineMessages, injectIntl } from 'react-intl'; - -import classNames from 'classnames'; -import { Helmet } from 'react-helmet'; - -import Immutable from 'immutable'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; - -import { HotKeys } from 'react-hotkeys'; - -import { initBlockModal } from 'flavours/glitch/actions/blocks'; -import { initBoostModal } from 'flavours/glitch/actions/boosts'; -import { - replyCompose, - mentionCompose, - directCompose, -} from 'flavours/glitch/actions/compose'; -import { - favourite, - unfavourite, - bookmark, - unbookmark, - reblog, - unreblog, - pin, - unpin, -} from 'flavours/glitch/actions/interactions'; -import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; -import { openModal } from 'flavours/glitch/actions/modal'; -import { initMuteModal } from 'flavours/glitch/actions/mutes'; -import { initReport } from 'flavours/glitch/actions/reports'; -import { - fetchStatus, - muteStatus, - unmuteStatus, - deleteStatus, - editStatus, - hideStatus, - revealStatus, - translateStatus, - undoStatusTranslation, -} from 'flavours/glitch/actions/statuses'; -import { Icon } from 'flavours/glitch/components/icon'; -import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; -import { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/components/status'; -import ScrollContainer from 'flavours/glitch/containers/scroll_container'; -import StatusContainer from 'flavours/glitch/containers/status_container'; -import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error'; -import Column from 'flavours/glitch/features/ui/components/column'; -import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/initial_state'; -import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors'; -import { autoUnfoldCW } from 'flavours/glitch/utils/content_warning'; - -import ColumnHeader from '../../components/column_header'; -import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen'; - -import ActionBar from './components/action_bar'; -import DetailedStatus from './components/detailed_status'; - -const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, - revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, - hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, - statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' }, - detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, - tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' }, -}); - -const makeMapStateToProps = () => { - const getStatus = makeGetStatus(); - const getPictureInPicture = makeGetPictureInPicture(); - - const getAncestorsIds = createSelector([ - (_, { id }) => id, - state => state.getIn(['contexts', 'inReplyTos']), - ], (statusId, inReplyTos) => { - let ancestorsIds = Immutable.List(); - ancestorsIds = ancestorsIds.withMutations(mutable => { - let id = statusId; - - while (id && !mutable.includes(id)) { - mutable.unshift(id); - id = inReplyTos.get(id); - } - }); - - return ancestorsIds; - }); - - const getDescendantsIds = createSelector([ - (_, { id }) => id, - state => state.getIn(['contexts', 'replies']), - state => state.get('statuses'), - ], (statusId, contextReplies, statuses) => { - let descendantsIds = []; - const ids = [statusId]; - - while (ids.length > 0) { - let id = ids.pop(); - const replies = contextReplies.get(id); - - if (statusId !== id) { - descendantsIds.push(id); - } - - if (replies) { - replies.reverse().forEach(reply => { - if (!ids.includes(reply) && !descendantsIds.includes(reply) && statusId !== reply) ids.push(reply); - }); - } - } - - let insertAt = descendantsIds.findIndex((id) => statuses.get(id).get('in_reply_to_account_id') !== statuses.get(id).get('account')); - if (insertAt !== -1) { - descendantsIds.forEach((id, idx) => { - if (idx > insertAt && statuses.get(id).get('in_reply_to_account_id') === statuses.get(id).get('account')) { - descendantsIds.splice(idx, 1); - descendantsIds.splice(insertAt, 0, id); - insertAt += 1; - } - }); - } - - return Immutable.List(descendantsIds); - }); - - const mapStateToProps = (state, props) => { - const status = getStatus(state, { id: props.params.statusId }); - - let ancestorsIds = Immutable.List(); - let descendantsIds = Immutable.List(); - - if (status) { - ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') }); - descendantsIds = getDescendantsIds(state, { id: status.get('id') }); - } - - return { - isLoading: state.getIn(['statuses', props.params.statusId, 'isLoading']), - status, - ancestorsIds, - descendantsIds, - settings: state.get('local_settings'), - askReplyConfirmation: state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0, - domain: state.getIn(['meta', 'domain']), - pictureInPicture: getPictureInPicture(state, { id: props.params.statusId }), - }; - }; - - return mapStateToProps; -}; - -const truncate = (str, num) => { - const arr = Array.from(str); - if (arr.length > num) { - return arr.slice(0, num).join('') + '…'; - } else { - return str; - } -}; - -const titleFromStatus = (intl, status) => { - const displayName = status.getIn(['account', 'display_name']); - const username = status.getIn(['account', 'username']); - const user = displayName.trim().length === 0 ? username : displayName; - const text = status.get('search_index'); - const attachmentCount = status.get('media_attachments').size; - - return text ? `${user}: "${truncate(text, 30)}"` : intl.formatMessage(messages.statusTitleWithAttachments, { user, attachmentCount }); -}; - -class Status extends ImmutablePureComponent { - - static contextTypes = { - router: PropTypes.object, - identity: PropTypes.object, - }; - - static propTypes = { - params: PropTypes.object.isRequired, - dispatch: PropTypes.func.isRequired, - status: ImmutablePropTypes.map, - isLoading: PropTypes.bool, - settings: ImmutablePropTypes.map.isRequired, - ancestorsIds: ImmutablePropTypes.list.isRequired, - descendantsIds: ImmutablePropTypes.list.isRequired, - intl: PropTypes.object.isRequired, - askReplyConfirmation: PropTypes.bool, - multiColumn: PropTypes.bool, - domain: PropTypes.string.isRequired, - pictureInPicture: ImmutablePropTypes.contains({ - inUse: PropTypes.bool, - available: PropTypes.bool, - }), - }; - - state = { - fullscreen: false, - isExpanded: undefined, - threadExpanded: undefined, - statusId: undefined, - loadedStatusId: undefined, - showMedia: undefined, - revealBehindCW: undefined, - }; - - componentDidMount () { - attachFullscreenListener(this.onFullScreenChange); - this.props.dispatch(fetchStatus(this.props.params.statusId)); - } - - static getDerivedStateFromProps(props, state) { - let update = {}; - let updated = false; - - if (props.params.statusId && state.statusId !== props.params.statusId) { - props.dispatch(fetchStatus(props.params.statusId)); - update.threadExpanded = undefined; - update.statusId = props.params.statusId; - updated = true; - } - - const revealBehindCW = props.settings.getIn(['media', 'reveal_behind_cw']); - if (revealBehindCW !== state.revealBehindCW) { - update.revealBehindCW = revealBehindCW; - if (revealBehindCW) update.showMedia = defaultMediaVisibility(props.status, props.settings); - updated = true; - } - - if (props.status && state.loadedStatusId !== props.status.get('id')) { - update.showMedia = defaultMediaVisibility(props.status, props.settings); - update.loadedStatusId = props.status.get('id'); - update.isExpanded = autoUnfoldCW(props.settings, props.status); - updated = true; - } - - return updated ? update : null; - } - - handleToggleHidden = () => { - const { status } = this.props; - - if (this.props.settings.getIn(['content_warnings', 'shared_state'])) { - if (status.get('hidden')) { - this.props.dispatch(revealStatus(status.get('id'))); - } else { - this.props.dispatch(hideStatus(status.get('id'))); - } - } else if (this.props.status.get('spoiler_text')) { - this.setExpansion(!this.state.isExpanded); - } - }; - - handleToggleMediaVisibility = () => { - this.setState({ showMedia: !this.state.showMedia }); - }; - - handleModalFavourite = (status) => { - this.props.dispatch(favourite(status)); - }; - - handleFavouriteClick = (status, e) => { - const { dispatch } = this.props; - const { signedIn } = this.context.identity; - - if (signedIn) { - if (status.get('favourited')) { - dispatch(unfavourite(status)); - } else { - if ((e && e.shiftKey) || !favouriteModal) { - this.handleModalFavourite(status); - } else { - dispatch(openModal({ - modalType: 'FAVOURITE', - modalProps: { - status, - onFavourite: this.handleModalFavourite, - }, - })); - } - } - } else { - dispatch(openModal({ - modalType: 'INTERACTION', - modalProps: { - type: 'favourite', - accountId: status.getIn(['account', 'id']), - url: status.get('url'), - }, - })); - } - }; - - handlePin = (status) => { - if (status.get('pinned')) { - this.props.dispatch(unpin(status)); - } else { - this.props.dispatch(pin(status)); - } - }; - - handleReplyClick = (status) => { - const { askReplyConfirmation, dispatch, intl } = this.props; - const { signedIn } = this.context.identity; - - if (signedIn) { - if (askReplyConfirmation) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)), - onConfirm: () => dispatch(replyCompose(status, this.context.router.history)), - }, - })); - } else { - dispatch(replyCompose(status, this.context.router.history)); - } - } else { - dispatch(openModal({ - modalType: 'INTERACTION', - modalProps: { - type: 'reply', - accountId: status.getIn(['account', 'id']), - url: status.get('url'), - }, - })); - } - }; - - handleModalReblog = (status, privacy) => { - const { dispatch } = this.props; - - if (status.get('reblogged')) { - dispatch(unreblog(status)); - } else { - dispatch(reblog(status, privacy)); - } - }; - - handleReblogClick = (status, e) => { - const { settings, dispatch } = this.props; - const { signedIn } = this.context.identity; - - if (signedIn) { - if (settings.get('confirm_boost_missing_media_description') && status.get('media_attachments').some(item => !item.get('description')) && !status.get('reblogged')) { - dispatch(initBoostModal({ status, onReblog: this.handleModalReblog, missingMediaDescription: true })); - } else if ((e && e.shiftKey) || !boostModal) { - this.handleModalReblog(status); - } else { - dispatch(initBoostModal({ status, onReblog: this.handleModalReblog })); - } - } else { - dispatch(openModal({ - modalType: 'INTERACTION', - modalProps: { - type: 'reblog', - accountId: status.getIn(['account', 'id']), - url: status.get('url'), - }, - })); - } - }; - - handleBookmarkClick = (status) => { - if (status.get('bookmarked')) { - this.props.dispatch(unbookmark(status)); - } else { - this.props.dispatch(bookmark(status)); - } - }; - - handleDeleteClick = (status, history, withRedraft = false) => { - const { dispatch, intl } = this.props; - - if (!deleteModal) { - dispatch(deleteStatus(status.get('id'), history, withRedraft)); - } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)), - }, - })); - } - }; - - handleEditClick = (status, history) => { - this.props.dispatch(editStatus(status.get('id'), history)); - }; - - handleDirectClick = (account, router) => { - this.props.dispatch(directCompose(account, router)); - }; - - handleMentionClick = (account, router) => { - this.props.dispatch(mentionCompose(account, router)); - }; - - handleOpenMedia = (media, index, lang) => { - this.props.dispatch(openModal({ - modalType: 'MEDIA', - modalProps: { statusId: this.props.status.get('id'), media, index, lang }, - })); - }; - - handleOpenVideo = (media, lang, options) => { - this.props.dispatch(openModal({ - modalType: 'VIDEO', - modalProps: { statusId: this.props.status.get('id'), media, lang, options }, - })); - }; - - handleHotkeyOpenMedia = e => { - const { status } = this.props; - - e.preventDefault(); - - if (status.get('media_attachments').size > 0) { - if (status.getIn(['media_attachments', 0, 'type']) === 'video') { - this.handleOpenVideo(status.getIn(['media_attachments', 0]), { startTime: 0 }); - } else { - this.handleOpenMedia(status.get('media_attachments'), 0); - } - } - }; - - handleMuteClick = (account) => { - this.props.dispatch(initMuteModal(account)); - }; - - handleConversationMuteClick = (status) => { - if (status.get('muted')) { - this.props.dispatch(unmuteStatus(status.get('id'))); - } else { - this.props.dispatch(muteStatus(status.get('id'))); - } - }; - - handleToggleAll = () => { - const { status, ancestorsIds, descendantsIds, settings } = this.props; - const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS()); - let { isExpanded } = this.state; - - if (settings.getIn(['content_warnings', 'shared_state'])) - isExpanded = !status.get('hidden'); - - if (!isExpanded) { - this.props.dispatch(revealStatus(statusIds)); - } else { - this.props.dispatch(hideStatus(statusIds)); - } - - this.setState({ isExpanded: !isExpanded, threadExpanded: !isExpanded }); - }; - - handleTranslate = status => { - const { dispatch } = this.props; - - if (status.get('translation')) { - dispatch(undoStatusTranslation(status.get('id'), status.get('poll'))); - } else { - dispatch(translateStatus(status.get('id'))); - } - }; - - handleBlockClick = (status) => { - const { dispatch } = this.props; - const account = status.get('account'); - dispatch(initBlockModal(account)); - }; - - handleReport = (status) => { - this.props.dispatch(initReport(status.get('account'), status)); - }; - - handleEmbed = (status) => { - this.props.dispatch(openModal({ - modalType: 'EMBED', - modalProps: { id: status.get('id') }, - })); - }; - - handleHotkeyToggleSensitive = () => { - this.handleToggleMediaVisibility(); - }; - - handleHotkeyMoveUp = () => { - this.handleMoveUp(this.props.status.get('id')); - }; - - handleHotkeyMoveDown = () => { - this.handleMoveDown(this.props.status.get('id')); - }; - - handleHotkeyReply = e => { - e.preventDefault(); - this.handleReplyClick(this.props.status); - }; - - handleHotkeyFavourite = () => { - this.handleFavouriteClick(this.props.status); - }; - - handleHotkeyBoost = () => { - this.handleReblogClick(this.props.status); - }; - - handleHotkeyBookmark = () => { - this.handleBookmarkClick(this.props.status); - }; - - handleHotkeyMention = e => { - e.preventDefault(); - this.handleMentionClick(this.props.status); - }; - - handleHotkeyOpenProfile = () => { - this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`); - }; - - handleMoveUp = id => { - const { status, ancestorsIds, descendantsIds } = this.props; - - if (id === status.get('id')) { - this._selectChild(ancestorsIds.size - 1, true); - } else { - let index = ancestorsIds.indexOf(id); - - if (index === -1) { - index = descendantsIds.indexOf(id); - this._selectChild(ancestorsIds.size + index, true); - } else { - this._selectChild(index - 1, true); - } - } - }; - - handleMoveDown = id => { - const { status, ancestorsIds, descendantsIds } = this.props; - - if (id === status.get('id')) { - this._selectChild(ancestorsIds.size + 1, false); - } else { - let index = ancestorsIds.indexOf(id); - - if (index === -1) { - index = descendantsIds.indexOf(id); - this._selectChild(ancestorsIds.size + index + 2, false); - } else { - this._selectChild(index + 1, false); - } - } - }; - - _selectChild (index, align_top) { - const container = this.node; - const element = container.querySelectorAll('.focusable')[index]; - - if (element) { - if (align_top && container.scrollTop > element.offsetTop) { - element.scrollIntoView(true); - } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) { - element.scrollIntoView(false); - } - element.focus(); - } - } - - handleHeaderClick = () => { - this.column.scrollTop(); - }; - - renderChildren (list, ancestors) { - const { params: { statusId } } = this.props; - - return list.map((id, i) => ( - 0 && list.get(i - 1)} - nextId={list.get(i + 1) || (ancestors && statusId)} - rootId={statusId} - /> - )); - } - - setExpansion = value => { - this.setState({ isExpanded: value }); - }; - - setRef = c => { - this.node = c; - }; - - setColumnRef = c => { - this.column = c; - }; - - componentDidUpdate (prevProps) { - const { status, ancestorsIds, multiColumn } = this.props; - - if (status && (ancestorsIds.size > prevProps.ancestorsIds.size || prevProps.status?.get('id') !== status.get('id'))) { - window.requestAnimationFrame(() => { - this.node?.querySelector('.detailed-status__wrapper')?.scrollIntoView(true); - - // In the single-column interface, `scrollIntoView` will put the post behind the header, - // so compensate for that. - if (!multiColumn) { - const offset = document.querySelector('.column-header__wrapper')?.getBoundingClientRect()?.bottom; - if (offset) { - const scrollingElement = document.scrollingElement || document.body; - scrollingElement.scrollBy(0, -offset); - } - } - }); - } - } - - componentWillUnmount () { - detachFullscreenListener(this.onFullScreenChange); - } - - onFullScreenChange = () => { - this.setState({ fullscreen: isFullscreen() }); - }; - - render () { - let ancestors, descendants; - const { isLoading, status, settings, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props; - const { fullscreen } = this.state; - - if (isLoading) { - return ( - - - - ); - } - - if (status === null) { - return ( - - ); - } - - const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded; - - if (ancestorsIds && ancestorsIds.size > 0) { - ancestors = <>{this.renderChildren(ancestorsIds, true)}; - } - - if (descendantsIds && descendantsIds.size > 0) { - descendants = <>{this.renderChildren(descendantsIds)}; - } - - const isLocal = status.getIn(['account', 'acct'], '').indexOf('@') === -1; - const isIndexable = !status.getIn(['account', 'noindex']); - - const handlers = { - moveUp: this.handleHotkeyMoveUp, - moveDown: this.handleHotkeyMoveDown, - reply: this.handleHotkeyReply, - favourite: this.handleHotkeyFavourite, - boost: this.handleHotkeyBoost, - bookmark: this.handleHotkeyBookmark, - mention: this.handleHotkeyMention, - openProfile: this.handleHotkeyOpenProfile, - toggleSpoiler: this.handleToggleHidden, - toggleSensitive: this.handleHotkeyToggleSensitive, - openMedia: this.handleHotkeyOpenMedia, - }; - - return ( - - - )} - /> - - -
- {ancestors} - - -
- - - -
-
- - {descendants} -
-
- - - {titleFromStatus(intl, status)} - - - -
- ); - } - -} - -export default injectIntl(connect(makeMapStateToProps)(Status)); diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss.orig b/app/javascript/flavours/glitch/styles/components/modal.scss.orig deleted file mode 100644 index 49173e1ee8..0000000000 --- a/app/javascript/flavours/glitch/styles/components/modal.scss.orig +++ /dev/null @@ -1,1425 +0,0 @@ -.modal-container--preloader { - background: lighten($ui-base-color, 8%); -} - -.modal-root { - position: relative; - z-index: 9999; -} - -.modal-root__overlay { - position: fixed; - top: 0; - inset-inline-start: 0; - inset-inline-end: 0; - bottom: 0; - background: rgba($base-overlay-background, 0.7); - transition: background 0.5s; -} - -.modal-root__container { - position: fixed; - top: 0; - inset-inline-start: 0; - width: 100%; - height: 100%; - box-sizing: border-box; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - align-content: space-around; - z-index: 9999; - pointer-events: none; - user-select: none; -} - -.modal-root__modal { - pointer-events: auto; - display: flex; -} - -.media-modal__zoom-button { - position: absolute; - inset-inline-end: 64px; - top: 8px; - z-index: 100; - pointer-events: auto; - transition: opacity 0.3s linear; - will-change: opacity; -} - -.media-modal__zoom-button--hidden { - pointer-events: none; - opacity: 0; -} - -.onboarding-modal, -.error-modal, -.embed-modal { - background: $ui-secondary-color; - color: $inverted-text-color; - border-radius: 8px; - overflow: hidden; - display: flex; - flex-direction: column; -} - -.onboarding-modal__pager { - height: 80vh; - width: 80vw; - max-width: 520px; - max-height: 470px; - - .react-swipeable-view-container > div { - width: 100%; - height: 100%; - box-sizing: border-box; - flex-direction: column; - align-items: center; - justify-content: center; - display: flex; - user-select: text; - } -} - -.error-modal__body { - height: 80vh; - width: 80vw; - max-width: 520px; - max-height: 420px; - position: relative; - - & > div { - position: absolute; - top: 0; - inset-inline-start: 0; - width: 100%; - height: 100%; - box-sizing: border-box; - padding: 25px; - flex-direction: column; - align-items: center; - justify-content: center; - display: flex; - opacity: 0; - user-select: text; - } -} - -.error-modal__body { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - text-align: center; -} - -@media screen and (width <= 550px) { - .onboarding-modal { - width: 100%; - height: 100%; - border-radius: 0; - } - - .onboarding-modal__pager { - width: 100%; - height: auto; - max-width: none; - max-height: none; - flex: 1 1 auto; - } -} - -.onboarding-modal__paginator, -.error-modal__footer { - flex: 0 0 auto; - background: darken($ui-secondary-color, 8%); - display: flex; - padding: 25px; - - & > div { - min-width: 33px; - } - - .onboarding-modal__nav, - .error-modal__nav { - color: $lighter-text-color; - border: 0; - font-size: 14px; - font-weight: 500; - padding: 10px 25px; - line-height: inherit; - height: auto; - margin: -10px; - border-radius: 4px; - background-color: transparent; - - &:hover, - &:focus, - &:active { - color: darken($lighter-text-color, 4%); - background-color: darken($ui-secondary-color, 16%); - } - - &.onboarding-modal__done, - &.onboarding-modal__next { - color: $inverted-text-color; - - &:hover, - &:focus, - &:active { - color: lighten($inverted-text-color, 4%); - } - } - } -} - -.error-modal__footer { - justify-content: center; -} - -.onboarding-modal__dots { - flex: 1 1 auto; - display: flex; - align-items: center; - justify-content: center; -} - -.onboarding-modal__dot { - width: 14px; - height: 14px; - border-radius: 14px; - background: darken($ui-secondary-color, 16%); - margin: 0 3px; - cursor: pointer; - - &:hover { - background: darken($ui-secondary-color, 18%); - } - - &.active { - cursor: default; - background: darken($ui-secondary-color, 24%); - } -} - -.onboarding-modal__page__wrapper { - pointer-events: none; - padding: 25px; - padding-bottom: 0; - - &.onboarding-modal__page__wrapper--active { - pointer-events: auto; - } -} - -.onboarding-modal__page { - cursor: default; - line-height: 21px; - - h1 { - font-size: 18px; - font-weight: 500; - color: $inverted-text-color; - margin-bottom: 20px; - } - - a { - color: $highlight-text-color; - - &:hover, - &:focus, - &:active { - color: lighten($highlight-text-color, 4%); - } - } - - .navigation-bar a { - color: inherit; - } - - p { - font-size: 16px; - color: $lighter-text-color; - margin-top: 10px; - margin-bottom: 10px; - - &:last-child { - margin-bottom: 0; - } - - strong { - font-weight: 500; - background: $ui-base-color; - color: $secondary-text-color; - border-radius: 4px; - font-size: 14px; - padding: 3px 6px; - - @each $lang in $cjk-langs { - &:lang(#{$lang}) { - font-weight: 700; - } - } - } - } -} - -.onboarding-modal__page__wrapper-0 { - background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / - auto 250px; - height: 100%; - padding: 0; -} - -.onboarding-modal__page-one { - &__lead { - padding: 65px; - padding-top: 45px; - padding-bottom: 0; - margin-bottom: 10px; - - h1 { - font-size: 26px; - line-height: 36px; - margin-bottom: 8px; - } - - p { - margin-bottom: 0; - } - } - - &__extra { - padding-inline-end: 65px; - padding-inline-start: 185px; - text-align: center; - } -} - -.display-case { - text-align: center; - font-size: 15px; - margin-bottom: 15px; - - &__label { - font-weight: 500; - color: $inverted-text-color; - margin-bottom: 5px; - text-transform: uppercase; - font-size: 12px; - } - - &__case { - background: $ui-base-color; - color: $secondary-text-color; - font-weight: 500; - padding: 10px; - border-radius: 4px; - } -} - -.onboarding-modal__page-two, -.onboarding-modal__page-three, -.onboarding-modal__page-four, -.onboarding-modal__page-five { - p { - text-align: start; - } - - .figure { - background: darken($ui-base-color, 8%); - color: $secondary-text-color; - margin-bottom: 20px; - border-radius: 4px; - padding: 10px; - text-align: center; - font-size: 14px; - box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3); - - .onboarding-modal__image { - border-radius: 4px; - margin-bottom: 10px; - } - - &.non-interactive { - pointer-events: none; - text-align: start; - } - } -} - -.onboarding-modal__page-four__columns { - .row { - display: flex; - margin-bottom: 20px; - - & > div { - flex: 1 1 0; - margin: 0 10px; - - &:first-child { - margin-inline-start: 0; - } - - &:last-child { - margin-inline-end: 0; - } - - p { - text-align: center; - } - } - - &:last-child { - margin-bottom: 0; - } - } - - .column-header { - color: $primary-text-color; - } -} - -@media screen and (width <= 320px) and (height <= 600px) { - .onboarding-modal__page p { - font-size: 14px; - line-height: 20px; - } - - .onboarding-modal__page-two .figure, - .onboarding-modal__page-three .figure, - .onboarding-modal__page-four .figure, - .onboarding-modal__page-five .figure { - font-size: 12px; - margin-bottom: 10px; - } - - .onboarding-modal__page-four__columns .row { - margin-bottom: 10px; - } - - .onboarding-modal__page-four__columns .column-header { - padding: 5px; - font-size: 12px; - } -} - -.onboard-sliders { - display: inline-block; - max-width: 30px; - max-height: auto; - margin-inline-start: 10px; -} - -.doodle-modal, -.boost-modal, -.confirmation-modal, -.report-modal, -.actions-modal, -.mute-modal, -.block-modal, -.compare-history-modal { - background: lighten($ui-secondary-color, 8%); - color: $inverted-text-color; - border-radius: 8px; - overflow: hidden; - max-width: 90vw; - width: 480px; - position: relative; - flex-direction: column; - - .status__relative-time { - color: $dark-text-color; - float: right; - font-size: 14px; - width: auto; - margin: initial; - padding: initial; - } - - .status__visibility-icon { - color: $dark-text-color; - font-size: 14px; - padding: 0 4px; - } - - .status__display-name { - display: flex; - } - - .status__avatar { - height: 48px; - width: 48px; - } - - .status__content__spoiler-link { - color: lighten($secondary-text-color, 8%); - } -} - -.boost-modal .status-direct { - background-color: inherit; -} - -.actions-modal { - .status { - background: $white; - border-bottom-color: $ui-secondary-color; - padding-top: 10px; - padding-bottom: 10px; - } - - .dropdown-menu__separator { - border-bottom-color: $ui-secondary-color; - } -} - -.boost-modal__container { - overflow-x: scroll; - padding: 10px; - - .status { - user-select: text; - border-bottom: 0; - } -} - -.doodle-modal__action-bar, -.boost-modal__action-bar, -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { - display: flex; - justify-content: space-between; - background: $ui-secondary-color; - padding: 10px; - line-height: 36px; - - & > div { - flex: 1 1 auto; - text-align: end; - color: $lighter-text-color; - padding-inline-end: 10px; - } - - .button { - flex: 0 0 auto; - } -} - -.boost-modal__status-header { - font-size: 15px; -} - -.boost-modal__status-time { - float: right; - font-size: 14px; -} - -.mute-modal, -.block-modal { - line-height: 24px; -} - -.mute-modal .react-toggle, -.block-modal .react-toggle { - vertical-align: middle; -} - -.report-modal { - width: 90vw; - max-width: 700px; -} - -.report-dialog-modal { - max-width: 90vw; - width: 480px; - height: 80vh; - background: lighten($ui-secondary-color, 8%); - color: $inverted-text-color; - border-radius: 8px; - overflow: hidden; - position: relative; - flex-direction: column; - display: flex; - - &__container { - box-sizing: border-box; - border-top: 1px solid $ui-secondary-color; - padding: 20px; - flex-grow: 1; - display: flex; - flex-direction: column; - min-height: 0; - overflow: auto; - } - - &__title { - font-size: 28px; - line-height: 33px; - font-weight: 700; - margin-bottom: 15px; - - @media screen and (height <= 800px) { - font-size: 22px; - } - } - - &__subtitle { - font-size: 17px; - font-weight: 600; - line-height: 22px; - margin-bottom: 4px; - } - - &__lead { - font-size: 17px; - line-height: 22px; - color: lighten($inverted-text-color, 16%); - margin-bottom: 30px; - - a { - text-decoration: none; - color: $inverted-text-color; - font-weight: 500; - - &:hover { - text-decoration: underline; - } - } - } - - &__actions { - margin-top: 30px; - display: flex; - - .button { - flex: 1 1 auto; - } - } - - &__statuses { - flex-grow: 1; - min-height: 0; - overflow: auto; - } - - .status__content a { - color: $highlight-text-color; - } - - .status__content, - .status__content p { - color: $inverted-text-color; - } - - .status__content__spoiler-link { - color: $primary-text-color; - background: $ui-primary-color; - - &:hover { - background: lighten($ui-primary-color, 8%); - } - } - - .dialog-option .poll__input { - border-color: $inverted-text-color; - color: $ui-secondary-color; - display: inline-flex; - align-items: center; - justify-content: center; - - svg { - width: 8px; - height: auto; - } - - &:active, - &:focus, - &:hover { - border-color: lighten($inverted-text-color, 15%); - border-width: 4px; - } - - &.active { - border-color: $inverted-text-color; - background: $inverted-text-color; - } - } - - .poll__option.dialog-option { - padding: 15px 0; - flex: 0 0 auto; - border-bottom: 1px solid $ui-secondary-color; - - &:last-child { - border-bottom: 0; - } - - & > .poll__option__text { - font-size: 13px; - color: lighten($inverted-text-color, 16%); - - strong { - font-size: 17px; - font-weight: 500; - line-height: 22px; - color: $inverted-text-color; - display: block; - margin-bottom: 4px; - - &:last-child { - margin-bottom: 0; - } - } - } - } - - .flex-spacer { - background: transparent; - } - - &__textarea { - display: block; - box-sizing: border-box; - width: 100%; - color: $inverted-text-color; - background: $simple-background-color; - padding: 10px; - font-family: inherit; - font-size: 17px; - line-height: 22px; - resize: vertical; - border: 0; - outline: 0; - border-radius: 4px; - margin: 20px 0; - - &::placeholder { - color: $dark-text-color; - } - - &:focus { - outline: 0; - } - } - - &__toggle { - display: flex; - align-items: center; - margin-bottom: 10px; - - & > span { - font-size: 17px; - font-weight: 500; - margin-inline-start: 10px; - } - } - - .button.button-secondary { - border-color: $ui-button-secondary-border-color; - color: $ui-button-secondary-color; - flex: 0 0 auto; - - &:hover, - &:focus, - &:active { - border-color: $ui-button-secondary-focus-background-color; - color: $ui-button-secondary-focus-color; - } - } - - hr { - border: 0; - background: transparent; - margin: 15px 0; - } - - .emoji-mart-search { - padding-inline-end: 10px; - } - - .emoji-mart-search-icon { - inset-inline-end: 10px + 5px; - } -} - -.report-modal__container { - display: flex; - border-top: 1px solid $ui-secondary-color; - - @media screen and (width <= 480px) { - flex-wrap: wrap; - overflow-y: auto; - } -} - -.report-modal__statuses, -.report-modal__comment { - box-sizing: border-box; - width: 50%; - - @media screen and (width <= 480px) { - width: 100%; - } -} - -.report-modal__statuses, -.focal-point-modal__content { - flex: 1 1 auto; - min-height: 20vh; - max-height: 80vh; - overflow-y: auto; - overflow-x: hidden; - - .status__content a { - color: $highlight-text-color; - } - - @media screen and (width <= 480px) { - max-height: 10vh; - } -} - -.focal-point-modal__content { - @media screen and (width <= 480px) { - max-height: 40vh; - } -} - -.setting-divider { - background: transparent; - border: 0; - margin: 0; - width: 100%; - height: 1px; - margin-bottom: 29px; -} - -.report-modal__comment { - padding: 20px; - border-inline-end: 1px solid $ui-secondary-color; - max-width: 320px; - - p { - font-size: 14px; - line-height: 20px; - margin-bottom: 20px; - } - - .setting-text { - display: block; - box-sizing: border-box; - width: 100%; - margin: 0; - color: $inverted-text-color; - background: $white; - padding: 10px; - font-family: inherit; - font-size: 14px; - resize: none; - outline: 0; - border-radius: 4px; - border: 1px solid $ui-secondary-color; - min-height: 100px; - max-height: 50vh; - margin-bottom: 10px; - - &:focus { - border: 1px solid darken($ui-secondary-color, 8%); - } - - &__wrapper { - background: $white; - border: 1px solid $ui-secondary-color; - margin-bottom: 10px; - border-radius: 4px; - - .setting-text { - border: 0; - margin-bottom: 0; - border-radius: 0; - - &:focus { - border: 0; - } - } - - &__modifiers { - color: $inverted-text-color; - font-family: inherit; - font-size: 14px; - background: $white; - } - } - - &__toolbar { - display: flex; - justify-content: space-between; - margin-bottom: 20px; - } - } - - .setting-text-label { - display: block; - color: $inverted-text-color; - font-size: 14px; - font-weight: 500; - margin-bottom: 10px; - } - - .setting-toggle { - margin-top: 20px; - margin-bottom: 24px; - - &__label { - color: $inverted-text-color; - font-size: 14px; - } - } - - @media screen and (width <= 480px) { - padding: 10px; - max-width: 100%; - order: 2; - - .setting-toggle { - margin-bottom: 4px; - } - } -} - -.actions-modal { - .status { - overflow-y: auto; - max-height: 300px; - } - - strong { - display: block; - font-weight: 500; - } - - max-height: 80vh; - max-width: 80vw; - - .actions-modal__item-label { - font-weight: 500; - } - - ul { - overflow-y: auto; - flex-shrink: 0; - max-height: 80vh; - - &.with-status { - max-height: calc(80vh - 75px); - } - - li:empty { - margin: 0; - } - - li:not(:empty) { - a { - color: $inverted-text-color; - display: flex; - padding: 12px 16px; - font-size: 15px; - align-items: center; - text-decoration: none; - - &, - button { - transition: none; - } - - &.active, - &:hover, - &:active, - &:focus { - &, - button { - background: $ui-highlight-color; - color: $primary-text-color; - } - } - - & > .react-toggle, - & > .icon, - button:first-child { - margin-inline-end: 10px; - } - } - } - } -} - -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { - .confirmation-modal__secondary-button { - flex-shrink: 1; - } -} - -.confirmation-modal__secondary-button, -.confirmation-modal__cancel-button, -.mute-modal__cancel-button, -.block-modal__cancel-button { - background-color: transparent; - color: $lighter-text-color; - font-size: 14px; - font-weight: 500; - - &:hover, - &:focus, - &:active { - color: darken($lighter-text-color, 4%); - background-color: transparent; - } -} - -.confirmation-modal__do_not_ask_again { - padding-inline-start: 20px; - padding-inline-end: 20px; - padding-bottom: 10px; - font-size: 14px; - - label, - input { - vertical-align: middle; - } -} - -.confirmation-modal__container, -.mute-modal__container, -.block-modal__container, -.report-modal__target { - padding: 30px; - font-size: 16px; - - strong { - font-weight: 500; - - @each $lang in $cjk-langs { - &:lang(#{$lang}) { - font-weight: 700; - } - } - } - - select { - appearance: none; - box-sizing: border-box; - font-size: 14px; - color: $inverted-text-color; - display: inline-block; - width: auto; - outline: 0; - font-family: inherit; - background: $simple-background-color - url("data:image/svg+xml;utf8,") - no-repeat right 8px center / auto 16px; - border: 1px solid darken($simple-background-color, 14%); - border-radius: 4px; - padding: 6px 10px; - padding-inline-end: 30px; - } -} - -.confirmation-modal__container, -.report-modal__target { - text-align: center; -} - -.block-modal, -.mute-modal { - &__explanation { - margin-top: 20px; - } - - .setting-toggle { - margin-top: 20px; - margin-bottom: 24px; - display: flex; - align-items: center; - - &__label { - color: $inverted-text-color; - margin: 0; - margin-inline-start: 8px; - } - } -} - -.report-modal__target { - padding: 15px; - - .report-modal__close { - position: absolute; - top: 10px; - inset-inline-end: 10px; - } -} - -.compare-history-modal { - .report-modal__target { - border-bottom: 1px solid $ui-secondary-color; - } - - &__container { - padding: 30px; - pointer-events: all; - overflow-y: auto; - } - - .status__content { - color: $inverted-text-color; - font-size: 19px; - line-height: 24px; - - .emojione { - width: 24px; - height: 24px; - margin: -1px 0 0; - } - - a { - color: $highlight-text-color; - } - - hr { - height: 0.25rem; - padding: 0; - background-color: $ui-secondary-color; - border: 0; - margin: 20px 0; - } - } - - .media-gallery, - .audio-player, - .video-player { - margin-top: 15px; - } -} - -.embed-modal { - width: auto; - max-width: 80vw; - max-height: 80vh; - - h4 { - padding: 30px; - font-weight: 500; - font-size: 16px; - text-align: center; - } - - .embed-modal__container { - padding: 10px; - - .hint { - margin-bottom: 15px; - } - - .embed-modal__html { - outline: 0; - box-sizing: border-box; - display: block; - width: 100%; - border: 0; - padding: 10px; - font-family: mastodon-font-monospace, monospace; - background: $ui-base-color; - color: $primary-text-color; - font-size: 14px; - margin: 0; - margin-bottom: 15px; - border-radius: 4px; - - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; - } - - &:focus { - background: lighten($ui-base-color, 4%); - } - - @media screen and (width <= 600px) { - font-size: 16px; - } - } - - .embed-modal__iframe { - width: 400px; - max-width: 100%; - overflow: hidden; - border: 0; - border-radius: 4px; - } - } -} - -.focal-point { - position: relative; - cursor: move; - overflow: hidden; - height: 100%; - display: flex; - justify-content: center; - align-items: center; - background: $base-shadow-color; - - img, - video, - canvas { - display: block; - max-height: 80vh; - width: 100%; - height: auto; - margin: 0; - object-fit: contain; - background: $base-shadow-color; - } - - &__reticle { - position: absolute; - width: 100px; - height: 100px; - transform: translate(-50%, -50%); - background: url('~images/reticle.png') no-repeat 0 0; - border-radius: 50%; - box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35); - } - - &__overlay { - position: absolute; - width: 100%; - height: 100%; - top: 0; - inset-inline-start: 0; - } - - &__preview { - position: absolute; - bottom: 10px; - inset-inline-end: 10px; - z-index: 2; - cursor: move; - transition: opacity 0.1s ease; - - &:hover { - opacity: 0.5; - } - - strong { - color: $primary-text-color; - font-size: 14px; - font-weight: 500; - display: block; - margin-bottom: 5px; - } - - div { - border-radius: 4px; - box-shadow: 0 0 14px rgba($base-shadow-color, 0.2); - } - } - - @media screen and (width <= 480px) { - img, - video { - max-height: 100%; - } - - &__preview { - display: none; - } - } -} - -.filtered-status-info { - text-align: start; - - .spoiler__text { - margin-top: 20px; - } - - .account { - border-bottom: 0; - } - - .account__display-name strong { - color: $inverted-text-color; - } - - .status__content__spoiler { - display: none; - - &--visible { - display: flex; - } - } - - ul { - padding: 10px; - margin-inline-start: 12px; - list-style: disc inside; - } - - .filtered-status-edit-link { - color: $action-button-color; - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } -} - -.modal-root__container .privacy-dropdown { - flex-grow: 0; -} - -.modal-root__container .privacy-dropdown__dropdown { - pointer-events: auto; - z-index: 9999; -} - -img.modal-warning { - display: block; - margin: auto; - margin-bottom: 15px; - width: 60px; -} - -.interaction-modal { - max-width: 90vw; - width: 600px; - background: $ui-base-color; - border-radius: 8px; - overflow-x: hidden; - overflow-y: auto; - position: relative; - display: block; - padding: 20px; - - h3 { - font-size: 22px; - line-height: 33px; - font-weight: 700; - text-align: center; - } - - &__icon { - color: $highlight-text-color; - margin: 0 5px; - } - - &__lead { - padding: 20px; - text-align: center; - - h3 { - margin-bottom: 15px; - } - - p { - font-size: 17px; - line-height: 22px; - color: $darker-text-color; - } - } - - &__choices { - display: flex; - - &__choice { - flex: 0 0 auto; - width: 50%; - box-sizing: border-box; - padding: 20px; - - h3 { - margin-bottom: 20px; - } - - p { - color: $darker-text-color; - margin-bottom: 20px; - } - - .button { - margin-bottom: 10px; - - &:last-child { - margin-bottom: 0; - } - } - } - } - - @media screen and (max-width: $no-gap-breakpoint - 1px) { - &__choices { - display: block; - - &__choice { - width: auto; - margin-bottom: 20px; - } - } - } -} - -.copypaste { - display: flex; - align-items: center; - gap: 10px; - - input { - display: block; - font-family: inherit; - background: darken($ui-base-color, 8%); - border: 1px solid $highlight-text-color; - color: $darker-text-color; - border-radius: 4px; - padding: 6px 9px; - line-height: 22px; - font-size: 14px; - transition: border-color 300ms linear; - flex: 1 1 auto; - overflow: hidden; - - &:focus { - outline: 0; - background: darken($ui-base-color, 4%); - } - } - - .button { - flex: 0 0 auto; - transition: background 300ms linear; - } - - &.copied { - input { - border: 1px solid $valid-value-color; - transition: none; - } - - .button { - background: $valid-value-color; - transition: none; - } - } -}