From 837d1decc917a0b3a0a3a32d8f72e5d6358cf3d5 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 10 Feb 2026 10:13:09 +0100 Subject: [PATCH 1/8] Add a i18n check in pre-commit for JS files (#37793) --- lint-staged.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lint-staged.config.js b/lint-staged.config.js index 63f5258a94..4f9dd99ef6 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -5,6 +5,10 @@ const config = { '*.{css,scss}': 'stylelint --fix', '*.haml': 'bin/haml-lint -a', '**/*.ts?(x)': () => 'tsc -p tsconfig.json --noEmit', + 'app/javascript/**/*.{js,jsx,ts,tsx}': () => [ + `yarn i18n:extract`, + 'git diff --exit-code app/javascript/mastodon/locales/en.json', + ], }; module.exports = config; From 8aabc8628d2d1387e19999f99f337ea5662d595e Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 10 Feb 2026 10:56:16 +0100 Subject: [PATCH 2/8] Fix i18n check for missing source strings (#37801) --- .github/workflows/check-i18n.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml index 6d660ec5bf..4906ab6cf4 100644 --- a/.github/workflows/check-i18n.yml +++ b/.github/workflows/check-i18n.yml @@ -42,8 +42,7 @@ jobs: - name: Check for missing strings in English YML run: | - bin/i18n-tasks add-missing -l en - git diff --exit-code + bin/i18n-tasks missing -t used -l en - name: Check for wrong string interpolations run: bin/i18n-tasks check-consistent-interpolations From 0763ad0d964c4404d78b15fad543757878b0b231 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Tue, 10 Feb 2026 11:00:27 +0100 Subject: [PATCH 3/8] Set a more explicit version number for GH Action (#37800) --- .github/workflows/lint-ruby.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml index c70e2ede05..f99362895a 100644 --- a/.github/workflows/lint-ruby.yml +++ b/.github/workflows/lint-ruby.yml @@ -43,7 +43,7 @@ jobs: bundler-cache: true - name: Set-up RuboCop Problem Matcher - uses: r7kamura/rubocop-problem-matchers-action@59f1a0759f50cc2649849fd850b8487594bb5a81 # v1 + uses: r7kamura/rubocop-problem-matchers-action@59f1a0759f50cc2649849fd850b8487594bb5a81 # v1.2.2 - name: Run rubocop run: bin/rubocop From 03f73377d95c82f50c921b473b9e42600af384ab Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Tue, 10 Feb 2026 11:08:55 +0100 Subject: [PATCH 4/8] Federate updates to collections (#37790) --- .../api/v1_alpha/collections_controller.rb | 2 +- .../update_featured_collection_serializer.rb | 23 ++++++++++ app/services/update_collection_service.rb | 28 ++++++++++++ ...ate_featured_collection_serializer_spec.rb | 27 ++++++++++++ .../update_collection_service_spec.rb | 43 +++++++++++++++++++ 5 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 app/serializers/activitypub/update_featured_collection_serializer.rb create mode 100644 app/services/update_collection_service.rb create mode 100644 spec/serializers/activitypub/update_featured_collection_serializer_spec.rb create mode 100644 spec/services/update_collection_service_spec.rb diff --git a/app/controllers/api/v1_alpha/collections_controller.rb b/app/controllers/api/v1_alpha/collections_controller.rb index 792a072d32..feea6c6b32 100644 --- a/app/controllers/api/v1_alpha/collections_controller.rb +++ b/app/controllers/api/v1_alpha/collections_controller.rb @@ -51,7 +51,7 @@ class Api::V1Alpha::CollectionsController < Api::BaseController def update authorize @collection, :update? - @collection.update!(collection_update_params) # TODO: Create a service for this to federate changes + UpdateCollectionService.new.call(@collection, collection_update_params) render json: @collection, serializer: REST::CollectionSerializer, adapter: :json end diff --git a/app/serializers/activitypub/update_featured_collection_serializer.rb b/app/serializers/activitypub/update_featured_collection_serializer.rb new file mode 100644 index 0000000000..b349223ad6 --- /dev/null +++ b/app/serializers/activitypub/update_featured_collection_serializer.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +class ActivityPub::UpdateFeaturedCollectionSerializer < ActivityPub::Serializer + attributes :id, :type, :actor, :to + + has_one :object, serializer: ActivityPub::FeaturedCollectionSerializer + + def id + [ActivityPub::TagManager.instance.uri_for(object), '#updates/', object.updated_at.to_i].join + end + + def type + 'Update' + end + + def actor + ActivityPub::TagManager.instance.uri_for(object.account) + end + + def to + [ActivityPub::TagManager::COLLECTIONS[:public]] + end +end diff --git a/app/services/update_collection_service.rb b/app/services/update_collection_service.rb new file mode 100644 index 0000000000..9dffac9e2b --- /dev/null +++ b/app/services/update_collection_service.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +class UpdateCollectionService + UPDATEABLE_PARAMS = %w(name description language sensitive discoverable tag_id).freeze + + def call(collection, params) + @collection = collection + @collection.update!(params) + + distribute_update_activity if Mastodon::Feature.collections_federation_enabled? + end + + private + + def distribute_update_activity + return unless relevant_attributes_changed? + + ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account.id) + end + + def activity_json + ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::UpdateFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json + end + + def relevant_attributes_changed? + (@collection.saved_changes.keys & UPDATEABLE_PARAMS).any? + end +end diff --git a/spec/serializers/activitypub/update_featured_collection_serializer_spec.rb b/spec/serializers/activitypub/update_featured_collection_serializer_spec.rb new file mode 100644 index 0000000000..9f9255fea3 --- /dev/null +++ b/spec/serializers/activitypub/update_featured_collection_serializer_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::UpdateFeaturedCollectionSerializer do + subject { serialized_record_json(collection, described_class, adapter: ActivityPub::Adapter) } + + let(:tag_manager) { ActivityPub::TagManager.instance } + let(:collection) { Fabricate(:collection) } + + it 'serializes to the expected json' do + expect(subject).to include({ + 'id' => "#{tag_manager.uri_for(collection)}#updates/#{collection.updated_at.to_i}", + 'type' => 'Update', + 'actor' => tag_manager.uri_for(collection.account), + 'to' => ['https://www.w3.org/ns/activitystreams#Public'], + 'object' => a_hash_including({ + 'id' => tag_manager.uri_for(collection), + 'type' => 'FeaturedCollection', + }), + }) + + expect(subject).to_not have_key('published') + expect(subject).to_not have_key('cc') + expect(subject).to_not have_key('target') + end +end diff --git a/spec/services/update_collection_service_spec.rb b/spec/services/update_collection_service_spec.rb new file mode 100644 index 0000000000..b7b9547dbb --- /dev/null +++ b/spec/services/update_collection_service_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe UpdateCollectionService do + subject { described_class.new } + + let(:collection) { Fabricate(:collection) } + + describe '#call' do + context 'when given valid parameters' do + it 'updates the collection' do + subject.call(collection, { name: 'Newly updated name' }) + + expect(collection.name).to eq 'Newly updated name' + end + + context 'when something actually changed' do + it 'federates an `Update` activity', feature: :collections_federation do + subject.call(collection, { name: 'updated' }) + + expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + end + end + + context 'when nothing changed' do + it 'does not federate an activity', feature: :collections_federation do + subject.call(collection, { name: collection.name }) + + expect(ActivityPub::AccountRawDistributionWorker).to_not have_enqueued_sidekiq_job + end + end + end + + context 'when given invalid parameters' do + it 'raises an exception' do + expect do + subject.call(collection, { name: '' }) + end.to raise_error(ActiveRecord::RecordInvalid) + end + end + end +end From 662df237938cdeaccfad237ba202a34996d78fc9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:16:57 +0100 Subject: [PATCH 5/8] New Crowdin Translations (automated) (#37797) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/es.json | 8 +++ app/javascript/mastodon/locales/fr-CA.json | 8 +++ app/javascript/mastodon/locales/fr.json | 8 +++ app/javascript/mastodon/locales/hu.json | 25 ++++++++ app/javascript/mastodon/locales/pa.json | 67 ++++++++++++++++++++++ app/javascript/mastodon/locales/pt-PT.json | 26 +++++++++ app/javascript/mastodon/locales/tr.json | 8 +++ app/javascript/mastodon/locales/uk.json | 2 +- config/locales/el.yml | 10 ++-- config/locales/es.yml | 7 ++- config/locales/hu.yml | 3 + config/locales/nl.yml | 3 + config/locales/pt-PT.yml | 3 + 13 files changed, 170 insertions(+), 8 deletions(-) diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index c78a84f1d1..23526ab7af 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -123,6 +123,8 @@ "account.share": "Compartir el perfil de @{name}", "account.show_reblogs": "Mostrar impulsos de @{name}", "account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}", + "account.timeline.pinned": "Fijada", + "account.timeline.pinned.view_all": "Ver todas las publicaciones fijadas", "account.unblock": "Desbloquear a @{name}", "account.unblock_domain": "Desbloquear el dominio {domain}", "account.unblock_domain_short": "Desbloquear", @@ -295,6 +297,11 @@ "column_header.show_settings": "Mostrar ajustes", "column_header.unpin": "Dejar de fijar", "column_search.cancel": "Cancelar", + "combobox.close_results": "Cerrar resultados", + "combobox.loading": "Cargando", + "combobox.no_results_found": "No hay resultados para esta búsqueda", + "combobox.open_results": "Abrir resultados", + "combobox.results_available": "{count, plural,one {# sugerencia disponible} other {# sugerencias disponibles}}. Utiliza las teclas de flecha arriba y abajo para navegar. Pulsa la tecla Intro para seleccionar.", "community.column_settings.local_only": "Solo local", "community.column_settings.media_only": "Solo multimedia", "community.column_settings.remote_only": "Solo remoto", @@ -462,6 +469,7 @@ "empty_column.notification_requests": "¡Todo limpio! No hay nada aquí. Cuando recibas nuevas notificaciones, aparecerán aquí conforme a tu configuración.", "empty_column.notifications": "Aún no tienes ninguna notificación. Cuando otras personas interactúen contigo, aparecerán aquí.", "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo", + "empty_state.no_results": "Sin resultados", "error.no_hashtag_feed_access": "Únete o inicia sesión para ver y seguir esta etiqueta.", "error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador, esta página no se ha podido mostrar correctamente.", "error.unexpected_crash.explanation_addons": "No se pudo mostrar correctamente esta página. Este error probablemente fue causado por un complemento del navegador web o por herramientas de traducción automática.", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index b40f2d569d..5ff6073495 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -123,6 +123,8 @@ "account.share": "Partager le profil de @{name}", "account.show_reblogs": "Afficher les boosts de @{name}", "account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}", + "account.timeline.pinned": "Épinglé", + "account.timeline.pinned.view_all": "Voir tous les messages épinglés", "account.unblock": "Débloquer @{name}", "account.unblock_domain": "Débloquer le domaine {domain}", "account.unblock_domain_short": "Débloquer", @@ -295,6 +297,11 @@ "column_header.show_settings": "Afficher les paramètres", "column_header.unpin": "Désépingler", "column_search.cancel": "Annuler", + "combobox.close_results": "Fermer les résultats", + "combobox.loading": "Chargement", + "combobox.no_results_found": "Aucun résultat pour cette recherche", + "combobox.open_results": "Ouvrir les résultats", + "combobox.results_available": "{count, plural, one {# suggestion disponibe} other {# suggestions disponibles}}. Utiliser les touches haut et bas pour naviguer. Appuyer sur Entrée pour sélectionner.", "community.column_settings.local_only": "Local seulement", "community.column_settings.media_only": "Média seulement", "community.column_settings.remote_only": "À distance seulement", @@ -462,6 +469,7 @@ "empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.", "empty_column.notifications": "Vous n'avez pas encore de notifications. Quand d'autres personnes interagissent avec vous, vous en verrez ici.", "empty_column.public": "Il n’y a rien ici! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres serveurs pour remplir le fil public", + "empty_state.no_results": "Aucun résultat", "error.no_hashtag_feed_access": "Rejoindre ou se connecter pour voir et suivre cet hashtag.", "error.unexpected_crash.explanation": "En raison d’un bogue dans notre code ou d’un problème de compatibilité avec votre navigateur, cette page n’a pas pu être affichée correctement.", "error.unexpected_crash.explanation_addons": "Cette page n’a pas pu être affichée correctement. Cette erreur est probablement causée par une extension de navigateur ou des outils de traduction automatique.", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index c0e4f63e3f..fd90425094 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -123,6 +123,8 @@ "account.share": "Partager le profil de @{name}", "account.show_reblogs": "Afficher les partages de @{name}", "account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}", + "account.timeline.pinned": "Épinglé", + "account.timeline.pinned.view_all": "Voir tous les messages épinglés", "account.unblock": "Débloquer @{name}", "account.unblock_domain": "Débloquer le domaine {domain}", "account.unblock_domain_short": "Débloquer", @@ -295,6 +297,11 @@ "column_header.show_settings": "Afficher les paramètres", "column_header.unpin": "Désépingler", "column_search.cancel": "Annuler", + "combobox.close_results": "Fermer les résultats", + "combobox.loading": "Chargement", + "combobox.no_results_found": "Aucun résultat pour cette recherche", + "combobox.open_results": "Ouvrir les résultats", + "combobox.results_available": "{count, plural, one {# suggestion disponibe} other {# suggestions disponibles}}. Utiliser les touches haut et bas pour naviguer. Appuyer sur Entrée pour sélectionner.", "community.column_settings.local_only": "Local seulement", "community.column_settings.media_only": "Média uniquement", "community.column_settings.remote_only": "Distant seulement", @@ -462,6 +469,7 @@ "empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.", "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.", "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres serveurs pour remplir le fil public", + "empty_state.no_results": "Aucun résultat", "error.no_hashtag_feed_access": "Rejoindre ou se connecter pour voir et suivre cet hashtag.", "error.unexpected_crash.explanation": "En raison d’un bug dans notre code ou d’un problème de compatibilité avec votre navigateur, cette page n’a pas pu être affichée correctement.", "error.unexpected_crash.explanation_addons": "Cette page n’a pas pu être affichée correctement. Cette erreur est probablement causée par une extension de navigateur ou des outils de traduction automatique.", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index bd3e9bb214..b983f4de50 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -23,6 +23,7 @@ "account.badges.domain_blocked": "Letiltott domain", "account.badges.group": "Csoport", "account.badges.muted": "Némítva", + "account.badges.muted_until": "Némítva eddig: {until}", "account.block": "@{name} letiltása", "account.block_domain": "Domain letiltása: {domain}", "account.block_short": "Letiltás", @@ -122,6 +123,8 @@ "account.share": "@{name} profiljának megosztása", "account.show_reblogs": "@{name} megtolásainak mutatása", "account.statuses_counter": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}", + "account.timeline.pinned": "Kitűzve", + "account.timeline.pinned.view_all": "Összes kitűzött bejegyzés megtekintése", "account.unblock": "@{name} letiltásának feloldása", "account.unblock_domain": "{domain} domain tiltásának feloldása", "account.unblock_domain_short": "Tiltás feloldása", @@ -236,17 +239,33 @@ "collections.collection_description": "Leírás", "collections.collection_name": "Név", "collections.collection_topic": "Téma", + "collections.content_warning": "Tartalmi figyelmeztetés", + "collections.continue": "Folytatás", + "collections.create.accounts_subtitle": "Csak azok a követett fiókok adhatóak hozzá, melyek engedélyezték a felfedezést.", + "collections.create.accounts_title": "Kit emelsz ki ebben a gyűjteményben?", + "collections.create.basic_details_title": "Alapvető részletek", + "collections.create.settings_title": "Beállítások", + "collections.create.steps": "{step}. lépés/{total}", "collections.create_a_collection_hint": "Gyűjtemény létrehozása a kedvenc fiókok másoknak való ajánlásához.", "collections.create_collection": "Gyűjtemény létrehozása", "collections.delete_collection": "Gyűjtemény törlése", "collections.description_length_hint": "100 karakteres korlát", + "collections.edit_details": "Alapvető részletek szerkesztése", + "collections.edit_settings": "Beállítások szerkesztése", "collections.error_loading_collections": "Hiba történt a gyűjtemények betöltése során.", + "collections.manage_accounts": "Fiókok kezelése", + "collections.manage_accounts_in_collection": "Gyűjteményben szereplő fiókok kezelése", "collections.mark_as_sensitive": "Megjelelölés érzénykenként", "collections.mark_as_sensitive_hint": "Tartalmi figyelmeztetés mögé rejti a gyűjtemény leírását és a fiókokat. A gyűjtemény neve továbbra is látható lesz.", "collections.name_length_hint": "100 karakteres korlát", + "collections.new_collection": "Új gyűjtemény", "collections.no_collections_yet": "Még nincsenek gyűjtemények.", "collections.topic_hint": "Egy hashtag hozzáadása segít másoknak abban, hogy megértsék a gyűjtemény fő témáját.", "collections.view_collection": "Gyűjtemény megtekintése", + "collections.visibility_public": "Nyilvános", + "collections.visibility_title": "Láthatóság", + "collections.visibility_unlisted": "Nem listázott", + "collections.visibility_unlisted_hint": "A hivatkozással bárki számára látható. A keresési találatokban és ajánlásokban rejtve van.", "column.about": "Névjegy", "column.blocks": "Letiltott felhasználók", "column.bookmarks": "Könyvjelzők", @@ -277,6 +296,11 @@ "column_header.show_settings": "Beállítások megjelenítése", "column_header.unpin": "Kitűzés eltávolítása", "column_search.cancel": "Mégse", + "combobox.close_results": "Találatok bezárása", + "combobox.loading": "Betöltés", + "combobox.no_results_found": "Nincs találat ehhez a kereséshez", + "combobox.open_results": "Találatok megtekintése", + "combobox.results_available": "{count, plural, one {# javaslat} other {# javaslat}} érhető el. A navigációhoz használt a fel és le nyílbillentyűket. A kiválasztáshoz üss Entert.", "community.column_settings.local_only": "Csak helyi", "community.column_settings.media_only": "Csak média", "community.column_settings.remote_only": "Csak távoli", @@ -444,6 +468,7 @@ "empty_column.notification_requests": "Minden tiszta! Itt nincs semmi. Ha új értesítéseket kapsz, azok itt jelennek meg a beállításoknak megfelelően.", "empty_column.notifications": "Jelenleg még nincsenek értesítéseid. Ha mások kapcsolatba lépnek veled, ezek itt lesznek láthatóak.", "empty_column.public": "Jelenleg itt nincs semmi! Írj valamit nyilvánosan vagy kövess más kiszolgálón levő felhasználókat, hogy megtöltsd.", + "empty_state.no_results": "Nincs találat", "error.no_hashtag_feed_access": "Csatlakozz vagy jelentkezz be, hogy megtekintsd és kövesd ezt a hashtaget.", "error.unexpected_crash.explanation": "Egy kód- vagy böngészőkompatibilitási hiba miatt ez az oldal nem jeleníthető meg helyesen.", "error.unexpected_crash.explanation_addons": "Ezt az oldalt nem lehet helyesen megjeleníteni. Ezt a hibát valószínűleg egy böngésző kiegészítő vagy egy automatikus fordító okozza.", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index b77adc99d1..2ec19ec1f0 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -9,9 +9,16 @@ "about.not_available": "ਇਹ ਜਾਣਕਾਰੀ ਨੂੰ ਇਸ ਸਰਵਰ ਉੱਤੇ ਉਪਲੱਬਧ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।", "about.rules": "ਸਰਵਰ ਨਿਯਮ", "account.account_note_header": "ਨਿੱਜੀ ਨੋਟ", + "account.activity": "ਸਰਗਰਮੀ", + "account.add_note": "ਕੋਈ ਨਿੱਜੀ ਨੋਟ ਜੋੜੋ", "account.add_or_remove_from_list": "ਸੂਚੀ ਵਿੱਚ ਜੋੜੋ ਜਾਂ ਹਟਾਓ", + "account.badges.admin": "ਪ੍ਰਸ਼ਾਸਕ", + "account.badges.blocked": "ਪਾਬੰਦੀਸ਼ੁਦਾ", "account.badges.bot": "ਆਟੋਮੇਟ ਕੀਤਾ", + "account.badges.domain_blocked": "ਪਾਬੰਦੀ ਲਾਏ ਡੋਮੇਨ", "account.badges.group": "ਗਰੁੱਪ", + "account.badges.muted": "ਮੌਨ ਕੀਤੇ", + "account.badges.muted_until": "{until} ਤੱਕ ਮੌਨ ਕੀਤੇ", "account.block": "@{name} ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", "account.block_domain": "{domain} ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", "account.block_short": "ਪਾਬੰਦੀ", @@ -22,6 +29,7 @@ "account.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ @{name}", "account.disable_notifications": "ਜਦੋਂ {name} ਕੋਈ ਪੋਸਟ ਕਰੇ ਤਾਂ ਮੈਨੂੰ ਸੂਚਨਾ ਨਾ ਦਿਓ", "account.domain_blocking": "ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ", + "account.edit_note": "ਨਿੱਜੀ ਨੋਟ ਨੂੰ ਸੋਧੋ", "account.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ", "account.edit_profile_short": "ਸੋਧੋ", "account.enable_notifications": "ਜਦੋਂ {name} ਪੋਸਟ ਕਰੇ ਤਾਂ ਮੈਨੂੰ ਸੂਚਨਾ ਦਿਓ", @@ -33,6 +41,12 @@ "account.featured.hashtags": "ਹੈਸ਼ਟੈਗ", "account.featured_tags.last_status_at": "{date} ਨੂੰ ਆਖਰੀ ਪੋਸਟ", "account.featured_tags.last_status_never": "ਕੋਈ ਪੋਸਟ ਨਹੀਂ", + "account.fields.scroll_next": "ਅਗਲਾ ਵੇਖੋ", + "account.fields.scroll_prev": "ਪਿਛਲਾ ਵੇਖੋ", + "account.filters.all": "ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ", + "account.filters.posts_only": "ਪੋਸਟਾਂ", + "account.filters.posts_replies": "ਪੋਸਟਾਂ ਅਤੇ ਜਵਾਬ", + "account.filters.replies_toggle": "ਜਵਾਬਾਂ ਨੂੰ ਵੇਖੋ", "account.follow": "ਫ਼ਾਲੋ", "account.follow_back": "ਵਾਪਸ ਫਾਲ਼ੋ ਕਰੋ", "account.follow_back_short": "ਵਾਪਸ ਫਾਲ਼ੋ ਕਰੋ", @@ -53,12 +67,31 @@ "account.joined_short": "ਜੁਆਇਨ ਕੀਤਾ", "account.media": "ਮੀਡੀਆ", "account.mention": "@{name} ਦਾ ਜ਼ਿਕਰ", + "account.menu.block": "ਖਾਤੇ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", + "account.menu.block_domain": "{domain} ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", + "account.menu.copied": "ਖਾਤਾ ਲਿੰਕ ਨੂੰ ਕਲਿੱਪਬੋਰਡ ਨੂੰ ਕਾਪੀ ਕੀਤਾ", + "account.menu.copy": "ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ", + "account.menu.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ", + "account.menu.mention": "ਜ਼ਿਕਰ", + "account.menu.mute": "ਖਾਤੇ ਨੂੰ ਮੌਨ ਕਰੋ", + "account.menu.open_original_page": "{domain} ਉੱਤੇ ਵੇਖੋ", + "account.menu.remove_follower": "ਫ਼ਾਲੋਅਰ ਨੂੰ ਹਟਾਓ", + "account.menu.report": "ਖਾਤੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ", + "account.menu.share": "…ਸਾਂਝਾ ਕਰੋ", + "account.menu.unblock": "ਖਾਤੇ ਉੱਤੇ ਪਾਬੰਦੀ ਨੂੰ ਹਟਾਓ", + "account.menu.unblock_domain": "{domain} ਤੋਂ ਪਾਬੰਦੀ ਨੂੰ ਹਟਾਓ", "account.mute": "{name} ਨੂੰ ਮੌਨ ਕਰੋ", "account.mute_notifications_short": "ਨੋਟਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਮੌਨ ਕਰੋ", "account.mute_short": "ਮੌਨ ਕਰੋ", "account.muted": "ਮੌਨ ਕੀਤੀਆਂ", "account.mutual": "ਤੁਸੀਂ ਇੱਕ ਦੂਜੇ ਨੂੰ ਫ਼ਾਲੋ ਕਰਦੇ ਹੋ", "account.no_bio": "ਕੋਈ ਵਰਣਨ ਨਹੀਂ ਦਿੱਤਾ।", + "account.node_modal.edit_title": "ਨਿੱਜੀ ਨੋਟ ਨੂੰ ਸੋਧੋ", + "account.node_modal.field_label": "ਨਿੱਜੀ ਨੋਟ", + "account.node_modal.save": "ਸੰਭਾਲੋ", + "account.node_modal.title": "ਕੋਈ ਨਿੱਜੀ ਨੋਟ ਜੋੜੋ", + "account.note.edit_button": "ਸੋਧੋ", + "account.note.title": "ਨਿੱਜੀ ਨੋਟ (ਸਿਰਫ਼ ਤੁਹਾਨੂੰ ਹੀ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ)", "account.open_original_page": "ਅਸਲ ਸਫ਼ੇ ਨੂੰ ਖੋਲ੍ਹੋ", "account.posts": "ਪੋਸਟਾਂ", "account.posts_with_replies": "ਪੋਸਟਾਂ ਅਤੇ ਜਵਾਬ", @@ -67,7 +100,10 @@ "account.requested_follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ", "account.requests_to_follow_you": "ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀਆਂ ਬੇਨਤੀਆਂ", "account.share": "{name} ਦਾ ਪਰੋਫ਼ਾਇਲ ਸਾਂਝਾ ਕਰੋ", + "account.show_reblogs": "@{name} ਵਲੋਂ ਬੂਸਟ ਨੂੰ ਵੇਖਾਓ", "account.statuses_counter": "{count, plural, one {{counter} ਪੋਸਟ} other {{counter} ਪੋਸਟਾਂ}}", + "account.timeline.pinned": "ਟੰਗੇ ਹੋਏ", + "account.timeline.pinned.view_all": "ਸਭ ਟੰਗੀਆਂ ਹੋਈਆਂ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ", "account.unblock": "@{name} ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ", "account.unblock_domain": "{domain} ਡੋਮੇਨ ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ", "account.unblock_domain_short": "ਪਾਬੰਦੀ ਹਟਾਓ", @@ -92,6 +128,7 @@ "annual_report.summary.archetype.die_drei_fragezeichen": "???", "annual_report.summary.close": "ਬੰਦ ਕਰੋ", "annual_report.summary.copy_link": "ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ", + "annual_report.summary.followers.new_followers": "{count, plural, one {ਨਵਾਂ ਫ਼ਾਲੋਅਰ} other {ਨਵੇਂ ਫ਼ਾਲੋਅਰ}}", "annual_report.summary.highlighted_post.title": "ਸਭ ਤੋਂ ਵੱਧ ਹਰਮਨਪਿਆਰੀ ਪੋਸਟ", "annual_report.summary.most_used_app.most_used_app": "ਸਭ ਤੋਂ ਵੱਧ ਵਰਤੀ ਐਪ", "annual_report.summary.new_posts.new_posts": "ਨਵੀਆਂ ਪੋਸਟਾਂ", @@ -108,13 +145,29 @@ "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "ਬੰਦ ਕਰੋ", "bundle_modal_error.retry": "ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ", + "callout.dismiss": "ਖ਼ਾਰਜ ਕਰੋ", "carousel.current": "ਸਲਾਈਡ {current, number} / {max, number}", "carousel.slide": "{max, number} ਵਿੱਚੋਂ {current, number} ਸਲਾਈਡ", "closed_registrations_modal.find_another_server": "ਹੋਰ ਸਰਵਰ ਲੱਭੋ", "closed_registrations_modal.title": "Mastodon ਲਈ ਸਾਈਨ ਅੱਪ ਕਰੋ", + "collections.collection_description": "ਵਰਣਨ", + "collections.collection_name": "ਨਾਂ", + "collections.collection_topic": "ਵਿਸ਼ਾ", + "collections.content_warning": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ", + "collections.continue": "ਜਾਰੀ ਰੱਖੋ", + "collections.create.basic_details_title": "ਮੁ਼ੱਢਲੇ ਵੇਰਵੇ", + "collections.create.settings_title": "ਸੈਟਿੰਗਾਂ", + "collections.create.steps": "ਪੜਾਅ {step}/{total}", + "collections.edit_details": "ਮੁੱਢਲੇ ਵੇਰਵਿਆਂ ਨੂੰ ਸੋਧੋ", + "collections.edit_settings": "ਸੈਟਿੰਗਾਂ ਨੂੰ ਸੋਧੋ", + "collections.name_length_hint": "100 ਅੱਖਰਾਂ ਦੀ ਹੱਦ", + "collections.view_collection": "ਭੰਡਾਰ ਨੂੰ ਵੇਖੋ", + "collections.visibility_public": "ਜਨਤਕ", + "collections.visibility_title": "ਦਿੱਖ", "column.about": "ਸਾਡੇ ਬਾਰੇ", "column.blocks": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰ", "column.bookmarks": "ਬੁੱਕਮਾਰਕ", + "column.collections": "ਮੇਰਾ ਭੰਡਾਰ", "column.community": "ਲੋਕਲ ਸਮਾਂ-ਲਾਈਨ", "column.create_list": "ਸੂਚੀ ਬਣਾਓ", "column.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ", @@ -139,6 +192,9 @@ "column_header.show_settings": "ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ", "column_header.unpin": "ਲਾਹੋ", "column_search.cancel": "ਰੱਦ ਕਰੋ", + "combobox.loading": "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ", + "combobox.no_results_found": "ਇਸ ਖੋਜ ਲਈ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਹਨ", + "combobox.open_results": "ਨਤੀਜਿਆਂ ਨੂੰ ਵੇਖੋ", "community.column_settings.local_only": "ਸਿਰਫ ਲੋਕਲ ਹੀ", "community.column_settings.media_only": "ਸਿਰਫ ਮੀਡੀਆ ਹੀ", "community.column_settings.remote_only": "ਸਿਰਫ਼ ਰਿਮੋਟ ਹੀ", @@ -170,6 +226,9 @@ "confirmations.delete.confirm": "ਹਟਾਓ", "confirmations.delete.message": "ਕੀ ਤੁਸੀਂ ਇਹ ਪੋਸਟ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?", "confirmations.delete.title": "ਪੋਸਟ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?", + "confirmations.delete_collection.confirm": "ਹਟਾਓ", + "confirmations.delete_collection.message": "ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਪਰਤਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।", + "confirmations.delete_collection.title": "\"{name}\" ਨੂੰ ਹਟਾਉਣਾ ਹੈ?", "confirmations.delete_list.confirm": "ਹਟਾਓ", "confirmations.delete_list.message": "ਕੀ ਤੁਸੀਂ ਇਸ ਸੂਚੀ ਨੂੰ ਪੱਕੇ ਤੌਰ ਉੱਤੇ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?", "confirmations.delete_list.title": "ਸੂਚੀ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?", @@ -187,6 +246,7 @@ "confirmations.missing_alt_text.title": "ਬਦਲਵੀ ਲਿਖਤ ਜੋੜਨੀ ਹੈ?", "confirmations.mute.confirm": "ਮੌਨ ਕਰੋ", "confirmations.private_quote_notify.cancel": "ਸੋਧ ਕਰਨ ਉੱਤੇ ਵਾਪਸ ਜਾਓ", + "confirmations.private_quote_notify.confirm": "ਜਨਤਕ ਪੋਸਟ", "confirmations.private_quote_notify.do_not_show_again": "ਮੈਨੂੰ ਇਹ ਸੁਨੇਹਾ ਫੇਰ ਨਾ ਦਿਖਾਓ", "confirmations.quiet_post_quote_info.dismiss": "ਮੈਨੂੰ ਮੁੜ ਕੇ ਯਾਦ ਨਾ ਕਰਵਾਓ", "confirmations.quiet_post_quote_info.got_it": "ਸਮਝ ਗਏ", @@ -258,6 +318,8 @@ "explore.trending_statuses": "ਪੋਸਟਾਂ", "explore.trending_tags": "ਹੈਸ਼ਟੈਗ", "featured_carousel.header": "{count, plural, one {ਟੰਗੀ ਹੋਈ ਪੋਸਟ} other {ਟੰਗੀਆਂ ਹੋਈਆਂ ਪੋਸਟਾਂ}}", + "featured_carousel.slide": "{max, number} ਵਿੱਚੋਂ {current, number} ਪੋਸਟ", + "featured_tags.more_items": "+{count}", "filter_modal.added.expired_title": "ਫਿਲਟਰ ਦੀ ਮਿਆਦ ਪੁੱਗੀ!", "filter_modal.added.review_and_configure_title": "ਫਿਲਟਰ ਸੈਟਿੰਗਾਂ", "filter_modal.added.settings_link": "ਸੈਟਿੰਗਾਂ ਸਫ਼ਾ", @@ -291,6 +353,7 @@ "footer.source_code": "ਸਰੋਤ ਕੋਡ ਵੇਖੋ", "footer.status": "ਹਾਲਤ", "footer.terms_of_service": "ਸੇਵਾ ਦੀਆਂ ਸ਼ਰਤਾਂ", + "form_field.optional": "(ਚੋਣਵਾਂ)", "generic.saved": "ਸਾਂਭੀ ਗਈ", "getting_started.heading": "ਸ਼ੁਰੂ ਕਰੀਏ", "hashtag.browse": "#{hashtag} ਵਿੱਚ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ", @@ -303,10 +366,13 @@ "hashtag.column_settings.tag_mode.any": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ", "hashtag.column_settings.tag_mode.none": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ ਨਹੀਂ", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} ਹਿੱਸੇਦਾਰ} other {{counter} ਹਿੱਸੇਦਾਰ}}", "hashtag.feature": "ਪਰੋਫਾਇਲ ਉੱਤੇ ਫ਼ੀਚਰ", "hashtag.follow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", "hashtag.mute": "#{hashtag} ਨੂੰ ਮੌਨ ਕਰੋ", + "hashtag.unfeature": "ਪਰੋਫਾਇਲ ਉੱਤੇ ਫ਼ੀਚਰ ਨਾ ਕਰੋ", "hashtag.unfollow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ", + "hashtags.and_other": "…ਅਤੇ {count, plural, one {}other {# ਹੋਰ}}", "hints.profiles.see_more_followers": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋਅਰ ਵੇਖੋ", "hints.profiles.see_more_follows": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋ ਨੂੰ ਵੇਖੋ", "hints.profiles.see_more_posts": "{domain} ਉੱਤੇ ਹੋਰ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ", @@ -421,6 +487,7 @@ "navigation_bar.search_trends": "ਖੋਜ / ਰੁਝਾਨ", "not_signed_in_indicator.not_signed_in": "ਇਹ ਸਰੋਤ ਵਰਤਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।", "notification.admin.sign_up": "{name} ਨੇ ਸਾਈਨ ਅੱਪ ਕੀਤਾ", + "notification.annual_report.view": "#Wrapstodon ਨੂੰ ਵੇਖੋ", "notification.favourite": "{name} ਨੇ ਤੁਹਾਡੀ ਪੋਸਟ ਨੂੰ ਪਸੰਦ ਕੀਤਾ", "notification.favourite_pm": "{name} ਨੇ ਤੁਹਾਡੇ ਨਿੱਜੀ ਜ਼ਿਕਰ ਨੂੰ ਪਸੰਦ ਕੀਤਾ", "notification.follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕੀਤਾ", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index b71f7750ca..5fb76edc56 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -23,6 +23,7 @@ "account.badges.domain_blocked": "Domínio bloqueado", "account.badges.group": "Grupo", "account.badges.muted": "Silenciado", + "account.badges.muted_until": "Silenciado até {until}", "account.block": "Bloquear @{name}", "account.block_domain": "Bloquear domínio {domain}", "account.block_short": "Bloquear", @@ -122,6 +123,8 @@ "account.share": "Partilhar o perfil @{name}", "account.show_reblogs": "Mostrar partilhas de @{name}", "account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", + "account.timeline.pinned": "Fixado", + "account.timeline.pinned.view_all": "Ver todos as publicações fixadas", "account.unblock": "Desbloquear @{name}", "account.unblock_domain": "Desbloquear o domínio {domain}", "account.unblock_domain_short": "Desbloquear", @@ -236,17 +239,34 @@ "collections.collection_description": "Descrição", "collections.collection_name": "Nome", "collections.collection_topic": "Tópico", + "collections.content_warning": "Aviso de conteúdo", + "collections.continue": "Continuar", + "collections.create.accounts_subtitle": "Apenas as contas que segue e que optaram por ser descobertas podem ser adicionadas.", + "collections.create.accounts_title": "Quem vai destacar nesta coleção?", + "collections.create.basic_details_title": "Informações básicas", + "collections.create.settings_title": "Definições", + "collections.create.steps": "Passo {step}/{total}", "collections.create_a_collection_hint": "Crie uma coleção para recomendar ou partilhar as suas contas favoritas com outras pessoas.", "collections.create_collection": "Criar coleção", "collections.delete_collection": "Eliminar coleção", "collections.description_length_hint": "Limite de 100 caracteres", + "collections.edit_details": "Editar informações básicas", + "collections.edit_settings": "Editar definições", "collections.error_loading_collections": "Ocorreu um erro ao tentar carregar as suas coleções.", + "collections.manage_accounts": "Gerir contas", + "collections.manage_accounts_in_collection": "Gerir contas nesta coleção", "collections.mark_as_sensitive": "Marcar como sensível", "collections.mark_as_sensitive_hint": "Oculta a descrição e as contas da coleção por trás de um aviso de conteúdo. O nome da coleção ainda estará visível.", "collections.name_length_hint": "Limite de 100 caracteres", + "collections.new_collection": "Nova coleção", "collections.no_collections_yet": "Ainda não existem coleções.", "collections.topic_hint": "Adicione uma etiqueta para ajudar outros a entender o tópico principal desta coleção.", "collections.view_collection": "Ver coleções", + "collections.visibility_public": "Pública", + "collections.visibility_public_hint": "Visível nos resultados de pesquisa e outras áreas onde aparecem recomendações.", + "collections.visibility_title": "Visibilidade", + "collections.visibility_unlisted": "Não listada", + "collections.visibility_unlisted_hint": "Visível para qualquer pessoa com uma hiperligação. Não aparece nos resultados de pesquisa e recomendações.", "column.about": "Sobre", "column.blocks": "Utilizadores bloqueados", "column.bookmarks": "Marcadores", @@ -277,6 +297,11 @@ "column_header.show_settings": "Mostrar configurações", "column_header.unpin": "Desafixar", "column_search.cancel": "Cancelar", + "combobox.close_results": "Fechar resultados", + "combobox.loading": "A carregar", + "combobox.no_results_found": "Nenhum resultado para esta pesquisa", + "combobox.open_results": "Ver resultados", + "combobox.results_available": "{count, plural, one {# sugestão disponível} other {# sugestões disponíveis}}. Utilize as setas para cima e para baixo para navegar. Pressione a tecla Enter para selecionar.", "community.column_settings.local_only": "Apenas local", "community.column_settings.media_only": "Apenas multimédia", "community.column_settings.remote_only": "Apenas remoto", @@ -444,6 +469,7 @@ "empty_column.notification_requests": "Tudo limpo! Não há nada aqui. Quando receberes novas notificações, elas aparecerão aqui conforme as tuas configurações.", "empty_column.notifications": "Ainda não tens quaisquer notificações. Quando outras pessoas interagirem contigo, verás isso aqui.", "empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para veres aqui os conteúdos públicos", + "empty_state.no_results": "Sem resultados", "error.no_hashtag_feed_access": "Inscreva-se ou inicie sessão para ver e seguir esta etiqueta.", "error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a um problema de compatibilidade do navegador, esta página não pode ser apresentada corretamente.", "error.unexpected_crash.explanation_addons": "Esta página não pode ser mostrada corretamente. Este erro provavelmente é causado por um complemento do navegador ou ferramentas de tradução automática.", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 9ee7a5cee0..410c6b3bc1 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -123,6 +123,8 @@ "account.share": "@{name} adlı kişinin profilini paylaş", "account.show_reblogs": "@{name} kişisinin yeniden paylaşımlarını göster", "account.statuses_counter": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}", + "account.timeline.pinned": "Sabitlendi", + "account.timeline.pinned.view_all": "Tüm sabitlenmiş gönderileri görüntüle", "account.unblock": "@{name} adlı kişinin engelini kaldır", "account.unblock_domain": "{domain} alan adının engelini kaldır", "account.unblock_domain_short": "Engeli kaldır", @@ -295,6 +297,11 @@ "column_header.show_settings": "Ayarları göster", "column_header.unpin": "Sabitlemeyi kaldır", "column_search.cancel": "İptal", + "combobox.close_results": "Sonuçları kapat", + "combobox.loading": "Yükleniyor", + "combobox.no_results_found": "Bu arama için hiçbir sonuç bulunamadı", + "combobox.open_results": "Sonuçları aç", + "combobox.results_available": "{count, plural, one {# öneri} other {# öneri}} var. Önerileri görmek için yukarı ve aşağı ok tuşlarını kullanın. Seçmek için Enter tuşuna basın.", "community.column_settings.local_only": "Sadece yerel", "community.column_settings.media_only": "Sadece medya", "community.column_settings.remote_only": "Sadece uzak", @@ -462,6 +469,7 @@ "empty_column.notification_requests": "Hepsi tamam! Burada yeni bir şey yok. Yeni bildirim aldığınızda, ayarlarınıza göre burada görüntülenecekler.", "empty_column.notifications": "Henüz bildiriminiz yok. Sohbete başlamak için başkalarıyla etkileşim kurun.", "empty_column.public": "Burada hiçbir şey yok! Herkese açık bir şeyler yazın veya burayı doldurmak için diğer sunuculardaki kullanıcıları takip edin", + "empty_state.no_results": "Sonuç yok", "error.no_hashtag_feed_access": "Bu etiketi görüntülemek ve takip etmek için katılın veya giriş yapın.", "error.unexpected_crash.explanation": "Bizim kodumuzdaki bir hatadan ya da tarayıcı uyumluluk sorunundan dolayı, bu sayfa düzgün görüntülenemedi.", "error.unexpected_crash.explanation_addons": "Bu sayfa doğru görüntülenemedi. Bu hata büyük olasılıkla bir tarayıcı eklentisinden veya otomatik çeviri araçlarından kaynaklanır.", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 80702ff3f6..5a62060560 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -441,7 +441,7 @@ "interaction_modal.on_another_server": "На іншому сервері", "interaction_modal.on_this_server": "На цьому сервері", "interaction_modal.title": "Увійдіть, щоб продовжити", - "interaction_modal.username_prompt": "Наприклад, %{example}", + "interaction_modal.username_prompt": "Наприклад, {example}", "intervals.full.days": "{number, plural, one {# день} few {# дні} other {# днів}}", "intervals.full.hours": "{number, plural, one {# година} few {# години} other {# годин}}", "intervals.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}", diff --git a/config/locales/el.yml b/config/locales/el.yml index b91beb13ad..e436005caf 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -245,7 +245,7 @@ el: update_user_role: Ενημέρωση ρόλου update_username_block: Ενημέρωση Κανόνα Ονόματος Χρήστη actions: - approve_appeal_html: Ο/Η %{name} ενέκρινε την ένσταση της απόφασης των συντονιστών από %{target} + approve_appeal_html: Ο/Η %{name} ενέκρινε την έφεση της απόφασης των συντονιστών από %{target} approve_user_html: Ο/Η %{name} ενέκρινε την εγγραφή του χρήστη %{target} assigned_to_self_report_html: Ο/Η %{name} ανάθεσε την αναφορά %{target} στον εαυτό του/της change_email_user_html: Ο χρήστης %{name} άλλαξε τη διεύθυνση email του χρήστη %{target} @@ -289,7 +289,7 @@ el: memorialize_account_html: O/H %{name} μετέτρεψε τον λογαριασμό του %{target} σε σελίδα εις μνήμην promote_user_html: Ο/Η %{name} προβίβασε το χρήστη %{target} publish_terms_of_service_html: Ο χρήστης %{name} δημοσίευσε ενημερώσεις για τους όρους της υπηρεσίας - reject_appeal_html: Ο/Η %{name} απέρριψε την ένσταση της απόφασης των συντονιστών από %{target} + reject_appeal_html: Ο/Η %{name} απέρριψε την έφεση της απόφασης των συντονιστών από %{target} reject_user_html: Ο/Η %{name} απέρριψε την εγγραφή του χρήστη %{target} remove_avatar_user_html: Ο/Η %{name} αφαίρεσε το άβαταρ του/της %{target} reopen_report_html: Ο/Η %{name} ξανάνοιξε την αναφορά %{target} @@ -403,7 +403,7 @@ el: website: Ιστοσελίδα disputes: appeals: - empty: Καμία ένσταση. + empty: Δε βρέθηκαν εφέσεις. title: Εφέσεις domain_allows: add_new: Έγκριση τομέα @@ -1166,7 +1166,7 @@ el: mark_statuses_as_sensitive: να επισημάνουν τις αναρτήσεις τους ως ευαίσθητες none: μια προειδοποίηση sensitive: να επισημάνουν τον λογαριασμό του ως ευαίσθητο - silence: να περιορίσουν το λογαριασμό του + silence: να περιορίσουν τον λογαριασμό του suspend: να αναστείλουν τον λογαριασμό του body: 'Ο/Η %{target} κάνει έφεση στην απόφαση συντονισμού που έγινε από τον/την %{action_taken_by} στις %{date}, η οποία ήταν %{type}. Έγραψαν:' next_steps: Μπορείς να εγκρίνεις την έφεση για να αναιρέσεις την απόφαση της ομάδας συντονισμού ή να την αγνοήσεις. @@ -2095,7 +2095,7 @@ el: title: Σημαντική ενημέρωση warning: appeal: Υποβολή έφεσης - appeal_description: Αν πιστεύεις ότι έγινε λάθος, μπορείς να υποβάλεις μια αίτηση στο προσωπικό του %{instance}. + appeal_description: Αν πιστεύεις ότι έγινε λάθος, μπορείς να υποβάλεις μια έφεση στο προσωπικό του %{instance}. categories: spam: Ανεπιθύμητο violation: Το περιεχόμενο παραβιάζει τις ακόλουθες οδηγίες κοινότητας diff --git a/config/locales/es.yml b/config/locales/es.yml index 1f50067bb9..f845ac45ac 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -12,6 +12,9 @@ es: followers: one: Seguidor other: Seguidores + following: + one: Siguiendo + other: Siguiendo instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al propio servidor y no a ningún usuario individual. Se utiliza con fines de federación y no debe suspenderse. last_active: última conexión link_verified_on: La propiedad de este vínculo fue verificada el %{date} @@ -1999,9 +2002,9 @@ es: '63113904': 2 años '7889238': 3 meses min_age_label: Umbral de tiempo - min_favs: Mantener mensajes con un número de favoritos mayor que + min_favs: Mantener publicaciones con un número de favoritos de al menos min_favs_hint: No borra ninguna de las publicaciones que hayan recibido al menos esta cantidad de favoritos. Deja en blanco para eliminar publicaciones sin importar el número de favoritos - min_reblogs: Mantener publicaciones reblogueadas más de + min_reblogs: Mantener publicaciones impulsadas al menos min_reblogs_hint: No borra ninguna de las publicaciones que hayan sido impulsadas más de este número de veces. Deja en blanco para eliminar publicaciones sin importar el número de impulsos stream_entries: sensitive_content: Contenido sensible diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 3c68c023af..37b2eb9a8d 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -12,6 +12,9 @@ hu: followers: one: Követő other: Követő + following: + one: Követve + other: Követve instance_actor_flash: Ez a fiók virtuális, magát a kiszolgálót reprezentálja, nem pedig konkrét felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni. last_active: utoljára aktív link_verified_on: 'A hivatkozás tulajdonosa ekkor volt ellenőrizve: %{date}' diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 2ee31744b6..b53e827811 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -12,6 +12,9 @@ nl: followers: one: Volger other: Volgers + following: + one: Volgend + other: Volgend instance_actor_flash: Dit account is een 'virtual actor' waarmee de server zichzelf vertegenwoordigt en is dus geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden opgeschort. last_active: laatst actief link_verified_on: Eigendom van deze link is gecontroleerd op %{date} diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 7cafce55b2..9333108ca3 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -12,6 +12,9 @@ pt-PT: followers: one: Seguidor other: Seguidores + following: + one: A seguir + other: A seguir instance_actor_flash: Esta conta é um ator virtual utilizado para representar o servidor em si e não um utilizador individual. É utilizada para efeitos de federação e não deve ser suspensa. last_active: última atividade link_verified_on: A posse desta hiperligação foi verificada em %{date} From 920e9fa9d329bbecf9000c94aeacd245749cf4c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:30:35 +0100 Subject: [PATCH 6/8] Update dependency axios to v1.13.5 [SECURITY] (#37803) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index c482f7a0fc..418661c955 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5527,13 +5527,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.13.4 - resolution: "axios@npm:1.13.4" + version: 1.13.5 + resolution: "axios@npm:1.13.5" dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.4" + follow-redirects: "npm:^1.15.11" + form-data: "npm:^4.0.5" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/474c00b7d71f4de4ad562589dae6b615149df7c2583bbc5ebba96229f3f85bfb0775d23705338df072f12e48d3e85685c065a3cf6855d58968a672d19214c728 + checksum: 10c0/abf468c34f2d145f3dc7dbc0f1be67e520630624307bda69a41bbe8d386bd672d87b4405c4ee77f9ff54b235ab02f96a9968fb00e75b13ce64706e352a3068fd languageName: node linkType: hard @@ -7724,13 +7724,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" +"follow-redirects@npm:^1.15.11": + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343 languageName: node linkType: hard @@ -7753,16 +7753,16 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.4": - version: 4.0.4 - resolution: "form-data@npm:4.0.4" +"form-data@npm:^4.0.5": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" es-set-tostringtag: "npm:^2.1.0" hasown: "npm:^2.0.2" mime-types: "npm:^2.1.12" - checksum: 10c0/373525a9a034b9d57073e55eab79e501a714ffac02e7a9b01be1c820780652b16e4101819785e1e18f8d98f0aee866cc654d660a435c378e16a72f2e7cac9695 + checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b languageName: node linkType: hard From b8d735411fef0753efe05125a15448afb3d375dc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:49:41 +0100 Subject: [PATCH 7/8] Update dependency vite-tsconfig-paths to v6.1.0 (#37773) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 418661c955..982c22c320 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14248,15 +14248,15 @@ __metadata: linkType: hard "vite-tsconfig-paths@npm:^6.0.0": - version: 6.0.5 - resolution: "vite-tsconfig-paths@npm:6.0.5" + version: 6.1.0 + resolution: "vite-tsconfig-paths@npm:6.1.0" dependencies: debug: "npm:^4.1.1" globrex: "npm:^0.1.2" tsconfck: "npm:^3.0.3" peerDependencies: vite: "*" - checksum: 10c0/c62dd84804b9d2d35460146bda0bb752d270043d805df0e806ade6a9bbf37c5ad5da8a29d822b89931821545c201bc7ca07c594f245aebabe92d51d0cd1b63df + checksum: 10c0/b2c9edb43592f4c4e4c4b9f1a613a196e78b727a8ffdd77a4bad1833dcf903fb9a8b23eabf5113f800585f87c2e8e9f93cba9a0e21cfe9a7e58edc7e9edcb3f5 languageName: node linkType: hard From 2774e0fbfa045e883ec94e873e657e9e8fefa98b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 10 Feb 2026 05:49:49 -0500 Subject: [PATCH 8/8] Reduce stubbing SUT for `EmailMxValidator` spec (#37750) --- spec/validators/email_mx_validator_spec.rb | 102 +++++++++++++-------- 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb index 7109c9f4e2..0ffbf7fb8b 100644 --- a/spec/validators/email_mx_validator_spec.rb +++ b/spec/validators/email_mx_validator_spec.rb @@ -3,75 +3,95 @@ require 'rails_helper' RSpec.describe EmailMxValidator do - describe '#validate' do - let(:user) { instance_double(User, email: 'foo@example.com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) } - let(:resolv_dns_double) { instance_double(Resolv::DNS) } + let(:user) { Fabricate.build :user, email: } + let(:email) { 'foo@example.com' } + let(:resolv_dns_double) { instance_double(Resolv::DNS) } - context 'with an e-mail domain that is explicitly allowed' do - around do |block| - tmp = Rails.configuration.x.email_domains_allowlist - Rails.configuration.x.email_domains_allowlist = 'example.com' - block.call - Rails.configuration.x.email_domains_allowlist = tmp - end + context 'with an e-mail domain that is explicitly allowed' do + around do |example| + original = Rails.configuration.x.email_domains_allowlist + Rails.configuration.x.email_domains_allowlist = 'example.com' + example.run + Rails.configuration.x.email_domains_allowlist = original + end - it 'does not add errors if there are no DNS records' do - configure_resolver('example.com') + context 'when there are not DNS records' do + before { configure_resolver('example.com') } + it 'does not add errors to record' do subject.validate(user) - expect(user.errors).to_not have_received(:add) + expect(user.errors).to be_empty end end + end - it 'adds no error if there are DNS records for the e-mail domain' do - configure_resolver('example.com', a: resolv_double_a('192.0.2.42')) + context 'when there are DNS records for the domain' do + before { configure_resolver('example.com', a: resolv_double_a('192.0.2.42')) } + it 'does not add errors to record' do subject.validate(user) - expect(user.errors).to_not have_received(:add) + expect(user.errors).to be_empty + end + end + + context 'when the TagManager fails to normalize the domain' do + before do + allow(TagManager).to receive(:instance).and_return(tag_manage_double) + allow(tag_manage_double).to receive(:normalize_domain).with('example.com').and_raise(Addressable::URI::InvalidURIError) end - it 'adds an error if the TagManager fails to normalize domain' do - double = instance_double(TagManager) - allow(TagManager).to receive(:instance).and_return(double) - allow(double).to receive(:normalize_domain).with('example.com').and_raise(Addressable::URI::InvalidURIError) + let(:tag_manage_double) { instance_double(TagManager) } - user = instance_double(User, email: 'foo@example.com', errors: instance_double(ActiveModel::Errors, add: nil)) + it 'adds errors to record' do subject.validate(user) - expect(user.errors).to have_received(:add) + expect(user.errors).to be_present end + end - it 'adds an error if the domain email portion is blank' do - user = instance_double(User, email: 'foo@', errors: instance_double(ActiveModel::Errors, add: nil)) + context 'when the email portion is blank' do + let(:email) { 'foo@' } + + it 'adds errors to record' do subject.validate(user) - expect(user.errors).to have_received(:add) + expect(user.errors).to be_present end + end - it 'adds an error if the email domain name contains empty labels' do - configure_resolver('example..com', a: resolv_double_a('192.0.2.42')) + context 'when the email domain contains empty labels' do + let(:email) { 'foo@example..com' } - user = instance_double(User, email: 'foo@example..com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) + before { configure_resolver('example..com', a: resolv_double_a('192.0.2.42')) } + + it 'adds errors to record' do subject.validate(user) - expect(user.errors).to have_received(:add) + expect(user.errors).to be_present end + end - it 'adds an error if there are no DNS records for the e-mail domain' do - configure_resolver('example.com') + context 'when there are no DNS records for the email domain' do + before { configure_resolver('example.com') } + it 'adds errors to record' do subject.validate(user) - expect(user.errors).to have_received(:add) + expect(user.errors).to be_present end + end - it 'adds an error if a MX record does not lead to an IP' do + context 'when MX record does not lead to an IP' do + before do configure_resolver('example.com', mx: resolv_double_mx('mail.example.com')) configure_resolver('mail.example.com') - - subject.validate(user) - expect(user.errors).to have_received(:add) end - it 'adds an error if the MX record has an email domain block' do - EmailDomainBlock.create!(domain: 'mail.example.com') + it 'adds errors to record' do + subject.validate(user) + expect(user.errors).to be_present + end + end + context 'when the MX record has an email domain block' do + before do + Fabricate :email_domain_block, domain: 'mail.example.com' configure_resolver( 'example.com', mx: resolv_double_mx('mail.example.com') @@ -81,12 +101,16 @@ RSpec.describe EmailMxValidator do a: instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5'), aaaa: instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2') ) + end + it 'adds errors to record' do subject.validate(user) - expect(user.errors).to have_received(:add) + expect(user.errors).to be_present end end + private + def configure_resolver(domain, options = {}) allow(resolv_dns_double) .to receive(:getresources)