From cb7bd8ee0333b608b168c20f32acf3337412dac0 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 26 Nov 2020 14:42:12 +0100 Subject: [PATCH 01/83] New Crowdin updates (#15137) * New translations en.yml (Kabyle) [ci skip] * New translations en.json (Kabyle) [ci skip] * New translations en.yml (Sanskrit) [ci skip] * New translations en.json (Sanskrit) [ci skip] * New translations en.yml (Sardinian) [ci skip] * New translations en.json (Sardinian) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Sorani (Kurdish)) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Swedish) [ci skip] * New translations en.json (Tamil) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Persian) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Tamil) [ci skip] * New translations en.yml (Urdu (Pakistan)) [ci skip] * New translations en.json (Urdu (Pakistan)) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations simple_form.en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.yml (Tamil) [ci skip] * New translations en.yml (Telugu) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.json (Telugu) [ci skip] * New translations en.yml (Malay) [ci skip] * New translations en.json (Malay) [ci skip] * New translations en.yml (Hindi) [ci skip] * New translations en.json (Hindi) [ci skip] * New translations en.yml (Latvian) [ci skip] * New translations en.json (Latvian) [ci skip] * New translations simple_form.en.yml (Estonian) [ci skip] * New translations en.json (Estonian) [ci skip] * New translations en.json (Bengali) [ci skip] * New translations simple_form.en.yml (Kazakh) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.json (Kazakh) [ci skip] * New translations simple_form.en.yml (Norwegian Nynorsk) [ci skip] * New translations en.yml (Norwegian Nynorsk) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.yml (Marathi) [ci skip] * New translations en.json (Marathi) [ci skip] * New translations simple_form.en.yml (Bengali) [ci skip] * New translations en.yml (Bengali) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations devise.en.yml (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.yml (Standard Moroccan Tamazight) [ci skip] * New translations doorkeeper.en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Kannada) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations doorkeeper.en.yml (Esperanto) [ci skip] * New translations doorkeeper.en.yml (Esperanto) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations simple_form.en.yml (Vietnamese) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations devise.en.yml (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations doorkeeper.en.yml (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations simple_form.en.yml (Vietnamese) [ci skip] * New translations doorkeeper.en.yml (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations devise.en.yml (Czech) [ci skip] * New translations devise.en.yml (Czech) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.json (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations simple_form.en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations simple_form.en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations devise.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations devise.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations devise.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.json (Galician) [ci skip] * New translations devise.en.yml (Galician) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.json (Sardinian) [ci skip] * New translations en.json (Sardinian) [ci skip] * New translations en.json (Sardinian) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Sorani (Kurdish)) [ci skip] * New translations doorkeeper.en.yml (Sorani (Kurdish)) [ci skip] * Ran `i18n-tasks normalize` * Ran `yarn manage:translations` Co-authored-by: Yamagishi Kazutoshi --- app/javascript/mastodon/locales/cs.json | 8 +- .../mastodon/locales/defaultMessages.json | 13 + app/javascript/mastodon/locales/eo.json | 6 +- app/javascript/mastodon/locales/fa.json | 2 +- app/javascript/mastodon/locales/fr.json | 2 +- app/javascript/mastodon/locales/gl.json | 10 +- app/javascript/mastodon/locales/hy.json | 26 +- app/javascript/mastodon/locales/ja.json | 4 +- app/javascript/mastodon/locales/kn.json | 8 +- app/javascript/mastodon/locales/pl.json | 4 +- app/javascript/mastodon/locales/ru.json | 2 +- app/javascript/mastodon/locales/sc.json | 52 +- app/javascript/mastodon/locales/tr.json | 2 +- app/javascript/mastodon/locales/vi.json | 36 +- app/javascript/mastodon/locales/zgh.json | 20 +- app/javascript/mastodon/locales/zh-HK.json | 52 +- app/javascript/mastodon/locales/zh-TW.json | 18 +- config/locales/activerecord.ku.yml | 18 +- config/locales/ca.yml | 3 + config/locales/co.yml | 1 + config/locales/da.yml | 3 + config/locales/de.yml | 3 + config/locales/devise.cs.yml | 13 + config/locales/devise.es.yml | 116 +- config/locales/devise.gl.yml | 2 +- config/locales/devise.ja.yml | 2 +- config/locales/devise.ku.yml | 116 +- config/locales/devise.nn.yml | 15 + config/locales/devise.vi.yml | 2 +- config/locales/devise.zh-HK.yml | 17 + config/locales/doorkeeper.eo.yml | 14 +- config/locales/doorkeeper.ku.yml | 152 +- config/locales/doorkeeper.vi.yml | 14 +- config/locales/doorkeeper.zgh.yml | 3 + config/locales/eo.yml | 9 +- config/locales/es-AR.yml | 5 +- config/locales/es.yml | 3 + config/locales/fa.yml | 2 + config/locales/fr.yml | 15 +- config/locales/gl.yml | 19 +- config/locales/hu.yml | 3 + config/locales/hy.yml | 87 + config/locales/id.yml | 3 + config/locales/is.yml | 1 + config/locales/it.yml | 3 + config/locales/ja.yml | 20 +- config/locales/ko.yml | 3 + config/locales/ku.yml | 1400 ++++++++++++++++- config/locales/oc.yml | 16 +- config/locales/pl.yml | 15 + config/locales/pt-BR.yml | 13 + config/locales/pt-PT.yml | 3 + config/locales/ru.yml | 3 + config/locales/simple_form.eo.yml | 2 +- config/locales/simple_form.fr.yml | 2 +- config/locales/simple_form.hy.yml | 9 + config/locales/simple_form.ku.yml | 212 ++- config/locales/simple_form.oc.yml | 5 + config/locales/simple_form.pl.yml | 1 + config/locales/simple_form.pt-BR.yml | 1 + config/locales/simple_form.vi.yml | 28 +- config/locales/simple_form.zh-HK.yml | 2 + config/locales/simple_form.zh-TW.yml | 1 + config/locales/sq.yml | 3 + config/locales/sv.yml | 3 + config/locales/th.yml | 6 + config/locales/tr.yml | 35 +- config/locales/vi.yml | 146 +- config/locales/zgh.yml | 18 + config/locales/zh-CN.yml | 3 + config/locales/zh-HK.yml | 3 + config/locales/zh-TW.yml | 6 + 72 files changed, 2610 insertions(+), 258 deletions(-) diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index ad47b064c..c43b3c875 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -1,5 +1,5 @@ { - "account.account_note_header": "Note", + "account.account_note_header": "Poznámka", "account.add_or_remove_from_list": "Přidat nebo odstranit ze seznamů", "account.badges.bot": "Robot", "account.badges.group": "Skupina", @@ -326,14 +326,14 @@ "notifications.column_settings.reblog": "Boosty:", "notifications.column_settings.show": "Zobrazit ve sloupci", "notifications.column_settings.sound": "Přehrát zvuk", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.status": "Nové tooty:", "notifications.filter.all": "Vše", "notifications.filter.boosts": "Boosty", "notifications.filter.favourites": "Oblíbení", "notifications.filter.follows": "Sledování", "notifications.filter.mentions": "Zmínky", "notifications.filter.polls": "Výsledky anket", - "notifications.filter.statuses": "Updates from people you follow", + "notifications.filter.statuses": "Aktuality od lidí, které sledujete", "notifications.group": "{count} oznámení", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", @@ -458,7 +458,7 @@ "upload_form.audio_description": "Popis pro sluchově postižené", "upload_form.description": "Popis pro zrakově postižené", "upload_form.edit": "Upravit", - "upload_form.thumbnail": "Change thumbnail", + "upload_form.thumbnail": "Změnit miniaturu", "upload_form.undo": "Smazat", "upload_form.video_description": "Popis pro sluchově či zrakově postižené", "upload_modal.analyzing_picture": "Analyzuji obrázek…", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index c49c6399d..ae9ba853e 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -2388,6 +2388,10 @@ }, { "descriptors": [ + { + "defaultMessage": "Close", + "id": "lightbox.close" + }, { "defaultMessage": "Never miss a thing", "id": "notifications_permission_banner.title" @@ -2478,6 +2482,15 @@ ], "path": "app/javascript/mastodon/features/picture_in_picture/components/footer.json" }, + { + "descriptors": [ + { + "defaultMessage": "Close", + "id": "lightbox.close" + } + ], + "path": "app/javascript/mastodon/features/picture_in_picture/components/header.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index b401e5bbe..1b5f18884 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -236,7 +236,7 @@ "keyboard_shortcuts.hotkey": "Rapidklavo", "keyboard_shortcuts.legend": "montri ĉi tiun noton", "keyboard_shortcuts.local": "malfermi la lokan tempolinion", - "keyboard_shortcuts.mention": "por mencii la aŭtoron", + "keyboard_shortcuts.mention": "mencii la aŭtoron", "keyboard_shortcuts.muted": "malfermi la liston de silentigitaj uzantoj", "keyboard_shortcuts.my_profile": "malfermi vian profilon", "keyboard_shortcuts.notifications": "malfermi la kolumnon de sciigoj", @@ -246,7 +246,7 @@ "keyboard_shortcuts.reply": "respondi", "keyboard_shortcuts.requests": "malfermi la liston de petoj de sekvado", "keyboard_shortcuts.search": "enfokusigi la serĉilon", - "keyboard_shortcuts.spoilers": "to show/hide CW field", + "keyboard_shortcuts.spoilers": "montri/kaŝi la kampon de enhava averto", "keyboard_shortcuts.start": "malfermi la kolumnon «por komenci»", "keyboard_shortcuts.toggle_hidden": "montri/kaŝi tekston malantaŭ enhava averto", "keyboard_shortcuts.toggle_sensitivity": "montri/kaŝi aŭdovidaĵojn", @@ -326,7 +326,7 @@ "notifications.column_settings.reblog": "Diskonigoj:", "notifications.column_settings.show": "Montri en kolumno", "notifications.column_settings.sound": "Eligi sonon", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.status": "Novaj mesaĝoj:", "notifications.filter.all": "Ĉiuj", "notifications.filter.boosts": "Diskonigoj", "notifications.filter.favourites": "Stelumoj", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index a38d21e1c..44c936142 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -80,7 +80,7 @@ "column_header.pin": "ثابت‌کردن", "column_header.show_settings": "نمایش تنظیمات", "column_header.unpin": "رهاکردن", - "column_subheading.settings": "تنظیمات", + "column_subheading.settings": "ساماندهی", "community.column_settings.local_only": "تنها بومی", "community.column_settings.media_only": "فقط رسانه", "community.column_settings.remote_only": "تنها دوردست", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index a70a5c1c7..19c86722d 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -99,7 +99,7 @@ "compose_form.publish": "Pouet", "compose_form.publish_loud": "{publish} !", "compose_form.sensitive.hide": "Marquer le média comme sensible", - "compose_form.sensitive.marked": "Média marqué comme sensible", + "compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}", "compose_form.sensitive.unmarked": "Le média n’est pas marqué comme sensible", "compose_form.spoiler.marked": "Le texte est caché derrière un avertissement", "compose_form.spoiler.unmarked": "Le texte n’est pas caché", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 591d1c13a..6fe22e1d4 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -73,7 +73,7 @@ "column.notifications": "Notificacións", "column.pins": "Toots fixados", "column.public": "Cronoloxía federada", - "column_back_button.label": "Voltar", + "column_back_button.label": "Volver", "column_header.hide_settings": "Agochar axustes", "column_header.moveLeft_settings": "Mover columna cara a esquerda", "column_header.moveRight_settings": "Mover columna cara a dereita", @@ -219,7 +219,7 @@ "introduction.welcome.action": "Imos!", "introduction.welcome.headline": "Primeiros pasos", "introduction.welcome.text": "Benvida ó fediverso! Nun intre poderás difundir mensaxes e falar coas túas amizades nun grande número de servidores. Mais este servidor, {domain}, é especial—hospeda o teu perfil, por iso lémbra o seu nome.", - "keyboard_shortcuts.back": "para voltar atrás", + "keyboard_shortcuts.back": "para volver atrás", "keyboard_shortcuts.blocked": "abrir lista de usuarias bloqueadas", "keyboard_shortcuts.boost": "promover", "keyboard_shortcuts.column": "para destacar un toot nunha das columnas", @@ -336,10 +336,10 @@ "notifications.filter.statuses": "Actualizacións de xente á que segues", "notifications.group": "{count} notificacións", "notifications.mark_as_read": "Marcar todas as notificacións como lidas", - "notifications.permission_denied": "Non se activaron as notificacións de escritorio porque se denegou o permiso.", + "notifications.permission_denied": "Non se activaron as notificacións de escritorio porque se denegou o permiso", "notifications.permission_denied_alert": "Non se poden activar as notificacións de escritorio, xa que o permiso para o navegador foi denegado previamente", "notifications_permission_banner.enable": "Activar notificacións de escritorio", - "notifications_permission_banner.how_to_control": "Activa as notificacións de escritorio para recibir notificacións mentras Mastodon non está aberto. Podes controlar de xeito preciso o tipo de interaccións crean as notificacións de escritorio a través da {icon} superior unha vez activadas.", + "notifications_permission_banner.how_to_control": "Activa as notificacións de escritorio para recibir notificacións mentras Mastodon non está aberto. Podes controlar de xeito preciso o tipo de interaccións que crean as notificacións de escritorio a través da {icon} superior unha vez están activadas.", "notifications_permission_banner.title": "Non perder nada", "picture_in_picture.restore": "Devolver", "poll.closed": "Pechado", @@ -411,7 +411,7 @@ "status.pinned": "Toot fixado", "status.read_more": "Ler máis", "status.reblog": "Promover", - "status.reblog_private": "Compartir á audiencia orixinal", + "status.reblog_private": "Compartir coa audiencia orixinal", "status.reblogged_by": "{name} promoveu", "status.reblogs.empty": "Aínda ninguén promoveu este toot. Cando alguén o faga, amosarase aquí.", "status.redraft": "Eliminar e reescribir", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 5033b8ca2..dd904bfca 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -9,10 +9,10 @@ "account.browse_more_on_origin_server": "Դիտել աւելին իրական պրոֆիլում", "account.cancel_follow_request": "չեղարկել հետեւելու հայցը", "account.direct": "Նամակ գրել @{name} -ին", - "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.disable_notifications": "Ծանուցումները անջատել @{name} գրառումների համար", "account.domain_blocked": "Տիրոյթը արգելափակուած է", "account.edit_profile": "Խմբագրել անձնական էջը", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "Ծանուցել ինձ @{name} գրառումների մասին", "account.endorse": "Ցուցադրել անձնական էջում", "account.follow": "Հետեւել", "account.followers": "Հետեւողներ", @@ -168,9 +168,9 @@ "empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր միւսներին՝ խօսակցութիւնը սկսելու համար։", "empty_column.public": "Այստեղ բան չկա՛յ։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգոյցներից էակների՝ այն լցնելու համար։", "error.unexpected_crash.explanation": "Մեր ծրագրակազմում վրիպակի կամ դիտարկչի անհամատեղելիութեան պատճառով այս էջը չի կարող լիարժէք պատկերուել։", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", + "error.unexpected_crash.explanation_addons": "Այս էջի ճիշտ պատկերումը չի ստացում։ Խափանումը հաւանաբար առաջացել է դիտարկիչի յավելվածից կամ առցանց թարգմանիչից։", "error.unexpected_crash.next_steps": "Փորձիր թարմացնել էջը։ Եթե դա չօգնի ապա կարող ես օգտվել Մաստադոնից ուրիշ դիտարկիչով կամ հավելվածով։", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.next_steps_addons": "Փորձիր անջատել յաւելուածները եւ թարմացնել էջը։ Եթե դա չօգնի, կարող ես օգտուել Մաստադոնից այլ դիտարկիչով կամ յաւելուածով։", "errors.unexpected_crash.copy_stacktrace": "Պատճենել սթաքթրեյսը սեղմատախտակին", "errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին", "follow_request.authorize": "Վավերացնել", @@ -266,9 +266,9 @@ "lists.edit.submit": "Փոխել վերնագիրը", "lists.new.create": "Ավելացնել ցանկ", "lists.new.title_placeholder": "Նոր ցանկի վերնագիր", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.all_replies": "Ում հետևում եմ", + "lists.replies_policy.list_replies": "Ցանկի անդամները", + "lists.replies_policy.no_replies": "Ոչ ոք", "lists.replies_policy.title": "Show replies to:", "lists.search": "Փնտրել քո հետեւած մարդկանց մեջ", "lists.subheading": "Քո ցանկերը", @@ -277,9 +277,9 @@ "media_gallery.toggle_visible": "Ցուցադրել/թաքցնել", "missing_indicator.label": "Չգտնվեց", "missing_indicator.sublabel": "Պաշարը չի գտնւում", - "mute_modal.duration": "Duration", + "mute_modal.duration": "Տևողություն", "mute_modal.hide_notifications": "Թաքցնե՞լ ցանուցումներն այս օգտատիրոջից։", - "mute_modal.indefinite": "Indefinite", + "mute_modal.indefinite": "Անժամկետ", "navigation_bar.apps": "Դիւրակիր յաւելուածներ", "navigation_bar.blocks": "Արգելափակված օգտատերեր", "navigation_bar.bookmarks": "Էջանիշեր", @@ -310,7 +310,7 @@ "notification.own_poll": "Հարցումդ աւարտուեց", "notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։", "notification.reblog": "{name} տարածեց թութդ", - "notification.status": "{name} just posted", + "notification.status": "{name} հենց նոր թթեց", "notifications.clear": "Մաքրել ծանուցումները", "notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապէս մաքրել քո բոլոր ծանուցումները։", "notifications.column_settings.alert": "Աշխատատիրոյթի ծանուցումներ", @@ -326,7 +326,7 @@ "notifications.column_settings.reblog": "Տարածածներից՝", "notifications.column_settings.show": "Ցուցադրել սիւնում", "notifications.column_settings.sound": "Ձայն հանել", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.status": "Նոր թթեր։", "notifications.filter.all": "Բոլորը", "notifications.filter.boosts": "Տարածածները", "notifications.filter.favourites": "Հաւանածները", @@ -335,10 +335,10 @@ "notifications.filter.polls": "Հարցման արդիւնքները", "notifications.filter.statuses": "Updates from people you follow", "notifications.group": "{count} ծանուցում", - "notifications.mark_as_read": "Mark every notification as read", + "notifications.mark_as_read": "Համարել բոլոր ծանուցումները ընթերցած", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications_permission_banner.enable": "Enable desktop notifications", + "notifications_permission_banner.enable": "Միացնել դիտարկչից ծանուցումները", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", "picture_in_picture.restore": "Put it back", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 207bcf441..ec60e0782 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -333,7 +333,7 @@ "notifications.filter.follows": "フォロー", "notifications.filter.mentions": "返信", "notifications.filter.polls": "アンケート結果", - "notifications.filter.statuses": "Updates from people you follow", + "notifications.filter.statuses": "フォローしている人の新着情報", "notifications.group": "{count} 件の通知", "notifications.mark_as_read": "すべて既読にする", "notifications.permission_denied": "ブラウザの通知が拒否されているためデスクトップ通知は利用できません", @@ -357,7 +357,7 @@ "privacy.private.short": "フォロワー限定", "privacy.public.long": "誰でも閲覧可、公開TLに表示", "privacy.public.short": "公開", - "privacy.unlisted.long": "誰でも閲覧可、公開タイムラインに非表示", + "privacy.unlisted.long": "誰でも閲覧可、公開TLに非表示", "privacy.unlisted.short": "未収載", "refresh": "更新", "regeneration_indicator.label": "読み込み中…", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 1ac564a70..0f6c71fb9 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -14,8 +14,8 @@ "account.edit_profile": "Edit profile", "account.enable_notifications": "Notify me when @{name} posts", "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", + "account.follow": "ಹಿಂಬಾಲಿಸಿ", + "account.followers": "ಹಿಂಬಾಲಕರು", "account.followers.empty": "No one follows this user yet.", "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", @@ -32,7 +32,7 @@ "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", "account.never_active": "Never", - "account.posts": "Toots", + "account.posts": "ಟೂಟ್‌ಗಳು", "account.posts_with_replies": "Toots and replies", "account.report": "Report @{name}", "account.requested": "Awaiting approval", @@ -54,7 +54,7 @@ "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", + "bundle_column_error.retry": "ಮರಳಿ ಪ್ರಯತ್ನಿಸಿ", "bundle_column_error.title": "Network error", "bundle_modal_error.close": "Close", "bundle_modal_error.message": "Something went wrong while loading this component.", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index e06952d19..3009471f4 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -254,8 +254,8 @@ "keyboard_shortcuts.unfocus": "aby opuścić pole wyszukiwania/pisania", "keyboard_shortcuts.up": "aby przejść na górę listy", "lightbox.close": "Zamknij", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "Zmniejsz pole widoku obrazu", + "lightbox.expand": "Rozwiń pole widoku obrazu", "lightbox.next": "Następne", "lightbox.previous": "Poprzednie", "lightbox.view_context": "Pokaż kontekst", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 5a2d5a54e..c0022e524 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -98,7 +98,7 @@ "compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа", "compose_form.publish": "Запостить", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Пометить медиафайл как чувствительный", + "compose_form.sensitive.hide": "{count, plural, one {Отметить медифайл как деликатный} other {Отметить медифайлы как деликатные}}", "compose_form.sensitive.marked": "Медиафайл отмечен как деликатный", "compose_form.sensitive.unmarked": "Медиафайл не отмечен как деликатный", "compose_form.spoiler.marked": "Текст скрыт за предупреждением", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 055a52cab..cf4ceb5d0 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -6,18 +6,18 @@ "account.block": "Bloca @{name}", "account.block_domain": "Bloca domìniu{domain}", "account.blocked": "Blocadu", - "account.browse_more_on_origin_server": "Browse more on the original profile", + "account.browse_more_on_origin_server": "Esplora de prus in su profilu originale", "account.cancel_follow_request": "Annulla rechesta de sighidura", "account.direct": "Messàgiu deretu a @{name}", - "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.disable_notifications": "Acaba·la de mi notificare cando @{name} publicat carchi cosa", "account.domain_blocked": "Domìniu blocadu", "account.edit_profile": "Modìfica profilu", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "Notìfica·mi cando @{name} pùblicat carchi cosa", "account.endorse": "Cussìgia in su profilu tuo", "account.follow": "Sighi", "account.followers": "Sighiduras", "account.followers.empty": "Nemos sighit ancora custa persone.", - "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", + "account.followers_counter": "{count, plural, one {{counter} Sighidore} other {{counter} Sighidores}}", "account.following_counter": "{count, plural, one {{counter} Sighidu} other {{counter} Sighidos}}", "account.follows.empty": "Custa persone non sighit ancora a nemos.", "account.follows_you": "Ti sighit", @@ -38,14 +38,14 @@ "account.requested": "Incarca pro annullare sa rechesta de sighidura", "account.share": "Cumpartzi su profilu de @{name}", "account.show_reblogs": "Ammustra is cumpartziduras de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}", "account.unblock": "Isbloca @{name}", "account.unblock_domain": "Isbloca su domìniu {domain}", "account.unendorse": "Non cussiges in su profilu", "account.unfollow": "Non sigas prus", "account.unmute": "Torra a ativare @{name}", "account.unmute_notifications": "Ativa notìficas pro @{name}", - "account_note.placeholder": "Click to add a note", + "account_note.placeholder": "Incarca pro agiùnghere una nota", "alert.rate_limited.message": "Torra·bi a proare a pustis de {retry_time, time, medium}.", "alert.rate_limited.title": "Màssimu de rechestas barigadu", "alert.unexpected.message": "B'at àpidu una faddina.", @@ -81,9 +81,9 @@ "column_header.show_settings": "Ammustra is cunfiguratziones", "column_header.unpin": "Boga dae pitzu", "column_subheading.settings": "Cunfiguratziones", - "community.column_settings.local_only": "Local only", + "community.column_settings.local_only": "Locale ebbia", "community.column_settings.media_only": "Multimediale isceti", - "community.column_settings.remote_only": "Remote only", + "community.column_settings.remote_only": "Remotu ebbia", "compose_form.direct_message_warning": "Custu tut at a èssere imbiadu isceti a is persones mentovadas.", "compose_form.direct_message_warning_learn_more": "Àteras informatziones", "compose_form.hashtag_warning": "Custu tut no at a èssere ammustradu in peruna eticheta, dae chi no est listadu.", @@ -113,7 +113,7 @@ "confirmations.delete_list.confirm": "Cantzella", "confirmations.delete_list.message": "Seguru chi boles cantzellare custa lista in manera permanente?", "confirmations.domain_block.confirm": "Cua totu su domìniu", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.domain_block.message": "Ses seguru a beru, ma a beru a beru, de bòlere blocare su {domain} intreu? In sa parte manna de is casos pagos blocos o silentziamentos de utentes sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Is sighidores tuos dae cussu domìniu ant a èssere bogados.", "confirmations.logout.confirm": "Essi·nche", "confirmations.logout.message": "Seguru chi boles essire?", "confirmations.mute.confirm": "A sa muda", @@ -168,15 +168,15 @@ "empty_column.notifications": "Non tenes ancora peruna notìfica. Chistiona cun una persone pro cumintzare un'arresonada.", "empty_column.public": "Nudda inoghe. Iscrie calicuna cosa pùblica, o sighi àteras persones de àteros serbidores pro prenare custu ispàtziu", "error.unexpected_crash.explanation": "A càusa de una faddina in su còdighe nostru o unu problema de cumpatibilidade de su navigadore, custa pàgina diat pòdere no èssere ammustrada in manera curreta.", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", + "error.unexpected_crash.explanation_addons": "Custa pàgina diat pòdere no èssere ammustrada comente si tocat. Custa faddina est probàbile chi dipendat dae un'estensione de su navigadore o dae ainas automàticas de tradutzione.", "error.unexpected_crash.next_steps": "Proa de atualizare sa pàgina. Si custu non acontza su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.next_steps_addons": "Proa a ddos disabilitare e a atualizare sa pàgina. Si custu non acontzat su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.", "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace in punta de billete", "errors.unexpected_crash.report_issue": "Signala unu problema", "follow_request.authorize": "Autoriza", "follow_request.reject": "Refuda", "follow_requests.unlocked_explanation": "Fintzas si su contu tuo no est blocadu, su personale de {domain} at pensadu chi forsis bolias revisionare a manu is rechestas de custos contos.", - "generic.saved": "Saved", + "generic.saved": "Sarvadu", "getting_started.developers": "Iscuadra de isvilupu", "getting_started.directory": "Diretòriu de profilos", "getting_started.documentation": "Documentatzione", @@ -246,7 +246,7 @@ "keyboard_shortcuts.reply": "pro rispòndere", "keyboard_shortcuts.requests": "pro abèrrere sa lista de rechestas de sighidura", "keyboard_shortcuts.search": "pro atzentrare sa chirca", - "keyboard_shortcuts.spoilers": "to show/hide CW field", + "keyboard_shortcuts.spoilers": "pro ammustrare/cuare su campu AC", "keyboard_shortcuts.start": "pro abèrrere sa colunna \"Cumintza\"", "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is AC", "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare mèdias", @@ -254,8 +254,8 @@ "keyboard_shortcuts.unfocus": "pro essire de s'àrea de cumpositzione de testu o de chirca", "keyboard_shortcuts.up": "pro mòere in susu in sa lista", "lightbox.close": "Serra", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "Cumprime sa casella de visualizatzione de is immàgines", + "lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines", "lightbox.next": "Sighi", "lightbox.previous": "Pretzedente", "lightbox.view_context": "Bide su cuntestu", @@ -266,10 +266,10 @@ "lists.edit.submit": "Muda su tìtulu", "lists.new.create": "Agiunghe lista", "lists.new.title_placeholder": "Lista noa", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", - "lists.replies_policy.title": "Show replies to:", + "lists.replies_policy.all_replies": "Cale si siat utente sighidu", + "lists.replies_policy.list_replies": "Membros de sa lista", + "lists.replies_policy.no_replies": "Perunu", + "lists.replies_policy.title": "Ammustra is rispostas a:", "lists.search": "Chircare intre sa gente chi ses sighende", "lists.subheading": "Is listas tuas", "load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}", @@ -279,7 +279,7 @@ "missing_indicator.sublabel": "Resursa no agatada", "mute_modal.duration": "Duration", "mute_modal.hide_notifications": "Boles cuare is notìficas de custa persone?", - "mute_modal.indefinite": "Indefinite", + "mute_modal.indefinite": "Indefinida", "navigation_bar.apps": "Aplicatziones mòbiles", "navigation_bar.blocks": "Persones blocadas", "navigation_bar.bookmarks": "Sinnalibros", @@ -310,7 +310,7 @@ "notification.own_poll": "Sondàgiu acabbadu", "notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu", "notification.reblog": "{name} at cumpartzidu s'istadu tuo", - "notification.status": "{name} just posted", + "notification.status": "{name} at publicadu cosa", "notifications.clear": "Lìmpia notìficas", "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?", "notifications.column_settings.alert": "Notìficas de iscrivania", @@ -326,19 +326,19 @@ "notifications.column_settings.reblog": "Cumpartziduras:", "notifications.column_settings.show": "Ammustra in sa colunna", "notifications.column_settings.sound": "Reprodue unu sonu", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.status": "Tuts noos:", "notifications.filter.all": "Totus", "notifications.filter.boosts": "Cumpartziduras", "notifications.filter.favourites": "Preferidos", "notifications.filter.follows": "Sighende", "notifications.filter.mentions": "Mentovos", "notifications.filter.polls": "Resurtados dae su sondàgiu", - "notifications.filter.statuses": "Updates from people you follow", + "notifications.filter.statuses": "Agiornamentos dae is persones chi sighis", "notifications.group": "{count} notìficas", "notifications.mark_as_read": "Mark every notification as read", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications_permission_banner.enable": "Enable desktop notifications", + "notifications.permission_denied": "Is notìficas de iscrivania non sunt a disponimentu pro neghe de rechestas de permissu chi sunt istadas dennegadas in antis", + "notifications.permission_denied_alert": "Is notìficas de iscrivania non podent èssere abilitadas, ca su permissu de su navigadore est istadu dennegadu in antis", + "notifications_permission_banner.enable": "Abìlita is notìficas de iscrivania", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", "picture_in_picture.restore": "Put it back", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 650fbe806..ec5f65a0c 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -154,7 +154,7 @@ "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.", "empty_column.bookmarked_statuses": "Henüz yer imine eklediğiniz toot yok. Yer imine eklendiğinde burada görünecek.", "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 mesajınız yok. Bir tane gönderdiğinizde veya aldığınızda burada görünecektir.", + "empty_column.direct": "Henüz direkt mesajınız yok. Bir tane gönderdiğinizde veya aldığınızda burada görünecektir.", "empty_column.domain_blocks": "Henüz hiçbir gizli alan adı yok.", "empty_column.favourited_statuses": "Hiç favori tootunuz yok. Favori olduğunda burada görünecek.", "empty_column.favourites": "Kimse bu tootu favorilerine eklememiş. Biri eklediğinde burada görünecek.", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 5a3988ce8..3da7cf375 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -18,13 +18,13 @@ "account.followers": "Người theo dõi", "account.followers.empty": "Chưa có người theo dõi nào.", "account.followers_counter": "{count, plural, one {{counter} Người theo dõi} other {{counter} Người theo dõi}}", - "account.following_counter": "{count, plural, one {{counter} Đang theo dõi} other {{counter} Đang theo dõi}}", + "account.following_counter": "{count, plural, one {{counter} Theo dõi} other {{counter} Theo dõi}}", "account.follows.empty": "Người dùng này chưa theo dõi ai.", "account.follows_you": "Đang theo dõi bạn", "account.hide_reblogs": "Ẩn chia sẻ từ @{name}", - "account.last_status": "Trực tuyến", + "account.last_status": "Online", "account.link_verified_on": "Liên kết này đã được xác thực vào {date}", - "account.locked_info": "Người dùng này thiết lập trạng thái ẩn. Họ sẽ tự mình xét duyệt các yêu cầu theo dõi.", + "account.locked_info": "Đây là tài khoản riêng tư. Họ sẽ tự mình xét duyệt các yêu cầu theo dõi.", "account.media": "Bộ sưu tập", "account.mention": "Nhắc đến @{name}", "account.moved_to": "{name} đã dời sang:", @@ -60,7 +60,7 @@ "bundle_modal_error.message": "Đã có lỗi xảy ra trong khi tải nội dung này.", "bundle_modal_error.retry": "Thử lại", "column.blocks": "Người dùng đã chặn", - "column.bookmarks": "Những tút bạn đã lưu", + "column.bookmarks": "Để dành đọc lại", "column.community": "Máy chủ của bạn", "column.direct": "Tin nhắn của bạn", "column.directory": "Tìm người cùng sở thích", @@ -72,7 +72,7 @@ "column.mutes": "Người dùng đã ẩn", "column.notifications": "Thông báo", "column.pins": "Tút ghim", - "column.public": "Từ những máy chủ khác", + "column.public": "Mạng liên hợp", "column_back_button.label": "Quay lại", "column_header.hide_settings": "Ẩn bộ lọc", "column_header.moveLeft_settings": "Dời cột sang bên trái", @@ -99,8 +99,8 @@ "compose_form.publish": "Tút", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.hide": "Nội dung nhạy cảm", - "compose_form.sensitive.marked": "Nội dung đã đánh dấu nhạy cảm", - "compose_form.sensitive.unmarked": "Nội dung không đánh dấu nhạy cảm", + "compose_form.sensitive.marked": "{count, plural, one {Nội dung đã đánh dấu là nhạy cảm} other {Nội dung đã đánh dấu là nhạy cảm}}", + "compose_form.sensitive.unmarked": "{count, plural, one {Nội dung này bình thường} other {Nội dung này bình thường}}", "compose_form.spoiler.marked": "Hủy nội dung ẩn", "compose_form.spoiler.unmarked": "Tạo nội dung ẩn", "compose_form.spoiler_placeholder": "Viết nội dung ẩn của bạn ở đây", @@ -150,7 +150,7 @@ "emoji_button.symbols": "Biểu tượng", "emoji_button.travel": "Du lịch", "empty_column.account_timeline": "Chưa có tút nào!", - "empty_column.account_unavailable": "Tài khoản không còn nữa", + "empty_column.account_unavailable": "Tài khoản bị đình chỉ", "empty_column.blocks": "Bạn chưa chặn bất cứ ai.", "empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.", "empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!", @@ -159,7 +159,7 @@ "empty_column.favourited_statuses": "Bạn chưa thích tút nào. Hãy thử đi, nó sẽ xuất hiện ở đây.", "empty_column.favourites": "Chưa có ai thích tút này.", "empty_column.follow_requests": "Bạn chưa có yêu cầu theo dõi nào.", - "empty_column.hashtag": "Chưa có bài đăng nào sử dụng hashtag này.", + "empty_column.hashtag": "Chưa có bài đăng nào dùng hashtag này.", "empty_column.home": "Chưa có bất cứ gì! Hãy bắt đầu bằng cách tìm kiếm hoặc truy cập {public} để theo dõi những người bạn quan tâm.", "empty_column.home.public_timeline": "tút công khai", "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.", @@ -246,7 +246,7 @@ "keyboard_shortcuts.reply": "trả lời", "keyboard_shortcuts.requests": "mở danh sách yêu cầu theo dõi", "keyboard_shortcuts.search": "mở tìm kiếm", - "keyboard_shortcuts.spoilers": "Hiện/ẩn nội dung nhạy cảm", + "keyboard_shortcuts.spoilers": "hiện/ẩn nội dung nhạy cảm", "keyboard_shortcuts.start": "mở mục \"Dành cho người mới\"", "keyboard_shortcuts.toggle_hidden": "ẩn/hiện văn bản bên dưới spoil", "keyboard_shortcuts.toggle_sensitivity": "ẩn/hiện ảnh hoặc video", @@ -273,8 +273,8 @@ "lists.search": "Tìm kiếm những người mà bạn quan tâm", "lists.subheading": "Danh sách của bạn", "load_pending": "{count, plural, one {# tút mới} other {# tút mới}}", - "loading_indicator.label": "Chờ xíu...", - "media_gallery.toggle_visible": "Ẩn {number, plural, one {ảnh} other {ảnh}}", + "loading_indicator.label": "Đang tải...", + "media_gallery.toggle_visible": "Ẩn {number, plural, one {hình ảnh} other {hình ảnh}}", "missing_indicator.label": "Không tìm thấy", "missing_indicator.sublabel": "Nội dung này không còn tồn tại", "mute_modal.duration": "Thời hạn", @@ -311,7 +311,7 @@ "notification.poll": "Một cuộc bình chọn mà bạn tham gia đã kết thúc", "notification.reblog": "{name} chia sẻ tút của bạn", "notification.status": "{name} vừa đăng", - "notifications.clear": "Làm trống thông báo", + "notifications.clear": "Xóa hết thông báo", "notifications.clear_confirmation": "Bạn có chắc chắn muốn xóa vĩnh viễn tất cả thông báo của mình?", "notifications.column_settings.alert": "Thông báo trên máy tính", "notifications.column_settings.favourite": "Lượt thích:", @@ -371,13 +371,13 @@ "reply_indicator.cancel": "Hủy bỏ", "report.forward": "Chuyển đến {target}", "report.forward_hint": "Người dùng này ở máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?", - "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo tài khoản này:", + "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo người dùng này:", "report.placeholder": "Bổ sung thêm", "report.submit": "Gửi đi", "report.target": "Báo cáo {target}", "search.placeholder": "Tìm kiếm", "search_popout.search_format": "Gợi ý", - "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút do bạn viết, yêu thích, đã chia sẻ hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.", + "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút mà bạn đã viết, thích, chia sẻ hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "tút", "search_popout.tips.text": "Nội dung trả về là địa chỉ người dùng, tên hiển thị và hashtag", @@ -419,14 +419,14 @@ "status.reply": "Trả lời", "status.replyAll": "Trả lời tất cả", "status.report": "Báo cáo @{name}", - "status.sensitive_warning": "Nội dung nhạy cảm", + "status.sensitive_warning": "Nhạy cảm", "status.share": "Chia sẻ", "status.show_less": "Thu gọn", - "status.show_less_all": "Thu gọn tất cả", + "status.show_less_all": "Thu gọn toàn bộ", "status.show_more": "Mở rộng", "status.show_more_all": "Hiển thị tất cả", "status.show_thread": "Xem thêm", - "status.uncached_media_warning": "N/A", + "status.uncached_media_warning": "Giới hạn", "status.unmute_conversation": "Quan tâm", "status.unpin": "Bỏ ghim trên trang cá nhân", "suggestions.dismiss": "Tắt đề xuất", diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index b877d76b4..e79399ea1 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -1,13 +1,13 @@ { - "account.account_note_header": "Note", - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", + "account.account_note_header": "ⵍⵎⴷ ⵓⴳⴳⴰⵔ", + "account.add_or_remove_from_list": "ⵔⵏⵓ ⵏⵖ ⵙⵉⵜⵜⵢ ⵙⴳ ⵜⵍⴳⴰⵎⵜ", + "account.badges.bot": "ⴰⴱⵓⵜ", "account.badges.group": "ⵜⴰⵔⴰⴱⴱⵓⵜ", "account.block": "ⴳⴷⵍ @{name}", "account.block_domain": "Block domain {domain}", - "account.blocked": "Blocked", + "account.blocked": "ⵉⵜⵜⵓⴳⴷⵍ", "account.browse_more_on_origin_server": "Browse more on the original profile", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "ⵙⵔ ⵜⵓⵜⵔⴰ ⵏ ⵓⴹⴼⵕ", "account.direct": "Direct message @{name}", "account.disable_notifications": "Stop notifying me when @{name} posts", "account.domain_blocked": "Domain blocked", @@ -25,7 +25,7 @@ "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", - "account.media": "Media", + "account.media": "ⴰⵙⵏⵖⵎⵉⵙ", "account.mention": "Mention @{name}", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", @@ -70,7 +70,7 @@ "column.home": "ⴰⵙⵏⵓⴱⴳ", "column.lists": "ⵜⵉⵍⴳⴰⵎⵉⵏ", "column.mutes": "Muted users", - "column.notifications": "Notifications", + "column.notifications": "ⵜⵉⵏⵖⵎⵉⵙⵉⵏ", "column.pins": "Pinned toot", "column.public": "Federated timeline", "column_back_button.label": "Back", @@ -104,7 +104,7 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "compose_form.spoiler_placeholder": "Write your warning here", - "confirmation_modal.cancel": "Cancel", + "confirmation_modal.cancel": "ⵙⵔ", "confirmations.block.block_and_report": "Block & Report", "confirmations.block.confirm": "Block", "confirmations.block.message": "Are you sure you want to block {name}?", @@ -183,7 +183,7 @@ "getting_started.heading": "Getting started", "getting_started.invite": "Invite people", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.security": "Security", + "getting_started.security": "ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵎⵉⴹⴰⵏ", "getting_started.terms": "Terms of service", "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", @@ -311,7 +311,7 @@ "notification.poll": "A poll you have voted in has ended", "notification.reblog": "{name} boosted your status", "notification.status": "{name} just posted", - "notifications.clear": "Clear notifications", + "notifications.clear": "ⵙⴼⴹ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 346bf058e..832e2a6a0 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -1,6 +1,6 @@ { "account.account_note_header": "筆記", - "account.add_or_remove_from_list": "從名單中新增或移除", + "account.add_or_remove_from_list": "從列表中新增或移除", "account.badges.bot": "機械人", "account.badges.group": "群組", "account.block": "封鎖 @{name}", @@ -9,10 +9,10 @@ "account.browse_more_on_origin_server": "在該服務器的個人檔案頁上瀏覽更多", "account.cancel_follow_request": "取消關注請求", "account.direct": "私訊 @{name}", - "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.disable_notifications": "如果 @{name} 發文請不要再通知我", "account.domain_blocked": "服務站被隱藏", "account.edit_profile": "修改個人資料", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "如果 @{name} 發文請通知我", "account.endorse": "在個人資料推薦對方", "account.follow": "關注", "account.followers": "關注的人", @@ -168,9 +168,9 @@ "empty_column.notifications": "你沒有任何通知紀錄,快向其他用戶搭訕吧。", "empty_column.public": "跨站時間軸暫時沒有內容!快寫一些公共的文章,或者關注另一些服務站的用戶吧!你和本站、友站的交流,將決定這裏出現的內容。", "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", + "error.unexpected_crash.explanation_addons": "此頁面無法被正確顯示,這可能是由於瀏覽器的附加元件或網頁自動翻譯工具造成的。", "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.next_steps_addons": "請嘗試停止使用這些附加元件然後重新載入頁面。如果問題沒有解決,你仍然可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。", "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿", "errors.unexpected_crash.report_issue": "舉報問題", "follow_request.authorize": "批准", @@ -254,10 +254,10 @@ "keyboard_shortcuts.unfocus": "把標示移離文字輸入和搜索", "keyboard_shortcuts.up": "在列表往上移動", "lightbox.close": "關閉", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", - "lightbox.next": "繼續", - "lightbox.previous": "回退", + "lightbox.compress": "縮小檢視", + "lightbox.expand": "擴大檢視", + "lightbox.next": "下一頁", + "lightbox.previous": "上一頁", "lightbox.view_context": "檢視內文", "lists.account.add": "新增到列表", "lists.account.remove": "從列表刪除", @@ -266,10 +266,10 @@ "lists.edit.submit": "變更標題", "lists.new.create": "新增列表", "lists.new.title_placeholder": "新列表標題", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", - "lists.replies_policy.title": "Show replies to:", + "lists.replies_policy.all_replies": "任何關注的用戶", + "lists.replies_policy.list_replies": "列表中的用戶", + "lists.replies_policy.no_replies": "沒有人", + "lists.replies_policy.title": "顯示回應文章︰", "lists.search": "從你關注的用戶中搜索", "lists.subheading": "列表", "load_pending": "{count, plural, other {# 個新項目}}", @@ -277,9 +277,9 @@ "media_gallery.toggle_visible": "打開或關上", "missing_indicator.label": "找不到內容", "missing_indicator.sublabel": "無法找到內容", - "mute_modal.duration": "Duration", + "mute_modal.duration": "時間", "mute_modal.hide_notifications": "隱藏來自這用戶的通知嗎?", - "mute_modal.indefinite": "Indefinite", + "mute_modal.indefinite": "沒期限", "navigation_bar.apps": "封鎖的使用者", "navigation_bar.blocks": "被你封鎖的用戶", "navigation_bar.bookmarks": "書籤", @@ -310,7 +310,7 @@ "notification.own_poll": "您的投票已結束", "notification.poll": "您投過的投票已經結束", "notification.reblog": "{name} 轉推你的文章", - "notification.status": "{name} just posted", + "notification.status": "{name} 剛剛發了嘟文", "notifications.clear": "清空通知紀錄", "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?", "notifications.column_settings.alert": "顯示桌面通知", @@ -326,22 +326,22 @@ "notifications.column_settings.reblog": "轉推你的文章:", "notifications.column_settings.show": "在通知欄顯示", "notifications.column_settings.sound": "播放音效", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.status": "新的文章", "notifications.filter.all": "全部", "notifications.filter.boosts": "轉嘟", "notifications.filter.favourites": "最愛", "notifications.filter.follows": "關注的使用者", "notifications.filter.mentions": "提及", "notifications.filter.polls": "投票結果", - "notifications.filter.statuses": "Updates from people you follow", + "notifications.filter.statuses": "已關注的用戶的最新動態", "notifications.group": "{count} 條通知", - "notifications.mark_as_read": "Mark every notification as read", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications_permission_banner.enable": "Enable desktop notifications", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", + "notifications.mark_as_read": "標記所有通知為已讀", + "notifications.permission_denied": "瀏覽器的桌面通知權限設定為拒絕,因此不可以啟用桌面通知", + "notifications.permission_denied_alert": "瀏覽器的桌面通知權限設定為拒絕,因此不可以啟用桌面通知", + "notifications_permission_banner.enable": "啟用桌面通知", + "notifications_permission_banner.how_to_control": "啟用桌面通知可以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確控制哪些類型的互動會產生桌面通知。", + "notifications_permission_banner.title": "不放過任何通知", + "picture_in_picture.restore": "還原影片播放器", "poll.closed": "已關閉", "poll.refresh": "重新整理", "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}", @@ -468,7 +468,7 @@ "upload_modal.detect_text": "從圖片偵測文字", "upload_modal.edit_media": "編輯媒體", "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。", - "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.preparing_ocr": "準備辨識圖片文字…", "upload_modal.preview_label": "預覽 ({ratio})", "upload_progress.label": "上載中……", "video.close": "關閉影片", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 598407a30..a38a7c07a 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -254,8 +254,8 @@ "keyboard_shortcuts.unfocus": "取消輸入文字區塊 / 搜尋的焦點", "keyboard_shortcuts.up": "往上移動名單項目", "lightbox.close": "關閉", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "折疊圖片檢視框", + "lightbox.expand": "展開圖片檢視框", "lightbox.next": "下一步", "lightbox.previous": "上一步", "lightbox.view_context": "檢視內文", @@ -280,7 +280,7 @@ "mute_modal.duration": "持續時間", "mute_modal.hide_notifications": "隱藏來自這位使用者的通知?", "mute_modal.indefinite": "無期限", - "navigation_bar.apps": "封鎖的使用者", + "navigation_bar.apps": "行動應用程式", "navigation_bar.blocks": "封鎖使用者", "navigation_bar.bookmarks": "書籤", "navigation_bar.community_timeline": "本機時間軸", @@ -335,12 +335,12 @@ "notifications.filter.polls": "投票結果", "notifications.filter.statuses": "已跟隨使用者的最新動態", "notifications.group": "{count} 條通知", - "notifications.mark_as_read": "Mark every notification as read", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications_permission_banner.enable": "Enable desktop notifications", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "notifications_permission_banner.title": "Never miss a thing", + "notifications.mark_as_read": "將所有通知都標記為已讀", + "notifications.permission_denied": "由於之前拒絕了瀏覽器請求,因此桌面通知不可用", + "notifications.permission_denied_alert": "因為之前瀏覽器權限被拒絕,無法啟用桌面通知", + "notifications_permission_banner.enable": "啟用桌面通知", + "notifications_permission_banner.how_to_control": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。", + "notifications_permission_banner.title": "不要錯過任何東西!", "picture_in_picture.restore": "還原", "poll.closed": "已關閉", "poll.refresh": "重新整理", diff --git a/config/locales/activerecord.ku.yml b/config/locales/activerecord.ku.yml index 2fbf0ffd7..3b976de8c 100644 --- a/config/locales/activerecord.ku.yml +++ b/config/locales/activerecord.ku.yml @@ -1 +1,17 @@ ---- {} +--- +ku: + activerecord: + attributes: + poll: + expires_at: وادەی کۆتایی + options: هەڵبژاردنەکان + errors: + models: + account: + attributes: + username: + invalid: تەنها پیت، ژمارە و ژێرەوە + status: + attributes: + reblog: + taken: لە بار بوونی هەیە diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 1d2d7d910..3de687ed6 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -842,6 +842,7 @@ ca: request: Sol·licita el teu arxiu size: Mida blocks: Persones que has blocat + bookmarks: Marcadors csv: CSV domain_blocks: Bloquejos de dominis lists: Llistes @@ -918,6 +919,7 @@ ca: success: Les dades s'han rebut correctament i es processaran en breu types: blocking: Llista de blocats + bookmarks: Marcadors domain_blocking: Llistat de dominis bloquejats following: Llista de seguits muting: Llista de silenciats @@ -1074,6 +1076,7 @@ ca: relationships: activity: Activitat del compte dormant: Inactiu + follow_selected_followers: Segueix als seguidors seleccionats followers: Seguidors following: Seguint invited: Convidat diff --git a/config/locales/co.yml b/config/locales/co.yml index 9fe3ecb1e..7cf6f2108 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -1074,6 +1074,7 @@ co: relationships: activity: Attività di u contu dormant: Inattivu + follow_selected_followers: Abbunassi à l'abbunati selezziunati followers: Abbunati following: Abbunamenti invited: Invitatu diff --git a/config/locales/da.yml b/config/locales/da.yml index 984bd3cc4..c98404066 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -754,6 +754,7 @@ da: request: Anmod om dit arkiv size: Størrelse blocks: Du blokerer + bookmarks: Bogmærker csv: CSV domain_blocks: Domæne blokeringer lists: Lister @@ -816,6 +817,7 @@ da: success: Dine data blev succesfuldt uploaded og vil nu blive behandlet hurtigst muligt types: blocking: Blokeringsliste + bookmarks: Bogmærker domain_blocking: Domæne blokeringsliste following: Følgningsliste muting: Liste over dæmpninger @@ -941,6 +943,7 @@ da: unrecognized_emoji: er ikke en genkendt emoji relationships: activity: Aktivitet for konto + follow_selected_followers: Følg valgte følgere followers: Følgere following: Følger invited: Inviteret diff --git a/config/locales/de.yml b/config/locales/de.yml index 1e3b1dc31..78c7c6f15 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -842,6 +842,7 @@ de: request: Dein Archiv anfragen size: Größe blocks: Du hast blockiert + bookmarks: Lesezeichen csv: CSV domain_blocks: Domainblockaden lists: Listen @@ -918,6 +919,7 @@ de: success: Deine Daten wurden erfolgreich hochgeladen und werden in Kürze verarbeitet types: blocking: Blockierliste + bookmarks: Lesezeichen domain_blocking: Domain-Blockliste following: Folgeliste muting: Stummschaltungsliste @@ -1074,6 +1076,7 @@ de: relationships: activity: Kontoaktivität dormant: Inaktiv + follow_selected_followers: Ausgewählte Follower folgen followers: Folgende following: Folgt invited: Eingeladen diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml index 743a1bfd5..56ec4637d 100644 --- a/config/locales/devise.cs.yml +++ b/config/locales/devise.cs.yml @@ -60,6 +60,19 @@ cs: title: Záložní kódy pro 2FA změněny unlock_instructions: subject: 'Mastodon: Instrukce pro odemčení účtu' + webauthn_credential: + added: + explanation: Následující bezpečnostní klíč byl přidán k vašemu účtu + subject: 'Mastodon: Nový bezpečnostní klíč' + title: Byl přidán nový bezpečnostní klíč + deleted: + explanation: Následující bezpečnostní klíč byl odstraněn z vašeho účtu + subject: 'Mastodon: Bezpečnostní klíč byl smazán' + title: Jeden z vašich bezpečnostních klíčů byl smazán + webauthn_disabled: + title: Bezpečnostní klíče zakázány + webauthn_enabled: + title: Bezpečnostní klíče povoleny omniauth_callbacks: failure: Nelze vás ověřit z %{kind}, protože „%{reason}“. success: Úspěšně ověřeno z účtu %{kind}. diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml index 2fbf0ffd7..11ec46594 100644 --- a/config/locales/devise.es.yml +++ b/config/locales/devise.es.yml @@ -1 +1,115 @@ ---- {} +--- +es: + devise: + confirmations: + confirmed: Su direccion de email ha sido confirmada con exito. + send_instructions: Recibirá un correo electrónico con instrucciones sobre cómo confirmar su dirección de correo en pocos minutos. + send_paranoid_instructions: Si su dirección de correo electrónico existe en nuestra base de datos, recibirá un correo electrónico con instrucciones sobre cómo confirmar su dirección de correo en pocos minutos. + failure: + already_authenticated: Usted ya está registrado. + inactive: Su cuenta todavía no está activa. + invalid: Inválido %{authentication_keys} o contraseña. + last_attempt: Tiene un intento más antes de que su cuenta sea bloqueada. + locked: Su cuenta está bloqueada. + not_found_in_database: Inválido %{authentication_keys} o contraseña. + pending: Su cuenta aun se encuentra bajo revisión. + timeout: Su sesión ha expirado. Por favor inicie sesión de nuevo para continuar. + unauthenticated: Necesita iniciar sesión o registrarse antes de continuar. + unconfirmed: Tiene que confirmar su dirección de correo electrónico antes de continuar. + mailer: + confirmation_instructions: + action: Verificar dirección de correo electrónico + action_with_app: Confirmar y regresar a %{app} + explanation: Has creado una cuenta en %{host} con esta dirección de correo electrónico. Estas a un clic de activarla. Si no fue usted, por favor ignore este correo electrónico. + explanation_when_pending: Usted ha solicitado una invitación a %{host} con esta dirección de correo electrónico. Una vez que confirme su dirección de correo electrónico, revisaremos su aplicación. No puede iniciar sesión hasta que su aplicación sea revisada. Si su solicitud está rechazada, sus datos serán eliminados, así que no será necesaria ninguna acción adicional por ti. Si no fuera usted, por favor ignore este correo electrónico. + extra_html: Por favor revise las reglas de la instancia y nuestros términos de servicio. + subject: 'Mastodon: Instrucciones de confirmación para %{instance}' + title: Verificar dirección de correo electrónico + email_changed: + explanation: 'El correo electrónico para su cuenta esta siendo cambiada a:' + extra: Si usted no ha cambiado su correo electrónico, es probable que alguien haya conseguido acceso a su cuenta. Por favor cambie su contraseña inmediatamente o contacte al administrador de la instancia si usted no puede iniciar sesión. + subject: 'Mastodon: Correo electrónico cambiado' + title: Nueva dirección de correo electrónico + password_change: + explanation: La contraseña de su cuenta a sido cambiada. + extra: Si usted no a cambiado su contraseña. es probable que alguien a conseguido acceso a su cuenta. Por favor cambie su contraseña inmediatamente o contacte a el administrador de la instancia si usted esta bloqueado de su cuenta. + subject: 'Mastodon: Contraseña cambiada' + title: Contraseña cambiada + reconfirmation_instructions: + explanation: Confirme la nueva dirección para cambiar su coreo electrónico. + extra: Si no iniciaste este cambio, por favor ignora este correo. Esta dirección de correo para la cuenta de Mastodon no cambiará hasta que accedas al vinculo arriba. + subject: 'Mastodon: Confirme correo electrónico para %{instance}' + title: Verifique dirección de correo electrónico + reset_password_instructions: + action: Cambiar contraseña + explanation: Solicitaste una nueva contraseña para tu cuenta. + extra: Si no solicitaste esto, por favor ignora este correo. Tu contraseña no cambiará hasta que tu accedas al vinculo arriba y crees una nueva. + subject: 'Mastodon: Instrucciones para reiniciar contraseña' + title: Reiniciar contraseña + two_factor_disabled: + explanation: La autenticación de dos factores para tu cuenta ha sido deshabilitada. Ahora puedes conectarte solamente usando la dirección de correo electrónico y la contraseña. + subject: 'Mastodon: La autenticación de dos factores está deshabilitada' + title: 2FA desactivada + two_factor_enabled: + explanation: La autenticación de dos factores para tu cuenta ha sido habilitada. Se requiere un token generado por la aplicación TOTP emparejada para ingresar. + subject: 'Mastodon: La autenticación de dos factores está habilitada' + title: 2FA activada + two_factor_recovery_codes_changed: + explanation: Los códigos de recuperación previos han sido invalidados y se generaron códigos nuevos. + subject: 'Mastodon: Los códigos de recuperación de dos factores fueron regenerados' + title: Códigos de recuperación 2FA cambiados + unlock_instructions: + subject: 'Mastodon: Instrucciones para desbloquear' + webauthn_credential: + added: + explanation: La siguiente clave de seguridad ha sido añadida a su cuenta + subject: 'Mastodon: Nueva clave de seguridad' + title: Se agregó una nueva clave de seguridad + deleted: + explanation: La siguiente clave de seguridad ha sido eliminada de su cuenta + subject: 'Mastodon: Clave de seguridad eliminada' + title: Una de sus claves de seguridad ha sido eliminada + webauthn_disabled: + explanation: La autenticación con claves de seguridad ha sido desactivada para tu cuenta. El inicio de sesión es ahora posible únicamente utilizando el token generado por la aplicación emparejada TOTP. + subject: 'Mastodon: Autenticación con claves de seguridad desactivada' + title: Claves de seguridad desactivadas + webauthn_enabled: + explanation: La autenticación con clave de seguridad ha sido habilitada para su cuenta. Su clave de seguridad ahora puede ser usada para iniciar sesión. + subject: 'Mastodon: Autenticación con clave de seguridad activada' + title: Claves de seguridad activadas + omniauth_callbacks: + failure: No podemos autentificarle desde %{kind} debido a "%{reason}". + success: Autentificado con éxito desde la cuenta %{kind} . + passwords: + no_token: No puede acceder a esta página sin provenir desde el correo de reinicio de contraseña. Si viene desde el correo de reinicio de contraseña, por favor asegúrese que está utilizando la dirección completa proporcionada. + send_instructions: Recibirá un correo electrónico con instrucciones sobre cómo reiniciar su contraseña en pocos minutos. + send_paranoid_instructions: Si su correo electrónico existe en nuestra base de datos, recibirá un enlace de recuperación de contraseña en su dirección de correo en pocos minutos. + updated: Su contraseña ha sido cambiada con éxito. Ahora ya está registrado. + updated_not_active: Su contraseña ha sido cambiada con éxito. + registrations: + destroyed: "¡Adios! Su cuenta ha sido cancelada con éxito. Esperamos verle pronto de nuevo." + signed_up: "¡Bienvenido! Se ha registrado con éxito." + signed_up_but_inactive: Se ha registrado con éxito. Sin embargo, no podemos identificarle porque su cuenta no ha sido activada todavía. + signed_up_but_locked: Se ha registrado con éxito. Sin embargo, no podemos identificarle porque su cuenta está bloqueada. + signed_up_but_pending: Un mensaje con un enlace de confirmacion ha sido enviado a su direccion de email. Luego de clickear el link revisaremos su aplicacion. Seras notificado si es aprovada. + signed_up_but_unconfirmed: Un mensaje con un enlace de confirmación ha sido enviado a su correo electrónico. Por favor siga el enlace para activar su cuenta. + update_needs_confirmation: Ha actualizado su cuenta con éxito, pero necesitamos verificar su nueva dirección de correo. Por favor compruebe su correo y siga el enlace para confirmar su nueva dirección de correo. + updated: su cuenta ha sido actualizada con éxito. + sessions: + already_signed_out: Cerró sesión con éxito. + signed_in: Se registró con éxito. + signed_out: Cerró sesión con éxito. + unlocks: + send_instructions: Recibirá un correo electrónico con instrucciones sobre cómo desbloquear su cuenta en pocos minutos. + send_paranoid_instructions: Si su cuenta existe, recibirá un correo electrónico con instrucciones sobre cómo desbloquearla en pocos minutos. + unlocked: Su cuenta ha sido desbloqueada con éxito. Por favor inicie sesión para continuar. + errors: + messages: + already_confirmed: ya fue confirmado, por favor intente iniciar sesión + confirmation_period_expired: necesita ser confirmado dentro de %{period}, por favor pida una nueva + expired: ha expirado, por favor pida una nueva + not_found: no encontrado + not_locked: no fue bloqueada + not_saved: + one: '1 error prohibió este %{resource} de ser guardado:' + other: "%{count} errores prohibieron este %{resource} de ser guardado:" diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml index 07ab2557a..6c8718f28 100644 --- a/config/locales/devise.gl.yml +++ b/config/locales/devise.gl.yml @@ -19,7 +19,7 @@ gl: mailer: confirmation_instructions: action: Verificar o enderezo de email - action_with_app: Confirmar e voltar a %{app} + action_with_app: Confirmar e volver a %{app} explanation: Creaches unha conta en %{host} con este enderezo de email. Estás a un clic de activala. Se non foches ti o que fixeches este rexisto, por favor ignora esta mensaxe. explanation_when_pending: Solicitaches un convite para %{host} con este enderezo de email. Logo de que confirmes o teu enderezo de email, imos revisar a túa inscrición. Podes iniciar sesión para mudar os teus datos ou eliminar a túa conta, mais non poderás aceder á meirande parte das funcións até que a túa conta sexa aprobada. Se a túa inscrición for rexeitada, os teus datos serán eliminados, polo que non será necesaria calquera acción adicional da túa parte. Se non solicitaches este convite, por favor, ignora este correo. extra_html: Por favor, le as regras do servidor e os nosos termos do servizo. diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml index 880566895..73e79be23 100644 --- a/config/locales/devise.ja.yml +++ b/config/locales/devise.ja.yml @@ -76,7 +76,7 @@ ja: webauthn_enabled: explanation: あなたのアカウントでセキュリティキー認証が有効になりました。セキュリティキーをログインに使用できるようになりました。 subject: 'Mastodon: セキュリティキー認証が有効になりました' - title: セキュリティキーは無効になっています + title: セキュリティキーは有効になっています omniauth_callbacks: failure: "%{reason}によって%{kind}からのアクセスを認証できませんでした。" success: "%{kind}からのアクセスは正常に認証されました。" diff --git a/config/locales/devise.ku.yml b/config/locales/devise.ku.yml index 2fbf0ffd7..64c305681 100644 --- a/config/locales/devise.ku.yml +++ b/config/locales/devise.ku.yml @@ -1 +1,115 @@ ---- {} +--- +ku: + devise: + confirmations: + confirmed: ناونیشانی ئیمەیڵەکەت بە سەرکەوتوویی پشتڕاستکرایەوە. + send_instructions: ئیمەیڵێکت بۆ دەنێردرێت لەگەڵ ڕێنمایی بۆ چۆنیەتی دڵنیابوون لە ناونیشانی ئیمەیلەکەت لە چەند خولەکێکدا. تکایە بوخچەی سپامەکەت چاولێبکە ئەگەر ئەم ئیمەیڵەت پێنەدرا. + send_paranoid_instructions: ئەگەر ناونیشانی ئیمەیڵەکەت لە بنکەی زانیارێکانماندا هەبێت، ئیمەیڵێکت پێدەگات لەگەڵ ڕێنماییەکانی چۆنیەتی دڵنیابوون لە ناونیشانی ئیمەیلەکەت لە چەند خولەکێکدا. تکایە بۆخچەی سپامەکەت بپشکنە ئەگەر ئەم ئیمەیڵەت پێنەدرا. + failure: + already_authenticated: تۆ پێشتر چوونە ژوورەوەت کردووە. + inactive: هەژمارەکەت هێشتا کارا نەکراوە. + invalid: "%{authentication_keys} یان نهێنوشە نادروستە." + last_attempt: تۆ یەک هەوڵیدیکەت ماوە پێش ئەوەی ئەژمێرەکەت قوفڵ بێت. + locked: هەژمارەکت داخراوە. + not_found_in_database: "%{authentication_keys} یان نهێنوشە نادروستە." + pending: هەژمێرەکەت هێشتا لەژێر پێداچوونەوەدایە. + timeout: کۆبوونەوەکەت بەسەرچووە. تکایە دووبارە بچۆ ژوورەوە بۆ بەردەوام بوون. + unauthenticated: پێویستە بچیتە ژوورەوە یان بچیتە ناو چوونە ناو پێش بەردەوام بوون. + unconfirmed: دەبێت ناونیشانی ئیمەیڵەکەت پشتڕاست بکەیتەوە پێش بەردەوام بوون. + mailer: + confirmation_instructions: + action: ناونیشانی ئیمەیڵ ساخ بکەرەوە + action_with_app: پشتڕاستی بکەوە و بگەڕێوە بۆ %{app} + explanation: ئەژمێرێکت دروست کردووە لەسەر %{host} بەم ناونیشانی ئیمەیڵە. تۆ یەک کرتە دووریت لە کاراکردنی. ئەگەر ئەمە تۆ نەبووی، تکایە ئەم ئیمەیڵە فەرامۆش بکە. + explanation_when_pending: تۆ داوای بانگهێشتت کرد بۆ %{host} بەم ناونیشانی ئیمەیڵە. هەر کە دڵنیایی لە ناونیشانی ئیمەیڵەکەت دەکەیت، ئێمە پێداچوونەوە دەکەین بە بەرنامەکەتدا. دەتوانیت بچیت بۆ چوونە ژوورەوە بۆ گۆڕینی ووردەکاریەکانت یان سڕینەوەی هەژمارەکەت، بەڵام ناتوانیت دەستگەیشتنت هەبێت بە زۆربەی ئەرکەکان تا ئەژمێرەکەت پەسەند ناکرێت. ئەگەر کاربەرنامەکەت ڕەتکرایەوە، داتاکەت لادەبرێت، بۆیە پێویست بە کاری زیاتر لە تۆ ناکرێت. ئەگەر ئەمە تۆ نەبووی، تکایە ئەم ئیمەیڵە فەرامۆش بکە. + extra_html: تکایە تێڕوانە لە ڕێساکانی ڕاژەکار و مەرجەکانی خزمەتگوزاری. + subject: 'ماستۆدۆن: ڕێنماییەکانی پشتڕاستکردنەوە بۆ %{instance}' + title: ناونیشانی ئیمەیڵ ساخ بکەرەوە + email_changed: + explanation: 'ناونیشانی ئیمەیڵەکەی ئەژمێرەکەت دەگۆڕدرێت بۆ:' + extra: ئەگەر ئیمەیلەکەت نەگۆڕیت، لەوانەیە کەسێک دەستگەیشتنی بۆ هەژمارەکەت بەدەست بێت. تکایە تێپەڕوشەکەت بگۆڕە دەستبەجێ یان پەیوەندی بکە بە بەڕێوەبەری ڕاژەوە ئەگەر تۆ لە هەژمارەکەت داخرایت. + subject: 'ماستۆدۆن: ئیمەیڵ گۆڕا' + title: ناونیشانی ئیمەیڵی نوێ + password_change: + explanation: تێپەڕوشە بۆ هەژمارەکەت گۆڕاوە. + extra: ئەگەر تێپەڕوشەکەت نەگۆڕی، وا دیارە کەسێک دەستگەیشتنی بۆ هەژمارەکەت بەدەست بێت. تکایە تێپەڕوسيکەت بگۆڕە دەستبەجێ یان پەیوەندی بکە بە بەڕێوەبەری ڕاژە ئەگەر تۆ لە هەژمارەکەت داخرایت. + subject: 'ماستۆدۆن: تێپەڕوشە گۆڕدرا' + title: تێپەڕوشە گۆڕدرا + reconfirmation_instructions: + explanation: دڵنیابوون لە ناونیشانی نوێ بۆ گۆڕینی ئیمەیڵەکەت. + extra: ئەگەر ئەم گۆڕانکاریە لەلایەن تۆوە دەست پێنەکراوە، تکایە ئەم ئیمەیڵە فەرامۆش بکە. ناونیشانی ئیمەیڵ بۆ هەژمێری ماستۆدۆن ناگۆڕێ هەتا ئەو کاتەی دەستپێگەیشتنی ئەم لینکەت لە سەرەوە نیە. + subject: 'ماستۆدۆن: دووپاتی ئیمەیل بۆ %{instance}' + title: ناونیشانی ئیمەیڵ ساخ بکەرەوە + reset_password_instructions: + action: گۆڕینی تێپەڕوشە + explanation: تۆ تیپەڕوشەی نوێت داوا کرد بۆ هەژمارەکەت. + extra: ئەگەر ئەم داواکاریەت نەکرد، تکایە ئەم ئیمەیڵە فەرامۆش بکە. تێپەڕوشەکەت ناگۆڕێ هەتا نەچیتە ناو لینکی سەرەوە و دانەیەکی نوێ دروست بکەیت. + subject: 'ماستۆدۆن: رێکردنەوەی رێنماییەکانی تێپەڕوشە' + title: گەڕانەوەی تێپەڕوشە + two_factor_disabled: + explanation: سەلماندنی دوو-فاکتەر بۆ هەژمارەکەت کە لە کارخراوە. چوونەژوورەوە ئێستا دەکرێت تەنها ناونیشانی ئیمەیڵ و تێپەڕوشەکەت بەکاربهێنی. + subject: 'ماستۆدۆن: سەلماندنی دوو-فاکتەری ناچالاک کراوە' + title: 2FA ناچالاک کرا + two_factor_enabled: + explanation: سەلماندنی دوو-فاکتەر بۆ هەژمارەکەت چالاک کراوە. ئاماژەیەک کە لەلایەن نەرمەکالایTOTP جووتکراو دروست کراوە پێویستە بە چوونە ژوورەوە. + subject: 'ماستۆدۆن: سەلماندنی دوو-فاکتەری چالاک کراوە' + title: 2FA چالاک کرا + two_factor_recovery_codes_changed: + explanation: کۆدەکانی چاککردنەوەی پێشوو هەڵوەشێنرانەوە و، نوێکان دروست بوون. + subject: 'ماستۆدۆن: کۆدەکانی گەڕانەوەی دوو فاکتەر، دووبارە دروست دەکرێتەوە' + title: 2FA کۆدی چاککردنەوە گۆڕا + unlock_instructions: + subject: 'ماستۆدۆن: رێنماییەکان بکەرەوە' + webauthn_credential: + added: + explanation: کلیلی ئاسایشی خوارەوە زیادکرا بۆ هەژمارەکەت + subject: 'ماستۆدۆن: کلیلی ئاسایشی نوێ' + title: کلیلی پاراستنی نوێ زیادکرا + deleted: + explanation: کلیلی ئاسایشی خوارەوە لە هەژمارەکەت سڕایەوە + subject: 'ماستۆدۆن: کلیلی پاراستن سڕایەوە' + title: کلیلە کانی پاراستنی یەکێک لە ئێوە سڕایەوە + webauthn_disabled: + explanation: سەلماندن بە کلیلەپارێزراوەکان لە کارخراوە بۆ هەژمارەکەت. چوونەژوورەوە ئێستا دەکرێت تەنها ئەو نیشانەیە بەکاربێنیت کە لەلایەن نەرمەکالایTOTP دروست کراوە. + subject: 'ماستۆدۆن: سەلماندن لەگەڵ کلیلە پاسایشی ناچالاک کراوە' + title: کلیلە پارستنەکان ناچالاک کراون + webauthn_enabled: + explanation: سەلماندنی کلیلی ئاسایش چالاک کراوە بۆ هەژمارەکەت. ئێستا کلیلی پاراستن دەتوانرێت بۆ چوونە ژوورەوە بەکار بێت. + subject: 'ماستۆدۆن: سەلماندنی کلیلی پاراستن چالاک کراوە' + title: کلیلە کانی پاراستن چالاک کرا + omniauth_callbacks: + failure: نەیتوانی ڕەسەنایە تی %{kind} بتەوبکات لەبەرئەوەی "%{reason}". + success: سەرکەوتووانە لە هەژماری %{kind} سەلمێنرا. + passwords: + no_token: ناتوانیت دەستگەیشتنت هەبێت بەم لاپەڕەیە بەبێ ئەوەی لە ئیمەیڵێکی گەڕانەوەی تێپەڕوشەت بێت. ئەگەر لە ئیمەیڵێکیگەڕانەوەی تێپەڕوشە هاتوویت، تکایە دڵنیابە لەوەی کە URLی تەواوت بەکارهێناوە کە دابینکراوە. + send_instructions: ئەگەر ناونیشانی ئیمەیڵەکەت لە بنکەی زانیارێکانماندا هەبێت، لە چەند خولەکێکی کەمدا لینکی هێنانەوەی تێپەڕوشە لە ناونیشانی ئیمەیلەکەت پێ دەگات. تکایە بوخچەی سپامەکەت بکەرەوە، ئەگەر ئەم ئیمەیڵەت پێنەدرا. + send_paranoid_instructions: ئەگەر ناونیشانی ئیمەیڵەکەت لە بنکەی زانیارێکانماندا هەبێت، لە چەند خولەکێکی کەمدا لینکی هێنانەوەی تێپەڕوشە لە ناونیشانی ئیمەیلەکەت پێ دەگات. تکایە بوخچەی سپامەکەت بکەرەوە، ئەگەر ئەم ئیمەیڵەت پێنەدرا. + updated: تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدرا. تۆ ئێستاچوویتە ژوورەوە. + updated_not_active: تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدرا. + registrations: + destroyed: خوات لەگەڵ! ئەژمێرەکەت بە سەرکەوتوویی هەڵوەشێنرایەوە. هیوادارین بەزوویی بتبینینەوە. + signed_up: بەخێربێیت! تۆ بە سەرکەوتوویی تۆمار کرای. + signed_up_but_inactive: تۆ بە سەرکەوتوویی تۆمارکرای. هەرچۆنێک بێت، نەمانتوانی چوونە ژوورەوەت بۆ بکەین لەبەرئەوەی هێشتا هەژمارەکەت کارا نەکراوە. + signed_up_but_locked: تۆ بە سەرکەوتوویی تۆمارکرای. هەرچۆنێک بێت، نەمانتوانی چوونە ژوورەوەت بۆ بکەین لەبەرئەوەی هێشتا هەژمارەکەت قوفڵ کراوە. + signed_up_but_pending: نامەیەک بە لینکی دووپاتکردنەوە نێردراوە بۆ ناونیشانی ئیمەیڵەکەت. دوای ئەوەی تۆ کرتە لەسەر لینکەکە دەکەیت، ئێمە پێداچوونەوە دەکەین بە بەرنامەکەتدا. ئاگادار دەکرێیت ئەگەر پەسەند کرا. + signed_up_but_unconfirmed: نامەیەک بە لینکی دووپاتکردنەوە نێردراوە بۆ ناونیشانی ئیمەیڵەکەت. تکایە دوای لینکەکە بکەوە بۆ کاراکردنی هەژمارەکەت. تکایە بوخچەی سپامەکەت بکەرەوە ئەگەر ئەم ئیمەیڵەت پێنەدرا. + update_needs_confirmation: تۆ ئەژمێرەکەت بە سەرکەوتوویی نوێکردەوە، بەڵام پێویستە ئیمەیڵە نوێکەت بسەلمێنین. تکایە ئیمەیڵەکەت بپشکنە و دوای بەستەری دڵنیابوونەوە بکەوە بۆ دڵنیابوون لە ناونیشانی ئیمەیڵە نوێکەت. تکایە بوخچەی سپامەکەت بکەرەوە ئەگەر ئەم ئیمەیڵەت پێنەدرا. + updated: هەژمارەکەت بە سەرکەوتوویی نوێکرایەوە. + sessions: + already_signed_out: چوونە دەرەوە بە سەرکەوتوویی ئەنجام بوو. + signed_in: بە سەرکەوتوویی چوونە ژوورەوە. + signed_out: چوونە دەرەوە بە سەرکەوتوویی ئەنجام بوو. + unlocks: + send_instructions: ئیمەیڵێکت بۆ دەنێردرێت لەگەڵ ڕێنمایی بۆ چۆنیەتی کردنەوەی هەژمارەکەت لە چەند خولەکێکدا. تکایە بوخچەی سپامەکەت بپشکنە ئەگەر ئەم ئیمەیڵەت پێنەدرا. + send_paranoid_instructions: ئەگەر هەژمارەکەت بوونی هەبێت، ئیمەیڵێکت پێدەگات لەگەڵ ڕێنمایی چۆنیەتی کردنەوەی لە چەند خولەکێکدا. تکایە بوخچەی سپامەکەت بپشکنە ئەگەر ئەم ئیمەیڵەت پێنەدرا. + unlocked: هەژمارەکەت بە سەرکەوتوویی لە قوفڵ لاچوو. تکایە بچۆ ژوورەوە بۆ بەردەوام بوون. + errors: + messages: + already_confirmed: پێشتر پشتڕاست کرایەوە، تکایە هەوڵ دەدە بچۆ ژوورەوە + confirmation_period_expired: پێویستە لە نێو %{period} دا پشتڕاست بکرێتەوە، تکایە داوای دانەیەکی نوێ بکە + expired: بەسەرچووە، تکایە داوایەکی نوێ بکە + not_found: نەدۆزرایەوە + not_locked: دانەخرابوو + not_saved: + one: '١ هەڵە قەدەغەکرا ئەم %{resource} لە تۆمارکردن:' + other: "%{count} هەڵەی قەدەغەکرد کە %{resource} لە پاشکەوتکردن:" diff --git a/config/locales/devise.nn.yml b/config/locales/devise.nn.yml index 42eb0690a..88d8458f7 100644 --- a/config/locales/devise.nn.yml +++ b/config/locales/devise.nn.yml @@ -60,6 +60,21 @@ nn: title: 2FA-gjenopprettingskodane er endra unlock_instructions: subject: 'Mastodon: Instruksjonar for å opne kontoen igjen' + webauthn_credential: + added: + explanation: Følgende sikkerhetsnøkkel har blitt lagt til i kontoen din + subject: 'Mastodon: Ny sikkerhetsnøkkel' + title: En ny sikkerhetsnøkkel har blitt lagt til + deleted: + explanation: Følgende sikkerhetsnøkkel har blitt slettet fra kontoen din + subject: 'Mastodon: Sikkerhetsnøkkel slettet' + title: En av sikkerhetsnøklene dine har blitt slettet + webauthn_disabled: + subject: 'Mastodon: Autentisering med sikkerhetsnøkler ble skrudd av' + title: Sikkerhetsnøkler deaktivert + webauthn_enabled: + subject: 'Mastodon: Sikkerhetsnøkkelsautentisering ble skrudd på' + title: Sikkerhetsnøkler aktivert omniauth_callbacks: failure: Du kunne ikkje verte autentisert frå %{kind} av di "%{reason}". success: Autentisert frå %{kind}-konto. diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml index 0718a63fc..c1914093a 100644 --- a/config/locales/devise.vi.yml +++ b/config/locales/devise.vi.yml @@ -81,7 +81,7 @@ vi: failure: Không thể xác thực bạn từ %{kind} bởi vì "%{reason}". success: Xác thực thành công từ tài khoản %{kind}. passwords: - no_token: Bạn chỉ có thể truy cập trang này khi chuyển tiếp từ email phục hồi mật khẩu. Nếu vẫn không được, vui lòng chắc chắn rằng bạn đã sử dụng chính xác URL được cung cấp. + no_token: Bạn chỉ có thể truy cập trang này khi nhận được email phục hồi mật khẩu. Nếu vẫn không được, vui lòng chắc chắn rằng bạn đã dùng chính xác URL được cung cấp. send_instructions: Nếu địa chỉ email của bạn tồn tại trong cơ sở dữ liệu của chúng tôi, bạn sẽ nhận được liên kết khôi phục mật khẩu tại địa chỉ email của bạn sau vài phút. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này. send_paranoid_instructions: Nếu địa chỉ email của bạn tồn tại trong cơ sở dữ liệu của chúng tôi, bạn sẽ nhận được liên kết khôi phục mật khẩu tại địa chỉ email của bạn sau vài phút. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này. updated: Mật khẩu của bạn đã được thay đổi thành công. Hiện tại bạn đã đăng nhập. diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml index 01a6a7382..073898d1e 100644 --- a/config/locales/devise.zh-HK.yml +++ b/config/locales/devise.zh-HK.yml @@ -60,6 +60,23 @@ zh-HK: title: 雙重認證恢復碼已更改 unlock_instructions: subject: 'Mastodon: 解除用戶鎖定' + webauthn_credential: + added: + explanation: 以下的安全鑰匙已經加進你的帳號 + subject: 'Mastodon: 新的安全鑰匙' + title: 已經加入一個新的安全鑰匙 + deleted: + explanation: 以下的安全鑰匙已經從你的帳號中移除了 + subject: 'Mastodon: 安全鑰匙已移除' + title: 你其中的一個安全鑰匙已經被移除了 + webauthn_disabled: + explanation: 你的帳號的安全鑰匙身份驗證已經停用。你只可以用過去已經配對好的基於時間一次性密碼程式生成的密碼來登錄。 + subject: 'Mastodon: 安全鑰匙身份驗證已經停用' + title: 已啟用安全鑰匙 + webauthn_enabled: + explanation: 安全鑰匙身份驗證已啟用。你的安全鑰匙現在可以用來登錄。 + subject: 'Mastodon: 安全鑰匙身份驗證已啟用' + title: 已啟用安全鑰匙 omniauth_callbacks: failure: 無法以 %{kind} 登入你的用戶,原因是︰「%{reason}」。 success: 成功以 %{kind} 登入你的用戶。 diff --git a/config/locales/doorkeeper.eo.yml b/config/locales/doorkeeper.eo.yml index 89a579ae9..65066cd8e 100644 --- a/config/locales/doorkeeper.eo.yml +++ b/config/locales/doorkeeper.eo.yml @@ -116,22 +116,22 @@ eo: title: OAuth-a rajtigo bezonata scopes: admin:read: legu ĉiujn datumojn en la servilo - admin:read:accounts: legas senteman informacion de ĉiuj kontoj - admin:read:reports: legas konfidencajn informojn de ĉiuj signaloj kaj signalitaj kontoj - admin:write: modifu ĉiujn datumojn en la servilo + admin:read:accounts: legi konfidencajn informojn de ĉiuj kontoj + admin:read:reports: legi konfidencajn informojn de ĉiuj signaloj kaj signalitaj kontoj + admin:write: modifi ĉiujn datumojn en la servilo admin:write:accounts: plenumi agojn de kontrolo sur kontoj admin:write:reports: plenumi agojn de kontrolo sur signaloj follow: ŝanĝi rilatojn al aliaj kontoj push: ricevi viajn puŝ-sciigojn read: legi ĉiujn datumojn de via konto - read:accounts: vidi la informojn de la konto - read:blocks: vidi viajn blokojn + read:accounts: vidi la informojn de la kontoj + read:blocks: vidi viajn blokadojn read:bookmarks: vidi viajn legosignojn read:favourites: vidi viajn stelumojn read:filters: vidi viajn filtrilojn read:follows: vidi viajn sekvatojn read:lists: vidi viajn listojn - read:mutes: vidi viajn silentigojn + read:mutes: vidi viajn silentigadojn read:notifications: vidi viajn sciigojn read:reports: vidi viajn signalojn read:search: serĉi vianome @@ -140,7 +140,7 @@ eo: write:accounts: ŝanĝi vian profilon write:blocks: bloki kontojn kaj domajnojn write:bookmarks: aldoni mesaĝojn al la legosignoj - write:favourites: stelumitaj mesaĝoj + write:favourites: stelumi mesaĝojn write:filters: krei filtrilojn write:follows: sekvi homojn write:lists: krei listojn diff --git a/config/locales/doorkeeper.ku.yml b/config/locales/doorkeeper.ku.yml index 2fbf0ffd7..29d5f40db 100644 --- a/config/locales/doorkeeper.ku.yml +++ b/config/locales/doorkeeper.ku.yml @@ -1 +1,151 @@ ---- {} +--- +ku: + activerecord: + attributes: + doorkeeper/application: + name: ناوی بەرنامە + redirect_uri: URI گۆڕانی شوێن + scopes: بوارەکان + website: نەرمەکالای ماڵپەڕ + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: ناتوانێت پارچەیەک لەخۆوە بگری. + invalid_uri: پێویستە URI دروست بێت. + relative_uri: پێویستە URI ی ڕەها بێت. + secured_uri: پێویستە HTTPS/SSL URI بێت. + doorkeeper: + applications: + buttons: + authorize: ڕێگەپێدان + cancel: هەڵوەشاندنەوه + destroy: لەناوبردن + edit: دەستکاری + submit: ناردن + confirmations: + destroy: دڵنیای? + edit: + title: دەستکاری کردنی بەرنامە + form: + error: تەحح! بزانە شتێکت لە نێو فۆرمەکە بە هەڵە نەنووسیوە + help: + native_redirect_uri: بۆ تاقیکردنەوەی ناوخۆیی %{native_redirect_uri} بەکاربەرە، + redirect_uri: بەکارهێنانی یەک هێڵ بۆ هەر URI + scopes: دۆمەینەکان جیاببکەن بە بۆشاییەکان. بۆ بەکارهێنانی دۆمەینی گریمانەیی چۆڵی بەجێبهێڵە. + index: + application: نەرمەکال + callback_url: Callback نیشانی + delete: سڕینەوە + empty: هیچ بەرنامەیەکت نیە. + name: ناو + new: بەرنامەی نوێ + scopes: دۆمەینەکان + show: نیشاندان + title: بەرنامەی تۆ + new: + title: بەرنامەی نوێ + show: + actions: کارەکان + application_id: کلیلی ڕاژەخواز + callback_urls: Callback نیشانەکانی + scopes: دۆمەینەکان + secret: نهێنی ڕاژەخواز + title: 'بەرنامە: %{name}' + authorizations: + buttons: + authorize: ڕێپێدراو + deny: نکۆڵی لێبکە + error: + title: هەڵەیەک ڕوویدا + new: + able_to: دەتوانێت + prompt: بەکارهێنانی %{client_name} داوای چوونە ژوورەوە بۆ هەژمارەکەت دەکات + title: ڕێپێدان پێویستە + show: + title: کۆپیکردنی کۆدی ئەم رێپێدانە و لکاندنی بە بەرنامەکە. + authorized_applications: + buttons: + revoke: بەتاڵی بکە + confirmations: + revoke: ئایا دڵنیایت? + index: + application: نەرمەکال + created_at: ده‌سه‌ڵاتپێدراو + date_format: "%Y-%m-%d %H:%M:%S" + scopes: بوارەکان + title: بەرنامە ڕێگەپێدراوەکانت + errors: + messages: + access_denied: خاوەنی سەرچاوە یان سێرڤەری ڕێپێدان داواکاریەکەی ڕەت کردەوە. + credential_flow_not_configured: لێشاوی بڕواپێدانی تێپەڕەوشەی خاوەن سەرچاوە شکستی هێنا بەهۆی Doorkeeper.configure.resource_owner_from_credentials شێوەبەندی نەکراو. + invalid_client: سەلماندنی کڕیار سەرکەوتوو نەبوو بەهۆی کڕیاری نەناسراوەوە، هیچ ڕەسەنایەتی سەلماندنێکی کلایەنت لەخۆوە نەدەگرێت، یان شێوازی سەلماندنی پەسەند نەکراو. + invalid_grant: بەخشین مۆڵەتی دابینکراو نایاساییە، بەسەرچووە، هەڵوەشاندنەوەیە، ناگونجێلەگەڵ ئاراستەی URI بەکارهاتوو لە داواکاری ڕێپێدان، یان دەرچووە بۆ کڕیارێکی تر. + invalid_redirect_uri: Uri دووبارە ئاڕاستەکردنەوەکە لەخۆدەگرێت دروست نیە. + invalid_request: داواکاریەکە پارامیتەری داواکراوی بزرە، بەهای پارامیتەری پشتگیری نەکراو لەخۆ دەگرێت، یان بە پێچەوانەوە نادروستە. + invalid_resource_owner: بڕواپێدانەکانی خاوەنی سەرچاوەی دابینکراو دروست نیە، یان ناتوانرێت خاوەنی سەرچاوە بدۆزرێتەوە + invalid_scope: بواری داواکراو نادروستە، نەناسراو، یان تێکچووە. + invalid_token: + expired: نیشانەی چوونەژورەوە بەسەرچووە + revoked: کۆدی دەستپێگەیشتن بەتاڵ بووەتەوە + unknown: دەستپێگەیشتن بە کۆدی چوونەژوور باوڕپێنەکراوە + resource_owner_authenticator_not_configured: خاوەنی سەرچاوە بەهۆی Doorkeeper.configure.resource_owner_authenticator کۆنفیگنەکردن سەرکەوتوو نەبوو. + server_error: ڕاژەکاری ڕێپێدان تووشی مەرجێکی چاوەڕوان نەکراو بوو کە رێگری دەکا لە جێبەجێ کردنی داواکاریەکە. + temporarily_unavailable: ڕاژەکاری ڕێپێدان لە ئێستادا ناتوانێت داواکاریەکە چارەسەر بکات لەبەر بارکردنی کاتی یان چاککردنەوەی سێرڤەرەکە. + unauthorized_client: ڕاژەخوازەکە دەسەڵاتی ئەوەی نییە ئەم داواکاریە بە بەکارهێنانی ئەم شێوازە بدات. + unsupported_grant_type: جۆری بەخشینە مۆڵەتپێدانەکە لەلایەن ڕاژەکاری مۆڵەتەوە پەسەند ناکرێت. + unsupported_response_type: ڕاژەکاری ڕێگەپێدان پشتگیری ئەم جۆرە وەڵامە ناکات. + flash: + applications: + create: + notice: بەرنامە دروستکرا. + destroy: + notice: بەرنامە سڕایەوە. + update: + notice: بەرنامە بەڕۆژکرا. + authorized_applications: + destroy: + notice: بەرنامە هەڵوەشێنڕا. + layouts: + admin: + nav: + applications: بەرنامەکان + oauth2_provider: OAuth2 Provider + application: + title: داوای ڕێپێدانی OAuth + scopes: + admin:read: خوێندنەوەی هەموو داتاکان لەسەر ڕاژەکارەکە + admin:read:accounts: زانیاری هەستیاری هەموو هەژمارەکان بخوێنەوە + admin:read:reports: زانیاری هەستیاری هەموو گوزارشت و هەژمارە گوزارشتکراوەکان بخوێنەوە + admin:write: دەستکاری هەموو داتاکان بکە لەسەر ڕاژەکار + admin:write:accounts: ئەنجامدانی کاری میانڕەوی لەسەر هەژمارەکان + admin:write:reports: ئەنجامدانی کاری میانڕەوی لەسەر گوزارشتەکان + follow: دەستکاریکردنی پەیوەندییەکانی هەژمارەی بەکارهێنەر + push: وەرگرتنی ئاگانامەکانی پاڵنان + read: هەموو دراوەکانی هەژمارەکەت بخوێنەوە + read:accounts: بینینی زانیاری هەژمارەکان + read:blocks: بینینی بلۆکەکانت + read:bookmarks: نیشانەکان ببینە + read:favourites: بینینی دڵخوازەکانت + read:filters: بینینی پاڵافتنەکانت + read:follows: سەیری شوێنکەوتەکانت بکە + read:lists: بینینی لیستەکانت + read:mutes: بێدەنگەکانت ببینە + read:notifications: ئاگانامەکانت ببینە + read:reports: سەیری گوزارشەکانت بکە + read:search: گەڕان لە جیاتی تۆ + read:statuses: بینینی هەموو بارودۆخەکان + write: دەستکاری هەموو داتاکانی هەژمارەکەت بکە + write:accounts: دەستکاری پرۆفایلەکەت بکە + write:blocks: بلۆک کردنی هەژمارەکەی دۆمەینەکان + write:bookmarks: بارەکانی نیشانکەر + write:favourites: دۆخی دڵخوازەکان + write:filters: پاڵێوەر دروست بکە + write:follows: دوای خەڵک بکەوە + write:lists: دروستکردنی لیستەکان + write:media: پەڕگەی میدیا باربکە + write:mutes: بێدەنگکردنی خەڵک و گفتوگۆکان + write:notifications: ئاگانامەکانت بسڕیەوە + write:reports: گوزارشتکردنی کەسانی تر + write:statuses: بڵاوکردنەوەی بارودۆخەکان diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index 28be7fd40..caeba3b71 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -15,7 +15,7 @@ vi: fragment_present: không thể chứa một mảnh. invalid_uri: phải là một URI hợp lệ. relative_uri: phải là một URI tuyệt đối. - secured_uri: phải sử dụng giao thức HTTPS / SSL. + secured_uri: phải là giao thức HTTPS/SSL. doorkeeper: applications: buttons: @@ -31,9 +31,9 @@ vi: form: error: Rất tiếc! Hãy kiểm tra thông tin của bạn bởi vì nó có lỗi help: - native_redirect_uri: Sử dụng %{native_redirect_uri} khi kiểm tra nội bộ - redirect_uri: Sử dụng mỗi dòng chỉ một URL - scopes: Phạm vi riêng biệt với không gian. Để trống để sử dụng phạm vi mặc định. + native_redirect_uri: Dùng %{native_redirect_uri} khi kiểm tra nội bộ + redirect_uri: Mỗi dòng chỉ một URL + scopes: Tách phạm vi ra bằng dấu cách. Bỏ trống để dùng phạm vi mặc định. index: application: Ứng dụng callback_url: Gọi lại URL @@ -81,7 +81,7 @@ vi: access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu. credential_flow_not_configured: Resource Owner Password Credentials không thành công do Doorkeeper.configure.resource_owner_from_credentials không được định cấu hình. invalid_client: Xác thực ứng dụng khách không thành công do máy khách mơ hồ, không bao gồm xác thực ứng dụng khách hoặc phương thức xác thực không được hỗ trợ. - invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị thu hồi hoặc không khớp với tài khoản đã cung cấp. + invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị thu hồi hoặc không khớp với tài khoản đã cấp phép. Hoặc xung đột với ứng dụng khác. invalid_redirect_uri: URL chuyển hướng không hợp lệ. invalid_request: Yêu cầu thiếu tham số bắt buộc, bao gồm giá trị tham số không được hỗ trợ hoặc không đúng định dạng. invalid_resource_owner: Thông tin xác thực chủ sở hữu tài nguyên được cung cấp không hợp lệ hoặc không thể tìm thấy chủ sở hữu tài nguyên @@ -119,8 +119,8 @@ vi: admin:read:accounts: đọc thông tin nhạy cảm của tất cả các tài khoản admin:read:reports: đọc thông tin của các báo cáo và các tài khoản bị báo cáo admin:write: sửa đổi tất cả dữ liệu trên máy chủ - admin:write:accounts: thực hiện hành động kiểm duyệt trên tài khoản - admin:write:reports: thực hiện hành động kiểm duyệt với các báo cáo + admin:write:accounts: áp đặt hành động kiểm duyệt trên tài khoản + admin:write:reports: áp đặt kiểm duyệt với các báo cáo follow: sửa đổi các mối quan hệ tài khoản push: nhận thông báo đẩy của bạn read: đọc tất cả dữ liệu tài khoản của bạn diff --git a/config/locales/doorkeeper.zgh.yml b/config/locales/doorkeeper.zgh.yml index 394184e76..5ec7e04b4 100644 --- a/config/locales/doorkeeper.zgh.yml +++ b/config/locales/doorkeeper.zgh.yml @@ -40,3 +40,6 @@ zgh: created_at: ⵜⴻⵜⵜⵓⵙⵓⵔⴳ date_format: "%d-%m-%Y %H:%M:%S" title: ⵜⵉⵙⵏⵙⵉⵡⵉⵏ ⵏⵏⴽ ⵉⵜⵜⵓⵙⵓⵔⴷⵏ + scopes: + read:notifications: ⵥⵕ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵏⵏⴽ + write:notifications: ⵙⴼⴹ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵏⵏⴽ diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 4ac565448..e9256ad0c 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -766,7 +766,7 @@ eo: filters: contexts: account: Profiloj - home: Hejma templinio + home: Hejmo kaj listoj notifications: Sciigoj public: Publika templinio thread: Konversacioj @@ -958,6 +958,7 @@ eo: relationships: activity: Konta aktiveco dormant: Dormanta + follow_selected_followers: Forigu selektitajn sekvantojn followers: Sekvantoj following: Sekvatoj invited: Invitita @@ -1088,8 +1089,8 @@ eo: other: "%{count} voĉdonoj" vote: Voĉdoni show_more: Malfoldi - show_newer: Neniam montru - show_older: Montru pli malnova + show_newer: Montri pli novajn + show_older: Montri pli malnovajn show_thread: Montri la fadenon sign_in_to_participate: Ensaluti por partopreni en la konversacio title: "%{name}: “%{quote}”" @@ -1167,7 +1168,7 @@ eo: tips: Konsiloj title: Bonvenon, %{name}! users: - follow_limit_reached: Vi ne povas sekvi pli da %{limit} homojn + follow_limit_reached: Vi ne povas sekvi pli ol %{limit} homo(j) invalid_email: La retadreso estas nevalida invalid_otp_token: Nevalida kodo de dufaktora aŭtentigo otp_lost_help_html: Se vi perdas aliron al ambaŭ, vi povas kontakti %{email} diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index d9c4171a7..0108f0784 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -842,6 +842,7 @@ es-AR: request: Solicitá tu archivo historial size: Tamaño blocks: Cuentas que bloqueaste + bookmarks: Marcadores csv: CSV domain_blocks: Dominios bloqueados lists: Listas @@ -855,7 +856,7 @@ es-AR: filters: contexts: account: Perfiles - home: Línea temporal principal + home: Inicio y listas notifications: Notificaciones public: Líneas temporales públicas thread: Conversaciones @@ -918,6 +919,7 @@ es-AR: success: Tus datos se subieron exitosamente y serán procesados en brevedad types: blocking: Lista de bloqueados + bookmarks: Marcadores domain_blocking: Lista de dominios bloqueados following: Lista de seguidos muting: Lista de silenciados @@ -1074,6 +1076,7 @@ es-AR: relationships: activity: Actividad de la cuenta dormant: Inactivas + follow_selected_followers: Seguir a los seguidores seleccionados followers: Seguidores following: Siguiendo invited: Invitado diff --git a/config/locales/es.yml b/config/locales/es.yml index 532835e39..46285d84f 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -842,6 +842,7 @@ es: request: Solicitar tu archivo size: Tamaño blocks: Personas que has bloqueado + bookmarks: Marcadores csv: CSV domain_blocks: Bloqueos de dominios lists: Listas @@ -918,6 +919,7 @@ es: success: Sus datos se han cargado correctamente y serán procesados en brevedad types: blocking: Lista de bloqueados + bookmarks: Marcadores domain_blocking: Lista de dominios bloqueados following: Lista de seguidos muting: Lista de silenciados @@ -1074,6 +1076,7 @@ es: relationships: activity: Actividad de la cuenta dormant: Inactivo + follow_selected_followers: Seguir a los seguidores seleccionados followers: Seguidores following: Siguiendo invited: Invitado diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 7435576a2..77740e9e3 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -839,6 +839,7 @@ fa: request: درخواست بایگانی داده‌هایتان size: اندازه blocks: حساب‌های مسدودشده + bookmarks: نشانک‌ها csv: CSV domain_blocks: دامین‌های مسدودشده lists: فهرست‌ها @@ -915,6 +916,7 @@ fa: success: داده‌های شما با موفقیت بارگذاری شد و به زودی پردازش می‌شود types: blocking: فهرست مسدودشده‌ها + bookmarks: نشانک‌ها domain_blocking: فهرست دامین‌های مسدودشده following: فهرست پی‌گیری‌ها muting: فهرست بی‌صداشده‌ها diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 90d9f6c78..90ed7cbe8 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -35,7 +35,7 @@ fr: status_count_before: Ayant publié tagline: Suivez vos ami·e·s et découvrez-en de nouveaux·elles terms: Conditions d’utilisation - unavailable_content: Contenu non disponible + unavailable_content: Serveurs modérés unavailable_content_description: domain: Serveur reason: Motif @@ -568,7 +568,7 @@ fr: desc_html: Noms des domaines que ce serveur a découvert dans le fediverse title: Publier la liste des serveurs découverts preview_sensitive_media: - desc_html: Les liens de prévisualisation sur les autres sites web afficheront une vignette même si le média est sensible + desc_html: Les aperçus de lien sur les autres sites web afficheront une vignette même si les médias sont marqués comme sensibles title: Montrer les médias sensibles dans les prévisualisations OpenGraph profile_directory: desc_html: Permettre aux utilisateur·ice·s d’être découvert·e·s @@ -842,6 +842,7 @@ fr: request: Demandez vos archives size: Taille blocks: Vous bloquez + bookmarks: Signets csv: CSV domain_blocks: Bloqueurs de domaine lists: Listes @@ -855,7 +856,7 @@ fr: filters: contexts: account: Profils - home: Accueil + home: Accueil et listes notifications: Notifications public: Fils publics thread: Conversations @@ -918,6 +919,7 @@ fr: success: Vos données ont été importées avec succès et seront traitées en temps et en heure types: blocking: Liste de comptes bloqués + bookmarks: Signets domain_blocking: Liste des serveurs bloqués following: Liste d’utilisateur·rice·s suivi·e·s muting: Liste d’utilisateur·rice·s que vous masquez @@ -1074,6 +1076,7 @@ fr: relationships: activity: Activité du compte dormant: Dormant + follow_selected_followers: Suivre les abonné·e·s sélectionné·e·s followers: Abonné·e·s following: Abonnements invited: Invité·e @@ -1209,8 +1212,8 @@ fr: other: "%{count} votes" vote: Voter show_more: Déplier - show_newer: Afficher les plus récents - show_older: Afficher les plus ancien + show_newer: Plus récents + show_older: Plus anciens show_thread: Afficher le fil de discussion sign_in_to_participate: Inscrivez-vous pour prendre part à la conversation title: '%{name} : "%{quote}"' @@ -1362,7 +1365,7 @@ fr: title: disable: Compte gelé none: Avertissement - sensitive: Votre média a été marqué comme sensible + sensitive: Vos médias ont été marqués comme sensibles silence: Compte limité suspend: Compte suspendu welcome: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index d106e4409..89da4bf82 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -628,7 +628,7 @@ gl: delete: Eliminar o ficheiro subido destroyed_msg: Eliminado correctamente o subido! statuses: - back_to_account: Voltar a páxina da conta + back_to_account: Volver a páxina da conta batch: delete: Eliminar nsfw_off: Marcar como non sensible @@ -737,7 +737,7 @@ gl: saml: SAML register: Rexistro registration_closed: "%{instance} non está a aceptar novas usuarias" - resend_confirmation: Voltar a enviar intruccións de confirmación + resend_confirmation: Reenviar as intruccións de confirmación reset_password: Restablecer contrasinal security: Seguranza set_new_password: Estabelecer novo contrasinal @@ -842,6 +842,7 @@ gl: request: Solicite o ficheiro size: Tamaño blocks: Bloqueos + bookmarks: Marcadores csv: CSV domain_blocks: Bloqueos de dominio lists: Listaxes @@ -918,6 +919,7 @@ gl: success: Os seus datos foron correctamente subidos e serán procesados ao momento types: blocking: Lista de bloqueo + bookmarks: Marcadores domain_blocking: Lista de bloqueo de dominios following: Lista de seguimento muting: Lista de usuarias acaladas @@ -978,7 +980,7 @@ gl: warning: backreference_required: Tes que configurar primeiro a nova conta para referenciar hacia esta before: 'Antes de seguir, por favor lé estas notas con atención:' - cooldown: Tras a migración existe un período de calma durante o cal non poderás voltar a migrar de novo + cooldown: Tras a migración existe un período de calma durante o cal non poderás volver a migrar de novo disabled_account: Tras o cambio a túa conta actual non será totalmente usable, pero terás acceso a exportar os datos e tamén a reactivación. followers: Esta acción moverá todas as túas seguidoras desde a conta actual a nova conta only_redirect_html: De xeito alternativo, podes simplemente por unha redirección no perfil. @@ -1074,6 +1076,7 @@ gl: relationships: activity: Actividade da conta dormant: En repouso + follow_selected_followers: Seguir seguidoras seleccionadas followers: Seguidoras following: Seguindo invited: Convidado @@ -1155,7 +1158,7 @@ gl: aliases: Alcumes da conta appearance: Aparencia authorized_apps: Apps autorizadas - back: Voltar a Mastodon + back: Volver a Mastodon delete: Eliminación da conta development: Desenvolvemento edit_profile: Editar perfil @@ -1223,19 +1226,19 @@ gl: unlisted_long: Visible para calquera, pero non listado en liñas de tempo públicas stream_entries: pinned: Mensaxe fixada - reblogged: promovida + reblogged: comparteu sensitive_content: Contido sensible tags: does_not_match_previous_name: non concorda co nome anterior terms: body_html: | -

Intimidade

+

Privacidade

Qué información recollemos?

diff --git a/config/locales/hu.yml b/config/locales/hu.yml index fb17b24bc..1a112c53a 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -842,6 +842,7 @@ hu: request: Archív kérése size: Méret blocks: Tiltólistádon + bookmarks: Könyvjelzők csv: CSV domain_blocks: Tiltott domainjeid lists: Listáid @@ -918,6 +919,7 @@ hu: success: Adataidat sikeresen feltöltöttük és feldolgozásukat megkezdtük types: blocking: Letiltottak listája + bookmarks: Könyvjelzők domain_blocking: Letiltott domainek listája following: Követettjeid listája muting: Némított felhasználók listája @@ -1074,6 +1076,7 @@ hu: relationships: activity: Fiók aktivitás dormant: Elhagyott + follow_selected_followers: Kiválasztott követők bekövetése followers: Követők following: Követve invited: Meghívva diff --git a/config/locales/hy.yml b/config/locales/hy.yml index d56aa0b9c..2ea895b63 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -105,6 +105,7 @@ hy: confirm: Հաստատել confirmed: Հաստատված է confirming: Հաստատում + delete: Ջնջել տվյալները deleted: Ջնջված է demote: Աստիճանազրկել disable: Անջատել @@ -194,13 +195,17 @@ hy: create_account_warning: Ստեղծել զգուշացում create_announcement: Ստեղծել յայտարարութիւն create_email_domain_block: Ստեղծել էլ․ հասցէի դոմէյնի արգելափակում + create_ip_block: Ստեղծել IP կանոն destroy_announcement: Ջնջել յայտարարութիւնը destroy_domain_allow: Ջնջել դոմէնի թոյլտուութիւնը destroy_domain_block: Ապաարգելափակել դոմէնը destroy_email_domain_block: Ապաարգելափակել էլ․ հասցէի դոմէնը + destroy_ip_block: Ջնջել IP կանոնը destroy_status: Ջնջել գրառումը disable_2fa_user: Անջատել 2FA + disable_custom_emoji: Անջատել սեփական էմոջիները disable_user: Ապաակտիւացնել օգտատիրոջը + enable_custom_emoji: Միացնել սեփական էմոջիները enable_user: Ակտիւացնել օգտատիրոջը memorialize_account: Յիշել հաշիւը promote_user: Աջակցել օգտատիրոջը @@ -214,6 +219,7 @@ hy: unsilence_account: Լսել հաշուին unsuspend_account: Ապակասեցնել հաշիւը update_announcement: Թարմացնել յայտարարութիւնը + update_custom_emoji: Թարմացնել սեփական էմոջիները update_status: Թարմացնել գրառումը actions: assigned_to_self_report: "%{name} բողոքել է %{target} իրենց համար" @@ -347,6 +353,7 @@ hy: title: Մոդերացիա private_comment: Փակ մեկնաբանութիւն public_comment: Հրապարակային մեկնաբանութիւն + title: Դաշնություն total_blocked_by_us: Մենք արգելափակել ենք total_followed_by_them: Նրանք հետեւում են total_followed_by_us: Մենք հետեւում ենք @@ -360,6 +367,19 @@ hy: expired: Սպառուած title: Զտիչ title: Հրաւէրներ + ip_blocks: + add_new: Ստեղծել կանոն + delete: Ջնջել + expires_in: + '1209600': 2 շաբաթ + '15778476': 6 ամիս + '2629746': 1 ամիս + '31556952': 1 տարի + '86400': 1 օր + '94670856': 3 տարի + new: + title: Ստեղծել նոր IP կանոն + title: IP կանոններ pending_accounts: title: Սպասող հաշիւներ (%{count}) relationships: @@ -402,6 +422,8 @@ hy: settings: contact_information: username: Կոնտակտի ծածկանուն + custom_css: + title: Սեփական CSS domain_blocks: all: Բոլորին disabled: Ոչ մէկին @@ -468,6 +490,7 @@ hy: new_report: subject: Նոր բողոք %{instance}ի համար(#%{id}) appearance: + advanced_web_interface: Սյունակավոր ինտերֆեյս animations_and_accessibility: Անիմացիաներ եւ հասանելիութիւն discovery: Բացայայտում localization: @@ -523,6 +546,7 @@ hy: date: formats: default: "%b %d, %Y" + with_month_name: "%d %B %Y" datetime: distance_in_words: about_x_hours: "%{count}ժ" @@ -568,6 +592,7 @@ hy: request: Պահանջել քո արքիւը size: Չափը blocks: Արգելափակել + bookmarks: Էջանիշեր csv: CSV domain_blocks: Տիրոյթի արգելափակումներ lists: Ցանկեր @@ -580,6 +605,7 @@ hy: account: Պրոֆիլներ home: Տեղական հոսք notifications: Ծանուցումներ + public: Հանրային հոսքեր thread: Զրոյցներ edit: title: Խմբագրել զտիչը @@ -595,6 +621,7 @@ hy: trending_now: Այժմ արդիական generic: all: Բոլորը + changes_saved_msg: Փոփոխութիւնները յաջող պահուած են copy: Պատճենել delete: Ջնջել order_by: Դասաւորել ըստ @@ -617,9 +644,12 @@ hy: overwrite: Վերագրել types: blocking: Արգելափակումների ցուցակ + bookmarks: Էջանիշեր domain_blocking: Տիրոյթի արգելափակումների ցուցակ upload: Վերբեռնել invites: + delete: Ապաակտիւացնել + expired: Ժամկետանց expires_in: '1800': 30 րոպե '21600': 6 ժամ @@ -629,7 +659,13 @@ hy: '86400': 1 օր expires_in_prompt: Երբեք generate: Գեներացնել հրաւէրի յղում + max_uses: + one: "%{count} կիրառում" + other: "%{count} կիրառում" max_uses_prompt: Սահմանափակում չկայ + table: + expires_at: Սպառւում է + uses: Կիրառում title: Հրաւիրել մարդկանց media_attachments: validations: @@ -639,6 +675,7 @@ hy: errors: not_found: չգտնուեց past_migrations: Նախոդ միգրացիաները + proceed_with_move: Տեղափոխել հետեւորդներին warning: followers: Այս քայլով քո բոլոր հետեւորդներին այս հաշուից կը տեղափոխես դէպի նորը moderation: @@ -657,12 +694,16 @@ hy: number: human: decimal_units: + format: "%n %u" units: billion: Մլր million: Մլն quadrillion: Քլր thousand: Հազ trillion: Տրլ + otp_authentication: + enable: Միացնել + setup: Կարգաւորել pagination: newer: Ավելի նոր next: Հաջորդ @@ -680,9 +721,14 @@ hy: last_active: Վերջին ակտիւութիւնը most_recent: Վերջին moved: Տեղափոխուած + mutual: Փոխադարձ primary: Հիմնական + relationship: Կապ + remove_selected_domains: Հեռացնել բոլոր հետեւորդներին նշուած դոմեյններից + remove_selected_followers: Հեռացնել նշուած հետեւորդներին status: Հաշուի կարգավիճակ sessions: + activity: Վերջին թութը browser: Դիտարկիչ browsers: alipay: Alipay @@ -719,14 +765,31 @@ hy: revoke: Չեղարկել settings: account: Հաշիվ + appearance: Տեսք + delete: Հաշուի ջնջում + development: Ծրագրավորում edit_profile: Խմբագրել պրոֆիլը + export: Տվյալների արտահանում import: Ներմուծել import_and_export: Ներմուծել և արտահանել + migrate: Հաշուի տեղափոխում notifications: Ծանուցումներ + preferences: Կարգավորումներ profile: Հաշիւ + relationships: Հետեւումներ և հետեւորդներ two_factor_authentication: Երկքայլ նոյնականացում + webauthn_authentication: Անվտանգութեան բանալիներ statuses: + attached: + audio: + one: "%{count} ձայնագրութիւն" + other: "%{count} ձայնագրութիւն" + image: + one: "%{count} նկար" + other: "%{count} նկար" + language_detection: Ինքնուրոյն ճանաչել լեզուն open_in_web: Բացել վէբում + over_character_limit: "%{max} նիշի սահմանը գերազանցուած է" poll: total_people: one: "%{count} մարդ" @@ -736,10 +799,16 @@ hy: other: "%{count} ձայներ" vote: Քուէարկել show_more: Աւելին + show_thread: Բացել շղթան + sign_in_to_participate: Մուտք գործէք՝ զրոյցին միանալու համար title: '%{name}: "%{quote}"' visibilities: private: Միայն հետեւողներին + private_long: Հասանելի միայն հետեւորդներին public: Հրապարակային + public_long: Տեսանելի բոլորին + unlisted: Ծածուկ + unlisted_long: Տեսանելի է բոլորին, բայց չի յայտնւում հանրային հոսքերում stream_entries: pinned: Ամրացուած թութ reblogged: տարածուած @@ -830,6 +899,7 @@ hy:

Ոչ պաշտօնական, ոչ իրաւական թարգմանութիւն

themes: + contrast: Mastodon (բարձր կոնտրաստով) default: Mastodon (Մուգ) mastodon-light: Mastodon (Լուսավոր) time: @@ -837,13 +907,28 @@ hy: default: "%b %d, %Y, %H:%M" month: "%b %Y" two_factor_authentication: + add: Ավելացնել disable: Անջատել + disabled_success: Երկքայլ նոյնականացումը հաջողութեամբ անջուած է + edit: Խմբագրել enabled: Երկքայլ նոյնականացումը միացուած է + enabled_success: Երկքայլ նոյնականացումը հաջողութեամբ միացուած է + generate_recovery_codes: Ստեղծել վերականգնման կոդեր + lost_recovery_codes: Վերականգնման կոդերը հնարաւորութիւն են տալիս մուտք գործել հաշիւ՝ հեռախօսի կորստի դէպքում։ Եթէ կորցրել ես վերականգնման կոդերը, այստեղ կարող ես ստեղծել նորերը։ Նախկին վերականգման կոդերը կչեղարկվեն։ + methods: Երկքայլ նոյնականացում տարբերակներ + otp: Նոյնականացման հավելված + recovery_codes: Վերականգնման կոդեր + recovery_codes_regenerated: Վերականգման կոդերը հաջողութեամբ ստեղծուել են user_mailer: warning: title: none: Զգուշացում welcome: + final_action: Սկսել թթել + subject: Բարի գալուստ Մաստոդոն + tip_federated_timeline: Դաշնային հոսքում երևում է ամբողջ Մաստոդոնի ցանցը։ Բայց այն ներառում է միայն այն օգտատերերին որոնց բաժանորդագրուած են ձեր հարևաններ, այդ պատճառով այն կարող է լինել ոչ ամբողջական։ + tip_following: Դու հետեւում էս քո հանգոյցի ադմին(ներ)ին լռելայն։ Այլ հետաքրքիր անձանց գտնելու համար՝ թերթիր տեղական և դաշնային հոսքերը։ + tip_local_timeline: Տեղական հոսքում երևում են %{instance} հանգոյցի օգտատերի գրառումները։ Նրանք քո հանգոյցի հարևաններն են։ tips: Հուշումներ users: blocked_email_provider: Սույն էլփոստի տրամադրողը արգելված է @@ -855,3 +940,5 @@ hy: verification: explanation_html: Պիտակների յղումների հեղինակութիւնը կարելի է վաւերացնել։ Անհրաժեշտ է որ յղուած կայքը պարունակի յետադարձ յղում ձեր մաստադոնի էջին, որը պէտք է ունենայ rel="me" նիշքը։ Յղման բովանդակութիւնը կարևոր չէ։ Օրինակ՝ verification: Ստուգում + webauthn_credentials: + delete: Ջնջել diff --git a/config/locales/id.yml b/config/locales/id.yml index f73f2afbd..cb9dcb149 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -834,6 +834,7 @@ id: request: Meminta arsip Anda size: Ukuran blocks: Anda blokir + bookmarks: Markah csv: CSV domain_blocks: Blokir domain lists: Daftar @@ -909,6 +910,7 @@ id: success: Data anda berhasil diupload dan akan diproses sesegera mungkin types: blocking: Daftar diblokir + bookmarks: Markah domain_blocking: Daftar blokir domain following: Daftar diikuti muting: Daftar didiamkan @@ -1062,6 +1064,7 @@ id: relationships: activity: Aktivitas akun dormant: Terbengkalai + follow_selected_followers: Ikuti pengikut yang dipilih followers: Pengikut following: Mengikuti invited: Diundang diff --git a/config/locales/is.yml b/config/locales/is.yml index eede67bdc..a011322e4 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1074,6 +1074,7 @@ is: relationships: activity: Virkni aðgangs dormant: Sofandi + follow_selected_followers: Fylgjast með völdum fylgjendum followers: Fylgjendur following: Fylgist með invited: Boðið diff --git a/config/locales/it.yml b/config/locales/it.yml index 563f80eb1..24ccc7d76 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -844,6 +844,7 @@ it: request: Chiedi il tuo archivio size: Dimensioni blocks: Stai bloccando + bookmarks: Segnalibri csv: CSV domain_blocks: Blocchi di dominio lists: Liste @@ -920,6 +921,7 @@ it: success: Le tue impostazioni sono state importate correttamente e verranno applicate in breve tempo types: blocking: Lista dei bloccati + bookmarks: Segnalibri domain_blocking: Lista dei domini bloccati following: Lista dei seguiti muting: Lista dei silenziati @@ -1076,6 +1078,7 @@ it: relationships: activity: Attività dell'account dormant: Dormiente + follow_selected_followers: Segui i seguaci selezionati followers: Seguaci following: Seguiti invited: Invitato diff --git a/config/locales/ja.yml b/config/locales/ja.yml index c0e182ec7..4d195c448 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -183,7 +183,7 @@ ja: search_same_email_domain: 同じドメインのメールアドレスを使用しているユーザー search_same_ip: 同じ IP のユーザーを検索 sensitive: 閲覧注意 - sensitized: 閲覧注意にする + sensitized: 閲覧注意済み shared_inbox_url: Shared inbox URL show: created_reports: このアカウントで作られた通報 @@ -198,7 +198,7 @@ ja: time_in_queue: "%{time} 待ち" title: アカウント unconfirmed_email: 確認待ちのメールアドレス - undo_sensitized: 機密情報から戻す + undo_sensitized: 閲覧注意から戻す undo_silenced: サイレンスから戻す undo_suspension: 停止から戻す unsubscribe: 購読の解除 @@ -238,9 +238,11 @@ ja: reopen_report: 通報を再度開く reset_password_user: パスワードをリセット resolve_report: 通報を解決済みにする + sensitive_account: アカウントのメディアを閲覧注意にマーク silence_account: アカウントをサイレンス suspend_account: アカウントを停止 unassigned_report: 通報の担当を解除 + unsensitive_account: アカウントのメディアの閲覧注意マークを解除 unsilence_account: アカウントのサイレンスを解除 unsuspend_account: アカウントの停止を解除 update_announcement: お知らせを更新 @@ -276,9 +278,11 @@ ja: reopen_report: "%{name} さんが通報 %{target} を再び開きました" reset_password_user: "%{name} さんが %{target} さんのパスワードをリセットしました" resolve_report: "%{name} さんが通報 %{target} を解決済みにしました" + sensitive_account: "%{name} さんが %{target} さんのメディアを閲覧注意にマークしました" silence_account: "%{name} さんが %{target} さんをサイレンスにしました" suspend_account: "%{name} さんが %{target} さんを停止しました" unassigned_report: "%{name} さんが通報 %{target} の担当を外しました" + unsensitive_account: "%{name} さんが %{target} さんのメディアの閲覧注意を解除しました" unsilence_account: "%{name} さんが %{target} さんのサイレンスを解除しました" unsuspend_account: "%{name} さんが %{target} さんの停止を解除しました" update_announcement: "%{name} さんがお知らせ %{target} を更新しました" @@ -825,6 +829,7 @@ ja: request: アーカイブをリクエスト size: 容量 blocks: ブロック + bookmarks: ブックマーク csv: CSV domain_blocks: 非表示にしたドメイン lists: リスト @@ -900,6 +905,7 @@ ja: success: ファイルは正常にアップロードされ、現在処理中です。しばらくしてから確認してください types: blocking: ブロックしたアカウントリスト + bookmarks: ブックマーク domain_blocking: 非表示にしたドメインリスト following: フォロー中のアカウントリスト muting: ミュートしたアカウントリスト @@ -1020,6 +1026,7 @@ ja: otp_authentication: code_hint: 続行するには認証アプリで表示されたコードを入力してください description_html: "二要素認証を有効にすると、ログイン時に認証アプリからコードを入力する必要があります。" + enable: 有効化 instructions_html: "Google Authenticatorか、もしくはほかのTOTPアプリでこのQRコードをスキャンしてください。これ以降、ログインするときはそのアプリで生成されるコードが必要になります。" manual_instructions: 'QRコードがスキャンできず、手動での登録を希望の場合はこのシークレットコードを利用してください。:' setup: セットアップ @@ -1052,6 +1059,7 @@ ja: relationships: activity: 活動 dormant: 非アクティブ + follow_selected_followers: 選択したフォロワーをフォロー followers: フォロワー following: フォロー中 invited: 招待済み @@ -1293,7 +1301,7 @@ ja: two_factor_authentication: add: 追加 disable: 無効化 - disabled_success: 二要素認証が更新されました + disabled_success: 二段階認証が無効になりました edit: 編集 enabled: 二段階認証は有効になっています enabled_success: 二段階認証が有効になりました @@ -1319,7 +1327,7 @@ ja: warning: explanation: disable: あなたのアカウントはログインが禁止され使用できなくなりました。しかしアカウントのデータはそのまま残っています。 - sensitive: アップロードされたメディアファイルとリンクされたメディアは閲覧注意として扱われます。 + sensitive: あなたのアップロードしたメディアファイルとリンク先のメディアは、閲覧注意として扱われます。 silence: あなたのアカウントは制限されましたがそのまま使用できます。ただし既にフォローしている人はあなたのトゥートを見ることができますが、様々な公開タイムラインには表示されない場合があります。また他のユーザーは今後も手動であなたをフォローすることができます。 suspend: あなたのアカウントは使用できなくなりプロフィールやその他データにアクセスできなくなりました。アカウントが完全に削除されるまではログインしてデータのエクスポートをリクエストできます。証拠隠滅を防ぐため一部のデータは削除されず残ります。 get_in_touch: このメールに返信することで %{instance} のスタッフと連絡を取ることができます。 @@ -1328,13 +1336,13 @@ ja: subject: disable: あなたのアカウント %{acct} は凍結されました none: "%{acct} に対する警告" - sensitive: あなたのアカウント %{acct} が投稿したメディアは閲覧注意にマークされました + sensitive: あなたのアカウント %{acct} の投稿メディアは閲覧注意とマークされました silence: あなたのアカウント %{acct} はサイレンスにされました suspend: あなたのアカウント %{acct} は停止されました title: disable: アカウントが凍結されました none: 警告 - sensitive: あなたのメディアが閲覧注意に指定されました + sensitive: あなたのメディアが閲覧注意とマークされました silence: アカウントがサイレンスにされました suspend: アカウントが停止されました welcome: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index ef91cfbbe..f8043534a 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -836,6 +836,7 @@ ko: request: 아카이브 요청하기 size: 크기 blocks: 차단 + bookmarks: 보관함 csv: CSV domain_blocks: 도메인 차단 lists: 리스트 @@ -911,6 +912,7 @@ ko: success: 파일이 정상적으로 업로드 되었으며, 현재 처리 중입니다 types: blocking: 차단한 계정 목록 + bookmarks: 보관함 domain_blocking: 도메인 차단 목록 following: 팔로우 중인 계정 목록 muting: 뮤트 중인 계정 목록 @@ -1064,6 +1066,7 @@ ko: relationships: activity: 계정 활동 dormant: 휴면 + follow_selected_followers: 선택한 팔로워들을 팔로우 followers: 팔로워 following: 팔로잉 invited: 초대됨 diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 2fbf0ffd7..d7232b6ff 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1 +1,1399 @@ ---- {} +--- +ku: + about: + about_hashtag_html: ئەمانە توتی گشتین بە هەشتەگی گشتی #%{hashtag}}. گەر ئێوە لە هەر ڕاژەیەک هەژمارەتان بێت دەتوانیت لێرە بەم نووسراوانە هاوئاهەنگ بن. + about_mastodon_html: 'تۆڕی کۆمەڵایەتی داهاتوو: هیچ ڕیکلامێک ، هیچ چاودێرییەکی کۆمپانیا ، دیزاینی ئەخلاقی و لامەرکەزی! خاوەنی داتاکانت نابێ لە ماستۆدۆن!' + about_this: دەربارە + active_count_after: چالاک + active_footnote: بەکارهێنەرانی چالاکی مانگانە (MAU) + administered_by: 'بەڕێوەبراو لەلایەن:' + api: API + apps: ئەپەکانی مۆبایل + apps_platforms: بەکارهێنانی ماستۆدۆن لە iOS، ئەندرۆید و سەکۆکانی تر + browse_directory: گەڕان لە ڕێبەرێکی پرۆفایل و پاڵاوتن بەپێی بەرژەوەندیەکان + browse_local_posts: گەڕانی ڕاستەوخۆ لە نووسراوە گشتیەکان لەم ڕاژەوە + browse_public_posts: گەڕان لە جۆگەیەکی زیندووی نووسراوە گشتیەکان لەسەر ماستۆدۆن + contact: بەردەنگ + contact_missing: سازنەکراوە + contact_unavailable: بوونی نییە + discover_users: پەیداکردنی بەکارهێنەران + documentation: بەڵگەکان + federation_hint_html: بە هەژمارەیەک لەسەر %{instance} دەتوانیت شوێن خەڵک بکەویت لەسەر هەرڕاژەیەکی ماستۆدۆن. + get_apps: ئەپێکی تەلەفۆن تاقی بکەرەوە + hosted_on: مەستودۆن میوانداری کراوە لە %{domain} + instance_actor_flash: | + ئەم هەژمارەیە ئەکتەرێکی خەیاڵی بەکارهاتووە بۆ نوێنەرایەتی کردنی خودی ڕاژەکە و نەک هیچ بەکارهێنەرێکی تاک. + بۆ مەبەستی فیدراسیۆن بەکاردێت و نابێت بلۆک بکرێت مەگەر دەتەوێت هەموو نمونەکە بلۆک بکەیت، کە لە حاڵەتەش دا پێویستە بلۆکی دۆمەین بەکاربهێنیت. + learn_more: زیاتر فێربه + privacy_policy: ڕامیاری تایبەتێتی + see_whats_happening: بزانە چی ڕوودەدات + server_stats: 'زانیاری ڕاژەکار:' + source_code: کۆدی سەرچاوە + status_count_after: + one: دۆخ + other: دۆخەکان + status_count_before: لە لایەن یەکەوە + tagline: دوای هاوڕێکان بکەوە و ئەوانەی نوێ بدۆزیەوە + terms: مەرجەکانی خزمەتگوزاری + unavailable_content: ڕاژەی چاودێریکراو + unavailable_content_description: + domain: ڕاژەکار + reason: هۆکار + rejecting_media: 'پەڕگەکانی میدیا لەم ڕاژانەوە پرۆسە ناکرێت یان هەڵناگیرێن، و هیچ وێنۆچکەیەک پیشان نادرێت، پێویستی بە کرتە کردنی دەستی هەیە بۆ فایلە سەرەکیەکە:' + rejecting_media_title: پاڵێوەری میدیا + silenced: 'بابەتەکانی ئەم ڕاژانە لە هێڵی کاتی گشتی و گفتوگۆکاندا دەشاردرێنەوە، و هیچ ئاگانامێک دروست ناکرێت لە چالاکی بەکارهێنەرانیان، مەگەر تۆ بەدوایان دەچیت:' + silenced_title: ڕاژە ناچالاکەکان + suspended: 'هیچ داتایەک لەم ڕاژانەوە پرۆسە ناکرێت، خەزن دەکرێت یان دەگۆڕدرێتەوە، وا دەکات هیچ کارلێک یان پەیوەندییەک لەگەڵ بەکارهێنەران لەم ڕاژانە مەحاڵ بێت:' + suspended_title: ڕاژە ڕاگیراوەکان + unavailable_content_html: ماستۆدۆن بە گشتی ڕێگەت پێدەدات بۆ پیشاندانی ناوەڕۆک لە و کارلێ کردن لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی تر بە گشتی. ئەمانە ئەو بەدەرکردنانەن کە کراون لەسەر ئەم ڕاژە تایبەتە. + user_count_after: + one: بەکارهێنەر + other: بەکارهێنەران + user_count_before: "`خاوەن" + what_is_mastodon: ماستۆدۆن چییە? + accounts: + choices_html: 'هەڵبژاردنەکانی %{name}:' + endorsements_hint: دەتوانیت ئەو کەسانە پەسەند بکەیت کە پەیڕەویان دەکەیت لە ڕووکاری وێب، و ئەوان لێرە دەردەکەون. + featured_tags_hint: دەتوانیت هاشتاگی تایبەت پێشکەش بکەیت کە لێرە پیشان دەدرێت. + follow: شوێن کەوە + followers: + one: شوێنکەوتوو + other: شوێن‌کەوتووان + following: شوێن‌کەوتووی + joined: بەشداری %{date} + last_active: دوا چالاکی + link_verified_on: خاوەنداریەتی ئەم لینکە لە %{date} چێک کراوە + media: میدیا + moved_html: "%{name} گواستراوەتەوە بۆ %{new_profile_link}:" + network_hidden: ئەم زانیاریە بەردەست نیە + never_active: هەرگیز + nothing_here: لێرە هیچ نییە! + people_followed_by: ئەو کەسانەی کە %{name} بەدوایدا دەکەون + people_who_follow: ئەو کەسانەی کە بەدوای %{name} دا دەکەون + pin_errors: + following: تۆ دەبێت هەر ئێستا بە دوای ئەو کەسەدا بیت کە دەتەوێت پەسەندی بکەیت + posts: + one: توت + other: تووتەکان + posts_tab_heading: تووتەکان + posts_with_replies: تووتەکان و وڵامەکان + reserved_username: ناوی بەکارهێنەر پارێزراوە + roles: + admin: بەڕێوەبەر + bot: بۆت + group: گرووپ + moderator: مۆد + unavailable: پرۆفایل بەردەست نیە + unfollow: بەدوادانەچو + admin: + account_actions: + action: ئەنجامدانی کردار + title: ئەنجامدانی کاری بەڕێوەبردن لە %{acct} + account_moderation_notes: + create: جێهێشتنی تێبینی + created_msg: تێبینی بەڕێوەبەر بە سەرکەوتوویی دروست کرا! + delete: سڕینەوە + destroyed_msg: تێبینی بەڕێوەبەر بە سەرکەوتوویی لەناوچوو! + accounts: + add_email_domain_block: بلۆککردنی هەموو دۆمەینەکە + approve: پەسەند کردن + approve_all: پەسەندکردنی هەموو + approved_msg: بەرنامەی تۆمارکردنی %{username} بۆ چوونەناوی پەسەند کرا + are_you_sure: دڵنیای? + avatar: وێنۆچکە + by_domain: دۆمەین + change_email: + changed_msg: ئیمەیڵی ئەژمێر بە سەرکەوتوویی گۆڕا! + current_email: ئیمەیلی ئێستا + label: گۆڕینی ئیمێڵ + new_email: ئیمەیڵی نوێ + submit: گۆڕینی ئیمێڵ + title: گۆڕینی ئیمەیڵ بۆ %{username} + confirm: پشتڕاستی بکەوە + confirmed: پشتڕاست کرا + confirming: پشتڕاستکردنەوە + delete: سڕینەوەی داتا + deleted: سڕینەوە + demote: پلە نزمکرایەوە + destroyed_msg: دراوەکانی %{username} لە ڕیزی سڕینەوەن + disable: بەستن + disable_two_factor_authentication: لەکارخستنی 2FA + disabled: بەستوو + display_name: ناوی پیشاندان + domain: دۆمەین + edit: دەستکاری + email: پۆستی ئەلکترۆنی + email_status: دۆخی ئیمەیڵ + enable: چالاک کردن + enabled: چالاککراوە + enabled_msg: هەژمارە %{username} بە سەرکەوتوویی سنووردار کرا + followers: شوێنکەوتوان + follows: شوێنکەوتوان + header: سەرپەڕە + inbox_url: نیشانی هاتنەژوور + invited_by: هاتۆتە ژورەوە لە لایەن + ip: ئای‌پی + joined: ئەندام بوو لە + location: + all: هەموو + local: ناوخۆیی + remote: دوور + title: شوێن + login_status: دۆخی چوونەژوورەوە + media_attachments: هاوپێچی میدیا + memorialize: گۆڕان بە یادەوەری + memorialized: بیرکەوتنەوە + memorialized_msg: بە سەرکەوتوویی %{username} بۆ هەژمارێکی بیرەوەری گۆڕا + moderation: + active: چالاک + all: هەموو + pending: چاوەڕوان + silenced: بێدەنگ + suspended: ڕاگرتن + title: بەڕێوەبردن + moderation_notes: بەڕێوەبردنی تێبینیەکان + most_recent_activity: نوێترین چالاکی + most_recent_ip: نوێترین ئای پی + no_account_selected: هیچ هەژمارەیەک نەگۆڕاوە وەک ئەوەی هیچ یەکێک دیاری نەکراوە + no_limits_imposed: هیچ سنوورێک نەسەپێنرا + not_subscribed: بەشدار نەبوو + pending: پێداچوونەوەی چاوەڕوان + perform_full_suspension: ڕاگرتن + promote: بەرزکردنەوە + protocol: پرۆتۆکۆل + public: گشتی + push_subscription_expires: بەشداری PuSH بەسەر دەچێت + redownload: نوێکردنەوەی پرۆفایل + redownloaded_msg: پرۆفایلی %{username} لە بنەڕەتەوە بە سەرکەوتوویی نوێکرایەوە + reject: ڕەتکردنەوە + reject_all: هەموو ڕەت بکەوە + rejected_msg: بەرنامەی تۆمارکردنی %{username} بە سەرکەوتوویی ڕەتکرایەوە + remove_avatar: لابردنی وێنۆجکە + remove_header: سەرپەڕ لابدە + removed_avatar_msg: وێنەی ئەڤاتار %{username} بە سەرکەوتوویی لابرا + removed_header_msg: بە سەرکەوتوویی وێنەی سەرپەڕەی %{username} لابرا + resend_confirmation: + already_confirmed: ئەم بەکارهێنەرە پێشتر پشتڕاستکراوەتەوە + send: دووبارە ناردنی ئیمەیڵی دووپاتکردنەوە + success: ئیمەیڵی پشتڕاستکردنەوە بە سەرکەوتوویی نێردرا! + reset: ڕێکخستنەوە + reset_password: گەڕانەوەی تێپەڕوشە + resubscribe: دووبارە ئابونەبوون + role: مۆڵەتەکان + roles: + admin: بەڕێوەبەر + moderator: بەڕێوەبەر + staff: ستاف + user: بەکارهێنەر + search: گەڕان + search_same_email_domain: بەکارهێنەرانی دیکە بە ئیمەیلی یەکسان + search_same_ip: بەکارهێنەرانی تر بەهەمان ئای پی + shared_inbox_url: بەستەری سندوقی هاوبەشکراو + show: + created_reports: گوزارشتی تۆمارکراوە + targeted_reports: گوزارشتکراوە لەلایەن کەسانی ترەوە + silence: سنوور + silenced: سنوورکرا + statuses: دۆخەکان + subscribe: ئابوونە + suspended: ڕاگرتن + suspension_irreversible: داتای ئەم هەژمارەیە بە شێوەیەکی نائاسایی سڕاوەتەوە. دەتوانیت هەژمارەکەت ڕابخەیت بۆ ئەوەی بەکاربێت بەڵام هیچ داتایەک ناگەڕگەڕێتەوە کە پێشتر بوونی بوو. + suspension_reversible_hint_html: هەژمارە ڕاگیرا ، و داتاکە بەتەواوی لە %{date} لادەبرێت. تا ئەو کاتە هەژمارەکە دەتوانرێت بە بێ هیچ کاریگەریەکی خراپ بژمێردرێتەوە. ئەگەر دەتەوێت هەموو داتاکانی هەژمارەکە بسڕەوە، دەتوانیت لە خوارەوە ئەمە بکەیت. + time_in_queue: چاوەڕوانی لە ڕیزدا %{time} + title: هەژمارەکان + unconfirmed_email: ئیمەیڵی پشتڕاستنەکراو + undo_silenced: بێدەنگ ببە + undo_suspension: دووبارە ڕاگرتن + unsilenced_msg: هەژماری %{username} بە سەرکەوتوویی بێسنوور کرا + unsubscribe: بەتاڵکردنی ئابوونە + unsuspended_msg: هەژمارە %{username} بە سەرکەوتوویی ئابوونەی بەتاڵکرا + username: ناوی بەکارهێنەر + view_domain: پیشاندانی کورتەبۆ دۆمەین + warn: وریاکردنەوە + web: ماڵپەڕ + whitelisted: پێرستی ڕێپێدراو + action_logs: + action_types: + assigned_to_self_report: تەرخانکردنی گوزارشت + change_email_user: گۆڕینی ئیمەیڵ بۆ بەکارهێنەر + confirm_user: دڵنیابوون لە بەکارهێنەر + create_account_warning: دروستکردنی ئاگاداری + create_announcement: دروستکردنی راگەیەندراو + create_custom_emoji: دروستکردنی ئێمۆمۆجی دڵخواز + create_domain_allow: دروستکردنی ڕێپێدان بە دۆمەین + create_domain_block: دروستکردنی بلۆکی دۆمەین + create_email_domain_block: دروستکردنی بلۆکی دۆمەینی ئیمەیڵ + create_ip_block: دروستکردنی یاسای IP + demote_user: دابەزاندنی ئاستی بەکارهێنەر + destroy_announcement: سڕینەوەی راگەیەندراو + destroy_custom_emoji: سڕینەوەی ئێمۆمۆجی تایبەتمەند + destroy_domain_allow: سڕینەوەی ڕێپێدان بە دۆمەین + destroy_domain_block: سڕینەوەی بلۆکی دۆمەین + destroy_email_domain_block: سڕینەوەی بلۆکی دۆمەینی ئیمەیڵ + destroy_ip_block: سڕینەوەی یاسای IP + destroy_status: دۆخ بسڕەوە + disable_2fa_user: لەکارخستنی 2FA + disable_custom_emoji: سڕینەوەی ئێمۆمۆجی تایبەتمەند + disable_user: بەکارهێنەر لە کاربخە + enable_custom_emoji: ئیمۆمۆجی تایبەتمەند چالاک بکە + enable_user: چالاککردنی بەکارهێنەر + memorialize_account: هەژماری بیرکەوتنەوە + promote_user: بەرزکردنەوەی بەکارهێنەر + remove_avatar_user: لابردنی وێنۆجکە + reopen_report: دووبارە کردنەوەی گوزارشت + reset_password_user: گەڕانەوەی تێپەڕوشە + resolve_report: گوزارشت چارەسەربکە + silence_account: هەژماری بێدەنگی + suspend_account: ڕاگرتنی هەژمارە + unassigned_report: گوزارشتی دیارینەکراو + unsilence_account: هەژماری بێ دەنگ + unsuspend_account: هەژماری هەڵنەوەستێنراو + update_announcement: بەڕۆژکردنەوەی راگەیەندراو + update_custom_emoji: بەڕۆژکردنی ئێمۆمۆجی دڵخواز + update_status: بەڕۆژکردنی دۆخ + actions: + assigned_to_self_report: "%{name} پێداچوونەوە بە گوزارشتی %{target} لە ئەستۆ گرتووە" + change_email_user: "%{name} ناونیشانی ئیمەیلی بەکارهینەری %{target} گۆڕا" + confirm_user: "%{name} ناونیشانی ئیمەیلی بەکارهینەری %{target} پەسەند کرد" + create_account_warning: "%{name} ئاگاداریێک بۆ %{target} نارد" + create_announcement: "%{name} ئاگاداری نوێی دروستکرد %{target}" + create_custom_emoji: "%{name} ئیمۆجی نوێی %{target} بارکرد" + create_domain_allow: "%{name} دۆمەینی %{target} ڕێپێدا" + create_domain_block: "%{name} دۆمەنی %{target} بلۆککرد" + create_email_domain_block: "%{name} دۆمەینی ئیمەیلی %{target} بلۆککرد" + create_ip_block: "%{name} یاسای دروستکراو بۆ ئای‌پی %{target}" + demote_user: "%{name} ئاستی بەکارهێنەری %{target} دابەزاند" + destroy_announcement: "%{name} ئاگاداری %{target} سڕیەوە" + destroy_custom_emoji: "%{name} ئیمۆجی %{target} لە ناوبرد" + destroy_domain_allow: "%{name} دۆمەنی%{target} لە پێرستی ڕێپێدراو لابرد" + destroy_domain_block: "%{name} بەرگیری لە دۆمەینی %{target} لابرد" + destroy_email_domain_block: "%{name} دۆمەینی ئیمەیلی %{target} خستە پێرستی ڕێپێدراو" + destroy_ip_block: "%{name} یاسای سڕینەوە بۆ ئای‌پی %{target}" + destroy_status: "%{name} نووسراوەی %{target} سڕیەوە" + disable_2fa_user: "%{name} دوو مەرجی فاکتەر بۆ بەکارهێنەر %{target} لە کارخست" + disable_custom_emoji: "%{name} ئیمۆجی %{target} ناچالاک کرد" + disable_user: "%{name} چوونەژوورەوەی بەکارهێنەری %{target} لەکارخست" + enable_custom_emoji: "%{name} ئیمۆجی %{target} چالاک کرد" + enable_user: "%{name} چوونەژوورەوەی بەکارهێنەری %{target} چالککرد" + memorialize_account: "%{name} هەژمارەی بەکارهێنەری %{target} گۆڕا بە پەڕەی یادەوەری" + promote_user: "%{name} ئاستی بەکارهێنەری %{target} بەرزکردەوە" + remove_avatar_user: "%{name} وێنۆچکەی بەکارهێنەری %{target} سڕیەوە" + reopen_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە" + reset_password_user: "%{name} تێپەروشەی بەکارهێنەری %{target} گەڕانەوە" + resolve_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە" + silence_account: "%{name} هەژماری %{target}'s بێدەنگ کرا" + suspend_account: "%{name} هەژماری %{target}'ی ڕاگیرا" + unassigned_report: "%{name} ڕاپۆرتی دیاری نەکراوی %{target}" + unsilence_account: "%{name} هەژماری %{target}'s بێ دەنگ" + unsuspend_account: "%{name} هەژماری %{target}'s هەڵنەپەسێردراو" + update_announcement: "%{name} بەڕۆژکراوەی راگەیاندنی %{target}" + update_custom_emoji: "%{name} ئیمۆجی %{target} نوێکرایەوە" + update_status: "%{name} نووسراوەی %{target} بەڕۆژکرد" + deleted_status: "(نووسراوە سڕاوە)" + empty: هیچ لاگی کارنەدۆزرایەوە. + filter_by_action: فلتەر کردن بە کردار + filter_by_user: فلتەر کردن بە کردار + title: تۆماری وردبینی + announcements: + destroyed_msg: بانگەوازەکە بە سەرکەوتوویی سڕاوەتەوە! + edit: + title: بڵاوکردنەوەی راگەیەندراو + empty: هیچ راگەیەندراوێک نەدۆزرایەوە. + live: زیندوو + new: + create: دروستکردنی راگەیەندراو + title: ڕاگەیاندنی نوێ + published_msg: بانگەوازەکە بە سەرکەوتوویی بڵاو کرایەوە! + scheduled_for: خشتەکراوە بۆ %{time} + scheduled_msg: ڕاگەیاندنی خشتەی بۆ بڵاوکردنەوە! + title: ڕاگه یه نراوەکان + unpublished_msg: بانگەواز بە سەرکەوتوویی بڵاونەکرایەوە! + updated_msg: بانگەوازەکە بە سەرکەوتوویی نوێکرایەوە! + custom_emojis: + assign_category: دانانی پۆلێن + by_domain: دۆمەین + copied_msg: کۆپیەکی ناوخۆیی ئیمۆجیبەکە بە سەرکەوتوویی دروست کرد + copy: کۆپی + copy_failed_msg: نهیتوانی کۆپیهکی ناوخۆیی ئهو ئیمۆجییە دروست بکات + create_new_category: دروستکردنی هاوپۆلی نوێ + created_msg: ئیمۆجی بە سەرکەوتوویی دروستکرا! + delete: سڕینەوە + destroyed_msg: ئیمۆجی بە سەرکەوتوویی بەتاڵکرا! + disable: لەکارخستن + disabled: ناچالاککراوە + disabled_msg: بە سەرکەوتوویی ئەو ئیمۆجییە لە کارخراوە + emoji: ئیمۆجی + enable: چالاککردن + enabled: چالاککراوە + enabled_msg: ئەو ئیمۆجییە بە سەرکەوتووانە چالاک کرا + image_hint: PNG تا ٥٠کیلۆبایت + list: پێرست + listed: پێرستکراوە + new: + title: ئیمۆجی نوێی دڵخواز زیاد بکە + not_permitted: تۆ ڕێگەپێدراو نین بۆ ئەنجامدانی ئەم کارە + overwrite: نووسینەوە + shortcode: کورتەکلیل + shortcode_hint: بەلایەنی کەمەوە ٢نووسە، تەنها نووسەکانی ئەلف و بێ و ژێرهێڵەکان + title: ئیمۆجی دڵخواز + uncategorized: هاوپۆل نەکراوە + unlist: بێ پێرست + unlisted: پێرست نەبووە + update_failed_msg: نه یتوانی ئه و ئیمۆجییه نوێ بکاتەوە + updated_msg: ئیمۆجی بە سەرکەوتوویی نوێکرایەوە! + upload: بارکردن + dashboard: + authorized_fetch_mode: دۆخی پارێزراو + backlog: کاری پشتەواز + config: شێوەپێدان + feature_deletions: سڕینەوەی هەژمارە + feature_invites: بانگێشتکردنی بەستەرەکان + feature_profile_directory: ڕێنیشاندەرێکی پرۆفایل + feature_registrations: تۆمارکراوەکان + feature_relay: گواستنەوەی گشتی + feature_spam_check: دژە سپام + feature_timeline_preview: پێش نیشاندانی نووسراوەکان + features: تایبەتمەندیەکان + hidden_service: پەیوەندی نێوان ڕاژە یان خزمەتگوزاری نێننی + open_reports: ڕاپۆرتەکان بکەوە + pending_tags: هاشتاگی چاوەڕوانی پێداچوونەوە دەکات + pending_users: بەکارهێنەران چاوەڕێی پێداچوونەوەن + recent_users: بەکارهێنەرانی ئەم دواییە + search: گەڕانی تەواوی-دەق + single_user_mode: دۆخی بەکارهێنەری تاک + software: نەرمەکالا + space: بەکارهێنانی بۆشایی + title: داشبۆرد + total_users: ژمارەی بەکارهێنەران + trends: تاگە بەرچاوکراوەکان + week_interactions: چالاکیەکانی ئەم هەفتەیە + week_users_active: چالاکی ئەم هەفتەیە + week_users_new: بەکارهێنەرانی ئەم هەفتەیە + whitelist_mode: شێوەی پێرستی ڕێپێدراو + domain_allows: + add_new: ڕێپێدان بە دۆمەین + created_msg: دۆمەین بە سەرکەوتوویی رێگەی پێدرا + destroyed_msg: دۆمەین لە پێرستی رێگەی پێدرا لابرا + undo: لابردن لە پێرستی ڕێپێدراو + domain_blocks: + add_new: زیادکردنی بلۆکی دۆمەینی نوێ + created_msg: بلۆککردنی دۆمەین لە حاڵێ جێبەجێکردنە + destroyed_msg: بلۆکی دۆمەین هەڵوەشاوەتەوە + domain: دۆمەین + edit: دەستکاری بلۆکی دۆمەینی نوێ + existing_domain_block_html: ئێوە پێشتر سنووری دژوارتنا لە سەر%{name} جێبەجێکردووە، سەرەتا دەبێ بلۆک هەڵوەشێنەوە. + new: + create: دروستکردنی بلۆک + hint: بلۆکی دۆمەین رێگری لە دروستکردنی هەژمارەی چوونەژوورەوە لە بنکەی زانیارێکان ناکات ، بەڵکو بە شێوەیەکی دووبارە و خۆکارانە رێوشێوازی پێشکەوتوو تایبەت لەسەر ئەو هەژمارانە جێبەجێ دەکات. + severity: + desc_html: " بێدەنگی وا دەکات کە نووسراوەکانی هەژمارەکان نەبینراوە بێت بۆ هەر کەسێک کە شوێنیان نەکەوێ. ڕاگرتنی هەموو ناوەڕۆکی هەژمارەکە، میدیا، و داتای پرۆفایلەکەی بەکارهێنان. هیچ ئەگەر دەتەوێت فایلەکانی میدیا ڕەت بکەیتەوە." + noop: هیچ + silence: بێدەنگ + suspend: ڕاگرتن + title: بلۆکی دۆمەینی نوێ + private_comment: لێدوانی تایبەت + private_comment_hint: لێدوان دەربارەی سنوورداری ئەم دۆمەینە بۆ بەکارهێنانی ناوخۆیی لەلایەن مۆدەرەکان. + public_comment: سەرنجی گشتی + public_comment_hint: لێدوان دەربارەی سنوورداری ئەم دۆمەینە بۆ گشتی، ئەگەر بڵاوکردنەوەی لیستی سنوورداری دۆمەینەکە چالاک بکرێت. + reject_media: ڕەتکردنەوەی فایلەکانی میدیا + reject_media_hint: پەڕگە میدیای پاشکەوتکراو بە شێوەێکی ناوخۆیی لابدە و دابەزین لە داهاتوو ڕەتدەکاتەوە. ناپەیوەندیدار ە بۆ ڕاگرتن + reject_reports: گوزارشتەکان ڕەت بکەوە + reject_reports_hint: پشتگوێ خستنی هەموو گوزارشتەکان کە دێن لەم دۆمەینە. ناپەیوەندیدارە بۆ ڕاگرتن + rejecting_media: ڕەتکردنەوەی فایلەکانی میدیا + rejecting_reports: ڕەتکردنەوەی گوزارشتەکان + severity: + silence: بێدەنگ + suspend: ڕاگرتن + show: + affected_accounts: + one: هەژمارەیەک کە لە بنکەی زانیارێکان کاریگەری لەسەرە + other: "%{count} هەژمارەیەک کە لە بنکەی زانیارێکان کاریگەری لەسەرە" + retroactive: + silence: نابێدەنگی ئەو ئەژمێرانەی کە هەیە لەم دۆمەینەوە + suspend: هەڵنەپەسێدراوی هەژمارە کاریگەرەکانی ئەم دۆمەین + title: گەڕانەوەی بلۆککردنی دۆمەین %{domain} + undo: گەڕانەوە + undo: گەڕانەوەی بلۆکی دۆمەینی + view: دیتنی بلۆکی دۆمەینی + email_domain_blocks: + add_new: زیادکردنی نوێ + created_msg: بە سەرکەوتوویی دۆمەینی ئیمەیڵ بلۆک کرا + delete: سڕینەوە + destroyed_msg: بە سەرکەوتوویی دۆمەینی ئیمەیڵ لە بلۆک لاچوو + domain: دۆمەین + empty: هیچ دۆمەینێک لە ئێستادا بلۆک نەکراوە. + from_html: لە %{domain} + new: + create: زیادکردنی دۆمەین + title: بلۆککردنی دۆمەینی ئیمەیڵی نوێ + title: دۆمەینە بلۆککراوەکانی ئیمەیڵ + instances: + by_domain: دۆمەین + delivery_available: گەیاندن بەردەستە + known_accounts: + one: "%{count} هەژمارەی ناسراو" + other: "%{count} هەژمارەکانی ناسراو" + moderation: + all: هەموو + limited: سنووردار + title: بەڕێوەبردن + private_comment: لێدوانی تایبەت + public_comment: سەرنجی گشتی + title: پەیوەندی نێوان ڕاژە + total_blocked_by_us: لەلایەن ئێمە بەربەست کراوە + total_followed_by_them: شوێنمان دەکەون + total_followed_by_us: شوێنیان کەوتین + total_reported: گوزارشت له باره یان + total_storage: هاوپێچی میدیا + invites: + deactivate_all: هەموو لەکارخستنی + filter: + all: هەموو + available: بەردەستە + expired: بەسەرچووە + title: پاڵاوتن + title: بانگهێشتەکان + ip_blocks: + add_new: دروستکردنی یاسا + created_msg: سەرکەوتووانە یاسای نوێی IP زیادکرا + delete: سڕینەوە + expires_in: + '1209600': ٢ هەفتە + '15778476': ٦ مانگ + '2629746': ١ مانگ + '31556952': ١ ساڵ + '86400': ١ ڕۆژ + '94670856': ٣ ساڵ + new: + title: دروستکردنی یاسای نوێی IP + no_ip_block_selected: هیچ ڕێسایەکی IP نەگۆڕدرا وەک ئەوەی هیچ کامیان دەستنیشان نەکران + title: یاساکانی IP + pending_accounts: + title: هەژمارە هەڵواسراوەکان (%{count}) + relationships: + title: پەیوەنیەکان %{acct} + relays: + add_new: زیادکردنی گواستنەوەی نوێ + delete: سڕینەوە + description_html: دانەیەکی ڕێڵەی نێو ڕاژەییە(federation relay) کە قەبارەیەکی فرەی لە تووتە گشتییەکان لە نێو ڕاژە هاوبەشەکان و ئابوونەکان دەگوازێتەوە رێڵە یارمەتی بە ڕاژە بچکۆلەو مامناوە ندییەکان دەدا کە بابەتی فرەتر پەیدا بکەن گەر ڕێڵە نەبێت، ئەم بابەتە گشتییانە تەنها کاتێک پەیدا دەبن کە بە کارهێنەرانی ناوخۆیی خۆیان شوێنکەوتووی بەکارهێنەران لە سەر ڕاژەکانی دیکە بن. + disable: لەکارخستن + disabled: ناچالاککراوە + enable: چالاککراوە + enable_hint: کاتێک چالاک کرا، ڕاژەکارەکەت بەشداری دەکات لە هەموو توتەکانی گشتی لەم گواستنەوەیە، و دەست دەکات بە ناردنی توتی گشتی ئەم ڕاژەیە. + enabled: چالاککراوە + inbox_url: نیشانەی URL + pending: چاوەڕێی پەسەندکردنی ڕێلەی + save_and_enable: پاشکەوتکردن و چالاککردن + setup: دامەزراندنی ڕێڵەی پەیوەندی + signatures_not_enabled: ڕیلەکان بە دروستی کارناکات لە کاتێکدا دۆخی پارێزراو یان دۆخی سنوورداری گشتی چالاک کراوە + status: دۆخ + title: ڕێڵەکان + report_notes: + created_msg: تێبینی ڕاپۆرت کردن بە سەرکەوتوویی دروست کرا! + destroyed_msg: تێبینی گوزارشت بە سەرکەوتوویی سڕاوەتەوە! + reports: + account: + notes: + one: "%{count} یاداشت" + other: "%{count} یاداشت" + reports: + one: "%{count} گوزارشت" + other: "%{count} گوزارشتەکان" + action_taken_by: کردەوە لە لایەن + are_you_sure: دڵنیای? + assign_to_self: دیاریکردن بۆ من + assigned: بەڕێوەبەری بەرپرس + by_target_domain: دۆمەینی هەژمارەی گوزارشتدراو + comment: + none: هیچ + created_at: گوزارشتکرا + mark_as_resolved: نیشانەی بکە وەک چارەسەرکراو + mark_as_unresolved: نیشانەکردن وەک چارەسەرنەکراوە + notes: + create: زیادکردنی تێبینی + create_and_resolve: چارەسەر کردن لەگەڵ تێبینی + create_and_unresolve: دووبارە کردنەوەی بە تێبینی + delete: سڕینەوە + placeholder: باسی ئەو کردارانە بکە کە ئەنجام دراون، یان هەر نوێکردنەوەیەکی پەیوەندیداری ت... + reopen: دووبارە کردنەوەی گوزارشت + report: 'گوزارشت #%{id}' + reported_account: گوزارشتی هەژمارە + reported_by: گوزارشت لە لایەن + resolved: چارەسەرکرا + resolved_msg: گوزارشتکردن بە سەرکەوتوویی چارەسەر کرا! + status: دۆخ + title: گوزارشتکرا + unassign: دیارینەکراوە + unresolved: چارەسەر نەکراوە + updated_at: نوێکرایەوە + settings: + activity_api_enabled: + desc_html: ژماردنی دۆخی بڵاوکراوە ی ناوخۆیی و بەکارهێنەرە چالاکەکان و تۆماری نوێ لە سەتڵی هەفتانە + title: بڵاوکردنەوەی ئاماری کۆ دەربارەی چالاکی بەکارهێنەر + bootstrap_timeline_accounts: + desc_html: چەند ناوی بەکارهێنەرێک جیابکە بە بۆر، تەنها هەژمارەی بلۆککراوەکان و ناوخۆیی کاردەکەن. بنەڕەت کاتێک بەتاڵ بوو هەموو بەڕێوەبەرە خۆجێیەکانن. + title: بەدواداچوەکانی گریمانەیی بۆ بەکارهێنەرە نوێکان + contact_information: + email: ئیمەیلی بازرگانی + username: ناوی بەکارهێنەر + custom_css: + desc_html: دەستکاری کردنی شێوەی CSS بارکراو لەسەر هەموو لاپەڕەکان + title: CSSی تایبەتمەند + default_noindex: + desc_html: کاردەکاتە سەر هەموو بەکارهێنەرەکان کە ئەم ڕێکخستنە خۆیان نەگۆڕاون + title: بەکارهێنەران لە پێڕستکردنی بزوێنەری گەڕان بە گریمانەیی هەڵبژێن + domain_blocks: + all: بۆ هەموو کەسێک + disabled: بۆ هیچ کەسێک + title: بلۆکەکانی دۆمەین پیشان بدە + users: بۆ چوونە ژوورەوەی بەکارهێنەرانی ناوخۆ + domain_blocks_rationale: + title: پیشاندانی ڕێژەیی + enable_bootstrap_timeline_accounts: + title: چالاککردنی بەدواکەکانی گریمانەیی بۆ بەکارهێنەرە نوێکان + hero: + desc_html: نیشان درا لە پەڕەی سەرەتا. بەلایەنی کەمەوە 600x100px پێشنیارکراوە. کاتێک ڕێک نەکەویت، دەگەڕێتەوە بۆ وێنۆجکەی ڕاژە + title: وێنەی پاڵەوان + mascot: + desc_html: نیشان دراوە لە چەند لاپەڕەیەک. بەلایەنی کەمەوە 293× 205px پێشنیارکراوە. کاتێک دیاری ناکرێت، دەگەڕێتەوە بۆ بەختبەختێکی ئاسایی + title: وێنەی ماسکۆت + peers_api_enabled: + desc_html: ناوی دۆمەینەکانێک کە ئەم ڕاژە پەیوەندی پێوەگرتووە + title: بڵاوکردنەوەی لیستی راژەکانی دۆزراوە + preview_sensitive_media: + desc_html: بینینی لینک لە وێب سایتەکانی تر وێنۆچکەیەک پیشان دەدات تەنانەت ئەگەر میدیاکە بە هەستیاری نیشان کرابێت + title: پیشاندانی میدیای هەستیار لە پێشبینیەکانی OpenGraph + profile_directory: + desc_html: ڕێگەدان بە بەکارهێنەران بۆ دۆزینەوەیان + title: چالاککردنی ڕێنیشاندەرێکی پرۆفایل + registrations: + closed_message: + desc_html: لە پەڕەی پێشەوە پیشان دەدرێت کاتێک تۆمارەکان داخراون. دەتوانیت تاگەکانی HTML بەکاربێنیت + title: نامەی تۆمارکردن داخراو + deletion: + desc_html: ڕێ بدە بە هەر کەسێک هەژمارەکەی بسڕیتەوە + title: سڕینەوەی هەژمارە بکەوە + min_invite_role: + disabled: هیچکەس + title: ڕێپێدانی بانگهێشتەکان لەلایەن + registrations_mode: + modes: + approved: پەسەندکردنی داواکراو بۆ ناوتۆمارکردن + none: کەس ناتوانێت خۆی تۆمار بکات + open: هەر کەسێک دەتوانێت خۆی تۆمار بکات + title: مەرجی تۆمارکردن + show_known_fediverse_at_about_page: + desc_html: کاتێک ناچالاک کرا، هێڵی کاتی گشتی کە بەستراوەتەوە بە لاپەڕەی ئێستا سنووردار دەبن، تەنها ناوەڕۆکی ناوخۆیی پیشاندەدرێن + title: نیشاندانی ڕاژەکانی دیکە لە پێشنەمایەشی ئەم ڕاژە + show_staff_badge: + desc_html: پیشاندانی هێمایەک هاوکار لە سەر پەڕەی بەکارهێنەر + title: نیشاندانی هێمای هاوکار + site_description: + desc_html: کورتە باسیک دەربارەی API، دەربارەی ئەوە چ شتێک دەربارەی ئەم ڕاژەی ماستۆدۆن تایبەتە یان هەر شتێکی گرینگی دیکە. دەتوانن HTML بنووسن، بەتایبەت <a> وە <em>. + title: دەربارەی ئەم ڕاژە + site_description_extended: + desc_html: شوێنیکی باشە بۆ نووسینی سیاسەتی ئیس، یاسا و ڕێسا ، ڕێنمایی و هەر شتیک کە تایبەت بەم ڕاژیە، تاگەکانی HTMLــلیش ڕێگەی پێدراوە + title: زانیاری تەواوکەری تایبەتمەندی + site_short_description: + desc_html: نیشان لە شریتی لاتەنیشت و مێتا تاگەکان. لە پەرەگرافێک دا وەسفی بکە کە ماستۆدۆن چیە و چی وا لە ڕاژە کە دەکات تایبەت بێت. + title: دەربارەی ئەم ڕاژە + site_terms: + desc_html: دەتوانیت سیاسەتی تایبەتیێتی خۆت بنووسیت، مەرجەکانی خزمەتگوزاری یان یاسایی تر. دەتوانیت تاگەکانی HTML بەکاربێنیت + title: مەرجەکانی خزمەتگوزاری ئاسایی + site_title: ناوی ڕاژە + spam_check_enabled: + desc_html: ماستۆدۆن دەتوانێت هەژمارەکان خۆکارانە بێدەنگ یان گوزارشتیان بکا. زۆر جار بۆ ناسینی هەرزەپەیام و پەیامی نەخوازیاری دووپاتدەبێتەوە،جار و بار بە هەڵە دەردەچێت. + title: دژە هەرزەنامە + thumbnail: + desc_html: بۆ پێشبینین بەکارهاتووە لە ڕێگەی OpenGraph وە API. ڕووناکی بینین ١٢٠٠x٦٣٠پیکسێڵ پێشنیارکراوە + title: وێنەی بچکۆلەی ڕاژە + timeline_preview: + desc_html: لینکەکە نیشان بدە بۆ هێڵی کاتی گشتی لەسەر پەڕەی نیشتنەوە و ڕێگە بە API بدە دەستگەیشتنی هەبێت بۆ هێڵی کاتی گشتی بەبێ سەلماندنی ڕەسەنایەتی + title: ڕێگەبدە بە چوونە ژورەوەی نەسەلمێنراو بۆ هێڵی کاتی گشتی + title: ڕێکخستنەکانی ماڵپەڕ + trendable_by_default: + desc_html: کاریگەری لەسەر هاشتاگی پێشوو کە پێشتر ڕێگە پێنەدراوە + title: ڕێگە بدە بە هاشتاگی بەرچاوکراوە بەبێ پێداچوونەوەی پێشوو + trends: + desc_html: بە ئاشکرا هاشتاگی پێداچوونەوەی پێشوو پیشان بدە کە ئێستا بەرچاوکراوەن + title: هاشتاگی بەرچاوکراوە + site_uploads: + delete: سڕینەوەی فایلی بارکراو + destroyed_msg: بارکردنی ماڵپەڕ بە سەرکەوتوویی سڕدراوەتەوە! + statuses: + back_to_account: گەڕانەوە بۆ لاپەڕەی هەژمارە + batch: + delete: سڕینەوە + nsfw_off: نیشانەکردن وەک هەستیار نیە + nsfw_on: نیشانەکردن وەک هەستیار + deleted: سڕینەوە + failed_to_execute: جێبەجێ کردن سەرکەوتوو نەبوو + media: + title: میدیا + no_media: هیچ میدیایەک + no_status_selected: هیچ دۆخیک نەگۆڕاوە وەک ئەوەی هیچ بارێک دەستنیشان نەکراوە + title: دۆخی ئەژمێر + with_media: بە میدیا + tags: + accounts_today: بەکارهێنانی بێ هاوتای ئەمڕۆ + accounts_week: بەکارهێنەری یەکتا لەم هەفتەیە + breakdown: بەکارهێنانی ئەمڕۆ بە جوداکردنی سەرچاوە + context: دەق + directory: لە پێرست + in_directory: "%{count} لە پێرست" + last_active: دوا چالاکی + most_popular: بەناوبانگترین + most_recent: تازەترین + name: هەشتاگ + review: پێداچوونەوەی دۆخ + reviewed: پێداچوونەوە + title: هەشتاگ + trending_right_now: بەرچاوکردن لە ئێستادا + unique_uses_today: T%{count} ئەمڕۆ بڵاوکراوە + unreviewed: پێداچوونەوە نەکراوە + updated_msg: ڕێکخستنی هاشتاگ بە سەرکەوتوویی نوێکرایەوە + title: بەڕێوەبەر + warning_presets: + add_new: زیادکردنی نوێ + delete: سڕینەوە + edit_preset: دەستکاریکردنی ئاگاداری پێشگریمان + title: بەڕێوەبردنی ئاگادارکردنەوە پێش‌سازدان + admin_mailer: + new_pending_account: + body: وردەکاریهەژمارە نوێیەکە لە خوارەوەیە. دەتوانیت ئەم نەرمەکالا پەسەند بکەیت یان ڕەت بکەیتەوە. + subject: هەژمارەیەک نوێ بۆ پێداچوونەوە لەسەر %{instance} (%{username}) + new_report: + body: بەکارهێنەری %{reporter} گوزارشی لە بەکارهینەری%{target} دا + body_remote: کەسێک لە %{domain} گوزارشتی %{target} ناردووە + subject: گوزارشتێکی نوی لە %{instance} (#%{id}) + new_trending_tag: + body: 'هاشتاگی #%{name} ئەمڕۆ ئاراستە دەکرێت، بەڵام پێشتر پێداچوونەوەی بۆ نەکراوە. بە ئاشکرا پیشان نادرێت مەگەر تۆ ڕێگەی پێ بدەیت، یان تەنها فۆرمەکەت وەک خۆی پاشەکەوت بکەیت کە هەرگیز لێی نەبیستیت.' + subject: تاگێکی نوێ لە %{instance} نیازمەندی پێداچوونەوەیە (#%{name}) + aliases: + add_new: دروستکردنی ناوی ساختە + created_msg: نازناوێکی نوێیان سەرکەوتووانە دروستکرد. ئێستا دەتوانیت دەست بە گواستنەوە کەیت لە هەژمێرە کۆنەکەت. + deleted_msg: سەرکەوتووانە نازناوەکان لابدە. گواستنەوە لەو هەژمارەوە بۆ ئەم کەسە چیتر نابێت. + empty: هیچ نازناوێکت نیە. + hint_html: ئەگەر دەتەوێت لە هەژمارەیەکی ترەوە بگوێزریتەوە بۆ ئەم هەژمارە، لێرەدا دەتوانیت نازناوێک دروست بکەیت، پێش ئەوەی ئەوە بەردەوام بیت لە گواستنەوەی لە هەژمارە کۆنەکە بۆ ئەم هەژمارە پێویستە. ئەم کردەوەیە خۆی لە خۆیدا بێ زەرە و ناگەڕێتەوەگواستنەوەی لە هەژمارەی کۆنە بۆ هەژمارەی نوێ دەستی پێکردووە. + remove: سڕینەوەی پەیوەندی ناز ناو + appearance: + advanced_web_interface: روخساری پێشکەوتوو + advanced_web_interface_hint: 'ئەگەر دەتەوێت پانی شاشەکە بەکاربێنیت، دەتوانی بە یارمەتی ڕووکاری پێشکەوتوو چەندین ستوونی جیاواز ڕێکبخەیت بۆ بینینی زانیاری زیاتر لە هەمان کات کە دەتەوێت بیبینیت: نووسراوەکانی نووسەرانی دیکە، ئاگانامەکان، پێرستی نووسراوەکانی هەموو شوێنێک، وە هەر ژمارەیەک لە لیستەکان و هاشتاگەکان.' + animations_and_accessibility: ئەنیمەیشن و توانایی دەستپێگەیشتن + confirmation_dialogs: پەیامەکانی پەسەندکراو + discovery: دۆزینەوە + localization: + body: ماستۆدۆن لەلایەن خۆبەخشەوە وەردەگێڕێت. + guide_link: https://crowdin.com/project/mastodon + guide_link_text: هەموو کەسێک دەتوانێت بەشداری بکات. + sensitive_content: ناوەڕۆکی هەستیار + toot_layout: لۆی توت + application_mailer: + notification_preferences: گۆڕینی پەسەندکراوەکانی ئیمەیڵ + salutation: "%{name}," + settings: 'گۆڕینی پەسەندکراوەکانی ئیمەیڵ: %{link}' + view: 'نیشاندان:' + view_profile: پرۆفایل نیشان بدە + view_status: پیشاندانی دۆخ + applications: + created: بەرنامە بە سەرکەوتوویی دروست کرا + destroyed: بەرنامە بە سەرکەوتوویی سڕدراوەتەوە + invalid_url: بەستەری دابینکراو نادروستە + regenerate_token: دووبارە دروستکردنەوەی نیشانەی چوونە ژوورەوە + token_regenerated: کۆدی دەستپێگەیشتن بە سەرکەوتوویی دروستکرا + warning: زۆر ئاگاداربە لەم داتایە. هەرگیز لەگەڵ کەس دا هاوبەشی مەکە! + your_token: کۆدی دەستپێگەیشتنی ئێوە + auth: + apply_for_account: داواکردنی بانگهێشتێک + change_password: تێپەڕوشە + checkbox_agreement_html: من ڕازیم بە یاساکانی ڕاژە وە مەرجەکانی خزمەتگوزاری + checkbox_agreement_without_rules_html: من ڕازیم بە مەرجەکانی خزمەتگوزاری + delete_account: سڕینەوەی هەژمارە + delete_account_html: گەر هەرەکتە هەژمارەکەت بسڕیتەوە، لە لەم قوناغانە بڕۆیتە پێشەوە. داوای پەسەند کردنتان لێدەگیرێت. + description: + prefix_invited_by_user: "@%{name} بانگت دەکات بۆ پەیوەندیکردن بەم ڕاژەی ماستۆدۆن!" + prefix_sign_up: ئەمڕۆ خۆت تۆمار بکە لە ماستۆدۆن! + suffix: بە هەژمارەیەک، دەتوانیت شوێن هەژمارەکانی دیکە بکەویت، نوێکردنەوەکان بڵاوبکەوە و نامە لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی ماستۆدۆن و زیاتر بگۆڕیتەوە! + didnt_get_confirmation: ڕێنماییەکانی دڵنیاکردنەوەت پێنەدرا? + dont_have_your_security_key: کلیلی ئاسایشت نیە? + forgot_password: تێپەڕوشەکەت لەبیر چووە? + invalid_reset_password_token: وشەی نهێنی دووبارە ڕێکبخەوە دروست نیە یان بەسەرچووە. تکایە داوایەکی نوێ بکە. + link_to_otp: کۆدی دوو فاکتەر لە تەلەفۆنەکەت یان کۆدی چاککردنەوە تێبنووسە + link_to_webauth: بەکارهێنانی ئامێری کلیلی پاراستن + login: چوونەژوورەوە + logout: چوونەدەرەوە + migrate_account: گواستنەوە بۆ ئەژمێرێکی تر + migrate_account_html: ئەگەر دەتەوێت ئەم هەژمارە دووبارە ئاڕاستە بکەیت بۆ ئەژمێرێکی تر، دەتوانیت کرتەیەک لێرە بکەی . + or_log_in_with: یان چوونە ژوورەوە بە + providers: + cas: CAS + saml: SAML + register: خۆ تۆمارکردن + registration_closed: "%{instance} ئەندامانی نوێ قبووڵ ناکات" + resend_confirmation: دووبارە ناردنی ڕێنماییەکانی دووپاتکردنەوە + reset_password: گەڕانەوەی تێپەڕوشە + security: ئاسایش + set_new_password: سازدانی تێپەڕوشەی نوێ + setup: + email_below_hint_html: ئەگەر ناونیشانی ئیمەیڵی خوارەوە نادروستە، دەتوانیت لێرە بیگۆڕیت و ئیمەیڵێکی پشتڕاستکردنەوەی نوێ وەربگۆڕیت. + email_settings_hint_html: ئیمەیڵی پشتڕاستکردنەوە کە نێردرا بۆ %{email}. ئەگەر ناونیشانی ئیمەیڵ ڕاست نەبوو، دەتوانیت لە ڕێکبەندەکانی هەژمارەکەت بیگۆڕیت. + title: دامەزراندن + status: + account_status: دۆخی هەژمارە + confirming: چاوەڕوانی دڵنیاکردنەوەی ئیمەیڵ بۆ تەواوکردن. + functional: هەژمارەکەت بەتەواوی کارا بووەتەوە. + pending: ئەپلیکەیشەنەکەت چاوەڕوانی پێداچوونەوەیە لەلایەن ستافەکەمانەوە. لەوانەیە ئەمە هەندێک کاتی بخایەنێت ئەگەر ئەۆپەکەت پەسەند کرا، ئیمەیڵت پێدەگات. + redirecting_to: هەژمارەکەت ناچالاکە لەبەرئەوەی ئێستا دووبارە ئاڕاستەدەکرێتەوە بۆ %{acct}. + trouble_logging_in: کێشە ت هەیە بۆ چوونە ژوورەوە? + use_security_key: کلیلی ئاسایش بەکاربهێنە + authorize_follow: + already_following: ئێوە ئێستا شوێن کەوتووی ئەم هەژمارەیەی + already_requested: تۆ پێشتر داواکاری بەدواداچوت ناردوە بۆ ئەو هەژمارە + error: بەداخەوە هەڵەیەک هەبوو لە کاتی گەڕان بەدوای ئەو هەژمارەیە + follow: شوێن کەوە + follow_request: 'تۆ داواکاری شوێنکەوتنت ناردووە بۆ:' + following: 'ئەنجام بوو! تۆ ئێستا بەدوای ئەم بەکارهێنەرە دەکەویت:' + post_follow: + close: یان، دەتوانیت ئەم پەنجەرەیە دابخەیت. + return: پرۆفایلی بەکارهێنەر نیشان بدە + web: بڕۆ بۆ وێب + title: دوای %{acct} بکەوە + challenge: + confirm: بەردەوام بە + hint_html: "خاڵ: ئیمە لە کاتژمێری داهاتوو تێپەروشەت لێداوا ناکەین." + invalid_password: تێپەروشە دروست نیە + prompt: دڵنیابوون لە نهێنوشە بۆ بەردەوامبوون + crypto: + errors: + invalid_key: کلیلی باوڕپێکراو Ed25519 یان Curve25519 دروست نییە + invalid_signature: واژووی Ed25519 بڕوادار نییە + date: + formats: + default: "%b %d, %Y" + with_month_name: "%B %d, %Y" + datetime: + distance_in_words: + about_x_hours: "%{count}کات" + about_x_months: "%{count}mo" + about_x_years: "%{count}ساڵ" + almost_x_years: "%{count}ساڵ" + half_a_minute: ئێستا + less_than_x_minutes: "%{count}m" + less_than_x_seconds: ئێستا + over_x_years: "%{count}ساڵ" + x_days: "%{count}ڕۆژ" + x_minutes: "%{count}m" + x_months: "%{count}mo" + x_seconds: "%{count}s" + deletes: + challenge_not_passed: ئەو زانیاریانەی تێنووست کردووە ڕاست نەبوو + confirm_password: تێپەڕوشەی ئێستات تێبنووسە بۆ سەلماندنی ناسنامەکەت + confirm_username: ناوی بەکارهێنەرت تێبنووسە بۆ دڵنیابوون لە کردارەکە + proceed: سڕینەوەی هەژمارە + success_msg: هەژمارەکەت بە سەرکەوتوویی سڕرایەوە + warning: + before: 'پێش بەردەوام بوون، تکایە ئەم تێبینیانە بە وردی بخوێننەوە:' + caches: وادیارە ئەو ناوەرۆکە کە ڕاژەکانی دیکە پاشکەوتیان کردووە بمینێتەوە + data_removal: بابەتەکانت و داتاکانی تر بە هەمیشەیی لادەبرێن + email_change_html: دەتوانی ناونیشانی ئیمەیڵەکەت بگۆڕیت بەبێ سڕینەوەی هەژمارەکەت + email_contact_html: گەر ئیمەیل نەگەیشتووە بۆ داوای یارمەتی پەیامێک بنێرە بۆ %{email} پیغام دهید + email_reconfirmation_html: ئەگەر ئیمەیڵی پشتڕاستکردنەوەت پێنەگەشتووە، دەتوانیت دووبارە داوای لێبکە + irreversible: ناتوانیت هەژمارەکەت بگەڕێنیتەوە یان کارا بکەیتەوە + more_details_html: بۆ زانیاری زیاتر، پاراستنی نهێنیەکان ببینە. + username_available: ناوی تێپەڕبوونت دووبارە بەردەست دەبێت + username_unavailable: ناوی تێپەڕبوونت بەردەست نییە + directories: + directory: ڕێنیشاندەرێکی پرۆفایل + explanation: دۆزینەوەی بەکارهێنەران لەسەر بنەمای بەرژەوەندییەکانیان + explore_mastodon: گەڕان لە %{title} + domain_validator: + invalid_domain: ناوی دۆمەین بڕوادار نییە + errors: + '400': داواکاریەکەی کە پێشکەشت کردووە نادروستە یان نەیپێکا. + '403': تۆ مۆڵەتت نیە بۆ بینینی ئەم لاپەڕەیە. + '404': ئەو لاپەڕەیەی بەدوای دەگەڕێی لێرە نیە. + '406': ئەم پەڕەیە لە فۆرماتی داواکراودا بەردەست نییە. + '410': ئەو لاپەڕەیەی بەدوای دا دەگەڕایت چیتر لێرە بوونی نیە. + '422': + content: سەلماندنەکەی ئاسایش سەرکەوتوو نەبوو. تۆ بلۆکی کۆکیز دەکەیت? + title: سەلماندنەکەی ئاسایش سەرکەوتوو نەبوو + '429': داواکاری زۆر + '500': + content: داوای لێبوردن دەکەین، بەڵام لە کۆتاییەکەماندا. شتێک هەڵە ڕویداوە. + title: ئەم لاپەڕەیە ڕاست نییە + '503': ناتوانرێت پەڕەکە خزمەت بکرێت بەهۆی شکستی ڕاژەیەکی کاتی. + noscript_html: بۆ بەکارهێنانی بەرنامەی وێبی ماستۆدۆن، تکایە جاڤاسکریپت بەتوانا بکە. لە جیاتی ئەوە، یەکێک لە < href="%{apps_path}">ئەپێکی ماستۆدۆنبەکارببە. + existing_username_validator: + not_found: بەکارهێنەرێک بەم هەژمارەی بەکارهێنەرە لەم ڕاژە پەیدا نەبوو + not_found_multiple: نەیتوانی %{usernames} بدۆزێتەوە + exports: + archive_takeout: + date: بەروار + download: داگرتنی ئەرشیفەکەت + hint_html: دەتوانیت داوای ئەرشیفی نووسراوە و میدیای بارکراوەی خۆت بکەی. داتای هەناردەکراو لە فۆرماتی ActivityPub دەبێت، دەخوێنرێتەوە لەلایەن هەر نەرمەکالایەکی گونجاو. دەتوانیت هەموو ٧ ڕۆژ جارێک داوای ئەرشیفێکەت بکەیت. + in_progress: خەریکی کۆ کردنەوەی ئەرشیڤەکەت... + request: داوای ئەرشیفەکەت بکە + size: قەبارە + blocks: تۆ بلۆک دەکەیت + csv: CSV + domain_blocks: دۆمەین قەپاتکرا + lists: لیستەکان + mutes: هەژمارە بێدەنگ کراوە + storage: هەمارگەی میدیا + featured_tags: + add_new: زیادکردنی نوێ + errors: + limit: ئێوە ژمارەی بڕی ڕێگەپێدراوەی هاشتاگت هەیە + hint_html: " هاشتاگی تایبەت چییە؟ بە شێوەیەکی دیار نیشان دەدرێت لەسەر پرۆفایلی گشتی و ڕێگە بە خەڵک دەدات بۆ گەڕان لە نووسراوە گشتیەکانت بە تایبەتی لەژێر ئەو هاشتاگە. ئامرازێکی زۆر باشن بۆ پاراستنی کاری داهێنەرانە یان پڕۆژەی درێژخایەنی ئێوە." + filters: + contexts: + account: پرۆفایلەکان + home: ماڵەوە + notifications: ئاگادارییەکان + public: پێرستی گشتی نووسراوەکان + thread: گفتوگۆکان + edit: + title: دەستکاری فلتەر + errors: + invalid_context: هیچ دەقێکی نادروست نییە یان بێ بڕوایە + invalid_irreversible: فلتەرکردنی بێ گەڕانەوە تەنها کار دەکات لەگەڵ چوارچێوەی ماڵ یان ئاگانامەکان + index: + delete: سڕینەوە + empty: هیچ پالێوەرێکت نیە. + title: فلتەرەکان + new: + title: زیادکردنی فلتەری نوێ + footer: + developers: پەرەپێدەران + more: زیاتر… + resources: سەرچاوەکان + trending_now: هەوادارانی ئێستا + generic: + all: هەموو + changes_saved_msg: گۆڕانکاریەکان بە سەرکەوتوویی هەڵگیرا! + copy: ڕوونووس + delete: سڕینەوە + no_batch_actions_available: هیچ گرووپێکی کاری بەردەست نیە لەسەر ئەم لاپەڕەیە + order_by: ڕێکخستن بەپێی + save_changes: گۆڕانکاریەکان بپارێزە + validation_errors: + one: شتێک هێشتا تەواو ڕاست نیە تکایە چاو بە هەڵەکەی خوارەوە بخشێنەوە + other: هێشتا تەواو ڕاست نیە تکایە چاو بە هەڵەی %{count} خوارەوە بخشێنەوە + html_validator: + invalid_markup: 'نیشانەی HTML نادروستی تێدایە: %{error}' + identity_proofs: + active: چالاک + authorize: بەڵێ، ڕێگە بدە + authorize_connection_prompt: ئایا ئەم گرێدانە نهێنییە ڕیگە دەدەی? + errors: + failed: پەیوەندی کردنی نهێنیکردن سەرکەوتوو نەبوو. تکایە دووبارە لە %{provider} هەوڵ بدەوە. + keybase: + invalid_token: نیشانە کانی بنەکلیلی سەرەکی (هەش) واژووی دیجیتاڵن و لانی کەم ٦٦ نووسە لە توانی ١٦ هەیە + verification_failed: ئەم بنە کلیلیە(Keybase) بە ءینوانی واژووی دیجیتاڵی بەکارهێنەری %{kb_username} پەسەند ناکا، تکایا دووبارە لە بنە کلیلێکی دیکە هەوڵ بدەوە. + wrong_user: ناتوانرێت پشت ڕاستکردنەوەیەک بۆ %{proving} لە کاتێک بە عینوانی %{current} هاتنەتە ناوە. بە عینوانی %{proving} بچنە ناوەو دووبارە هەوڵ بدەنەوە. + explanation_html: لێرە دەتوانیت بە نهێنی ناسنامەکانی تر ت گرێ بدەی لە سەکۆکانی ترەوە، وەک کلیلی بنکە. ئەمە ڕێگە دەدات بە کەسانی تر نامەی رەمزێنراوەکانت بۆ بنێرن لەسەر ئەو پلاتفۆرمە ، رێگەیان پێدەدات متمانە بکەن کە ئەو ناوەڕۆکەی تۆ دەیاننێریت لە تۆوە دێت. + i_am_html: من %{username} ــم لەسەر %{service} ــنم. + identity: ناسنامە + inactive: ناچالاکە + publicize_checkbox: 'ئەمە توت بکە:' + publicize_toot: 'پەسەند کرا! من %{username} لەسەر %{service} هەم: %{url}' + remove: لابردنی بەڵگە لە هەژمارەی + removed: بە سەرکەوتوویی بەڵگەنامەی سەلماندن لابرا لە هەژمارەی بەکارهینەر + status: دۆخی سەلماندن + view_proof: پیشاندانی سەلماندن + imports: + modes: + merge: یەکخستن + merge_long: هێشتنەوەی تۆمارەکانی بەردەست و زیادکردنی دانەنوێکان + overwrite: نووسینەوە + overwrite_long: دراوەکانی ئێستا بسڕەوە و دراوی نوێ زیاد بکە + preface: دەتوانیت زانیاری هاوردە بکەیت کە ناردوتە تە لە ڕاژەیەکی ترەوە، وەک لیستی ئەو کەسانەی کە تۆ بەدوای دادەکەویت یان بەربەستت دەکەن. + success: داتاکەت بە سەرکەوتوویی بارکرا و ئێستا لە کاتی خۆیدا پرۆسێس دەکرێت + types: + blocking: لیستی بلۆککردن + domain_blocking: لیستی بلۆککردنی دۆمەین + following: لیستی خوارەوە + muting: لیستی کپکردنەوە + upload: بارکردن + in_memoriam_html: لەیادبوون. + invites: + delete: لەکارخستن + expired: بەسەرچووە + expires_in: + '1800': ٣٠ خولەک + '21600': ٦ کاتژمێر + '3600': ١ کاتژمێر + '43200': ١٢ کاتژمێر + '604800': ١ هەفتە + '86400': ١ ڕۆژ + expires_in_prompt: هەرگیز + generate: دروستکردنی لینکی بانگهێشت + invited_by: 'بانگهێشتکرایت لەلایەن:' + max_uses: + one: ١ بار + other: "%{count} بار" + max_uses_prompt: بێ سنوور + prompt: دروست کردن و هاوبەش کردنی لینکەکان لەگەڵ ئەوانی تر بۆ پێدانی چوونە ژوورەوە بۆ ئەم ڕاژە + table: + expires_at: بەسەرچووە + uses: بەکارهاوردنەکان + title: بانگهێشتکردنی خەڵک + lists: + errors: + limit: تۆ گەیشتوویتە زۆرترین ڕێژەی لیستەکان + media_attachments: + validations: + images_and_video: ناتوانرێت لەگەڵ ئەو نووسراوانە کە وێنەی لەگەڵە ،ڤیدیۆ بار بکەی + not_ready: ناتوانێت فایلەکان هاوپێچ بکات کە پرۆسەکەیان تەواو نەکردووە. دووبارە هەوڵ بدە! + too_many: ناتوانێت زیاتر لە ٤ فایل هاوپێچ بکات + migrations: + acct: گوێزرایەوە بۆ + cancel: پاشگەزبوونەوە لە دووبارە ئاڕاستەکردنەوە + cancel_explanation: هەڵوەشاندنەوەی دووبارە ئاڕاستەکردنەوە هەژمارەی ئێستات چالاک دەکات، بەڵام ئەو شوێنکەوتوانی ناهێنە وه کە گواستراوەتەوە بۆ ئەو هەژمارە. + cancelled_msg: سەرکەوتووانە دووبارە ئاڕاستەکردنەوەکەی بەتاڵ کردەوە. + errors: + already_moved: هەمان ئەژمێرە کە تۆ پێشتر گواستووتە بۆ + missing_also_known_as: نازناوێکی ئەم هەژمارە نییە + move_to_self: ناتوانێت هەژمارەی ئێستا بێت + not_found: نادۆزرێتەوە + on_cooldown: تۆ دەبێت چاوەڕوان بیت + followers_count: شوێنکەوتوانی کاتی لە حاڵی گواستنەوە + incoming_migrations: گواستنەوە لە هەژمارەی جیاواز + incoming_migrations_html: بۆ گواستنەوە لە هەژمارەیەکی ترەوە بۆ ئەم هەژمارە، سەرەتا پێویستە ئەژمێرێک دروست بکەی. + moved_msg: هەژمارەکەت ئێستا دووبارە ئاڕاستە دەکرێتەوە بۆ %{acct} و شوێنکەوتوانی تۆ گواستراوەتەوە بۆ ئەوێ. + on_cooldown: تۆ بەم دواییە هەژمارەکەت کۆچ کردووە. ئەم کارە لە رۆژەکانی %{count} دا جارێکی تر بەردەست دەبێت. + past_migrations: گەواستنەوەکانی ڕابردوو + proceed_with_move: شوێنکەوتوان بگوازەوە + redirected_msg: ئەژمێرەکەت ئێستا دووبارە ئاڕاستە دەکرێتەوە بۆ %{acct}. + redirecting_to: ئەژمێرەکەت دووبارە ئاڕاستە دەکرێتەوە بۆ %{acct}. + set_redirect: دووبارە ئاڕاستەکردن ڕێک بخە + warning: + backreference_required: پێویستە سەرەتا هەژمارە نوێیەکە بۆ گەڕانەوەی سەرچاوەی ئەم هەژمارە رێکوپێک بکرێت + before: 'پێش بەردەوام بوون، تکایە ئەم تێبینیانە بە وردی بخوێننەوە:' + cooldown: دوای گواستنەوە ماوەیەکی چاوەڕوان دەبێ کە لە ماوەی ئەو دا نابێت جارێکی تر بگوازیتەوە + disabled_account: هەژمارەی ئێستات دوای ئەوە بە تەواوی بەکارناهیێت. هەرچۆنێک بێت، تۆ دەستگەیشتنت دەبێت بۆ ناردنەدەرەوەی داتا و هەروەها دووبارە کاراکردنەوە. + followers: ئەم کردارە هەموو شوێنکەوتوانی هەژمارەی ئێستا دەگوازێتەوە بۆ هەژمارەی نوێ + only_redirect_html: ئێوە دەتانن هەژمارەکەی خۆتان بیخەنە سەر هەژمارەیەکی دیکە. + other_data: هیچ داتایەکی تر بە خۆکارانە ناگوێزرێتەوە + redirect: پرۆفایلی هەژمارەی ئێستات بە ئاگادارییەکی ئاراستەکەراوە نوێ دەکرێتەوە و دووردەکەویت لە گەڕانەکان + moderation: + title: بەڕێوەبردن + move_handler: + carry_blocks_over_text: ئەم بەکارهێنەرە گواسترایەوە بۆ %{acct}، تۆ بلۆکت کردووە. + carry_mutes_over_text: ئەم بەکارهێنەرە گواسترایەوە بۆ %{acct}، تۆ بێدەنگت کردووە. + copy_account_note_text: 'ئەم بەکارهێنەرە لە %{acct} ەوە گواستیەوە، تێبینیەکانی پێشووت دەربارەیان بوون:' + notification_mailer: + digest: + action: پیشاندانی هەموو ئاگانامەکان + body: ئەمە کورتەی ئەو نامانەی لە دەستت دا لە دوا سەردانیت لە %{since} + mention: "%{name} ئاماژەی بە تۆ کرد لە:" + new_followers_summary: + one: لەکاتێک کە نەبوو ،شوێنکەوتوویێکی نوێت پەیداکرد،ئافەرم! + other: کاتیک کە نەبووی %{count} شوێنکەوتوویێکی نوێت پەیدا کرد! چ باشە! + subject: + one: "ئاگاداریێکی نووی لە دوایین سەردانی ئێوە\U0001F418" + other: "%{count} ئاگاداریێکی نوێ لە دوایین سەردانی ئێوە\U0001F418" + title: لە غیابی تۆدا... + favourite: + body: 'دۆخت پەسەندکراوە لەلایەن %{name}:' + subject: "%{name} دۆخی تۆی پەسەند کرد" + title: دڵخوازکردنی نوێ + follow: + body: "%{name} ئێستا شوێنکەوتوو ئێوەیە!" + subject: "%{name} ئێستا شوێنکەوتوو ئێوەیە" + title: شوێنکەوتوانی نوێ + follow_request: + action: بەڕێوەبردنی داوای شوێنکەوتن + body: "%{name} داوای کردووە کە شوێنت بکەوێت" + subject: 'چاوەڕوانی شوێنکەوتووە: %{name}' + title: داواکاری شوینکەوتنی نوێ + mention: + action: وەڵام + body: "%{name} لێرە ناوی ئێووەی بردووە:" + subject: "%{name} لێرە ناوی ئێووەی بردووە" + title: ناوبراوەی نوێ + reblog: + body: "%{name} نووسیسراوەکەی ئێوەی توتاندەوە:" + subject: "%{name} نووسراوەکەتی دووبارە توتاند" + title: توتاندنەوەی نوێ + notifications: + email_events: رووداوەکان بۆ ئاگاداری ئیمەیلی + email_events_hint: 'ئەو ڕووداوانە دیاریبکە کە دەتەوێت ئاگانامەکان وەربگری بۆ:' + other_settings: ڕێکبەندەکانی ئاگانامەکانی تر + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + otp_authentication: + code_hint: کۆدێک داخڵ بکە کە دروست کراوە لەلایەن ئەپی ڕەسەنایەتیەوە بۆ دڵنیابوون + description_html: ئەگەر تۆ هاتنەژوورەوەی دوو قۆناغی بە یارمەتی ئەپێکی پەسەندکردن چالاک بکەن، پێویستە بۆ چوونەژوورەوە ، بە تەلەفۆنەکەتان کە کۆدیکتان بۆ دروستدەکات دەستپێگەیشتنتان هەبێت. + enable: چالاککردن + instructions_html: " QR بدۆزەوە بۆ ناو ڕەسەنایەتی گووگڵ یان کاربەرنامەی TOTP هاوشێوە لەسەر تەلەفۆنەکەت . لە ئێستاوە، ئەو کاربەرنامەیە نیشانە دروست دەکات کە دەبێت داخڵیان بکەیت لەکاتی چوونە ژوورەوە." + manual_instructions: 'ئەگەر ناتوانیت کۆدی QR سکان بکەیت و پێویستە بە دەستی تێبنووسە، ئەمە نهێنیی دەقی سادەیە:' + setup: ئامادەکردن + wrong_code: کۆدی داخڵکراو نادروستە! ئایا کاتی ڕاژە و کاتی ئامێر راستن? + pagination: + newer: نوێتر + next: داهاتوو + older: کۆنتر + prev: پێشوو + truncate: "…" + polls: + errors: + already_voted: تۆ پێشتر دەنگت داوە لەسەر ئەم ڕاپرسییە + duplicate_options: خاوەنی ئایەمی دووبارە + duration_too_long: لە داهاتوو زۆر دوورە + duration_too_short: لە داهاتوو زۆر نزیکە + expired: ڕاپرسیەکە پێشتر کۆتایی هاتووە + invalid_choice: بژاردەی دەنگدانی هەڵبژێردراو بوونی نییە + over_character_limit: ناتوانێت هەر کامێکی درێژتر بێت لە %{max} نووسە + too_few_options: پێویستە زیاتر لە یەک بڕگەی هەبێت + too_many_options: ناتوانێت زیاتر لە %{max} بەندی تێدا بێت + preferences: + other: هی تر + posting_defaults: بڵاوکردنی بنەڕەتەکان + public_timelines: هێڵی کاتی گشتی + reactions: + errors: + limit_reached: سنووری کاردانه وه ی جیاواز گه یشت + unrecognized_emoji: ئیمۆجییەکی ناسراو نییە + relationships: + activity: چالاکی هەژمارە + dormant: ناچالاک + followers: شوێنکەوتوان + following: شوێن‌کەوتووی + invited: بانگهێشتەکان + last_active: دوایین چالاکی + most_recent: تازەترین + moved: گوێزرایەوە + mutual: دوولایەنە + primary: سەرەتایی + relationship: پەیوەندی + remove_selected_domains: لابردنی هەموو شوێنکەوتوانی دۆمەینە دیاریکراوەکان + remove_selected_followers: شوێنکەوتوانی دیاریکراو لابدە + remove_selected_follows: کۆتایی بە بەدوادانەچوی بەکارهێنەرە دیاریکراوەکان بدە + status: دۆخی هەژمارە + remote_follow: + acct: ناونیشانی هەژمارەی username@domainخۆت لێرە بنووسە + missing_resource: نەیتوانی URLی ئاراستەکردنەوەی پێویست بدۆزێتەوە بۆ ئەژمێرەکەت + no_account_html: هێشتا نەبووی بە ئەندام؟ لێرە دەتوانی هەژمارەیەک دروست بکەی + proceed: بەردەوام بە بۆ بەدواداچوون + prompt: 'تۆ بەدوای دا دەچیت:' + reason_html: " بۆچی ئەم هەنگاوە پێویستە؟ %{instance} لەوانەیە ئەو ڕاژەیە نەبێت کە تۆ تۆمارت کردووە، بۆیە پێویستە سەرەتا دووبارە ئاڕاستەت بکەین بۆ ڕاژەکاری ماڵەوەت." + remote_interaction: + favourite: + proceed: بۆ دڵخوازکردنی ئەم توتە + prompt: 'دەتەوێت ئەم تووتە تپەسەند بکەیت؛:' + reblog: + proceed: بەردەوام بە بۆ دووبارە توتاندن + prompt: 'دەتەوێت ئەم تووتە دووبارە بکەیتەوە:' + reply: + proceed: بۆ وەڵامدانەوە + prompt: 'دەتەوێت ئەم تووتە وڵام بدەیتەوە:' + scheduled_statuses: + over_daily_limit: ئێوە لە سنووری ڕیپێدراوی %{limit} توتی ئەو رۆژە،خۆرتر ڕۆیشتوویت + over_total_limit: تۆ سنووری خشتەکراوی %{limit} ت بەزاندووە + too_soon: پێویستە بەرواری خشتەکراو لە داهاتوودا بێت + sessions: + activity: دوایین چالاکی + browser: وێبگەڕ + browsers: + alipay: Alipay + blackberry: بلاکبێری + chrome: کرۆم + edge: مایکرۆسۆفت ئیچ + electron: ئەلکترۆن + firefox: فایەرفۆکس + generic: وێبگەڕی نەناسراو + ie: ئینتێرنێت ئێکسپلۆرەر + micro_messenger: مایکرۆمێسنجەر + nokia: وێبگەڕی نۆکیا ئێس ٤٠ ئۆڤی + opera: ئۆپێرا + otter: ئۆتەر + phantom_js: فانتۆم جەی ئێس + qq: وێبگەڕی QQ + safari: سافری + uc_browser: وێبگەڕی UC + weibo: Weibo + current_session: دانیشتنی ئێستا + description: "%{browser} لەسەر %{platform}" + explanation: ئەمانە وێبگەڕەکەن کە ئێستا چووەتە ژوورەوە بۆ ئەژمێری ماستۆدۆنی خۆت. + ip: ئای‌پی + platforms: + adobe_air: Adobe Air + android: ئەندرۆید + blackberry: بلاکبێری + chrome_os: سیستەمی کارگێڕی کرۆم + firefox_os: سیستەمی کارگێڕی فایەرفۆکس + ios: iOS + linux: لینۆکس + mac: ماک + other: سیستەمیکارگێڕی نەناسراو + windows: ویندۆز + windows_mobile: ویندۆزموبایل + windows_phone: ویندۆزفۆن + revoke: بەتاڵکردن + revoke_success: دانیشتن بەسەرکەوتوویی بەتاڵکرا + title: کۆبوونەوەکان + settings: + account: هەژمارە + account_settings: ڕێکخستنەکانی هەژمارە + aliases: نازناوەی هەژمارە + appearance: ڕووخسار + authorized_apps: ئەپەکانی ڕێگەپێدراو + back: گەڕانەوە بۆ ماستۆدۆن + delete: سڕینەوەی هەژمارە + development: گەشەپێدان + edit_profile: دەستکاری پرۆفایل + export: ناردن زانیاری + featured_tags: هاشتاگی تایبەت + identity_proofs: سەلماندنی ناسنامە + import: هاوردن + import_and_export: هاوردەکردن و ناردن + migrate: گواستنەوەی هەژمارە + notifications: ئاگادارییەکان + preferences: پەسەندەکان + profile: پرۆفایل + relationships: شوێنکەوتوو و شوێنکەوتوان + two_factor_authentication: کۆدی دووقۆناغی هاتنەژوور + webauthn_authentication: کلیلەکانی پاراستن + spam_check: + spam_detected: ئەمە هەژمارەیەکی خۆکارانەیەبۆ ناساندنی سپام. + statuses: + attached: + audio: + one: "%{count} دەنگ" + other: "%{count} دەنگ" + description: 'هاوپێچ: %{attached}' + image: + one: "%{count} وێنە" + other: "%{count} وێنەکان" + video: + one: "%{count} ڤیدیۆ" + other: "%{count} ڤیدیۆکان" + boosted_from_html: توکراوەتەوە لەلایەن %{acct_link} + content_warning: 'ئاگاداری ناوەڕۆک: %{warning}' + disallowed_hashtags: + one: 'هاشتاگی ڕێگەپێنەدراوەی تێدابوو: %{tags}' + other: 'هاشتاگەکانی ڕێگەپێنەدراوەی تێدابوو: %{tags}' + errors: + in_reply_not_found: ئەو دۆخەی کە تۆ هەوڵی وەڵامدانەوەی دەدەیت وادەرناکەوێت کە هەبێت. + language_detection: بە شێوەیەکی خۆکارانە زمان بدۆزیەوە + open_in_web: کردنەوە لە وێب + over_character_limit: سنووری نووسەی %{max} تێپەڕێنرا + pin_errors: + limit: تۆ پێشتر زۆرترین ژمارەی توتتی چەسپیوەت هەیە + ownership: نووسراوەکانی تر ناتوانرێ بسەلمێت + private: توتی ناگشتی ناتوانرێت بچەسپێ + reblog: بەهێزکردن ناتوانرێت بچەسپێ + poll: + total_people: + one: "%{count} کەس" + other: "%{count} خەڵک" + total_votes: + one: "%{count} دەنگ" + other: "%{count} دەنگەکان" + vote: دەنگ + show_more: زیاتر پیشان بدە + show_thread: نیشاندانی ڕشتە + sign_in_to_participate: بچۆ ژوورەوە بۆ بەشداریکردن لە گفتوگۆکەدا + title: '%{name}: "%{quote}"' + visibilities: + private: شوێنکەوتوانی تەنها + private_long: تەنها بۆ شوێنکەوتوانی پیشان بدە + public: گشتی + public_long: هەموو کەس دەتوانێت ببینێت + unlisted: پێرست نەبووە + unlisted_long: هەموو کەس دەتوانێت بیبینێت، بەڵام لە هێڵی کاتی گشتی دا نەریزراوە + stream_entries: + pinned: توتی چەسپکراو + reblogged: بەهێزکردن + sensitive_content: ناوەڕۆکی هەستیار + tags: + does_not_match_previous_name: لەگەڵ ناوی پێشوو یەک ناگرێتەوە + terms: + body_html: | +

سیاسەتی تایبەت

+

چ زانیاریێک کۆ دەکەینەوە؟

+
    +
  • زانیاری ئەژمێری بنەڕەتی: ئەگەر تۆ لەسەر ئەم ڕاژەی تۆماربکەیت، لەوانەیە داوات لێبکرێت ناوی بەکارهێنەر، ناونیشانی ئیمەیڵ و نهێنوشە تێبنووسیت. هەروەها دەتوانیت زانیاری پرۆفایلی زیاتر تێبنووسی ت وەک ناوی پیشاندان و ژیاننامە، و بارکردنی وێنەی پرۆفایل و وێنەی سەرپەڕە. ناوی بەکارهێنەر، ناوی پیشاندان، ژیاننامە، وێنەی پرۆفایل و وێنەی سەرپەڕە هەمیشە بە ئاشکرا لیست کراوە.
  • +
  • پۆستەکان، بەدواکەوتن و زانیاری گشتی : لیستی ئەو کەسانەی کە پەیڕەوی دەکەیت بە ئاشکرا لیست کراوە، هەمان شت بۆ شوێنکەوتەکانت ڕاستە. کاتێک ئیمەیڵێکت پێشکەش کرد، بەروار و کات خەزن کراوە و هەروەها ئەو بەرنامەیەی کە نامەکەت لەوە پێشکەش کردووە. نامەکان لەوانەیە هاوپێچی میدیای تێدابێت، وەک وێنە و ڤیدیۆ. گشتی و لیستە نەکراوەکان بابەتەکان بە ئاشکرا بەردەستن. کاتێک بابەتێک پێشکەش دەکەیت لەسەر پرۆفایلەکەت، کە هەروەها زانیاری بەردەستی گشتیە. بابەتەکانت دەگەیەنینە شوێنکەوتەکانت، لە هەندێک حاڵەتدا مانای وایە دەگەیەنینە ڕاژەکاری جیاواز و کۆپیەکان لەوێ هەڵگیراون. کاتێک بابەتەکان دەسڕیتەوە، ئەمە بە هەمان شێوەیە دەگەیەنیتە شوێنکەوتوانی خۆت. کاری سەرلێبڕین یان بە دڵنییاکردنی پۆستی تر هەمیشە گشتیە.
  • +
  • ڕاستەوخۆ و تەنها شوێنکەوتوانی بابەتەکان: هەموو بابەتەکان خەزن کراون و لە ڕاژەکارەکە دا پرۆسەکراون. پۆست تەنها شوێنکەوتوانی خۆت دەگەیەنینە شوێنکەوتوانی خۆت و بەکارهێنەران کە تێیدا باس دەکرێت، و پۆستی ڕاستەوخۆش تەنها دەگەیەنینە ئەو بەکارهێنەرانەی کە ئاماژەیان پێکراوە لە هەندێک حاڵەتدا واتە دەگەیەنینە ڕاژەی جیاوازەکان و کۆپیەکان لەوێ هەڵگیراون ئێمە هەوڵی باوەڕێکی باش دەکەین بۆ سنووردارکردنی گەیشتن بەو پۆستانە تەنها بۆ کەسانی ڕێگەپێدراو، بەڵام لەوانەیە ڕاژەکارەکانی تر سەرکەوتوو نەبوون. بۆیە گرنگە پێداچوونەوە بە سێرڤەرەکان بکەیت کە شوێنکەوتوانی تۆ هی ئەوەن. لەوانەیە بژاردەیەک بگۆڕیت بۆ پەسەندکردن و ڕەتکردنەوەی شوێنکەوتوانی نوێ بە دەستی لە ڕێکبەندەکان. تکایە لە بیرت بێت کە کارپێکەرەکانی سێرڤەرەکە و هەر خزمەتکاری وەرگرێک لەوانەیە ئەم جۆرە نامانە ، و وەرگرەکان لەوانەیە گرتەی شاشە یان کۆپی بکەن یان بە پێچەوانەوە دووبارە بەشداری پێبکەن. هیچ زانیاریەکی مەترسیدار لەسەر ماستۆدۆن بڵاو
  • +
  • ئای پی و مێتاداتای تر: کاتێک دەچیتە ژوورەوە، ئێمە ئەو ئای پی ە تۆمار دەکەین کە تۆ لە ناوی ەوە داخڵ تدەکەیت، هەروەها ناوی بەرنامەی وێبگەڕەکەت. هەموو ئەو کۆکراوانەی لە کۆبوونەوەکاندا هەن بۆ پێداچوونەوە و بەتاڵکردنەوەت لە ڕێکبەندەکان. نوێترین ناونیشانی IP بەکارهێنراوە خەزن کراوە بۆ ١٢ مانگ. هەروەها لەوانەیە ئێمە مادە ڕاژەکارەکان بهێڵین کە ئای پی ئەدرێسی هەموو داواکارییەک بۆ ڕاژەکارەکانمان
  • +
+ < hr="spacer" /> + +

ئێمە زانیاری ئێوەمان بۆ چییە؟

+ +

ئەو زانیاریانەی لە ئێوە کۆی دەکەین لەوانەیە بەم ڕێگایانە بەکار بهێنرێت:

+ +
    +
  • بۆ دابینکردنی ئەرکە سەرەکیەکانی ماستۆدۆن. دەتوانیت تەنها کارلێک بکەیت لەگەڵ ناوەڕۆکی کەسانی تر و ناوەڕۆکی خۆت پۆست بکەیت کاتێک دەچیتە ژوورەوە. بۆ نموونە، لەوانەیە شوێن کەسانی تر بکەویت بۆ بینینی پۆستە تێکەڵەکانیان لە تایم لاینی ماڵەوەی تایبەتی خۆت.
  • +
  • بۆ چاودێری کردنی کۆمەڵگا، بۆ نموونە بەراوردکردنی ناونیشانی IPەکەت لەگەڵ کەسانی ناسراو بۆ دیاریکردنی خۆدزینەوە یان پێشێلکاریتر.
  • +
  • ئەو ئیمەیڵەی کە تۆ دەستەبەرت کردووە لەوانەیە بەکاربێت بۆ ناردنی زانیاری، ئاگاداری دەربارەی کەسانی تر کە کارلێک دەکەن لەگەڵ ناوەڕۆکەکەت یان ناردنی نامەکانت، و وەڵامدانەوەی پرسیارکردنەکان، و/یان داواکارییان یان پرسیارەکانی تر.
  • +
+ < hr="spacer" /> + +

چۆن زانیاریەکەت دەپارێزین؟

+ +

ئێمە چەندین پێوانەی ئەمنی جۆراوجۆر جێبەجێ دەکەین بۆ پاراستنی سەلامەتی زانیاری ە تایبەتیەکانت کاتێک تۆ داخڵت کردووە یان پێشکەشکردن یان چوونە ژوورەوە بۆ زانیاری تایبەتی. لە نێوان شتەکانی تردا، دانیشتنی وێبگەڕەکەت، هەروەها ترافیکی نێوان کاربەرنامەکانت و API، بە SSL پارێزراوە، و نهێنوشەکەت بە بەکارهێنانی ئەلگاریتمی یەک-ڕێگەی بەهێز بە هاوسێکراوە. دەتوانیت سەلماندنی دوو-فاکتەر بەتوانا بکەیت بۆ زیاتر پاراستنی چوونە ژوورەوە بۆ ئەژمێرەکەت.

+ + < hr="spacer" /> + < hr="spacer" /> + +

بیمەنامەی هێشتنەوە داتامان چییە؟

+ +

ئێمە بە باشی هەوڵ بۆ باوەڕەکان

+ +
    +
  • سێرڤەری پاراستنی ناونووسەکان کە ناونیشانی ئای پی تێدایە بۆ هەموو داواکاریەکان بۆ ئەم سێرڤەرە، تا ئێستا وەک ئەو جۆرە لۆگانە پارێزراون، زیاتر لە 90 ڕۆژ.
  • +
  • ئای پیەکە بپارێزە کە پەیوەندی بە بەکارهێنەرە تۆمارکراوەکان هەیە زیاتر لە 12 مانگ.
  • +
+

دەتوانیت داواکاری و داگرتنی ئەرشیفی ناوەڕۆکەکەت بکەیت، لەوانە بابەتەکانت، هاوپێچەکانی میدیا، وێنەی پرۆفایل، و وێنەی سەرپەڕە.

+ +

تۆ دەتوانیت بە شێوەیەکی نائاسایی ئەژمێرەکەت بسڕیتەوە لە هەر کاتێکدا.

+ + < hr="spacer"/> + +

ئایا ئێمە کۆکیز بەکار بێنە؟

+ +

بەڵێ کۆکیزەکان فایلی بچووکن کە سایتێک یان دابینکەری خزمەتگوزاریەکەی دەیگوێزێتەوە بۆ هارد درایڤی کۆمپیوتەرەکەت لە ڕێگەی وێبگەڕەکەت (ئەگەر ڕێگەت پێ بدەیت). ئەم کۆکیزانە وێبسایتە بەتوانا دەکەن بۆ ناسینەوەی وێبگەڕەکەت و، ئەگەر ئەژمێرێکی تۆمارکراوت هەیە، بیبەستە بە ئەژمێری تۆمارکراو.

+ +

کۆکیز بەکاربێنە بۆ تێگەیشتن و هەڵگرتنی پەسەندیەکانی تۆ بۆ سەردانەکانی داهاتوو.

+ + < hr="spacer" /> + +

> ئایا هیچ زانیارییەک بۆ حزبەکانی دەرەوە ئاشکرا دەکەین؟ + +

ئێمە زانیاریە تایبەتەکانت نافرۆشین، بازرگانی دەکەین، یان ناگوازرێتەوە بۆ حزبەکانی دەرەوە. ئەمە لایەنی سێیەمی باوەڕپێکراو ی تێدا نییە کە یارمەتیمان دەدات لە کارپێکردنی سایتەکەمان، ئەنجامدانی کارەکانمان، یان خزمەتکردنی ئێوە، هەتا ئەو حزبانە ڕازی بن بە نهێنی هێشتنەوەی ئەم زانیاریانە. هەروەها لەوانەیە زانیاریەکەت بڵاوکەینەوه کاتێک پێمان وایە ئازادکردن گونجاوە بۆ پابەندبوون بە یاسا، سەپاندنی سیاسەتی ماڵپەڕەکەمان، یان پاراستنی مافەکانمان یان مافی تر، موڵک، یان سەلامەتی.

+ +

لەوانەیە ناوەڕۆکی گشتیت دابەزێنرابێت لەلایەن خزمەتگوزاریەکانی ترەوە لە تۆڕەکەدا. پۆستە گشتی و تەنها شوێنکەوتوانی تۆ دەگەیەنینە ئەو سێرڤەرانەی کە شوێنکەوتوانی تێیدا نواندووە، و پەیامی ڕاستەوخۆ دەگەیەنینە خزمەتکارەکانی وەرگرەکان، لە دووری ئەوەی کە شوێنکەوتوانی یان وەرگرەکان لە سێرڤەرێکی جیاواز لەم.

+ +

کاتێک تۆ مۆڵەت بە کاربەرنامەیەک بدەیت بۆ بەکارهێنانی ئەژمێرەکەت، بەگوێرەی مەودای مۆڵەتەکانت کە پەسەندت کردووە، لەوانەیە بچێتە ناو زانیاری پرۆفایلی گشتی، لیستی خوارەوەت، شوێنکەوتوانی تۆ، لیستەکانت، هەموو بابەتەکانت، و دڵراوەکانی تۆ. کاربەرنامەکان هەرگیز ناتوانن دەستگەیشتنیان هەبێت بە ناونیشانی ئیمەیڵ یان نهێنوشە.

+ < hr="spacer" /> + +

بەکارهێنانی سایت لەلایەن منداڵانەوە

+ +

ئەگەر ئەم سێرڤەرە لە یەکێتی ئەورووپا یان ئی ئی ئی ئەی بێت: ماڵپەڕ، بەرهەم و خزمەتگوزارییەکانی ئێمە هەموویان ئاراستەی ئەو کەسانە دەکرێت کە بە لایەنی کەمەوە 16 ساڵ ن. ئەگەر تەمەنت لە خوار 16 ساڵەوە بێت، لە سەر پێداویستی GDPR (General Data Protection Regulation) ئەم سایتە بەکارمەهێنیت.

+ +

ئەگەر ئەم سێرڤەرە لە ئەمریکا بێت: ماڵپەڕ و بەرهەم و خزمەتگوزاریەکانمان هەمووی ئاراستەی ئەو کەسانە دەکرێت کە بە لایەنی کەمەوە 13 ساڵ ن. ئەگەر تۆ لە خوار تەمەنی 13 ساڵیەوەبیت، لە سەر داواکاریەکانی COPPA (Children's Online Privacy Protection act) ئەم سایتە بەکارمەهێنیت.

+ +

یاسا دەتوانێت جیاواز بێت ئەگەر ئەم سێرڤەرە لە دەسەڵاتی دادوەری تر بێت.

+ + < hr="spacer" /> + +

گۆڕانکاریەکان لە سیاسەتی تایبەتمەندیمان

+ +

ئەگەر بڕیارمان دا سیاسەتی تایبەتمەندیمان بگۆڕین، ئەو گۆڕانکاریانە لەم پەڕەیە بڵاودەکەینەوە.

+ +

ئەم دۆکیومێنتە CC-BY-SA ە. دوایین جار نوێکرایەوە لە 7ی ئازاری 2018.

+ +

لە بنەڕەتدا لە < href="https://github.com/discourse/discourse">Discourse privacy policy.

+ title: "%{instance} مەرجەکانی خزمەتگوزاری و سیاسەتی تایبەتیێتی" + themes: + contrast: ماستۆدۆن (کۆنتراستی بەرز) + default: ماستۆدۆن (ڕەش) + mastodon-light: ماستۆدۆن (کاڵ) + time: + formats: + default: "%b %d, %Y, %H:%M" + month: "%b %Y" + two_factor_authentication: + add: زیادکردن + disable: لەکارخستنی 2FA + disabled_success: سەلماندنی سەلماندنی دوو-فاکتەر بە سەرکەوتوویی لەکارخراوە + edit: دەستکاری + enabled: سەلماندنی دوو-فاکتەر چالاک کراوە + enabled_success: سەلماندنی دوو-فاکتەر بە سەرکەوتوویی چالاک کرا + generate_recovery_codes: دروست کردنی کۆدی چاککردنەوە + lost_recovery_codes: کۆدی گەڕاندنەوە ڕێگەت پێ دەدات کە دەستگەیشتنت بۆ هەژمارەکەت بەدەست بهێنێ ئەگەر تەلەفۆنەکەت لەدەست بدەیت. ئەگەر کۆدەکانی چاکبوونەوەت لەدەست داوە، دەتوانیت لێرە دووبارە دروستیان کەی. کۆدی چاککردنەوەی کۆنت هەڵدەوەشێنێتەوە. + methods: دوو - میتۆدی فاکتەر + otp: ئەپی ڕاستەوە + recovery_codes: پاڵپشتکردن لە کۆدی هێنانەوەی + recovery_codes_regenerated: کۆدی گەڕاندنەوە بە سەرکەوتوویی دووبارە دروست بوویەوە + recovery_instructions_html: گەر تەلەفۆنەکەت بزر کرد دەتوانی بە یەکێک لە کۆدەکانی خوارەوە چاودێری هەژمارەکەت لە دەست بگریت.ائەم کۆدانە لە شوێنێکی پاراو هەڵبگرە بۆ نموونە چاپی بکەن یان لەگەڵ بەڵگەنامە گرینگەکانت دایبنێ. + webauthn: کلیلەکانی پاراستن + user_mailer: + backup_ready: + explanation: ئێوە وشانێکی پاڵپشتی تەواوت لە هەژمارەکەی خۆت داوا کردووە، ئەم پاڵپشتییە ئێستا ئامادەی بارکردنە! + subject: ئارشیڤی ئێوە ئامادەی داگرتنە + title: وەرگرتنی ئارشیڤ + sign_in_token: + details: 'وردەکاریی هەوڵەکان:' + explanation: 'هەوڵێک بۆ هاتنە نێو هەژمارەکەتان لە ناونیسانێکی ئای‌پی پەیداکرا. گەر خۆتانن. تێپەڕوشەی پاراستن بۆ پەڕەی بەرنگاری دابین بکە:' + further_actions: 'گەر ئێوە نیین تکایە تێپەڕوشە بگۆڕە وە لێرەوە پەسەند بوونی دوو قۆناغی لە سەر هەژمارەکەتان چالاک بکەن:' + subject: تکایە دڵنیابە لە هەوڵدان بۆ چوونە ژوورەوە + title: هەوڵدان بۆ چوونە ژوورەوە + warning: + explanation: + disable: تا کاتێک هەژمارەی ئێوە نەوێستاوە، دراوەکانی ئێوە دەستکاری ناکرێت.بەڵام تا کاتێک کە هەژمارەکەتان ناکرێتەوە. ناتوانن هیچ ئیشێکی لەسەر بکەن. + silence: تا کاتیک هەژمارەکەتان سنووردار بێت، تەنها ئەو کەسانە کە پێشتر شوێنکەوتووی ئێوە بوون نووسراوەکانی ئێوە لەم ڕاژە دەبینن. شایەد ئێوە لە زۆر پێرستی گشتی دیار نەکەون؛ بەڵام خەڵکانی دیکە دەتوانن بە دڵی خۆیان پەیگیری ئێوە بن. + suspend: هەژمارەکەتان هەڵواسراوە، وە تەواو توت و میدیاکان کە لەسەر ئەم ڕاژە بارتان کردووە یان ئەو ڕاژانە کە شوێنکەوتووتان لە سەری بووە ئیتر ناگەڕێنەوە. + get_in_touch: بە وڵام دانەوەی ئەم ئیمەیلە دەتوانن لە گەڵ لیژنەی %{instance} لە پەیوەندی بن. + review_server_policies: پێداچوونەوەی سیاسەتەکانی ڕاژە + statuses: 'بە دیاریکراوی، بۆ:' + subject: + disable: هەژمارەکەت %{acct} بەستراوە + none: ئاگاداری بۆ %{acct} + silence: هەژمارەکەی %{acct} سنووردار کراوە + suspend: هەژمارەکەی %{acct} ڕاگیرا + title: + disable: هەژمارە بەستراوە + none: ئاگاداری + silence: هەژماری سنووردار + suspend: هەژمار ڕاگیرا + welcome: + edit_profile_action: پرۆفایلی جێگیرکردن + edit_profile_step: 'ئێوە دەتوانن پرۆفایلەکەتان بە دڵخوازی خۆتان بگۆڕن: دەتوانن وێنەی پرۆفایل،وێنەی پاشبنەما،ناو و... هتد دابین بکەن. ئەگەر هەرەکت بێت دەتوانی هەژمارەکەت تایبەت بکەیتەوە تا تەنها کەسانێک کە ئێوە ڕێگەتان داوە دەتوانن شوێنکەوتوو هەژمارەکەتان بن.' + explanation: ئەمە چەند ئامۆژگارییەکن بۆ دەست پێکردنت + final_action: دەست بکە بە بڵاوکردنەوە + final_step: 'چیزی بنووسید! تەنانەت گەر ئێستا کەسێک شوێن کەوتووی ئێوە نەبوو، هەژمارەکانی دیکە و سەردانکەرەکانی پرۆفایلەکەتان نووسراوەکانی گشتی ئێوە دەبینن. بۆ نموونە لە پێرستی نووسراوە خۆماڵییەکان و لە لکاوەی(هاشتاگ) ەکان، شایەد هەرەکتان بێت بە چەسپکراوەی # خۆتان بناسێنن.' + full_handle: ناوی بەکارهێنەری تەواوی ئێوە + full_handle_hint: ئەمە ئەو شتەیە کە بە هاوڕێکانت دەلێی بۆ ئەوەی پەیام یان لە ڕاژەیەکی دیکەی ترەوە بەدوات بکەون. + review_preferences_action: گۆڕینی پەسەندەکان + review_preferences_step: دڵنیابە لە دانانی پەسەندکراوەکانت، وەک کام ئیمەیل کە دەتەوێت وەریبگرێ، یان دەتەوێت چ ئاستێکی تایبەتیت بۆ بابەتەکانت پێش گریمانە بێت. ئەگەر نەخۆشی جوڵەت(دڵ تێکەڵدان لە وێنە جووڵەییەکان) نیە، دەتوانیت هەڵبژێریت بۆ بەتواناکردنی پەخشکردنی خۆکاری GIF. + subject: بەخێربیت بۆ ماستۆدۆن + tip_federated_timeline: پێرستی نووسراوەکانی هەمووشوێنێک وێنەیەکی گشتی لە تۆڕی ماستۆدۆنە، بەڵام تەنها بریتییە لە هاوسێکان کە شوێنیان کەوتن؛بس تەواو نییە. + tip_following: بە شیوەی بنەڕەتی بەڕێوەبەران ڕاژەکەتان چاودێری دەکەن، بۆ پەداکردنی کەسانی سەرنجڕاکێشە چاودێری نووسراوە ناخۆیی و نووسراوەکانی شوێنەکانی دیکە بکەن. + tip_local_timeline: پێرستی نووسراوە ناوخۆییەکان شێوەیەکی تەواو لە بەکارهێنەران لە سەر %{instance} پیسان دەدەن، ئەمانە جەیرانی ئێوەن! + tip_mobile_webapp: ئەگەر وێبگەڕی مۆبایلەکەت پێشنیاری زیادکردنی ماستۆدۆن بۆ شاشەی ڕوومێزیەکەتی کرد، دەتوانیت ئاگانامەکانی هاندان وەربگری. لە زۆر ڕوەوە وەک بەرنامەیەیەکی ئەسڵی ئیس دەکا! + tips: ئامۆژگاریەکان + title: بەخێربێیت، بەکارهێنەر %{name}! + users: + blocked_email_provider: ئەم دابینکەری ئیمەیڵە رێگەپێدراو نییە + follow_limit_reached: ناتوانیت زیاتر لە %{limit} خەڵک پەیڕەو کەیت + generic_access_help_html: کێشەت هەیە لە گەیشتن بە هەژمارەکەت؟ دەتوانیت لەگەڵ %{email} بۆ یارمەتیدان پەیوەندی بگرن + invalid_email: ناونیشانی ئیمەیڵەکە نادروستە + invalid_email_mx: لەوە ناچێت ناونیشانی ئیمەیڵ بوونی هەبێت + invalid_otp_token: کۆدی دوو-فاکتەر نادروستە + invalid_sign_in_token: کۆدی پاراستن دروست نیە + otp_lost_help_html: گەر بەو دووڕێگا نەتوانی بچیتە ژوورەوە، لەوانەیە پەیوەندی بگری بە %{email} بۆ یارمەتی + seamless_external_login: تۆ لە ڕێگەی خزمەتگوزاری دەرەکیەوە داخڵ بووی، بۆیە ڕێکبەندەکانی نهێنوشە و ئیمەیل بەردەست نین. + signed_in_as: 'چوونە ژوورەوە وەک:' + suspicious_sign_in_confirmation: وادیارە تۆ پێشتر لەم ئامێرە نەچویتە ژوورەوە، و بۆ ماوەیەک نەچویتە ژوورەوە، بۆیە کۆدی پاراستن دەنێردرینە ناونیشانی ئیمەیڵەکەت بۆ دڵنیابوون لەوەی کە ئەوە تۆیت. + verification: + explanation_html: 'دەتوانیت خۆت بسەلمێنیت وەک خاوەنی لینکەکان لە مێتاداتای پرۆفایلەکەت. بۆ ئەمە، ماڵپەڕە لینککراوەکە پێویستە لینکێکی تێدا بێت بۆ پرۆفایلی ماستۆدۆنەکەت. بەستەری دەبێت هەبێت ="me". ناوەڕۆکی دەقی لینکەکە گرنگ نییە. ئەمە نموونەیەکە:' + verification: ساغ کردنەوە + webauthn_credentials: + add: زیادکردنی کلیلی ئاسایشی نوێ + create: + error: کێشەیەک هەبوو لە زیادکردنی کلیلی پاراستنەکەت. تکایە دووبارە هەوڵ دەوەشنەوە. + success: کلیلی ئاسایشت بە سەرکەوتوویی زیادکرا. + delete: سڕینەوە + delete_confirmation: ئایا دڵنیایت لەوەی دەتەوێت ئەم کلیلی پاراستنە بسڕیتەوە? + description_html: ئەگەر تۆ کلیلی سەلماندنت چالاک دەکەی، بۆ چوونە ژوورەوە پێویستت پێ دەبێ، یەکێک لە کلیلە کانی ئاسایشت بەکاربێنیت. + destroy: + error: کێشەیەک هەبوو لە سڕینەوەی کلیلی پاراستنەکەت. تکایە دووبارە هەوڵ بدەرەوە. + success: کلیلی ئاسایشت بە سەرکەوتوویی سڕایەوە. + invalid_credential: کۆدی پاراستن دروست نیە + nickname_hint: نازناوی کلیلی ئاسایشی نوێت تێبنووسە + not_enabled: تۆ هێشتا WebAuthnت چالاک نەکردووە + not_supported: ئەم وێبگەڕە پشتگیری کلیلەکانی پاراستن ناکات + otp_required: بۆ بەکارهێنانی کلیلەکانی پاراستن تکایە سەرەتا سەلماندنی دوو-فاکتەر چالاک بکە. + registered_on: تۆمارکراو لە %{date} diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 4a2399607..18d81bae3 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -171,6 +171,8 @@ oc: user: Uitlizaire search: Cercar search_same_ip: Autres utilizaires amb la meteissa IP + sensitive: Sensible + sensitized: marcar coma sensible shared_inbox_url: URL de recepcion partejada show: created_reports: Senhalaments creats @@ -183,6 +185,7 @@ oc: time_in_queue: En espèra a la fila %{time} title: Comptes unconfirmed_email: Adreça pas confirmada + undo_sensitized: Desmarcar coma sensible undo_silenced: Levar lo silenci undo_suspension: Levar la suspension unsubscribe: Se desabonar @@ -198,6 +201,7 @@ oc: create_account_warning: Crear un avertiment create_announcement: Crear una anóncia create_custom_emoji: Crear un emoji personalizat + create_ip_block: Crear una règla IP demote_user: Retrogradar l’utilizaire destroy_announcement: Suprimir l’anóncia destroy_custom_emoji: Suprimir l’emoji personalizat @@ -419,6 +423,8 @@ oc: title: Filtre title: Convits ip_blocks: + add_new: Crear una règla + delete: Suprimir expires_in: '1209600': 2 setmanas '15778476': 6 meses @@ -426,6 +432,9 @@ oc: '31556952': 1 an '86400': 1 jorn '94670856': 3 ans + new: + title: Crear una règlas IP novèla + title: Règlas IP pending_accounts: title: Comptes en espèra (%{count}) relationships: @@ -700,7 +709,8 @@ oc: prompt: Confirmatz lo senhal per dire de contunhar date: formats: - default: "%d %B de %Y" + default: "%e %B de %Y" + with_month_name: "%e %B de %Y" datetime: distance_in_words: about_x_hours: "%{count} h" @@ -1207,8 +1217,8 @@ oc: mastodon-light: Mastodon (Clar) time: formats: - default: Lo %d %b de %Y a %Ho%M - month: "%b de %Y" + default: Lo %e %B de %Y a %Ho%M + month: "%B de %Y" two_factor_authentication: disable: Desactivar enabled: Autentificacion en dos temps activada diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 30d51c737..1e77ef21d 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -196,6 +196,8 @@ pl: search: Szukaj search_same_email_domain: Inni użytkownicy z e-mail w tej domenie search_same_ip: Inni użytkownicy z tym samym IP + sensitive: Wrażliwe + sensitized: oznaczono jako wrażliwe shared_inbox_url: Adres udostępnianej skrzynki show: created_reports: Zgłoszenia tego użytkownika @@ -210,6 +212,7 @@ pl: time_in_queue: Czekanie w kolejce %{time} title: Konta unconfirmed_email: Niepotwierdzony adres e-mail + undo_sensitized: Cofnij oznaczenie undo_silenced: Cofnij wyciszenie undo_suspension: Cofnij zawieszenie unsilenced_msg: Pomyślnie zwolniono z ograniczeń konto %{username} @@ -251,9 +254,11 @@ pl: reopen_report: Otwórz zgłoszenie ponownie reset_password_user: Resetuj hasło resolve_report: Rozwiąż zgłoszenie + sensitive_account: Oznacz zawartość multimedialną swojego konta jako wrażliwą silence_account: Wycisz konto suspend_account: Zawieś konto unassigned_report: Cofnij przypisanie zgłoszenia + unsensitive_account: Cofnij oznaczenie zawartości multimedialnej swojego konta jako wrażliwą unsilence_account: Cofnij wyciszenie konta unsuspend_account: Cofnij zawieszenie konta update_announcement: Aktualizuj ogłoszenie @@ -289,9 +294,11 @@ pl: reopen_report: "%{name} otworzył(a) ponownie zgłoszenie %{target}" reset_password_user: "%{name} przywrócił(a) hasło użytkownikowi %{target}" resolve_report: "%{name} rozwiązał(a) zgłoszenie %{target}" + sensitive_account: "%{name} oznaczył(a) zawartość multimedialną %{target} jako wrażliwą" silence_account: "%{name} wyciszył(a) konto %{target}" suspend_account: "%{name} zawiesił(a) konto %{target}" unassigned_report: "%{name} cofnął(-ęła) przypisanie zgłoszenia %{target}" + unsensitive_account: "%{name} cofnął(-ęła) oznaczenie zawartości multimedialnej %{target} jako wrażliwą" unsilence_account: "%{name} cofnął(-ęła) wyciszenie konta %{target}" unsuspend_account: "%{name} cofnął(-ęła) zawieszenie konta %{target}" update_announcement: "%{name} zaktualizował(-a) ogłoszenie %{target}" @@ -851,6 +858,7 @@ pl: request: Uzyskaj archiwum size: Rozmiar blocks: Zablokowani + bookmarks: Zakładki csv: CSV domain_blocks: Blokady domen lists: Listy @@ -929,6 +937,7 @@ pl: success: Twoje dane zostały załadowane i zostaną niebawem przetworzone types: blocking: Lista blokowanych + bookmarks: Zakładki domain_blocking: Lista zablokowanych domen following: Lista śledzonych muting: Lista wyciszonych @@ -1091,6 +1100,7 @@ pl: relationships: activity: Aktywność konta dormant: Uśpione + follow_selected_followers: Zacznij śledzić wybranych śledzących followers: Śledzący following: Śledzeni invited: Zaproszeni @@ -1238,6 +1248,8 @@ pl: other: "%{count} głosy" vote: Głosuj show_more: Pokaż więcej + show_newer: Pokaż nowsze + show_older: Pokaż starsze show_thread: Pokaż wątek sign_in_to_participate: Zaloguj się, aby udzielić się w tej konwersacji title: '%{name}: "%{quote}"' @@ -1374,6 +1386,7 @@ pl: warning: explanation: disable: Kiedy Twoje konto jest wyłączone, Twoje dane pozostają na serwerze, ale nie możesz wykonywać żadnych działań, zanim zostanie odblokowane. + sensitive: Wysyłane przez Ciebie pliki multimedialne i media z odnośników będą traktowane jako wrażliwe. silence: Kiedy Twoje konto jest ograniczone, tylko osoby które je śledzą będą widzieć Twoje wpisy. Może ono też przestać być widoczne na publicznych listach. Inni wciąż mogą zacząć Cię śledzić. suspend: Twoje konto zostało zawieszone i wszystkie Twoje wpisy wraz z zawartością multimedialną zostały nieodwracalnie usunięte z tego serwera i serwerów, których użytkownicy śledzili Cię. get_in_touch: Możesz odpowiedzieć na ten e-mail aby pozostać w kontakcie z prowadzącymi %{instance}. @@ -1382,11 +1395,13 @@ pl: subject: disable: Twoje konto %{acct} zostało wyłączone none: Ostrzeżenie dla %{acct} + sensitive: Zawartość multimedialna publikowana przez Twoje konto %{acct} została oznaczona jako wrażliwa silence: Twoje konto %{acct} zostało ograniczone suspend: Twoje konto %{acct} zostało zawieszone title: disable: Konto wyłączone none: Ostrzeżenie + sensitive: Twoja zawartość multimedialna została oznaczona jako wrażliwa silence: Konto ograniczone suspend: Konto zawieszone welcome: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 7283c1b57..28c7a3204 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -188,6 +188,8 @@ pt-BR: search: Pesquisar search_same_email_domain: Outros usuários com o mesmo domínio de e-mail search_same_ip: Outros usuários com o mesmo IP + sensitive: Sensíveis + sensitized: marcadas como sensíveis shared_inbox_url: Link da caixa de entrada compartilhada show: created_reports: Denúncias desta conta @@ -202,6 +204,7 @@ pt-BR: time_in_queue: Esperando na fila por %{time} title: Contas unconfirmed_email: E-mail não confirmado + undo_sensitized: Desfazer sensível undo_silenced: Desfazer silêncio undo_suspension: Desbanir unsilenced_msg: Removidas com sucesso as limitações da conta de %{username} @@ -243,9 +246,11 @@ pt-BR: reopen_report: Reabrir Relatório reset_password_user: Redefinir a senha resolve_report: Resolver Relatório + sensitive_account: Marcar a mídia na sua conta como sensível silence_account: Silenciar conta suspend_account: Suspender Conta unassigned_report: Remover relatório + unsensitive_account: Desmarcar a mídia na sua conta como sensível unsilence_account: Desfazer silenciar conta unsuspend_account: Remover suspensão de conta update_announcement: Editar anúncio @@ -281,9 +286,11 @@ pt-BR: reopen_report: "%{name} reabriu a denúncia %{target}" reset_password_user: "%{name} redefiniu a senha do usuário %{target}" resolve_report: "%{name} resolveu a denúncia %{target}" + sensitive_account: "%{name} marcou a mídia de %{target} como sensível" silence_account: "%{name} silenciou a conta de %{target}" suspend_account: "%{name} baniu a conta de %{target}" unassigned_report: "%{name} largou a denúncia %{target}" + unsensitive_account: "%{name} desmarcou a mídia de %{target} como sensível" unsilence_account: "%{name} desativou o silêncio de %{target}" unsuspend_account: "%{name} removeu a suspensão da conta de %{target}" update_announcement: "%{name} atualizou o anúncio %{target}" @@ -1067,6 +1074,7 @@ pt-BR: relationships: activity: Atividade da conta dormant: Inativo + follow_selected_followers: Seguir os seguidores selecionados followers: Seguidores following: Seguindo invited: Convidado @@ -1202,6 +1210,8 @@ pt-BR: other: "%{count} votos" vote: Votar show_more: Mostrar mais + show_newer: Mostrar mais recentes + show_older: Mostrar mais antigos show_thread: Mostrar conversa sign_in_to_participate: Entre para participar dessa conversa title: '%{name}: "%{quote}"' @@ -1338,6 +1348,7 @@ pt-BR: warning: explanation: disable: Enquanto sua conta está congelada, seus dados de conta permanecem intactos, mas você não pode realizar nenhuma ação até que esteja destrancada. + sensitive: Seus arquivos de mídia carregados e mídias vinculadas serão tratados como sensíveis. silence: Enquanto sua conta está silenciada, somente pessoas que já estão seguindo você poderão ver seus toots nessa instância, e você pode ser excluído de várias listas públicas. No entanto, outros ainda podem te seguir manualmente. suspend: Sua conta foi banida e todos os seus toots e mídias foram irreversivelmente excluídos desta instância e das instâncias dos seus seguidores. get_in_touch: Você pode responder a este e-mail para entrar em contato com a equipe de %{instance}. @@ -1346,11 +1357,13 @@ pt-BR: subject: disable: Sua conta %{acct} foi bloqueada none: Aviso para %{acct} + sensitive: Sua conta %{acct} de postagem de mídia foi marcada como sensível silence: Sua conta %{acct} foi silenciada suspend: Sua conta %{acct} foi banida title: disable: Conta bloqueada none: Aviso + sensitive: Sua mídia foi marcada como sensível silence: Conta silenciada suspend: Conta banida welcome: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index b9f2ac16b..8d66efba9 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -842,6 +842,7 @@ pt-PT: request: Pede o teu arquivo size: Tamanho blocks: Bloqueaste + bookmarks: Itens Salvos csv: CSV domain_blocks: Bloqueios de domínio lists: Listas @@ -918,6 +919,7 @@ pt-PT: success: Os teus dados foram enviados com sucesso e serão processados em breve types: blocking: Lista de bloqueio + bookmarks: Itens salvos domain_blocking: Lista de domínios bloqueados following: Lista de pessoas que estás a seguir muting: Lista de utilizadores silenciados @@ -1074,6 +1076,7 @@ pt-PT: relationships: activity: Atividade da conta dormant: Inativo + follow_selected_followers: Seguir seguidores selecionados followers: Seguidores following: A seguir invited: Convidado diff --git a/config/locales/ru.yml b/config/locales/ru.yml index be1bf7f90..2de389864 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -863,6 +863,7 @@ ru: request: Запросить ваш архив size: Размер blocks: Список блокировки + bookmarks: Закладки csv: CSV domain_blocks: Доменные блокировки lists: Списки @@ -941,6 +942,7 @@ ru: success: Ваши данные были успешно загружены и будут обработаны с должной скоростью types: blocking: Список блокировки + bookmarks: Закладки domain_blocking: Список доменных блокировок following: Подписки muting: Список глушения @@ -1103,6 +1105,7 @@ ru: relationships: activity: Активность учётной записи dormant: Заброшенная + follow_selected_followers: Подписаться на выбранных подписчиков followers: Подписчики following: Подписки invited: Приглашённые diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 3e7a66e11..98fda0916 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -29,7 +29,7 @@ eo: phrase: Estos provita senzorge pri la uskleco de teksto aŭ averto pri enhavo de mesaĝo scopes: Kiujn API-ojn la aplikaĵo permesiĝos atingi. Se vi elektas supran amplekson, vi ne bezonas elekti la individuajn. setting_aggregate_reblogs: Ne montri novajn diskonigojn de mesaĝoj laste diskonigitaj (nur efikas al novaj diskonigoj) - setting_default_sensitive: Sentema komunikilo estas kaŝita defaŭlte kaj povas esti rivelita per alklako + setting_default_sensitive: Tiklaj aŭdovidaĵoj estas defaŭlte kaŝita kaj povas esti malkiŝita per klako setting_display_media_default: Kaŝi aŭdovidaĵojn markitajn kiel tiklaj setting_display_media_hide_all: Ĉiam kaŝi ĉiujn aŭdovidaĵojn setting_display_media_show_all: Ĉiam montri aŭdovidaĵojn markitajn kiel tiklaj diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index d57c68f8b..51446f63c 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -205,7 +205,7 @@ fr: recommended: Recommandé required: mark: "*" - text: Champs requis + text: champs requis title: sessions: webauthn: Utilisez l'une de vos clés de sécurité pour vous connecter diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index 7237ba48b..aaa5d88e5 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -65,6 +65,8 @@ hy: data: CSV ֆայլը ներմուծուել է Մաստոդոնի այլ սերուերից invite_request: text: Սա կօգնի մեզ ստուգել քո յաւելուածը + ip_block: + ip: Ներմուծէք IPv4 կամ IPv6 հասցէն։ Նաև կարող ես արգելափակել հասցէների միջակայքեր օգտագործելով CIDR սինտաքսը։ Զգոյշ եղիր՝ ինքդ քեզ չարգելափակես։ sessions: otp: Մուտքագրիր երկքայլ նոյնականացման կոդը, որը գեներացուես ես քո բջջային յաւելուածի օգնութեամբ կամ օգտագործիր այս կոդերից կէկը՝ tag: @@ -168,6 +170,13 @@ hy: comment: Մեկնաբանություն invite_request: text: Ինչո՞ւ ես ցանկանում միանալ + ip_block: + comment: Մեկնաբանություն + ip: IP + severities: + no_access: Մուտքը արգելել + sign_up_requires_approval: Սահմանափակել գրանցումները + severity: Կանոն notification_emails: digest: Ուղարկել դասակարգուած իմակներ favourite: Որեւէ մեկը հաւանեց գրառումդ diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index 2fbf0ffd7..2a0cdc66b 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -1 +1,211 @@ ---- {} +--- +ku: + simple_form: + hints: + account_alias: + acct: دیاریکردنی username@domain ئەو هەژمارە کە دەتەوێت بیگوازیەوە لە + account_migration: + acct: دیاریکردنی username@domain ئەو هەژمارە کە دەتەوێت بیگوازیەوە لە + account_warning_preset: + text: دەتوانی ڕستەسازی ی توت بەکاربێنیت، وەک لینک، هاشتاگ و باسەکان + title: ئارەزوومەندانە. دیار نیە بۆ وەرگر + admin_account_action: + include_statuses: بەکارهێنەرەکە دەبینێت کام توتی هۆکاری کرداری بەڕێوەبەر یان ئاگادارکردنەوە + send_email_notification: بەکارهێنەر ڕوننکردەوەیەک دەبینێت کە تێدا دەزانێت چی بە سەر هەژمارەکەی هاتووە + text_html: ئارزوومەندانە. دەتوانن وەک توتی ئاسایی بینووسن. دەتوانن بۆ کەمکردنەوەی کات ئاگادارییەکان لە پێشەوە زیادبکەن + type_html: گەرکتە لەگەڵ هەژمارەی %{acct} چی بکەیت + warning_preset_id: ئارەزوومەندانەیە. هێشتا دەتوانیت لە کۆتایی دەق شتێک زیاد بکەی + announcement: + all_day: کاتێک چاودێریکرا، تەنها بەروارەکانی مەودای کات پیشان دەدرێت + ends_at: ئارەزوومەندانەیە. ئەم کاتە راگەیەنراوەکە بە شێوەیەکی خۆکارانە بڵاوناکرێتەوە + scheduled_at: چۆڵ یبهێڵەوە بۆ بڵاوکردنەوەی دەستبەجێی بانگەوازەکە + starts_at: ئارەزوومەندانەیە. لە حاڵەتی ڕاگەیاندنی تۆ بەستراو بە مەودایەکی کاتی دیاریکراو + text: دەتوانیت ڕستەسازی توت بەکار بێنیت. تکایە بیر لەو بۆشاییە بکەوە کە بانگەوازەکە لەسەر شاشەی بەکارهێنەرەکە دەست نیشان دەکات + defaults: + autofollow: ئەو کەسانەی کە لە ڕێگەی بانگهێشتکردنەوە تۆمار دەکرێن بە خۆکارانە شوێنت دەکەون + avatar: PNG, GIF یان JPG. لە زۆربەی %{size}. دەبێتە ئەندازەیەکی کەمکراوە بۆ %{dimensions}px + bot: ئەم هەژمارە بەشێوەیەکی سەرەکی کردارە خۆکارانە ئەنجام دەدات و لەوانەیە چاودێری نەکرێت + context: یەک یان چەند دەقێک کە پالافتنەکە جێبەجێ بکات + current_password: بۆ مەبەستی پاراستن تکایە تێپەروشەی هەژمارەی ئێستاکەت بنووسە + current_username: بۆ دڵنیابوون، تکایە ناوی بەکارهێنەری ئەم هەژمارەیە بنووسە + digest: تەنیا دوای ماوەیەکی زۆر لە بێ چالاکیدەنێردرێت و تەنیا ئەگەر نامەیەکی کەسیت بۆ نووسرابێت + discoverable: پێرستی هەڵبژاردەی بەکارهێنەران،تەنها ڕیگایەکی دیکەیە بۆ گەیشتنی بەکارهێنەری فرەتر بۆ هەژمارەکەت + email: ئیمەیڵێکی پشتڕاستکردنەوەت بۆ دەنێردرێت + fields: دەتوانیت تا ٤بڕگەت هەبێت کە وەک خشتەیەک لەسەر پرۆفایلەکەت پیشان بدرێت + header: PNG, GIF یان JPG. لە زۆربەی %{size}. دەبێتە ئەندازەیەکی کەمکراوە بۆ %{dimensions}پیکسێڵ + inbox_url: نیشانەی پەڕەی سەرەکی ئەو رێڵە کە هەرەکتە بەکاریببەیت ڕوونووس دەکات + irreversible: توتە فلتەرکراوەکە بە شێوەیەکی نەگەڕاو فرەدەدرێن، تەنانەت ئەگەر فلتەردواتر لاببرێت + locale: زمانی ڕووکاری بەکارهێنەر، ئیمەیلەکان و ئاگانامەکان + locked: بە دەستی شوێنکەوتوانی خۆت پەسەند بکە + password: بەلایەنی کەمەوە ٨ نووسە بەکاربهێنە + phrase: سەربەخۆ لە بچکۆلی و گەورەیی پیتەکان، لەگەڵ دەقی ئەسڵی یان ئاگانامەکانی ناوەرۆکی توتەکان هاوئاهەنگ دەکرێت + scopes: APIـیەکانی بەرنامەنووسی کە ئەم ماڵپەڕە دەستپێگەیشتنی لەگەڵیان هیە. ئەگەر بەرزترین ئاست هەڵبژێرن ئیتر نیاز بە بژاردەی ئاستی نزم نییە. + setting_aggregate_reblogs: بۆ ئەو دووبارە توتانە کە بە نوێیی پێتان نیشان دراوە،دووبارە توتەکانی پێشتر زیاد مەکە(تەنها کاریگەری لەسەر توتەکانی ئەم دواییە هەیە) + setting_default_sensitive: میدیای هەستیار لە بنەڕەت شاراوەیە و دەتوانرێت بە کلیکیک ئاشکرا بکرێت + setting_display_media_default: شاردنەوەی ئەو میدیایانەی وەک هەستیار نیشانکراون + setting_display_media_hide_all: هەمیشە میدیا بشارەوە + setting_display_media_show_all: هەمیشە میدیا نیشان بدە + setting_hide_network: کێ دوای دەکەویت و کێ دوای تۆ دەکەوێت لە پرۆفایلەکەت پیشان نادرێت + setting_noindex: کاردەکاتە سەر پرۆفایل و لاپەڕە گشتیەکانت + setting_show_application: بەرنامەیەک کە بە یارمەتیت توت دەکەیت، لە دیمەنی وردی توتەکان پیشان دەدرێت + setting_use_blurhash: سێبەرەکان لە سەر بنەمای ڕەنگەکانی بەکارهاتوو لە وێنە داشاراوەکان دروست دەبن بەڵام وردەزانیاری وێنە تێیدا ڕوون نییە + setting_use_pending_items: لەجیاتی ئەوەی بە خۆکارانە کێشان هەبێت لە نووسراوەکان بە کرتەیەک بەڕۆژبوونی پێرستی نووسراوەکان بشارەوە + username: ناوی بەکارهێنەری ئێوە لەسەر %{domain} یەکتا دەبێت + whole_word: کاتێک کلیل‌وشە بریتییە لە ژمارە و پیت، تنەها کاتێک پەیدا دەبێت کە لەگەڵ گشتی وشە لە نێو دەقەکە هاوئاهەنگ بێت، نە تەنها لەگەڵ بەشێک لە وشە + domain_allow: + domain: ئەم دۆمەینە دەتوانێت دراوە لە ئەم ڕاژە وەربگرێت و دراوەی ئەم دۆمەینە لێرە ڕێکدەخرین و پاشکەوت دەکرێن + email_domain_block: + domain: ئەمە دەکرێت ناوی دۆمەینەکە بێت کە لە ناونیشانی ئیمەیلدا دەرکەوێ، تۆماری MX کە دۆمەین چارەسەری دەکات یان IPی ڕاژەکە کە تۆماری MX چارەسەری دەکات. ئەوانە دەپشکنن لەسەر تۆمارکردنی بەکارهێنەر و تۆمارکردن ڕەت دەکرێت. + with_dns_records: هەوڵێک بۆ چارەسەرکردنی تۆمارەکانی DNSی دۆمەین دراوە کە ئەنجامەکان بلۆک دەکرێت + featured_tag: + name: 'لەوانەیە بتەوێت یەکێک لەمانە بەکاربهێنیت:' + form_challenge: + current_password: تۆ دەچیتە ناو ناوچەی پارێزراو + imports: + data: فایلی CSV هەناردەکراوە لە ڕاژەیەکی تری ماستۆدۆن + invite_request: + text: ئەمە یارمەتیمان دەدات بۆ پێداچوونەوەی بەرنامەکەت + ip_block: + comment: دڵخوازە. لەبیرتە بۆچی ئەم یاسایەت زیاد کرد. + expires_in: ناونیشانی IP سەرچاوەی سنوردارن، هەندێک جار هاوبەشکراون و زۆر جار دەستەکان دەگۆڕن. لەبەر ئەم هۆیە، بلۆکی IP بێ نەناسراو پێشنیار نەکراوە. + ip: ناونیشانی IPv4 یان IPv6 تێبنووسە. دەتوانیت هەموو مەوداکان بلۆک بکەیت بە بەکارهێنانی داڕستانی CIDR. وریابە خۆت قفڵ مەکە! + severities: + no_access: بلۆککردنی گەیشتن بە هەموو سەرچاوەکان + sign_up_requires_approval: نوێ ناوتۆمارکردن پێویستی بە ڕەزامەندی تۆیە + severity: هەڵبژێرە چی ڕوودەدات لەگەڵ داواکاریەکانی ئەم IP + sessions: + otp: 'کۆدی دوو-فاکتۆر بنووسە کە لەلایەن ئەپی تەلەفۆنەکەتەوە دروست کراوە یان یەکێک لە کۆدەکانی هێنانەوەی خۆت بەکاربهێنە:' + webauthn: ئەگەر کلیلی USB بێت دڵنیابە لە تێکردنی و ئەگەر پێویست بوو، لێیبدە. + tag: + name: ئێوە دەتوانن گەورەیی و بجکۆلیی پیتەکان دەستکاری بکەن تاکوو خوێنەوارتر دیاربن + user: + chosen_languages: کاتێک چاودێری کرا، تەنها توتەکان بە زمانە دیاریکراوەکان لە هێڵی‌کاتی گشتی پیشان دەدرێت + labels: + account: + fields: + name: ناونیشان + value: ناوەڕۆک + account_alias: + acct: چارەسەرکردنی هەژمارە کۆنەکە + account_migration: + acct: چارەسەرکردنی هەژمارە نوێکە + account_warning_preset: + text: دەقی پێشوەختی ڕێکخستن + title: سەردێڕ + admin_account_action: + include_statuses: لەخۆگرتنی توتەکانی گوزارشت لە ئیمەیل + send_email_notification: بەکارهێنەر ئاگادار بکەوە بۆ هەر ئیمەیڵێک + text: ئاگاداری تایبەتمەند + type: کردار + types: + disable: بەستن + none: ناردنی ئاگاداری + silence: سنوور + suspend: ڕاگرتن + warning_preset_id: بەکاهێنانی ئاگاداری پێش وەختە + announcement: + all_day: ڕووداوی هەموو ڕۆژەکە + ends_at: کۆتایی ڕووداو + scheduled_at: بڵاوکراوەکە خشتە بکە + starts_at: دەستپێکردنی ڕووداو + text: بانگەواز + defaults: + autofollow: بانگهێشت کردن بۆ شوێنکەوتنی هەژمارەکەت + avatar: وێنۆچکە + bot: ئەمە هەژمارێکی ساختەیە + chosen_languages: پاڵاوتنی زمانەکان + confirm_new_password: پشتڕاستکردنەوەی تێپەڕوشەی نوێ + confirm_password: پشتڕاستکردنەوەی تێپەڕوشە + context: چوارچێوەی پاڵافتن + current_password: تێپەروشەی ئێستا + data: دراوه + discoverable: ئەم هەژمێرە لە پێرستی بژاردەی بەکارهێنەران نیشان بدە + display_name: ناوی پیشاندان + email: ناونیشانی ئیمەیڵ + expires_in: بەسەردەچێت پاش + fields: مێتاداتای پرۆفایل + header: سەرپەڕە + inbox_url: بەستەری سندوقی گواستنەوەی + irreversible: فرێدان لەجیاتی شاردنەوە + locale: زمانی پەڕەی بەکارهێنەر + locked: داخستنی هەژمارە + max_uses: زۆرترین ژمارەی بەکاربەرەکان + new_password: تێپەروشەی نوێ + note: دەربارەی ئیوە + otp_attempt: کۆدی دووقۆناغی هاتنەژوور + password: تێپەڕوشە + phrase: وشەکلیل یان دەستەواژە + setting_advanced_layout: چالاککردنی ڕووکاری وێبی پێشکەوتوو + setting_aggregate_reblogs: گرووپی توتەکان یەکبخە + setting_auto_play_gif: خۆکاربەخشکردنی GIFــەکان + setting_boost_modal: پیشاندانی دیالۆگی دووپاتکردنەوە پێش دوبارە توتاندن + setting_crop_images: لە تووتی نەکراوە،وینەکان لە ئەندازی ۱٦×۹ ببڕە + setting_default_language: زمانی نووسراوەکانتان + setting_default_privacy: چوارچێوەی تایبەتێتی ئێوە + setting_default_sensitive: هەمیشە نیشانکردنی میدیا وەک هەستیار + setting_delete_modal: نیساندانی پەیامی پەسەند کردن پاش سڕینەوە + setting_disable_swiping: جوڵەی سڕینەوە لە کاربخە + setting_display_media: پیشاندانی میدیا + setting_display_media_default: بنەڕەت + setting_display_media_hide_all: شاردنەوەی هەموو + setting_display_media_show_all: هەموو نیشان بدە + setting_expand_spoilers: هەمیشە ئەو توتانەی کە بە ئاگادارکردنەوەکانی ناوەڕۆکەوە نیشانەکراون، پیسان بدە + setting_hide_network: شاردنەوەی تۆڕەکەت + setting_noindex: داوا لە مەکینەی گەڕان بۆ پیشاننەدان لە دەئەنجامی گەڕانەکان + setting_reduce_motion: کەمکردنەوەی جوڵە لە ئەنیمەکان + setting_show_application: ئاشکراکردنی ئەپەکان بۆ ناردنی توتەکان + setting_system_font_ui: فۆنتی بنەڕەتی سیستەم بەکاربهێنە + setting_theme: ڕووکاری ماڵپەڕ + setting_trends: پیشاندانی نووسراوە بەرچاوکراوەی ئەمڕۆ + setting_unfollow_modal: پیشاندانی پەیامی پەسەندکردن پێش شوێن‌نەکەوتنی کەسێک + setting_use_blurhash: بەجیاتی وینەی داشاراوە، سێبەری ڕەنگاوڕەنگ نیشان بدە + setting_use_pending_items: دۆخی خاو + severity: ئاستی گرنگی + sign_in_token_attempt: کۆدی پاراستن + type: جۆری هاوردەکردن + username: ناوی بەکارهێنەر + username_or_email: ناوی بەکاهێنەر یان ئیمەیڵ + whole_word: هەموو وشەکە + email_domain_block: + with_dns_records: لەخۆگرتنی تۆمارەکانی MX و ئای پییەکانی دۆمەین + featured_tag: + name: هەشتاگ + interactions: + must_be_follower: قەپاتکردنی ئاگانامەکان بێجگە لە شوێنکەوتووان + must_be_following: بەئاگانامەکان بلۆک بکە لە خەڵکێک کە پەیڕەویان ناکەیت + must_be_following_dm: پەیامەکانی ڕاستەوخۆ بلۆک بکە لەو کەسانەی کە، پەیڕەوی ناکەن + invite: + comment: بۆچوون + invite_request: + text: بۆچی دەتەوێت بەشدار بیت? + ip_block: + comment: بۆچوون + ip: IP + severities: + no_access: بلۆککردنی ده‌ستپێگه‌یشتن + sign_up_requires_approval: سنووردارکردنی چوونەناو + severity: یاسا + notification_emails: + digest: کورتکردنی ئاگادارییکەن لەیەک ئیمەیل + favourite: کەسێک دۆخی تۆی بەدڵ بوو + follow: کەسێک دوای تۆ کەوت + follow_request: کەسێک داوای کردووە کە بەدوات بکەوێت + mention: کەسێک باسی کردووی + pending_account: هەژمارەی نوێ پێویستی بە پێداچوونەوەهەیە + reblog: کاتێک کەسێک نووسراوەی ئێوە دووبارە توت دەکاتەوە + report: گوزارشتی نوێ پێشکەش کراوە + trending_tag: کاتێک هاشتاگێکی پێدانەچوو هۆگری فرە بوو، ئیمەیلێک بنێرە + tag: + listable: ڕیگەبدە ئەم هاشتاگە لە پێرستی هەڵبژاردەی بەکارهێنەران و پەڕەی گەڕان نیشان بدرێت + name: هەشتاگ + trendable: ڕێگەبدە ئەم هەشتاگە لە نووسراوەی بەرچاوکراو نیسان بدرێت + usable: ڕێگەبدە بە توتەکان بۆ بەکارهێنانی ئەم هەشتاگە + 'no': نە + recommended: پێشنیارکراوە + required: + mark: "*" + text: پێویستە + title: + sessions: + webauthn: یەکێک لە کلیلەکانی پاراستن بەکاربهێنە بۆ چوونە ژوورەوە + 'yes': بەڵێ diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 72a6c99bc..120ddfbe0 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -67,6 +67,11 @@ oc: text: Aquò nos ajudarà per validar vòstra demanda ip_block: comment: Opcional. Remembratz-vos perque ajustèretz aquesta règla. + expires_in: Las adreças IP son una ressorsa finida, son de còps partejadas e càmbian sovent de mans. Per aquesta rason, los blocatges d’IP sens fin son pas recomandats. + ip: Dintratz una adreça IPv4 o IPv6. Podètz blocar de plajas entièras en utilizant la sintaxi CIDR. Agachatz de pas vos blocar defòra ! + severities: + no_access: Blocar l’accès a totas las ressorsas + sign_up_requires_approval: Las inscripcions novèlas requeriràn vòstra validacion severity: Causissètz que far amb las requèstas d’aquesta IP sessions: otp: 'Picatz lo còdi d’autentificacion en dos temps (Two factor code) de vòstra aplicacion mobil o utilizatz un de vòstres còdis de recuperacion :' diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 623639efc..a02d0be35 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -100,6 +100,7 @@ pl: types: disable: Wyłącz none: Nie rób niczego + sensitive: Wrażliwe silence: Wycisz suspend: Zawieś i nieodwracalnie usuń dane konta warning_preset_id: Użyj szablonu ostrzeżenia diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index f3c993625..ea53a3c83 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -100,6 +100,7 @@ pt-BR: types: disable: Congelar none: Não fazer nada + sensitive: Sensível silence: Silenciar suspend: Banir e excluir irreversivelmente dados da conta warning_preset_id: Usar um aviso pré-definido diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index 28bf0f0d8..99611febf 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -7,12 +7,12 @@ vi: account_migration: acct: Nhập tên_người_dùng@máy chủ của tài khoản bạn muốn dời sang account_warning_preset: - text: Bạn có thể sử dụng URL, hashtag và nhắc đến + text: Bạn có thể dùng URL, hashtag và nhắc đến title: Tùy chọn. Không cho người nhận xem admin_account_action: - include_statuses: Người dùng sẽ thấy các tút bị kiểm duyệt hoặc cảnh cáo + include_statuses: Người dùng sẽ thấy các tút bị kiểm duyệt send_email_notification: Người dùng sẽ nhận được lời giải thích về những gì xảy ra với tài khoản của họ - text_html: Tùy chọn. Bạn nên sử dụng cảnh cáo cài sẵn để tiết kiệm thời gian + text_html: Tùy chọn. Bạn nên dùng cảnh cáo cài sẵn để tiết kiệm thời gian type_html: Chọn làm gì với %{acct} warning_preset_id: Tùy chọn. Bạn vẫn có thể thêm ghi chú riêng announcement: @@ -20,7 +20,7 @@ vi: ends_at: Tùy chọn. Thông báo sẽ tự động hủy vào lúc này scheduled_at: Để trống nếu muốn đăng thông báo ngay lập tức starts_at: Tùy chọn. Trong trường hợp thông báo của bạn đăng vào một khoảng thời gian cụ thể - text: Bạn có thể sử dụng tút dạng cú pháp. Cố gắng ngắn gọn bởi vì thông báo sẽ xuất hiện trên màn hình điện thoại của người dùng + text: Bạn có thể dùng URL, hashtag và nhắc đến. Cố gắng ngắn gọn bởi vì thông báo sẽ xuất hiện trên màn hình điện thoại của người dùng defaults: autofollow: Những người đăng ký sẽ tự động theo dõi bạn avatar: PNG, GIF hoặc JPG. Kích cỡ tối đa %{size}. Sẽ bị nén xuống %{dimensions}px @@ -33,11 +33,11 @@ vi: email: Bạn sẽ được gửi một email xác nhận fields: Được phép tạo tối đa 4 mục trên trang cá nhân của bạn header: PNG, GIF hoặc JPG. Kích cỡ tối đa %{size}. Sẽ bị nén xuống %{dimensions}px - inbox_url: Sao chép URL của relay mà bạn muốn sử dụng + inbox_url: Sao chép URL của máy chủ mà bạn muốn dùng irreversible: Các tút đã lọc sẽ không thể phục hồi, kể cả sau khi xóa bộ lọc locale: Ngôn ngữ của giao diện, email và thông báo đẩy locked: Tự bạn sẽ phê duyệt người theo dõi - password: Sử dụng ít nhất 8 ký tự + password: Dùng ít nhất 8 ký tự phrase: Sẽ được hiện thị trong văn bản hoặc cảnh báo nội dung của một tút 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 chia sẻ thì những lượt chia sẻ sau sẽ không hiển thị trên bảng tin nữa @@ -58,7 +58,7 @@ vi: domain: Đây có thể là tên miền hoặc IP của dịch vụ email. Người dùng của những dịch vụ email này sẽ bị từ chối khi đăng ký. with_dns_records: Nếu DNS có vấn đề, nó sẽ bị đưa vào danh sách cấm featured_tag: - name: 'Những hashtag khuyến nghị bạn sử dụng:' + name: 'Những hashtag gợi ý cho bạn:' form_challenge: current_password: Biểu mẫu này an toàn imports: @@ -67,14 +67,14 @@ vi: text: Điều này sẽ giúp chúng tôi phê duyệt đăng ký của bạn ip_block: comment: Tùy chọn. Hãy cho biết lý do bạn chặn IP này. - expires_in: Có thể sẽ có nhiều người khác nhau sử dụng chung một địa chỉ IP. Vì vậy, bạn nên xem xét không nên chặn IP nào đó vĩnh viễn. + expires_in: Có thể sẽ có nhiều người khác nhau dùng chung một địa chỉ IP. Vì vậy, bạn nên cân nhắc không nên chặn IP nào đó vĩnh viễn. ip: Nhập một địa chỉ IPv4 hoặc IPv6. Bạn cũng có thể chặn toàn bộ dãy IP bằng cú pháp CIDR. Hãy cẩn thận đừng chặn nhầm toàn bộ! severities: no_access: Chặn truy cập từ tất cả IP này sign_up_requires_approval: Bạn sẽ phê duyệt những đăng ký mới từ IP này severity: Chọn hành động nếu nhận được yêu cầu từ IP này sessions: - otp: 'Nhập mã xác thực hai yếu tố được tạo bởi ứng dụng điện thoại của bạn hoặc sử dụng một trong các mã khôi phục của bạn:' + otp: 'Nhập mã xác thực hai bước được tạo bởi ứng dụng điện thoại của bạn hoặc dùng một trong các mã khôi phục của bạn:' webauthn: Nếu đây là USB key, hãy cắm vào và thử xoay chiều. 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 @@ -99,11 +99,11 @@ vi: type: Hành động types: disable: Tạm khóa - none: Gửi cảnh cáo + none: Cấm upload sensitive: Nhạy cảm silence: Tạm ẩn suspend: Vô hiệu hóa - warning_preset_id: Sử dụng cảnh cáo cài sẵn + warning_preset_id: Dùng cảnh cáo cài sẵn announcement: all_day: Sự kiện diễn ra hằng ngày ends_at: Kết thúc sự kiện @@ -130,7 +130,7 @@ vi: irreversible: Xóa bỏ vĩnh viễn locale: Ngôn ngữ locked: Đây là tài khoản riêng tư - max_uses: Số lần sử dụng tối đa + max_uses: Số lần dùng tối đa new_password: Mật khẩu mới note: Tiểu sử otp_attempt: Xác thực hai bước @@ -155,7 +155,7 @@ vi: 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: Sử dụng phông chữ mặc định của hệ thống + setting_system_font_ui: Dùng phông chữ mặc định của hệ thống setting_theme: Giao diện setting_trends: Hiển thị xu hướng hôm nay setting_unfollow_modal: Yêu cầu xác nhận trước khi hủy theo dõi ai đó @@ -200,7 +200,7 @@ vi: listable: Cho phép hashtag này xuất hiện trong tìm kiếm và trên tiểu sử cá nhân name: Hashtag trendable: Cho phép hashtag này xuất hiện trong xu hướng - usable: Cho phép sử dụng hashtag này trong tút + usable: Cho phép dùng hashtag này trong tút 'no': Tắt recommended: Khuyến nghị required: diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index cc20a067f..843157815 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -168,6 +168,8 @@ zh-HK: comment: 備註 invite_request: text: 加入的原因 + ip_block: + ip: IP 地址 notification_emails: digest: 定期電郵摘要 favourite: 當有用戶喜歡你的文章時,發電郵通知 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index a09c9945d..80cc8c2ee 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -24,6 +24,7 @@ zh-TW: current_password: 因安全因素,請輸入目前帳戶的密碼 current_username: 請輸入目前帳戶的使用者名稱以確認 digest: 僅在你長時間未登入且在未登入期間收到私訊時傳送 + discoverable: 加入個人資料目錄能接觸更多閱聽眾 email: 您將收到一封確認電子郵件 fields: 您可在個人資料上有至多 4 個以表格形式顯示的項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會按比例縮小成 %{dimensions} 像素 diff --git a/config/locales/sq.yml b/config/locales/sq.yml index e6e6859dc..d08d726c0 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -842,6 +842,7 @@ sq: request: Kërkoni arkivin tuaj size: Madhësi blocks: Bllokoni + bookmarks: Faqerojtës csv: CSV domain_blocks: Bllokime përkatësish lists: Lista @@ -918,6 +919,7 @@ sq: success: Të dhënat tuaja u ngarkuan me sukses dhe tani do të përpunohet në kohë types: blocking: Listë bllokimesh + bookmarks: Faqerojtës domain_blocking: Listë bllokimesh përkatësish following: Listë ndjekjesh muting: Listë heshtimesh @@ -1074,6 +1076,7 @@ sq: relationships: activity: Veprimtari llogarie dormant: Në gjumë + follow_selected_followers: Ndiq ndjekësit e përzgjedhur followers: Ndjekës following: Ndjek invited: Të ftuar diff --git a/config/locales/sv.yml b/config/locales/sv.yml index d14899f3d..a84d5cdbd 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -642,6 +642,7 @@ sv: request: Efterfråga ditt arkiv size: Storlek blocks: Du blockerar + bookmarks: Bokmärken csv: CSV lists: Listor mutes: Du tystar @@ -678,6 +679,7 @@ sv: success: Dina uppgifter har laddats upp och kommer nu att behandlas snarast types: blocking: Lista av blockerade + bookmarks: Bokmärken following: Lista av följare muting: Lista av nertystade upload: Ladda upp @@ -766,6 +768,7 @@ sv: other: Annat relationships: activity: Kontoaktivitet + follow_selected_followers: Följ valda personer followers: Följare following: Följer last_active: Senast aktiv diff --git a/config/locales/th.yml b/config/locales/th.yml index 68ea31d82..fcfa2fbc9 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -127,6 +127,7 @@ th: login_status: สถานะการเข้าสู่ระบบ media_attachments: ไฟล์แนบสื่อ memorialize: เปลี่ยนเป็นอนุสรณ์ + memorialized_msg: เปลี่ยน %{username} เป็นบัญชีอนุสรณ์สำเร็จ moderation: active: ใช้งานอยู่ all: ทั้งหมด @@ -150,6 +151,8 @@ th: reject_all: ปฏิเสธทั้งหมด remove_avatar: เอาภาพประจำตัวออก remove_header: เอาส่วนหัวออก + removed_avatar_msg: เอาภาพประจำตัวของ %{username} ออกสำเร็จ + removed_header_msg: เอาภาพส่วนหัวของ %{username} ออกสำเร็จ resend_confirmation: already_confirmed: ผู้ใช้นี้ได้รับการยืนยันอยู่แล้ว send: ส่งอีเมลยืนยันอีกครั้ง @@ -750,6 +753,7 @@ th: request: ขอการเก็บถาวรของคุณ size: ขนาด blocks: คุณปิดกั้น + bookmarks: ที่คั่นหน้า csv: CSV domain_blocks: การปิดกั้นโดเมน lists: รายการ @@ -806,6 +810,7 @@ th: overwrite_long: แทนที่ระเบียนปัจจุบันด้วยระเบียนใหม่ types: blocking: รายการปิดกั้น + bookmarks: ที่คั่นหน้า domain_blocking: รายการปิดกั้นโดเมน following: รายการติดตาม muting: รายการซ่อน @@ -920,6 +925,7 @@ th: relationships: activity: กิจกรรมบัญชี dormant: ไม่เคลื่อนไหว + follow_selected_followers: ติดตามผู้ติดตามที่เลือก followers: ผู้ติดตาม following: กำลังติดตาม invited: เชิญแล้ว diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 916cff301..bc5c9a43f 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -35,7 +35,7 @@ tr: status_count_before: Şu ana kadar tagline: Arkadaşlarını takip et ve yenilerini keşfet terms: Kullanım şartları - unavailable_content: Mevcut olmayan içerik + unavailable_content: Denetlenen sunucular unavailable_content_description: domain: Sunucu reason: Sebep @@ -52,16 +52,16 @@ tr: user_count_before: Kayıtlı what_is_mastodon: Mastodon nedir? accounts: - choices_html: "%{name} seçimleri:" + choices_html: "%{name} kişisinin seçimleri:" endorsements_hint: Takip ettiğiniz kişileri web arayüzünden onaylayabilirsiniz, burada görünecekler. featured_tags_hint: Burada görüntülenecek belirli etiketlere sahip olabilirsiniz. follow: Takip et followers: one: Takipçi other: Takipçi - following: Takip ettikleri + following: Takip edilenler joined: "%{date} tarihinde katıldı" - last_active: son aktivite + last_active: son etkinlik link_verified_on: Bu bağlantının mülkiyeti %{date} tarihinde kontrol edildi media: Medya moved_html: "%{name}, %{new_profile_link} adresine taşındı:" @@ -77,7 +77,7 @@ tr: other: Toot posts_tab_heading: Tootlar posts_with_replies: Tootlar ve yanıtlar - reserved_username: Kullanıcı adı saklıdır + reserved_username: Kullanıcı adı rezerve edildi roles: admin: Yönetici bot: Bot @@ -90,7 +90,7 @@ tr: action: Eylemi gerçekleştir title: "%{acct} üzerinde denetleme eylemi gerçekleştir" account_moderation_notes: - create: Not bırakın + create: Not bırak created_msg: Denetim notu başarıyla oluşturuldu! delete: Sil destroyed_msg: Denetim notu başarıyla yok edildi! @@ -139,9 +139,9 @@ tr: local: Yerel remote: Uzaktan title: Konum - login_status: Giriş durumu + login_status: Oturum açma durumu media_attachments: Medya ekleri - memorialize: Bir hatıraya dön + memorialize: Anıta dönüştür memorialized: Anıtlaştırıldı memorialized_msg: "%{username} hesabı başarıyla anıt hesabına dönüştürüldü" moderation: @@ -150,7 +150,7 @@ tr: pending: Bekliyor silenced: Susturulanlar suspended: Uzaklaştırılanlar - title: Yönetim + title: Denetim moderation_notes: Denetleme notları most_recent_activity: Son aktivite most_recent_ip: Son IP @@ -218,7 +218,7 @@ tr: action_logs: action_types: assigned_to_self_report: Raporu Ata - change_email_user: Kullanıcı için e-postayı değiştir + change_email_user: Kullanıcı E-postasını Değiştir confirm_user: Kullanıcıyı Onayla create_account_warning: Uyarı Oluştur create_announcement: Duyuru Oluştur @@ -235,14 +235,14 @@ tr: destroy_email_domain_block: E-posta alan adı engelini sil destroy_ip_block: IP kuralını sil destroy_status: Durumu Sil - disable_2fa_user: 2 Adımlı Doğrulamayı Kapat - disable_custom_emoji: Özel İfadeyi Engelle - disable_user: Kullanıcıyı Engelle + disable_2fa_user: 2AD Kapat + disable_custom_emoji: Özel İfadeyi Devre Dışı Bırak + disable_user: Kullanıcıyı Devre Dışı Bırak enable_custom_emoji: Özel İfadeyi Etkinleştir enable_user: Kullanıcıyı Etkinleştir - memorialize_account: Hesabı Hatırlat + memorialize_account: Hesabı Anıtlaştır promote_user: Kullanıcıyı Yükselt - remove_avatar_user: Avatarı Kaldır + remove_avatar_user: Profil Resmini Kaldır reopen_report: Şikayeti Tekrar Aç reset_password_user: Parolayı Sıfırla resolve_report: Şikayeti Çöz @@ -280,7 +280,7 @@ tr: disable_user: "%{name} %{target} kullanıcısı için oturum açmayı devre dışı bıraktı" enable_custom_emoji: "%{name} %{target} için emojiyi etkinleştirdi" enable_user: "%{name} %{target} için oturum açmayı etkinleştirdi" - memorialize_account: "%{name} %{target}'in hesabını bir hatıra sayfasına dönüştürdü" + memorialize_account: "%{name}, %{target} kişisinin hesabını anıt sayfasına dönüştürdü" promote_user: "%{name} %{target} kullanıcısını yükseltti" remove_avatar_user: "%{name} %{target}'in avatarını kaldırdı" reopen_report: "%{name} %{target} şikayetini yeniden açtı" @@ -842,6 +842,7 @@ tr: request: Arşivinizi isteyin size: Boyut blocks: Engellediklerin + bookmarks: Yer imleri csv: CSV domain_blocks: Alan adı engelleri lists: Listeler @@ -918,6 +919,7 @@ tr: success: Verileriniz başarıyla yüklendi ve zaman içinde işlenecek types: blocking: Engellenenler listesi + bookmarks: Yer imleri domain_blocking: Alan adı engelleme listesi following: Takip edilenler listesi muting: Susturulanlar listesi @@ -1074,6 +1076,7 @@ tr: relationships: activity: Hesap etkinliği dormant: Uykuda + follow_selected_followers: Seçili takipçileri takip et followers: Takipçiler following: Takip edilenler invited: Davet edildi diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 733521760..0170185f1 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -11,28 +11,28 @@ vi: apps: Ứng dụng di động apps_platforms: Lướt Mastodon trên iOS, Android và các nền tảng khác browse_directory: Tìm những người có sở thích giống bạn - browse_local_posts: Xem thử những tút công khai gần đây + browse_local_posts: Xem những gì đang xảy ra browse_public_posts: Xem thử những tút công khai trên mạng Mastodon contact: Liên lạc contact_missing: Chưa thiết lập contact_unavailable: N/A - discover_users: Khám phá người dùng + discover_users: Thành viên documentation: Tài liệu federation_hint_html: Đăng ký tài khoản %{instance} là bạn có thể giao tiếp với mọi người trên bất kỳ máy chủ Mastodon nào và còn hơn thế nữa. - get_apps: Dùng thử ứng dụng di động + get_apps: Ứng dụng di động hosted_on: "%{domain} vận hành nhờ Mastodon" instance_actor_flash: 'Tài khoản này là một tác nhân ảo được sử dụng để đại diện cho chính máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên bị chặn trừ khi bạn muốn chặn toàn bộ máy chủ. ' learn_more: Tìm hiểu thêm privacy_policy: Chính sách bảo mật - see_whats_happening: Xem những gì đang xảy ra + see_whats_happening: Dòng thời gian server_stats: 'Cộng đồng:' source_code: Mã nguồn status_count_after: other: tút status_count_before: Nơi lưu giữ - tagline: Mạng xã hội liên hợp lớn nhất thế giới + tagline: Mạng xã hội liên hợp lớn nhất terms: Điều khoản dịch vụ unavailable_content: Giới hạn chung unavailable_content_description: @@ -58,7 +58,7 @@ vi: other: Người theo dõi following: Theo dõi joined: Đã tham gia %{date} - last_active: trực tuyến + last_active: online link_verified_on: Liên kết này đã được xác thực quyền sở hữu vào %{date} media: Bộ sưu tập moved_html: "%{name} đã dời sang %{new_profile_link}:" @@ -79,12 +79,12 @@ vi: bot: Tài khoản Bot group: Nhóm moderator: Kiểm duyệt viên - unavailable: Tài khoản không còn nữa + unavailable: Tài khoản bị đình chỉ unfollow: Ngưng theo dõi admin: account_actions: action: Thực hiện các hành động - title: Thực hiện kiểm duyệt với %{acct} + title: Áp đặt kiểm duyệt với %{acct} account_moderation_notes: create: Gửi tin nhắn kiểm duyệt created_msg: Gửi tin nhắn kiểm duyệt thành công! @@ -196,7 +196,7 @@ vi: subscribe: Đăng ký suspended: Đã vô hiệu hóa suspension_irreversible: Toàn bộ dữ liệu của người dùng này sẽ bị xóa hết. Bạn vẫn có thể ngừng vô hiệu hóa nhưng dữ liệu sẽ không thể phục hồi. - suspension_reversible_hint_html: Kể từ %{date}, tài khoản sẽ bị vô hiệu hóa và dữ liệu bị xóa hết. Trước thời hạn này, tài khoản vẫn có thể phục hồi dữ liệu. Nếu bạn vẫn muốn xóa dữ liệu của người này ngay lập tức, hãy tiếp tục. + suspension_reversible_hint_html: Dữ liệu của tài khoản này sẽ bị xóa sạch vào %{date}. Trước thời hạn này, tài khoản vẫn có thể phục hồi dữ liệu. Nếu bạn muốn xóa dữ liệu của người này ngay bây giờ, hãy tiếp tục. time_in_queue: Đang chờ cách đây %{time} title: Tài khoản unconfirmed_email: Email chưa được xác thực @@ -208,7 +208,7 @@ vi: unsuspended_msg: Đã kích hoạt lại tài khoản %{username} thành công username: Tài khoản view_domain: Xem mô tả tài khoản này - warn: Cảnh cáo + warn: Cấm upload web: Web whitelisted: Danh sách trắng action_logs: @@ -216,7 +216,7 @@ vi: assigned_to_self_report: Báo cáo từ đội ngũ change_email_user: Đổi email cho người dùng confirm_user: Xác nhận người dùng - create_account_warning: Tạo cảnh cáo + create_account_warning: Tạo cảnh cáo cài sẵn create_announcement: Tạo thông báo create_custom_emoji: Tạo Emoji mới create_domain_allow: Tạo danh sách máy chủ cho phép @@ -264,7 +264,7 @@ vi: create_email_domain_block: "%{name} chặn địa chỉ email %{target}" create_ip_block: "%{name} đã chặn IP %{target}" demote_user: "%{name} đã gỡ bỏ chức vụ %{target}" - destroy_announcement: "%{name} gỡ thông báo tới %{target}" + destroy_announcement: "%{name} gỡ thông báo %{target}" destroy_custom_emoji: "%{name} biểu tượng cảm xúc bị phá hủy %{target}" destroy_domain_allow: "%{name} đã xóa tên miền %{target} khỏi danh sách trắng" destroy_domain_block: "%{name} bỏ chặn máy chủ %{target}" @@ -366,7 +366,7 @@ vi: single_user_mode: Máy chủ chỉ có 1 người software: Phần mềm space: Dung lượng lưu trữ - title: Số liệu + title: Thống kê total_users: tổng số người dùng trends: Xu hướng week_interactions: tương tác trong tuần này @@ -389,7 +389,7 @@ vi: create: Tạo chặn hint: Chặn máy chủ sẽ không ngăn việc hiển thị tút của máy chủ đó trong cơ sở dữ liệu, nhưng sẽ khiến tự động áp dụng các phương pháp kiểm duyệt cụ thể trên các tài khoản đó. severity: - desc_html: "Ẩn sẽ làm cho bài đăng của tài khoản trở nên vô hình đối với bất kỳ ai không theo dõi họ. Vô hiệu hóa sẽ xóa tất cả nội dung, phương tiện và dữ liệu khác của tài khoản. Sử dụng Cấm upload nếu bạn chỉ muốn cấm tải lên ảnh và video." + desc_html: "Ẩn sẽ làm cho bài đăng của tài khoản trở nên vô hình đối với bất kỳ ai không theo dõi họ. Vô hiệu hóa sẽ xóa tất cả nội dung, phương tiện và dữ liệu khác của tài khoản. Dùng Cấm upload nếu bạn chỉ muốn cấm tải lên ảnh và video." noop: Không hoạt động silence: Ẩn suspend: Vô hiệu hóa @@ -470,9 +470,9 @@ vi: no_ip_block_selected: Bạn chưa chọn bất kỳ IP nào title: Những IP bị chặn pending_accounts: - title: Tài khoản đang chờ xét duyệt (%{count}) + title: Tài khoản đang chờ xem xét (%{count}) relationships: - title: Những mối liên hệ của %{acct} + title: Mối quan hệ của %{acct} relays: add_new: Thêm liên hợp mới delete: Loại bỏ @@ -513,7 +513,7 @@ vi: create_and_resolve: Xử lý kiểm duyệt create_and_unresolve: Mở lại kèm ghi chú mới delete: Xóa bỏ - placeholder: Mô tả vi phạm của người này, mức xử lý và những cập nhật liên quan khác... + placeholder: Mô tả vi phạm của người này, mức độ xử lý và những cập nhật liên quan khác... reopen: Mở lại báo cáo report: 'Báo cáo #%{id}' reported_account: Tài khoản bị báo cáo @@ -551,10 +551,10 @@ vi: enable_bootstrap_timeline_accounts: title: Gợi ý theo dõi cho người dùng mới hero: - desc_html: Hiển thị trên trang chủ. Kích cỡ tối thiểu 600x100px. Khi không được đặt, sử dụng hình thu nhỏ của máy chủ + desc_html: Hiển thị trên trang chủ. Kích cỡ tối thiểu 600x100px. Mặc định dùng hình thu nhỏ của máy chủ title: Hình ảnh giới thiệu mascot: - desc_html: Hiển thị trên nhiều trang. Kích cỡ tối thiểu 293 × 205px. Khi không được đặt, sử dụng linh vật mặc định Mastodon + desc_html: Hiển thị trên nhiều trang. Kích cỡ tối thiểu 293 × 205px. Mặc định dùng linh vật Mastodon title: Logo máy chủ peers_api_enabled: desc_html: Tên miền mà máy chủ này đã kết giao trong mạng liên hợp @@ -567,7 +567,7 @@ vi: title: Cho phép hiện danh sách thành viên registrations: closed_message: - desc_html: Hiển thị trên trang chủ khi đăng ký được đóng lại. Bạn có thể sử dụng thẻ HTML + desc_html: Hiển thị trên trang chủ khi đăng ký được đóng lại. Bạn có thể viết bằng thẻ HTML title: Thông điệp báo máy chủ đã ngừng đăng ký deletion: desc_html: Cho phép mọi người xóa tài khoản của họ @@ -588,23 +588,23 @@ vi: desc_html: Hiển thị huy hiệu nhân viên trên trang người dùng title: Hiển thị huy hiệu nhân viên site_description: - desc_html: Đoạn giới thiệu về API. Mô tả những gì làm cho máy chủ Mastodon này đặc biệt và bất cứ điều gì quan trọng khác. Bạn có thể sử dụng các thẻ HTML, đặc biệt là <a><em> . + desc_html: Nội dung giới thiệu về máy chủ. Mô tả những gì làm cho máy chủ Mastodon này đặc biệt và bất cứ điều gì quan trọng khác. Bạn có thể dùng các thẻ HTML, đặc biệt là <a><em>. title: Mô tả máy chủ site_description_extended: - desc_html: Bạn có thể tạo thêm các mục như quy định chung, hướng dẫn và những thứ khác liên quan tới máy chủ của bạn. Sử dụng thẻ HTML + desc_html: Bạn có thể tạo thêm các mục như quy định chung, hướng dẫn và những thứ khác liên quan tới máy chủ của bạn. Dùng thẻ HTML title: Thông tin mở rộng tùy chỉnh site_short_description: desc_html: Hiển thị trong thanh bên và thẻ meta. Mô tả Mastodon là gì và điều gì làm cho máy chủ này trở nên đặc biệt trong một đoạn văn duy nhất. title: Mô tả máy chủ ngắn site_terms: - desc_html: Bạn có thể viết chính sách bảo mật của riêng bạn, điều khoản dịch vụ hoặc pháp lý khác. Bạn có thể sử dụng thẻ HTML + desc_html: Bạn có thể viết điều khoản dịch vụ, quyền riêng tư hoặc các vấn đề pháp lý khác. Dùng thẻ HTML title: Điều khoản dịch vụ tùy chỉnh site_title: Tên máy chủ spam_check_enabled: desc_html: Mastodon có thể tự động báo cáo các tài khoản gửi tin nhắn không mong muốn lặp đi lặp lại. Có thể có dương tính giả. title: Tự động chống thư rác thumbnail: - desc_html: Được sử dụng để xem trước thông qua OpenGraph và API. Khuyến nghị 1200x630px + desc_html: Bản xem trước thông qua OpenGraph và API. Khuyến nghị 1200x630px title: Hình thu nhỏ của máy chủ timeline_preview: desc_html: Hiển thị dòng thời gian công khai trên trang đích và cho phép API truy cập vào dòng thời gian công khai mà không cần xác thực @@ -636,7 +636,7 @@ vi: tags: accounts_today: Sử dụng hôm nay accounts_week: Sử dụng trong tuần - breakdown: Thống kê số lượt sử dụng hôm nay + breakdown: Thống kê số lượt dùng hôm nay context: Bối cảnh directory: Có trên tiểu sử in_directory: "%{count} có trên tiểu sử" @@ -677,7 +677,7 @@ vi: remove: Bỏ liên kết bí danh appearance: advanced_web_interface: Bố cục - advanced_web_interface_hint: 'Giao diện nhiều cột cho phép bạn chuyển đổi 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. Rất thích hợp nếu bạn sử dụng màn hình rộng.' + advanced_web_interface_hint: 'Giao diện 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. Rất thích hợp nếu bạn đang dùng màn hình rộng.' animations_and_accessibility: Bảng tin confirmation_dialogs: Hộp thoại xác nhận discovery: Khám phá @@ -721,8 +721,8 @@ vi: link_to_webauth: Nhập khóa bảo mật từ thiết bị login: Đăng nhập logout: Đăng xuất - migrate_account: Sử dụng một tài khoản khác - migrate_account_html: Nếu bạn muốn bỏ tài khoản này để sử dụng một tài khoản khác, bạn có thể thiết lập nó ở đây. + migrate_account: Chuyển sang tài khoản khác + migrate_account_html: Nếu bạn muốn bỏ tài khoản này để dùng một tài khoản khác, bạn có thể thiết lập nó ở đây. or_log_in_with: Hoặc đăng nhập bằng providers: cas: CAS @@ -768,7 +768,7 @@ vi: invalid_signature: không phải là chữ ký số Ed25519 đúng date: formats: - default: "%b.%-m.%Y" + default: "%d.%m.%Y" with_month_name: "%B %d, %Y" datetime: distance_in_words: @@ -803,8 +803,8 @@ vi: username_unavailable: Tên người dùng của bạn sẽ không thể đăng ký mới directories: directory: Kết bạn - explanation: Khám phá người dùng dựa trên sở thích của họ - explore_mastodon: Khám phá %{title} + explanation: Tìm và kết bạn với những người cùng sở thích + explore_mastodon: Thành viên %{title} domain_validator: invalid_domain: không phải là một tên miền hợp lệ errors: @@ -821,7 +821,7 @@ vi: content: Chúng tôi xin lỗi, nhưng đã xảy ra sự cố. title: Múi giờ trên thiết bị không đúng '503': Trang không thể hiển thị do lỗi máy chủ tạm thời. - noscript_html: Để sử dụng ứng dụng web Mastodon, vui lòng bật JavaScript. Ngoài ra, hãy thử một trong những ứng dụng gốc của Mastodon cho hệ điều hành của bạn. + noscript_html: Để vào Mastodon bản web, vui lòng bật JavaScript. Ngoài ra, hãy thử dùng một ứng dụng lướt Mastodon cho thiết bị của bạn. existing_username_validator: not_found: không có tên người dùng này trên máy chủ not_found_multiple: không tìm thấy %{usernames} @@ -834,6 +834,7 @@ vi: request: Tải về dữ liệu của bạn size: Dung lượng blocks: Người bạn chặn + bookmarks: Đã lưu csv: CSV domain_blocks: Máy chủ bạn chặn lists: Danh sách @@ -843,7 +844,7 @@ vi: add_new: Thêm mới errors: limit: Bạn đã đạt tới số lượng hashtag tối đa - hint_html: "Hashtags thường dùng là gì? Chúng là những hashtag sẽ được hiển thị nổi bật trên trang cá nhân 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ể sử 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: "Hashtags thường dùng là gì? Chúng là những hashtag sẽ được hiển thị nổi bật trên trang cá nhân 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." filters: contexts: account: Trang cá nhân @@ -909,6 +910,7 @@ vi: success: Dữ liệu của bạn đã được tải lên thành công và hiện đang xử lý types: blocking: Danh sách chặn + bookmarks: Đã lưu domain_blocking: Danh sách máy chủ đã chặn following: Danh sách người theo dõi muting: Danh sách người dùng ẩn @@ -928,7 +930,7 @@ vi: generate: Tạo lời mời invited_by: 'Bạn đã được mời bởi:' max_uses: - other: "%{count} lần sử dụng" + other: "%{count} lần dùng" max_uses_prompt: Không giới hạn prompt: Tạo và chia sẻ liên kết với những người khác để cấp quyền truy cập vào máy chủ này table: @@ -968,8 +970,8 @@ vi: warning: backreference_required: Bạn cần phải đăng ký tài khoản mới ở máy chủ khác trước before: 'Trước khi tiếp tục, xin vui lòng đọc các lưu ý:' - cooldown: Trong thời gian chuyển tài khoản, bạn sẽ không thể sử dụng tài khoản này - disabled_account: Tài khoản này sẽ không thể tiếp tục sử dụng. Tuy nhiên, bạn có quyền truy cập để xuất dữ liệu cũng như kích hoạt lại. + cooldown: Bạn sẽ bị hạn chế chuyển sang tài khoản mới trong thời gian sắp tới + disabled_account: Tài khoản này sẽ không thể tiếp tục dùng nữa. Tuy nhiên, bạn có quyền truy cập để xuất dữ liệu cũng như kích hoạt lại. followers: Hành động này sẽ chuyển tất cả người theo dõi từ tài khoản hiện tại sang tài khoản mới only_redirect_html: Ngoài ra, bạn có thể đặt chuyển hướng trên trang cá nhân của bạn. other_data: Dữ liệu khác sẽ không được di chuyển tự động @@ -1062,9 +1064,10 @@ vi: relationships: activity: Hoạt động tài khoản dormant: Chưa tương tác - followers: Họ theo dõi bạn - following: Bạn theo dõi họ - invited: Người bạn mời đăng ký + follow_selected_followers: Theo dõi những người đã chọn + followers: Người theo dõi + following: Đang theo dõi + invited: Đã mời last_active: Hoạt động lần cuối most_recent: Mới nhất moved: Đã xóa @@ -1119,7 +1122,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 sử dụng để đăng nhập vào tài khoản Mastodon của bạn. + 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. ip: IP platforms: adobe_air: Adobe Air @@ -1142,7 +1145,7 @@ vi: account_settings: Cài đặt tài khoản aliases: Kết nối tài khoản appearance: Giao diện - authorized_apps: App đã sử dụng + authorized_apps: App đã dùng back: Quay lại Mastodon delete: Xóa tài khoản development: Lập trình @@ -1193,7 +1196,7 @@ vi: show_more: Đọc thêm show_newer: Mới hơn show_older: Cũ hơn - show_thread: Xem thảo luận + show_thread: Xem thêm sign_in_to_participate: Đăng nhập để trả lời chủ đề này title: '%{name}: "%{quote}"' visibilities: @@ -1210,9 +1213,54 @@ vi: tags: does_not_match_previous_name: không khớp với tên trước terms: - body_html: '

Chính sách bảo mật

Chúng tôi thu thập những thông tin gì?

  • Thông tin tài khoản cơ bản: Nếu bạn đăng ký trên máy chủ này, bạn phải cung cấp tên người dùng, địa chỉ email và mật khẩu. Bạn cũng có thể tùy chọn bổ sung tên hiển thị, mô tả, ảnh đại diện, ảnh bìa. Tên người dùng, tên hiển thị, mô tả, ảnh hồ sơ và ảnh bìa luôn được hiển thị công khai.
  • Tút, lượt theo dõi và thông tin công khai khác: Danh sách những người bạn theo dõi được liệt kê công khai, cũng tương tự như danh sách những người theo dõi bạn. Khi bạn gửi tin nhắn, ngày giờ và ứng dụng sử dụng được lưu trữ. Tin nhắn có thể chứa tệp đính kèm hình ảnh và video. Bài viết công khai và bài viết đóng sẽ hiển thị công khai. Khi bạn đăng một tút trên trang cá nhân của bạn, đó là thông tin công khai. Tút của bạn được gửi đến những người theo dõi của bạn, điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và sẽ có các bản sao được lưu trữ ở đó. Khi bạn xóa bài viết, bản sao từ những người theo dõi của bạn cũng bị xóa theo. Hành động chia sẻ hoặc thích một tút luôn luôn là công khai.
  • Tin nhắn và tút chỉ dành cho người theo dõi: Tất cả tút được lưu trữ và xử lý trên máy chủ. Các tút chỉ dành cho người theo dõi được gửi đến những người theo dõi và người dùng của bạn được gắn thẻ trong đó. Còn các tin nhắn chỉ được gửi cho người dùng được gắn thẻ trong đó. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi khuyến nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét các máy chủ của người theo dõi của bạn. Bạn có thể thiết lập phê duyệt và từ chối người theo dõi mới theo cách thủ công trong cài đặt. Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.
  • Địa chỉ IP và siêu dữ liệu khác: Khi bạn đăng nhập, chúng tôi ghi nhớ địa chỉ IP bạn đăng nhập cũng như tên trình duyệt của bạn. Tất cả các phiên đăng nhập sẽ để bạn xem xét và hủy bỏ trong phần cài đặt. Địa chỉ IP sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của những yêu cầu truy cập máy chủ của chúng tôi.

Chúng tôi sử dụng thông tin của bạn để làm gì?

Bất kỳ thông tin nào chúng tôi thu thập từ bạn là:

  • Để cung cấp các chức năng cốt lõi của Mastodon. Bạn chỉ có thể tương tác với nội dung của người khác và đăng nội dung của riêng bạn khi bạn đã đăng nhập. Ví dụ: bạn có thể theo dõi người khác để xem các tút của họ trong bảng tin cá nhân hóa của bạn.
  • Để hỗ trợ kiểm duyệt cộng đồng, ví dụ so sánh địa chỉ IP của bạn với các địa chỉ đã biết khác để xác định hacker hoặc vi phạm khác.
  • Địa chỉ email bạn cung cấp chỉ được sử dụng để gửi cho bạn thông tin, thông báo về những người khác tương tác với nội dung của bạn hoặc gửi tin nhắn cho bạn hoặc để trả lời các câu hỏi cũng như các yêu cầu khác từ chính bạn.

Chúng tôi bảo vệ thông tin của bạn như thế nào?

Chúng tôi thực hiện nhiều biện pháp bảo mật để duy trì sự an toàn khi bạn nhập, gửi hoặc truy cập thông tin cá nhân của bạn. Một vài trong số đó như là biện pháp kiểm soát phiên đăng nhập của bạn, lưu lượng giữa các ứng dụng và API của bạn, bảo mật bằng SSL và băm nhỏ mật khẩu nhờ thuật toán một chiều mạnh mẽ. Bạn có thể kích hoạt xác thực hai yếu tố để tiếp tục truy cập an toàn vào tài khoản của mình.


Chúng tôi lưu trữ dữ liệu như thế nào?

Chúng tôi sẽ thực hiện:

  • Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó được lưu giữ, không quá 90 ngày.
  • Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký không quá 12 tháng.

Bạn có thể tải xuống một bản sao nội dung lưu trữ của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và hảnh bìa.

Bạn có thể xóa tài khoản của mình bất cứ lúc nào.


Chúng tôi có sử dụng cookie không?

Có. Cookie là các tệp nhỏ mà một trang web hoặc nhà cung cấp dịch vụ internet chuyển vào ổ cứng máy tính của bạn thông qua trình duyệt Web (nếu bạn cho phép). Những cookie này cho phép trang web nhận ra trình duyệt của bạn và nếu bạn có tài khoản đã đăng ký, nó sẽ liên kết với tài khoản đã đăng ký của bạn.

Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tương lai.


Chúng tôi có để lộ bất cứ thông tin nào ra bên ngoài không?

Chúng tôi thề danh dự không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn khi chúng tôi tin rằng việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc của ai đó.

Nội dung công khai của bạn có thể được tải xuống bởi các máy chủ khác trong mạng liên kết. Các tút công khai và chỉ dành cho người theo dõi của bạn được gửi đến các máy chủ nơi người theo dõi của bạn thuộc về và tin nhắn được gửi đến máy chủ của người nhận, cho đến khi những người theo dõi hoặc người nhận đó chuyển sang một máy chủ khác.

Khi bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.


Giới hạn trẻ em sử dụng

Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, theo yêu cầu của GDPR (Quy định bảo vệ dữ liệu chung) thì không được sử dụng trang web này.

Nếu máy chủ này ở Hoa Kỳ: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 13 tuổi. Nếu bạn dưới 13 tuổi, theo yêu cầu của COPPA (Đạo luật bảo vệ quyền riêng tư trực tuyến của trẻ em) thì không được sử dụng trang web này.

Quy định pháp luật có thể khác nhau nếu máy chủ này ở khu vực địa lý khác.


Cập nhật thay đổi

Nếu có thay đổi chính sách bảo mật, chúng tôi sẽ đăng những thay đổi đó ở mục này.

Tài liệu này phát hành dưới hình thức CC-BY-SA. Nó được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.

Được hoàn thiện từ Discourse.

+ body_html: | +

Chính sách bảo mật

+

Chúng tôi thu thập những thông tin gì?

-' +
    +
  • Thông tin tài khoản cơ bản: Nếu bạn đăng ký trên máy chủ này, bạn phải cung cấp tên người dùng, địa chỉ email và mật khẩu. Bạn cũng có thể tùy chọn bổ sung tên hiển thị, mô tả, ảnh đại diện, ảnh bìa. Tên người dùng, tên hiển thị, mô tả, ảnh hồ sơ và ảnh bìa luôn được hiển thị công khai.
  • +
  • Tút, lượt theo dõi và thông tin công khai khác: Danh sách những người bạn theo dõi được liệt kê công khai, cũng tương tự như danh sách những người theo dõi bạn. Khi bạn gửi tin nhắn, ngày giờ và ứng dụng sử dụng được lưu trữ. Tin nhắn có thể chứa tệp đính kèm hình ảnh và video. Bài viết công khai và bài viết đóng sẽ hiển thị công khai. Khi bạn đăng một tút trên trang cá nhân của bạn, đó là thông tin công khai. Tút của bạn được gửi đến những người theo dõi của bạn, điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và sẽ có các bản sao được lưu trữ ở đó. Khi bạn xóa bài viết, bản sao từ những người theo dõi của bạn cũng bị xóa theo. Hành động chia sẻ hoặc thích một tút luôn luôn là công khai.
  • +
  • Tin nhắn và tút chỉ dành cho người theo dõi: Tất cả tút được lưu trữ và xử lý trên máy chủ. Các tút chỉ dành cho người theo dõi được gửi đến những người theo dõi và người dùng của bạn được gắn thẻ trong đó. Còn các tin nhắn chỉ được gửi cho người dùng được gắn thẻ trong đó. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi khuyến nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét các máy chủ của người theo dõi của bạn. Bạn có thể thiết lập phê duyệt và từ chối người theo dõi mới theo cách thủ công trong cài đặt. Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.
  • +
  • Địa chỉ IP và siêu dữ liệu khác: Khi bạn đăng nhập, chúng tôi ghi nhớ địa chỉ IP bạn đăng nhập cũng như tên trình duyệt của bạn. Tất cả các phiên đăng nhập sẽ để bạn xem xét và hủy bỏ trong phần cài đặt. Địa chỉ IP sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của những yêu cầu truy cập máy chủ của chúng tôi.
  • +

+

Chúng tôi sử dụng thông tin của bạn để làm gì?

+

Bất kỳ thông tin nào chúng tôi thu thập từ bạn là:

+
    +
  • Để cung cấp các chức năng cốt lõi của Mastodon. Bạn chỉ có thể tương tác với nội dung của người khác và đăng nội dung của riêng bạn khi bạn đã đăng nhập. Ví dụ: bạn có thể theo dõi người khác để xem các tút của họ trong bảng tin cá nhân hóa của bạn.
  • +
  • Để hỗ trợ kiểm duyệt cộng đồng, ví dụ so sánh địa chỉ IP của bạn với các địa chỉ đã biết khác để xác định hacker hoặc vi phạm khác.
  • +
  • Địa chỉ email bạn cung cấp chỉ được sử dụng để gửi cho bạn thông tin, thông báo về những người khác tương tác với nội dung của bạn hoặc gửi tin nhắn cho bạn hoặc để trả lời các câu hỏi cũng như các yêu cầu khác từ chính bạn.
  • +
+
+

Chúng tôi bảo vệ thông tin của bạn như thế nào?

+

Chúng tôi thực hiện nhiều biện pháp bảo mật để duy trì sự an toàn khi bạn nhập, gửi hoặc truy cập thông tin cá nhân của bạn. Một vài trong số đó như là biện pháp kiểm soát phiên đăng nhập của bạn, lưu lượng giữa các ứng dụng và API của bạn, bảo mật bằng SSL và băm nhỏ mật khẩu nhờ thuật toán một chiều mạnh mẽ. Bạn có thể kích hoạt xác thực hai yếu tố để tiếp tục truy cập an toàn vào tài khoản của mình.

+
+

Chúng tôi lưu trữ dữ liệu như thế nào?

+

Chúng tôi sẽ thực hiện:

+
    +
  • Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó được lưu giữ, không quá 90 ngày.
  • +
  • Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký không quá 12 tháng.
  • +
+

Bạn có thể tải xuống một bản sao nội dung lưu trữ của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và hảnh bìa.

+

Bạn có thể xóa tài khoản của mình bất cứ lúc nào.

+
+

Chúng tôi có sử dụng cookie không?

+

Có. Cookie là các tệp nhỏ mà một trang web hoặc nhà cung cấp dịch vụ internet chuyển vào ổ cứng máy tính của bạn thông qua trình duyệt Web (nếu bạn cho phép). Những cookie này cho phép trang web nhận ra trình duyệt của bạn và nếu bạn có tài khoản đã đăng ký, nó sẽ liên kết với tài khoản đã đăng ký của bạn.

+

Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tương lai.

+
+

Chúng tôi có tiết lộ bất cứ thông tin nào ra ngoài không?

+

Chúng tôi thề danh dự không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn khi chúng tôi tin rằng việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc của ai đó.

+

Nội dung công khai của bạn có thể được tải xuống bởi các máy chủ khác trong mạng liên kết. Các tút công khai và chỉ dành cho người theo dõi của bạn được gửi đến các máy chủ nơi người theo dõi của bạn thuộc về và tin nhắn được gửi đến máy chủ của người nhận, cho đến khi những người theo dõi hoặc người nhận đó chuyển sang một máy chủ khác.

+

Khi bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.

+
+

Cấm trẻ em sử dụng

+

Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, theo yêu cầu của GDPR (Quy định bảo vệ dữ liệu chung) thì không được sử dụng trang web này.

+

Nếu máy chủ này ở Hoa Kỳ: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 13 tuổi. Nếu bạn dưới 13 tuổi, theo yêu cầu của COPPA (Đạo luật bảo vệ quyền riêng tư trực tuyến của trẻ em) thì không được sử dụng trang web này.

+

Quy định pháp luật có thể khác biệt nếu máy chủ này ở khu vực địa lý khác.

+
+

Cập nhật thay đổi

+

Nếu có thay đổi chính sách bảo mật, chúng tôi sẽ đăng những thay đổi đó ở mục này.

+

Tài liệu này phát hành dưới hình thức CC-BY-SA. Nó được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.

+

Biên tập từ Discourse.

title: "%{instance} Điều khoản dịch vụ và chính sách bảo mật" themes: contrast: Mastodon (Độ tương phản cao) @@ -1235,7 +1283,7 @@ vi: otp: Ứng dụng xác thực recovery_codes: Mã phục hồi dự phòng recovery_codes_regenerated: Mã khôi phục được phục hồi thành công - recovery_instructions_html: Nếu bạn bị mất điện thoại, hãy sử dụng một trong các mã khôi phục bên dưới để lấy lại quyền truy cập vào tài khoản của mình. Giữ mã khôi phục an toàn. Ví dụ, bạn có thể in chúng ra giấy. + recovery_instructions_html: Nếu bạn bị mất điện thoại, hãy dùng một trong các mã khôi phục bên dưới để lấy lại quyền truy cập vào tài khoản của mình. Giữ mã khôi phục an toàn. Ví dụ, bạn có thể in chúng ra giấy. webauthn: Khóa bảo mật user_mailer: backup_ready: @@ -1252,7 +1300,7 @@ vi: explanation: disable: Bạn bị cấm đăng nhập tài khoản. Tuy nhiên, trang cá nhân và dữ liệu của bạn vẫn sẽ được giữ nguyên. sensitive: Ảnh và video tải lên của bạn sẽ bị đánh dấu là nhạy cảm. - silence: Bạn vẫn có thể sử dụng tài khoản của bạn. Tuy nhiên, chỉ có những người đang theo dõi bạn mới có thể thấy tút của bạn. Bạn cũng sẽ bị loại khỏi danh sách của một số người. Những người khác vẫn có thể bắt đầu theo dõi bạn bình thường. + silence: Bạn vẫn có thể dùng tài khoản của bạn. Tuy nhiên, chỉ có những người đang theo dõi bạn mới có thể thấy tút của bạn. Bạn sẽ bị loại khỏi danh sách của một số người. Những người mới khác vẫn có thể theo dõi bạn bình thường. suspend: Tài khoản của bạn đã bị vô hiệu hóa. Tất cả tút và tập tin mà bạn đã tải lên sẽ không thể truy cập được nữa. Bạn vẫn có thể đăng nhập để yêu cầu tải về bản sao dữ liệu của bạn. Tuy nhiên, chúng tôi sẽ giữ lại một vài dữ liệu để ngăn ngừa bạn trốn tránh trách nhiệm. get_in_touch: Bạn có thể trả lời e-mail này để liên hệ với đội ngũ của %{instance}. review_server_policies: Xem lại quy tắc của máy chủ @@ -1278,7 +1326,7 @@ vi: full_handle: Tên đầy đủ của bạn full_handle_hint: Đây cũng là địa chỉ được dùng để tương tác với tất cả mọi người. review_preferences_action: Tùy chỉnh giao diện - review_preferences_step: Tùy chỉnh mọi thứ! Chẳng hạn như chọn loại email nào bạn muốn nhận hoặc trạng thái tút mà bạn muốn sử dụng mặc định. Hãy tắt tự động phát GIF nếu bạn hay bị chóng mặt. + review_preferences_step: Tùy chỉnh mọi thứ! Chẳng hạn như chọn loại email nào bạn muốn nhận hoặc trạng thái đăng tút mặc định mà bạn muốn dùng. Hãy tắt tự động phát GIF nếu bạn dễ bị chóng mặt. subject: Chào mừng đến với Mastodon tip_federated_timeline: Mạng liên hợp là một dạng "liên hợp quốc" của Mastodon. Hiểu một cách đơn giản, nó là những người bạn đã theo dõi từ các máy chủ khác. tip_following: Theo mặc định, bạn sẽ theo dõi (các) quản trị viên máy chủ của bạn. Để tìm những người thú vị hơn, hãy xem qua cộng đồng và thế giới. @@ -1308,7 +1356,7 @@ vi: success: Đã thêm khóa bảo mật mới thành công. delete: Xóa delete_confirmation: Bạn có chắc chắn muốn xóa khóa bảo mật này? - description_html: Nếu bạn kích hoạt khóa bảo mật, khi đăng nhập bạn sẽ cần sử dụng một trong những khóa bảo mật của bạn. + description_html: Nếu bạn kích hoạt khóa bảo mật, bạn sẽ cần dùng một trong những khóa bảo mật đó mỗi khi đăng nhập. destroy: error: Có vấn đề khi xóa khóa bảo mật. Xin thử lại. success: Đã xóa khóa bảo mật thành công. @@ -1316,5 +1364,5 @@ vi: nickname_hint: Nhập tên mới cho khóa bảo mật của bạn not_enabled: Bạn chưa kích hoạt WebAuthn not_supported: Trình duyệt của bạn không hỗ trợ khóa bảo mật - otp_required: Để sử dụng khóa bảo mật, hãy kích hoạt xác thực hai bước trước. + otp_required: Để dùng khóa bảo mật, trước tiên hãy kích hoạt xác thực hai bước. registered_on: Đăng ký vào %{date} diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml index ceb475b91..8e4867b2f 100644 --- a/config/locales/zgh.yml +++ b/config/locales/zgh.yml @@ -2,6 +2,9 @@ zgh: about: about_this: ⵖⴼ + api: API + contact: ⴰⵎⵢⴰⵡⴰⴹ + learn_more: ⵙⵙⵏ ⵓⴳⴳⴰⵔ unavailable_content_description: domain: ⴰⵎⴰⴽⴽⴰⵢ what_is_mastodon: ⵎⴰ'ⵢⴷ ⵉⴳⴰⵏ ⵎⴰⵙⵜⵔⴷⵓⵎ? @@ -9,6 +12,7 @@ zgh: follow: ⴹⴼⵕ never_active: ⵓⵙⴰⵔ roles: + bot: ⴰⴱⵓⵜ group: ⵜⴰⵔⴰⴱⴱⵓⵜ admin: account_moderation_notes: @@ -19,23 +23,36 @@ zgh: submit: ⵙⵏⴼⵍ ⵉⵎⴰⵢⵍ confirm: ⵙⵏⵜⵎ delete: ⴽⴽⵙ ⵉⴼⵙⴽⴰ + deleted: ⵉⵜⵜⵡⴰⴽⴽⵙ + domain: ⵉⴳⵔ edit: ⵙⵏⴼⵍ email: ⵉⵎⴰⵢⵍ + email_status: ⴰⴷⴷⴰⴷ ⵏ ⵢⵉⵍⴰⵢⵍ location: all: ⵎⴰⵕⵕⴰ + local: ⴰⴷⵖⴰⵔⴰⵏ moderation: all: ⵎⴰⵕⵕⴰ public: ⴰⴳⴷⵓⴷⴰⵏ reject: ⴰⴳⵢ + roles: + user: ⵓⵏⵙⵙⵓⵎⵔⵙ title: ⵉⵎⵉⴹⴰⵏⵏ web: ⵡⵉⴱ + action_logs: + action_types: + update_status: ⵙⴷⵖⵉ ⴰⴷⴷⴰⴷ announcements: live: ⵓⵙⵔⵉⴷ custom_emojis: + by_domain: ⵉⴳⵔ copy: ⵙⵏⵖⵍ delete: ⴽⴽⵙ emoji: ⵉⵎⵓⵊⵉ + domain_blocks: + domain: ⵉⴳⵔ email_domain_blocks: + add_new: ⵔⵏⵓ ⴰⵎⴰⵢⵏⵓ delete: ⴽⴽⵙ instances: moderation: @@ -123,4 +140,5 @@ zgh: settings: account: ⴰⵎⵉⴹⴰⵏ account_settings: ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵎⵉⴹⴰⵏ + notifications: ⵜⵉⵏⵖⵎⵉⵙⵉⵏ profile: ⵉⴼⵔⵙ diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index c400f4564..f93d6c03f 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -834,6 +834,7 @@ zh-CN: request: 请求你的存档 size: 大小 blocks: 屏蔽的用户 + bookmarks: 书签 csv: CSV domain_blocks: 域名屏蔽 lists: 列表 @@ -909,6 +910,7 @@ zh-CN: success: 数据上传成功,正在处理中 types: blocking: 屏蔽列表 + bookmarks: 书签 domain_blocking: 域名屏蔽列表 following: 关注列表 muting: 隐藏列表 @@ -1062,6 +1064,7 @@ zh-CN: relationships: activity: 帐号活动 dormant: 休眠 + follow_selected_followers: 关注选中的关注者 followers: 关注者 following: 正在关注 invited: 已邀请 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index edab3c734..bb0cc716d 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -7,6 +7,7 @@ zh-HK: active_count_after: 活躍 active_footnote: 每月活躍使用者 (MAU) administered_by: 管理者: + api: API apps: 行動應用程式 apps_platforms: 在 iOS、Android 和其他平台使用 Mastodon browse_directory: 依興趣瀏覽個人資料目錄和過濾器 @@ -158,6 +159,8 @@ zh-HK: search: 搜索 search_same_email_domain: 其他有同個電子郵件網域的使用者 search_same_ip: 其他有同個 IP 的使用者 + sensitive: 敏感内容 + sensitized: 已標記為敏感內容 shared_inbox_url: 公共收件箱(Shared Inbox)URL show: created_reports: 此用戶所提舉報的紀錄 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 95daeb86f..0f761a03e 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -625,6 +625,8 @@ zh-TW: lists: 列表 mutes: 您靜音的使用者 storage: 儲存空間大小 + featured_tags: + hint_html: "推薦標籤是什麼? 這些標籤將顯示於您的公開個人檔案頁,訪客可以藉此閱覽您標示了這些標籤的嘟文,拿來展示創意作品或者長期更新的專案很好用唷!" filters: index: empty: 您沒有過濾器。 @@ -767,6 +769,7 @@ zh-TW: development: 開發 edit_profile: 編輯使用者資訊 export: 匯出 + featured_tags: 推薦標籤 import: 匯入 migrate: 帳戶搬遷 notifications: 通知 @@ -849,3 +852,6 @@ zh-TW: otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫 seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼與電子郵件。 signed_in_as: 目前登入的帳戶: + verification: + explanation_html: 您在 Mastodon 個人資料頁上所列出的連結,可以用此方式驗證您確實掌控該連結網頁的內容。您可以在連結的網頁上加上一個連回 Mastodon 個人資料頁的連結,該連結的原始碼 必須包含rel="me"屬性。連結的顯示文字可自由發揮,以下為範例: + verification: 驗證連結 From 1e89e2ed988d2103ecd46e06476d863cb40c57c7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 27 Nov 2020 03:24:11 +0100 Subject: [PATCH 02/83] Change media modals look in web UI (#15217) - Change overlay background to match color of viewed image - Add interactive reply/boost/favourite buttons to footer of modal - Change ugly "View context" link to button among the action bar --- .../mastodon/components/modal_root.js | 18 +- app/javascript/mastodon/components/status.js | 18 +- .../mastodon/containers/status_container.js | 8 +- .../features/account_gallery/index.js | 9 +- .../picture_in_picture/components/footer.js | 28 ++- .../mastodon/features/status/index.js | 10 +- .../features/ui/components/media_modal.js | 174 +++++++++++++++--- .../features/ui/components/modal_root.js | 13 +- .../features/ui/components/video_modal.js | 20 +- .../mastodon/features/video/index.js | 5 +- app/javascript/styles/mastodon/boost.scss | 40 ++-- .../styles/mastodon/components.scss | 136 +++++++++----- package.json | 1 + yarn.lock | 5 + 14 files changed, 339 insertions(+), 146 deletions(-) diff --git a/app/javascript/mastodon/components/modal_root.js b/app/javascript/mastodon/components/modal_root.js index fe573ffda..9bfc0e49f 100644 --- a/app/javascript/mastodon/components/modal_root.js +++ b/app/javascript/mastodon/components/modal_root.js @@ -1,12 +1,18 @@ import React from 'react'; import PropTypes from 'prop-types'; import 'wicg-inert'; +import { normal } from 'color-blend'; export default class ModalRoot extends React.PureComponent { static propTypes = { children: PropTypes.node, onClose: PropTypes.func.isRequired, + backgroundColor: PropTypes.shape({ + r: PropTypes.number, + g: PropTypes.number, + b: PropTypes.number, + }), }; activeElement = this.props.children ? document.activeElement : null; @@ -62,9 +68,7 @@ export default class ModalRoot extends React.PureComponent { Promise.resolve().then(() => { this.activeElement.focus({ preventScroll: true }); this.activeElement = null; - }).catch((error) => { - console.error(error); - }); + }).catch(console.error); } } @@ -91,10 +95,16 @@ export default class ModalRoot extends React.PureComponent { ); } + let backgroundColor = null; + + if (this.props.backgroundColor) { + backgroundColor = normal({ ...this.props.backgroundColor, a: 1 }, { r: 0, g: 0, b: 0, a: 0.3 }); + } + return (
-
+
{children}
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 8f288bdf9..27d96e588 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -193,22 +193,24 @@ class Status extends ImmutablePureComponent { } handleOpenVideo = (media, options) => { - this.props.onOpenVideo(media, options); + this.props.onOpenVideo(this._properStatus().get('id'), media, options); + } + + handleOpenMedia = (media, index) => { + this.props.onOpenMedia(this._properStatus().get('id'), media, index); } handleHotkeyOpenMedia = e => { const { onOpenMedia, onOpenVideo } = this.props; - const status = this._properStatus(); + const statusId = this._properStatus().get('id'); e.preventDefault(); if (status.get('media_attachments').size > 0) { - if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { - // TODO: toggle play/paused? - } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') { - onOpenVideo(status.getIn(['media_attachments', 0]), { startTime: 0 }); + if (status.getIn(['media_attachments', 0, 'type']) === 'video') { + onOpenVideo(statusId, status.getIn(['media_attachments', 0]), { startTime: 0 }); } else { - onOpenMedia(status.get('media_attachments'), 0); + onOpenMedia(statusId, status.get('media_attachments'), 0); } } } @@ -416,7 +418,7 @@ class Status extends ImmutablePureComponent { media={status.get('media_attachments')} sensitive={status.get('sensitive')} height={110} - onOpenMedia={this.props.onOpenMedia} + onOpenMedia={this.handleOpenMedia} cacheWidth={this.props.cacheMediaWidth} defaultWidth={this.props.cachedMediaWidth} visible={this.state.showMedia} diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js index fe81981a7..ef520b96a 100644 --- a/app/javascript/mastodon/containers/status_container.js +++ b/app/javascript/mastodon/containers/status_container.js @@ -152,12 +152,12 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ dispatch(mentionCompose(account, router)); }, - onOpenMedia (media, index) { - dispatch(openModal('MEDIA', { media, index })); + onOpenMedia (statusId, media, index) { + dispatch(openModal('MEDIA', { statusId, media, index })); }, - onOpenVideo (media, options) { - dispatch(openModal('VIDEO', { media, options })); + onOpenVideo (statusId, media, options) { + dispatch(openModal('VIDEO', { statusId, media, options })); }, onBlock (status) { diff --git a/app/javascript/mastodon/features/account_gallery/index.js b/app/javascript/mastodon/features/account_gallery/index.js index e5caec0bc..597ca8af6 100644 --- a/app/javascript/mastodon/features/account_gallery/index.js +++ b/app/javascript/mastodon/features/account_gallery/index.js @@ -105,15 +105,18 @@ class AccountGallery extends ImmutablePureComponent { } handleOpenMedia = attachment => { + const { dispatch } = this.props; + const statusId = attachment.getIn(['status', 'id']); + if (attachment.get('type') === 'video') { - this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status'), options: { autoPlay: true } })); + dispatch(openModal('VIDEO', { media: attachment, statusId, options: { autoPlay: true } })); } else if (attachment.get('type') === 'audio') { - this.props.dispatch(openModal('AUDIO', { media: attachment, status: attachment.get('status'), options: { autoPlay: true } })); + dispatch(openModal('AUDIO', { media: attachment, statusId, options: { autoPlay: true } })); } else { const media = attachment.getIn(['status', 'media_attachments']); const index = media.findIndex(x => x.get('id') === attachment.get('id')); - this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status') })); + dispatch(openModal('MEDIA', { media, index, statusId })); } } diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.js b/app/javascript/mastodon/features/picture_in_picture/components/footer.js index 086cda954..1b1ec6d54 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/footer.js +++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.js @@ -22,6 +22,7 @@ const messages = defineMessages({ favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, 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?' }, + open: { id: 'status.open', defaultMessage: 'Expand this status' }, }); const makeMapStateToProps = () => { @@ -49,11 +50,19 @@ class Footer extends ImmutablePureComponent { intl: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, askReplyConfirmation: PropTypes.bool, + withOpenButton: PropTypes.bool, + onClose: PropTypes.func, }; _performReply = () => { - const { dispatch, status } = this.props; - dispatch(replyCompose(status, this.context.router.history)); + const { dispatch, status, onClose } = this.props; + const { router } = this.context; + + if (onClose) { + onClose(); + } + + dispatch(replyCompose(status, router.history)); }; handleReplyClick = () => { @@ -97,8 +106,20 @@ class Footer extends ImmutablePureComponent { } }; + handleOpenClick = e => { + const { router } = this.context; + + if (e.button !== 0 || !router) { + return; + } + + const { status } = this.props; + + router.history.push(`/statuses/${status.get('id')}`); + } + render () { - const { status, intl } = this.props; + const { status, intl, withOpenButton } = this.props; const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')); const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private'; @@ -130,6 +151,7 @@ class Footer extends ImmutablePureComponent { + {withOpenButton && }
); } diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index cf3a5fa44..c5e7ba776 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -276,22 +276,20 @@ class Status extends ImmutablePureComponent { } handleOpenMedia = (media, index) => { - this.props.dispatch(openModal('MEDIA', { media, index })); + this.props.dispatch(openModal('MEDIA', { statusId: this.props.status.get('id'), media, index })); } handleOpenVideo = (media, options) => { - this.props.dispatch(openModal('VIDEO', { media, options })); + this.props.dispatch(openModal('VIDEO', { statusId: this.props.status.get('id'), media, options })); } handleHotkeyOpenMedia = e => { - const status = this._properStatus(); + const { status } = this.props; e.preventDefault(); if (status.get('media_attachments').size > 0) { - if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { - // TODO: toggle play/paused? - } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') { + 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); diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js index d18f26b4e..bcec19a49 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.js +++ b/app/javascript/mastodon/features/ui/components/media_modal.js @@ -4,13 +4,14 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Video from 'mastodon/features/video'; import classNames from 'classnames'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, injectIntl } from 'react-intl'; import IconButton from 'mastodon/components/icon_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; import ImageLoader from './image_loader'; import Icon from 'mastodon/components/icon'; import GIFV from 'mastodon/components/gifv'; import { disableSwiping } from 'mastodon/initial_state'; +import Footer from 'mastodon/features/picture_in_picture/components/footer'; const messages = defineMessages({ close: { id: 'lightbox.close', defaultMessage: 'Close' }, @@ -20,15 +21,121 @@ const messages = defineMessages({ export const previewState = 'previewMediaModal'; +const digitCharacters = [ + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + '#', + '$', + '%', + '*', + '+', + ',', + '-', + '.', + ':', + ';', + '=', + '?', + '@', + '[', + ']', + '^', + '_', + '{', + '|', + '}', + '~', +]; + +const decode83 = (str) => { + let value = 0; + let c, digit; + + for (let i = 0; i < str.length; i++) { + c = str[i]; + digit = digitCharacters.indexOf(c); + value = value * 83 + digit; + } + + return value; +}; + +const decodeRGB = int => ({ + r: Math.max(0, (int >> 16)), + g: Math.max(0, (int >> 8) & 255), + b: Math.max(0, (int & 255)), +}); + export default @injectIntl class MediaModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.list.isRequired, - status: ImmutablePropTypes.map, + statusId: PropTypes.string, index: PropTypes.number.isRequired, onClose: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, + onChangeBackgroundColor: PropTypes.func.isRequired, }; static contextTypes = { @@ -67,6 +174,7 @@ class MediaModal extends ImmutablePureComponent { handleChangeIndex = (e) => { const index = Number(e.currentTarget.getAttribute('data-index')); + this.setState({ index: index % this.props.media.size, zoomButtonHidden: true, @@ -100,6 +208,22 @@ class MediaModal extends ImmutablePureComponent { this.props.onClose(); }); } + + this._sendBackgroundColor(); + } + + componentDidUpdate (prevProps, prevState) { + if (prevState.index !== this.state.index) { + this._sendBackgroundColor(); + } + } + + _sendBackgroundColor () { + const { media, onChangeBackgroundColor } = this.props; + const index = this.getIndex(); + const backgroundColor = decodeRGB(decode83(media.getIn([index, 'blurhash']).slice(2, 6))); + + onChangeBackgroundColor(backgroundColor); } componentWillUnmount () { @@ -112,6 +236,8 @@ class MediaModal extends ImmutablePureComponent { this.context.router.history.goBack(); } } + + this.props.onChangeBackgroundColor(null); } getIndex () { @@ -127,30 +253,19 @@ class MediaModal extends ImmutablePureComponent { handleStatusClick = e => { if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { e.preventDefault(); - this.context.router.history.push(`/statuses/${this.props.status.get('id')}`); + this.context.router.history.push(`/statuses/${this.props.statusId}`); } } render () { - const { media, status, intl, onClose } = this.props; + const { media, statusId, intl, onClose } = this.props; const { navigationHidden } = this.state; const index = this.getIndex(); - let pagination = []; const leftNav = media.size > 1 && ; const rightNav = media.size > 1 && ; - if (media.size > 1) { - pagination = media.map((item, i) => { - const classes = ['media-modal__button']; - if (i === index) { - classes.push('media-modal__button--active'); - } - return (
  • ); - }); - } - const content = media.map((image) => { const width = image.getIn(['meta', 'original', 'width']) || null; const height = image.getIn(['meta', 'original', 'height']) || null; @@ -218,13 +333,19 @@ class MediaModal extends ImmutablePureComponent { 'media-modal__navigation--hidden': navigationHidden, }); + let pagination; + + if (media.size > 1) { + pagination = media.map((item, i) => ( + + )); + } + return (
    -
    +
    1 })}> - -
    - )} - -
      - {pagination} -
    +
    + {pagination &&
      {pagination}
    } + {statusId &&
    } +
    ); diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js index 5cf70a0cc..3403830e4 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.js +++ b/app/javascript/mastodon/features/ui/components/modal_root.js @@ -45,6 +45,10 @@ export default class ModalRoot extends React.PureComponent { onClose: PropTypes.func.isRequired, }; + state = { + backgroundColor: null, + }; + getSnapshotBeforeUpdate () { return { visible: !!this.props.type }; } @@ -59,6 +63,10 @@ export default class ModalRoot extends React.PureComponent { } } + setBackgroundColor = color => { + this.setState({ backgroundColor: color }); + } + renderLoading = modalId => () => { return ['MEDIA', 'VIDEO', 'BOOST', 'CONFIRM', 'ACTIONS'].indexOf(modalId) === -1 ? : null; } @@ -71,13 +79,14 @@ export default class ModalRoot extends React.PureComponent { render () { const { type, props, onClose } = this.props; + const { backgroundColor } = this.state; const visible = !!type; return ( - + {visible && ( - {(SpecificComponent) => } + {(SpecificComponent) => } )} diff --git a/app/javascript/mastodon/features/ui/components/video_modal.js b/app/javascript/mastodon/features/ui/components/video_modal.js index cce6756c3..2c3c026c8 100644 --- a/app/javascript/mastodon/features/ui/components/video_modal.js +++ b/app/javascript/mastodon/features/ui/components/video_modal.js @@ -3,9 +3,6 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Video from 'mastodon/features/video'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { FormattedMessage } from 'react-intl'; -import classNames from 'classnames'; -import Icon from 'mastodon/components/icon'; export const previewState = 'previewVideoModal'; @@ -13,7 +10,7 @@ export default class VideoModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, - status: ImmutablePropTypes.map, + statusId: PropTypes.string, options: PropTypes.shape({ startTime: PropTypes.number, autoPlay: PropTypes.bool, @@ -48,15 +45,8 @@ export default class VideoModal extends ImmutablePureComponent { } } - handleStatusClick = e => { - if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { - e.preventDefault(); - this.context.router.history.push(`/statuses/${this.props.status.get('id')}`); - } - } - render () { - const { media, status, onClose } = this.props; + const { media, onClose } = this.props; const options = this.props.options || {}; return ( @@ -75,12 +65,6 @@ export default class VideoModal extends ImmutablePureComponent { alt={media.get('description')} />
    - - {status && ( -
    - -
    - )} ); } diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js index 83e638ff6..46eaebd9b 100644 --- a/app/javascript/mastodon/features/video/index.js +++ b/app/javascript/mastodon/features/video/index.js @@ -118,7 +118,6 @@ class Video extends React.PureComponent { deployPictureInPicture: PropTypes.func, intl: PropTypes.object.isRequired, blurhash: PropTypes.string, - link: PropTypes.node, autoPlay: PropTypes.bool, volume: PropTypes.number, muted: PropTypes.bool, @@ -534,7 +533,7 @@ class Video extends React.PureComponent { } render () { - const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive, link, editable, blurhash } = this.props; + const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive, editable, blurhash } = this.props; const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; const progress = Math.min((currentTime / duration) * 100, 100); const playerStyle = {}; @@ -648,8 +647,6 @@ class Video extends React.PureComponent { {formatTime(Math.floor(duration))} )} - - {link && {link}}
    diff --git a/app/javascript/styles/mastodon/boost.scss b/app/javascript/styles/mastodon/boost.scss index f94c0aa46..fb1451cb2 100644 --- a/app/javascript/styles/mastodon/boost.scss +++ b/app/javascript/styles/mastodon/boost.scss @@ -1,22 +1,32 @@ -button.icon-button i.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); +button.icon-button { + i.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } - &:hover { + &:hover i.fa-retweet { background-image: url("data:image/svg+xml;utf8,"); } -} -button.icon-button.reblogPrivate i.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); + &.reblogPrivate { + i.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } - &:hover { - background-image: url("data:image/svg+xml;utf8,"); - } -} - -button.icon-button.disabled i.fa-retweet { - &, - &:hover { - background-image: url("data:image/svg+xml;utf8,"); + &:hover i.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } + } + + &.disabled { + i.fa-retweet, + &:hover i.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } + } + + .media-modal__overlay .picture-in-picture__footer & { + i.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } } } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index ab2a5ac61..2fc1c12de 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1652,11 +1652,11 @@ a.account__display-name { } } -.star-icon.active { +.icon-button.star-icon.active { color: $gold-star; } -.bookmark-icon.active { +.icon-button.bookmark-icon.active { color: $red-bookmark; } @@ -3007,7 +3007,6 @@ button.icon-button i.fa-retweet { &::before { display: none !important; } - } button.icon-button.active i.fa-retweet { @@ -4487,16 +4486,19 @@ a.status-card.compact:hover { height: 100%; position: relative; - .extended-video-player { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; + &__close, + &__zoom-button { + color: rgba($white, 0.7); - video { - max-width: $media-modal-media-max-width; - max-height: $media-modal-media-max-height; + &:hover, + &:focus, + &:active { + color: $white; + background-color: rgba($white, 0.15); + } + + &:focus { + background-color: rgba($white, 0.3); } } } @@ -4533,10 +4535,10 @@ a.status-card.compact:hover { } .media-modal__nav { - background: rgba($base-overlay-background, 0.5); + background: transparent; box-sizing: border-box; border: 0; - color: $primary-text-color; + color: rgba($primary-text-color, 0.7); cursor: pointer; display: flex; align-items: center; @@ -4547,6 +4549,12 @@ a.status-card.compact:hover { position: absolute; top: 0; bottom: 0; + + &:hover, + &:focus, + &:active { + color: $primary-text-color; + } } .media-modal__nav--left { @@ -4557,58 +4565,86 @@ a.status-card.compact:hover { right: 0; } -.media-modal__pagination { - width: 100%; - text-align: center; +.media-modal__overlay { + max-width: 600px; position: absolute; left: 0; - bottom: 20px; - pointer-events: none; -} + right: 0; + bottom: 0; + margin: 0 auto; -.media-modal__meta { - text-align: center; - position: absolute; - left: 0; - bottom: 20px; - width: 100%; - pointer-events: none; + .picture-in-picture__footer { + border-radius: 0; + background: transparent; + padding: 20px 0; - &--shifted { - bottom: 62px; - } + .icon-button { + color: $white; - a { - pointer-events: auto; - text-decoration: none; - font-weight: 500; - color: $ui-secondary-color; + &:hover, + &:focus, + &:active { + color: $white; + background-color: rgba($white, 0.15); + } - &:hover, - &:focus, - &:active { - text-decoration: underline; + &:focus { + background-color: rgba($white, 0.3); + } + + &.active { + color: $highlight-text-color; + + &:hover, + &:focus, + &:active { + background: rgba($highlight-text-color, 0.15); + } + + &:focus { + background: rgba($highlight-text-color, 0.3); + } + } + + &.star-icon.active { + color: $gold-star; + + &:hover, + &:focus, + &:active { + background: rgba($gold-star, 0.15); + } + + &:focus { + background: rgba($gold-star, 0.3); + } + } } } } -.media-modal__page-dot { - display: inline-block; +.media-modal__pagination { + display: flex; + justify-content: center; + margin-bottom: 20px; } -.media-modal__button { - background-color: $primary-text-color; - height: 12px; - width: 12px; - border-radius: 6px; - margin: 10px; +.media-modal__page-dot { + flex: 0 0 auto; + background-color: $white; + opacity: 0.4; + height: 6px; + width: 6px; + border-radius: 50%; + margin: 0 4px; padding: 0; border: 0; font-size: 0; -} + transition: opacity .2s ease-in-out; -.media-modal__button--active { - background-color: $highlight-text-color; + &.active { + opacity: 1; + } } .media-modal__close { diff --git a/package.json b/package.json index f4ca18e4d..7b8f49dd8 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "babel-runtime": "^6.26.0", "blurhash": "^1.1.3", "classnames": "^2.2.5", + "color-blend": "^3.0.0", "compression-webpack-plugin": "^6.1.1", "cross-env": "^7.0.2", "css-loader": "^5.0.1", diff --git a/yarn.lock b/yarn.lock index d6c175ea7..1a0ef66e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2941,6 +2941,11 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" +color-blend@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/color-blend/-/color-blend-3.0.0.tgz#077073ee59ebce15e084f00590c5bf7577899cb5" + integrity sha512-m21ytRyjsIkVOGG1jrrpijhx7icji0MljlxUoa0ER7lgGW11as0GPLrXQQuMULH1BWJ7OsR11Dy2S6A5lehg5A== + color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" From ec0edf74d672146ea41fabe17f8e2c4e8eaf7459 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 27 Nov 2020 15:41:43 +0100 Subject: [PATCH 03/83] Fix post-migration warning about index corruption being too scary (#15223) --- lib/tasks/db.rake | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 199155107..f6c9c7eec 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -51,8 +51,11 @@ namespace :db do task :post_migration_hook do at_exit do unless %w(C POSIX).include?(ActiveRecord::Base.connection.execute('SELECT datcollate FROM pg_database WHERE datname = current_database();').first['datcollate']) - Rails.logger.warn 'WARNING: Your database is using an unsafe collation setting, which might result in index corruption.' - Rails.logger.warn 'WARNING: See https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#am-i-affected' + warn <<~WARNING + Your database collation is susceptible to index corruption. + (This warning does not indicate that index corruption has occured and can be ignored) + (To learn more, visit: https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/) + WARNING end end end From e1a6526c8dccec4464667b422cc2336b28504d2c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 27 Nov 2020 15:41:58 +0100 Subject: [PATCH 04/83] Fix media modal regression on public pages (#15221) --- .../mastodon/containers/media_container.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/containers/media_container.js b/app/javascript/mastodon/containers/media_container.js index ba55ecbc7..afed6868e 100644 --- a/app/javascript/mastodon/containers/media_container.js +++ b/app/javascript/mastodon/containers/media_container.js @@ -30,6 +30,7 @@ export default class MediaContainer extends PureComponent { media: null, index: null, time: null, + backgroundColor: null, }; handleOpenMedia = (media, index) => { @@ -52,7 +53,16 @@ export default class MediaContainer extends PureComponent { document.body.classList.remove('with-modals--active'); document.documentElement.style.marginRight = 0; - this.setState({ media: null, index: null, time: null }); + this.setState({ + media: null, + index: null, + time: null, + backgroundColor: null, + }); + } + + setBackgroundColor = color => { + this.setState({ backgroundColor: color }); } render () { @@ -85,13 +95,14 @@ export default class MediaContainer extends PureComponent { ); })} - + {this.state.media && ( )} From e7e099d1a06700d14fa10258f5509fc5c52738c8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 27 Nov 2020 15:48:31 +0100 Subject: [PATCH 05/83] Fix deletes not reaching every server that interacted with status (#15200) Extract logic for determining ActivityPub inboxes to send deletes to to its own class and explicitly include the person the status replied to (even if not mentioned), people who favourited it, and people who replied to it (though that one is still not recursive) --- app/lib/status_reach_finder.rb | 52 +++++++++++++++ app/services/remove_status_service.rb | 91 +++++++++++++-------------- 2 files changed, 97 insertions(+), 46 deletions(-) create mode 100644 app/lib/status_reach_finder.rb diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb new file mode 100644 index 000000000..35b191dad --- /dev/null +++ b/app/lib/status_reach_finder.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +class StatusReachFinder + def initialize(status) + @status = status + end + + def inboxes + Account.where(id: reached_account_ids).inboxes + end + + private + + def reached_account_ids + [ + replied_to_account_id, + reblog_of_account_id, + mentioned_account_ids, + reblogs_account_ids, + favourites_account_ids, + replies_account_ids, + ].tap do |arr| + arr.flatten! + arr.compact! + arr.uniq! + end + end + + def replied_to_account_id + @status.in_reply_to_account_id + end + + def reblog_of_account_id + @status.reblog.account_id if @status.reblog? + end + + def mentioned_account_ids + @status.mentions.pluck(:account_id) + end + + def reblogs_account_ids + @status.reblogs.pluck(:account_id) + end + + def favourites_account_ids + @status.favourites.pluck(:account_id) + end + + def replies_account_ids + @status.replies.pluck(:account_id) + end +end diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 4f0edc3cf..d6043fb5d 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -9,44 +9,47 @@ class RemoveStatusService < BaseService # @param [Hash] options # @option [Boolean] :redraft # @option [Boolean] :immediate - # @option [Boolean] :original_removed + # @option [Boolean] :original_removed def call(status, **options) @payload = Oj.dump(event: :delete, payload: status.id.to_s) @status = status @account = status.account - @tags = status.tags.pluck(:name).to_a - @mentions = status.active_mentions.includes(:account).to_a - @reblogs = status.reblogs.includes(:account).to_a @options = options RedisLock.acquire(lock_options) do |lock| if lock.acquired? - remove_from_self if status.account.local? + remove_from_self if @account.local? remove_from_followers remove_from_lists - remove_from_affected - remove_reblogs - remove_from_hashtags - remove_from_public - remove_from_media if status.media_attachments.any? - remove_from_spam_check - remove_media + + # There is no reason to send out Undo activities when the + # cause is that the original object has been removed, since + # original object being removed implicitly removes reblogs + # of it. The Delete activity of the original is forwarded + # separately. + if @account.local? && !@options[:original_removed] + remove_from_remote_followers + remove_from_remote_reach + end + + # Since reblogs don't mention anyone, don't get reblogged, + # favourited and don't contain their own media attachments + # or hashtags, this can be skipped + unless @status.reblog? + remove_from_mentions + remove_reblogs + remove_from_hashtags + remove_from_public + remove_from_media if @status.media_attachments.any? + remove_from_spam_check + remove_media + end @status.destroy! if @options[:immediate] || !@status.reported? else raise Mastodon::RaceConditionError end end - - # There is no reason to send out Undo activities when the - # cause is that the original object has been removed, since - # original object being removed implicitly removes reblogs - # of it. The Delete activity of the original is forwarded - # separately. - return if !@account.local? || @options[:original_removed] - - remove_from_remote_followers - remove_from_remote_affected end private @@ -67,31 +70,35 @@ class RemoveStatusService < BaseService end end - def remove_from_affected - @mentions.map(&:account).select(&:local?).each do |account| - redis.publish("timeline:#{account.id}", @payload) + def remove_from_mentions + # For limited visibility statuses, the mentions that determine + # who receives them in their home feed are a subset of followers + # and therefore the delete is already handled by sending it to all + # followers. Here we send a delete to actively mentioned accounts + # that may not follow the account + + @status.active_mentions.find_each do |mention| + redis.publish("timeline:#{mention.account_id}", @payload) end end - def remove_from_remote_affected + def remove_from_remote_reach + return if @status.reblog? + # People who got mentioned in the status, or who # reblogged it from someone else might not follow # the author and wouldn't normally receive the # delete notification - so here, we explicitly # send it to them - target_accounts = (@mentions.map(&:account).reject(&:local?) + @reblogs.map(&:account).reject(&:local?)) - target_accounts << @status.reblog.account if @status.reblog? && !@status.reblog.account.local? - target_accounts.uniq!(&:id) + status_reach_finder = StatusReachFinder.new(@status) - # ActivityPub - ActivityPub::DeliveryWorker.push_bulk(target_accounts.select(&:activitypub?).uniq(&:preferred_inbox_url)) do |target_account| - [signed_activity_json, @account.id, target_account.preferred_inbox_url] + ActivityPub::DeliveryWorker.push_bulk(status_reach_finder.inboxes) do |inbox_url| + [signed_activity_json, @account.id, inbox_url] end end def remove_from_remote_followers - # ActivityPub ActivityPub::DeliveryWorker.push_bulk(@account.followers.inboxes) do |inbox_url| [signed_activity_json, @account.id, inbox_url] end @@ -118,19 +125,19 @@ class RemoveStatusService < BaseService # because once original status is gone, reblogs will disappear # without us being able to do all the fancy stuff - @reblogs.each do |reblog| + @status.reblogs.includes(:account).find_each do |reblog| RemoveStatusService.new.call(reblog, original_removed: true) end end def remove_from_hashtags - @account.featured_tags.where(tag_id: @status.tags.pluck(:id)).each do |featured_tag| + @account.featured_tags.where(tag_id: @status.tags.map(&:id)).each do |featured_tag| featured_tag.decrement(@status.id) end return unless @status.public_visibility? - @tags.each do |hashtag| + @status.tags.map(&:name).each do |hashtag| redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}", @payload) redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}:local", @payload) if @status.local? end @@ -140,22 +147,14 @@ class RemoveStatusService < BaseService return unless @status.public_visibility? redis.publish('timeline:public', @payload) - if @status.local? - redis.publish('timeline:public:local', @payload) - else - redis.publish('timeline:public:remote', @payload) - end + redis.publish(@status.local? ? 'timeline:public:local' : 'timeline:public:remote', @payload) end def remove_from_media return unless @status.public_visibility? redis.publish('timeline:public:media', @payload) - if @status.local? - redis.publish('timeline:public:local:media', @payload) - else - redis.publish('timeline:public:remote:media', @payload) - end + redis.publish(@status.local? ? 'timeline:public:local:media' : 'timeline:public:remote:media', @payload) end def remove_media From e7f1439b9748f5adb85fcb0807376855a90220c4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 27 Nov 2020 18:29:22 +0100 Subject: [PATCH 06/83] Bump version to 3.2.1 (#15227) --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18790e860..6f94ebea2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,35 @@ Changelog All notable changes to this project will be documented in this file. +## [3.2.1] - 2020-10-19 +### Added + +- Add support for latest HTTP Signatures spec draft ([ThibG](https://github.com/tootsuite/mastodon/pull/14556)) +- Add support for inlined objects in ActivityPub `to`/`cc` ([ThibG](https://github.com/tootsuite/mastodon/pull/14514)) + +### Changed + +- Change actors to not be served at all without authentication in limited federation mode ([ThibG](https://github.com/tootsuite/mastodon/pull/14800)) + - Previously, a bare version of an actor was served when not authenticated, i.e. username and public key + - Because all actor fetch requests are signed using a separate system actor, that is no longer required + +### Fixed + +- Fix `tootctl media` commands not recognizing very large IDs ([ThibG](https://github.com/tootsuite/mastodon/pull/14536)) +- Fix crash when failing to load emoji picker in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14525)) +- Fix contrast requirements in thumbnail color extraction ([ThibG](https://github.com/tootsuite/mastodon/pull/14464)) +- Fix audio/video player not using `CDN_HOST` on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14486)) +- Fix private boost icon not being used on public pages ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14471)) +- Fix audio player on Safari in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14485), [ThibG](https://github.com/tootsuite/mastodon/pull/14465)) +- Fix dereferencing remote statuses not using the correct account for signature when receiving a targeted inbox delivery ([ThibG](https://github.com/tootsuite/mastodon/pull/14656)) +- Fix nil error in `tootctl media remove` ([noellabo](https://github.com/tootsuite/mastodon/pull/14657)) +- Fix videos with near-60 fps being rejected ([Gargron](https://github.com/tootsuite/mastodon/pull/14684)) +- Fix reported statuses not being included in warning e-mail ([Gargron](https://github.com/tootsuite/mastodon/pull/14778)) +- Fix `Reject` activities of `Follow` objects not correctly destroying a follow relationship ([ThibG](https://github.com/tootsuite/mastodon/pull/14479)) +- Fix inefficiencies in fan-out-on-write service ([Gargron](https://github.com/tootsuite/mastodon/pull/14682), [noellabo](https://github.com/tootsuite/mastodon/pull/14709)) +- Fix timeout errors when trying to webfinger some IPv6 configurations ([Gargron](https://github.com/tootsuite/mastodon/pull/14919)) +- Fix files served as `application/octet-stream` being rejected without attempting mime type detection ([ThibG](https://github.com/tootsuite/mastodon/pull/14452)) + ## [3.2.0] - 2020-07-27 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 7b940d1f8..a90763ded 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 0 + 1 end def flags From 13206fcfb86844ba4a0c872eaf8c11a61ea848df Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Nov 2020 03:37:01 +0100 Subject: [PATCH 07/83] Fix media modal crashing when media has no blurhash (#15229) --- .../mastodon/features/ui/components/media_modal.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js index bcec19a49..58cef1e9d 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.js +++ b/app/javascript/mastodon/features/ui/components/media_modal.js @@ -221,9 +221,12 @@ class MediaModal extends ImmutablePureComponent { _sendBackgroundColor () { const { media, onChangeBackgroundColor } = this.props; const index = this.getIndex(); - const backgroundColor = decodeRGB(decode83(media.getIn([index, 'blurhash']).slice(2, 6))); + const blurhash = media.getIn([index, 'blurhash']); - onChangeBackgroundColor(backgroundColor); + if (blurhash) { + const backgroundColor = decodeRGB(decode83(blurhash.slice(2, 6))); + onChangeBackgroundColor(backgroundColor); + } } componentWillUnmount () { From 13b07b88f1aa79c31291473362ac77b31602c374 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Nov 2020 05:17:53 +0100 Subject: [PATCH 08/83] Fix omniauth (SAML/CAS) sign-in routes not having CSRF protection (#15228) --- Gemfile | 1 + Gemfile.lock | 4 ++++ app/views/auth/sessions/new.html.haml | 3 +-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 950bc59bb..63becb7cc 100644 --- a/Gemfile +++ b/Gemfile @@ -44,6 +44,7 @@ gem 'net-ldap', '~> 0.16' gem 'omniauth-cas', '~> 2.0' gem 'omniauth-saml', '~> 1.10' gem 'omniauth', '~> 1.9' +gem 'omniauth-rails_csrf_protection', '~> 0.1' gem 'color_diff', '~> 0.1' gem 'discard', '~> 1.2' diff --git a/Gemfile.lock b/Gemfile.lock index b8134a985..f7192d084 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -375,6 +375,9 @@ GEM addressable (~> 2.3) nokogiri (~> 1.5) omniauth (~> 1.2) + omniauth-rails_csrf_protection (0.1.2) + actionpack (>= 4.2) + omniauth (>= 1.3.1) omniauth-saml (1.10.3) omniauth (~> 1.3, >= 1.3.2) ruby-saml (~> 1.9) @@ -741,6 +744,7 @@ DEPENDENCIES oj (~> 3.10) omniauth (~> 1.9) omniauth-cas (~> 2.0) + omniauth-rails_csrf_protection (~> 0.1) omniauth-saml (~> 1.10) ox (~> 2.13) paperclip (~> 6.0) diff --git a/app/views/auth/sessions/new.html.haml b/app/views/auth/sessions/new.html.haml index ceb169408..9713bdaeb 100644 --- a/app/views/auth/sessions/new.html.haml +++ b/app/views/auth/sessions/new.html.haml @@ -22,7 +22,6 @@ .actions - resource_class.omniauth_providers.each do |provider| - = link_to omniauth_authorize_path(resource_name, provider), class: "button button-#{provider}" do - = t("auth.providers.#{provider}", default: provider.to_s.chomp("_oauth2").capitalize) + = link_to t("auth.providers.#{provider}", default: provider.to_s.chomp("_oauth2").capitalize), omniauth_authorize_path(resource_name, provider), class: "button button-#{provider}", method: :post .form-footer= render 'auth/shared/links' From b429d33e46457bbb2143b780c5a7a1f1bd5a8406 Mon Sep 17 00:00:00 2001 From: Shlee Date: Sun, 29 Nov 2020 18:50:02 +1030 Subject: [PATCH 09/83] Update Dockerfile (#15232) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 57d061fd0..95d45bab4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM ubuntu:20.04 as build-dep SHELL ["bash", "-c"] # Install Node v12 (LTS) -ENV NODE_VER="12.16.3" +ENV NODE_VER="12.20.0" RUN ARCH= && \ dpkgArch="$(dpkg --print-architecture)" && \ case "${dpkgArch##*-}" in \ From 68775b60392152d32deda45a261bc1d4f848b44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9lanie=20Chauvel?= Date: Mon, 30 Nov 2020 12:09:34 +0100 Subject: [PATCH 10/83] Fix character count not ignoring hidden CW field (#15236) --- .../compose/components/compose_form.js | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 47e189251..8af806ec4 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -77,6 +77,18 @@ class ComposeForm extends ImmutablePureComponent { } } + getFulltextForCharacterCounting = () => { + return [this.props.spoiler? this.props.spoilerText: '', countableText(this.props.text)].join(''); + } + + canSubmit = () => { + const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props; + const fulltext = this.getFulltextForCharacterCounting(); + const isOnlyWhitespace = fulltext.length !== 0 && fulltext.trim().length === 0; + + return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > 500 || (isOnlyWhitespace && !anyMedia)); + } + handleSubmit = () => { if (this.props.text !== this.autosuggestTextarea.textarea.value) { // Something changed the text inside the textarea (e.g. browser extensions like Grammarly) @@ -84,11 +96,7 @@ class ComposeForm extends ImmutablePureComponent { this.props.onChange(this.autosuggestTextarea.textarea.value); } - // Submit disabled: - const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props; - const fulltext = [this.props.spoilerText, countableText(this.props.text)].join(''); - - if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > 500 || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) { + if (!this.canSubmit()) { return; } @@ -178,10 +186,8 @@ class ComposeForm extends ImmutablePureComponent { } render () { - const { intl, onPaste, showSearch, anyMedia } = this.props; + const { intl, onPaste, showSearch } = this.props; const disabled = this.props.isSubmitting; - const text = [this.props.spoilerText, countableText(this.props.text)].join(''); - const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > 500 || (text.length !== 0 && text.trim().length === 0 && !anyMedia); let publishText = ''; if (this.props.privacy === 'private' || this.props.privacy === 'direct') { @@ -243,11 +249,11 @@ class ComposeForm extends ImmutablePureComponent {
    -
    +
    -
    +
    ); From a55e6e99c0a8e757eca54ceb1b0496c7124ec9c4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 30 Nov 2020 23:02:32 +0100 Subject: [PATCH 11/83] Fix `ku` locale not being right-to-left (#15252) --- app/helpers/application_helper.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8914b015c..bf5742d34 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -7,6 +7,13 @@ module ApplicationHelper follow ).freeze + RTL_LOCALES = %i( + ar + fa + he + ku + ).freeze + def active_nav_class(*paths) paths.any? { |path| current_page?(path) } ? 'active' : '' end @@ -44,7 +51,7 @@ module ApplicationHelper end def locale_direction - if [:ar, :fa, :he].include?(I18n.locale) + if RTL_LOCALES.include?(I18n.locale) 'rtl' else 'ltr' From 8e0b98556f5ff1ecf00e82ffbe76e953ffd764ef Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 1 Dec 2020 06:38:05 +0100 Subject: [PATCH 12/83] Bump version to 3.3.0rc1 (#15230) --- CHANGELOG.md | 170 ++++++++++++++++++++++++++++++++++++++++ Gemfile.lock | 6 ++ lib/mastodon/version.rb | 6 +- 3 files changed, 179 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f94ebea2..8816b6a4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,176 @@ Changelog All notable changes to this project will be documented in this file. +## Unreleased +### Added + +- **Add hotkeys for audio/video control in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15158), [Gargron](https://github.com/tootsuite/mastodon/pull/15198)) + - `Space` and `k` to toggle playback + - `m` to toggle mute + - `f` to toggle fullscreen + - `j` and `l` to go back and forward by 10 seconds + - `.` and `,` to go back and forward by a frame (video only) +- Add expand/compress button on media modal in web UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15068), [mashirozx](https://github.com/tootsuite/mastodon/pull/15088), [mashirozx](https://github.com/tootsuite/mastodon/pull/15094)) +- Add border around 🕺 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14769)) +- Add border around 🐞 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14712)) +- Add home link to the getting started column when home isn't mounted ([ThibG](https://github.com/tootsuite/mastodon/pull/14707)) +- Add option to disable swiping motions across the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13885)) +- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14870), [Gargron](https://github.com/tootsuite/mastodon/pull/15157), [Gargron](https://github.com/tootsuite/mastodon/pull/14915)) + - Continue watching/listening when you scroll away + - Action bar to interact with/open toot from the pop-out player +- Add unread notification markers in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14818), [ThibG](https://github.com/tootsuite/mastodon/pull/14960), [ThibG](https://github.com/tootsuite/mastodon/pull/14954), [noellabo](https://github.com/tootsuite/mastodon/pull/14897), [noellabo](https://github.com/tootsuite/mastodon/pull/14907)) +- Add paragraph about browser add-ons when encountering errors in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14801)) +- Add import and export for bookmarks ([ThibG](https://github.com/tootsuite/mastodon/pull/14956)) +- Add cache buster feature for media files ([Gargron](https://github.com/tootsuite/mastodon/pull/15155)) + - If you have a proxy cache in front of object storage, deleted files will persist until the cache expires + - If enabled, cache buster will make a special request to the proxy to signal a cache reset +- Add duration option to the mute function ([aquarla](https://github.com/tootsuite/mastodon/pull/13831)) +- Add replies policy option to the list function ([ThibG](https://github.com/tootsuite/mastodon/pull/9205)) +- Add `og:published_time` OpenGraph tags on toots ([nornagon](https://github.com/tootsuite/mastodon/pull/14865)) +- **Add option to be notified when a followed user posts** ([Gargron](https://github.com/tootsuite/mastodon/pull/13546), [ThibG](https://github.com/tootsuite/mastodon/pull/14896), [Gargron](https://github.com/tootsuite/mastodon/pull/14822)) + - If you don't want to miss a toot, click the bell button! +- Add client-side validation in password change forms ([ThibG](https://github.com/tootsuite/mastodon/pull/14564)) +- Add client-side validation in the registration form ([ThibG](https://github.com/tootsuite/mastodon/pull/14560), [ThibG](https://github.com/tootsuite/mastodon/pull/14599)) +- Add support for Gemini URLs ([joshleeb](https://github.com/tootsuite/mastodon/pull/15013)) +- Add WebAuthn as an alternative 2FA method ([santiagorodriguez96](https://github.com/tootsuite/mastodon/pull/14466), [jiikko](https://github.com/tootsuite/mastodon/pull/14806)) +- Add icon for mutual relationships in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15149)) +- Add follow selected followers button in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15148)) +- **Add subresource integrity for JS and CSS assets** ([Gargron](https://github.com/tootsuite/mastodon/pull/15096)) + - If you use a CDN for static assets (JavaScript, CSS, and so on), you have to trust that the CDN does not modify the assets maliciously + - Subresource integrity compares server-generated asset digests with what's actually served from the CDN and prevents such attacks +- Add `ku`, `sa`, `sc`, `zgh` to available locales ([ykzts](https://github.com/tootsuite/mastodon/pull/15138)) +- Add ability to force an account to mark media as sensitive ([noellabo](https://github.com/tootsuite/mastodon/pull/14361)) +- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/tootsuite/mastodon/pull/14963)) + - Add rules for IPs or CIDR ranges that automatically expire after a configurable amount of time + - Choose the severity of the rule, either blocking all access or merely limiting sign-ups +- **Add support for reversible suspensions through ActivityPub** ([Gargron](https://github.com/tootsuite/mastodon/pull/14989)) + - Servers can signal that one of their accounts has been suspended + - During suspension, the account can only delete its own content + - A reversal of the suspension can be signalled the same way + - A local suspension always overrides a remote one +- Add ActivityPub follower synchronization mechanism ([ThibG](https://github.com/tootsuite/mastodon/pull/14510), [ThibG](https://github.com/tootsuite/mastodon/pull/15026)) +- Add outbox attribute to instance actor ([ThibG](https://github.com/tootsuite/mastodon/pull/14721)) +- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595)) +- Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/tootsuite/mastodon/pull/14683), [noellabo](https://github.com/tootsuite/mastodon/pull/14981)) +- Add support for latest HTTP Signatures spec draft ([ThibG](https://github.com/tootsuite/mastodon/pull/14556)) +- Add support for inlined objects in activity audience ([ThibG](https://github.com/tootsuite/mastodon/pull/14514)) +- Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/14952)) +- Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ThibG](https://github.com/tootsuite/mastodon/pull/14722)) +- Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/14383), [uist1idrju3i](https://github.com/tootsuite/mastodon/pull/14715)) +- Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201)) + - Has someone changed their domain or subdomain thereby creating two accounts where there should be one? + - This command will fix it on your end +- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223)) + - Index corruption in the database? + - This command is for you +- **Add support for managing multiple stream subscriptions in a single connection** ([Gargron](https://github.com/tootsuite/mastodon/pull/14524), [Gargron](https://github.com/tootsuite/mastodon/pull/14566), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14859), [zunda](https://github.com/tootsuite/mastodon/pull/14608)) + - Previously, getting live updates for multiple timelines required opening a HTTP or WebSocket connection for each + - More connections means more resource consumption on both ends, not to mention the (ever so slight) delay when establishing a new connection + - Now, with just a single WebSocket connection you can subscribe and unsubscribe to and from multiple streams +- Add support for limiting results by both `min_id` and `max_id` at the same time in REST API ([tateisu](https://github.com/tootsuite/mastodon/pull/14776)) +- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817)) +- Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14396)) + +### Changed + +- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221)) + - Background of the overlay matches the color of the image + - Action bar to interact with or open the toot from the modal +- Change order of announcements in admin UI to be newest-first ([ThibG](https://github.com/tootsuite/mastodon/pull/15091)) +- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855)) + - Suspensions no longer equal deletions + - A suspended account can be unsuspended with minimal consequences for 30 days + - Immediate deletion of data is still available as an explicit option + - Suspended accounts can request an archive of their data through the UI +- Change REST API to return empty data for suspended accounts (14765) +- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/14766)) +- Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/tootsuite/mastodon/pull/14760)) +- Change direct toots to appear in the home feed again ([Gargron](https://github.com/tootsuite/mastodon/pull/14711), [ThibG](https://github.com/tootsuite/mastodon/pull/15182), [noellabo](https://github.com/tootsuite/mastodon/pull/14727)) + - Return to treating all toots the same instead of trying to retrofit direct visibility into an instant messaging model +- Change content type of downloaded files to be always computed from file data instead of using headers as hints ([ThibG](https://github.com/tootsuite/mastodon/pull/14452)) +- Change email address validation to return more specific errors ([ThibG](https://github.com/tootsuite/mastodon/pull/14565)) +- Change limited federation mode to not serve even bare account actors to the public ([ThibG](https://github.com/tootsuite/mastodon/pull/14800)) + - Previously, accessing an account actor in limited federation mode without a signature would return a bare version that only contained the username and the public key necessary for verifying signatures + - This meant that even though no content would be accessible, other servers could store an empty account that would be visible by end-users + - Because HTTP signatures are performed by a specialized system actor now, it is no longer necessary to return even such a bare version of actors to the public +- Change HTTP signature requirements to include `Digest` header on `POST` requests ([ThibG](https://github.com/tootsuite/mastodon/pull/15069)) +- Change click area of video/audio player buttons to be bigger in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15049)) +- Change order of filters by alphabetic by "keyword or phrase" ([ariasuni](https://github.com/tootsuite/mastodon/pull/15050)) +- Change suspension of remote accounts to also undo outgoing follows ([ThibG](https://github.com/tootsuite/mastodon/pull/15188)) +- Change string "Home" to "Home and lists" in the filter creation screen ([ariasuni](https://github.com/tootsuite/mastodon/pull/15139)) +- Change string "Boost to original audience" to "Boost with original visibility" in web UI ([3n-k1](https://github.com/tootsuite/mastodon/pull/14598)) +- Change string "Show more" to "Show newer" and "Show older" on public pages ([ariasuni](https://github.com/tootsuite/mastodon/pull/15052)) +- Change order of announcements to be reverse chronological in web UI ([dariusk](https://github.com/tootsuite/mastodon/pull/15065), [dariusk](https://github.com/tootsuite/mastodon/pull/15070)) +- Change visibility icon next to timestamp to be clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15053), [mayaeh](https://github.com/tootsuite/mastodon/pull/15055)) + +### Removed + +- Remove fade-in animation from modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15199)) +- Remove auto-redirect to direct messages in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15142)) +- Remove dependency on goldfinger gem ([Gargron](https://github.com/tootsuite/mastodon/pull/14919)) +- Remove obsolete IndexedDB operations from web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14730)) +- Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574)) + +### Fixed + +- **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/tootsuite/mastodon/pull/15200)) + - Previously, delete of a toot would be primarily sent to the followers of its author, people mentioned in the toot, and people who reblogged the toot + - Now, additionally, it is ensured that it is sent to people who replied to it, favourited it, and to the person it replies to even if that person is not mentioned +- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ThibG](https://github.com/tootsuite/mastodon/pull/15187)) +- Fix sending redundant ActivityPub events when processing remote account deletion ([ThibG](https://github.com/tootsuite/mastodon/pull/15104)) +- Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107)) +- Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867)) +- Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027)) +- Fix handling of Reject Follow activities when a matching follow relationship exists ([ThibG](https://github.com/tootsuite/mastodon/pull/14479)) +- Fix dereferencing remote toots not using the correct account ([ThibG](https://github.com/tootsuite/mastodon/pull/14656)) +- Fix not being able to unfavorite toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/15192)) +- Fix not being able to unbookmark toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/14604)) +- Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906)) +- Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108)) +- Fix cookies not having a SameSite attribute ([Gargron](https://github.com/tootsuite/mastodon/pull/15098)) +- Fix audio/video player not using `CDN_HOST` on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14486)) +- Fix videos with near-60 fps being rejected ([Gargron](https://github.com/tootsuite/mastodon/pull/14684)) +- Fix poll ending notifications being created for each vote ([ThibG](https://github.com/tootsuite/mastodon/pull/15071)) +- Fix multiple boosts of a same toot erroneously appearing in TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14759)) +- Fix contrast requirements in thumbnail color extraction ([ThibG](https://github.com/tootsuite/mastodon/pull/14464)) +- Fix asset builds not picking up `CDN_HOST` change ([ThibG](https://github.com/tootsuite/mastodon/pull/14381)) +- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543)) + - Some time ago, browsers added a requirement that desktop notification prompts could only be displayed in response to a user-generated event (such as a click) + - This means that for some time, users who haven't already given the permission before were not getting a prompt and as such were not receiving desktop notifications +- Fix "Mark media as sensitive" string not supporting pluralizations in other languages in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15051)) +- Fix glitched image uploads when canvas read access is blocked in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15180)) +- Fix some account gallery items having empty labels in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15073)) +- Fix alt-key hotkeys activating while typing in a text field in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14942)) +- Fix wrong seek bar width on media player in web UI ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/15060)) +- Fix crash when failing to load emoji picker in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14525)) +- Fix logging out on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14901)) +- Fix wrong click area for GIFVs in media modal in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14615)) +- Fix unreadable placeholder text color in high contrast theme in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14803)) +- Fix scrolling issues when closing some dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14606)) +- Fix notification filter bar incorrectly filtering gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14808)) +- Fix audio player not working in Safari ([ThibG](https://github.com/tootsuite/mastodon/pull/14485), [ThibG](https://github.com/tootsuite/mastodon/pull/14465)) +- Fix detailed toot view not using private boost icon in web UI ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14471)) +- Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14456)) +- Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/14484), [ThibG](https://github.com/tootsuite/mastodon/pull/14513)) +- Fix home last read marker mishandling gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14809)) +- Fix reported toots not being included in warning e-mail ([Gargron](https://github.com/tootsuite/mastodon/pull/14778)) +- Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/14861), [akihikodaki](https://github.com/tootsuite/mastodon/pull/14662)) +- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674)) +- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673)) +- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675)) +- Fix inefficiencies in fan-out-on-write service ([Gargron](https://github.com/tootsuite/mastodon/pull/14682), [noellabo](https://github.com/tootsuite/mastodon/pull/14709)) +- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534)) +- Fix nil error in `tootctl media remove` ([noellabo](https://github.com/tootsuite/mastodon/pull/14657)) +- Fix `tootctl media` commands not handling very long directories ([ThibG](https://github.com/tootsuite/mastodon/pull/14536)) +- Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/tootsuite/mastodon/pull/15072)) +- Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/tootsuite/mastodon/pull/12685)) +- Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/tootsuite/mastodon/pull/14686)) + +### Security + +- Fix streaming API allowing connections to persist after access token invalidation ([Gargron](https://github.com/tootsuite/mastodon/pull/15111)) +- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) + ## [3.2.1] - 2020-10-19 ### Added diff --git a/Gemfile.lock b/Gemfile.lock index f7192d084..9594c0e2b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -804,3 +804,9 @@ DEPENDENCIES webpacker (~> 5.2) webpush xorcist (~> 1.1) + +RUBY VERSION + ruby 2.7.2p137 + +BUNDLED WITH + 2.1.4 diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index a90763ded..46aed7d8d 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -9,15 +9,15 @@ module Mastodon end def minor - 2 + 3 end def patch - 1 + 0 end def flags - '' + 'rc1' end def suffix From 17f01ecc4ee8064bff5eebcb8ed74dfcbf7df6fb Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 1 Dec 2020 06:45:58 +0100 Subject: [PATCH 13/83] Fix changelog containing items from 3.2.1 twice (#15255) --- CHANGELOG.md | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8816b6a4d..fe2c1b8b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,8 +54,6 @@ All notable changes to this project will be documented in this file. - Add outbox attribute to instance actor ([ThibG](https://github.com/tootsuite/mastodon/pull/14721)) - Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595)) - Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/tootsuite/mastodon/pull/14683), [noellabo](https://github.com/tootsuite/mastodon/pull/14981)) -- Add support for latest HTTP Signatures spec draft ([ThibG](https://github.com/tootsuite/mastodon/pull/14556)) -- Add support for inlined objects in activity audience ([ThibG](https://github.com/tootsuite/mastodon/pull/14514)) - Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/14952)) - Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ThibG](https://github.com/tootsuite/mastodon/pull/14722)) - Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/14383), [uist1idrju3i](https://github.com/tootsuite/mastodon/pull/14715)) @@ -89,12 +87,7 @@ All notable changes to this project will be documented in this file. - Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/tootsuite/mastodon/pull/14760)) - Change direct toots to appear in the home feed again ([Gargron](https://github.com/tootsuite/mastodon/pull/14711), [ThibG](https://github.com/tootsuite/mastodon/pull/15182), [noellabo](https://github.com/tootsuite/mastodon/pull/14727)) - Return to treating all toots the same instead of trying to retrofit direct visibility into an instant messaging model -- Change content type of downloaded files to be always computed from file data instead of using headers as hints ([ThibG](https://github.com/tootsuite/mastodon/pull/14452)) - Change email address validation to return more specific errors ([ThibG](https://github.com/tootsuite/mastodon/pull/14565)) -- Change limited federation mode to not serve even bare account actors to the public ([ThibG](https://github.com/tootsuite/mastodon/pull/14800)) - - Previously, accessing an account actor in limited federation mode without a signature would return a bare version that only contained the username and the public key necessary for verifying signatures - - This meant that even though no content would be accessible, other servers could store an empty account that would be visible by end-users - - Because HTTP signatures are performed by a specialized system actor now, it is no longer necessary to return even such a bare version of actors to the public - Change HTTP signature requirements to include `Digest` header on `POST` requests ([ThibG](https://github.com/tootsuite/mastodon/pull/15069)) - Change click area of video/audio player buttons to be bigger in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15049)) - Change order of filters by alphabetic by "keyword or phrase" ([ariasuni](https://github.com/tootsuite/mastodon/pull/15050)) @@ -109,7 +102,6 @@ All notable changes to this project will be documented in this file. - Remove fade-in animation from modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15199)) - Remove auto-redirect to direct messages in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15142)) -- Remove dependency on goldfinger gem ([Gargron](https://github.com/tootsuite/mastodon/pull/14919)) - Remove obsolete IndexedDB operations from web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14730)) - Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574)) @@ -123,18 +115,13 @@ All notable changes to this project will be documented in this file. - Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107)) - Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867)) - Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027)) -- Fix handling of Reject Follow activities when a matching follow relationship exists ([ThibG](https://github.com/tootsuite/mastodon/pull/14479)) -- Fix dereferencing remote toots not using the correct account ([ThibG](https://github.com/tootsuite/mastodon/pull/14656)) - Fix not being able to unfavorite toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/15192)) - Fix not being able to unbookmark toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/14604)) - Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906)) - Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108)) - Fix cookies not having a SameSite attribute ([Gargron](https://github.com/tootsuite/mastodon/pull/15098)) -- Fix audio/video player not using `CDN_HOST` on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14486)) -- Fix videos with near-60 fps being rejected ([Gargron](https://github.com/tootsuite/mastodon/pull/14684)) - Fix poll ending notifications being created for each vote ([ThibG](https://github.com/tootsuite/mastodon/pull/15071)) - Fix multiple boosts of a same toot erroneously appearing in TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14759)) -- Fix contrast requirements in thumbnail color extraction ([ThibG](https://github.com/tootsuite/mastodon/pull/14464)) - Fix asset builds not picking up `CDN_HOST` change ([ThibG](https://github.com/tootsuite/mastodon/pull/14381)) - Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543)) - Some time ago, browsers added a requirement that desktop notification prompts could only be displayed in response to a user-generated event (such as a click) @@ -144,26 +131,19 @@ All notable changes to this project will be documented in this file. - Fix some account gallery items having empty labels in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15073)) - Fix alt-key hotkeys activating while typing in a text field in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14942)) - Fix wrong seek bar width on media player in web UI ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/15060)) -- Fix crash when failing to load emoji picker in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14525)) - Fix logging out on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14901)) - Fix wrong click area for GIFVs in media modal in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14615)) - Fix unreadable placeholder text color in high contrast theme in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14803)) - Fix scrolling issues when closing some dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14606)) - Fix notification filter bar incorrectly filtering gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14808)) -- Fix audio player not working in Safari ([ThibG](https://github.com/tootsuite/mastodon/pull/14485), [ThibG](https://github.com/tootsuite/mastodon/pull/14465)) -- Fix detailed toot view not using private boost icon in web UI ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14471)) - Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14456)) - Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/14484), [ThibG](https://github.com/tootsuite/mastodon/pull/14513)) - Fix home last read marker mishandling gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14809)) -- Fix reported toots not being included in warning e-mail ([Gargron](https://github.com/tootsuite/mastodon/pull/14778)) - Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/14861), [akihikodaki](https://github.com/tootsuite/mastodon/pull/14662)) - Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674)) - Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673)) - Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675)) -- Fix inefficiencies in fan-out-on-write service ([Gargron](https://github.com/tootsuite/mastodon/pull/14682), [noellabo](https://github.com/tootsuite/mastodon/pull/14709)) - Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534)) -- Fix nil error in `tootctl media remove` ([noellabo](https://github.com/tootsuite/mastodon/pull/14657)) -- Fix `tootctl media` commands not handling very long directories ([ThibG](https://github.com/tootsuite/mastodon/pull/14536)) - Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/tootsuite/mastodon/pull/15072)) - Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/tootsuite/mastodon/pull/12685)) - Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/tootsuite/mastodon/pull/14686)) From 4b7f21a28ec59452411b16e66cdbb290d4761b14 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 1 Dec 2020 12:34:33 +0100 Subject: [PATCH 14/83] Fix Gemfile.lock breaking CI (#15257) Unnecessary Ruby and Bundler version constraints got included in #15230 --- Gemfile.lock | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9594c0e2b..f7192d084 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -804,9 +804,3 @@ DEPENDENCIES webpacker (~> 5.2) webpush xorcist (~> 1.1) - -RUBY VERSION - ruby 2.7.2p137 - -BUNDLED WITH - 2.1.4 From fbff89be037c751932c720b0d5cd9221e430be5f Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 2 Dec 2020 21:19:41 +0100 Subject: [PATCH 15/83] Fix tootctl ip_blocks add failing if not given a comment (#15263) Fixes #15261 --- lib/mastodon/ip_blocks_cli.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/ip_blocks_cli.rb b/lib/mastodon/ip_blocks_cli.rb index 6aff36d90..5c38c1aca 100644 --- a/lib/mastodon/ip_blocks_cli.rb +++ b/lib/mastodon/ip_blocks_cli.rb @@ -47,7 +47,7 @@ module Mastodon ip_block ||= IpBlock.new(ip: address) ip_block.severity = options[:severity] - ip_block.comment = options[:comment] + ip_block.comment = options[:comment] if options[:comment].present? ip_block.expires_in = options[:duration] if ip_block.save From 9136be480f9660dcdf0e5a17ed929e2eb5ee650c Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 2 Dec 2020 21:20:00 +0100 Subject: [PATCH 16/83] Fix followers hash cache not being invalidated on account merge (#15256) Also clear relationships cache. --- app/models/concerns/account_merging.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/models/concerns/account_merging.rb b/app/models/concerns/account_merging.rb index 691d02e03..45050c269 100644 --- a/app/models/concerns/account_merging.rb +++ b/app/models/concerns/account_merging.rb @@ -39,5 +39,10 @@ module AccountMerging end end end + + # Some follow relationships have moved, so the cache is stale + Rails.cache.delete_matched("followers_hash:#{id}:*") + Rails.cache.delete_matched("relationships:#{id}:*") + Rails.cache.delete_matched("relationships:*:#{id}") end end From d849aad85206bff2058fbbd9e187b0048c793cb9 Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 2 Dec 2020 21:21:44 +0100 Subject: [PATCH 17/83] Change public thread view to hide "Show thread" link (#15266) Fixes #15262 --- app/views/statuses/_simple_status.html.haml | 5 ++++- app/views/statuses/_status.html.haml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml index 192192700..d60ade22f 100644 --- a/app/views/statuses/_simple_status.html.haml +++ b/app/views/statuses/_simple_status.html.haml @@ -1,3 +1,6 @@ +:ruby + hide_show_thread ||= false + .status{ class: "status-#{status.visibility}" } .status__info = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__relative-time u-url u-uid', target: stream_link_target, rel: 'noopener noreferrer' do @@ -47,7 +50,7 @@ - elsif status.preview_card = react_component :card, sensitive: sensitized?(status, current_account), 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json - - if !status.in_reply_to_id.nil? && status.in_reply_to_account_id == status.account.id + - if !status.in_reply_to_id.nil? && status.in_reply_to_account_id == status.account.id && !hide_show_thread = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__content__read-more-button', target: stream_link_target, rel: 'noopener noreferrer' do = t 'statuses.show_thread' diff --git a/app/views/statuses/_status.html.haml b/app/views/statuses/_status.html.haml index 650f9b679..13a06519c 100644 --- a/app/views/statuses/_status.html.haml +++ b/app/views/statuses/_status.html.haml @@ -39,7 +39,7 @@ %span = t('stream_entries.pinned') - = render (centered ? 'statuses/detailed_status' : 'statuses/simple_status'), status: status.proper, autoplay: autoplay + = render (centered ? 'statuses/detailed_status' : 'statuses/simple_status'), status: status.proper, autoplay: autoplay, hide_show_thread: is_predecessor || is_successor - if include_threads - if @since_descendant_thread_id From fbe75192436e81b778319c597e0461d0415b5c6f Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 4 Dec 2020 02:23:51 +0100 Subject: [PATCH 18/83] Fix account merging in maintenance script (#15264) Also include AccountNote and AccountDeletionRequest to the list of classes needing to be reassigned the merged account. --- app/models/concerns/account_merging.rb | 7 ++-- lib/mastodon/maintenance_cli.rb | 45 +++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/app/models/concerns/account_merging.rb b/app/models/concerns/account_merging.rb index 45050c269..c3b7018f2 100644 --- a/app/models/concerns/account_merging.rb +++ b/app/models/concerns/account_merging.rb @@ -15,7 +15,7 @@ module AccountMerging Status, StatusPin, MediaAttachment, Poll, Report, Tombstone, Favourite, Follow, FollowRequest, Block, Mute, AccountIdentityProof, AccountModerationNote, AccountPin, AccountStat, ListAccount, - PollVote, Mention + PollVote, Mention, AccountDeletionRequest, AccountNote ] owned_classes.each do |klass| @@ -28,7 +28,10 @@ module AccountMerging end end - target_classes = [Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin] + target_classes = [ + Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin, + AccountNote + ] target_classes.each do |klass| klass.where(target_account_id: other_account.id).find_each do |record| diff --git a/lib/mastodon/maintenance_cli.rb b/lib/mastodon/maintenance_cli.rb index 547238ec6..99d13f43d 100644 --- a/lib/mastodon/maintenance_cli.rb +++ b/lib/mastodon/maintenance_cli.rb @@ -55,8 +55,8 @@ module Mastodon belongs_to :account, inverse_of: :account_stat end + # Dummy class, to make migration possible across version changes class Account < ApplicationRecord - # Dummy class, to make migration possible across version changes has_one :user, inverse_of: :account has_one :account_stat, inverse_of: :account @@ -69,6 +69,49 @@ module Mastodon def acct local? ? username : "#{username}@#{domain}" end + + # This is a duplicate of the AccountMerging concern because we need it to + # be independent from code version. + def merge_with!(other_account) + # Since it's the same remote resource, the remote resource likely + # already believes we are following/blocking, so it's safe to + # re-attribute the relationships too. However, during the presence + # of the index bug users could have *also* followed the reference + # account already, therefore mass update will not work and we need + # to check for (and skip past) uniqueness errors + + owned_classes = [ + Status, StatusPin, MediaAttachment, Poll, Report, Tombstone, Favourite, + Follow, FollowRequest, Block, Mute, AccountIdentityProof, + AccountModerationNote, AccountPin, AccountStat, ListAccount, + PollVote, Mention + ] + owned_classes << AccountDeletionRequest if ActiveRecord::Base.connection.table_exists?(:account_deletion_requests) + owned_classes << AccountNote if ActiveRecord::Base.connection.table_exists?(:account_notes) + + owned_classes.each do |klass| + klass.where(account_id: other_account.id).find_each do |record| + begin + record.update_attribute(:account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + end + end + + target_classes = [Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin] + target_classes << AccountNote if ActiveRecord::Base.connection.table_exists?(:account_notes) + + target_classes.each do |klass| + klass.where(target_account_id: other_account.id).find_each do |record| + begin + record.update_attribute(:target_account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + end + end + end end class User < ApplicationRecord From 44d5c6bc8ffd92cd201380dabe35748e50b6af68 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Fri, 4 Dec 2020 12:22:35 +0900 Subject: [PATCH 19/83] Fix incorrect conditions for suspended accounts in Get API for account featured tags (#15270) --- app/controllers/api/v1/accounts/featured_tags_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/accounts/featured_tags_controller.rb b/app/controllers/api/v1/accounts/featured_tags_controller.rb index 014d71956..dc01b577c 100644 --- a/app/controllers/api/v1/accounts/featured_tags_controller.rb +++ b/app/controllers/api/v1/accounts/featured_tags_controller.rb @@ -17,6 +17,6 @@ class Api::V1::Accounts::FeaturedTagsController < Api::BaseController end def set_featured_tags - @featured_tags = @account.suspended? ? @account.featured_tags : [] + @featured_tags = @account.suspended? ? [] : @account.featured_tags end end From 17a2e276413c6b7c46c2f2b54e86eecc549dfb10 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sun, 6 Dec 2020 13:55:35 +0900 Subject: [PATCH 20/83] Fix remove number sign from account_featured_tags (#15277) --- app/serializers/rest/account_featured_tag_serializer.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/serializers/rest/account_featured_tag_serializer.rb b/app/serializers/rest/account_featured_tag_serializer.rb index d8d5fd68c..84bef2e62 100644 --- a/app/serializers/rest/account_featured_tag_serializer.rb +++ b/app/serializers/rest/account_featured_tag_serializer.rb @@ -9,10 +9,6 @@ class REST::AccountFeaturedTagSerializer < ActiveModel::Serializer object.tag.id.to_s end - def name - "##{object.name}" - end - def url short_account_tag_url(object.account, object.tag) end From 014733d1e4c54cd47d2afd361db26982f02166fd Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 7 Dec 2020 02:32:27 +0100 Subject: [PATCH 21/83] Fix too low contrast on new media modal background in web UI (#15284) Fix #15258 --- app/javascript/mastodon/components/modal_root.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/modal_root.js b/app/javascript/mastodon/components/modal_root.js index 9bfc0e49f..26344528e 100644 --- a/app/javascript/mastodon/components/modal_root.js +++ b/app/javascript/mastodon/components/modal_root.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import 'wicg-inert'; -import { normal } from 'color-blend'; +import { multiply } from 'color-blend'; export default class ModalRoot extends React.PureComponent { @@ -98,7 +98,7 @@ export default class ModalRoot extends React.PureComponent { let backgroundColor = null; if (this.props.backgroundColor) { - backgroundColor = normal({ ...this.props.backgroundColor, a: 1 }, { r: 0, g: 0, b: 0, a: 0.3 }); + backgroundColor = multiply({ ...this.props.backgroundColor, a: 1 }, { r: 0, g: 0, b: 0, a: 0.7 }); } return ( From 59d943e152a36c693eddd6a6a3c1d9c956dba07b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 7 Dec 2020 03:23:43 +0100 Subject: [PATCH 22/83] Fix alert when failing to save timeline markers in web UI (#15285) Fix #15267 --- app/javascript/mastodon/actions/markers.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/actions/markers.js b/app/javascript/mastodon/actions/markers.js index c4b61effd..16a3df8f6 100644 --- a/app/javascript/mastodon/actions/markers.js +++ b/app/javascript/mastodon/actions/markers.js @@ -1,7 +1,6 @@ import api from '../api'; import { debounce } from 'lodash'; import compareId from '../compare_id'; -import { showAlertForError } from './alerts'; export const MARKERS_FETCH_REQUEST = 'MARKERS_FETCH_REQUEST'; export const MARKERS_FETCH_SUCCESS = 'MARKERS_FETCH_SUCCESS'; @@ -29,15 +28,19 @@ export const synchronouslySubmitMarkers = () => (dispatch, getState) => { }, body: JSON.stringify(params), }); + return; } else if (navigator && navigator.sendBeacon) { // Failing that, we can use sendBeacon, but we have to encode the data as // FormData for DoorKeeper to recognize the token. const formData = new FormData(); + formData.append('bearer_token', accessToken); + for (const [id, value] of Object.entries(params)) { formData.append(`${id}[last_read_id]`, value.last_read_id); } + if (navigator.sendBeacon('/api/v1/markers', formData)) { return; } @@ -85,11 +88,9 @@ const debouncedSubmitMarkers = debounce((dispatch, getState) => { return; } - api().post('/api/v1/markers', params).then(() => { + api(getState).post('/api/v1/markers', params).then(() => { dispatch(submitMarkersSuccess(params)); - }).catch(error => { - dispatch(showAlertForError(error)); - }); + }).catch(() => {}); }, 300000, { leading: true, trailing: true }); export function submitMarkersSuccess({ home, notifications }) { @@ -102,9 +103,11 @@ export function submitMarkersSuccess({ home, notifications }) { export function submitMarkers(params = {}) { const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState); + if (params.immediate === true) { debouncedSubmitMarkers.flush(); } + return result; }; From a8c471fcc043b61aa10cf8f849dfb552db7381d3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 7 Dec 2020 04:29:37 +0100 Subject: [PATCH 23/83] Fix not being able to open audio modal in web UI (#15283) Fix #15280 Also adds the new action bar and blurhash-based background color to audio and video modals --- app/javascript/mastodon/blurhash.js | 112 ++++++++++++++++++ app/javascript/mastodon/components/status.js | 5 +- .../status/components/detailed_status.js | 4 +- .../features/ui/components/audio_modal.js | 32 ++--- .../features/ui/components/media_modal.js | 108 +---------------- .../features/ui/components/video_modal.js | 33 ++++-- .../mastodon/features/video/index.js | 20 +--- 7 files changed, 157 insertions(+), 157 deletions(-) create mode 100644 app/javascript/mastodon/blurhash.js diff --git a/app/javascript/mastodon/blurhash.js b/app/javascript/mastodon/blurhash.js new file mode 100644 index 000000000..5adcc3e77 --- /dev/null +++ b/app/javascript/mastodon/blurhash.js @@ -0,0 +1,112 @@ +const DIGIT_CHARACTERS = [ + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + '#', + '$', + '%', + '*', + '+', + ',', + '-', + '.', + ':', + ';', + '=', + '?', + '@', + '[', + ']', + '^', + '_', + '{', + '|', + '}', + '~', +]; + +export const decode83 = (str) => { + let value = 0; + let c, digit; + + for (let i = 0; i < str.length; i++) { + c = str[i]; + digit = DIGIT_CHARACTERS.indexOf(c); + value = value * 83 + digit; + } + + return value; +}; + +export const intToRGB = int => ({ + r: Math.max(0, (int >> 16)), + g: Math.max(0, (int >> 8) & 255), + b: Math.max(0, (int & 255)), +}); + +export const getAverageFromBlurhash = blurhash => { + if (!blurhash) { + return null; + } + + return intToRGB(decode83(blurhash.slice(2, 6))); +}; diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 27d96e588..22098d57e 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -192,8 +192,9 @@ class Status extends ImmutablePureComponent { return
    ; } - handleOpenVideo = (media, options) => { - this.props.onOpenVideo(this._properStatus().get('id'), media, options); + handleOpenVideo = (options) => { + const status = this._properStatus(); + this.props.onOpenVideo(status.get('id'), status.getIn(['media_attachments', 0]), options); } handleOpenMedia = (media, index) => { diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index cd29b5489..e20557eb3 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -58,8 +58,8 @@ class DetailedStatus extends ImmutablePureComponent { e.stopPropagation(); } - handleOpenVideo = (media, options) => { - this.props.onOpenVideo(media, options); + handleOpenVideo = (options) => { + this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), options); } handleExpandedToggle = () => { diff --git a/app/javascript/mastodon/features/ui/components/audio_modal.js b/app/javascript/mastodon/features/ui/components/audio_modal.js index a80776b22..0676bd9cf 100644 --- a/app/javascript/mastodon/features/ui/components/audio_modal.js +++ b/app/javascript/mastodon/features/ui/components/audio_modal.js @@ -4,13 +4,11 @@ import PropTypes from 'prop-types'; import Audio from 'mastodon/features/audio'; import { connect } from 'react-redux'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { FormattedMessage } from 'react-intl'; import { previewState } from './video_modal'; -import classNames from 'classnames'; -import Icon from 'mastodon/components/icon'; +import Footer from 'mastodon/features/picture_in_picture/components/footer'; -const mapStateToProps = (state, { status }) => ({ - account: state.getIn(['accounts', status.get('account')]), +const mapStateToProps = (state, { statusId }) => ({ + accountStaticAvatar: state.getIn(['accounts', state.getIn(['statuses', statusId, 'account']), 'avatar_static']), }); export default @connect(mapStateToProps) @@ -18,12 +16,13 @@ class AudioModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, - status: ImmutablePropTypes.map, + statusId: PropTypes.string.isRequired, + accountStaticAvatar: PropTypes.string.isRequired, options: PropTypes.shape({ autoPlay: PropTypes.bool, }), - account: ImmutablePropTypes.map, onClose: PropTypes.func.isRequired, + onChangeBackgroundColor: PropTypes.func.isRequired, }; static contextTypes = { @@ -52,15 +51,8 @@ class AudioModal extends ImmutablePureComponent { } } - handleStatusClick = e => { - if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { - e.preventDefault(); - this.context.router.history.push(`/statuses/${this.props.status.get('id')}`); - } - } - render () { - const { media, status, account } = this.props; + const { media, accountStaticAvatar, statusId, onClose } = this.props; const options = this.props.options || {}; return ( @@ -71,7 +63,7 @@ class AudioModal extends ImmutablePureComponent { alt={media.get('description')} duration={media.getIn(['meta', 'original', 'duration'], 0)} height={150} - poster={media.get('preview_url') || account.get('avatar_static')} + poster={media.get('preview_url') || accountStaticAvatar} backgroundColor={media.getIn(['meta', 'colors', 'background'])} foregroundColor={media.getIn(['meta', 'colors', 'foreground'])} accentColor={media.getIn(['meta', 'colors', 'accent'])} @@ -79,11 +71,9 @@ class AudioModal extends ImmutablePureComponent { />
    - {status && ( -
    - -
    - )} +
    + {statusId &&
    } +
    ); } diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js index 58cef1e9d..7fe7ed094 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.js +++ b/app/javascript/mastodon/features/ui/components/media_modal.js @@ -12,6 +12,7 @@ import Icon from 'mastodon/components/icon'; import GIFV from 'mastodon/components/gifv'; import { disableSwiping } from 'mastodon/initial_state'; import Footer from 'mastodon/features/picture_in_picture/components/footer'; +import { getAverageFromBlurhash } from 'mastodon/blurhash'; const messages = defineMessages({ close: { id: 'lightbox.close', defaultMessage: 'Close' }, @@ -21,111 +22,6 @@ const messages = defineMessages({ export const previewState = 'previewMediaModal'; -const digitCharacters = [ - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'A', - 'B', - 'C', - 'D', - 'E', - 'F', - 'G', - 'H', - 'I', - 'J', - 'K', - 'L', - 'M', - 'N', - 'O', - 'P', - 'Q', - 'R', - 'S', - 'T', - 'U', - 'V', - 'W', - 'X', - 'Y', - 'Z', - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', - 'g', - 'h', - 'i', - 'j', - 'k', - 'l', - 'm', - 'n', - 'o', - 'p', - 'q', - 'r', - 's', - 't', - 'u', - 'v', - 'w', - 'x', - 'y', - 'z', - '#', - '$', - '%', - '*', - '+', - ',', - '-', - '.', - ':', - ';', - '=', - '?', - '@', - '[', - ']', - '^', - '_', - '{', - '|', - '}', - '~', -]; - -const decode83 = (str) => { - let value = 0; - let c, digit; - - for (let i = 0; i < str.length; i++) { - c = str[i]; - digit = digitCharacters.indexOf(c); - value = value * 83 + digit; - } - - return value; -}; - -const decodeRGB = int => ({ - r: Math.max(0, (int >> 16)), - g: Math.max(0, (int >> 8) & 255), - b: Math.max(0, (int & 255)), -}); - export default @injectIntl class MediaModal extends ImmutablePureComponent { @@ -224,7 +120,7 @@ class MediaModal extends ImmutablePureComponent { const blurhash = media.getIn([index, 'blurhash']); if (blurhash) { - const backgroundColor = decodeRGB(decode83(blurhash.slice(2, 6))); + const backgroundColor = getAverageFromBlurhash(blurhash); onChangeBackgroundColor(backgroundColor); } } diff --git a/app/javascript/mastodon/features/ui/components/video_modal.js b/app/javascript/mastodon/features/ui/components/video_modal.js index 2c3c026c8..2f13a175a 100644 --- a/app/javascript/mastodon/features/ui/components/video_modal.js +++ b/app/javascript/mastodon/features/ui/components/video_modal.js @@ -3,6 +3,8 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Video from 'mastodon/features/video'; import ImmutablePureComponent from 'react-immutable-pure-component'; +import Footer from 'mastodon/features/picture_in_picture/components/footer'; +import { getAverageFromBlurhash } from 'mastodon/blurhash'; export const previewState = 'previewVideoModal'; @@ -17,6 +19,7 @@ export default class VideoModal extends ImmutablePureComponent { defaultVolume: PropTypes.number, }), onClose: PropTypes.func.isRequired, + onChangeBackgroundColor: PropTypes.func.isRequired, }; static contextTypes = { @@ -24,29 +27,35 @@ export default class VideoModal extends ImmutablePureComponent { }; componentDidMount () { - if (this.context.router) { - const history = this.context.router.history; + const { router } = this.context; + const { media, onChangeBackgroundColor, onClose } = this.props; - history.push(history.location.pathname, previewState); + if (router) { + router.history.push(router.history.location.pathname, previewState); + this.unlistenHistory = router.history.listen(() => onClose()); + } - this.unlistenHistory = history.listen(() => { - this.props.onClose(); - }); + const backgroundColor = getAverageFromBlurhash(media.get('blurhash')); + + if (backgroundColor) { + onChangeBackgroundColor(backgroundColor); } } componentWillUnmount () { - if (this.context.router) { + const { router } = this.context; + + if (router) { this.unlistenHistory(); - if (this.context.router.history.location.state === previewState) { - this.context.router.history.goBack(); + if (router.history.location.state === previewState) { + router.history.goBack(); } } } render () { - const { media, onClose } = this.props; + const { media, statusId, onClose } = this.props; const options = this.props.options || {}; return ( @@ -65,6 +74,10 @@ export default class VideoModal extends ImmutablePureComponent { alt={media.get('description')} /> + +
    + {statusId &&
    } +
    ); } diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js index 46eaebd9b..a2dccdfc0 100644 --- a/app/javascript/mastodon/features/video/index.js +++ b/app/javascript/mastodon/features/video/index.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { fromJS, is } from 'immutable'; +import { is } from 'immutable'; import { throttle, debounce } from 'lodash'; import classNames from 'classnames'; import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen'; @@ -495,25 +495,13 @@ class Video extends React.PureComponent { } handleOpenVideo = () => { - const { src, preview, width, height, alt } = this.props; + this.video.pause(); - const media = fromJS({ - type: 'video', - url: src, - preview_url: preview, - description: alt, - width, - height, - }); - - const options = { + this.props.onOpenVideo({ startTime: this.video.currentTime, autoPlay: !this.state.paused, defaultVolume: this.state.volume, - }; - - this.video.pause(); - this.props.onOpenVideo(media, options); + }); } handleCloseVideo = () => { From 48bef17cc990afda95c4de657f7643c321e62650 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 7 Dec 2020 12:08:30 +0100 Subject: [PATCH 24/83] Fix slow distinct queries where grouped queries are faster (#15287) About 2x speed-up on inboxes query --- app/controllers/accounts_controller.rb | 2 +- app/controllers/admin/statuses_controller.rb | 2 +- app/models/account.rb | 2 +- app/models/form/account_batch.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index ccb5ef8e8..b902ada09 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -81,7 +81,7 @@ class AccountsController < ApplicationController end def account_media_status_ids - @account.media_attachments.attached.reorder(nil).select(:status_id).distinct + @account.media_attachments.attached.reorder(nil).select(:status_id).group(:status_id) end def no_replies_scope diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb index 650195034..d7c192f0d 100644 --- a/app/controllers/admin/statuses_controller.rb +++ b/app/controllers/admin/statuses_controller.rb @@ -14,7 +14,7 @@ module Admin @statuses = @account.statuses.where(visibility: [:public, :unlisted]) if params[:media] - account_media_status_ids = @account.media_attachments.attached.reorder(nil).select(:status_id).distinct + account_media_status_ids = @account.media_attachments.attached.reorder(nil).select(:status_id).group(:status_id) @statuses.merge!(Status.where(id: account_media_status_ids)) end diff --git a/app/models/account.rb b/app/models/account.rb index f794d8a29..ed11a514d 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -443,7 +443,7 @@ class Account < ApplicationRecord end def inboxes - urls = reorder(nil).where(protocol: :activitypub).pluck(Arel.sql("distinct coalesce(nullif(accounts.shared_inbox_url, ''), accounts.inbox_url)")) + urls = reorder(nil).where(protocol: :activitypub).group(:preferred_inbox_url).pluck(Arel.sql("coalesce(nullif(accounts.shared_inbox_url, ''), accounts.inbox_url) AS preferred_inbox_url")) DeliveryFailureTracker.without_unavailable(urls) end diff --git a/app/models/form/account_batch.rb b/app/models/form/account_batch.rb index 882770d7c..26d6d3abf 100644 --- a/app/models/form/account_batch.rb +++ b/app/models/form/account_batch.rb @@ -51,7 +51,7 @@ class Form::AccountBatch end def account_domains - accounts.pluck(Arel.sql('distinct domain')).compact + accounts.group(:domain).pluck(:domain).compact end def accounts From 9620ee90be7e04b3616ce4b851abb63dbba7af7f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 7 Dec 2020 19:36:36 +0100 Subject: [PATCH 25/83] Fix unnecessary re-rendering of various components when typing in web UI (#15286) --- app/javascript/mastodon/components/status.js | 8 ++++---- .../mastodon/containers/status_container.js | 9 +++------ .../status/components/detailed_status.js | 9 ++++++--- .../mastodon/features/status/index.js | 19 ++++++++++++------- .../features/ui/components/columns_area.js | 9 +++++++-- app/javascript/mastodon/selectors/index.js | 12 +++++++++++- 6 files changed, 43 insertions(+), 23 deletions(-) diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 22098d57e..18e0e87c8 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -97,7 +97,7 @@ class Status extends ImmutablePureComponent { cachedMediaWidth: PropTypes.number, scrollKey: PropTypes.string, deployPictureInPicture: PropTypes.func, - pictureInPicture: PropTypes.shape({ + pictureInPicture: ImmutablePropTypes.contains({ inUse: PropTypes.bool, available: PropTypes.bool, }), @@ -354,7 +354,7 @@ class Status extends ImmutablePureComponent { status = status.get('reblog'); } - if (pictureInPicture.inUse) { + if (pictureInPicture.get('inUse')) { media = ; } else if (status.get('media_attachments').size > 0) { if (this.props.muted) { @@ -381,7 +381,7 @@ class Status extends ImmutablePureComponent { width={this.props.cachedMediaWidth} height={110} cacheWidth={this.props.cacheMediaWidth} - deployPictureInPicture={pictureInPicture.available ? this.handleDeployPictureInPicture : undefined} + deployPictureInPicture={pictureInPicture.get('available') ? this.handleDeployPictureInPicture : undefined} /> )} @@ -404,7 +404,7 @@ class Status extends ImmutablePureComponent { sensitive={status.get('sensitive')} onOpenVideo={this.handleOpenVideo} cacheWidth={this.props.cacheMediaWidth} - deployPictureInPicture={pictureInPicture.available ? this.handleDeployPictureInPicture : undefined} + deployPictureInPicture={pictureInPicture.get('available') ? this.handleDeployPictureInPicture : undefined} visible={this.state.showMedia} onToggleVisibility={this.handleToggleMediaVisibility} /> diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js index ef520b96a..d6bcb8973 100644 --- a/app/javascript/mastodon/containers/status_container.js +++ b/app/javascript/mastodon/containers/status_container.js @@ -1,7 +1,7 @@ import React from 'react'; import { connect } from 'react-redux'; import Status from '../components/status'; -import { makeGetStatus } from '../selectors'; +import { makeGetStatus, makeGetPictureInPicture } from '../selectors'; import { replyCompose, mentionCompose, @@ -54,14 +54,11 @@ const messages = defineMessages({ const makeMapStateToProps = () => { const getStatus = makeGetStatus(); + const getPictureInPicture = makeGetPictureInPicture(); const mapStateToProps = (state, props) => ({ status: getStatus(state, props), - - pictureInPicture: { - inUse: state.getIn(['meta', 'layout']) !== 'mobile' && state.get('picture_in_picture').statusId === props.id, - available: state.getIn(['meta', 'layout']) !== 'mobile', - }, + pictureInPicture: getPictureInPicture(state, props), }); return mapStateToProps; diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index e20557eb3..043a749ed 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -41,7 +41,10 @@ class DetailedStatus extends ImmutablePureComponent { domain: PropTypes.string.isRequired, compact: PropTypes.bool, showMedia: PropTypes.bool, - usingPiP: PropTypes.bool, + pictureInPicture: ImmutablePropTypes.contains({ + inUse: PropTypes.bool, + available: PropTypes.bool, + }), onToggleMediaVisibility: PropTypes.func, }; @@ -102,7 +105,7 @@ class DetailedStatus extends ImmutablePureComponent { render () { const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; const outerStyle = { boxSizing: 'border-box' }; - const { intl, compact, usingPiP } = this.props; + const { intl, compact, pictureInPicture } = this.props; if (!status) { return null; @@ -118,7 +121,7 @@ class DetailedStatus extends ImmutablePureComponent { outerStyle.height = `${this.state.height}px`; } - if (usingPiP) { + if (pictureInPicture.get('inUse')) { media = ; } else if (status.get('media_attachments').size > 0) { if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index c5e7ba776..09822f372 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -43,7 +43,7 @@ import { import { initMuteModal } from '../../actions/mutes'; import { initBlockModal } from '../../actions/blocks'; import { initReport } from '../../actions/reports'; -import { makeGetStatus } from '../../selectors'; +import { makeGetStatus, makeGetPictureInPicture } from '../../selectors'; import { ScrollContainer } from 'react-router-scroll-4'; import ColumnBackButton from '../../components/column_back_button'; import ColumnHeader from '../../components/column_header'; @@ -72,6 +72,7 @@ const messages = defineMessages({ const makeMapStateToProps = () => { const getStatus = makeGetStatus(); + const getPictureInPicture = makeGetPictureInPicture(); const getAncestorsIds = createSelector([ (_, { id }) => id, @@ -129,11 +130,12 @@ const makeMapStateToProps = () => { const mapStateToProps = (state, props) => { const status = getStatus(state, { id: props.params.statusId }); - let ancestorsIds = Immutable.List(); + + let ancestorsIds = Immutable.List(); let descendantsIds = Immutable.List(); if (status) { - ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') }); + ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') }); descendantsIds = getDescendantsIds(state, { id: status.get('id') }); } @@ -143,7 +145,7 @@ const makeMapStateToProps = () => { descendantsIds, askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0, domain: state.getIn(['meta', 'domain']), - usingPiP: state.get('picture_in_picture').statusId === props.params.statusId, + pictureInPicture: getPictureInPicture(state, { id: props.params.statusId }), }; }; @@ -168,7 +170,10 @@ class Status extends ImmutablePureComponent { askReplyConfirmation: PropTypes.bool, multiColumn: PropTypes.bool, domain: PropTypes.string.isRequired, - usingPiP: PropTypes.bool, + pictureInPicture: ImmutablePropTypes.contains({ + inUse: PropTypes.bool, + available: PropTypes.bool, + }), }; state = { @@ -492,7 +497,7 @@ class Status extends ImmutablePureComponent { render () { let ancestors, descendants; - const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn, usingPiP } = this.props; + const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props; const { fullscreen } = this.state; if (status === null) { @@ -550,7 +555,7 @@ class Status extends ImmutablePureComponent { domain={domain} showMedia={this.state.showMedia} onToggleMediaVisibility={this.handleToggleMediaVisibility} - usingPiP={usingPiP} + pictureInPicture={pictureInPicture} /> state.getIn(['accounts', id], null); @@ -121,6 +121,16 @@ export const makeGetStatus = () => { ); }; +export const makeGetPictureInPicture = () => { + return createSelector([ + (state, { id }) => state.get('picture_in_picture').statusId === id, + (state) => state.getIn(['meta', 'layout']) !== 'mobile', + ], (inUse, available) => ImmutableMap({ + inUse: inUse && available, + available, + })); +}; + const getAlertsBase = state => state.get('alerts'); export const getAlerts = createSelector([getAlertsBase], (base) => { From 0b437325dc93a1d28202b5ff30eaafc9b4e571b7 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 7 Dec 2020 20:07:24 +0100 Subject: [PATCH 26/83] Fix column swiping animation logic (#15301) From the start, swiping columns was highly unreliable because the logic could change `ReactSwipeableViews`'s `animateTransitions` property mid-swipe. PR #11200 partially fixed this, but at the unintended cost of disabling the swipe animation altogether. This PR changes the logic behind `shouldAnimate` to only disable the swiping animation at the end of a column change not initiated by `ReactSwipeableViews`. Co-authored-by: Claire --- .../mastodon/features/ui/components/columns_area.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js index cf02e9be7..6837450eb 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.js +++ b/app/javascript/mastodon/features/ui/components/columns_area.js @@ -75,7 +75,9 @@ class ColumnsArea extends ImmutablePureComponent { } componentWillReceiveProps() { - this.setState({ shouldAnimate: false }); + if (typeof this.pendingIndex !== 'number' && this.lastIndex !== getIndex(this.context.router.history.location.pathname)) { + this.setState({ shouldAnimate: false }); + } } componentDidMount() { From 765626a3a766ce212e73a1a51f6a048cc19ffc63 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Tue, 8 Dec 2020 20:07:54 +0900 Subject: [PATCH 27/83] Fix the Open handler for PreviewCard (#15305) --- app/javascript/mastodon/components/status.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 18e0e87c8..d9e7347f8 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -432,7 +432,7 @@ class Status extends ImmutablePureComponent { } else if (status.get('spoiler_text').length === 0 && status.get('card')) { media = ( Date: Wed, 9 Dec 2020 08:24:13 +0900 Subject: [PATCH 28/83] Fix open media hotkey (#15308) * Fix open media hotkey * Update status.js Co-authored-by: Eugen Rochko --- app/javascript/mastodon/components/status.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index d9e7347f8..295e83f58 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -203,15 +203,15 @@ class Status extends ImmutablePureComponent { handleHotkeyOpenMedia = e => { const { onOpenMedia, onOpenVideo } = this.props; - const statusId = this._properStatus().get('id'); + const status = this._properStatus(); e.preventDefault(); if (status.get('media_attachments').size > 0) { if (status.getIn(['media_attachments', 0, 'type']) === 'video') { - onOpenVideo(statusId, status.getIn(['media_attachments', 0]), { startTime: 0 }); + onOpenVideo(status.get('id'), status.getIn(['media_attachments', 0]), { startTime: 0 }); } else { - onOpenMedia(statusId, status.get('media_attachments'), 0); + onOpenMedia(status.get('id'), status.get('media_attachments'), 0); } } } From f379a52d745dbd765b4ba1fb3133ed6fad3e7c1b Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Wed, 9 Dec 2020 12:33:33 +0900 Subject: [PATCH 29/83] Fix missing pictureInPicture prop in detailed status container (#15309) --- .../features/status/containers/detailed_status_container.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js index 6d5c33240..0ac4519c8 100644 --- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js +++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import DetailedStatus from '../components/detailed_status'; -import { makeGetStatus } from '../../../selectors'; +import { makeGetStatus, makeGetPictureInPicture } from '../../../selectors'; import { replyCompose, mentionCompose, @@ -40,10 +40,12 @@ const messages = defineMessages({ const makeMapStateToProps = () => { const getStatus = makeGetStatus(); + const getPictureInPicture = makeGetPictureInPicture(); const mapStateToProps = (state, props) => ({ status: getStatus(state, props), domain: state.getIn(['meta', 'domain']), + pictureInPicture: getPictureInPicture(state, props), }); return mapStateToProps; From 127c543a6e59d20de68e6760e952d18ed53578e9 Mon Sep 17 00:00:00 2001 From: trwnh Date: Tue, 8 Dec 2020 21:34:17 -0600 Subject: [PATCH 30/83] rename replies_policy enumerables (#15304) --- app/javascript/mastodon/features/list_timeline/index.js | 8 ++++---- app/lib/feed_manager.rb | 4 ++-- app/models/list.rb | 4 ++-- spec/lib/feed_manager_spec.rb | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/javascript/mastodon/features/list_timeline/index.js b/app/javascript/mastodon/features/list_timeline/index.js index a3be8fbea..02b018247 100644 --- a/app/javascript/mastodon/features/list_timeline/index.js +++ b/app/javascript/mastodon/features/list_timeline/index.js @@ -20,9 +20,9 @@ import RadioButton from 'mastodon/components/radio_button'; const messages = defineMessages({ deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' }, deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' }, - all_replies: { id: 'lists.replies_policy.all_replies', defaultMessage: 'Any followed user' }, - no_replies: { id: 'lists.replies_policy.no_replies', defaultMessage: 'No one' }, - list_replies: { id: 'lists.replies_policy.list_replies', defaultMessage: 'Members of the list' }, + followed: { id: 'lists.replies_policy.followed', defaultMessage: 'Any followed user' }, + none: { id: 'lists.replies_policy.none', defaultMessage: 'No one' }, + list: { id: 'lists.replies_policy.list', defaultMessage: 'Members of the list' }, }); const mapStateToProps = (state, props) => ({ @@ -193,7 +193,7 @@ class ListTimeline extends React.PureComponent {
    - { ['no_replies', 'list_replies', 'all_replies'].map(policy => ( + { ['none', 'list', 'followed'].map(policy => ( ))}
    diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 0876d107b..5e01ef67a 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -345,8 +345,8 @@ class FeedManager def filter_from_list?(status, list) if status.reply? && status.in_reply_to_account_id != status.account_id should_filter = status.in_reply_to_account_id != list.account_id - should_filter &&= !list.show_all_replies? - should_filter &&= !(list.show_list_replies? && ListAccount.where(list_id: list.id, account_id: status.in_reply_to_account_id).exists?) + should_filter &&= !list.show_followed? + should_filter &&= !(list.show_list? && ListAccount.where(list_id: list.id, account_id: status.in_reply_to_account_id).exists?) return !!should_filter end diff --git a/app/models/list.rb b/app/models/list.rb index 8493046e5..655d55ff6 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -8,7 +8,7 @@ # title :string default(""), not null # created_at :datetime not null # updated_at :datetime not null -# replies_policy :integer default("list_replies"), not null +# replies_policy :integer default("list"), not null # class List < ApplicationRecord @@ -16,7 +16,7 @@ class List < ApplicationRecord PER_ACCOUNT_LIMIT = 50 - enum replies_policy: [:list_replies, :all_replies, :no_replies], _prefix: :show + enum replies_policy: [:list, :followed, :none], _prefix: :show belongs_to :account, optional: true diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index 7d775a86d..0df85e5bc 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -335,7 +335,7 @@ RSpec.describe FeedManager do context 'when replies policy is set to no replies' do before do - list.replies_policy = :no_replies + list.replies_policy = :none end it 'pushes statuses that are not replies' do @@ -358,7 +358,7 @@ RSpec.describe FeedManager do context 'when replies policy is set to list-only replies' do before do - list.replies_policy = :list_replies + list.replies_policy = :list end it 'pushes statuses that are not replies' do @@ -387,7 +387,7 @@ RSpec.describe FeedManager do context 'when replies policy is set to any reply' do before do - list.replies_policy = :all_replies + list.replies_policy = :followed end it 'pushes statuses that are not replies' do From 9669167aaeaa834dcc99fa7df961c4f9b8118850 Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 9 Dec 2020 19:16:30 +0100 Subject: [PATCH 31/83] Fix notifications being unnecessarily redrawn on state change (#15312) Co-authored-by: Claire --- app/javascript/mastodon/features/notifications/index.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js index 73df7f49d..2e0afd863 100644 --- a/app/javascript/mastodon/features/notifications/index.js +++ b/app/javascript/mastodon/features/notifications/index.js @@ -32,10 +32,16 @@ const messages = defineMessages({ markAsRead : { id: 'notifications.mark_as_read', defaultMessage: 'Mark every notification as read' }, }); +const getExcludedTypes = createSelector([ + state => state.getIn(['settings', 'notifications', 'shows']), +], (shows) => { + return ImmutableList(shows.filter(item => !item).keys()); +}); + const getNotifications = createSelector([ state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']), state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']), - state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()), + getExcludedTypes, state => state.getIn(['notifications', 'items']), ], (showFilterBar, allowedType, excludedTypes, notifications) => { if (!showFilterBar || allowedType === 'all') { From 49eb4d4ddf61e25c5aaab89aa630ddd3c7f3c23d Mon Sep 17 00:00:00 2001 From: ThibG Date: Thu, 10 Dec 2020 06:27:26 +0100 Subject: [PATCH 32/83] Add honeypot fields and minimum fill-out time for sign-up form (#15276) * Add honeypot fields to limit non-specialized spam Add two honeypot fields: a fake website input and a fake password confirmation one. The label/placeholder/aria-label tells not to fill them, and they are hidden in CSS, so legitimate users should not fall into these. This should cut down on some non-Mastodon-specific spambots. * Require a 3 seconds delay before submitting the registration form * Fix tests * Move registration form time check to model validation * Give people a chance to clear the honeypot fields * Refactor honeypot translation strings Co-authored-by: Claire --- app/controllers/about_controller.rb | 5 ++++- app/controllers/auth/registrations_controller.rb | 11 +++++++---- app/controllers/concerns/registration_spam_concern.rb | 9 +++++++++ app/javascript/packs/public.js | 11 +++++++++++ app/javascript/styles/mastodon/forms.scss | 8 ++++++++ app/models/user.rb | 7 +++++++ app/validators/registration_form_time_validator.rb | 9 +++++++++ app/views/about/_registration.html.haml | 3 +++ app/views/auth/registrations/new.html.haml | 3 +++ app/views/shared/_error_messages.html.haml | 3 +++ config/locales/en.yml | 1 + config/locales/simple_form.en.yml | 1 + .../controllers/auth/registrations_controller_spec.rb | 4 ++++ 13 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 app/controllers/concerns/registration_spam_concern.rb create mode 100644 app/validators/registration_form_time_validator.rb diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index abd1ec0cb..dcad5d3b4 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -1,12 +1,15 @@ # frozen_string_literal: true class AboutController < ApplicationController + include RegistrationSpamConcern + layout 'public' before_action :require_open_federation!, only: [:show, :more] before_action :set_body_classes, only: :show before_action :set_instance_presenter - before_action :set_expires_in, only: [:show, :more, :terms] + before_action :set_expires_in, only: [:more, :terms] + before_action :set_registration_form_time, only: :show skip_before_action :require_functional!, only: [:more, :terms] diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index eb0924190..a3114ab25 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -2,6 +2,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController include Devise::Controllers::Rememberable + include RegistrationSpamConcern layout :determine_layout @@ -13,6 +14,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :set_body_classes, only: [:new, :create, :edit, :update] before_action :require_not_suspended!, only: [:update] before_action :set_cache_headers, only: [:edit, :update] + before_action :set_registration_form_time, only: :new skip_before_action :require_functional!, only: [:edit, :update] @@ -45,16 +47,17 @@ class Auth::RegistrationsController < Devise::RegistrationsController def build_resource(hash = nil) super(hash) - resource.locale = I18n.locale - resource.invite_code = params[:invite_code] if resource.invite_code.blank? - resource.sign_up_ip = request.remote_ip + resource.locale = I18n.locale + resource.invite_code = params[:invite_code] if resource.invite_code.blank? + resource.registration_form_time = session[:registration_form_time] + resource.sign_up_ip = request.remote_ip resource.build_account if resource.account.nil? end def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up) do |u| - u.permit({ account_attributes: [:username], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement) + u.permit({ account_attributes: [:username], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement, :website, :confirm_password) end end diff --git a/app/controllers/concerns/registration_spam_concern.rb b/app/controllers/concerns/registration_spam_concern.rb new file mode 100644 index 000000000..af434c985 --- /dev/null +++ b/app/controllers/concerns/registration_spam_concern.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module RegistrationSpamConcern + extend ActiveSupport::Concern + + def set_registration_form_time + session[:registration_form_time] = Time.now.utc + end +end diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 39defa7ae..8c5c15b8f 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -280,6 +280,17 @@ function main() { target.style.display = 'block'; } }); + + // Empty the honeypot fields in JS in case something like an extension + // automatically filled them. + delegate(document, '#registration_new_user,#new_user', 'submit', () => { + ['user_website', 'user_confirm_password', 'registration_user_website', 'registration_user_confirm_password'].forEach(id => { + const field = document.getElementById(id); + if (field) { + field.value = ''; + } + }); + }); } loadPolyfills() diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index a54a5fded..92d89e6f2 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -354,6 +354,7 @@ code { input[type=number], input[type=email], input[type=password], + input[type=url], textarea { box-sizing: border-box; font-size: 16px; @@ -994,3 +995,10 @@ code { flex-direction: row; } } + +.input.user_confirm_password, +.input.user_website { + &:not(.field_with_errors) { + display: none; + } +} diff --git a/app/models/user.rb b/app/models/user.rb index 94fee999a..981dc6d47 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -89,6 +89,13 @@ class User < ApplicationRecord validates_with EmailMxValidator, if: :validate_email_dns? validates :agreement, acceptance: { allow_nil: false, accept: [true, 'true', '1'] }, on: :create + # Those are honeypot/antispam fields + attr_accessor :registration_form_time, :website, :confirm_password + + validates_with RegistrationFormTimeValidator, on: :create + validates :website, absence: true, on: :create + validates :confirm_password, absence: true, on: :create + scope :recent, -> { order(id: :desc) } scope :pending, -> { where(approved: false) } scope :approved, -> { where(approved: true) } diff --git a/app/validators/registration_form_time_validator.rb b/app/validators/registration_form_time_validator.rb new file mode 100644 index 000000000..ba7c7e6c6 --- /dev/null +++ b/app/validators/registration_form_time_validator.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RegistrationFormTimeValidator < ActiveModel::Validator + REGISTRATION_FORM_MIN_TIME = 3.seconds.freeze + + def validate(user) + user.errors.add(:base, I18n.t('auth.too_fast')) if user.registration_form_time.present? && user.registration_form_time > REGISTRATION_FORM_MIN_TIME.ago + end +end diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index 5d159e9e6..6160ca4d4 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -10,6 +10,9 @@ = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off', :minlength => User.password_length.first, :maxlength => User.password_length.last }, hint: false, disabled: closed_registrations? = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations? + = f.input :confirm_password, as: :string, placeholder: t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), :autocomplete => 'off' }, hint: false, disabled: closed_registrations? + = f.input :website, as: :url, placeholder: t('simple_form.labels.defaults.honeypot', label: 'Website'), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: 'Website'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations? + - if approved_registrations? .fields-group = f.simple_fields_for :invite_request do |invite_request_fields| diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index cc72b87ce..de541847f 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -24,6 +24,9 @@ .fields-group = f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' } + = f.input :confirm_password, as: :string, wrapper: :with_label, label: t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), :autocomplete => 'off' } + + = f.input :website, as: :url, wrapper: :with_label, label: t('simple_form.labels.defaults.honeypot', label: 'Website'), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: 'Website'), :autocomplete => 'off' } - if approved_registrations? && !@invite.present? .fields-group diff --git a/app/views/shared/_error_messages.html.haml b/app/views/shared/_error_messages.html.haml index 28becd6c4..4916bd424 100644 --- a/app/views/shared/_error_messages.html.haml +++ b/app/views/shared/_error_messages.html.haml @@ -1,3 +1,6 @@ - if object.errors.any? .flash-message.alert#error_explanation %strong= t('generic.validation_errors', count: object.errors.count) +- object.errors[:base].each do |error| + .flash-message.alert + %strong= error diff --git a/config/locales/en.yml b/config/locales/en.yml index 263ffcdc7..59f561aa3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -751,6 +751,7 @@ en: functional: Your account is fully operational. pending: Your application is pending review by our staff. This may take some time. You will receive an e-mail if your application is approved. redirecting_to: Your account is inactive because it is currently redirecting to %{acct}. + too_fast: Form submitted too fast, try again. trouble_logging_in: Trouble logging in? use_security_key: Use security key authorize_follow: diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 46a4759a8..20c916560 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -126,6 +126,7 @@ en: expires_in: Expire after fields: Profile metadata header: Header + honeypot: "%{label} (do not fill in)" inbox_url: URL of the relay inbox irreversible: Drop instead of hide locale: Interface language diff --git a/spec/controllers/auth/registrations_controller_spec.rb b/spec/controllers/auth/registrations_controller_spec.rb index bef822763..c701a3b8b 100644 --- a/spec/controllers/auth/registrations_controller_spec.rb +++ b/spec/controllers/auth/registrations_controller_spec.rb @@ -82,6 +82,10 @@ RSpec.describe Auth::RegistrationsController, type: :controller do describe 'POST #create' do let(:accept_language) { Rails.application.config.i18n.available_locales.sample.to_s } + before do + session[:registration_form_time] = 5.seconds.ago + end + around do |example| current_locale = I18n.locale example.run From a3b5675aa83f7fec4036888e0d94b626ad973f75 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 14 Dec 2020 05:09:14 +0100 Subject: [PATCH 33/83] Change number format on about page from full to shortened (#15327) --- app/views/about/more.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index c2168e1f5..109b5fa86 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -17,11 +17,11 @@ .row__information-board .information-board__section %span= t 'about.user_count_before' - %strong= number_with_delimiter @instance_presenter.user_count + %strong= number_to_human @instance_presenter.user_count, strip_insignificant_zeros: true %span= t 'about.user_count_after', count: @instance_presenter.user_count .information-board__section %span= t 'about.status_count_before' - %strong= number_with_delimiter @instance_presenter.status_count + %strong= number_to_human @instance_presenter.status_count, strip_insignificant_zeros: true %span= t 'about.status_count_after', count: @instance_presenter.status_count .row__mascot .landing-page__mascot From 216b85b053d091306e3311a21f5b050f70a75130 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 14 Dec 2020 09:06:34 +0100 Subject: [PATCH 34/83] Fix performance on instances list in admin UI (#15282) - Reduce duplicate queries - Remove n+1 queries - Add accounts count to detailed view - Add separate action log entry for updating existing domain blocks --- Gemfile | 1 + Gemfile.lock | 4 + .../admin/domain_blocks_controller.rb | 5 +- app/controllers/admin/instances_controller.rb | 44 +------- .../api/v1/instances/peers_controller.rb | 2 +- app/models/account.rb | 6 +- app/models/concerns/domain_materializable.rb | 13 +++ app/models/domain_allow.rb | 1 + app/models/domain_block.rb | 1 + app/models/instance.rb | 65 ++++++++--- app/models/instance_filter.rb | 31 ++++-- app/models/unavailable_domain.rb | 2 + app/policies/domain_block_policy.rb | 4 + app/presenters/instance_presenter.rb | 2 +- app/views/admin/instances/_instance.html.haml | 25 +++++ app/views/admin/instances/index.html.haml | 34 ++---- app/views/admin/instances/show.html.haml | 60 ++++++----- .../scheduler/instance_refresh_scheduler.rb | 11 ++ config/brakeman.ignore | 101 +++++++++++++++--- config/locales/en.yml | 3 + config/sidekiq.yml | 3 + db/migrate/20201206004238_create_instances.rb | 9 ++ db/schema.rb | 27 ++++- db/views/instances_v01.sql | 17 +++ lib/mastodon/domains_cli.rb | 4 +- .../admin/instances_controller_spec.rb | 6 +- spec/models/account_spec.rb | 21 ---- 27 files changed, 331 insertions(+), 171 deletions(-) create mode 100644 app/models/concerns/domain_materializable.rb create mode 100644 app/views/admin/instances/_instance.html.haml create mode 100644 app/workers/scheduler/instance_refresh_scheduler.rb create mode 100644 db/migrate/20201206004238_create_instances.rb create mode 100644 db/views/instances_v01.sql diff --git a/Gemfile b/Gemfile index 63becb7cc..3aee5d7cc 100644 --- a/Gemfile +++ b/Gemfile @@ -82,6 +82,7 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' gem 'rqrcode', '~> 1.1' gem 'ruby-progressbar', '~> 1.10' gem 'sanitize', '~> 5.2' +gem 'scenic', '~> 1.5' gem 'sidekiq', '~> 6.1' gem 'sidekiq-scheduler', '~> 3.0' gem 'sidekiq-unique-jobs', '~> 6.0' diff --git a/Gemfile.lock b/Gemfile.lock index f7192d084..c4c8d9904 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -561,6 +561,9 @@ GEM crass (~> 1.0.2) nokogiri (>= 1.8.0) nokogumbo (~> 2.0) + scenic (1.5.4) + activerecord (>= 4.0.0) + railties (>= 4.0.0) securecompare (1.0.0) semantic_range (2.3.0) sidekiq (6.1.2) @@ -782,6 +785,7 @@ DEPENDENCIES rubocop-rails (~> 2.8) ruby-progressbar (~> 1.10) sanitize (~> 5.2) + scenic (~> 1.5) sidekiq (~> 6.1) sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 3.0) diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index 74a36b79c..6a5b41a74 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -29,6 +29,7 @@ module Admin @domain_block = existing_domain_block @domain_block.update(resource_params) end + if @domain_block.save DomainBlockWorker.perform_async(@domain_block.id) log_action :create, @domain_block @@ -40,7 +41,7 @@ module Admin end def update - authorize :domain_block, :create? + authorize :domain_block, :update? @domain_block.update(update_params) @@ -48,7 +49,7 @@ module Admin if @domain_block.save DomainBlockWorker.perform_async(@domain_block.id, severity_changed) - log_action :create, @domain_block + log_action :update, @domain_block redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg') else render :edit diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb index 1790becbf..b5918d231 100644 --- a/app/controllers/admin/instances_controller.rb +++ b/app/controllers/admin/instances_controller.rb @@ -2,65 +2,31 @@ module Admin class InstancesController < BaseController - before_action :set_domain_block, only: :show - before_action :set_domain_allow, only: :show + before_action :set_instances, only: :index before_action :set_instance, only: :show def index authorize :instance, :index? - - @instances = ordered_instances end def show authorize :instance, :show? - - @following_count = Follow.where(account: Account.where(domain: params[:id])).count - @followers_count = Follow.where(target_account: Account.where(domain: params[:id])).count - @reports_count = Report.where(target_account: Account.where(domain: params[:id])).count - @blocks_count = Block.where(target_account: Account.where(domain: params[:id])).count - @available = DeliveryFailureTracker.available?(params[:id]) - @media_storage = MediaAttachment.where(account: Account.where(domain: params[:id])).sum(:file_file_size) - @private_comment = @domain_block&.private_comment - @public_comment = @domain_block&.public_comment end private - def set_domain_block - @domain_block = DomainBlock.rule_for(params[:id]) - end - - def set_domain_allow - @domain_allow = DomainAllow.rule_for(params[:id]) - end - def set_instance - resource = Account.by_domain_accounts.find_by(domain: params[:id]) - resource ||= @domain_block - resource ||= @domain_allow + @instance = Instance.find(params[:id]) + end - if resource - @instance = Instance.new(resource) - else - not_found - end + def set_instances + @instances = filtered_instances.page(params[:page]) end def filtered_instances InstanceFilter.new(whitelist_mode? ? { allowed: true } : filter_params).results end - def paginated_instances - filtered_instances.page(params[:page]) - end - - helper_method :paginated_instances - - def ordered_instances - paginated_instances.map { |resource| Instance.new(resource) } - end - def filter_params params.slice(*InstanceFilter::KEYS).permit(*InstanceFilter::KEYS) end diff --git a/app/controllers/api/v1/instances/peers_controller.rb b/app/controllers/api/v1/instances/peers_controller.rb index 9fa440935..2877fec52 100644 --- a/app/controllers/api/v1/instances/peers_controller.rb +++ b/app/controllers/api/v1/instances/peers_controller.rb @@ -8,7 +8,7 @@ class Api::V1::Instances::PeersController < Api::BaseController def index expires_in 1.day, public: true - render_with_cache(expires_in: 1.day) { Account.remote.domains } + render_with_cache(expires_in: 1.day) { Instance.where.not(domain: DomainBlock.select(:domain)).pluck(:domain) } end private diff --git a/app/models/account.rb b/app/models/account.rb index ed11a514d..e21b353e9 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -67,6 +67,7 @@ class Account < ApplicationRecord include Paginable include AccountCounters include DomainNormalizable + include DomainMaterializable include AccountMerging TRUST_LEVELS = { @@ -103,7 +104,6 @@ class Account < ApplicationRecord scope :bots, -> { where(actor_type: %w(Application Service)) } scope :groups, -> { where(actor_type: 'Group') } scope :alphabetic, -> { order(domain: :asc, username: :asc) } - scope :by_domain_accounts, -> { group(:domain).select(:domain, 'COUNT(*) AS accounts_count').order('accounts_count desc') } scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) } scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) } scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } @@ -438,10 +438,6 @@ class Account < ApplicationRecord super - %w(statuses_count following_count followers_count) end - def domains - reorder(nil).pluck(Arel.sql('distinct accounts.domain')) - end - def inboxes urls = reorder(nil).where(protocol: :activitypub).group(:preferred_inbox_url).pluck(Arel.sql("coalesce(nullif(accounts.shared_inbox_url, ''), accounts.inbox_url) AS preferred_inbox_url")) DeliveryFailureTracker.without_unavailable(urls) diff --git a/app/models/concerns/domain_materializable.rb b/app/models/concerns/domain_materializable.rb new file mode 100644 index 000000000..88337f8c0 --- /dev/null +++ b/app/models/concerns/domain_materializable.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module DomainMaterializable + extend ActiveSupport::Concern + + included do + after_create_commit :refresh_instances_view + end + + def refresh_instances_view + Instance.refresh unless domain.nil? || Instance.where(domain: domain).exists? + end +end diff --git a/app/models/domain_allow.rb b/app/models/domain_allow.rb index 5fe0e3a29..4b0a89c18 100644 --- a/app/models/domain_allow.rb +++ b/app/models/domain_allow.rb @@ -12,6 +12,7 @@ class DomainAllow < ApplicationRecord include DomainNormalizable + include DomainMaterializable validates :domain, presence: true, uniqueness: true, domain: true diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index 2b18e01fa..829d7583b 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -16,6 +16,7 @@ class DomainBlock < ApplicationRecord include DomainNormalizable + include DomainMaterializable enum severity: [:silence, :suspend, :noop] diff --git a/app/models/instance.rb b/app/models/instance.rb index 3c740f8a2..29be03662 100644 --- a/app/models/instance.rb +++ b/app/models/instance.rb @@ -1,26 +1,63 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: instances +# +# domain :string primary key +# accounts_count :bigint(8) +# -class Instance - include ActiveModel::Model +class Instance < ApplicationRecord + self.primary_key = :domain - attr_accessor :domain, :accounts_count, :domain_block + has_many :accounts, foreign_key: :domain, primary_key: :domain - def initialize(resource) - @domain = resource.domain - @accounts_count = resource.respond_to?(:accounts_count) ? resource.accounts_count : nil - @domain_block = resource.is_a?(DomainBlock) ? resource : DomainBlock.rule_for(domain) - @domain_allow = resource.is_a?(DomainAllow) ? resource : DomainAllow.rule_for(domain) + belongs_to :domain_block, foreign_key: :domain, primary_key: :domain + belongs_to :domain_allow, foreign_key: :domain, primary_key: :domain + + scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } + + def self.refresh + Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false) end - def countable? - @accounts_count.present? + def readonly? + true + end + + def delivery_failure_tracker + @delivery_failure_tracker ||= DeliveryFailureTracker.new(domain) + end + + def following_count + @following_count ||= Follow.where(account: accounts).count + end + + def followers_count + @followers_count ||= Follow.where(target_account: accounts).count + end + + def reports_count + @reports_count ||= Report.where(target_account: accounts).count + end + + def blocks_count + @blocks_count ||= Block.where(target_account: accounts).count + end + + def public_comment + domain_block&.public_comment + end + + def private_comment + domain_block&.private_comment + end + + def media_storage + @media_storage ||= MediaAttachment.where(account: accounts).sum(:file_file_size) end def to_param domain end - - def cache_key - domain - end end diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb index 9c467bc27..0598d8fea 100644 --- a/app/models/instance_filter.rb +++ b/app/models/instance_filter.rb @@ -13,18 +13,27 @@ class InstanceFilter end def results - if params[:limited].present? - scope = DomainBlock - scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present? - scope.order(id: :desc) - elsif params[:allowed].present? - scope = DomainAllow - scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present? - scope.order(id: :desc) + scope = Instance.includes(:domain_block, :domain_allow).order(accounts_count: :desc) + + params.each do |key, value| + scope.merge!(scope_for(key, value.to_s.strip)) if value.present? + end + + scope + end + + private + + def scope_for(key, value) + case key.to_s + when 'limited' + Instance.joins(:domain_block).reorder(Arel.sql('domain_blocks.id desc')) + when 'allowed' + Instance.joins(:domain_allow).reorder(Arel.sql('domain_allows.id desc')) + when 'by_domain' + Instance.matches_domain(value) else - scope = Account.remote - scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present? - scope.by_domain_accounts + raise "Unknown filter: #{key}" end end end diff --git a/app/models/unavailable_domain.rb b/app/models/unavailable_domain.rb index e2918b586..5e8870bde 100644 --- a/app/models/unavailable_domain.rb +++ b/app/models/unavailable_domain.rb @@ -12,6 +12,8 @@ class UnavailableDomain < ApplicationRecord include DomainNormalizable + validates :domain, presence: true, uniqueness: true + after_commit :reset_cache! private diff --git a/app/policies/domain_block_policy.rb b/app/policies/domain_block_policy.rb index 47c0a81af..543259cce 100644 --- a/app/policies/domain_block_policy.rb +++ b/app/policies/domain_block_policy.rb @@ -13,6 +13,10 @@ class DomainBlockPolicy < ApplicationPolicy admin? end + def update? + admin? + end + def destroy? admin? end diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index c150bf742..1bfdd40ac 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -29,7 +29,7 @@ class InstancePresenter end def domain_count - Rails.cache.fetch('distinct_domain_count') { Account.distinct.count(:domain) } + Rails.cache.fetch('distinct_domain_count') { Instance.count } end def sample_accounts diff --git a/app/views/admin/instances/_instance.html.haml b/app/views/admin/instances/_instance.html.haml new file mode 100644 index 000000000..188d0d984 --- /dev/null +++ b/app/views/admin/instances/_instance.html.haml @@ -0,0 +1,25 @@ +.directory__tag + = link_to admin_instance_path(instance) do + %h4 + = instance.domain + %small + - if instance.domain_block + - first_item = true + - if !instance.domain_block.noop? + = t("admin.domain_blocks.severity.#{instance.domain_block.severity}") + - first_item = false + - unless instance.domain_block.suspend? + - if instance.domain_block.reject_media? + - unless first_item + • + = t('admin.domain_blocks.rejecting_media') + - first_item = false + - if instance.domain_block.reject_reports? + - unless first_item + • + = t('admin.domain_blocks.rejecting_reports') + - elsif whitelist_mode? + = t('admin.accounts.whitelisted') + - else + = t('admin.accounts.no_limits_imposed') + .trends__item__current{ title: t('admin.instances.known_accounts', count: instance.accounts_count) }= number_to_human instance.accounts_count, strip_insignificant_zeros: true diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml index 696ba3c7f..5f20e7ec0 100644 --- a/app/views/admin/instances/index.html.haml +++ b/app/views/admin/instances/index.html.haml @@ -32,32 +32,10 @@ %hr.spacer/ -- @instances.each do |instance| - .directory__tag - = link_to admin_instance_path(instance) do - %h4 - = instance.domain - %small - - if instance.domain_block - - first_item = true - - if !instance.domain_block.noop? - = t("admin.domain_blocks.severity.#{instance.domain_block.severity}") - - first_item = false - - unless instance.domain_block.suspend? - - if instance.domain_block.reject_media? - - unless first_item - • - = t('admin.domain_blocks.rejecting_media') - - first_item = false - - if instance.domain_block.reject_reports? - - unless first_item - • - = t('admin.domain_blocks.rejecting_reports') - - elsif whitelist_mode? - = t('admin.accounts.whitelisted') - - else - = t('admin.accounts.no_limits_imposed') - - if instance.countable? - .trends__item__current{ title: t('admin.instances.known_accounts', count: instance.accounts_count) }= number_to_human instance.accounts_count, strip_insignificant_zeros: true +- if @instances.empty? + %div.muted-hint.center-text + = t 'admin.instances.empty' +- else + = render @instances -= paginate paginated_instances += paginate @instances diff --git a/app/views/admin/instances/show.html.haml b/app/views/admin/instances/show.html.haml index 92e14c0df..0b9382771 100644 --- a/app/views/admin/instances/show.html.haml +++ b/app/views/admin/instances/show.html.haml @@ -3,57 +3,59 @@ .dashboard__counters %div - %div - .dashboard__counters__num= number_with_delimiter @following_count - .dashboard__counters__label= t 'admin.instances.total_followed_by_them' - %div - %div - .dashboard__counters__num= number_with_delimiter @followers_count - .dashboard__counters__label= t 'admin.instances.total_followed_by_us' - %div - %div - .dashboard__counters__num= number_to_human_size @media_storage - .dashboard__counters__label= t 'admin.instances.total_storage' - %div - %div - .dashboard__counters__num= number_with_delimiter @blocks_count - .dashboard__counters__label= t 'admin.instances.total_blocked_by_us' + = link_to admin_accounts_path(remote: '1', by_domain: @instance.domain) do + .dashboard__counters__num= number_with_delimiter @instance.accounts_count + .dashboard__counters__label= t 'admin.accounts.title' %div = link_to admin_reports_path(by_target_domain: @instance.domain) do - .dashboard__counters__num= number_with_delimiter @reports_count + .dashboard__counters__num= number_with_delimiter @instance.reports_count .dashboard__counters__label= t 'admin.instances.total_reported' + %div + %div + .dashboard__counters__num= number_to_human_size @instance.media_storage + .dashboard__counters__label= t 'admin.instances.total_storage' + %div + %div + .dashboard__counters__num= number_with_delimiter @instance.following_count + .dashboard__counters__label= t 'admin.instances.total_followed_by_them' + %div + %div + .dashboard__counters__num= number_with_delimiter @instance.followers_count + .dashboard__counters__label= t 'admin.instances.total_followed_by_us' + %div + %div + .dashboard__counters__num= number_with_delimiter @instance.blocks_count + .dashboard__counters__label= t 'admin.instances.total_blocked_by_us' + %div %div .dashboard__counters__num - - if @available + - if @instance.delivery_failure_tracker.available? = fa_icon 'check' - else = fa_icon 'times' .dashboard__counters__label= t 'admin.instances.delivery_available' -- if @private_comment.present? +- if @instance.private_comment.present? .speech-bubble .speech-bubble__bubble - = simple_format(h(@private_comment)) + = simple_format(h(@instance.private_comment)) .speech-bubble__owner= t 'admin.instances.private_comment' -- if @public_comment.present? +- if @instance.public_comment.present? .speech-bubble .speech-bubble__bubble - = simple_format(h(@public_comment)) + = simple_format(h(@instance.public_comment)) .speech-bubble__owner= t 'admin.instances.public_comment' %hr.spacer/ %div.action-buttons %div - = link_to t('admin.accounts.title'), admin_accounts_path(remote: '1', by_domain: @instance.domain), class: 'button' - - %div - - if @domain_allow - = link_to t('admin.domain_allows.undo'), admin_domain_allow_path(@domain_allow), class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure'), method: :delete } - - elsif @domain_block - = link_to t('admin.domain_blocks.edit'), edit_admin_domain_block_path(@domain_block), class: 'button' - = link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@domain_block), class: 'button' + - if @instance.domain_allow + = link_to t('admin.domain_allows.undo'), admin_domain_allow_path(@instance.domain_allow), class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure'), method: :delete } + - elsif @instance.domain_block + = link_to t('admin.domain_blocks.edit'), edit_admin_domain_block_path(@instance.domain_block), class: 'button' + = link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@instance.domain_block), class: 'button' - else = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @instance.domain), class: 'button' diff --git a/app/workers/scheduler/instance_refresh_scheduler.rb b/app/workers/scheduler/instance_refresh_scheduler.rb new file mode 100644 index 000000000..917404bec --- /dev/null +++ b/app/workers/scheduler/instance_refresh_scheduler.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class Scheduler::InstanceRefreshScheduler + include Sidekiq::Worker + + sidekiq_options lock: :until_executed, retry: 0 + + def perform + Instance.refresh + end +end diff --git a/config/brakeman.ignore b/config/brakeman.ignore index baa993c78..dcbfd02b4 100644 --- a/config/brakeman.ignore +++ b/config/brakeman.ignore @@ -102,6 +102,37 @@ "confidence": "Weak", "note": "" }, + { + "warning_type": "Dynamic Render Path", + "warning_code": 15, + "fingerprint": "4704e8093e3e0561bf705f892e8fc6780419f8255f4440b1c0afd09339bd6446", + "check_name": "Render", + "message": "Render path contains parameter value", + "file": "app/views/admin/instances/index.html.haml", + "line": 39, + "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/", + "code": "render(action => filtered_instances.page(params[:page]), {})", + "render_path": [ + { + "type": "controller", + "class": "Admin::InstancesController", + "method": "index", + "line": 10, + "file": "app/controllers/admin/instances_controller.rb", + "rendered": { + "name": "admin/instances/index", + "file": "app/views/admin/instances/index.html.haml" + } + } + ], + "location": { + "type": "template", + "template": "admin/instances/index" + }, + "user_input": "params[:page]", + "confidence": "Weak", + "note": "" + }, { "warning_type": "Redirect", "warning_code": 18, @@ -122,6 +153,26 @@ "confidence": "High", "note": "" }, + { + "warning_type": "SQL Injection", + "warning_code": 0, + "fingerprint": "6e4051854bb62e2ddbc671f82d6c2328892e1134b8b28105ecba9b0122540714", + "check_name": "SQL", + "message": "Possible SQL injection", + "file": "app/models/account.rb", + "line": 491, + "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", + "code": "find_by_sql([\" WITH first_degree AS (\\n SELECT target_account_id\\n FROM follows\\n WHERE account_id = ?\\n UNION ALL\\n SELECT ?\\n )\\n SELECT\\n accounts.*,\\n (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?)\\n WHERE accounts.id IN (SELECT * FROM first_degree)\\n AND #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n GROUP BY accounts.id\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, account.id, limit, offset])", + "render_path": null, + "location": { + "type": "method", + "class": "Account", + "method": "advanced_search_for" + }, + "user_input": "textsearch", + "confidence": "Medium", + "note": "" + }, { "warning_type": "SQL Injection", "warning_code": 0, @@ -163,23 +214,23 @@ "note": "" }, { - "warning_type": "Mass Assignment", - "warning_code": 105, - "fingerprint": "8f63dec68951d9bcf7eddb15af9392b2e1333003089c41fb76688dfd3579f394", - "check_name": "PermitAttributes", - "message": "Potentially dangerous key allowed for mass assignment", - "file": "app/controllers/api/v1/crypto/deliveries_controller.rb", - "line": 23, - "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/", - "code": "params.require(:device).permit(:account_id, :device_id, :type, :body, :hmac)", + "warning_type": "SQL Injection", + "warning_code": 0, + "fingerprint": "9251d682c4e2840e1b2fea91e7d758efe2097ecb7f6255c065e3750d25eb178c", + "check_name": "SQL", + "message": "Possible SQL injection", + "file": "app/models/account.rb", + "line": 460, + "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", + "code": "find_by_sql([\" SELECT\\n accounts.*,\\n ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n WHERE #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, limit, offset])", "render_path": null, "location": { "type": "method", - "class": "Api::V1::Crypto::DeliveriesController", - "method": "resource_params" + "class": "Account", + "method": "search_for" }, - "user_input": ":account_id", - "confidence": "High", + "user_input": "textsearch", + "confidence": "Medium", "note": "" }, { @@ -273,6 +324,26 @@ "confidence": "High", "note": "" }, + { + "warning_type": "SQL Injection", + "warning_code": 0, + "fingerprint": "e21d8fee7a5805761679877ca35ed1029c64c45ef3b4012a30262623e1ba8bb9", + "check_name": "SQL", + "message": "Possible SQL injection", + "file": "app/models/account.rb", + "line": 507, + "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", + "code": "find_by_sql([\" SELECT\\n accounts.*,\\n (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?)\\n WHERE #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n GROUP BY accounts.id\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, limit, offset])", + "render_path": null, + "location": { + "type": "method", + "class": "Account", + "method": "advanced_search_for" + }, + "user_input": "textsearch", + "confidence": "Medium", + "note": "" + }, { "warning_type": "Mass Assignment", "warning_code": 105, @@ -294,6 +365,6 @@ "note": "" } ], - "updated": "2020-06-01 18:18:02 +0200", - "brakeman_version": "4.8.0" + "updated": "2020-12-07 01:17:13 +0100", + "brakeman_version": "4.10.0" } diff --git a/config/locales/en.yml b/config/locales/en.yml index 59f561aa3..f89f50e4d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -255,6 +255,7 @@ en: unsuspend_account: Unsuspend Account update_announcement: Update Announcement update_custom_emoji: Update Custom Emoji + update_domain_block: Update Domain Block update_status: Update Status actions: assigned_to_self_report: "%{name} assigned report %{target} to themselves" @@ -295,6 +296,7 @@ en: unsuspend_account: "%{name} unsuspended %{target}'s account" update_announcement: "%{name} updated announcement %{target}" update_custom_emoji: "%{name} updated emoji %{target}" + update_domain_block: "%{name} updated domain block for %{target}" update_status: "%{name} updated status by %{target}" deleted_status: "(deleted status)" empty: No logs found. @@ -437,6 +439,7 @@ en: instances: by_domain: Domain delivery_available: Delivery is available + empty: No domains found. known_accounts: one: "%{count} known account" other: "%{count} known accounts" diff --git a/config/sidekiq.yml b/config/sidekiq.yml index 5de25de23..a71c1098e 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -36,3 +36,6 @@ pghero_scheduler: cron: '0 0 * * *' class: Scheduler::PgheroScheduler + instance_refresh_scheduler: + cron: '0 * * * *' + class: Scheduler::InstanceRefreshScheduler diff --git a/db/migrate/20201206004238_create_instances.rb b/db/migrate/20201206004238_create_instances.rb new file mode 100644 index 000000000..a4b866894 --- /dev/null +++ b/db/migrate/20201206004238_create_instances.rb @@ -0,0 +1,9 @@ +class CreateInstances < ActiveRecord::Migration[5.2] + def change + create_view :instances, materialized: true + + # To be able to refresh the view concurrently, + # at least one unique index is required + safety_assured { add_index :instances, :domain, unique: true } + end +end diff --git a/db/schema.rb b/db/schema.rb index 873c37f67..2f9d369be 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.define(version: 2020_10_17_234926) do +ActiveRecord::Schema.define(version: 2020_12_06_004238) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1045,4 +1045,29 @@ ActiveRecord::Schema.define(version: 2020_10_17_234926) do add_foreign_key "web_push_subscriptions", "users", on_delete: :cascade add_foreign_key "web_settings", "users", name: "fk_11910667b2", on_delete: :cascade add_foreign_key "webauthn_credentials", "users" + + create_view "instances", materialized: true, sql_definition: <<-SQL + WITH domain_counts(domain, accounts_count) AS ( + SELECT accounts.domain, + count(*) AS accounts_count + FROM accounts + WHERE (accounts.domain IS NOT NULL) + GROUP BY accounts.domain + ) + SELECT domain_counts.domain, + domain_counts.accounts_count + FROM domain_counts + UNION + SELECT domain_blocks.domain, + COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count + FROM (domain_blocks + LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_blocks.domain)::text))) + UNION + SELECT domain_allows.domain, + COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count + FROM (domain_allows + LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_allows.domain)::text))); + SQL + add_index "instances", ["domain"], name: "index_instances_on_domain", unique: true + end diff --git a/db/views/instances_v01.sql b/db/views/instances_v01.sql new file mode 100644 index 000000000..94acd61a1 --- /dev/null +++ b/db/views/instances_v01.sql @@ -0,0 +1,17 @@ +WITH domain_counts(domain, accounts_count) +AS ( + SELECT domain, COUNT(*) as accounts_count + FROM accounts + WHERE domain IS NOT NULL + GROUP BY domain +) +SELECT domain, accounts_count +FROM domain_counts +UNION +SELECT domain_blocks.domain, COALESCE(domain_counts.accounts_count, 0) +FROM domain_blocks +LEFT OUTER JOIN domain_counts ON domain_counts.domain = domain_blocks.domain +UNION +SELECT domain_allows.domain, COALESCE(domain_counts.accounts_count, 0) +FROM domain_allows +LEFT OUTER JOIN domain_counts ON domain_counts.domain = domain_allows.domain diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb index 5433ddd9d..3c2dfd4ec 100644 --- a/lib/mastodon/domains_cli.rb +++ b/lib/mastodon/domains_cli.rb @@ -53,6 +53,8 @@ module Mastodon custom_emojis_count = custom_emojis.count custom_emojis.destroy_all unless options[:dry_run] + Instance.refresh unless options[:dry_run] + say("Removed #{custom_emojis_count} custom emojis", :green) end @@ -83,7 +85,7 @@ module Mastodon processed = Concurrent::AtomicFixnum.new(0) failed = Concurrent::AtomicFixnum.new(0) start_at = Time.now.to_f - seed = start ? [start] : Account.remote.domains + seed = start ? [start] : Instance.pluck(:domain) blocked_domains = Regexp.new('\\.?' + DomainBlock.where(severity: 1).pluck(:domain).join('|') + '$') progress = create_progress_bar diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb index 412b81443..8c0b309f2 100644 --- a/spec/controllers/admin/instances_controller_spec.rb +++ b/spec/controllers/admin/instances_controller_spec.rb @@ -9,10 +9,10 @@ RSpec.describe Admin::InstancesController, type: :controller do describe 'GET #index' do around do |example| - default_per_page = Account.default_per_page - Account.paginates_per 1 + default_per_page = Instance.default_per_page + Instance.paginates_per 1 example.run - Account.paginates_per default_per_page + Instance.paginates_per default_per_page end it 'renders instances' do diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 75f628076..1d000ed4d 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -440,13 +440,6 @@ RSpec.describe Account, type: :model do end end - describe '.domains' do - it 'returns domains' do - Fabricate(:account, domain: 'domain') - expect(Account.remote.domains).to match_array(['domain']) - end - end - describe '#statuses_count' do subject { Fabricate(:account) } @@ -737,20 +730,6 @@ RSpec.describe Account, type: :model do end end - describe 'by_domain_accounts' do - it 'returns accounts grouped by domain sorted by accounts' do - 2.times { Fabricate(:account, domain: 'example.com') } - Fabricate(:account, domain: 'example2.com') - - results = Account.where('id > 0').by_domain_accounts - expect(results.length).to eq 2 - expect(results.first.domain).to eq 'example.com' - expect(results.first.accounts_count).to eq 2 - expect(results.last.domain).to eq 'example2.com' - expect(results.last.accounts_count).to eq 1 - end - end - describe 'local' do it 'returns an array of accounts who do not have a domain' do account_1 = Fabricate(:account, domain: nil) From 4fd306200396a17c030c53483ccd7faa6c2f7291 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 14 Dec 2020 09:08:09 +0100 Subject: [PATCH 35/83] Change "Profile unavailable" string to "Account suspended" in web UI (#15345) --- .../mastodon/features/account_gallery/index.js | 10 +++++++++- .../mastodon/features/account_timeline/index.js | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/account_gallery/index.js b/app/javascript/mastodon/features/account_gallery/index.js index 597ca8af6..015a6a6d7 100644 --- a/app/javascript/mastodon/features/account_gallery/index.js +++ b/app/javascript/mastodon/features/account_gallery/index.js @@ -152,6 +152,14 @@ class AccountGallery extends ImmutablePureComponent { loadOlder = ; } + let emptyMessage; + + if (suspended) { + emptyMessage = ; + } else if (blockedBy) { + emptyMessage = ; + } + return ( @@ -162,7 +170,7 @@ class AccountGallery extends ImmutablePureComponent { {(suspended || blockedBy) ? (
    - + {emptyMessage}
    ) : (
    diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js index cbc859805..fa4239d6f 100644 --- a/app/javascript/mastodon/features/account_timeline/index.js +++ b/app/javascript/mastodon/features/account_timeline/index.js @@ -136,7 +136,9 @@ class AccountTimeline extends ImmutablePureComponent { let emptyMessage; - if (suspended || blockedBy) { + if (suspended) { + emptyMessage = ; + } else if (blockedBy) { emptyMessage = ; } else if (remote && statusIds.isEmpty()) { emptyMessage = ; From a7e819b8a8de25414324e354baa62e9abbd3e8c4 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 14 Dec 2020 09:37:58 +0100 Subject: [PATCH 36/83] =?UTF-8?q?Fix=20dynamic=20updating=20of=20=E2=80=9C?= =?UTF-8?q?Bootstrap=20timeline=20accounts=E2=80=9D=20admin=20setting=20(#?= =?UTF-8?q?15325)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Claire --- app/javascript/packs/admin.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/packs/admin.js b/app/javascript/packs/admin.js index 65b8dc040..1c44fb45b 100644 --- a/app/javascript/packs/admin.js +++ b/app/javascript/packs/admin.js @@ -57,8 +57,10 @@ const onEnableBootstrapTimelineAccountsChange = (target) => { bootstrapTimelineAccountsField.disabled = !target.checked; if (target.checked) { bootstrapTimelineAccountsField.parentElement.classList.remove('disabled'); + bootstrapTimelineAccountsField.parentElement.parentElement.classList.remove('disabled'); } else { bootstrapTimelineAccountsField.parentElement.classList.add('disabled'); + bootstrapTimelineAccountsField.parentElement.parentElement.classList.add('disabled'); } } }; From 47e507fa61be6dc39dd9821e1d07c33e993cc246 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 14 Dec 2020 10:03:09 +0100 Subject: [PATCH 37/83] Add ability to require invite request text (#15326) Fixes #15273 Co-authored-by: Claire --- app/javascript/packs/admin.js | 26 ++++++++++++++++++++++ app/javascript/styles/mastodon/forms.scss | 15 ++++++++----- app/models/form/admin_settings.rb | 2 ++ app/models/user.rb | 3 ++- app/views/about/_registration.html.haml | 2 +- app/views/admin/settings/edit.html.haml | 6 +++++ app/views/auth/registrations/new.html.haml | 2 +- config/locales/en.yml | 3 +++ config/settings.yml | 1 + 9 files changed, 52 insertions(+), 8 deletions(-) diff --git a/app/javascript/packs/admin.js b/app/javascript/packs/admin.js index 1c44fb45b..8fd1b8a8e 100644 --- a/app/javascript/packs/admin.js +++ b/app/javascript/packs/admin.js @@ -67,10 +67,36 @@ const onEnableBootstrapTimelineAccountsChange = (target) => { delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target)); +const onChangeRegistrationMode = (target) => { + const enabled = target.value === 'approved'; + + [].forEach.call(document.querySelectorAll('#form_admin_settings_require_invite_text'), (input) => { + input.disabled = !enabled; + if (enabled) { + let element = input; + do { + element.classList.remove('disabled'); + element = element.parentElement; + } while (element && !element.classList.contains('fields-group')); + } else { + let element = input; + do { + element.classList.add('disabled'); + element = element.parentElement; + } while (element && !element.classList.contains('fields-group')); + } + }); +}; + +delegate(document, '#form_admin_settings_registrations_mode', 'change', ({ target }) => onChangeRegistrationMode(target)); + ready(() => { const domainBlockSeverityInput = document.getElementById('domain_block_severity'); if (domainBlockSeverityInput) onDomainBlockSeverityChange(domainBlockSeverityInput); const enableBootstrapTimelineAccounts = document.getElementById('form_admin_settings_enable_bootstrap_timeline_accounts'); if (enableBootstrapTimelineAccounts) onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts); + + const registrationMode = document.getElementById('form_admin_settings_registrations_mode'); + if (registrationMode) onChangeRegistrationMode(registrationMode); }); diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 92d89e6f2..e0604303b 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -377,11 +377,6 @@ code { box-shadow: none; } - &:focus:invalid:not(:placeholder-shown), - &:required:invalid:not(:placeholder-shown) { - border-color: lighten($error-red, 12%); - } - &:required:valid { border-color: $valid-value-color; } @@ -397,6 +392,16 @@ code { } } + input[type=text], + input[type=number], + input[type=email], + input[type=password] { + &:focus:invalid:not(:placeholder-shown), + &:required:invalid:not(:placeholder-shown) { + border-color: lighten($error-red, 12%); + } + } + .input.field_with_errors { label { color: lighten($error-red, 12%); diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 390836f28..e9f78da21 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -35,6 +35,7 @@ class Form::AdminSettings show_domain_blocks show_domain_blocks_rationale noindex + require_invite_text ).freeze BOOLEAN_KEYS = %i( @@ -51,6 +52,7 @@ class Form::AdminSettings trends trendable_by_default noindex + require_invite_text ).freeze UPLOAD_KEYS = %i( diff --git a/app/models/user.rb b/app/models/user.rb index 981dc6d47..6088f1994 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -82,7 +82,8 @@ class User < ApplicationRecord has_many :webauthn_credentials, dependent: :destroy has_one :invite_request, class_name: 'UserInviteRequest', inverse_of: :user, dependent: :destroy - accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? } + accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? && !Setting.require_invite_text } + validates :invite_request, presence: true, on: :create, if: -> { Setting.require_invite_text } validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale? validates_with BlacklistedEmailValidator, on: :create diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index 6160ca4d4..e4d614d71 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -16,7 +16,7 @@ - if approved_registrations? .fields-group = f.simple_fields_for :invite_request do |invite_request_fields| - = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false + = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: Setting.require_invite_text .fields-group = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: about_more_path, terms_path: terms_path), required: true, disabled: closed_registrations? diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index 9e28766b1..a162490b5 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -43,6 +43,12 @@ %hr.spacer/ + .fields-group + = f.input :require_invite_text, as: :boolean, wrapper: :with_label, label: t('admin.settings.registrations.require_invite_text.title'), hint: t('admin.settings.registrations.require_invite_text.desc_html'), disabled: !approved_registrations? + .fields-group + + %hr.spacer/ + .fields-group = f.input :enable_bootstrap_timeline_accounts, as: :boolean, wrapper: :with_label, label: t('admin.settings.enable_bootstrap_timeline_accounts.title') .fields-group diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index de541847f..6981195ed 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -31,7 +31,7 @@ - if approved_registrations? && !@invite.present? .fields-group = f.simple_fields_for :invite_request, resource.invite_request || resource.build_invite_request do |invite_request_fields| - = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false + = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: Setting.require_invite_text = f.input :invite_code, as: :hidden diff --git a/config/locales/en.yml b/config/locales/en.yml index f89f50e4d..114f86fd1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -586,6 +586,9 @@ en: min_invite_role: disabled: No one title: Allow invitations by + require_invite_text: + desc_html: When registrations require manual approval, make the “Why do you want to join?” invite request text mandatory rather than optional + title: Require new users to fill an invite request text registrations_mode: modes: approved: Approval required for sign up diff --git a/config/settings.yml b/config/settings.yml index 217745f28..9cf68a096 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -70,6 +70,7 @@ defaults: &defaults spam_check_enabled: true show_domain_blocks: 'disabled' show_domain_blocks_rationale: 'disabled' + require_invite_text: false development: <<: *defaults From 9342705e6bfc4f0e4f999bd3c1bb70d425fcb598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczak?= Date: Tue, 15 Dec 2020 02:04:56 +0100 Subject: [PATCH 38/83] Add app shortcuts (#15234) * Add app shortcuts Signed-off-by: mkljczk * Fix codeclimate issues Signed-off-by: mkljczk * Change shortcuts Signed-off-by: mkljczk * More consistent new-status icon Signed-off-by: mkljczk --- app/serializers/manifest_serializer.rb | 40 ++++++++++++++++++++++++- public/shortcuts/direct.png | Bin 0 -> 3045 bytes public/shortcuts/new-status.png | Bin 0 -> 3031 bytes public/shortcuts/notifications.png | Bin 0 -> 3067 bytes public/shortcuts/profile.png | Bin 0 -> 4190 bytes 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 public/shortcuts/direct.png create mode 100644 public/shortcuts/new-status.png create mode 100644 public/shortcuts/notifications.png create mode 100644 public/shortcuts/profile.png diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb index 21ec0d4be..dafe8f55b 100644 --- a/app/serializers/manifest_serializer.rb +++ b/app/serializers/manifest_serializer.rb @@ -7,7 +7,7 @@ class ManifestSerializer < ActiveModel::Serializer attributes :name, :short_name, :description, :icons, :theme_color, :background_color, :display, :start_url, :scope, - :share_target + :share_target, :shortcuts def name object.site_title @@ -64,4 +64,42 @@ class ManifestSerializer < ActiveModel::Serializer }, } end + + def shortcuts + [ + { + name: 'New toot', + url: '/web/statuses/new', + icons: [ + { + src: '/shortcuts/new-status.png', + type: 'image/png', + sizes: '192x192', + }, + ], + }, + { + name: 'Notifications', + url: '/web/notifications', + icons: [ + { + src: '/shortcuts/notifications.png', + type: 'image/png', + sizes: '192x192', + }, + ], + }, + { + name: 'Direct messages', + url: '/web/timelines/direct', + icons: [ + { + src: '/shortcuts/direct.png', + type: 'image/png', + sizes: '192x192', + }, + ], + }, + ] + end end diff --git a/public/shortcuts/direct.png b/public/shortcuts/direct.png new file mode 100644 index 0000000000000000000000000000000000000000..e8772c00e664042779abc16be73407e3e2cb0e89 GIT binary patch literal 3045 zcmd_s`9Bkm9|!Pl%#}0o5h~Zm{mF_*2sIx^LJ?9#jtQBoP_dEZKIT4h)Z~ayCK{0; zlIynoca~B{G$eG*)1Jr^cYQZ>f(IjutEPv5FfALbm zBD8S9s&LV^Xz5Dv($$hBhms|y68!bjCFjy5*RrLX<#>-5_}ee=o)vhn3cPnE-lr0O zw+bKlk`Vlgcpps+ts%l|h+(gZ;jf7iwWO#zVst$zrh)jRkrdZRLNt+(P0I=YEGP23 zU4GU~PHrZrV92R0puZWQzx}e> zGQ?;ZX1p6_w2m;^Mj6;KM*G-W$G>Zx<7*!$*SjazaXeEz8$Ht-z0>Qx(;Iy=>z`&f z`e!!=zHSWi%x!*|-yB)o8e7^P!*BhI-x?=uP4E!6CyCorr0tny=Ik=_E1CI~!knY* z%u|>PROSMWxwNuFptA_8EaEDQw8~m$u$R}^B;En{4{#E`4ivm1ldG z@t?i5?Y)hiy-n8M77u%GoBdyCW0a@ayac;MU3YK>@PP$|#HEkRE1Xi%(9}8&F*Gv0 zWMk`i&BgVmra(dn;Ccmi>m zOrg?Nx0yTN_c;e{wS_$ZfKZ|>)Y2tpk>JU>lW(OMzv2Y7lmvrqowk2`YY~*|;p%#_z|-}id(hq5`kE4t#j9R21#Us8RLiqmE94jP=FTosEbJjHCO+{8 zAvX5p_c#*AYxjhekGQqbTjWGLt+8t=;_|t{*<|)qS0k-`0-$GPZ51-#@yoiV(EEs{ zZ6-S!D~;;Pi-rcsxISwb6@qJE4tFbjjO9|wA&!>asgvEQGQ}b?sok&cj}eI)^+$s( z{88B-#nvA8=lhIlrn8#G9t+~4Mupbm#a(Neis({|WT=IZjdj!*i!vn%tHo3dJMH}}Ui2MsM)qOJij$a|^8 z61jRR1v4gT?qI@A)tXPXDXA;q(n3O<{T#mzB7#o8KNC?KL^f{%EGdGg8647$B(TM# z=ga}jM;VfSy|-0GS17G+`(-`YUGA8Z=}=xI#^MVYcU2?6w>n3xd~&eHyEg~aqOC~5 zgrz)pf7t78!Oype&{cE!C772saLlQ3%32{W8EjR0!Q5E>NP6H6mb5O!1$s-JmaeOW z*iUf-$;u0V8Z^f&%c+N6=yr+%J}dN{!??%vdyL-k7WP)=JF9(J0C=4K&MCoNguism ze4Qp)rC&56+KW=^w?FjIO9y;h%ZO1c6v$QII3>y!f)qEr5&C>o84vxP;iV4zSv_lP z>8{N$CX8m#j#eos`mvs7gf4Mu?2Z&Ix}j+_TDq?no&&J?y+ppy57u$yvq4KVnDdJg zvSX_0I)KcCwyZPjf)y_^_qEQ~S6GiCf8Mb8y&BXnr88qL=>3Hef$%@IM44xDdv1O)ybsWCR?%n_5q zhSqK&`1Sp;tYgi5gDc-XG~x4ABW(x!dR+ok3PDE+#JHkJ(^v-N*g@YS?dy#8RP+uN zI+6BgAHx!~>yU_3lutN}*f6>QrXKd(1nnjtvx8%rmZv_(0uUlaKl`qW{|(gvOL0Si z*9FdaK{Z0*Y z4K@Q!v95!vKof+|892fdXC1E5Vy2r(H^36iuUYL46uNH|zq;Q!;K3mMYGT=Ox7Lk8 zXz7OjYeE*m?Q>QXNo0KZQTXdk9eV>ki>Q&u76DWzCIGy-K zYu2j|KxT@Y3XaL?%$D+32_p0>f)Ji3xJ5&^;LXv3Xy+#H`=AN@$No?IV=u{Tc@l`Z zZejEC4$gNGCV-|e7JpL5y5-f|9jki5;G;d?5ixva2%Z48&!j+#s z1QMdZnGZ^o-}0^C%J=c#Lk!TYdnCe*j{pNXT2ze-(PdPUJ$mO~0~J}&aGSj!Ul;0! za0IE$UPYIa&}?dMU=)nhXfZVeNj^$~++VbJue+7fJUd`L<|Pnf=Z86p+*Wo*-JIiBg*mA2rEK}i$`$k)h32+pAZAhiiLpo#%yPAu$MD6|6K!YDuN0b?^DXa{U8k`OTa;LBx`8c13 zgTI1n;PSeNr2visY=rdT_D?#Cjb#=g_`n=&a}GjUih~W$MW~+OV9%lu`dS?9E(&q^ z90%K)hj6y!U>_&~6@rIxZS@CbBU#9;xD}FjEPqINlMQaDU4?7NH0v0Z4CVO6eQ_U< z4@;$8FYr!@y4DDu3!{?~FXC@t)XSe1Up(?b2{y18wsQq$Wlk8k#0Z<-9d3Q6m(Fqu z5qw;Uw)<;SC-2FojDl|~{4V&!uQVuWGEK61S9BzyWn6f-)ft+|JK3*?&n4U_ks>;z zr8GzW$hK>1zu2L6ZkR-HkW$DB^#WFh58aHdSxFAccq6t_6MJ(gyc*~gnzhMY~NO zgqm6?W!Lm!-Rx|-t6LVKbltj5HvY@FG0A3U%qA-e!tL*uJ%&j#Gv1lG_nv>>AABA* z>)g3>&gVOG|D1b{5U4;Z`Q+O&;vCUV3=`wTJh4Qq5*x%GksuC<6T*|6$bU=7zuAzl zS(4irm)mTY?@@*pN2wCMm}n#hh#6v;h^NRL6><6AGjd;epNi2#sGx35Z%Ngab&UdnK+W4o!g)UMz|w>Gcil-J1Bi7_GOzi!w@^AFD3ek7-T<_m~5+3 zm}9>9)x;>V1+jBxOSWA#OfpaWdSa3|fXD@NAltGYX6Y|}9WgEMszTmiIh1W%2h;Qu zzls>cH-2Ql2;A0HFi*YsMZ^e>@s*t;aN8HbL^bkv5H}&Ba<~sVU}SXS*AjCOPdm6z zYGG)&@(&T4kWE{-Z-!uM@ZvWRS0R`&a9=gR++gJIBffxC#=(8o2ZQq$zk;|3k&K7? zumVQsCVvZY1M*k{_hk#r_9y=!aTn592lwe949_e+kJ!8bQLN_zMw-4Ve+_XNaySF` zbq&n_PW~q1I;3z8?(-(scEh78Waec$S;{GG%)Byb*fpwl(^dx$&ed>~;LdR&qJ zJh6jL2QR@+oOeO~U350cz^=6+kcU0^<_CU$33_akzZ1v&AjflpPFv(}#nm2==hdNB z)8%i%b$(FbeS#)a<*&gVUJ%e7;~LZCFU8m%5b)TcQj-FJQJo<0QKTk~=SPQuFc{Qb z{uVsU0z!VMrbSozEASX2i0JXk3LOK02iQSm58CS{e;+ypL`vKi=9%Rhup0E!t>C4Vg@ss)-%$Xlx-0GOg2=)zpo@^_%ofo60>B|k4qgq2x< zZm^R@Q3PNFjSVzqBy9P4HAXB*2XuwqtO_##V`yZcIb&hT&x=rF9bTY2>}XvW0hmVP z0z;S%TK;FkpKlm-gHKR5hmi)y;67snlf)DII9AdYNvjw0H(jf$~Ppu9?Tebj9Ksa?L zynM``Y4m2)Az1y~+5vPE*#fWz8P&-D6M40#nE$oNm7w!kpe>6f)J>^#!g5SNpYjb}z zrUqaDg6b>3su1uLD;D?3KxzPHAgOx!`3BUx|9;?Yk>tPm>$cJmT>I#r?fo*78h~Yp zs$TxoM-{Jpu&3;o;H?{bwqE{BWjQqfamcEV{GaV4pWTU7aX93N{7n2*{xZm_m;66? z^R|+60*B;3rHlh`4#Juzf6yUtP=4kd2cR9&nkj!!A#hZFrkw*Y3~|kszt9jkEI%{M z0T_q8X3L*%2ppH68Rr1ZLtyje&ou;){~7ZffF($5hx~p+aP7l;kpDZDH~_0?h-l?s z-%fbne>2=+%-KQ!p0mmU*g!+rB|k#on+*=Y9vZ?v`4IwN>~R1RXb3yycW7W+z9cvR zSpU~z`Ej);D~B9_6EpMu7Y-g8)E&=L3L4Ajt3ZArMZ2A-~fn!MF?x`JKKD ziW^~&-{~7+7zzRTogNB-!Elh@>A`SIkl#T0--G-?4TqkG{E*+}2V%w{Kje4$k;q}l z5BXhwD83!?Lw-kTcWz>=TxMyGefkjcJ1{X;8RSp@?SCpAHDSWs^V35I}wH=>kxR07Mr8$gh-2k*?@} ztRVp5hXC>`Wldx%`kxaBK)4}*{K}cg7JxPcAiNMjel2Lr7685noKf(2J@gr(#6@7xXimjLo>!-6=g=#P34fU~!~z3*=o_BqI}6TN-{ zP)-~n0NLg5xdizQgPkrHev1BZ5dnbwma!=O7X5KI0s#3fqdS)Xlo0y}0OYp>cDY34 zQuKmZ7XwfTkY8J7MXp6JYDNGcza=z_e2QKeLjWMZ;lxC~MKA7003g5N^cNC0285M;VZKRqwFtGtL4R|Y*%Q47r0PJkF2%>01lW0(27?UEX zqK(xjv7Rt62X?hy1X;AfX*4V_glQ3U(MIb`Jr@AZ9sAdbFp4%jh6Vj1CcH(HqX8(Sat+ ziKvU-w3gUJ;{(O8gSA3M(Hjq;1AtFuCXhv=Zy+Opqh&OslY==!0|;chIT8C+te6u&L++^${+AAia83YHkNJCqOC?W?adil+TX({n<0VquCvf{Z zf2(l0g4xqy*QU^wL8aJ>_!Se)osK(BRSq5Ra z|0m1vc%@yBF}A?$+(J-+2kq^6fL+^Xcnt|cALbo0cHW*o7#vIp8ZZN$Su?h2GijA& zK^Ve>yxLDxI|Nh14FS(ejj7r7gZrcwhDH|zUZevn)u@O2paVv#2>~zH#A}ve;lAkE zl5JlE6V(TSSFhwHT(ORE_#DW#u7Y{`1%Vgyo+b_CN^0RXrl)wnL!%$B25(`AqV(F9eGxBFGN6(|ug`t>eBPNJ73#4C@ zpM^hDF?tx4Yal9#E@FyUA&xbc{aEhfl-%b^^dKsXUx-FxfS4hciMRsU{`9@2Z}p$b2IIEg}DAL%wE7Zev_-vt7PN8CpD; Z`ai>UH@>A_0vG@Q002ovPDHLkV1n|Rqn-c& literal 0 HcmV?d00001 diff --git a/public/shortcuts/notifications.png b/public/shortcuts/notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9d45718c82784e5c3380dcc9e4cd3fadb9e9b2 GIT binary patch literal 3067 zcmd_s`#;nF7Xa}0=AK(a5k8EP3b`Z_G5fei5-Pe=Nh!BVH*Dm7$tBEvZZVf!L#}hb z3%NCBo6C%0wz=oB?>>LW_wjh1*E#3+a~|gvW^H9Ectr9D004sKW=1yb-27kgaS6YwMf;pOj*7=VNhdYHI4SIL$bmRvb>}>!j}2$t&@b2Jw^dgh``B zoN?l$IcmxxY3f??lyx%RCS~eo>eQ{&Df=|MLmK{0I{scd{(c7jK?eR28t;h4J7waZ zW=%V1O+U+?cFCT8l}m8@MsWW|@W>;0a*_i5? znCiK>n%VfDY;%dVbEvwxq`JA}`nlAG`LxFQ^v3xNwx;<^EIA8H&c>2+TITcH$e6YT zO#4CsTgO6S$3ju(LUAYMJ6ji}q>ED8O)2}&VtEgxqGz$9cd?SKkMg5$v8sQudSLPA zz|zlOOSQk2>IRqU2bUU$sZGOF>@c-?WVvO8+A^}-I!bLDTW%j)?igS0WSdy&npo-n zv(k%O?VDWfpIRN5qW!|J4zf+J4zUqv!vxxIB5j078zrrc&#aBlu1(C+|IE>G^J`P{ z^eHkOzd)a+FbEU|k-{J?GD%C!nI+~d8WPP$zA}vH#Szb00$QjuaM{oNhw)*#WQEmt7&QL z!OhIC->|#oaQ}hh<0ns@pTG1(1OU_|y`P*;f9E4+EY=mG35Uwb#lYZD{|&FD#)pyx z@63a*$7E;OLt^CRZzLu#PL`qA{Guy2YF^^^HG7PU zd5$T#?&DwDJtqt+=`{v815sGNH@x`F1sd zk1UYM@%dFh6h za$H%KHhWzf9b!|mG=#N?t+n~*%)^i;8pa7aoC^qhEn9nB8}u-QqS29{n?_`Xg7d(~ zB1u~Y!3FTgm-vFk)eK>B{|HafoVL9Cw!{2Mz@rP4iEaw^ zlS{omoO>u)9}*4o>rXX7c9jzYc)#un|Jmgzl?2Ija1W*S7V)w>AOWP;sZpw(rLp-HBn*>>ZJN_qd(kmV}aVo z-%LMYbcFlRwO%|}_s)Urc!OZQ2;Hibtzt3@3d;5FF=!9_=%TfH4doYQG^8`3eni1} z;M8P&p?*6klp2q{698e3l#j|cMuM$>t3Mu>Iyvjje_&h37t~zO0RzJue8q1>Z0c~s z;34~~UhjX_Jx|=r7Zs8N;?aZB+lEQ|s(Ch=6iu*yGz2Omv%+!i+MqnpF10M)+g$#| zDv{TE^MZ6{abrL$hm7k#35DNy5#VSoq_s!xlNTYGFvm>zCO_ms+gok zlVXp10G2u&2sc-icyS+rOufG{LZmV9Q6aRE2k2!WM_>(*`*}{Ui_6168rt|&358r?ptu=FXF3Qf zz}YhZ7}M2mGeOXmI&p|oG~FVtlZUR_nzI_F1dnI<020rxm$Zw@%nP6qfBC^kMMemZ zPA^}XET|bB*!)>~fwTF~89_O9Ua50wz+DL7WG1iIEo6n9fB+)q!JF?+O>Sy}Vcf&# z%Cp_a8hL>`HUh$4vWm^hoJc2|Bf=UXqM3z|!xbB_!9V&J63=PJEtxA^>XduH+Tgzg zQ}FNl(BpC6(8KP#2O}!H=o@s{ zmL5O?1^NrNU8ax z&9mX(>fhgXR_Q8k;F+#JlR;SEG~>yY9JMmxl-TBwg`W=y`Z z>G@ng@;S;z^kHctAM#Lfz*Ntj$`IAq#Tw75c86&1?jbFKsc*Y$G5abP5B$=V4^if6 z5Cyt8EbXqsXO@CZO=yFh!WrF?W!yk-f{p2{iVf;w`c>;o;m9v5MAthi3h~(FUqQaa zek|^`lCQ*>sHCw_T7_8a3C$|pl4Ac8L!x>^es1s0@a{iX2CQzE zeLuZF2;1k_>Afvbhbx2Y_|UjNP^~6Mze|XfOV|AJpw>kGlYHK^>0>>ZtQ`7aBqj9$ z@$GP##2_{-z@>8m@uv6fLc3O1Rx~<9yFQi0#P( zl3tzAs(vNe#B_*a99>s$ziu745~WU9+ya+giP+)3)JIIob-t>&C#rq2Q)?oHvqs0V zjbC&S+f;Pey5U}}BjEKZLsS>tz$j#(?z6h9b1O}73Pfg zT?vBEl3Om;mU5}XCJ@z$%=L3zDkSD zs*~Z}SB_+nKbXhs-mqdH&&<3jG9RJZ$Wdpf9mS|sjo9{t7RE%GV&*TW6P_tfG|lQ!HFFMNhl@(0dXC$Ns38GoH+HzuD{mbc-Pq20tsn)&iVpt*!6zhd-u-F zf27|-hUFLyT%D`bdnLHpzuT)D-;+ zqL^rg*rU>H+G+)qBfs!7i88_qVaJWvv|T2YB%kot5f#KVgq$?frY+Y&S?(A9TB6E) zs|xX2%e-mZwNRS-guj~DgFC)sPXxC0YA7%D!e2)0!W=(kYXr9aGAJ=M;@?cPK!_=a z$6zxQ>74Mhh*}8Gb?}&EL811Fzm)JmY_5gJrW8uGUijHW9Rwx~JXYCIt~KH>B6=Vy z>EJOdf`Stl{wiW0gd{yYhO40H_{5(_T!eU(fyXir%8pI^CBz^^qZ~Y@B~W-|;d8|1 zZU{wrb|cdCQSq-KjzS#Tz+=4z%3l!w2I34vp&dNt8*~@{M&b&@pe;Q18+8@`7NP?p z&>q&n7Tv_Zjp)VT0~6N5HeJNOo#@A)gNI;EY}Y~j0~l-&fdOTmz?}Br&JSXF5^PgV z{97>R2XU?mwx}Zhjo9r03GNPUlwJHAu+I;Yd{3}JR`IXF8(v`18{;*yiGKxRdw|8U zLn~x*07P{H%cDqTis#3G0XryhyZG~Pm<8B;s3y;?;$MYhjKHDem8;z7064%796M<5 zHt`o>P=Lb}xkdch$lJ3ty(81&vu`KF$t$Dc^>ahwl@I&HUmCsQg*vZzvB4|KPWFkt zrw7Eb7N0ox<+!-+^^1w=Td-a9yhGV;Z~$a%dx)uG5XS9gh5PY;T3`vb7^ zqm-sf{8>m;yTBw(S3aQW%@YT@EERq@UZ&|&&+s&azc?XpRw^6-DawhjdZ$G3QIGAy z59KkM9yMGV2|6CeAV{s#;@_^ zm08C8v%#rIs)QfPlLx!SHF^rc0fL%b=7a<6(%I0y$(i7t*A3zi-7&iS-6WiVv}w2a zxf-Lk1?h%w%!rb=J+2ae=uS~fhxSgu+FWg?1MJav+H))T(#nnE4_zEz?bd!ew8t*- za}jDS>+t$#=0y3a0auIv9*^(u7F|BA-xsh(*V^F#Rk|9LUv9}D{(JoT9Z&FyrLhxK zSuOr`#JrBi?CA50A69os)-_{o88apR`e?*(!baex|K4Yun&uTl=cXnvZkCSLKU5u;ijYxK{iG{)a9ny!xN z>;SCgw0In#Kv!dZ?e!}sex~~4LEVGo3gU5qMqLf{>DLoVIsi}WGU1JckAu|tm*Vv9H3BVL%n&?r=$ZgI7B~J7>fhc>ujX`X9tyafRP)sx;sF9 zH1RJd0y-P1qDfr`7#!C=!yIdS`BDy$ulvF3norbq06x=|yb%8bGQv5)Rv2b3 zm}N~x2dHQofbbu%HJk%f!Z34UXmUnL2jJ}07~lI;hI4>c7-j*tW`9eDuRO>f8bWKh z{r@{K%mPQ6hm~6ZV+UvvcNV=5p#R8$Q9^S5d(>J7RGk^bxIRiwr~~YPK^CV%{P`Qb z$~eH4|J}g2KFW?z2dIWY7Q>516~tdaj;#4{$VgO&I>31tWHB5##v#PAI{+v5!gz+| ze5eBq!60GI23(f=Y{0XJd$9P8%+NjYuY@teGw#17e(|QfYk^Cs8WW9`>;UUwh{#;| z{)Uv|=Ne`hzo@Kd2iOEds1+glv)Udpi0bmOu!$XDCkzoiQSR>~Nt4bgU9R=`F>bN3 zlO3QOhKSC<_>6c?g7p9=^~HF_OgTHi5f~yidWNUPPY<~_W%`LW1iZz`5q5wk7$SDM zebcUdOMDX1o{7-J4$uZe#7Fu$kT!OJP8cG7#{9G5wU1LFh%iZVr)Gs`>` z7w;NZh>3=e9l#Gm%mq`1a9&W(3$*R6#dG{84|XqEagk4vy?$=U5#j&pXs`Hh*VK}4 zuXlem@JL$3mrnEr(>{JbI1S-Hz|Rgaul3Fj-6c5}P_$aWe5mAdl+Xgcz9^}$zT~+%^hH#9pJ8(QyiMZAHLv=yB0uQ%W%~2Vtyi= zy*4iX{C;0jwFdZ&E}u^OhNd&orZIeoht~x0R+QI#4RP1d^~6^}5?h&nYUmT5(VH=^ zC3wnmvTaoCKRXosEC<--AM6p2?duYc@9z$lV`VXxpBfPFkl-)URE*y_#Pa>@jJ*G! zjH4ZE@o8I6SUU%}aD5^uJS)!G9&Z~F6DiEN%+(*Cw`e=|8wPNp8`g{&P(e1HF*H#jxaZ3?8tBKV@sm0$SnFguuCQJ6f{;i=RsANJeY zkH0qd>r_WzUW;u|zGLR>b1oW_rxO>*;d)1s+j8Xf!`1F7@z$q4@sxuxNL(aDr)^NB zUxe|Iz~ZBxl*Z=sbfw|)Nbo7d^Y-rs0>LfQK3Yh#ldyyGPETv+q&W4(Xt1z#s>84O zAdoIE!juk$IId{TFT3HLs&Vzt6L%^d4A(byGq_s=K_>?9a_JBZr))U1%Ed06sw}B^ zU9l!*55#Z~*kk)3Vmt++ABa)%NTlpJecS?{fKzx|v|PzU@w{iwyDtzh@(aasC|6~G^tu-8{@B5f_jjwd8+2aD0vXT0xwI zBV42Z(JpJJ+Bzp8PzNYG*(baB+l@$#{^wpl zLZJ4;so*7dfc&K#fZqoMWb7E{&VfLkLE@O8z$5$rVVs~|#?Dop!5ILj7?QUJalH|( z(H|Ac*tx%-=z};NqRSVM)d31)ae#EN*c#oSqKYU|GJiZ^b0qo-AYf_{{*<;w%=*w5T{k=fLC8S5R z15P?N;r_zetj*PiosE8Amz#|+=ARYM9!7>Zt7(xV{%4nAccUL!Mzpxu5TBz+o~8Wr zloZurSd+^PCmQ|GX15#USPNc^S;2E}_6FBh5;(wS!^uWJSnFnkOwHU9ubxJxh-7&3 zV7Dw`54DEVjeazX@VLEVWJMF4AQAY49p_t>K>V!1EF%?-ez?@_2I42daTLyoi$6Aa zMV~x%07{KiHoAa184UH^KtTNMIC2Lq#Z!lR#F_RnF?Ca#%x`r@svBKIHqj%?0f}$> z1Hn?NFVuN)ip<>KuV@+&&EHJQu+JX~YcAVxL!%2Rk}*@*4Z72DWy$_=VoWavCuYQ$ zU+TKQMTVOiUC=(oDv1O4vd?f^ql;QaT*Tl2n_-QuGThkc!t#hg3=*&j)>fY3=0+D- zf`I}yQDVr@=t6g6uzo#2rSCmQv?ND;{@5VWS|2J z8QWZwv`R5YD0O>6Ud{2OJXfa%PLSpH)a;s4o3bp;nmWSffXge@XhMtQ#VOG4I{}w# z;+kb%2+?u8rtOzOiK%x4u3pI{T&E#S+nF|Py&B4MpCfQF?nl{OWLiBNjG@^iLByMXc`rBsT*#>D)gx=1OP81ULL_lHD2h2WlU(+%2XyKe; zIgwB7CE67beY@Eg?$dINFj~A0kwI)FDv4I&j*G>9$GpZ$^O`d-f@pR;A##WvL^W}q z7)pWIhs@uuHm@ZIcX+f^I>t(3J+X<{Nt6>uh$fL&42Tof75Ax orpf${a`QVknZL0T7PqGTAIiWG;gNrqZvX%Q07*qoM6N<$g0IjP`~Uy| literal 0 HcmV?d00001 From a2ef002214572f8166413d989bf2f38768a6910d Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Tue, 15 Dec 2020 11:04:03 +0900 Subject: [PATCH 39/83] Fix to isolate the sidekiq process that runs the scheduler job (#15314) --- boxfile.yml | 1 + config/sidekiq.yml | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/boxfile.yml b/boxfile.yml index c4fd19ce6..c1d89bb15 100644 --- a/boxfile.yml +++ b/boxfile.yml @@ -110,6 +110,7 @@ worker.sidekiq: mailers: bundle exec sidekiq -c 5 -q mailers -L /app/log/sidekiq.log pull: bundle exec sidekiq -c 5 -q pull -L /app/log/sidekiq.log push: bundle exec sidekiq -c 5 -q push -L /app/log/sidekiq.log + scheduler: bundle exec sidekiq -c 5 -q scheduler -L /app/log/sidekiq.log writable_dirs: - tmp diff --git a/config/sidekiq.yml b/config/sidekiq.yml index a71c1098e..010923717 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -5,37 +5,51 @@ - [push, 4] - [mailers, 2] - [pull] + - [scheduler] +:scheduler: + :listened_queues_only: true :schedule: scheduled_statuses_scheduler: every: '5m' class: Scheduler::ScheduledStatusesScheduler + queue: scheduler trending_tags_scheduler: every: '5m' class: Scheduler::TrendingTagsScheduler + queue: scheduler media_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *' class: Scheduler::MediaCleanupScheduler + queue: scheduler feed_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * *' class: Scheduler::FeedCleanupScheduler + queue: scheduler doorkeeper_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * 0' class: Scheduler::DoorkeeperCleanupScheduler + queue: scheduler user_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *' class: Scheduler::UserCleanupScheduler + queue: scheduler ip_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *' class: Scheduler::IpCleanupScheduler + queue: scheduler email_scheduler: cron: '0 10 * * 2' class: Scheduler::EmailScheduler + queue: scheduler backup_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *' class: Scheduler::BackupCleanupScheduler + queue: scheduler pghero_scheduler: cron: '0 0 * * *' class: Scheduler::PgheroScheduler + queue: scheduler instance_refresh_scheduler: cron: '0 * * * *' class: Scheduler::InstanceRefreshScheduler + queue: scheduler From 7c800fa80188872805091f733c919d6b07b3936e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Dec 2020 03:17:06 +0100 Subject: [PATCH 40/83] Bump ini from 1.3.5 to 1.3.7 (#15317) Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1a0ef66e2..653d67133 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5523,9 +5523,9 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== inquirer@^0.12.0: version "0.12.0" From 1390cc194bd07b85fe36e31a0cab22981315974d Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 15 Dec 2020 04:30:15 +0100 Subject: [PATCH 41/83] Add indication to admin UI of whether a report has been forwarded (#13237) * Add indication to admin UI of whether a report has been forwarded * Rework how forwarded status is displayed Co-authored-by: Claire --- app/models/report.rb | 1 + app/services/report_service.rb | 3 ++- app/views/admin/reports/index.html.haml | 4 ++++ app/views/admin/reports/show.html.haml | 10 ++++++++++ config/locales/en.yml | 2 ++ db/migrate/20200309150742_add_forwarded_to_reports.rb | 5 +++++ db/schema.rb | 1 + 7 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200309150742_add_forwarded_to_reports.rb diff --git a/app/models/report.rb b/app/models/report.rb index f31bcfd2e..cd08120e4 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -14,6 +14,7 @@ # target_account_id :bigint(8) not null # assigned_account_id :bigint(8) # uri :string +# forwarded :boolean # class Report < ApplicationRecord diff --git a/app/services/report_service.rb b/app/services/report_service.rb index 1e955c1e7..9d9c7d6c9 100644 --- a/app/services/report_service.rb +++ b/app/services/report_service.rb @@ -24,7 +24,8 @@ class ReportService < BaseService target_account: @target_account, status_ids: @status_ids, comment: @comment, - uri: @options[:uri] + uri: @options[:uri], + forwarded: ActiveModel::Type::Boolean.new.cast(@options[:forward]) ) end diff --git a/app/views/admin/reports/index.html.haml b/app/views/admin/reports/index.html.haml index bb441380e..721c55f71 100644 --- a/app/views/admin/reports/index.html.haml +++ b/app/views/admin/reports/index.html.haml @@ -59,6 +59,10 @@ = fa_icon('camera') = report.media_attachments.count + - if report.forwarded? + · + = t('admin.reports.forwarded_to', domain: target_account.domain) + .report-card__summary__item__assigned - if report.assigned_account.present? = admin_account_link_to report.assigned_account diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index 2681419ca..b060c553f 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -46,6 +46,16 @@ %td{ colspan: 2 } - if @report.action_taken? = table_link_to 'envelope-open', t('admin.reports.reopen'), admin_report_path(@report, outcome: 'reopen'), method: :put + - unless @report.target_account.local? + %tr + %th= t('admin.reports.forwarded') + %td{ colspan: 3 } + - if @report.forwarded.nil? + \- + - elsif @report.forwarded? + = t('simple_form.yes') + - else + = t('simple_form.no') - if !@report.action_taken_by_account.nil? %tr %th= t('admin.reports.action_taken_by') diff --git a/config/locales/en.yml b/config/locales/en.yml index 114f86fd1..3ff01ac86 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -517,6 +517,8 @@ en: comment: none: None created_at: Reported + forwarded: Forwarded + forwarded_to: Forwarded to %{domain} mark_as_resolved: Mark as resolved mark_as_unresolved: Mark as unresolved notes: diff --git a/db/migrate/20200309150742_add_forwarded_to_reports.rb b/db/migrate/20200309150742_add_forwarded_to_reports.rb new file mode 100644 index 000000000..df278240b --- /dev/null +++ b/db/migrate/20200309150742_add_forwarded_to_reports.rb @@ -0,0 +1,5 @@ +class AddForwardedToReports < ActiveRecord::Migration[5.2] + def change + add_column :reports, :forwarded, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 2f9d369be..55822a4b3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -717,6 +717,7 @@ ActiveRecord::Schema.define(version: 2020_12_06_004238) do t.bigint "target_account_id", null: false t.bigint "assigned_account_id" t.string "uri" + t.boolean "forwarded" t.index ["account_id"], name: "index_reports_on_account_id" t.index ["target_account_id"], name: "index_reports_on_target_account_id" end From 75d2762fdf600de6785f612caf182b32064a9bf6 Mon Sep 17 00:00:00 2001 From: Mashiro Date: Tue, 15 Dec 2020 13:28:14 +0800 Subject: [PATCH 42/83] Add "invite request content" display in user account admin page (#15265) * feat: display `invite_request_text` in admin's user account page * fix: move invite_request to the bottom of accounts page * fix: remove time display, remove formate, change code terminology * fix: remove escape --- app/views/admin/accounts/show.html.haml | 10 ++++++++++ config/locales/en.yml | 1 + 2 files changed, 11 insertions(+) diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index d5978eddd..ae527cc23 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -242,3 +242,13 @@ .actions = f.button :button, t('admin.account_moderation_notes.create'), type: :submit + + %hr.spacer/ + + - if @account.user&.invite_request&.text&.present? + %div.speech-bubble + %div.speech-bubble__bubble + = @account.user&.invite_request&.text + %div.speech-bubble__owner + = admin_account_link_to @account + = t('admin.accounts.invite_request_text') diff --git a/config/locales/en.yml b/config/locales/en.yml index 3ff01ac86..1f5798fcc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -131,6 +131,7 @@ en: follows: Follows header: Header inbox_url: Inbox URL + invite_request_text: Reasons for joining invited_by: Invited by ip: IP joined: Joined From 1045549f85041b13002801808b30a332c3a68c61 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 15 Dec 2020 12:55:29 +0100 Subject: [PATCH 43/83] Add stoplight for object storage failures, return HTTP 503 (#13043) --- app/controllers/api/base_controller.rb | 2 +- app/controllers/application_controller.rb | 2 +- app/lib/activitypub/activity/create.rb | 4 ++++ config/initializers/paperclip.rb | 11 +++++++++++ lib/paperclip/attachment_extensions.rb | 17 +++++++++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index fe199e689..85f4cc768 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -40,7 +40,7 @@ class Api::BaseController < ApplicationController render json: { error: 'This action is not allowed' }, status: 403 end - rescue_from Mastodon::RaceConditionError do + rescue_from Mastodon::RaceConditionError, Seahorse::Client::NetworkingError, Stoplight::Error::RedLight do render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2201e463e..44616d6e5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -28,7 +28,7 @@ class ApplicationController < ActionController::Base rescue_from ActiveRecord::RecordNotFound, with: :not_found rescue_from Mastodon::NotPermittedError, with: :forbidden rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error - rescue_from Mastodon::RaceConditionError, with: :service_unavailable + rescue_from Mastodon::RaceConditionError, Seahorse::Client::NetworkingError, Stoplight::Error::RedLight, with: :service_unavailable rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests before_action :store_current_location, except: :raise_not_found, unless: :devise_controller? diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index c77f237f9..612744676 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -228,6 +228,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity emoji ||= CustomEmoji.new(domain: @account.domain, shortcode: shortcode, uri: uri) emoji.image_remote_url = image_url emoji.save + rescue Seahorse::Client::NetworkingError + nil end def process_attachments @@ -250,6 +252,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity media_attachment.save rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) + rescue Seahorse::Client::NetworkingError + nil end end diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb index 25adcd8d6..9ad7fd814 100644 --- a/config/initializers/paperclip.rb +++ b/config/initializers/paperclip.rb @@ -113,3 +113,14 @@ else end Paperclip.options[:content_type_mappings] = { csv: Import::FILE_TYPES } + +# In some places in the code, we rescue this exception, but we don't always +# load the S3 library, so it may be an undefined constant: + +unless defined?(Seahorse) + module Seahorse + module Client + class NetworkingError < StandardError; end + end + end +end diff --git a/lib/paperclip/attachment_extensions.rb b/lib/paperclip/attachment_extensions.rb index 752e79e65..94f7769b6 100644 --- a/lib/paperclip/attachment_extensions.rb +++ b/lib/paperclip/attachment_extensions.rb @@ -39,6 +39,23 @@ module Paperclip def default_url(style_name = default_style) @url_generator.for_as_default(style_name) end + + STOPLIGHT_THRESHOLD = 10 + STOPLIGHT_COOLDOWN = 30 + + # We overwrite this method to put a circuit breaker around + # calls to object storage, to stop hitting APIs that are slow + # to respond or don't respond at all and as such minimize the + # impact of object storage outages on application throughput + def save + Stoplight('object-storage') { super }.with_threshold(STOPLIGHT_THRESHOLD).with_cool_off_time(STOPLIGHT_COOLDOWN).with_error_handler do |error, handle| + if error.is_a?(Seahorse::Client::NetworkingError) + handle.call(error) + else + raise error + end + end.run + end end end From 1f564051b6b447e3663852c482982b3ff5a2f238 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 15 Dec 2020 12:56:43 +0100 Subject: [PATCH 44/83] Change RTL detection to rely on unicode-bidi paragraph by paragraph (#14573) --- app/helpers/statuses_helper.rb | 20 ------------ .../mastodon/components/autosuggest_input.js | 8 +---- .../components/autosuggest_textarea.js | 8 +---- .../mastodon/components/status_content.js | 18 ++++------- .../compose/components/reply_indicator.js | 6 +--- app/javascript/mastodon/rtl.js | 32 ------------------- app/javascript/styles/mailer.scss | 12 ++++++- .../styles/mastodon/components.scss | 2 ++ .../notification_mailer/_status.html.haml | 4 +-- app/views/statuses/_detailed_status.html.haml | 2 +- app/views/statuses/_simple_status.html.haml | 2 +- spec/helpers/statuses_helper_spec.rb | 18 ----------- 12 files changed, 26 insertions(+), 106 deletions(-) delete mode 100644 app/javascript/mastodon/rtl.js diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index daed9048f..1f654f34f 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -92,22 +92,6 @@ module StatusesHelper end end - def rtl_status?(status) - status.local? ? rtl?(status.text) : rtl?(strip_tags(status.text)) - end - - def rtl?(text) - text = simplified_text(text) - rtl_words = text.scan(/[\p{Hebrew}\p{Arabic}\p{Syriac}\p{Thaana}\p{Nko}]+/m) - - if rtl_words.present? - total_size = text.size.to_f - rtl_size(rtl_words) / total_size > 0.3 - else - false - end - end - def fa_visibility_icon(status) case status.visibility when 'public' @@ -143,10 +127,6 @@ module StatusesHelper end end - def rtl_size(words) - words.reduce(0) { |acc, elem| acc + elem.size }.to_f - end - def embedded_view? params[:controller] == EMBEDDED_CONTROLLER && params[:action] == EMBEDDED_ACTION end diff --git a/app/javascript/mastodon/components/autosuggest_input.js b/app/javascript/mastodon/components/autosuggest_input.js index 6d2035add..5187f95c8 100644 --- a/app/javascript/mastodon/components/autosuggest_input.js +++ b/app/javascript/mastodon/components/autosuggest_input.js @@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji'; import AutosuggestHashtag from './autosuggest_hashtag'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { isRtl } from '../rtl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import classNames from 'classnames'; import { List as ImmutableList } from 'immutable'; @@ -189,11 +188,6 @@ export default class AutosuggestInput extends ImmutablePureComponent { render () { const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength } = this.props; const { suggestionsHidden } = this.state; - const style = { direction: 'ltr' }; - - if (isRtl(value)) { - style.direction = 'rtl'; - } return (
    @@ -212,7 +206,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { onKeyUp={onKeyUp} onFocus={this.onFocus} onBlur={this.onBlur} - style={style} + dir='auto' aria-autocomplete='list' id={id} className={className} diff --git a/app/javascript/mastodon/components/autosuggest_textarea.js b/app/javascript/mastodon/components/autosuggest_textarea.js index 58ec4f6eb..08b9cd80b 100644 --- a/app/javascript/mastodon/components/autosuggest_textarea.js +++ b/app/javascript/mastodon/components/autosuggest_textarea.js @@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji'; import AutosuggestHashtag from './autosuggest_hashtag'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { isRtl } from '../rtl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Textarea from 'react-textarea-autosize'; import classNames from 'classnames'; @@ -195,11 +194,6 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { render () { const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props; const { suggestionsHidden } = this.state; - const style = { direction: 'ltr' }; - - if (isRtl(value)) { - style.direction = 'rtl'; - } return [
    @@ -220,7 +214,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { onFocus={this.onFocus} onBlur={this.onBlur} onPaste={this.onPaste} - style={style} + dir='auto' aria-autocomplete='list' /> diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js index 3200f2d82..185a2a663 100644 --- a/app/javascript/mastodon/components/status_content.js +++ b/app/javascript/mastodon/components/status_content.js @@ -1,7 +1,6 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { isRtl } from '../rtl'; import { FormattedMessage } from 'react-intl'; import Permalink from './permalink'; import classnames from 'classnames'; @@ -186,17 +185,12 @@ export default class StatusContent extends React.PureComponent { const content = { __html: status.get('contentHtml') }; const spoilerContent = { __html: status.get('spoilerHtml') }; - const directionStyle = { direction: 'ltr' }; const classNames = classnames('status__content', { 'status__content--with-action': this.props.onClick && this.context.router, 'status__content--with-spoiler': status.get('spoiler_text').length > 0, 'status__content--collapsed': renderReadMore, }); - if (isRtl(status.get('search_index'))) { - directionStyle.direction = 'rtl'; - } - const showThreadButton = ( + ); + } + +} diff --git a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js index 6daf75814..df9b7fb1b 100644 --- a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js +++ b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js @@ -2,7 +2,8 @@ import React from 'react'; import Icon from 'mastodon/components/icon'; import Button from 'mastodon/components/button'; import IconButton from 'mastodon/components/icon_button'; -import { requestBrowserPermission, dismissBrowserPermission } from 'mastodon/actions/notifications'; +import { requestBrowserPermission } from 'mastodon/actions/notifications'; +import { changeSetting } from 'mastodon/actions/settings'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; @@ -25,7 +26,7 @@ class NotificationsPermissionBanner extends React.PureComponent { } handleClose = () => { - this.props.dispatch(dismissBrowserPermission()); + this.props.dispatch(changeSetting(['notifications', 'dismissPermissionBanner'], true)); } render () { diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js index 2e0afd863..108470c9a 100644 --- a/app/javascript/mastodon/features/notifications/index.js +++ b/app/javascript/mastodon/features/notifications/index.js @@ -62,7 +62,7 @@ const mapStateToProps = state => ({ numPending: state.getIn(['notifications', 'pendingItems'], ImmutableList()).size, lastReadId: state.getIn(['notifications', 'readMarkerId']), canMarkAsRead: state.getIn(['notifications', 'readMarkerId']) !== '0' && getNotifications(state).some(item => item !== null && compareId(item.get('id'), state.getIn(['notifications', 'readMarkerId'])) > 0), - needsNotificationPermission: state.getIn(['settings', 'notifications', 'alerts']).includes(true) && state.getIn(['notifications', 'browserSupport']) && state.getIn(['notifications', 'browserPermission']) === 'default', + needsNotificationPermission: state.getIn(['settings', 'notifications', 'alerts']).includes(true) && state.getIn(['notifications', 'browserSupport']) && state.getIn(['notifications', 'browserPermission']) === 'default' && !state.getIn(['settings', 'notifications', 'dismissPermissionBanner']), }); export default @connect(mapStateToProps) diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 46a9d5376..1d4874717 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -12,7 +12,6 @@ import { NOTIFICATIONS_MARK_AS_READ, NOTIFICATIONS_SET_BROWSER_SUPPORT, NOTIFICATIONS_SET_BROWSER_PERMISSION, - NOTIFICATIONS_DISMISS_BROWSER_PERMISSION, } from '../actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, @@ -251,8 +250,6 @@ export default function notifications(state = initialState, action) { return state.set('browserSupport', action.value); case NOTIFICATIONS_SET_BROWSER_PERMISSION: return state.set('browserPermission', action.value); - case NOTIFICATIONS_DISMISS_BROWSER_PERMISSION: - return state.set('browserPermission', 'denied'); default: return state; } diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index 057fa353a..357ab352a 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -44,6 +44,8 @@ const initialState = ImmutableMap({ advanced: false, }), + dismissPermissionBanner: false, + shows: ImmutableMap({ follow: true, follow_request: false, diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 22bf025fb..2163d74fc 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3459,6 +3459,12 @@ a.status-card.compact:hover { } } +.column-header__permission-btn { + display: inline; + font-weight: inherit; + text-decoration: underline; +} + .column-header__setting-arrows { float: right; @@ -3857,7 +3863,7 @@ a.status-card.compact:hover { } .column-settings__row { - .text-btn { + .text-btn:not(.column-header__permission-btn) { margin-bottom: 15px; } } From 2032748050b5ed1491473886107f622eea8e0c3f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 16 Dec 2020 03:24:55 +0100 Subject: [PATCH 48/83] New Crowdin updates (#15220) * New translations doorkeeper.en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations doorkeeper.en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations doorkeeper.en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations doorkeeper.en.yml (Japanese) [ci skip] * New translations doorkeeper.en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.json (Basque) [ci skip] * New translations doorkeeper.en.yml (Greek) [ci skip] * New translations en.json (Greek) [ci skip] * New translations doorkeeper.en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations doorkeeper.en.yml (Danish) [ci skip] * New translations simple_form.en.yml (Danish) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.json (Danish) [ci skip] * New translations doorkeeper.en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations doorkeeper.en.yml (Basque) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations doorkeeper.en.yml (Hungarian) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations doorkeeper.en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations doorkeeper.en.yml (Armenian) [ci skip] * New translations simple_form.en.yml (Armenian) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Finnish) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations doorkeeper.en.yml (Hebrew) [ci skip] * New translations simple_form.en.yml (Hebrew) [ci skip] * New translations en.yml (Hebrew) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations doorkeeper.en.yml (Finnish) [ci skip] * New translations simple_form.en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (Catalan) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations simple_form.en.yml (Vietnamese) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations simple_form.en.yml (Swedish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations en.yml (Sardinian) [ci skip] * New translations simple_form.en.yml (Sardinian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations simple_form.en.yml (Icelandic) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations simple_form.en.yml (Albanian) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations simple_form.en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Kabyle) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Sardinian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations devise.en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Sardinian) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations simple_form.en.yml (Armenian) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * ran `yarn manage:translations` * ran `i18n-tasks normalize` * Ran `yarn manage:translations` * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Korean) [ci skip] * Ran `i18n-tasks normalize` Co-authored-by: Yamagishi Kazutoshi --- app/javascript/mastodon/locales/ar.json | 10 +- app/javascript/mastodon/locales/ast.json | 10 +- app/javascript/mastodon/locales/bg.json | 10 +- app/javascript/mastodon/locales/bn.json | 10 +- app/javascript/mastodon/locales/br.json | 10 +- app/javascript/mastodon/locales/ca.json | 10 +- app/javascript/mastodon/locales/co.json | 10 +- app/javascript/mastodon/locales/cs.json | 16 +- app/javascript/mastodon/locales/cy.json | 10 +- app/javascript/mastodon/locales/da.json | 10 +- app/javascript/mastodon/locales/de.json | 12 +- .../mastodon/locales/defaultMessages.json | 53 +- app/javascript/mastodon/locales/el.json | 10 +- app/javascript/mastodon/locales/en.json | 10 +- app/javascript/mastodon/locales/eo.json | 28 +- app/javascript/mastodon/locales/es-AR.json | 10 +- app/javascript/mastodon/locales/es.json | 12 +- app/javascript/mastodon/locales/et.json | 10 +- app/javascript/mastodon/locales/eu.json | 10 +- app/javascript/mastodon/locales/fa.json | 16 +- app/javascript/mastodon/locales/fi.json | 10 +- app/javascript/mastodon/locales/fr.json | 14 +- app/javascript/mastodon/locales/ga.json | 10 +- app/javascript/mastodon/locales/gl.json | 10 +- app/javascript/mastodon/locales/he.json | 10 +- app/javascript/mastodon/locales/hi.json | 10 +- app/javascript/mastodon/locales/hr.json | 10 +- app/javascript/mastodon/locales/hu.json | 10 +- app/javascript/mastodon/locales/hy.json | 10 +- app/javascript/mastodon/locales/id.json | 10 +- app/javascript/mastodon/locales/io.json | 10 +- app/javascript/mastodon/locales/is.json | 10 +- app/javascript/mastodon/locales/it.json | 10 +- app/javascript/mastodon/locales/ja.json | 14 +- app/javascript/mastodon/locales/ka.json | 10 +- app/javascript/mastodon/locales/kab.json | 12 +- app/javascript/mastodon/locales/kk.json | 10 +- app/javascript/mastodon/locales/kn.json | 10 +- app/javascript/mastodon/locales/ko.json | 20 +- app/javascript/mastodon/locales/ku.json | 16 +- app/javascript/mastodon/locales/lt.json | 10 +- app/javascript/mastodon/locales/lv.json | 10 +- app/javascript/mastodon/locales/mk.json | 10 +- app/javascript/mastodon/locales/ml.json | 10 +- app/javascript/mastodon/locales/mr.json | 10 +- app/javascript/mastodon/locales/ms.json | 10 +- app/javascript/mastodon/locales/nl.json | 54 +- app/javascript/mastodon/locales/nn.json | 10 +- app/javascript/mastodon/locales/no.json | 10 +- app/javascript/mastodon/locales/oc.json | 10 +- app/javascript/mastodon/locales/pl.json | 12 +- app/javascript/mastodon/locales/pt-BR.json | 10 +- app/javascript/mastodon/locales/pt-PT.json | 10 +- app/javascript/mastodon/locales/ro.json | 10 +- app/javascript/mastodon/locales/ru.json | 10 +- app/javascript/mastodon/locales/sa.json | 10 +- app/javascript/mastodon/locales/sc.json | 184 +-- app/javascript/mastodon/locales/sk.json | 10 +- app/javascript/mastodon/locales/sl.json | 10 +- app/javascript/mastodon/locales/sq.json | 10 +- app/javascript/mastodon/locales/sr-Latn.json | 10 +- app/javascript/mastodon/locales/sr.json | 10 +- app/javascript/mastodon/locales/sv.json | 20 +- app/javascript/mastodon/locales/szl.json | 10 +- app/javascript/mastodon/locales/ta.json | 10 +- app/javascript/mastodon/locales/tai.json | 10 +- app/javascript/mastodon/locales/te.json | 10 +- app/javascript/mastodon/locales/th.json | 18 +- app/javascript/mastodon/locales/tr.json | 10 +- app/javascript/mastodon/locales/tt.json | 486 ++++++ app/javascript/mastodon/locales/ug.json | 10 +- app/javascript/mastodon/locales/uk.json | 10 +- app/javascript/mastodon/locales/ur.json | 10 +- app/javascript/mastodon/locales/vi.json | 94 +- .../mastodon/locales/whitelist_tt.json | 2 + app/javascript/mastodon/locales/zgh.json | 180 ++- app/javascript/mastodon/locales/zh-CN.json | 10 +- app/javascript/mastodon/locales/zh-HK.json | 232 +-- app/javascript/mastodon/locales/zh-TW.json | 38 +- config/locales/activerecord.sc.yml | 11 + config/locales/activerecord.tt.yml | 1 + config/locales/ca.yml | 11 + config/locales/co.yml | 3 + config/locales/de.yml | 11 + config/locales/devise.hu.yml | 4 +- config/locales/devise.ko.yml | 4 +- config/locales/devise.nl.yml | 17 + config/locales/devise.sc.yml | 114 ++ config/locales/devise.tt.yml | 1 + config/locales/devise.vi.yml | 10 +- config/locales/devise.zh-HK.yml | 86 +- config/locales/devise.zh-TW.yml | 17 + config/locales/doorkeeper.es.yml | 152 +- config/locales/doorkeeper.sc.yml | 150 ++ config/locales/doorkeeper.tt.yml | 1 + config/locales/doorkeeper.vi.yml | 8 +- config/locales/doorkeeper.zgh.yml | 35 + config/locales/doorkeeper.zh-HK.yml | 102 +- config/locales/el.yml | 11 + config/locales/eo.yml | 48 +- config/locales/es-AR.yml | 11 + config/locales/es.yml | 9 + config/locales/fa.yml | 22 + config/locales/fr.yml | 17 +- config/locales/gl.yml | 9 + config/locales/hu.yml | 11 + config/locales/hy.yml | 7 + config/locales/id.yml | 3 + config/locales/is.yml | 12 + config/locales/it.yml | 11 + config/locales/ja.yml | 13 + config/locales/kab.yml | 3 + config/locales/ko.yml | 12 +- config/locales/ku.yml | 16 + config/locales/nl.yml | 80 +- config/locales/oc.yml | 6 + config/locales/pl.yml | 11 + config/locales/pt-PT.yml | 1 + config/locales/ru.yml | 11 + config/locales/sc.yml | 1426 ++++++++++++++++- config/locales/simple_form.ca.yml | 1 + config/locales/simple_form.de.yml | 1 + config/locales/simple_form.el.yml | 12 + config/locales/simple_form.eo.yml | 18 +- config/locales/simple_form.es-AR.yml | 1 + config/locales/simple_form.es.yml | 1 + config/locales/simple_form.fa.yml | 1 + config/locales/simple_form.fr.yml | 19 +- config/locales/simple_form.gl.yml | 11 +- config/locales/simple_form.hu.yml | 1 + config/locales/simple_form.hy.yml | 1 + config/locales/simple_form.is.yml | 1 + config/locales/simple_form.it.yml | 1 + config/locales/simple_form.ko.yml | 1 + config/locales/simple_form.ku.yml | 1 + config/locales/simple_form.nl.yml | 16 + config/locales/simple_form.pl.yml | 1 + config/locales/simple_form.pt-PT.yml | 1 + config/locales/simple_form.ru.yml | 1 + config/locales/simple_form.sc.yml | 212 +++ config/locales/simple_form.sq.yml | 1 + config/locales/simple_form.sv.yml | 1 + config/locales/simple_form.th.yml | 10 +- config/locales/simple_form.tr.yml | 1 + config/locales/simple_form.tt.yml | 1 + config/locales/simple_form.vi.yml | 3 +- config/locales/simple_form.zh-CN.yml | 1 + config/locales/simple_form.zh-HK.yml | 162 +- config/locales/simple_form.zh-TW.yml | 11 + config/locales/sq.yml | 10 + config/locales/sv.yml | 10 + config/locales/th.yml | 19 +- config/locales/tr.yml | 4 + config/locales/tt.yml | 12 + config/locales/vi.yml | 211 +-- config/locales/zgh.yml | 13 + config/locales/zh-CN.yml | 12 +- config/locales/zh-HK.yml | 931 +++++++++-- config/locales/zh-TW.yml | 132 ++ 159 files changed, 5208 insertions(+), 1230 deletions(-) create mode 100644 app/javascript/mastodon/locales/tt.json create mode 100644 app/javascript/mastodon/locales/whitelist_tt.json create mode 100644 config/locales/activerecord.tt.yml create mode 100644 config/locales/devise.tt.yml create mode 100644 config/locales/doorkeeper.tt.yml create mode 100644 config/locales/simple_form.tt.yml create mode 100644 config/locales/tt.yml diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 8f0e04561..4d43a2720 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "نتائج البحث", "emoji_button.symbols": "رموز", "emoji_button.travel": "الأماكن والسفر", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "ليس هناك تبويقات!", "empty_column.account_unavailable": "الملف التعريفي غير متوفر", "empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "التالي", "lightbox.previous": "العودة", - "lightbox.view_context": "اعرض السياق", "lists.account.add": "أضف إلى القائمة", "lists.account.remove": "احذف من القائمة", "lists.delete": "احذف القائمة", @@ -266,9 +266,9 @@ "lists.edit.submit": "تعديل العنوان", "lists.new.create": "إنشاء قائمة", "lists.new.title_placeholder": "عنوان القائمة الجديدة", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "إبحث في قائمة الحسابات التي تُتابِعها", "lists.subheading": "قوائمك", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "الإشارات", "notifications.filter.polls": "نتائج استطلاع الرأي", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} إشعارات", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index e0b67d6bb..4f5fec8b1 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viaxes y llugares", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "¡Equí nun hai barritos!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "Entá nun bloquiesti a nunengún usuariu.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Siguiente", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Amestar a la llista", "lists.account.remove": "Desaniciar de la llista", "lists.delete": "Desaniciar la llista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "Títulu nuevu de la llista", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Guetar ente la xente que sigues", "lists.subheading": "Les tos llistes", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menciones", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} avisos", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 3ffa07a71..4778d6618 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 056a3d424..9b73c3597 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "খোঁজার ফলাফল", "emoji_button.symbols": "প্রতীক", "emoji_button.travel": "ভ্রমণ এবং স্থান", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "এখানে কোনো টুট নেই!", "empty_column.account_unavailable": "নিজস্ব পাতা নেই", "empty_column.blocks": "আপনি কোনো ব্যবহারকারীদের ব্লক করেন নি।", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "পরবর্তী", "lightbox.previous": "পূর্ববর্তী", - "lightbox.view_context": "প্রসঙ্গটি দেখতে", "lists.account.add": "তালিকাতে যুক্ত করতে", "lists.account.remove": "তালিকা থেকে বাদ দিতে", "lists.delete": "তালিকা মুছে ফেলতে", @@ -266,9 +266,9 @@ "lists.edit.submit": "শিরোনাম সম্পাদনা করতে", "lists.new.create": "তালিকাতে যুক্ত করতে", "lists.new.title_placeholder": "তালিকার নতুন শিরোনাম দিতে", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "যাদের অনুসরণ করেন তাদের ভেতরে খুঁজুন", "lists.subheading": "আপনার তালিকা", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "উল্লেখিত", "notifications.filter.polls": "নির্বাচনের ফলাফল", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} প্রজ্ঞাপন", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index ce7260477..84c5f4523 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Disoc'hoù an enklask", "emoji_button.symbols": "Arouezioù", "emoji_button.travel": "Lec'hioù ha Beajoù", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Toud ebet amañ!", "empty_column.account_unavailable": "Profil dihegerz", "empty_column.blocks": "N'eus ket bet berzet implijer·ez ganeoc'h c'hoazh.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Da-heul", "lightbox.previous": "A-raok", - "lightbox.view_context": "Diskouez ar c'hemperzh", "lists.account.add": "Ouzhpennañ d'al listenn", "lists.account.remove": "Lemel kuit eus al listenn", "lists.delete": "Dilemel al listenn", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cheñch an titl", "lists.new.create": "Ouzhpennañ ul listenn", "lists.new.title_placeholder": "Titl nevez al listenn", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Ho listennoù", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menegoù", "notifications.filter.polls": "Disoc'hoù ar sontadegoù", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} a gemennoù", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 93bcffeaa..7066d9999 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Resultats de la cerca", "emoji_button.symbols": "Símbols", "emoji_button.travel": "Viatges i Llocs", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No hi ha tuts aquí!", "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Encara no has bloquejat cap usuari.", @@ -258,7 +259,6 @@ "lightbox.expand": "Amplia el quadre de visualització de l’imatge", "lightbox.next": "Següent", "lightbox.previous": "Anterior", - "lightbox.view_context": "Veure el context", "lists.account.add": "Afegir a la llista", "lists.account.remove": "Treure de la llista", "lists.delete": "Esborrar llista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Canvi de títol", "lists.new.create": "Afegir llista", "lists.new.title_placeholder": "Nova llista", - "lists.replies_policy.all_replies": "Qualsevol usuari seguit", - "lists.replies_policy.list_replies": "Membres de la llista", - "lists.replies_policy.no_replies": "Ningú", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostra respostes a:", "lists.search": "Cercar entre les persones que segueixes", "lists.subheading": "Les teves llistes", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mencions", "notifications.filter.polls": "Resultats de l'enquesta", "notifications.filter.statuses": "Actualitzacions de gent que segueixes", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificacions", "notifications.mark_as_read": "Marca cada notificació com a llegida", "notifications.permission_denied": "No s’ha pogut activar les notificacions d’escriptori perquè s’ha denegat el permís.", "notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Activar les notificacions d’escriptori", "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no està obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.", "notifications_permission_banner.title": "Mai et perdis res", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 10d5f9008..7058fa7b1 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Risultati di a cerca", "emoji_button.symbols": "Simbuli", "emoji_button.travel": "Lochi è Viaghju", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Nisun statutu quì!", "empty_column.account_unavailable": "Prufile micca dispunibule", "empty_column.blocks": "Per avà ùn avete bluccatu manc'un utilizatore.", @@ -258,7 +259,6 @@ "lightbox.expand": "Ingrandà a finestra d'affissera di i ritratti", "lightbox.next": "Siguente", "lightbox.previous": "Pricidente", - "lightbox.view_context": "Vede u cuntestu", "lists.account.add": "Aghjunghje à a lista", "lists.account.remove": "Toglie di a lista", "lists.delete": "Toglie a lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambià u titulu", "lists.new.create": "Aghjunghje", "lists.new.title_placeholder": "Titulu di a lista", - "lists.replies_policy.all_replies": "Tutti i vostri abbunamenti", - "lists.replies_policy.list_replies": "Membri di a lista", - "lists.replies_policy.no_replies": "Nisunu", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Vede e risposte à:", "lists.search": "Circà indè i vostr'abbunamenti", "lists.subheading": "E vo liste", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Minzione", "notifications.filter.polls": "Risultati di u scandagliu", "notifications.filter.statuses": "Messe à ghjornu di e persone chì siguitate", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} nutificazione", "notifications.mark_as_read": "Marcà tutte e nutificazione cum'è lette", "notifications.permission_denied": "Ùn si po micca attivà e nutificazione desktop perchè a dumanda d'auturizazione hè stata ricusata", "notifications.permission_denied_alert": "Ùn pudete micca attivà e nutificazione nant'à l'urdinatore, perchè avete digià ricusatu a dumanda d'auturizazione di u navigatore", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Attivà e nutificazione nant'à l'urdinatore", "notifications_permission_banner.how_to_control": "Per riceve nutificazione quandu Mastodon ùn hè micca aperta, attivate e nutificazione nant'à l'urdinatore. Pudete decide quali tippi d'interazione anu da mandà ste nutificazione cù u buttone {icon} quì sopra quandu saranu attivate.", "notifications_permission_banner.title": "Ùn mancate mai nunda", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index c43b3c875..76df857d8 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -12,12 +12,12 @@ "account.disable_notifications": "Stop notifying me when @{name} posts", "account.domain_blocked": "Doména skryta", "account.edit_profile": "Upravit profil", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "Oznámit mě na příspěvky @{name}", "account.endorse": "Zvýraznit na profilu", "account.follow": "Sledovat", "account.followers": "Sledující", "account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.", - "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", + "account.followers_counter": "{count, plural, one {{counter} sledující} few {{counter} sledující} many {{counter} sledujících} other {{counter} sledujících}}", "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.", "account.follows_you": "Sleduje vás", @@ -149,6 +149,7 @@ "emoji_button.search_results": "Výsledky hledání", "emoji_button.symbols": "Symboly", "emoji_button.travel": "Cestování a místa", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Nejsou tu žádné tooty!", "empty_column.account_unavailable": "Profil nedostupný", "empty_column.blocks": "Ještě jste nezablokovali žádného uživatele.", @@ -176,7 +177,7 @@ "follow_request.authorize": "Autorizovat", "follow_request.reject": "Odmítnout", "follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, {domain} si myslí, že budete chtít následující požadavky na sledování zkontrolovat ručně.", - "generic.saved": "Saved", + "generic.saved": "Uloženo", "getting_started.developers": "Vývojáři", "getting_started.directory": "Adresář profilů", "getting_started.documentation": "Dokumentace", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Další", "lightbox.previous": "Předchozí", - "lightbox.view_context": "Zobrazit kontext", "lists.account.add": "Přidat do seznamu", "lists.account.remove": "Odebrat ze seznamu", "lists.delete": "Smazat seznam", @@ -266,9 +266,9 @@ "lists.edit.submit": "Změnit název", "lists.new.create": "Přidat seznam", "lists.new.title_placeholder": "Název nového seznamu", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Hledejte mezi lidmi, které sledujete", "lists.subheading": "Vaše seznamy", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Zmínky", "notifications.filter.polls": "Výsledky anket", "notifications.filter.statuses": "Aktuality od lidí, které sledujete", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} oznámení", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index e5f2e69b0..b3c1947b4 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Canlyniadau chwilio", "emoji_button.symbols": "Symbolau", "emoji_button.travel": "Teithio & Llefydd", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Dim tŵtiau fama!", "empty_column.account_unavailable": "Proffil ddim ar gael", "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Nesaf", "lightbox.previous": "Blaenorol", - "lightbox.view_context": "Gweld cyd-destyn", "lists.account.add": "Ychwanegwch at restr", "lists.account.remove": "Dileu o'r rhestr", "lists.delete": "Dileu rhestr", @@ -266,9 +266,9 @@ "lists.edit.submit": "Newid teitl", "lists.new.create": "Ychwanegu rhestr", "lists.new.title_placeholder": "Teitl rhestr newydd", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn", "lists.subheading": "Eich rhestrau", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Crybwylliadau", "notifications.filter.polls": "Canlyniadau pleidlais", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} o hysbysiadau", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 4b312a8f4..7c4b3e4ef 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Søgeresultater", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Rejser & steder", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Ingen bidrag her!", "empty_column.account_unavailable": "Profil utilgængelig", "empty_column.blocks": "Du har ikke blokeret nogen endnu.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Næste", "lightbox.previous": "Forrige", - "lightbox.view_context": "Vis kontekst", "lists.account.add": "Tilføj til liste", "lists.account.remove": "Fjern fra liste", "lists.delete": "Slet liste", @@ -266,9 +266,9 @@ "lists.edit.submit": "Skift titel", "lists.new.create": "Tilføj liste", "lists.new.title_placeholder": "Ny liste titel", - "lists.replies_policy.all_replies": "Enhver fulgt bruger", - "lists.replies_policy.list_replies": "Medlemmer af listen", - "lists.replies_policy.no_replies": "Ingen", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Vis svar til:", "lists.search": "Søg iblandt folk du følger", "lists.subheading": "Dine lister", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Statusser der nævner dig", "notifications.filter.polls": "Afstemningsresultat", "notifications.filter.statuses": "Opdateringer fra personer, du følger", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifikationer", "notifications.mark_as_read": "Markér alle notifikationer som læst", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Aktivér skrivebordsmeddelelser", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Gå aldrig glip af noget", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index ff5fec1f7..c2bb08596 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Suchergebnisse", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Reisen und Orte", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Keine Beiträge!", "empty_column.account_unavailable": "Konto nicht verfügbar", "empty_column.blocks": "Du hast keine Profile blockiert.", @@ -258,7 +259,6 @@ "lightbox.expand": "Bildansicht erweitern", "lightbox.next": "Weiter", "lightbox.previous": "Zurück", - "lightbox.view_context": "Beitrag sehen", "lists.account.add": "Zur Liste hinzufügen", "lists.account.remove": "Von der Liste entfernen", "lists.delete": "Liste löschen", @@ -266,9 +266,9 @@ "lists.edit.submit": "Titel ändern", "lists.new.create": "Liste hinzufügen", "lists.new.title_placeholder": "Neuer Titel der Liste", - "lists.replies_policy.all_replies": "Jeder gefolgte Benutzer", - "lists.replies_policy.list_replies": "Mitglieder der Liste", - "lists.replies_policy.no_replies": "Niemand", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Antworten anzeigen für:", "lists.search": "Suche nach Leuten denen du folgst", "lists.subheading": "Deine Listen", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Erwähnungen", "notifications.filter.polls": "Ergebnisse der Umfrage", "notifications.filter.statuses": "Updates von Personen, denen du folgst", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} Benachrichtigungen", "notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren", "notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.", "notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Aktiviere Desktop-Benachrichtigungen", "notifications_permission_banner.how_to_control": "Um Benachrichtigungen zu erhalten, wenn Mastodon nicht geöffnet ist, aktiviere die Desktop-Benachrichtigungen. Du kannst genau bestimmen, welche Arten von Interaktionen Desktop-Benachrichtigungen über die {icon} -Taste erzeugen, sobald diese aktiviert sind.", "notifications_permission_banner.title": "Verpasse nie etwas", @@ -379,7 +381,7 @@ "search_popout.search_format": "Fortgeschrittenes Suchformat", "search_popout.tips.full_text": "Einfache Texteingabe gibt Beiträge, die du geschrieben, favorisiert und geteilt hast zurück. Außerdem auch Beiträge in denen du erwähnt wurdest, aber auch passende Nutzernamen, Anzeigenamen oder Hashtags.", "search_popout.tips.hashtag": "Hashtag", - "search_popout.tips.status": "Beitrag", + "search_popout.tips.status": "Tröt", "search_popout.tips.text": "Einfache Texteingabe gibt Anzeigenamen, Benutzernamen und Hashtags zurück", "search_popout.tips.user": "Nutzer", "search_results.accounts": "Personen", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index ae9ba853e..d9ebf0a4c 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -652,6 +652,10 @@ }, { "descriptors": [ + { + "defaultMessage": "Account suspended", + "id": "empty_column.account_suspended" + }, { "defaultMessage": "Profile unavailable", "id": "empty_column.account_unavailable" @@ -712,6 +716,10 @@ "defaultMessage": "Older toots", "id": "timeline_hint.resources.statuses" }, + { + "defaultMessage": "Account suspended", + "id": "empty_column.account_suspended" + }, { "defaultMessage": "Profile unavailable", "id": "empty_column.account_unavailable" @@ -2161,15 +2169,15 @@ }, { "defaultMessage": "Any followed user", - "id": "lists.replies_policy.all_replies" + "id": "lists.replies_policy.followed" }, { "defaultMessage": "No one", - "id": "lists.replies_policy.no_replies" + "id": "lists.replies_policy.none" }, { "defaultMessage": "Members of the list", - "id": "lists.replies_policy.list_replies" + "id": "lists.replies_policy.list" }, { "defaultMessage": "Edit list", @@ -2272,6 +2280,10 @@ "defaultMessage": "Desktop notifications are unavailable due to previously denied browser permissions request", "id": "notifications.permission_denied" }, + { + "defaultMessage": "Desktop notifications are unavailable because the required permission has not been granted.", + "id": "notifications.permission_required" + }, { "defaultMessage": "Quick filter bar", "id": "notifications.column_settings.filter_bar.category" @@ -2353,6 +2365,15 @@ ], "path": "app/javascript/mastodon/features/notifications/components/follow_request.json" }, + { + "descriptors": [ + { + "defaultMessage": "Grant permission.", + "id": "notifications.grant_permission" + } + ], + "path": "app/javascript/mastodon/features/notifications/components/grant_permission_button.json" + }, { "descriptors": [ { @@ -2478,6 +2499,10 @@ { "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "id": "confirmations.reply.message" + }, + { + "defaultMessage": "Expand this status", + "id": "status.open" } ], "path": "app/javascript/mastodon/features/picture_in_picture/components/footer.json" @@ -2764,15 +2789,6 @@ ], "path": "app/javascript/mastodon/features/status/index.json" }, - { - "descriptors": [ - { - "defaultMessage": "View context", - "id": "lightbox.view_context" - } - ], - "path": "app/javascript/mastodon/features/ui/components/audio_modal.json" - }, { "descriptors": [ { @@ -3036,10 +3052,6 @@ { "defaultMessage": "Next", "id": "lightbox.next" - }, - { - "defaultMessage": "View context", - "id": "lightbox.view_context" } ], "path": "app/javascript/mastodon/features/ui/components/media_modal.json" @@ -3205,15 +3217,6 @@ ], "path": "app/javascript/mastodon/features/ui/components/upload_area.json" }, - { - "descriptors": [ - { - "defaultMessage": "View context", - "id": "lightbox.view_context" - } - ], - "path": "app/javascript/mastodon/features/ui/components/video_modal.json" - }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index bd9f2e7ff..4d1aa5782 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Αποτελέσματα αναζήτησης", "emoji_button.symbols": "Σύμβολα", "emoji_button.travel": "Ταξίδια & Τοποθεσίες", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Δεν έχει τουτ εδώ!", "empty_column.account_unavailable": "Μη διαθέσιμο προφίλ", "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμα.", @@ -258,7 +259,6 @@ "lightbox.expand": "Ανάπτυξη πλαισίου εμφάνισης εικόνας", "lightbox.next": "Επόμενο", "lightbox.previous": "Προηγούμενο", - "lightbox.view_context": "Εμφάνιση πλαισίου", "lists.account.add": "Πρόσθεσε στη λίστα", "lists.account.remove": "Βγάλε από τη λίστα", "lists.delete": "Διαγραφή λίστας", @@ -266,9 +266,9 @@ "lists.edit.submit": "Αλλαγή τίτλου", "lists.new.create": "Προσθήκη λίστας", "lists.new.title_placeholder": "Τίτλος νέας λίστα", - "lists.replies_policy.all_replies": "Οποιοσδήποτε χρήστης που ακολουθείς", - "lists.replies_policy.list_replies": "Μέλη της λίστας", - "lists.replies_policy.no_replies": "Κανείς", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Εμφάνιση απαντήσεων σε:", "lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς", "lists.subheading": "Οι λίστες σου", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Αναφορές", "notifications.filter.polls": "Αποτελέσματα ψηφοφορίας", "notifications.filter.statuses": "Ενημερώσεις από όσους ακολουθείς", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} ειδοποιήσεις", "notifications.mark_as_read": "Σημείωσε όλες τις ειδοποιήσεις ως αναγνωσμένες", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Ενεργοποίηση ειδοποιήσεων επιφάνειας εργασίας", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Μη χάσετε τίποτα", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index ccc95db7a..3f8d37249 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 1b5f18884..57e3208fb 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -6,7 +6,7 @@ "account.block": "Bloki @{name}", "account.block_domain": "Bloki {domain}", "account.blocked": "Blokita", - "account.browse_more_on_origin_server": "Browse more on the original profile", + "account.browse_more_on_origin_server": "Rigardi pli al la originala profilo", "account.cancel_follow_request": "Nuligi peton de sekvado", "account.direct": "Rekte mesaĝi @{name}", "account.disable_notifications": "Stop notifying me when @{name} posts", @@ -149,6 +149,7 @@ "emoji_button.search_results": "Serĉaj rezultoj", "emoji_button.symbols": "Simboloj", "emoji_button.travel": "Vojaĝoj kaj lokoj", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Neniu mesaĝo ĉi tie!", "empty_column.account_unavailable": "Profilo ne disponebla", "empty_column.blocks": "Vi ankoraŭ ne blokis uzanton.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Sekva", "lightbox.previous": "Antaŭa", - "lightbox.view_context": "Vidi kuntekston", "lists.account.add": "Aldoni al la listo", "lists.account.remove": "Forigi de la listo", "lists.delete": "Forigi la liston", @@ -266,10 +266,10 @@ "lists.edit.submit": "Ŝanĝi titolon", "lists.new.create": "Aldoni liston", "lists.new.title_placeholder": "Titolo de la nova listo", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", - "lists.replies_policy.title": "Show replies to:", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", + "lists.replies_policy.title": "Montri respondon al:", "lists.search": "Serĉi inter la homoj, kiujn vi sekvas", "lists.subheading": "Viaj listoj", "load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}", @@ -277,9 +277,9 @@ "media_gallery.toggle_visible": "Baskuligi videblecon", "missing_indicator.label": "Ne trovita", "missing_indicator.sublabel": "Ĉi tiu elemento ne estis trovita", - "mute_modal.duration": "Duration", + "mute_modal.duration": "Daŭro", "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn de ĉi tiu uzanto?", - "mute_modal.indefinite": "Indefinite", + "mute_modal.indefinite": "Nedifinita", "navigation_bar.apps": "Telefonaj aplikaĵoj", "navigation_bar.blocks": "Blokitaj uzantoj", "navigation_bar.bookmarks": "Legosignoj", @@ -310,7 +310,7 @@ "notification.own_poll": "Via balotenketo finiĝitis", "notification.poll": "Partoprenita balotenketo finiĝis", "notification.reblog": "{name} diskonigis vian mesaĝon", - "notification.status": "{name} just posted", + "notification.status": "{name} ĵus afiŝita", "notifications.clear": "Forviŝi sciigojn", "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?", "notifications.column_settings.alert": "Retumilaj sciigoj", @@ -334,13 +334,15 @@ "notifications.filter.mentions": "Mencioj", "notifications.filter.polls": "Balotenketaj rezultoj", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} sciigoj", - "notifications.mark_as_read": "Mark every notification as read", + "notifications.mark_as_read": "Marki ĉiujn sciigojn legita", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications_permission_banner.enable": "Enable desktop notifications", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications_permission_banner.enable": "Ebligi retumilajn sciigojn", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "notifications_permission_banner.title": "Never miss a thing", + "notifications_permission_banner.title": "Neniam preterlasas iun ajn", "picture_in_picture.restore": "Put it back", "poll.closed": "Finita", "poll.refresh": "Aktualigi", @@ -448,7 +450,7 @@ "trends.counter_by_accounts": "{count, plural, one {{counter} persono} other {{counter} personoj}} parolante", "trends.trending_now": "Nunaj furoraĵoj", "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.", - "units.short.billion": "{count}B", + "units.short.billion": "{count}Md", "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "Altreni kaj lasi por alŝuti", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 57115404b..5ca1d6959 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "¡No hay toots acá!", "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expandir cuadro de vista de imagen", "lightbox.next": "Siguiente", "lightbox.previous": "Anterior", - "lightbox.view_context": "Ver contexto", "lists.account.add": "Agregar a lista", "lists.account.remove": "Quitar de lista", "lists.delete": "Eliminar lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambiar título", "lists.new.create": "Agregar lista", "lists.new.title_placeholder": "Nuevo título de lista", - "lists.replies_policy.all_replies": "Cualquier cuenta seguida", - "lists.replies_policy.list_replies": "Miembros de la lista", - "lists.replies_policy.no_replies": "Nadie", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostrar respuestas a:", "lists.search": "Buscar entre la gente que seguís", "lists.subheading": "Tus listas", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menciones", "notifications.filter.polls": "Resultados de encuesta", "notifications.filter.statuses": "Actualizaciones de cuentas que seguís", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificaciones", "notifications.mark_as_read": "Marcar cada notificación como leída", "notifications.permission_denied": "Las notificaciones de escritorio no están disponibles, debido a una solicitud de permiso del navegador web previamente denegada", "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado antes", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no está abierto, habilitá las notificaciones de escritorio. Podés controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba, una vez que estén habilitadas.", "notifications_permission_banner.title": "No te pierdas nada", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 144b14c58..461929472 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "¡No hay toots aquí!", "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expandir cuadro de visualización de imagen", "lightbox.next": "Siguiente", "lightbox.previous": "Anterior", - "lightbox.view_context": "Ver contexto", "lists.account.add": "Añadir a lista", "lists.account.remove": "Quitar de lista", "lists.delete": "Borrar lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambiar título", "lists.new.create": "Añadir lista", "lists.new.title_placeholder": "Título de la nueva lista", - "lists.replies_policy.all_replies": "Cualquier usuario al que sigas", - "lists.replies_policy.list_replies": "Miembros de la lista", - "lists.replies_policy.no_replies": "Nadie", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostrar respuestas a:", "lists.search": "Buscar entre la gente a la que sigues", "lists.subheading": "Tus listas", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menciones", "notifications.filter.polls": "Resultados de la votación", "notifications.filter.statuses": "Actualizaciones de gente a la que sigues", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificaciones", "notifications.mark_as_read": "Marcar todas las notificaciones como leídas", "notifications.permission_denied": "No se pueden habilitar las notificaciones de escritorio ya que se denegó el permiso.", "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado anteriormente", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no esté abierto, habilite las notificaciones de escritorio. Puedes controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba una vez que estén habilitadas.", "notifications_permission_banner.title": "Nunca te pierdas nada", @@ -390,7 +392,7 @@ "status.admin_account": "Abrir interfaz de moderación para @{name}", "status.admin_status": "Abrir este estado en la interfaz de moderación", "status.block": "Bloquear a @{name}", - "status.bookmark": "Marcador", + "status.bookmark": "Añadir marcador", "status.cancel_reblog_private": "Eliminar retoot", "status.cannot_reblog": "Este toot no puede retootearse", "status.copy": "Copiar enlace al estado", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 4e42fb999..54f4159fe 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Otsitulemused", "emoji_button.symbols": "Sümbolid", "emoji_button.travel": "Reisimine & Kohad", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Siin tuute ei ole!", "empty_column.account_unavailable": "Profiil pole saadaval", "empty_column.blocks": "Sa ei ole veel ühtegi kasutajat blokeerinud.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Järgmine", "lightbox.previous": "Eelmine", - "lightbox.view_context": "Vaata konteksti", "lists.account.add": "Lisa nimistusse", "lists.account.remove": "Eemalda nimistust", "lists.delete": "Kustuta nimistu", @@ -266,9 +266,9 @@ "lists.edit.submit": "Muuda pealkiri", "lists.new.create": "Lisa nimistu", "lists.new.title_placeholder": "Uus nimistu pealkiri", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Otsi Teie poolt jälgitavate inimese hulgast", "lists.subheading": "Teie nimistud", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mainimised", "notifications.filter.polls": "Küsitluse tulemused", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} teated", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 5139d83aa..80119dc00 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Bilaketaren emaitzak", "emoji_button.symbols": "Sinboloak", "emoji_button.travel": "Bidaiak eta tokiak", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Ez dago tootik hemen!", "empty_column.account_unavailable": "Profila ez dago eskuragarri", "empty_column.blocks": "Ez duzu erabiltzailerik blokeatu oraindik.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Hurrengoa", "lightbox.previous": "Aurrekoa", - "lightbox.view_context": "Ikusi testuingurua", "lists.account.add": "Gehitu zerrendara", "lists.account.remove": "Kendu zerrendatik", "lists.delete": "Ezabatu zerrenda", @@ -266,9 +266,9 @@ "lists.edit.submit": "Aldatu izenburua", "lists.new.create": "Gehitu zerrenda", "lists.new.title_placeholder": "Zerrenda berriaren izena", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Bilatu jarraitzen dituzun pertsonen artean", "lists.subheading": "Zure zerrendak", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Aipamenak", "notifications.filter.polls": "Inkestaren emaitza", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} jakinarazpen", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 44c936142..7bda6dcb2 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "نتایج جستجو", "emoji_button.symbols": "نمادها", "emoji_button.travel": "سفر و مکان", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "هیچ بوقی این‌جا نیست!", "empty_column.account_unavailable": "نمایهٔ موجود نیست", "empty_column.blocks": "هنوز کسی را مسدود نکرده‌اید.", @@ -254,11 +255,10 @@ "keyboard_shortcuts.unfocus": "برای برداشتن تمرکز از نوشتن/جستجو", "keyboard_shortcuts.up": "برای بالا رفتن در فهرست", "lightbox.close": "بستن", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "فشرده‌سازی جعبه نمایش تصویر", + "lightbox.expand": "گسترش جعبه نمایش تصویر", "lightbox.next": "بعدی", "lightbox.previous": "قبلی", - "lightbox.view_context": "نمایش گفتگو", "lists.account.add": "افزودن به فهرست", "lists.account.remove": "برداشتن از فهرست", "lists.delete": "حذف فهرست", @@ -266,9 +266,9 @@ "lists.edit.submit": "تغییر عنوان", "lists.new.create": "افزودن فهرست", "lists.new.title_placeholder": "عنوان فهرست تازه", - "lists.replies_policy.all_replies": "هر کاربر پی‌گیری‌شده", - "lists.replies_policy.list_replies": "اعضای فهرست", - "lists.replies_policy.no_replies": "هیچ‌کس", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "نمایش پاسخ‌ها به:", "lists.search": "بین کسانی که پی می‌گیرید بگردید", "lists.subheading": "فهرست‌های شما", @@ -334,12 +334,14 @@ "notifications.filter.mentions": "نام‌بردن‌ها", "notifications.filter.polls": "نتایج نظرسنجی", "notifications.filter.statuses": "به‌روز رسانی‌ها از کسانی که پی‌گیرشانید", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} اعلان", "notifications.mark_as_read": "نشانه‌گذاری همهٔ آگاهی‌ها به عنوان خوانده‌شده", "notifications.permission_denied": "آگاهی‌های میزکار به دلیل رد کردن درخواست اجازهٔ پیشین مرورگر، در دسترس نیستند", "notifications.permission_denied_alert": "از آن‌جا که پیش از این اجازهٔ مرورگر رد شده است، آگاهی‌های میزکار نمی‌توانند به کار بیفتند", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "به کار انداختن آگاهی‌های میزکار", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", + "notifications_permission_banner.how_to_control": "اگر می‌خواهید حتی زمانی که ماستودون باز نیست اعلان‌ها نمایش یابند، اعلان‌های میزکار را فعال کنید. به محض فعال شدن از طریق دکمه {icon} بالا می‌توانید به دقت کنترل کنید که چه نوع از تعامل‌ها باعث صادر شدن اعلان‌ها شوند.", "notifications_permission_banner.title": "هرگز چیزی را از دست ندهید", "picture_in_picture.restore": "برگرداندن", "poll.closed": "پایان‌یافته", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 4a0d4aef1..8916d4339 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Hakutulokset", "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Ei ole 'toots' täällä!", "empty_column.account_unavailable": "Profiilia ei löydy", "empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Seuraava", "lightbox.previous": "Edellinen", - "lightbox.view_context": "Näytä kontekstissa", "lists.account.add": "Lisää listaan", "lists.account.remove": "Poista listasta", "lists.delete": "Poista lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Vaihda otsikko", "lists.new.create": "Lisää lista", "lists.new.title_placeholder": "Uuden listan nimi", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Etsi seuraamistasi henkilöistä", "lists.subheading": "Omat listat", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Maininnat", "notifications.filter.polls": "Kyselyn tulokset", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} ilmoitusta", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 19c86722d..1376d150d 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Résultats de la recherche", "emoji_button.symbols": "Symboles", "emoji_button.travel": "Lieux & Voyages", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Aucun pouet ici !", "empty_column.account_unavailable": "Profil non disponible", "empty_column.blocks": "Vous n’avez bloqué aucun·e utilisateur·rice pour le moment.", @@ -258,7 +259,6 @@ "lightbox.expand": "Agrandir la fenêtre de visualisation des images", "lightbox.next": "Suivant", "lightbox.previous": "Précédent", - "lightbox.view_context": "Voir le contexte", "lists.account.add": "Ajouter à la liste", "lists.account.remove": "Supprimer de la liste", "lists.delete": "Supprimer la liste", @@ -266,9 +266,9 @@ "lists.edit.submit": "Modifier le titre", "lists.new.create": "Ajouter une liste", "lists.new.title_placeholder": "Titre de la nouvelle liste", - "lists.replies_policy.all_replies": "N’importe quel·le utilisateur·rice suivi·e", - "lists.replies_policy.list_replies": "Membres de la liste", - "lists.replies_policy.no_replies": "Personne", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Afficher les réponses à :", "lists.search": "Rechercher parmi les gens que vous suivez", "lists.subheading": "Vos listes", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Résultats des sondages", "notifications.filter.statuses": "Mises à jour des personnes que vous suivez", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Marquer toutes les notifications comme lues", "notifications.permission_denied": "Impossible d’activer les notifications de bureau car l’autorisation a été refusée.", "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a été refusée avant", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Activer les notifications de bureau", "notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon n’est pas ouvert, activez les notifications du bureau. Vous pouvez contrôler précisément quels types d’interactions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois qu’elles sont activées.", "notifications_permission_banner.title": "Toujours au courant", @@ -448,7 +450,7 @@ "trends.counter_by_accounts": "{count, plural, one {{counter} personne en parle} other {{counter} personnes en parlent}}", "trends.trending_now": "Tendance en ce moment", "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.", - "units.short.billion": "{count}B", + "units.short.billion": "{count}Md", "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "Glissez et déposez pour envoyer", @@ -468,7 +470,7 @@ "upload_modal.detect_text": "Détecter le texte de l’image", "upload_modal.edit_media": "Modifier le média", "upload_modal.hint": "Cliquez ou faites glisser le cercle sur l’aperçu pour choisir le point focal qui sera toujours visible sur toutes les miniatures.", - "upload_modal.preparing_ocr": "Préparation de OCR…", + "upload_modal.preparing_ocr": "Préparation de l’OCR…", "upload_modal.preview_label": "Aperçu ({ratio})", "upload_progress.label": "Envoi en cours…", "video.close": "Fermer la vidéo", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 22230ab73..928742dd7 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 6fe22e1d4..771b6c990 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Resultados da procura", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viaxes e Lugares", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Non hai toots aquí!", "empty_column.account_unavailable": "Perfil non dispoñible", "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expandir a caixa de vista da imaxe", "lightbox.next": "Seguinte", "lightbox.previous": "Anterior", - "lightbox.view_context": "Ollar contexto", "lists.account.add": "Engadir á listaxe", "lists.account.remove": "Eliminar da listaxe", "lists.delete": "Eliminar listaxe", @@ -266,9 +266,9 @@ "lists.edit.submit": "Mudar o título", "lists.new.create": "Engadir listaxe", "lists.new.title_placeholder": "Título da nova listaxe", - "lists.replies_policy.all_replies": "Calquera usuaria á que segues", - "lists.replies_policy.list_replies": "Membros da lista", - "lists.replies_policy.no_replies": "Ninguén", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostrar respostas a:", "lists.search": "Procurar entre as persoas que segues", "lists.subheading": "As túas listaxes", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mencións", "notifications.filter.polls": "Resultados da enquisa", "notifications.filter.statuses": "Actualizacións de xente á que segues", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificacións", "notifications.mark_as_read": "Marcar todas as notificacións como lidas", "notifications.permission_denied": "Non se activaron as notificacións de escritorio porque se denegou o permiso", "notifications.permission_denied_alert": "Non se poden activar as notificacións de escritorio, xa que o permiso para o navegador foi denegado previamente", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Activar notificacións de escritorio", "notifications_permission_banner.how_to_control": "Activa as notificacións de escritorio para recibir notificacións mentras Mastodon non está aberto. Podes controlar de xeito preciso o tipo de interaccións que crean as notificacións de escritorio a través da {icon} superior unha vez están activadas.", "notifications_permission_banner.title": "Non perder nada", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index cce1f29e7..123b2e855 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "תוצאות חיפוש", "emoji_button.symbols": "סמלים", "emoji_button.travel": "טיולים ואתרים", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "הלאה", "lightbox.previous": "הקודם", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 275cc3eb9..7e0fe4e7a 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "खोज परिणाम", "emoji_button.symbols": "प्रतीक", "emoji_button.travel": "यात्रा एवं स्थान", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "सन्नाटा! यहां कोई टूट्स नहीं!", "empty_column.account_unavailable": "प्रोफाइल उपलब्ध नहीं", "empty_column.blocks": "आप अभी तक किसी भी यूजर के द्वारा ब्लॉक्ड नहीं हो।", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "अगला", "lightbox.previous": "पिछला", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "सूची से निकालें", "lists.delete": "सूची हटाएँ", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "सूची जोड़ें", "lists.new.title_placeholder": "नये सूची का शीर्षक", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "आपकी सूचियाँ", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "उल्लेख", "notifications.filter.polls": "चुनाव परिणाम", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} सूचनाएँ", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index d59e10a89..0b4ce2235 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Rezultati pretraživanja", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Putovanje i mjesta", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Ovdje nema tootova!", "empty_column.account_unavailable": "Profil nije dostupan", "empty_column.blocks": "Još niste blokirali nikoga.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Sljedeće", "lightbox.previous": "Prethodno", - "lightbox.view_context": "Prikaži kontekst", "lists.account.add": "Dodaj na listu", "lists.account.remove": "Ukloni s liste", "lists.delete": "Izbriši listu", @@ -266,9 +266,9 @@ "lists.edit.submit": "Promijeni naslov", "lists.new.create": "Dodaj listu", "lists.new.title_placeholder": "Naziv nove liste", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Traži među praćenim ljudima", "lists.subheading": "Vaše liste", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Spominjanja", "notifications.filter.polls": "Rezultati anketa", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} obavijesti", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 1c8c06284..aac91f9a0 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Keresési találatok", "emoji_button.symbols": "Szimbólumok", "emoji_button.travel": "Utazás és Helyek", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Itt nincs tülkölés!", "empty_column.account_unavailable": "A profil nem érhető el", "empty_column.blocks": "Még senkit sem tiltottál le.", @@ -258,7 +259,6 @@ "lightbox.expand": "Képnézet kinagyítása", "lightbox.next": "Következő", "lightbox.previous": "Előző", - "lightbox.view_context": "Környezet megtekintése", "lists.account.add": "Hozzáadás a listához", "lists.account.remove": "Eltávolítás a listából", "lists.delete": "Lista törlése", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cím megváltoztatása", "lists.new.create": "Lista hozzáadása", "lists.new.title_placeholder": "Új lista címe", - "lists.replies_policy.all_replies": "Bármely követett felhasználó", - "lists.replies_policy.list_replies": "A lista tagjai", - "lists.replies_policy.no_replies": "Senki", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Nekik mutassuk a válaszokat:", "lists.search": "Keresés a követett személyek között", "lists.subheading": "Listáid", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Megemlítések", "notifications.filter.polls": "Szavazások eredményei", "notifications.filter.statuses": "Frissítések azoktól, akiket követsz", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} értesítés", "notifications.mark_as_read": "Minden értesítés olvasottnak jelölése", "notifications.permission_denied": "Nem tudjuk engedélyezni az asztali értesítéseket, mert az engedélyt megtagadták.", "notifications.permission_denied_alert": "Az asztali értesítések nem engedélyezhetőek, mert az engedélyt megtagadták a böngészőben", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Asztali értesítések engedélyezése", "notifications_permission_banner.how_to_control": "Ahhoz, hogy értesítéseket kapj akkor, amikor a Mastodon nincs megnyitva, engedélyezd az asztali értesítéseket. Pontosan be tudod állítani, hogy milyen interakciókról értesülj a fenti {icon} gombon keresztül, ha egyszer már engedélyezted őket.", "notifications_permission_banner.title": "Soha ne mulassz el semmit", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index dd904bfca..91377d7c5 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Որոնման արդիւնքներ", "emoji_button.symbols": "Նշաններ", "emoji_button.travel": "Ուղեւորութիւն եւ տեղանքներ", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Այստեղ թթեր չկա՛ն։", "empty_column.account_unavailable": "Անձնական էջը հասանելի չի", "empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Հաջորդ", "lightbox.previous": "Նախորդ", - "lightbox.view_context": "Տեսնել ենթատեքստը", "lists.account.add": "Ավելացնել ցանկին", "lists.account.remove": "Հանել ցանկից", "lists.delete": "Ջնջել ցանկը", @@ -266,9 +266,9 @@ "lists.edit.submit": "Փոխել վերնագիրը", "lists.new.create": "Ավելացնել ցանկ", "lists.new.title_placeholder": "Նոր ցանկի վերնագիր", - "lists.replies_policy.all_replies": "Ում հետևում եմ", - "lists.replies_policy.list_replies": "Ցանկի անդամները", - "lists.replies_policy.no_replies": "Ոչ ոք", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Փնտրել քո հետեւած մարդկանց մեջ", "lists.subheading": "Քո ցանկերը", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Նշումները", "notifications.filter.polls": "Հարցման արդիւնքները", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} ծանուցում", "notifications.mark_as_read": "Համարել բոլոր ծանուցումները ընթերցած", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Միացնել դիտարկչից ծանուցումները", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 562d9d038..d0ae2befc 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Hasil pencarian", "emoji_button.symbols": "Simbol", "emoji_button.travel": "Tempat Wisata", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Tidak ada toot di sini!", "empty_column.account_unavailable": "Profil tidak tersedia", "empty_column.blocks": "Anda belum memblokir siapapun.", @@ -258,7 +259,6 @@ "lightbox.expand": "Besarkan kotak tampilan gambar", "lightbox.next": "Selanjutnya", "lightbox.previous": "Sebelumnya", - "lightbox.view_context": "Lihat konteks", "lists.account.add": "Tambah ke daftar", "lists.account.remove": "Hapus dari daftar", "lists.delete": "Hapus daftar", @@ -266,9 +266,9 @@ "lists.edit.submit": "Ubah judul", "lists.new.create": "Tambah daftar", "lists.new.title_placeholder": "Judul daftar baru", - "lists.replies_policy.all_replies": "Siapapun pengguna yang diikuti", - "lists.replies_policy.list_replies": "Anggota di daftar tersebut", - "lists.replies_policy.no_replies": "Tidak ada satu pun", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Tampilkan balasan ke:", "lists.search": "Cari di antara orang yang Anda ikuti", "lists.subheading": "Daftar Anda", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Sebutan", "notifications.filter.polls": "Hasil japat", "notifications.filter.statuses": "Pembaruan dari orang yang Anda ikuti", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifikasi", "notifications.mark_as_read": "Tandai setiap notifikasi sebagai sudah dibaca", "notifications.permission_denied": "Tidak dapat mengaktifkan notifikasi desktop karena izin ditolak.", "notifications.permission_denied_alert": "Notifikasi desktop tidak dapat diaktifkan karena izin peramban telah ditolak sebelumnya", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Aktifkan notifikasi desktop", "notifications_permission_banner.how_to_control": "Untuk menerima notifikasi saat Mastodon terbuka, aktifkan notifikasi desktop. Anda dapat mengendalikan tipe interaksi mana yang ditampilkan notifikasi desktop melalui tombol {icon} di atas saat sudah aktif.", "notifications_permission_banner.title": "Jangan lewatkan apapun", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 1528dec69..998799b9f 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 43004bebb..6910e9e5f 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Leitarniðurstöður", "emoji_button.symbols": "Tákn", "emoji_button.travel": "Ferðalög og staðir", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Engin tíst hér!", "empty_column.account_unavailable": "Notandasnið ekki tiltækt", "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.", @@ -258,7 +259,6 @@ "lightbox.expand": "Fletta út myndskoðunarreit", "lightbox.next": "Næsta", "lightbox.previous": "Fyrra", - "lightbox.view_context": "Skoða samhengi", "lists.account.add": "Bæta á lista", "lists.account.remove": "Fjarlægja af lista", "lists.delete": "Eyða lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Breyta titli", "lists.new.create": "Bæta við lista", "lists.new.title_placeholder": "Titill á nýjum lista", - "lists.replies_policy.all_replies": "Allra notenda sem fylgst er með", - "lists.replies_policy.list_replies": "Meðlima listans", - "lists.replies_policy.no_replies": "Engra", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Sýna svör til:", "lists.search": "Leita meðal þeirra sem þú fylgist með", "lists.subheading": "Listarnir þínir", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Tilvísanir", "notifications.filter.polls": "Niðurstöður könnunar", "notifications.filter.statuses": "Uppfærslur frá fólki sem þú fylgist með", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} tilkynningar", "notifications.mark_as_read": "Merkja allar tilkynningar sem lesnar", "notifications.permission_denied": "Tilkynningar á skjáborði eru ekki aðgengilegar megna áður hafnaðra beiðna fyrir vafra", "notifications.permission_denied_alert": "Ekki var hægt að virkja tilkynningar á skjáborði, þar sem heimildum fyrir vafra var áður hafnað", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Virkja tilkynningar á skjáborði", "notifications_permission_banner.how_to_control": "Til að taka á móti tilkynningum þegar Mastodon er ekki opið, skaltu virkja tilkynningar á skjáborði. Þegar þær eru orðnar virkar geturðu stýrt nákvæmlega hverskonar atvik framleiða tilkynningar með því að nota {icon}-hnappinn hér fyrir ofan.", "notifications_permission_banner.title": "Aldrei missa af neinu", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index c472e098f..746d33df0 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Risultati della ricerca", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Viaggi & Luoghi", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Nessun toot qui!", "empty_column.account_unavailable": "Profilo non disponibile", "empty_column.blocks": "Non hai ancora bloccato alcun utente.", @@ -258,7 +259,6 @@ "lightbox.expand": "Espandi casella di visualizzazione immagine", "lightbox.next": "Successivo", "lightbox.previous": "Precedente", - "lightbox.view_context": "Mostra contesto", "lists.account.add": "Aggiungi alla lista", "lists.account.remove": "Togli dalla lista", "lists.delete": "Elimina lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambia titolo", "lists.new.create": "Aggiungi lista", "lists.new.title_placeholder": "Titolo della nuova lista", - "lists.replies_policy.all_replies": "Qualsiasi utente seguito", - "lists.replies_policy.list_replies": "Iscritti alla lista", - "lists.replies_policy.no_replies": "Nessuno", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostra risposte a:", "lists.search": "Cerca tra le persone che segui", "lists.subheading": "Le tue liste", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menzioni", "notifications.filter.polls": "Risultati del sondaggio", "notifications.filter.statuses": "Aggiornamenti dalle persone che segui", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifiche", "notifications.mark_as_read": "Segna tutte le notifiche come lette", "notifications.permission_denied": "Impossibile abilitare le notifiche sul desktop perché il permesso è stato negato.", "notifications.permission_denied_alert": "Le notifiche sul desktop non possono essere abilitate, poiché il permesso nel browser è stato negato in precedenza", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Abilita le notifiche sul desktop", "notifications_permission_banner.how_to_control": "Per ricevere notifiche quando Mastodon non è aperto, abilita le notifiche desktop. Puoi controllare con precisione quali tipi di interazioni generano notifiche desktop tramite il pulsante {icon} qui sopra, dopo averle abilitate.", "notifications_permission_banner.title": "Non perderti mai nulla", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index ec60e0782..ccf8970ea 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "検索結果", "emoji_button.symbols": "記号", "emoji_button.travel": "旅行と場所", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "トゥートがありません!", "empty_column.account_unavailable": "プロフィールは利用できません", "empty_column.blocks": "まだ誰もブロックしていません。", @@ -254,11 +255,10 @@ "keyboard_shortcuts.unfocus": "トゥート入力欄・検索欄から離れる", "keyboard_shortcuts.up": "カラム内一つ上に移動", "lightbox.close": "閉じる", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "画像ビューボックスを閉じる", + "lightbox.expand": "画像ビューボックスを開く", "lightbox.next": "次", "lightbox.previous": "前", - "lightbox.view_context": "トゥートを表示", "lists.account.add": "リストに追加", "lists.account.remove": "リストから外す", "lists.delete": "リストを削除", @@ -266,9 +266,9 @@ "lists.edit.submit": "タイトルを変更", "lists.new.create": "リストを作成", "lists.new.title_placeholder": "新規リスト名", - "lists.replies_policy.all_replies": "フォロー中のユーザー全員", - "lists.replies_policy.list_replies": "リストのメンバー", - "lists.replies_policy.no_replies": "表示しない", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "リプライを表示:", "lists.search": "フォローしている人の中から検索", "lists.subheading": "あなたのリスト", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "返信", "notifications.filter.polls": "アンケート結果", "notifications.filter.statuses": "フォローしている人の新着情報", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} 件の通知", "notifications.mark_as_read": "すべて既読にする", "notifications.permission_denied": "ブラウザの通知が拒否されているためデスクトップ通知は利用できません", "notifications.permission_denied_alert": "ブラウザの通知が拒否されているためデスクトップ通知を有効にできません", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "デスクトップ通知を有効にする", "notifications_permission_banner.how_to_control": "Mastodon を閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。", "notifications_permission_banner.title": "お見逃しなく", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 6a0b47fdc..ad3b1b033 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "ძებნის შედეგები", "emoji_button.symbols": "სიმბოლოები", "emoji_button.travel": "მოგზაურობა და ადგილები", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "შემდეგი", "lightbox.previous": "წინა", - "lightbox.view_context": "View context", "lists.account.add": "სიაში დამატება", "lists.account.remove": "სიიდან ამოშლა", "lists.delete": "სიის წაშლა", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "სიის დამატება", "lists.new.title_placeholder": "ახალი სიის სათაური", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "ძებნა ადამიანებს შორის რომელთაც მიჰყვებით", "lists.subheading": "თქვენი სიები", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} შეტყობინება", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 261d003aa..cf9860f1e 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Igemmaḍ n unadi", "emoji_button.symbols": "Izamulen", "emoji_button.travel": "Imeḍqan d Yinigen", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Ulac tijewwaqin dagi!", "empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi", "empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.", @@ -258,7 +259,6 @@ "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna", "lightbox.next": "Γer zdat", "lightbox.previous": "Γer deffir", - "lightbox.view_context": "Ẓer amnaḍ", "lists.account.add": "Rnu ɣer tebdart", "lists.account.remove": "Kkes seg tebdart", "lists.delete": "Kkes tabdart", @@ -266,9 +266,9 @@ "lists.edit.submit": "Beddel azwel", "lists.new.create": "Rnu tabdart", "lists.new.title_placeholder": "Azwel amaynut n tebdart", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "Ula yiwen", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Ssken-d tiririyin i:", "lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ", "lists.subheading": "Tibdarin-ik·im", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Abdar", "notifications.filter.polls": "Igemmaḍ n usenqed", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} n tilɣa", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel.", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", @@ -468,7 +470,7 @@ "upload_modal.detect_text": "Sefru-d aḍris seg tugna", "upload_modal.edit_media": "Ẓreg taɣwalt", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.preparing_ocr": "Aheyyi n OCR…", "upload_modal.preview_label": "Taskant ({ratio})", "upload_progress.label": "Asali iteddu...", "video.close": "Mdel tabidyutt", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index a2c0856e5..04a0f9140 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Іздеу нәтижелері", "emoji_button.symbols": "Таңбалар", "emoji_button.travel": "Саяхат", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Жазба жоқ ешқандай!", "empty_column.account_unavailable": "Профиль қолжетімді емес", "empty_column.blocks": "Ешкімді бұғаттамағансыз.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Келесі", "lightbox.previous": "Алдыңғы", - "lightbox.view_context": "Контексті көрсет", "lists.account.add": "Тізімге қосу", "lists.account.remove": "Тізімнен шығару", "lists.delete": "Тізімді өшіру", @@ -266,9 +266,9 @@ "lists.edit.submit": "Тақырыбын өзгерту", "lists.new.create": "Тізім құру", "lists.new.title_placeholder": "Жаңа тізім аты", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Сіз іздеген адамдар арасында іздеу", "lists.subheading": "Тізімдеріңіз", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Аталымдар", "notifications.filter.polls": "Сауалнама нәтижелері", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} ескертпе", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 0f6c71fb9..a5025bb72 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 24539248a..c254ef6d8 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "검색 결과", "emoji_button.symbols": "기호", "emoji_button.travel": "여행과 장소", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "여긴 툿이 없어요!", "empty_column.account_unavailable": "프로필 사용 불가", "empty_column.blocks": "아직 아무도 차단하지 않았습니다.", @@ -254,11 +255,10 @@ "keyboard_shortcuts.unfocus": "작성창에서 포커스 해제", "keyboard_shortcuts.up": "리스트에서 위로 이동", "lightbox.close": "닫기", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "이미지 박스 압축", + "lightbox.expand": "이미지 박스 확장", "lightbox.next": "다음", "lightbox.previous": "이전", - "lightbox.view_context": "게시물 보기", "lists.account.add": "리스트에 추가", "lists.account.remove": "리스트에서 제거", "lists.delete": "리스트 삭제", @@ -266,9 +266,9 @@ "lists.edit.submit": "제목 수정", "lists.new.create": "리스트 추가", "lists.new.title_placeholder": "새 리스트의 이름", - "lists.replies_policy.all_replies": "팔로우 한 사용자 누구나", - "lists.replies_policy.list_replies": "목록의 멤버들", - "lists.replies_policy.no_replies": "아무도 없음", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "답글 표시:", "lists.search": "팔로우 중인 사람들 중에서 찾기", "lists.subheading": "당신의 리스트", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "멘션", "notifications.filter.polls": "투표 결과", "notifications.filter.statuses": "팔로우 하는 사람들의 최신 게시물", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} 개의 알림", "notifications.mark_as_read": "모든 알림을 읽은 상태로 표시", "notifications.permission_denied": "권한이 거부되었기 때문에 데스크탑 알림을 활성화할 수 없음", "notifications.permission_denied_alert": "이전에 브라우저 권한이 거부되었기 때문에, 데스크탑 알림이 활성화 될 수 없습니다.", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "데스크탑 알림 활성화", "notifications_permission_banner.how_to_control": "마스토돈이 열려 있지 않을 때에도 알림을 받으려면, 데스크탑 알림을 활성화 하세요. 당신은 어떤 종류의 반응이 데스크탑 알림을 발생할 지를 {icon} 버튼을 통해 세세하게 설정할 수 있습니다.", "notifications_permission_banner.title": "아무것도 놓치지 마세요", @@ -448,9 +450,9 @@ "trends.counter_by_accounts": "{counter} 명이 말하는 중", "trends.trending_now": "지금 유행중", "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.", - "units.short.billion": "{count}십억", - "units.short.million": "{count}백만", - "units.short.thousand": "{count}천", + "units.short.billion": "{count}B", + "units.short.million": "{count}B", + "units.short.thousand": "{count}K", "upload_area.title": "드래그 & 드롭으로 업로드", "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "파일 업로드 제한에 도달했습니다.", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index b40a15669..3c359d222 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -1,5 +1,5 @@ { - "account.account_note_header": "تێبینیتێبینی", + "account.account_note_header": "تێبینی ", "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان", "account.badges.bot": "بوت", "account.badges.group": "گرووپ", @@ -149,6 +149,7 @@ "emoji_button.search_results": "ئەنجامەکانی گەڕان", "emoji_button.symbols": "هێماکان", "emoji_button.travel": "گەشت & شوێنەکان", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "لێرە هیچ توتەک نییە!", "empty_column.account_unavailable": "پرۆفایل بەردەست نیە", "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.", @@ -254,11 +255,10 @@ "keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان", "keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت", "lightbox.close": "دابخە", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "سندوقی نیشاندانی وێنە بپەستێنە", + "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە", "lightbox.next": "داهاتوو", "lightbox.previous": "پێشوو", - "lightbox.view_context": "پێشاندانی دەق", "lists.account.add": "زیادکردن بۆ لیست", "lists.account.remove": "لابردن لە لیست", "lists.delete": "سڕینەوەی لیست", @@ -266,9 +266,9 @@ "lists.edit.submit": "گۆڕینی ناونیشان", "lists.new.create": "زیادکردنی لیست", "lists.new.title_placeholder": "ناونیشانی لیستی نوێ", - "lists.replies_policy.all_replies": "هەربەکارهێنەرێکی شوێنکەوتوو", - "lists.replies_policy.list_replies": "ئەندامانی لیستەکە", - "lists.replies_policy.no_replies": "هیچکەس", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:", "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت", "lists.subheading": "لیستەکانت", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "ئاماژەکان", "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی", "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} ئاگانامە", "notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە", "notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.", "notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ", "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.", "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 6141f321e..46dc0975d 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 061ab2a83..f075731fe 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Meklēšanas rezultāti", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Ceļošana & Vietas", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Šeit ziņojumu nav!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "Tu neesi vēl nevienu bloķējis.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index b640b8c66..6dac40e8b 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Резултати од барање", "emoji_button.symbols": "Симболи", "emoji_button.travel": "Патувања и Места", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Недостапен профил", "empty_column.blocks": "Немате сеуште блокирано корисници.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Спомнувања", "notifications.filter.polls": "Резултати од анкета", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} нотификации", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 08c3cacd0..9d7b913f9 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "തിരച്ചിൽ ഫലങ്ങൾ", "emoji_button.symbols": "ചിഹ്നങ്ങൾ", "emoji_button.travel": "യാത്രയും സ്ഥലങ്ങളും", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "ഇവിടെ ടൂട്ടുകൾ ഇല്ല!", "empty_column.account_unavailable": "പ്രൊഫൈൽ ലഭ്യമല്ല", "empty_column.blocks": "നിങ്ങൾ ഇതുവരെ ഒരു ഉപയോക്താക്കളെയും തടഞ്ഞിട്ടില്ല.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "അടുത്തത്", "lightbox.previous": "പുറകോട്ട്", - "lightbox.view_context": "View context", "lists.account.add": "പട്ടികയിലേക്ക് ചേർക്കുക", "lists.account.remove": "പട്ടികയിൽ നിന്ന് ഒഴിവാക്കുക", "lists.delete": "പട്ടിക ഒഴിവാക്കുക", @@ -266,9 +266,9 @@ "lists.edit.submit": "തലക്കെട്ട് മാറ്റുക", "lists.new.create": "പുതിയ പട്ടിക ചേർക്കുക", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "എന്റെ പട്ടികകൾ", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index 33f8cfd84..8559665b9 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index a4006a745..ec992c679 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index aec3e09ff..c910a28ab 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -9,10 +9,10 @@ "account.browse_more_on_origin_server": "Meer op het originele profiel bekijken", "account.cancel_follow_request": "Volgverzoek annuleren", "account.direct": "@{name} een direct bericht sturen", - "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.disable_notifications": "Geef geen melding meer wanneer @{name} toot", "account.domain_blocked": "Server verborgen", "account.edit_profile": "Profiel bewerken", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "Geef een melding wanneer @{name} toot", "account.endorse": "Op profiel weergeven", "account.follow": "Volgen", "account.followers": "Volgers", @@ -98,9 +98,9 @@ "compose_form.poll.switch_to_single": "Poll wijzigen om een enkele keuze toe te staan", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Media als gevoelig markeren", - "compose_form.sensitive.marked": "Media is als gevoelig gemarkeerd", - "compose_form.sensitive.unmarked": "Media is niet als gevoelig gemarkeerd", + "compose_form.sensitive.hide": "{count, plural, one {Media als gevoelig markeren} other {Media als gevoelig markeren}}", + "compose_form.sensitive.marked": "{count, plural, one {Media is als gevoelig gemarkeerd} other {Media is als gevoelig gemarkeerd}}", + "compose_form.sensitive.unmarked": "{count, plural, one {Media is niet als gevoelig gemarkeerd} other {Media is niet als gevoelig gemarkeerd}}", "compose_form.spoiler.marked": "Tekst is achter een waarschuwing verborgen", "compose_form.spoiler.unmarked": "Tekst is niet verborgen", "compose_form.spoiler_placeholder": "Waarschuwingstekst", @@ -149,6 +149,7 @@ "emoji_button.search_results": "Zoekresultaten", "emoji_button.symbols": "Symbolen", "emoji_button.travel": "Reizen en plekken", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Hier zijn geen toots!", "empty_column.account_unavailable": "Profiel is niet beschikbaar", "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.", @@ -168,9 +169,9 @@ "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.", "empty_column.public": "Er is hier helemaal niks! Toot iets in het openbaar of volg mensen van andere servers om het te vullen", "error.unexpected_crash.explanation": "Als gevolg van een bug in onze broncode of als gevolg van een compatibiliteitsprobleem met jouw webbrowser, kan deze pagina niet goed worden weergegeven.", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", + "error.unexpected_crash.explanation_addons": "Deze pagina kon niet correct geladen worden. Deze fout wordt waarschijnlijk door een browser-add-on of een automatische vertalingshulpmiddel veroorzaakt.", "error.unexpected_crash.next_steps": "Probeer deze pagina te vernieuwen. Wanneer dit niet helpt is het nog steeds mogelijk om Mastodon in een andere webbrowser of mobiele app te gebruiken.", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.next_steps_addons": "Probeer deze uit te schakelen en de pagina te verversen. Wanneer dat niet helpt, kun je Mastodon nog altijd met een andere webbrowser of mobiele app gebruiken.", "errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren", "errors.unexpected_crash.report_issue": "Technisch probleem melden", "follow_request.authorize": "Goedkeuren", @@ -258,7 +259,6 @@ "lightbox.expand": "Afbeelding groot weergeven", "lightbox.next": "Volgende", "lightbox.previous": "Vorige", - "lightbox.view_context": "Context tonen", "lists.account.add": "Aan lijst toevoegen", "lists.account.remove": "Uit lijst verwijderen", "lists.delete": "Lijst verwijderen", @@ -266,10 +266,10 @@ "lists.edit.submit": "Titel veranderen", "lists.new.create": "Lijst toevoegen", "lists.new.title_placeholder": "Naam nieuwe lijst", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", - "lists.replies_policy.title": "Show replies to:", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", + "lists.replies_policy.title": "Toon reacties aan:", "lists.search": "Zoek naar mensen die je volgt", "lists.subheading": "Jouw lijsten", "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}", @@ -277,7 +277,7 @@ "media_gallery.toggle_visible": "Media verbergen", "missing_indicator.label": "Niet gevonden", "missing_indicator.sublabel": "Deze hulpbron kan niet gevonden worden", - "mute_modal.duration": "Duration", + "mute_modal.duration": "Duur", "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?", "mute_modal.indefinite": "Voor onbepaalde tijd", "navigation_bar.apps": "Mobiele apps", @@ -310,7 +310,7 @@ "notification.own_poll": "Jouw poll is beëindigd", "notification.poll": "Een poll waaraan jij hebt meegedaan is beëindigd", "notification.reblog": "{name} boostte jouw toot", - "notification.status": "{name} just posted", + "notification.status": "{name} heeft zojuist een toot geplaatst", "notifications.clear": "Meldingen verwijderen", "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?", "notifications.column_settings.alert": "Desktopmeldingen", @@ -326,22 +326,24 @@ "notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "In kolom tonen", "notifications.column_settings.sound": "Geluid afspelen", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.status": "Nieuwe toots:", "notifications.filter.all": "Alles", "notifications.filter.boosts": "Boosts", "notifications.filter.favourites": "Favorieten", "notifications.filter.follows": "Die jij volgt", "notifications.filter.mentions": "Vermeldingen", "notifications.filter.polls": "Pollresultaten", - "notifications.filter.statuses": "Updates from people you follow", + "notifications.filter.statuses": "Updates van mensen die je volgt", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} meldingen", - "notifications.mark_as_read": "Mark every notification as read", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications_permission_banner.enable": "Notificatie meldingen inschakelen", - "notifications_permission_banner.how_to_control": "Gebruikt notificaties om ook meldingen te ontvangen wanneer Mastodon niet open is. U kunt precies bepalen welke soort meldingen wel of geen notificaties afgeven via de bovenstaande knop {icon}.", - "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", + "notifications.mark_as_read": "Markeer elke melding als gelezen", + "notifications.permission_denied": "Desktopmeldingen zijn niet beschikbaar omdat een eerdere browsertoestemming werd geweigerd", + "notifications.permission_denied_alert": "Desktopmeldingen kunnen niet worden ingeschakeld, omdat een eerdere browsertoestemming werd geweigerd", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications_permission_banner.enable": "Desktopmeldingen inschakelen", + "notifications_permission_banner.how_to_control": "Om meldingen te ontvangen wanneer Mastodon niet open is. Je kunt precies bepalen welke soort interacties wel of geen desktopmeldingen geven via de bovenstaande {icon} knop.", + "notifications_permission_banner.title": "Mis nooit meer iets", + "picture_in_picture.restore": "Terugzetten", "poll.closed": "Gesloten", "poll.refresh": "Vernieuwen", "poll.total_people": "{count, plural, one {# persoon} other {# mensen}}", @@ -448,9 +450,9 @@ "trends.counter_by_accounts": "{count, plural, one {{counter} persoon} other {{counter} personen}} zijn aan het praten", "trends.trending_now": "Trends", "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.", - "units.short.billion": "{count} miljard", - "units.short.million": "{count} miljoen", - "units.short.thousand": "{count} duizend", + "units.short.billion": "{count} mrd.", + "units.short.million": "{count} mln.", + "units.short.thousand": "{count}k", "upload_area.title": "Hiernaar toe slepen om te uploaden", "upload_button.label": "Afbeeldingen, een video- of een geluidsbestand toevoegen", "upload_error.limit": "Uploadlimiet van bestand overschreden.", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index f6518afab..38a95533c 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Søkeresultat", "emoji_button.symbols": "Symbol", "emoji_button.travel": "Reise & stader", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Ingen tut her!", "empty_column.account_unavailable": "Profil ikkje tilgjengelig", "empty_column.blocks": "Du har ikkje blokkert nokon brukarar enno.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Neste", "lightbox.previous": "Førre", - "lightbox.view_context": "Sjå kontekst", "lists.account.add": "Legg til i liste", "lists.account.remove": "Fjern frå liste", "lists.delete": "Slett liste", @@ -266,9 +266,9 @@ "lists.edit.submit": "Endre tittel", "lists.new.create": "Legg til liste", "lists.new.title_placeholder": "Ny listetittel", - "lists.replies_policy.all_replies": "Enhver fulgt bruker", - "lists.replies_policy.list_replies": "Medlemmer i listen", - "lists.replies_policy.no_replies": "Ingen", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Vis svar på:", "lists.search": "Søk gjennom folk du følgjer", "lists.subheading": "Dine lister", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Nemningar", "notifications.filter.polls": "Røysteresultat", "notifications.filter.statuses": "Oppdateringer fra folk du følger", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} varsel", "notifications.mark_as_read": "Merk alle varsler som lest", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Skru på skrivebordsvarsler", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Aldri gå glipp av noe", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 46cf7c407..e64bf4a5a 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Søkeresultat", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Reise & steder", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Ingen tuter er her!", "empty_column.account_unavailable": "Profilen er utilgjengelig", "empty_column.blocks": "Du har ikke blokkert noen brukere enda.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Neste", "lightbox.previous": "Forrige", - "lightbox.view_context": "Vis sammenheng", "lists.account.add": "Legg til i listen", "lists.account.remove": "Fjern fra listen", "lists.delete": "Slett listen", @@ -266,9 +266,9 @@ "lists.edit.submit": "Endre tittel", "lists.new.create": "Ligg til liste", "lists.new.title_placeholder": "Ny listetittel", - "lists.replies_policy.all_replies": "Enhver fulgt bruker", - "lists.replies_policy.list_replies": "Medlemmer i listen", - "lists.replies_policy.no_replies": "Ingen", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Vis svar på:", "lists.search": "Søk blant personer du følger", "lists.subheading": "Dine lister", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Nevnelser", "notifications.filter.polls": "Avstemningsresultater", "notifications.filter.statuses": "Oppdateringer fra folk du følger", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} varslinger", "notifications.mark_as_read": "Merk alle varsler som lest", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Skru på skrivebordsvarsler", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Aldri gå glipp av noe", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index f166f95e2..ba41f83d6 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Resultats de recèrca", "emoji_button.symbols": "Simbòls", "emoji_button.travel": "Viatges & lòcs", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Cap de tuts aquí !", "empty_column.account_unavailable": "Perfil pas disponible", "empty_column.blocks": "Avètz pas blocat degun pel moment.", @@ -258,7 +259,6 @@ "lightbox.expand": "Espandir la fenèstra de visualizacion d’imatge", "lightbox.next": "Seguent", "lightbox.previous": "Precedent", - "lightbox.view_context": "Veire lo contèxt", "lists.account.add": "Ajustar a la lista", "lists.account.remove": "Levar de la lista", "lists.delete": "Suprimir la lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambiar lo títol", "lists.new.create": "Ajustar una lista", "lists.new.title_placeholder": "Títol de la nòva lista", - "lists.replies_policy.all_replies": "Los que sègui", - "lists.replies_policy.list_replies": "Membres d’aquesta lista", - "lists.replies_policy.no_replies": "Degun", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostrar las responsas a :", "lists.search": "Cercar demest lo mond que seguètz", "lists.subheading": "Vòstras listas", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mencions", "notifications.filter.polls": "Resultats del sondatge", "notifications.filter.statuses": "Mesas a jorn del monde que seguissètz", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificacions", "notifications.mark_as_read": "Marcar totas las notificacions coma legidas", "notifications.permission_denied": "Las notificacion burèu son pas disponiblas a causa del refús de las demandas d’autorizacion navigador", "notifications.permission_denied_alert": "Las notificacions burèu son pas activada, per çò que las autorizacions son estadas refusada abans", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Activar las notificacions burèu", "notifications_permission_banner.how_to_control": "Per recebre las notificacions de Mastodon quand es pas dobèrt, activatz las notificacions de burèu. Podètz precisar quin tipe de notificacion generarà una notificacion de burèu via lo boton {icon} dessús un còp activadas.", "notifications_permission_banner.title": "Manquetz pas jamai res", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 3009471f4..badea8dcd 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -13,7 +13,7 @@ "account.domain_blocked": "Ukryto domenę", "account.edit_profile": "Edytuj profil", "account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}", - "account.endorse": "Polecaj na profilu", + "account.endorse": "Wyróżnij na profilu", "account.follow": "Śledź", "account.followers": "Śledzący", "account.followers.empty": "Nikt jeszcze nie śledzi tego użytkownika.", @@ -149,6 +149,7 @@ "emoji_button.search_results": "Wyniki wyszukiwania", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Podróże i miejsca", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Brak wpisów tutaj!", "empty_column.account_unavailable": "Profil niedostępny", "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.", @@ -258,7 +259,6 @@ "lightbox.expand": "Rozwiń pole widoku obrazu", "lightbox.next": "Następne", "lightbox.previous": "Poprzednie", - "lightbox.view_context": "Pokaż kontekst", "lists.account.add": "Dodaj do listy", "lists.account.remove": "Usunąć z listy", "lists.delete": "Usuń listę", @@ -266,9 +266,9 @@ "lists.edit.submit": "Zmień tytuł", "lists.new.create": "Utwórz listę", "lists.new.title_placeholder": "Wprowadź tytuł listy", - "lists.replies_policy.all_replies": "Dowolnego obserwowanego użytkownika", - "lists.replies_policy.list_replies": "Członków listy", - "lists.replies_policy.no_replies": "Nikogo", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Pokazuj odpowiedzi dla:", "lists.search": "Szukaj wśród osób które śledzisz", "lists.subheading": "Twoje listy", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Wspomienia", "notifications.filter.polls": "Wyniki głosowania", "notifications.filter.statuses": "Aktualizacje od osób które obserwujesz", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count, number} {count, plural, one {powiadomienie} few {powiadomienia} many {powiadomień} more {powiadomień}}", "notifications.mark_as_read": "Oznacz wszystkie powiadomienia jako przeczytane", "notifications.permission_denied": "Powiadomienia na pulpicie nie są dostępne, ponieważ wcześniej nie udzielono uprawnień w przeglądarce", "notifications.permission_denied_alert": "Powiadomienia na pulpicie nie mogą zostać włączone, ponieważ wcześniej odmówiono uprawnień", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Włącz powiadomienia na pulpicie", "notifications_permission_banner.how_to_control": "Aby otrzymywać powiadomienia, gdy Mastodon nie jest otwarty, włącz powiadomienia pulpitu. Możesz dokładnie kontrolować, októrych działaniach będziesz powiadomienia na pulpicie za pomocą przycisku {icon} powyżej, jeżeli tylko zostaną włączone.", "notifications_permission_banner.title": "Nie przegap niczego", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index dda932440..4e45927a5 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Resultados da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagem & Lugares", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Nada aqui!", "empty_column.account_unavailable": "Perfil indisponível", "empty_column.blocks": "Nada aqui.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expandir caixa de visualização de imagem", "lightbox.next": "Próximo", "lightbox.previous": "Anterior", - "lightbox.view_context": "Ver contexto", "lists.account.add": "Adicionar à lista", "lists.account.remove": "Remover da lista", "lists.delete": "Excluir lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Renomear", "lists.new.create": "Criar lista", "lists.new.title_placeholder": "Nome da lista", - "lists.replies_policy.all_replies": "Qualquer usuário seguido", - "lists.replies_policy.list_replies": "Membros da lista", - "lists.replies_policy.no_replies": "Ninguém", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostrar respostas para:", "lists.search": "Procurar entre as pessoas que você segue", "lists.subheading": "Suas listas", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menções", "notifications.filter.polls": "Resultados de enquete", "notifications.filter.statuses": "Atualizações de pessoas que você segue", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificações", "notifications.mark_as_read": "Marcar todas as notificações como lidas", "notifications.permission_denied": "Não é possível habilitar as notificações da área de trabalho pois a permissão foi negada.", "notifications.permission_denied_alert": "As notificações da área de trabalho não podem ser habilitdas pois a permissão do navegador foi negada antes", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Habilitar notificações da área de trabalho", "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, habilite as notificações da área de trabalho. Você pode controlar precisamente quais tipos de interações geram notificações da área de trabalho através do botão {icon} acima uma vez habilitadas.", "notifications_permission_banner.title": "Nunca perca nada", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 065a6bf57..0ff168002 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Resultados da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagens & Lugares", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Sem toots por aqui!", "empty_column.account_unavailable": "Perfil indisponível", "empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expandir caixa de visualização de imagem", "lightbox.next": "Próximo", "lightbox.previous": "Anterior", - "lightbox.view_context": "Ver contexto", "lists.account.add": "Adicionar à lista", "lists.account.remove": "Remover da lista", "lists.delete": "Remover lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Mudar o título", "lists.new.create": "Adicionar lista", "lists.new.title_placeholder": "Título da nova lista", - "lists.replies_policy.all_replies": "Qualquer utilizador seguido", - "lists.replies_policy.list_replies": "Membros da lista", - "lists.replies_policy.no_replies": "Ninguém", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Mostrar respostas para:", "lists.search": "Pesquisa entre as pessoas que segues", "lists.subheading": "As tuas listas", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menções", "notifications.filter.polls": "Votações", "notifications.filter.statuses": "Atualizações de pessoas que você segue", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificações", "notifications.mark_as_read": "Marcar todas as notificações como lidas", "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente", "notifications.permission_denied_alert": "Notificações no ambinente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Ativar notificações no ambiente de trabalho", "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no ambiente de trabalho. Depois da sua ativação, pode controlar precisamente quais tipos de interações geram notificações, através do botão {icon} acima.", "notifications_permission_banner.title": "Nunca perca nada", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index dc1be7bc1..a80bfa822 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Rezultatele căutării", "emoji_button.symbols": "Simboluri", "emoji_button.travel": "Călătorii și Locuri", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Nicio postare aici!", "empty_column.account_unavailable": "Profil indisponibil", "empty_column.blocks": "Nu ai blocat nici un utilizator încă.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Următorul", "lightbox.previous": "Precedentul", - "lightbox.view_context": "Vizualizați contextul", "lists.account.add": "Adaugă în listă", "lists.account.remove": "Elimină din listă", "lists.delete": "Șterge lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Schimbă titlul", "lists.new.create": "Adaugă listă", "lists.new.title_placeholder": "Titlu pentru noua listă", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Caută printre persoanele pe care le urmărești", "lists.subheading": "Listele tale", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Menționări", "notifications.filter.polls": "Rezultate sondaj", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notificări", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index c0022e524..bde219846 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Результаты поиска", "emoji_button.symbols": "Символы", "emoji_button.travel": "Путешествия и места", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Здесь нет постов!", "empty_column.account_unavailable": "Профиль недоступен", "empty_column.blocks": "Вы ещё никого не заблокировали.", @@ -258,7 +259,6 @@ "lightbox.expand": "Развернуть окно просмотра изображений", "lightbox.next": "Далее", "lightbox.previous": "Назад", - "lightbox.view_context": "Контекст", "lists.account.add": "Добавить в список", "lists.account.remove": "Убрать из списка", "lists.delete": "Удалить список", @@ -266,9 +266,9 @@ "lists.edit.submit": "Изменить название", "lists.new.create": "Создать список", "lists.new.title_placeholder": "Название для нового списка", - "lists.replies_policy.all_replies": "Пользователям, на которых вы подписаны", - "lists.replies_policy.list_replies": "Пользователям в списке", - "lists.replies_policy.no_replies": "Никому", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Показать ответы только:", "lists.search": "Искать среди подписок", "lists.subheading": "Ваши списки", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Упоминания", "notifications.filter.polls": "Результаты опросов", "notifications.filter.statuses": "Обновления от людей, на которых вы подписаны", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} уведомл.", "notifications.mark_as_read": "Отмечать все уведомления прочитанными", "notifications.permission_denied": "Уведомления на рабочем столе недоступны из-за ранее отклонённого запроса разрешений браузера", "notifications.permission_denied_alert": "Уведомления на рабочем столе не могут быть включены, так как раньше было отказано в разрешении браузера", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Включить уведомления на рабочем столе", "notifications_permission_banner.how_to_control": "Чтобы получать уведомления, когда Мастодон не открыт, включите уведомления рабочего стола. Вы можете точно управлять, какие типы взаимодействия генерируют уведомления рабочего стола с помощью кнопки {icon} выше, когда они включены.", "notifications_permission_banner.title": "Ничего не пропустите", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index a8f5171c9..4656aa275 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "अन्वेषणपरिणामाः", "emoji_button.symbols": "चिह्नानि", "emoji_button.travel": "यात्रा च स्थानानि", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "न दौत्यान्यत्र", "empty_column.account_unavailable": "व्यक्तित्वं न प्राप्यते", "empty_column.blocks": "नैकोऽप्युपभोक्ता निषिद्धो वर्तते", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index cf4ceb5d0..e1b4e3998 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -4,42 +4,42 @@ "account.badges.bot": "Bot", "account.badges.group": "Grupu", "account.block": "Bloca @{name}", - "account.block_domain": "Bloca domìniu{domain}", + "account.block_domain": "Bloca su domìniu {domain}", "account.blocked": "Blocadu", "account.browse_more_on_origin_server": "Esplora de prus in su profilu originale", "account.cancel_follow_request": "Annulla rechesta de sighidura", "account.direct": "Messàgiu deretu a @{name}", - "account.disable_notifications": "Acaba·la de mi notificare cando @{name} publicat carchi cosa", + "account.disable_notifications": "Non mi notìfiches prus cando @{name} pùblichet messàgios", "account.domain_blocked": "Domìniu blocadu", "account.edit_profile": "Modìfica profilu", - "account.enable_notifications": "Notìfica·mi cando @{name} pùblicat carchi cosa", + "account.enable_notifications": "Notìfica·mi cando @{name} pùblicat messàgios", "account.endorse": "Cussìgia in su profilu tuo", "account.follow": "Sighi", "account.followers": "Sighiduras", "account.followers.empty": "Nemos sighit ancora custa persone.", - "account.followers_counter": "{count, plural, one {{counter} Sighidore} other {{counter} Sighidores}}", - "account.following_counter": "{count, plural, one {{counter} Sighidu} other {{counter} Sighidos}}", + "account.followers_counter": "{count, plural, one {{counter} sighidura} other {{counter} sighiduras}}", + "account.following_counter": "{count, plural, one {Sighende a {counter}} other {Sighende a {counter}}}", "account.follows.empty": "Custa persone non sighit ancora a nemos.", "account.follows_you": "Ti sighit", "account.hide_reblogs": "Cua is cumpartziduras de @{name}", "account.last_status": "Ùrtima atividade", - "account.link_verified_on": "Sa propiedade de custu ligàmene est istada controllada su {date}", - "account.locked_info": "Sa persone chi tenet sa propiedade revisionat a manu chie dda podet sighire.", + "account.link_verified_on": "Sa propiedade de custu ligòngiu est istada controllada su {date}", + "account.locked_info": "S'istadu de riservadesa de custu contu est istadu cunfiguradu comente blocadu. Sa persone chi tenet sa propiedade revisionat a manu chie dda podet sighire.", "account.media": "Cuntenutu multimediale", - "account.mention": "Mentova @{name}", - "account.moved_to": "{name} est istadu trasferidu a:", - "account.mute": "Pone @name a sa muda", - "account.mute_notifications": "Notìficas disativadas dae @{name}", + "account.mention": "Mentova a @{name}", + "account.moved_to": "{name} at cambiadu a:", + "account.mute": "Pone a @{name} a sa muda", + "account.mute_notifications": "Disativa is notìficas de @{name}", "account.muted": "A sa muda", "account.never_active": "Mai", "account.posts": "Tuts", "account.posts_with_replies": "Tuts e rispostas", "account.report": "Signala @{name}", - "account.requested": "Incarca pro annullare sa rechesta de sighidura", + "account.requested": "Abetende s'aprovatzione. Incarca pro annullare sa rechesta de sighidura", "account.share": "Cumpartzi su profilu de @{name}", "account.show_reblogs": "Ammustra is cumpartziduras de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}", - "account.unblock": "Isbloca @{name}", + "account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tuts}}", + "account.unblock": "Isbloca a @{name}", "account.unblock_domain": "Isbloca su domìniu {domain}", "account.unendorse": "Non cussiges in su profilu", "account.unfollow": "Non sigas prus", @@ -49,7 +49,7 @@ "alert.rate_limited.message": "Torra·bi a proare a pustis de {retry_time, time, medium}.", "alert.rate_limited.title": "Màssimu de rechestas barigadu", "alert.unexpected.message": "B'at àpidu una faddina.", - "alert.unexpected.title": "Oops!", + "alert.unexpected.title": "Oh!", "announcement.announcement": "Annùntziu", "autosuggest_hashtag.per_week": "{count} a sa chida", "boost_modal.combo": "Podes incarcare {combo} pro brincare custu sa borta chi benit", @@ -73,7 +73,7 @@ "column.notifications": "Notìficas", "column.pins": "Tuts apicados", "column.public": "Lìnia de tempus federada", - "column_back_button.label": "In segus", + "column_back_button.label": "A coa", "column_header.hide_settings": "Cua is cunfiguratziones", "column_header.moveLeft_settings": "Moe sa colunna a manca", "column_header.moveRight_settings": "Moe sa colunna a dereta", @@ -81,13 +81,13 @@ "column_header.show_settings": "Ammustra is cunfiguratziones", "column_header.unpin": "Boga dae pitzu", "column_subheading.settings": "Cunfiguratziones", - "community.column_settings.local_only": "Locale ebbia", - "community.column_settings.media_only": "Multimediale isceti", - "community.column_settings.remote_only": "Remotu ebbia", + "community.column_settings.local_only": "Isceti locale", + "community.column_settings.media_only": "Isceti multimediale", + "community.column_settings.remote_only": "Isceti remotu", "compose_form.direct_message_warning": "Custu tut at a èssere imbiadu isceti a is persones mentovadas.", "compose_form.direct_message_warning_learn_more": "Àteras informatziones", - "compose_form.hashtag_warning": "Custu tut no at a èssere ammustradu in peruna eticheta, dae chi no est listadu.", - "compose_form.lock_disclaimer": "Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a is chi ti sighint.", + "compose_form.hashtag_warning": "Custu tut no at a èssere ammustradu in peruna eticheta, dae chi no est listadu. Isceti is tuts pùblicos podent èssere chircados cun etichetas.", + "compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.", "compose_form.lock_disclaimer.lock": "blocadu", "compose_form.placeholder": "A ite ses pensende?", "compose_form.poll.add_option": "Agiunghe unu sèberu", @@ -98,10 +98,10 @@ "compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti", "compose_form.publish": "Tut", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Marca mèdia comente a sensìbile", - "compose_form.sensitive.marked": "Mèdia marcadu comente a sensìbile", - "compose_form.sensitive.unmarked": "Mèdia non marcadu comente a sensìbile", - "compose_form.spoiler.marked": "Su testu est cuadu dae s'avisu", + "compose_form.sensitive.hide": "{count, plural, one {Marca elementu multimediale comente a sensìbile} other {Marca elementos multimediales comente sensìbiles}}", + "compose_form.sensitive.marked": "{count, plural, one {Elementu multimediale marcadu comente a sensìbile} other {Elementos multimediales marcados comente a sensìbiles}}", + "compose_form.sensitive.unmarked": "{count, plural, one {Elementu multimediale non marcadu comente a sensìbile} other {Elementos multimediales non marcados comente a sensìbiles}}", + "compose_form.spoiler.marked": "Su testu est cuadu in fatu de s'avisu", "compose_form.spoiler.unmarked": "Su testu no est cuadu", "compose_form.spoiler_placeholder": "Iscrie s'avisu tuo inoghe", "confirmation_modal.cancel": "Annulla", @@ -112,24 +112,24 @@ "confirmations.delete.message": "Seguru chi boles cantzellare custu tut?", "confirmations.delete_list.confirm": "Cantzella", "confirmations.delete_list.message": "Seguru chi boles cantzellare custa lista in manera permanente?", - "confirmations.domain_block.confirm": "Cua totu su domìniu", - "confirmations.domain_block.message": "Ses seguru a beru, ma a beru a beru, de bòlere blocare su {domain} intreu? In sa parte manna de is casos pagos blocos o silentziamentos de utentes sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Is sighidores tuos dae cussu domìniu ant a èssere bogados.", + "confirmations.domain_block.confirm": "Bloca totu su domìniu", + "confirmations.domain_block.message": "Boles de seguru, ma a beru a beru, blocare su {domain} intreu? In sa parte manna de is casos pagos blocos o silentziamentos de persones sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Sa gente chi ti sighit dae cussu domìniu at a èssere bogada.", "confirmations.logout.confirm": "Essi·nche", "confirmations.logout.message": "Seguru chi boles essire?", "confirmations.mute.confirm": "A sa muda", "confirmations.mute.explanation": "Custu at a cuare is publicatziones issoro e is messàgios chi ddos mentovant, ma ant a pòdere bìdere is messàgios tuos e t'ant a pòdere sighire.", - "confirmations.mute.message": "Seguru chi boles pònnere {name} a sa muda?", + "confirmations.mute.message": "Seguru chi boles pònnere a {name} a sa muda?", "confirmations.redraft.confirm": "Cantzella e torra a fàghere", - "confirmations.redraft.message": "As a pèrdere is preferidos e is cumpartziduras, e is rispostas a su messàgiu originale ant a abarrare òrfanas.", + "confirmations.redraft.message": "Seguru chi boles cantzellare a torrare a fàghere custu tut? As a pèrdere is preferidos e is cumpartziduras, e is rispostas a su messàgiu originale ant a abarrare òrfanas.", "confirmations.reply.confirm": "Risponde", "confirmations.reply.message": "Rispondende immoe as a subraiscrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?", "confirmations.unfollow.confirm": "Non sigas prus", - "confirmations.unfollow.message": "Seguru chi non boles sighire prus {name}?", + "confirmations.unfollow.message": "Seguru chi non boles sighire prus a {name}?", "conversation.delete": "Cantzella arresonada", "conversation.mark_as_read": "Signala comente lèghidu", - "conversation.open": "Bide arresonada", + "conversation.open": "Ammsutra arresonada", "conversation.with": "Cun {names}", - "directory.federated": "Dae unu fediversu connòschidu", + "directory.federated": "Dae unu fediversu connotu", "directory.local": "Isceti dae {domain}", "directory.new_arrivals": "Arribos noos", "directory.recently_active": "Ativos dae pagu", @@ -149,14 +149,15 @@ "emoji_button.search_results": "Resurtados de sa chirca", "emoji_button.symbols": "Sìmbulos", "emoji_button.travel": "Biàgios e logos", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Perunu tut inoghe!", "empty_column.account_unavailable": "Su profilu no est a disponimentu", - "empty_column.blocks": "No as isblocadu ancora nemos.", + "empty_column.blocks": "No as blocadu ancora nemos.", "empty_column.bookmarked_statuses": "Non tenes ancora perunu tut in is marcadores. Cando nd'as a agiùnghere unu, at a èssere ammustradu inoghe.", "empty_column.community": "Sa lìnia de tempus locale est bòida. Iscrie inoghe pro cumintzare sa festa!", "empty_column.direct": "Non tenes ancora perunu messàgiu deretu. Cando nd'as a imbiare o nd'as a retzire unu, at a èssere ammustradu inoghe.", "empty_column.domain_blocks": "Non tenes ancora perunu domìniu blocadu.", - "empty_column.favourited_statuses": "Non tenes ancora perunu tut in is marcadores. Cando nd'as a agiùnghere unu, at a èssere ammustradu inoghe.", + "empty_column.favourited_statuses": "Non tenes ancora perunu tut in is preferidos. Cando nd'as a agiùnghere unu, at a èssere ammustradu inoghe.", "empty_column.favourites": "Nemos at marcadu ancora custu tut comente preferidu. Cando calicunu dd'at a fàghere, at a èssere ammustradu inoghe.", "empty_column.follow_requests": "Non tenes ancora peruna rechesta de sighidura. Cando nd'as a retzire una, at a èssere ammustrada inoghe.", "empty_column.hashtag": "Ancora nudda in custa eticheta.", @@ -169,8 +170,8 @@ "empty_column.public": "Nudda inoghe. Iscrie calicuna cosa pùblica, o sighi àteras persones de àteros serbidores pro prenare custu ispàtziu", "error.unexpected_crash.explanation": "A càusa de una faddina in su còdighe nostru o unu problema de cumpatibilidade de su navigadore, custa pàgina diat pòdere no èssere ammustrada in manera curreta.", "error.unexpected_crash.explanation_addons": "Custa pàgina diat pòdere no èssere ammustrada comente si tocat. Custa faddina est probàbile chi dipendat dae un'estensione de su navigadore o dae ainas automàticas de tradutzione.", - "error.unexpected_crash.next_steps": "Proa de atualizare sa pàgina. Si custu non acontza su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.", - "error.unexpected_crash.next_steps_addons": "Proa a ddos disabilitare e a atualizare sa pàgina. Si custu non acontzat su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.", + "error.unexpected_crash.next_steps": "Proa de torrare a carrigare sa pàgina. Si custu no acontza su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.", + "error.unexpected_crash.next_steps_addons": "Proa a ddos disabilitare e torra a carrigare sa pàgina. Si custu no acontzat su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.", "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace in punta de billete", "errors.unexpected_crash.report_issue": "Signala unu problema", "follow_request.authorize": "Autoriza", @@ -199,14 +200,14 @@ "home.column_settings.show_replies": "Ammustra rispostas", "home.hide_announcements": "Cua annùntzios", "home.show_announcements": "Ammustra annùntzios", - "intervals.full.days": "{number, plural, one {# die} other {# die}}", + "intervals.full.days": "{number, plural, one {# die} other {# dies}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}", "introduction.federation.action": "Sighi", "introduction.federation.federated.headline": "Federada", "introduction.federation.federated.text": "Is publicatziones pùblicas de àteros serbidores de su fediversu ant a aparèssere in sa lìnia de tempus federada.", "introduction.federation.home.headline": "Printzipale", - "introduction.federation.home.text": "Is messàgios de gente chi sighis ant a aparèssere in lìnia de tempus printzipale tua. Podes sighire gente de cale si siat serbidore.", + "introduction.federation.home.text": "Is messàgios de sa gente chi sighis ant a aparèssere in sa lìnia de tempus printzipale tua. Podes sighire gente de cale si siat serbidore!", "introduction.federation.local.headline": "Locale", "introduction.federation.local.text": "Is publicatziones pùblicas de sa gente de su pròpiu serbidore tuo ant a aparèssere in sa lìnia de tempus locale.", "introduction.interactions.action": "Acabba su tutoriale!", @@ -218,16 +219,16 @@ "introduction.interactions.reply.text": "Podes rispòndere a is tuts de àtera gente e a is tuos pròpios, e ant a èssere unidos in un'arresonada.", "introduction.welcome.action": "Ajò, andamus!", "introduction.welcome.headline": "Primos passos", - "introduction.welcome.text": "Ti donamus sa benebènnida a su fediversu. Dae immoe a pagu, as a pòdere publicare messàgios e chistionare cun is amistades tuas in meda serbidores. Però custu serbidore, {domain}, est ispetziale: allògiat su profilu tuo, duncas regorda·nde si nòmine.", + "introduction.welcome.text": "Ti donamus sa benebènnida a su fediversu. Dae immoe a pagu, as a pòdere publicare messàgios e chistionare cun is amistades tuas in meda serbidores. Però custu serbidore, {domain}, est ispetziale: allògiat su profilu tuo, duncas regorda·ti·nde su nòmine.", "keyboard_shortcuts.back": "pro navigare in segus", "keyboard_shortcuts.blocked": "pro abèrrere sa lista de persones blocadas", "keyboard_shortcuts.boost": "pro cumpartzire", - "keyboard_shortcuts.column": "pro atzentrare un'istadu in una de is colunnas", + "keyboard_shortcuts.column": "pro atzentrare unu tut in una de is colunnas", "keyboard_shortcuts.compose": "pro atzentrare in s'àrea de cumpositzione de testu", "keyboard_shortcuts.description": "Descritzione", "keyboard_shortcuts.direct": "pro abèrrere sa colunna de messàgios diretos", "keyboard_shortcuts.down": "pro mòere in bàsciu in sa lista", - "keyboard_shortcuts.enter": "pro abèrrere s'istadu", + "keyboard_shortcuts.enter": "pro abèrrere su tut", "keyboard_shortcuts.favourite": "pro marcare comente a preferidu", "keyboard_shortcuts.favourites": "pro abèrrere sa lista de preferidos", "keyboard_shortcuts.federated": "pro abèrrere sa lìnia de tempus federada", @@ -240,7 +241,7 @@ "keyboard_shortcuts.muted": "pro abèrrere sa lista de persones a sa muda", "keyboard_shortcuts.my_profile": "pro abèrrere su profilu tuo", "keyboard_shortcuts.notifications": "pro abèrrere sa colunna de notificatziones", - "keyboard_shortcuts.open_media": "pro abèrrere mèdia", + "keyboard_shortcuts.open_media": "pro abèrrere elementos multimediales", "keyboard_shortcuts.pinned": "pro abèrrere lista de tuts apicados", "keyboard_shortcuts.profile": "pro abèrrere su profilu de s'autore", "keyboard_shortcuts.reply": "pro rispòndere", @@ -249,7 +250,7 @@ "keyboard_shortcuts.spoilers": "pro ammustrare/cuare su campu AC", "keyboard_shortcuts.start": "pro abèrrere sa colunna \"Cumintza\"", "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is AC", - "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare mèdias", + "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare elementos multimediales", "keyboard_shortcuts.toot": "pro cumintzare a iscrìere unu tut nou", "keyboard_shortcuts.unfocus": "pro essire de s'àrea de cumpositzione de testu o de chirca", "keyboard_shortcuts.up": "pro mòere in susu in sa lista", @@ -258,26 +259,25 @@ "lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines", "lightbox.next": "Sighi", "lightbox.previous": "Pretzedente", - "lightbox.view_context": "Bide su cuntestu", - "lists.account.add": "Agiùnghe a sa lista", + "lists.account.add": "Agiunghe a sa lista", "lists.account.remove": "Boga dae sa lista", "lists.delete": "Cantzella sa lista", "lists.edit": "Modìfica sa lista", "lists.edit.submit": "Muda su tìtulu", "lists.new.create": "Agiunghe lista", - "lists.new.title_placeholder": "Lista noa", - "lists.replies_policy.all_replies": "Cale si siat utente sighidu", - "lists.replies_policy.list_replies": "Membros de sa lista", - "lists.replies_policy.no_replies": "Perunu", + "lists.new.title_placeholder": "Tìtulu de sa lista noa", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Ammustra is rispostas a:", - "lists.search": "Chircare intre sa gente chi ses sighende", + "lists.search": "Chirca intre sa gente chi ses sighende", "lists.subheading": "Is listas tuas", "load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}", "loading_indicator.label": "Carrighende...", - "media_gallery.toggle_visible": "Cua mèdia", + "media_gallery.toggle_visible": "Cua {number, plural, one {immàgine} other {immàgines}}", "missing_indicator.label": "Perunu resurtadu", "missing_indicator.sublabel": "Resursa no agatada", - "mute_modal.duration": "Duration", + "mute_modal.duration": "Durada", "mute_modal.hide_notifications": "Boles cuare is notìficas de custa persone?", "mute_modal.indefinite": "Indefinida", "navigation_bar.apps": "Aplicatziones mòbiles", @@ -290,7 +290,7 @@ "navigation_bar.domain_blocks": "Domìnios blocados", "navigation_bar.edit_profile": "Modìfica profilu", "navigation_bar.favourites": "Preferidos", - "navigation_bar.filters": "Paràulas a sa muda", + "navigation_bar.filters": "Faeddos a sa muda", "navigation_bar.follow_requests": "Rechestas de sighidura", "navigation_bar.follows_and_followers": "Persones chi sighis e chi ti sighint", "navigation_bar.info": "Informatziones de su serbidore", @@ -309,7 +309,7 @@ "notification.mention": "{name} t'at mentovadu", "notification.own_poll": "Sondàgiu acabbadu", "notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu", - "notification.reblog": "{name} at cumpartzidu s'istadu tuo", + "notification.reblog": "{name} at cumpartzidu su tut tuo", "notification.status": "{name} at publicadu cosa", "notifications.clear": "Lìmpia notìficas", "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?", @@ -318,8 +318,8 @@ "notifications.column_settings.filter_bar.advanced": "Ammustra totu is categorias", "notifications.column_settings.filter_bar.category": "Barra lestra de filtros", "notifications.column_settings.filter_bar.show": "Ammustra", - "notifications.column_settings.follow": "Gente noa chi ti sighit:", - "notifications.column_settings.follow_request": "Rechesta de sighidura noa:", + "notifications.column_settings.follow": "Sighiduras noas:", + "notifications.column_settings.follow_request": "Rechestas noas de sighidura:", "notifications.column_settings.mention": "Mentovos:", "notifications.column_settings.poll": "Resurtados de su sondàgiu:", "notifications.column_settings.push": "Notìficas push", @@ -332,20 +332,22 @@ "notifications.filter.favourites": "Preferidos", "notifications.filter.follows": "Sighende", "notifications.filter.mentions": "Mentovos", - "notifications.filter.polls": "Resurtados dae su sondàgiu", - "notifications.filter.statuses": "Agiornamentos dae is persones chi sighis", + "notifications.filter.polls": "Resurtados de su sondàgiu", + "notifications.filter.statuses": "Atualizatziones dae gente chi sighis", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notìficas", - "notifications.mark_as_read": "Mark every notification as read", + "notifications.mark_as_read": "Sinnala ònnia notìfica comente lèghida", "notifications.permission_denied": "Is notìficas de iscrivania non sunt a disponimentu pro neghe de rechestas de permissu chi sunt istadas dennegadas in antis", "notifications.permission_denied_alert": "Is notìficas de iscrivania non podent èssere abilitadas, ca su permissu de su navigadore est istadu dennegadu in antis", - "notifications_permission_banner.enable": "Abìlita is notìficas de iscrivania", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications_permission_banner.enable": "Abilita is notìficas de iscrivania", + "notifications_permission_banner.how_to_control": "Pro retzire notìficas cando Mastodon no est abertu, abilita is notìficas de iscrivania. Podes controllare cun pretzisione is castas de interatziones chi ingendrant notìficas de iscrivania pro mèdiu de su butone {icon} in subra, cando sunt abilitadas.", + "notifications_permission_banner.title": "Non ti perdas mai nudda", + "picture_in_picture.restore": "Torra·ddu a ue fiat", "poll.closed": "Serradu", "poll.refresh": "Atualiza", - "poll.total_people": "{count, plurale, one {# persone} other {# persones}}", - "poll.total_votes": "{count, plurale, one {# votu} other {# votos}}", + "poll.total_people": "{count, plural, one {# persone} other {# persones}}", + "poll.total_votes": "{count, plural, one {# votu} other {# votos}}", "poll.vote": "Vota", "poll.voted": "As votadu custa risposta", "poll_button.add_poll": "Agiunghe unu sondàgiu", @@ -370,7 +372,7 @@ "relative_time.today": "oe", "reply_indicator.cancel": "Annulla", "report.forward": "Torra a imbiare a {target}", - "report.forward_hint": "Custu contu est de un'àteru serbidore. Bi boles imbiare puru una còpia anònima de custu informe?", + "report.forward_hint": "Custu contu est de un'àteru serbidore. Ddi boles imbiare puru una còpia anònima de custu informe?", "report.hint": "S'informe at a èssere imbiadu a sa moderatzione de su serbidore. Podes frunire un'ispiegatzione de sa signalatzione tua de custu contu:", "report.placeholder": "Cummentos additzionales", "report.submit": "Imbia", @@ -379,21 +381,21 @@ "search_popout.search_format": "Formadu de chirca avantzada", "search_popout.tips.full_text": "Testu sèmplitze pro agatare istados chi as iscritu, marcadu comente a preferidos, cumpartzidu o chi t'ant mentovadu, e fintzas nòmines de utente, nòmines visualizados e etichetas chi ddu includent.", "search_popout.tips.hashtag": "eticheta", - "search_popout.tips.status": "istadu", + "search_popout.tips.status": "tut", "search_popout.tips.text": "Testu sèmplitze pro agatare nòmines visualizados, nòmines de utente e etichetas", "search_popout.tips.user": "utente", "search_results.accounts": "Gente", "search_results.hashtags": "Etichetas", "search_results.statuses": "Tuts", "search_results.statuses_fts_disabled": "Sa chirca de tuts pro su cuntenutu issoro no est abilitada in custu serbidore de Mastodon.", - "search_results.total": "{count, number} {count, plurale, one {resurtadu} other {resurtados}}", + "search_results.total": "{count, number} {count, plural, one {resurtadu} other {resurtados}}", "status.admin_account": "Aberi s'interfache de moderatzione pro @{name}", "status.admin_status": "Aberi custu istadu in s'interfache de moderatzione", "status.block": "Bloca @{name}", - "status.bookmark": "Marcadore", + "status.bookmark": "Sinnalibru", "status.cancel_reblog_private": "Iscontza sa cumpartzidura", "status.cannot_reblog": "Custa publicatzione non podet èssere cumpartzida", - "status.copy": "Còpia su ligàmene a s'istadu tuo", + "status.copy": "Còpia su ligòngiu a su tut tuo", "status.delete": "Cantzella", "status.detailed_status": "Visualizatzione de detàlliu de arresonada", "status.direct": "Messàgiu deretu a @{name}", @@ -401,24 +403,24 @@ "status.favourite": "Preferidos", "status.filtered": "Filtradu", "status.load_more": "Càrriga·nde àteros", - "status.media_hidden": "Mèdias cuados", + "status.media_hidden": "Elementos multimediales cuados", "status.mention": "Mentova @{name}", "status.more": "Àteru", - "status.mute": "Pone @name a sa muda", + "status.mute": "Pone @{name} a sa muda", "status.mute_conversation": "Pone s'arresonada a sa muda", - "status.open": "Ismànnia custu istadu", + "status.open": "Ismànnia custu tut", "status.pin": "Apica in su profilu", "status.pinned": "Tut apicadu", - "status.read_more": "Lèghe·nde àteru", + "status.read_more": "Leghe·nde àteru", "status.reblog": "Cumpartzi", "status.reblog_private": "Cumpartzi cun is utentes originales", "status.reblogged_by": "{name} at cumpartzidu", "status.reblogs.empty": "Nemos at ancora cumpartzidu custu tut. Cando calicunu dd'at a fàghere, at a èssere ammustradu inoghe.", "status.redraft": "Cantzella e torra a iscrìere", - "status.remove_bookmark": "Boga su marcadore", + "status.remove_bookmark": "Boga su sinnalibru", "status.reply": "Risponde", "status.replyAll": "Risponde a su tema", - "status.report": "Signala @{name}", + "status.report": "Sinnala @{name}", "status.sensitive_warning": "Cuntenutu sensìbile", "status.share": "Cumpartzi", "status.show_less": "Ammustra·nde prus pagu", @@ -428,7 +430,7 @@ "status.show_thread": "Ammustra su tema", "status.uncached_media_warning": "No est a disponimentu", "status.unmute_conversation": "Torra a ativare s'arresonada", - "status.unpin": "Isbloca dae pitzu de su profilu", + "status.unpin": "Boga dae pitzu de su profilu", "suggestions.dismiss": "Iscarta cussìgiu", "suggestions.header": "Est possìbile chi tèngias interessu in…", "tabs_bar.federated_timeline": "Federada", @@ -441,34 +443,34 @@ "time_remaining.minutes": "{number, plural, one {abarrat # minutu} other {abarrant # minutos}}", "time_remaining.moments": "Abarrant pagu momentos", "time_remaining.seconds": "{number, plural, one {abarrat # segundu} other {abarrant # segundos}}", - "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", - "timeline_hint.resources.followers": "Followers", - "timeline_hint.resources.follows": "Follows", - "timeline_hint.resources.statuses": "Older toots", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", + "timeline_hint.remote_resource_not_displayed": "{resource} dae àteros serbidores non benint ammustrados.", + "timeline_hint.resources.followers": "Sighiduras", + "timeline_hint.resources.follows": "Sighende", + "timeline_hint.resources.statuses": "Tuts prus betzos", + "trends.counter_by_accounts": "{count, plural, one {{counter} persone} other {{counter} persones}} chistionende", "trends.trending_now": "Est tendèntzia immoe", "ui.beforeunload": "S'abbotzu tuo at a èssere pèrdidu si essis dae Mastodon.", - "units.short.billion": "{count}B", - "units.short.million": "{count}M", - "units.short.thousand": "{count}K", + "units.short.billion": "{count}Mrd", + "units.short.million": "{count}Mln", + "units.short.thousand": "{count}m", "upload_area.title": "Traga pro carrigare", - "upload_button.label": "Agiunghe mèdias", + "upload_button.label": "Agiunghe immàgines, unu vìdeu o unu documentu sonoru", "upload_error.limit": "Lìmite de càrriga de archìvios barigadu.", "upload_error.poll": "Non si permitit s'imbiu de archìvios in is sondàgios.", "upload_form.audio_description": "Descritzione pro persones cun pèrdida auditiva", "upload_form.description": "Descritzione pro persones cun problemas visuales", "upload_form.edit": "Modìfica", - "upload_form.thumbnail": "Change thumbnail", + "upload_form.thumbnail": "Càmbia sa miniadura", "upload_form.undo": "Cantzella", "upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o problemas visuales", "upload_modal.analyzing_picture": "Analizende immàgine…", "upload_modal.apply": "Àplica", - "upload_modal.choose_image": "Choose image", + "upload_modal.choose_image": "Sèbera un'immàgine", "upload_modal.description_placeholder": "Su margiane castàngiu brincat lestru a subra de su cane mandrone", "upload_modal.detect_text": "Rileva testu de s'immàgine", - "upload_modal.edit_media": "Modìfica su mèdia", - "upload_modal.hint": "Incarca o traga su tzìrculu in sa previsualizatzione pro seberare su puntu focale chi at a èssere semper visìbile in totu is miniaturas.", - "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.edit_media": "Modìfica elementu multimediale", + "upload_modal.hint": "Incarca o traga su tzìrculu in sa previsualizatzione pro seberare su puntu focale chi at a èssere semper visìbile in totu is miniaduras.", + "upload_modal.preparing_ocr": "Ammaniende s'OCR…", "upload_modal.preview_label": "Previsualiza ({ratio})", "upload_progress.label": "Carrighende...", "video.close": "Serra su vìdeu", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index cf8d3e6b1..6640d5472 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Nájdené", "emoji_button.symbols": "Symboly", "emoji_button.travel": "Cestovanie a miesta", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Niesú tu žiadne príspevky!", "empty_column.account_unavailable": "Profil nedostupný", "empty_column.blocks": "Ešte si nikoho nezablokoval/a.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Ďalšie", "lightbox.previous": "Predchádzajúci", - "lightbox.view_context": "Ukáž kontext", "lists.account.add": "Pridaj do zoznamu", "lists.account.remove": "Odober zo zoznamu", "lists.delete": "Vymaž list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Zmeň názov", "lists.new.create": "Pridaj zoznam", "lists.new.title_placeholder": "Názov nového zoznamu", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Vyhľadávaj medzi užívateľmi, ktorých sleduješ", "lists.subheading": "Tvoje zoznamy", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Iba spomenutia", "notifications.filter.polls": "Výsledky ankiet", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} oboznámení", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index dd25cbc03..ca29c4455 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Rezultati iskanja", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Potovanja in Kraji", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Tukaj ni tutov!", "empty_column.account_unavailable": "Profil ni na voljo", "empty_column.blocks": "Niste še blokirali nobenega uporabnika.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Naslednji", "lightbox.previous": "Prejšnji", - "lightbox.view_context": "Poglej kontekst", "lists.account.add": "Dodaj na seznam", "lists.account.remove": "Odstrani s seznama", "lists.delete": "Izbriši seznam", @@ -266,9 +266,9 @@ "lists.edit.submit": "Spremeni naslov", "lists.new.create": "Dodaj seznam", "lists.new.title_placeholder": "Nov naslov seznama", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Išči med ljudmi, katerim sledite", "lists.subheading": "Vaši seznami", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Omembe", "notifications.filter.polls": "Rezultati glasovanj", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} obvestil", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 63feac7ff..d73c7802b 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Përfundime kërkimi", "emoji_button.symbols": "Simbole", "emoji_button.travel": "Udhëtime & Vende", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "S’ka mesazhe këtu!", "empty_column.account_unavailable": "Profil jashtë funksionimi", "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.", @@ -258,7 +259,6 @@ "lightbox.expand": "Zgjeroje kuadratin e parjes së figurave", "lightbox.next": "Pasuesja", "lightbox.previous": "E mëparshmja", - "lightbox.view_context": "Shihni kontekstin", "lists.account.add": "Shto në listë", "lists.account.remove": "Hiqe nga lista", "lists.delete": "Fshije listën", @@ -266,9 +266,9 @@ "lists.edit.submit": "Ndryshoni titullin", "lists.new.create": "Shtoni listë", "lists.new.title_placeholder": "Titull liste të re", - "lists.replies_policy.all_replies": "Cilido përdorues i ndjekur", - "lists.replies_policy.list_replies": "Anëtarë të listës", - "lists.replies_policy.no_replies": "Askush", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Shfaq përgjigje për:", "lists.search": "Kërkoni mes personash që ndiqni", "lists.subheading": "Listat tuaja", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Përmendje", "notifications.filter.polls": "Përfundime pyetësori", "notifications.filter.statuses": "Përditësime prej personash që ndiqni", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count}s njoftime", "notifications.mark_as_read": "Vëri shenjë çdo njoftimi si të lexuar", "notifications.permission_denied": "S’mund të aktivizohen njoftime në desktop, ngaqë janë mohuar lejet për këtë.", "notifications.permission_denied_alert": "S’mund të aktivizohen njoftimet në desktop, ngaqë lejet e shfletuesit për këtë janë mohuar më herët", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Aktivizo njoftime në desktop", "notifications_permission_banner.how_to_control": "Për të marrë njoftime, kur Mastodon-i s’është i hapur, aktivizoni njoftime në desktop. Përmes butoni {icon} më sipër, mund të kontrolloni me përpikëri cilat lloje ndërveprimesh prodhojnë njoftime në dekstop, pasi të jenë aktivizuar.", "notifications_permission_banner.title": "Mos t’ju shpëtojë gjë", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 38fc9cdce..88c9df59b 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Rezultati pretrage", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Putovanja & mesta", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Sledeći", "lightbox.previous": "Prethodni", - "lightbox.view_context": "View context", "lists.account.add": "Dodaj na listu", "lists.account.remove": "Ukloni sa liste", "lists.delete": "Obriši listu", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Dodaj listu", "lists.new.title_placeholder": "Naslov nove liste", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Pretraži među ljudima koje pratite", "lists.subheading": "Vaše liste", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 8df81fae6..2509c9085 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Резултати претраге", "emoji_button.symbols": "Симболи", "emoji_button.travel": "Путовања и места", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Овде нема труба!", "empty_column.account_unavailable": "Профил недоступан", "empty_column.blocks": "Још увек немате блокираних корисника.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Следећи", "lightbox.previous": "Претходни", - "lightbox.view_context": "View context", "lists.account.add": "Додај на листу", "lists.account.remove": "Уклони са листе", "lists.delete": "Обриши листу", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Додај листу", "lists.new.title_placeholder": "Наслов нове листе", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Претражи међу људима које пратите", "lists.subheading": "Ваше листе", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} обавештења", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 295b98f0d..a75cca8b5 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -9,10 +9,10 @@ "account.browse_more_on_origin_server": "Läs mer på original profilen", "account.cancel_follow_request": "Avbryt följarförfrågan", "account.direct": "Skicka ett direktmeddelande till @{name}", - "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.disable_notifications": "Sluta meddela mig när @{name} tutar", "account.domain_blocked": "Domän dold", "account.edit_profile": "Redigera profil", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "Meddela mig när @{name} tutar", "account.endorse": "Visa på profil", "account.follow": "Följ", "account.followers": "Följare", @@ -149,6 +149,7 @@ "emoji_button.search_results": "Sökresultat", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Resor & platser", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Inga inlägg här!", "empty_column.account_unavailable": "Profilen ej tillgänglig", "empty_column.blocks": "Du har ännu ej blockerat några användare.", @@ -168,9 +169,9 @@ "empty_column.notifications": "Du har inga meddelanden än. Interagera med andra för att starta konversationen.", "empty_column.public": "Det finns inget här! Skriv något offentligt, eller följ manuellt användarna från andra instanser för att fylla på det", "error.unexpected_crash.explanation": "På grund av en bugg i vår kod eller kompatiblitetsproblem i webbläsaren kan den här sidan inte visas korrekt.", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", + "error.unexpected_crash.explanation_addons": "Denna sida kunde inte visas korrekt. Detta beror troligen på ett webbläsartillägg eller ett automatiskt översättningsverktyg.", "error.unexpected_crash.next_steps": "Prova att ladda om sidan. Om det inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller app.", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.next_steps_addons": "Prova att avaktivera dem och uppdatera sidan. Om detta inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller en app.", "errors.unexpected_crash.copy_stacktrace": "Kopiera stacktrace till urklipp", "errors.unexpected_crash.report_issue": "Rapportera problem", "follow_request.authorize": "Godkänn", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Nästa", "lightbox.previous": "Tidigare", - "lightbox.view_context": "Visa kontext", "lists.account.add": "Lägg till i lista", "lists.account.remove": "Ta bort från lista", "lists.delete": "Radera lista", @@ -266,9 +266,9 @@ "lists.edit.submit": "Ändra titel", "lists.new.create": "Lägg till lista", "lists.new.title_placeholder": "Ny listrubrik", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Sök bland personer du följer", "lists.subheading": "Dina listor", @@ -334,12 +334,14 @@ "notifications.filter.mentions": "Omnämningar", "notifications.filter.polls": "Omröstningsresultat", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} aviseringar", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", + "notifications_permission_banner.how_to_control": "För att ta emot aviseringar när Mastodon inte är öppet, aktivera skrivbordsaviseringar. När de är aktiverade kan du styra exakt vilka typer av interaktioner som aviseras via {icon} -knappen ovan.", "notifications_permission_banner.title": "Never miss a thing", "picture_in_picture.restore": "Put it back", "poll.closed": "Stängd", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index 17ffe5519..70f6ab152 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index d509b619a..8f5f06cc4 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "தேடல் முடிவுகள்", "emoji_button.symbols": "குறியீடுகள்", "emoji_button.travel": "சுற்றுலா மற்றும் இடங்கள்", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "டூட்டுகள் ஏதும் இல்லை!", "empty_column.account_unavailable": "சுயவிவரம் கிடைக்கவில்லை", "empty_column.blocks": "நீங்கள் இதுவரை எந்தப் பயனர்களையும் முடக்கியிருக்கவில்லை.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "அடுத்த", "lightbox.previous": "சென்ற", - "lightbox.view_context": "சூழலைக் பார்", "lists.account.add": "பட்டியலில் சேர்", "lists.account.remove": "பட்டியலில் இருந்து அகற்று", "lists.delete": "பட்டியலை நீக்கு", @@ -266,9 +266,9 @@ "lists.edit.submit": "தலைப்பு மாற்றவும்", "lists.new.create": "பட்டியலில் சேர்", "lists.new.title_placeholder": "புதிய பட்டியல் தலைப்பு", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "நீங்கள் பின்தொடரும் நபர்கள் மத்தியில் தேடுதல்", "lists.subheading": "உங்கள் பட்டியல்கள்", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "குறிப்பிடுகிறார்", "notifications.filter.polls": "கருத்துக்கணிப்பு முடிவுகள்", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} அறிவிப்புகள்", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index 17ffe5519..70f6ab152 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 84e73f7e5..994682a67 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "శోధన ఫలితాలు", "emoji_button.symbols": "చిహ్నాలు", "emoji_button.travel": "ప్రయాణం & ప్రదేశాలు", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "ఇక్కడ ఏ టూట్లూ లేవు!No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "మీరు ఇంకా ఏ వినియోగదారులనూ బ్లాక్ చేయలేదు.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "తరువాత", "lightbox.previous": "మునుపటి", - "lightbox.view_context": "View context", "lists.account.add": "జాబితాకు జోడించు", "lists.account.remove": "జాబితా నుండి తొలగించు", "lists.delete": "జాబితాను తొలగించు", @@ -266,9 +266,9 @@ "lists.edit.submit": "శీర్షిక మార్చు", "lists.new.create": "జాబితాను జోడించు", "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి", "lists.subheading": "మీ జాబితాలు", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "పేర్కొన్నవి", "notifications.filter.polls": "ఎన్నిక ఫలితాలు", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} ప్రకటనలు", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index a2add6715..d036a0896 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -98,9 +98,9 @@ "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว", "compose_form.publish": "โพสต์", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "ทำเครื่องหมายสื่อว่าละเอียดอ่อน", - "compose_form.sensitive.marked": "มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน", - "compose_form.sensitive.unmarked": "ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน", + "compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}", + "compose_form.sensitive.marked": "{count, plural, other {มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}", + "compose_form.sensitive.unmarked": "{count, plural, other {ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}", "compose_form.spoiler.marked": "มีการซ่อนข้อความอยู่หลังคำเตือน", "compose_form.spoiler.unmarked": "ไม่มีการซ่อนข้อความ", "compose_form.spoiler_placeholder": "เขียนคำเตือนของคุณที่นี่", @@ -149,6 +149,7 @@ "emoji_button.search_results": "ผลลัพธ์การค้นหา", "emoji_button.symbols": "สัญลักษณ์", "emoji_button.travel": "การเดินทางและสถานที่", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "ไม่มีโพสต์ที่นี่!", "empty_column.account_unavailable": "ไม่มีโปรไฟล์", "empty_column.blocks": "คุณยังไม่ได้ปิดกั้นผู้ใช้ใด ๆ", @@ -258,7 +259,6 @@ "lightbox.expand": "ขยายกล่องดูภาพ", "lightbox.next": "ถัดไป", "lightbox.previous": "ก่อนหน้า", - "lightbox.view_context": "ดูบริบท", "lists.account.add": "เพิ่มไปยังรายการ", "lists.account.remove": "เอาออกจากรายการ", "lists.delete": "ลบรายการ", @@ -266,15 +266,15 @@ "lists.edit.submit": "เปลี่ยนชื่อเรื่อง", "lists.new.create": "เพิ่มรายการ", "lists.new.title_placeholder": "ชื่อเรื่องรายการใหม่", - "lists.replies_policy.all_replies": "ผู้ใช้ใด ๆ ที่ติดตาม", - "lists.replies_policy.list_replies": "สมาชิกของรายการ", - "lists.replies_policy.no_replies": "ไม่มีใคร", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "แสดงการตอบกลับแก่:", "lists.search": "ค้นหาในหมู่ผู้คนที่คุณติดตาม", "lists.subheading": "รายการของคุณ", "load_pending": "{count, plural, other {# รายการใหม่}}", "loading_indicator.label": "กำลังโหลด...", - "media_gallery.toggle_visible": "ซ่อน{number, plural, other {ภาพ}}", + "media_gallery.toggle_visible": "ซ่อน {number, plural, other {ภาพ}}", "missing_indicator.label": "ไม่พบ", "missing_indicator.sublabel": "ไม่พบทรัพยากรนี้", "mute_modal.duration": "ระยะเวลา", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "การกล่าวถึง", "notifications.filter.polls": "ผลลัพธ์การสำรวจความคิดเห็น", "notifications.filter.statuses": "การอัปเดตจากผู้คนที่คุณติดตาม", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} การแจ้งเตือน", "notifications.mark_as_read": "ทำเครื่องหมายทุกการแจ้งเตือนว่าอ่านแล้ว", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "ไม่พลาดสิ่งต่าง ๆ", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index ec5f65a0c..76407efce 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Arama sonuçları", "emoji_button.symbols": "Semboller", "emoji_button.travel": "Seyahat ve Yerler", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Burada hiç toot yok!", "empty_column.account_unavailable": "Profil kullanılamıyor", "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.", @@ -258,7 +259,6 @@ "lightbox.expand": "Resim görüntüleme kutusunu genişlet", "lightbox.next": "Sonraki", "lightbox.previous": "Önceki", - "lightbox.view_context": "İçeriği görüntüle", "lists.account.add": "Listeye ekle", "lists.account.remove": "Listeden kaldır", "lists.delete": "Listeyi sil", @@ -266,9 +266,9 @@ "lists.edit.submit": "Başlığı değiştir", "lists.new.create": "Liste ekle", "lists.new.title_placeholder": "Yeni liste başlığı", - "lists.replies_policy.all_replies": "Takip edilen herhangi bir kullanıcı", - "lists.replies_policy.list_replies": "Listenin üyeleri", - "lists.replies_policy.no_replies": "Hiç kimse", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Yanıtları göster:", "lists.search": "Takip ettiğiniz kişiler arasından arayın", "lists.subheading": "Listeleriniz", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Bahsetmeler", "notifications.filter.polls": "Anket sonuçları", "notifications.filter.statuses": "Takip ettiğiniz kişilerden gelen güncellemeler", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} bildirim", "notifications.mark_as_read": "Her bildirimi okundu olarak işaretle", "notifications.permission_denied": "Daha önce reddedilen tarayıcı izinleri isteği nedeniyle masaüstü bildirimleri kullanılamıyor", "notifications.permission_denied_alert": "Tarayıcı izni daha önce reddedildiğinden, masaüstü bildirimleri etkinleştirilemez", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Masaüstü bildirimlerini etkinleştir", "notifications_permission_banner.how_to_control": "Mastodon açık olmadığında bildirim almak için masaüstü bildirimlerini etkinleştirin. Etkinleştirildikten sonra yukarıdaki {icon} düğmesini kullanarak hangi etkileşim türlerinin masaüstü bildirimleri oluşturduğunu tam olarak kontrol edebilirsiniz.", "notifications_permission_banner.title": "Hiçbir şeyi kaçırmayın", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json new file mode 100644 index 000000000..224c51301 --- /dev/null +++ b/app/javascript/mastodon/locales/tt.json @@ -0,0 +1,486 @@ +{ + "account.account_note_header": "Язма", + "account.add_or_remove_from_list": "Исемлеккә кертү я бетерү", + "account.badges.bot": "Бот", + "account.badges.group": "Төркем", + "account.block": "Block @{name}", + "account.block_domain": "Block domain {domain}", + "account.blocked": "Blocked", + "account.browse_more_on_origin_server": "Тулырак оригинал профилендә карап була", + "account.cancel_follow_request": "Cancel follow request", + "account.direct": "Direct message @{name}", + "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.domain_blocked": "Domain blocked", + "account.edit_profile": "Edit profile", + "account.enable_notifications": "Notify me when @{name} posts", + "account.endorse": "Feature on profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", + "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", + "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", + "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.never_active": "Never", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unblock domain {domain}", + "account.unendorse": "Don't feature on profile", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "account_note.placeholder": "Click to add a note", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "announcement.announcement": "Announcement", + "autosuggest_hashtag.per_week": "{count} per week", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.bookmarks": "Bookmarks", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.directory": "Browse profiles", + "column.domain_blocks": "Blocked domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toot", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.local_only": "Local only", + "community.column_settings.media_only": "Media only", + "community.column_settings.remote_only": "Remote only", + "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.poll.add_option": "Add a choice", + "compose_form.poll.duration": "Poll duration", + "compose_form.poll.option_placeholder": "Choice {number}", + "compose_form.poll.remove_option": "Remove this choice", + "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices", + "compose_form.poll.switch_to_single": "Change poll to allow for a single choice", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}", + "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}", + "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", + "empty_column.account_timeline": "No toots here!", + "empty_column.account_unavailable": "Profile unavailable", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no blocked domains yet.", + "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", + "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", + "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", + "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", + "errors.unexpected_crash.report_issue": "Report issue", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", + "generic.saved": "Saved", + "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", + "getting_started.documentation": "Documentation", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "home.hide_announcements": "Hide announcements", + "home.show_announcements": "Show announcements", + "intervals.full.days": "{number, plural, one {# day} other {# days}}", + "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", + "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish toot-orial!", + "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.open_media": "to open media", + "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.spoilers": "to show/hide CW field", + "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.compress": "Compress image view box", + "lightbox.expand": "Expand image view box", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.edit.submit": "Change title", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", + "lists.replies_policy.title": "Show replies to:", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "load_pending": "{count, plural, one {# new item} other {# new items}}", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.duration": "Duration", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "mute_modal.indefinite": "Indefinite", + "navigation_bar.apps": "Mobile apps", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.bookmarks": "Bookmarks", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Favourites", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.info": "About this server", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.follow_request": "{name} has requested to follow you", + "notification.mention": "{name} mentioned you", + "notification.own_poll": "Your poll has ended", + "notification.poll": "A poll you have voted in has ended", + "notification.reblog": "{name} boosted your status", + "notification.status": "{name} just posted", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.follow_request": "New follow requests:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.poll": "Poll results:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.column_settings.status": "New toots:", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favourites", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", + "notifications.filter.polls": "Poll results", + "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", + "notifications.group": "{count} notifications", + "notifications.mark_as_read": "Mark every notification as read", + "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", + "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications_permission_banner.enable": "Enable desktop notifications", + "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", + "notifications_permission_banner.title": "Never miss a thing", + "picture_in_picture.restore": "Put it back", + "poll.closed": "Closed", + "poll.refresh": "Refresh", + "poll.total_people": "{count, plural, one {# person} other {# people}}", + "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.vote": "Vote", + "poll.voted": "You voted for this answer", + "poll_button.add_poll": "Add a poll", + "poll_button.remove_poll": "Remove poll", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Visible for mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Visible for followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Visible for all, shown in public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Visible for all, but not in public timelines", + "privacy.unlisted.short": "Unlisted", + "refresh": "Refresh", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "relative_time.today": "today", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Report {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", + "status.block": "Block @{name}", + "status.bookmark": "Bookmark", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", + "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.filtered": "Filtered", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.read_more": "Read more", + "status.reblog": "Boost", + "status.reblog_private": "Boost with original visibility", + "status.reblogged_by": "{name} boosted", + "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.redraft": "Delete & re-draft", + "status.remove_bookmark": "Remove bookmark", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "time_remaining.days": "{number, plural, one {# day} other {# days}} left", + "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", + "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", + "time_remaining.moments": "Moments remaining", + "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", + "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", + "timeline_hint.resources.followers": "Followers", + "timeline_hint.resources.follows": "Follows", + "timeline_hint.resources.statuses": "Older toots", + "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", + "trends.trending_now": "Trending now", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "units.short.billion": "{count}B", + "units.short.million": "{count}M", + "units.short.thousand": "{count}K", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add images, a video or an audio file", + "upload_error.limit": "File upload limit exceeded.", + "upload_error.poll": "File upload not allowed with polls.", + "upload_form.audio_description": "Describe for people with hearing loss", + "upload_form.description": "Describe for the visually impaired", + "upload_form.edit": "Edit", + "upload_form.thumbnail": "Change thumbnail", + "upload_form.undo": "Delete", + "upload_form.video_description": "Describe for people with hearing loss or visual impairment", + "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.apply": "Apply", + "upload_modal.choose_image": "Choose image", + "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.detect_text": "Detect text from picture", + "upload_modal.edit_media": "Edit media", + "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.preview_label": "Preview ({ratio})", + "upload_progress.label": "Uploading…", + "video.close": "Close video", + "video.download": "Download file", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 17ffe5519..70f6ab152 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index dab23f448..941e43c99 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Результати пошуку", "emoji_button.symbols": "Символи", "emoji_button.travel": "Подорожі", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Тут дмухалок немає!", "empty_column.account_unavailable": "Профіль недоступний", "empty_column.blocks": "Ви ще не заблокували жодного користувача.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Далі", "lightbox.previous": "Назад", - "lightbox.view_context": "Переглянути контекст", "lists.account.add": "Додати до списку", "lists.account.remove": "Видалити зі списку", "lists.delete": "Видалити список", @@ -266,9 +266,9 @@ "lists.edit.submit": "Змінити назву", "lists.new.create": "Додати список", "lists.new.title_placeholder": "Нова назва списку", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Шукати серед людей, на яких ви підписані", "lists.subheading": "Ваші списки", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Згадки", "notifications.filter.polls": "Результати опитування", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} сповіщень", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 3260a33cd..aaccf1d83 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "یہاں کوئی نوٹس نہیں ہیں!", "empty_column.account_unavailable": "مشخص دستیاب نہیں ہے", "empty_column.blocks": "آپ نے ابھی کسی صارف کو مسدود نہیں کیا ہے.", @@ -258,7 +259,6 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -266,9 +266,9 @@ "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "Your lists", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 3da7cf375..005ed9923 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -6,12 +6,12 @@ "account.block": "Chặn @{name}", "account.block_domain": "Ẩn mọi thứ từ {domain}", "account.blocked": "Đã chặn", - "account.browse_more_on_origin_server": "Tìm những tài khoản có liên quan", + "account.browse_more_on_origin_server": "Truy cập trang của người này", "account.cancel_follow_request": "Hủy yêu cầu theo dõi", "account.direct": "Nhắn tin @{name}", "account.disable_notifications": "Không thông báo khi @{name} đăng tút", - "account.domain_blocked": "Đã chặn người dùng", - "account.edit_profile": "Giới thiệu bản thân", + "account.domain_blocked": "Người đã chặn", + "account.edit_profile": "Chỉnh sửa trang cá nhân", "account.enable_notifications": "Thông báo khi @{name} đăng tút", "account.endorse": "Vinh danh người này", "account.follow": "Theo dõi", @@ -19,7 +19,7 @@ "account.followers.empty": "Chưa có người theo dõi nào.", "account.followers_counter": "{count, plural, one {{counter} Người theo dõi} other {{counter} Người theo dõi}}", "account.following_counter": "{count, plural, one {{counter} Theo dõi} other {{counter} Theo dõi}}", - "account.follows.empty": "Người dùng này chưa theo dõi ai.", + "account.follows.empty": "Người này chưa theo dõi ai.", "account.follows_you": "Đang theo dõi bạn", "account.hide_reblogs": "Ẩn chia sẻ từ @{name}", "account.last_status": "Online", @@ -38,7 +38,7 @@ "account.requested": "Đang chờ chấp thuận. Nhấp vào đây để hủy yêu cầu theo dõi", "account.share": "Chia sẻ hồ sơ @{name}", "account.show_reblogs": "Hiện chia sẻ từ @{name}", - "account.statuses_counter": "{count, plural, other {{counter} Tút}}", + "account.statuses_counter": "{count, plural, one {{counter} Tút} other {{counter} Tút}}", "account.unblock": "Bỏ chặn @{name}", "account.unblock_domain": "Bỏ ẩn {domain}", "account.unendorse": "Ngưng vinh danh người này", @@ -59,17 +59,17 @@ "bundle_modal_error.close": "Đóng", "bundle_modal_error.message": "Đã có lỗi xảy ra trong khi tải nội dung này.", "bundle_modal_error.retry": "Thử lại", - "column.blocks": "Người dùng đã chặn", - "column.bookmarks": "Để dành đọc lại", + "column.blocks": "Người đã chặn", + "column.bookmarks": "Đã lưu", "column.community": "Máy chủ của bạn", - "column.direct": "Tin nhắn của bạn", + "column.direct": "Tin nhắn", "column.directory": "Tìm người cùng sở thích", "column.domain_blocks": "Máy chủ đã chặn", - "column.favourites": "Lượt thích của bạn", + "column.favourites": "Lượt thích", "column.follow_requests": "Yêu cầu theo dõi", "column.home": "Bảng tin", "column.lists": "Danh sách", - "column.mutes": "Người dùng đã ẩn", + "column.mutes": "Người đã ẩn", "column.notifications": "Thông báo", "column.pins": "Tút ghim", "column.public": "Mạng liên hợp", @@ -98,7 +98,7 @@ "compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn", "compose_form.publish": "Tút", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Nội dung nhạy cảm", + "compose_form.sensitive.hide": "{count, plural, one {Nội dung là nhạy cảm} other {Nội dung là nhạy cảm}}", "compose_form.sensitive.marked": "{count, plural, one {Nội dung đã đánh dấu là nhạy cảm} other {Nội dung đã đánh dấu là nhạy cảm}}", "compose_form.sensitive.unmarked": "{count, plural, one {Nội dung này bình thường} other {Nội dung này bình thường}}", "compose_form.spoiler.marked": "Hủy nội dung ẩn", @@ -149,6 +149,7 @@ "emoji_button.search_results": "Kết quả tìm kiếm", "emoji_button.symbols": "Biểu tượng", "emoji_button.travel": "Du lịch", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Chưa có tút nào!", "empty_column.account_unavailable": "Tài khoản bị đình chỉ", "empty_column.blocks": "Bạn chưa chặn bất cứ ai.", @@ -164,9 +165,9 @@ "empty_column.home.public_timeline": "tút công khai", "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 người dùng 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 tin cho một ai đó.", - "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi người dùng khác", + "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ữ.", "error.unexpected_crash.next_steps": "Hãy thử làm mới trang. Nếu vẫn không được, bạn hãy vào Mastodon bằng một ứng dụng di động hoặc trình duyệt khác.", @@ -178,7 +179,7 @@ "follow_requests.unlocked_explanation": "Mặc dù tài khoản của bạn đang ở chế độ công khai, quản trị viên của {domain} vẫn tin rằng bạn sẽ muốn xem lại yêu cầu theo dõi từ những người khác.", "generic.saved": "Đã lưu", "getting_started.developers": "Nhà phát triển", - "getting_started.directory": "Kết bạn", + "getting_started.directory": "Cộng đồng", "getting_started.documentation": "Tài liệu", "getting_started.heading": "Quản lý", "getting_started.invite": "Mời bạn bè", @@ -220,7 +221,7 @@ "introduction.welcome.headline": "Hướng dẫn người mới", "introduction.welcome.text": "Chào mừng bạn đến mạng xã hội liên hợp! Tại đây bạn có thể đăng tải nội dung và trao đổi với bạn bè của mình trên các máy chủ khác nhau. Máy chủ {domain} là nơi lưu trữ trang cá nhân của bạn.", "keyboard_shortcuts.back": "trở lại", - "keyboard_shortcuts.blocked": "mở danh sách người dùng đã chặn", + "keyboard_shortcuts.blocked": "mở danh sách người đã chặn", "keyboard_shortcuts.boost": "chia sẻ", "keyboard_shortcuts.column": "mở các mục", "keyboard_shortcuts.compose": "mở khung soạn tút", @@ -236,8 +237,8 @@ "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", - "keyboard_shortcuts.mention": "nhắc đến người dùng", - "keyboard_shortcuts.muted": "mở danh sách người dùng đã ẩn", + "keyboard_shortcuts.mention": "nhắc đến ai đó", + "keyboard_shortcuts.muted": "mở danh sách người đã ẩn", "keyboard_shortcuts.my_profile": "mở trang cá nhân của bạn", "keyboard_shortcuts.notifications": "mở mục thông báo", "keyboard_shortcuts.open_media": "mở ảnh hoặc video", @@ -254,11 +255,10 @@ "keyboard_shortcuts.unfocus": "đưa con trỏ ra khỏi ô soạn thảo hoặc ô tìm kiếm", "keyboard_shortcuts.up": "di chuyển lên trên danh sách", "lightbox.close": "Đóng", - "lightbox.compress": "Thu gọn khung hình", - "lightbox.expand": "Mở rộng khung hình", + "lightbox.compress": "Thu nhỏ hình", + "lightbox.expand": "Phóng to hình", "lightbox.next": "Tiếp", "lightbox.previous": "Trước", - "lightbox.view_context": "Xem nội dung", "lists.account.add": "Thêm vào danh sách", "lists.account.remove": "Xóa khỏi danh sách", "lists.delete": "Xóa danh sách", @@ -266,9 +266,9 @@ "lists.edit.submit": "Thay đổi tiêu đề", "lists.new.create": "Tạo danh sách mới", "lists.new.title_placeholder": "Tên danh sách mới", - "lists.replies_policy.all_replies": "Bất cứ người dùng nào đã theo dõi", - "lists.replies_policy.list_replies": "Thành viên trong danh sách", - "lists.replies_policy.no_replies": "Tắt bình luận", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Cho phép bình luận với:", "lists.search": "Tìm kiếm những người mà bạn quan tâm", "lists.subheading": "Danh sách của bạn", @@ -278,17 +278,17 @@ "missing_indicator.label": "Không tìm thấy", "missing_indicator.sublabel": "Nội dung này không còn tồn tại", "mute_modal.duration": "Thời hạn", - "mute_modal.hide_notifications": "Ẩn thông báo từ người dùng này?", + "mute_modal.hide_notifications": "Ẩn thông báo từ người này?", "mute_modal.indefinite": "Vĩnh viễn", "navigation_bar.apps": "Apps", - "navigation_bar.blocks": "Người dùng đã chặn", + "navigation_bar.blocks": "Người đã chặn", "navigation_bar.bookmarks": "Đã lưu", "navigation_bar.community_timeline": "Cộng đồng", "navigation_bar.compose": "Viết tút mới", "navigation_bar.direct": "Tin nhắn", "navigation_bar.discover": "Khám phá", "navigation_bar.domain_blocks": "Máy chủ đã ẩn", - "navigation_bar.edit_profile": "Giới thiệu bản thân", + "navigation_bar.edit_profile": "Trang cá nhân", "navigation_bar.favourites": "Lượt thích", "navigation_bar.filters": "Bộ lọc từ ngữ", "navigation_bar.follow_requests": "Yêu cầu theo dõi", @@ -297,7 +297,7 @@ "navigation_bar.keyboard_shortcuts": "Phím tắt", "navigation_bar.lists": "Danh sách", "navigation_bar.logout": "Đăng xuất", - "navigation_bar.mutes": "Người dùng đã ẩn", + "navigation_bar.mutes": "Người đã ẩn", "navigation_bar.personal": "Cá nhân", "navigation_bar.pins": "Tút ghim", "navigation_bar.preferences": "Cài đặt", @@ -307,8 +307,8 @@ "notification.follow": "{name} theo dõi bạn", "notification.follow_request": "{name} yêu cầu theo dõi bạn", "notification.mention": "{name} nhắc đến bạn", - "notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc", - "notification.poll": "Một cuộc bình chọn mà bạn tham gia đã kết thúc", + "notification.own_poll": "Cuộc bình chọn bạn tạo đã kết thúc", + "notification.poll": "Cuộc bình chọn của bạn đã kết thúc", "notification.reblog": "{name} chia sẻ tút của bạn", "notification.status": "{name} vừa đăng", "notifications.clear": "Xóa hết thông báo", @@ -321,7 +321,7 @@ "notifications.column_settings.follow": "Người theo dõi mới:", "notifications.column_settings.follow_request": "Yêu cầu theo dõi mới:", "notifications.column_settings.mention": "Lượt nhắc đến:", - "notifications.column_settings.poll": "Kết quả bình chọn:", + "notifications.column_settings.poll": "Kết quả:", "notifications.column_settings.push": "Thông báo đẩy", "notifications.column_settings.reblog": "Lượt chia sẻ mới:", "notifications.column_settings.show": "Thông báo trên thanh menu", @@ -334,44 +334,46 @@ "notifications.filter.mentions": "Lượt nhắc đến", "notifications.filter.polls": "Kết quả bình chọn", "notifications.filter.statuses": "Cập nhật từ những người bạn theo dõi", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} thông báo", "notifications.mark_as_read": "Đánh dấu tất cả thông báo là đã đọc", "notifications.permission_denied": "Trình duyệt không cho phép hiển thị thông báo trên màn hình.", "notifications.permission_denied_alert": "Không thể bật thông báo trên màn hình bởi vì trình duyệt đã cấm trước đó", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Cho phép thông báo trên màn hình", "notifications_permission_banner.how_to_control": "Hãy bật thông báo trên màn hình để không bỏ lỡ những thông báo từ Mastodon. Một khi đã bật, bạn có thể lựa chọn từng loại thông báo khác nhau thông qua {icon} nút bên dưới.", "notifications_permission_banner.title": "Không bỏ lỡ điều thú vị nào", "picture_in_picture.restore": "Hiển thị bình thường", "poll.closed": "Kết thúc", "poll.refresh": "Làm mới", - "poll.total_people": "{count, plural, one {# người bình chọn} other {# người bình chọn}}", - "poll.total_votes": "{count, plural, one {# bình chọn} other {# bình chọn}}", - "poll.vote": "Khảo sát", - "poll.voted": "Bạn đã bình chọn câu trả lời này", - "poll_button.add_poll": "Tạo cuộc bình chọn", + "poll.total_people": "{count, plural, one {# người} other {# người}}", + "poll.total_votes": "{count, plural, one {# người} other {# người}}", + "poll.vote": "Bình chọn", + "poll.voted": "Bạn đã bình chọn rồi", + "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.direct.long": "Chỉ người được nhắc đến mới thấy", "privacy.direct.short": "Tin nhắn", "privacy.private.long": "Chỉ dành cho người theo dõi", - "privacy.private.short": "Chỉ người theo dõi", + "privacy.private.short": "Người theo dõi", "privacy.public.long": "Hiện trên bảng tin máy chủ", "privacy.public.short": "Công khai", - "privacy.unlisted.long": "Công khai nhưng không hiện trên bảng tin máy chủ", - "privacy.unlisted.short": "Mở", + "privacy.unlisted.long": "Không hiện trên bảng tin máy chủ", + "privacy.unlisted.short": "Riêng 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!", "relative_time.days": "{number} ngày", "relative_time.hours": "{number}h", - "relative_time.just_now": "vừa xong", + "relative_time.just_now": "mới", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hôm nay", "reply_indicator.cancel": "Hủy bỏ", "report.forward": "Chuyển đến {target}", - "report.forward_hint": "Người dùng này ở máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?", - "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo người dùng này:", + "report.forward_hint": "Người này thuộc máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?", + "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo người này:", "report.placeholder": "Bổ sung thêm", "report.submit": "Gửi đi", "report.target": "Báo cáo {target}", @@ -380,12 +382,12 @@ "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút mà bạn đã viết, thích, chia sẻ hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "tút", - "search_popout.tips.text": "Nội dung trả về là địa chỉ người dùng, tên hiển thị và hashtag", + "search_popout.tips.text": "Nội dung trả về là tên người dùng, tên hiển thị và hashtag", "search_popout.tips.user": "người dùng", "search_results.accounts": "Người dùng", "search_results.hashtags": "Hashtags", "search_results.statuses": "Tút", - "search_results.statuses_fts_disabled": "Máy chủ của bạn không bật chức năng tìm kiếm tút.", + "search_results.statuses_fts_disabled": "Máy chủ của bạn không bật tính năng tìm kiếm tút.", "search_results.total": "{count, number} {count, plural, one {kết quả} other {kết quả}}", "status.admin_account": "Mở giao diện quản trị @{name}", "status.admin_status": "Mở tút này trong giao diện quản trị", @@ -409,7 +411,7 @@ "status.open": "Xem nguyên văn", "status.pin": "Ghim lên trang cá nhân", "status.pinned": "Tút đã ghim", - "status.read_more": "Đọc thêm tút", + "status.read_more": "Đọc tiếp", "status.reblog": "Chia sẻ", "status.reblog_private": "Chia sẻ với người có thể xem", "status.reblogged_by": "{name} chia sẻ", @@ -425,7 +427,7 @@ "status.show_less_all": "Thu gọn toàn bộ", "status.show_more": "Mở rộng", "status.show_more_all": "Hiển thị tất cả", - "status.show_thread": "Xem thêm", + "status.show_thread": "Liên quan", "status.uncached_media_warning": "Giới hạn", "status.unmute_conversation": "Quan tâm", "status.unpin": "Bỏ ghim trên trang cá nhân", @@ -454,7 +456,7 @@ "upload_area.title": "Kéo và thả để tải lên", "upload_button.label": "Thêm media (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Tập tin tải lên vượt quá giới hạn cho phép.", - "upload_error.poll": "Cuộc bình chọn không cho phép đính kèm tập tin.", + "upload_error.poll": "Không cho phép đính kèm tập tin.", "upload_form.audio_description": "Mô tả cho người mất thính giác", "upload_form.description": "Mô tả cho người khiếm thị", "upload_form.edit": "Biên tập", diff --git a/app/javascript/mastodon/locales/whitelist_tt.json b/app/javascript/mastodon/locales/whitelist_tt.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_tt.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index e79399ea1..e2c69c116 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -4,23 +4,23 @@ "account.badges.bot": "ⴰⴱⵓⵜ", "account.badges.group": "ⵜⴰⵔⴰⴱⴱⵓⵜ", "account.block": "ⴳⴷⵍ @{name}", - "account.block_domain": "Block domain {domain}", + "account.block_domain": "ⴳⴷⵍ ⵉⴳⵔ {domain}", "account.blocked": "ⵉⵜⵜⵓⴳⴷⵍ", - "account.browse_more_on_origin_server": "Browse more on the original profile", + "account.browse_more_on_origin_server": "ⵙⵜⴰⵔⴰ ⵓⴳⴳⴰⵔ ⴳ ⵉⴼⵔⵙ ⴰⵏⵚⵍⵉ", "account.cancel_follow_request": "ⵙⵔ ⵜⵓⵜⵔⴰ ⵏ ⵓⴹⴼⵕ", - "account.direct": "Direct message @{name}", + "account.direct": "ⵜⵓⵣⵉⵏⵜ ⵜⵓⵙⵔⵉⴷⵜ @{name}", "account.disable_notifications": "Stop notifying me when @{name} posts", - "account.domain_blocked": "Domain blocked", + "account.domain_blocked": "ⵉⵜⵜⵓⴳⴷⵍ ⵉⴳⵔ", "account.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ", "account.enable_notifications": "Notify me when @{name} posts", "account.endorse": "Feature on profile", "account.follow": "ⴹⴼⵕ", - "account.followers": "Followers", + "account.followers": "ⵉⵎⴹⴼⴰⵕⵏ", "account.followers.empty": "No one follows this user yet.", "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", "account.follows.empty": "This user doesn't follow anyone yet.", - "account.follows_you": "Follows you", + "account.follows_you": "ⴹⴼⵕⵏ ⴽⵯⵏ", "account.hide_reblogs": "Hide boosts from @{name}", "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", @@ -31,18 +31,18 @@ "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", - "account.never_active": "Never", + "account.never_active": "ⵓⵙⴰⵔ", "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.report": "Report @{name}", "account.requested": "Awaiting approval", - "account.share": "Share @{name}'s profile", + "account.share": "ⴱⴹⵓ ⵉⴼⵔⵙ ⵏ @{name}", "account.show_reblogs": "Show boosts from @{name}", "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unblock domain {domain}", "account.unendorse": "Don't feature on profile", - "account.unfollow": "Unfollow", + "account.unfollow": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", "account_note.placeholder": "Click to add a note", @@ -51,21 +51,21 @@ "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "announcement.announcement": "Announcement", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} ⵙ ⵉⵎⴰⵍⴰⵙⵙ", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", + "bundle_column_error.retry": "ⴰⵍⵙ ⴰⵔⵎ", + "bundle_column_error.title": "ⴰⵣⴳⴰⵍ ⵏ ⵓⵥⵟⵟⴰ", "bundle_modal_error.close": "ⵔⴳⵍ", "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", + "bundle_modal_error.retry": "ⴰⵍⵙ ⴰⵔⵎ", + "column.blocks": "ⵉⵏⵙⵙⵎⵔⵙⵏ ⵜⵜⵓⴳⴷⵍⵏⵉⵏ", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", - "column.favourites": "Favourites", + "column.favourites": "ⵜⵓⴼⵓⵜⵉⵏ", "column.follow_requests": "Follow requests", "column.home": "ⴰⵙⵏⵓⴱⴳ", "column.lists": "ⵜⵉⵍⴳⴰⵎⵉⵏ", @@ -73,26 +73,26 @@ "column.notifications": "ⵜⵉⵏⵖⵎⵉⵙⵉⵏ", "column.pins": "Pinned toot", "column.public": "Federated timeline", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", + "column_back_button.label": "ⴰⵖⵓⵍ", + "column_header.hide_settings": "ⵙⵏⵜⵍ ⵜⵉⵙⵖⴰⵍ", "column_header.moveLeft_settings": "Move column to the left", "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", + "column_header.pin": "ⵖⵏⵙ", + "column_header.show_settings": "ⵙⵎⴰⵍ ⵜⵉⵙⵖⴰⵍ", + "column_header.unpin": "ⴽⴽⵙ ⴰⵖⵏⴰⵙ", "column_subheading.settings": "ⵜⵉⵙⵖⴰⵍ", - "community.column_settings.local_only": "Local only", - "community.column_settings.media_only": "Media only", + "community.column_settings.local_only": "ⵖⴰⵙ ⴰⴷⵖⴰⵔⴰⵏ", + "community.column_settings.media_only": "ⵖⴰⵙ ⵉⵙⵏⵖⵎⵉⵙⵏ", "community.column_settings.remote_only": "Remote only", "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.direct_message_warning_learn_more": "ⵙⵙⵏ ⵓⴳⴳⴰⵔ", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", + "compose_form.placeholder": "ⵎⴰⵢⴷ ⵉⵍⵍⴰⵏ ⴳ ⵉⵅⴼ ⵏⵏⴽ?", "compose_form.poll.add_option": "Add a choice", "compose_form.poll.duration": "Poll duration", - "compose_form.poll.option_placeholder": "Choice {number}", + "compose_form.poll.option_placeholder": "ⴰⵙⵜⵜⴰⵢ {number}", "compose_form.poll.remove_option": "Remove this choice", "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices", "compose_form.poll.switch_to_single": "Change poll to allow for a single choice", @@ -106,29 +106,29 @@ "compose_form.spoiler_placeholder": "Write your warning here", "confirmation_modal.cancel": "ⵙⵔ", "confirmations.block.block_and_report": "Block & Report", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.block.confirm": "ⴳⴷⵍ", + "confirmations.block.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴳⴷⵍⴷ {name}?", "confirmations.delete.confirm": "ⴽⴽⵙ", - "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⵜⴰⵥⵕⵉⴳⵜ ⴰ?", "confirmations.delete_list.confirm": "ⴽⴽⵙ", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", - "confirmations.mute.confirm": "Mute", + "confirmations.logout.confirm": "ⴼⴼⵖ", + "confirmations.logout.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴼⴼⵖⴷ?", + "confirmations.mute.confirm": "ⵥⵥⵉⵥⵏ", "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.reply.confirm": "ⵔⴰⵔ", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "conversation.delete": "Delete conversation", + "confirmations.unfollow.confirm": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ", + "confirmations.unfollow.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⴰⴹⴼⴼⵓⵕ ⵉ {name}?", + "conversation.delete": "ⴽⴽⵙ ⴰⵎⵙⴰⵡⴰⵍ", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.with": "ⴰⴽⴷ {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", @@ -141,14 +141,15 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "ⵓⵍⴰ ⵉⵎⵓⵊⵉ!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objects", - "emoji_button.people": "People", + "emoji_button.people": "ⵎⵉⴷⴷⵏ", "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", + "emoji_button.search": "ⵔⵣⵓ...", "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", + "emoji_button.symbols": "ⵜⵉⵎⴰⵜⴰⵔⵉⵏ", "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", @@ -185,11 +186,11 @@ "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵎⵉⴹⴰⵏ", "getting_started.terms": "Terms of service", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.all": "ⴷ {additional}", + "hashtag.column_header.tag_mode.any": "ⵏⵖ {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", "hashtag.column_settings.select.no_options_message": "No suggestions found", - "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.select.placeholder": "ⵙⴽⵛⵎ ⴰⵀⴰⵛⵟⴰⴳ…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -199,15 +200,15 @@ "home.column_settings.show_replies": "Show replies", "home.hide_announcements": "Hide announcements", "home.show_announcements": "Show announcements", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", + "intervals.full.days": "{number, plural, one {# ⵡⴰⵙⵙ} other {# ⵡⵓⵙⵙⴰⵏ}}", "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "intervals.full.minutes": "{number, plural, one {# ⵜⵓⵙⴷⵉⴷⵜ} other {# ⵜⵓⵙⴷⵉⴷⵉⵏ}}", "introduction.federation.action": "Next", "introduction.federation.federated.headline": "Federated", "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", "introduction.federation.home.headline": "ⴰⵙⵏⵓⴱⴳ", "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", - "introduction.federation.local.headline": "Local", + "introduction.federation.local.headline": "ⴰⴷⵖⴰⵔⴰⵏ", "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", "introduction.interactions.action": "Finish toot-orial!", "introduction.interactions.favourite.headline": "Favourite", @@ -258,23 +259,22 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", - "lightbox.view_context": "View context", "lists.account.add": "ⵔⵏⵓ ⵖⵔ ⵜⵍⴳⴰⵎⵜ", "lists.account.remove": "ⴽⴽⵙ ⵙⴳ ⵜⵍⴳⴰⵎⵜ", "lists.delete": "ⴽⴽⵙ ⵜⴰⵍⴳⴰⵎⵜ", - "lists.edit": "Edit list", - "lists.edit.submit": "Change title", - "lists.new.create": "Add list", - "lists.new.title_placeholder": "New list title", - "lists.replies_policy.all_replies": "Any followed user", - "lists.replies_policy.list_replies": "Members of the list", - "lists.replies_policy.no_replies": "No one", + "lists.edit": "ⵙⵏⴼⵍ ⵜⴰⵍⴳⴰⵎⵜ", + "lists.edit.submit": "ⵙⵏⴼⵍ ⴰⵣⵡⵍ", + "lists.new.create": "ⵙⴽⵔ ⵜⴰⵍⴳⴰⵎⵜ", + "lists.new.title_placeholder": "ⴰⵣⵡⵍ ⵏ ⵜⵍⴳⴰⵎⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "load_pending": "{count, plural, one {# new item} other {# new items}}", - "loading_indicator.label": "Loading...", - "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}", + "lists.subheading": "ⵜⵉⵍⴳⴰⵎⵉⵏ ⵏⵏⴽ", + "load_pending": "{count, plural, one {# ⵓⴼⵔⴷⵉⵙ ⴰⵎⴰⵢⵏⵓ} other {# ⵉⴼⵔⴷⴰⵙ ⵉⵎⴰⵢⵏⵓⵜⵏ}}", + "loading_indicator.label": "ⴰⵣⴷⴰⵎ...", + "media_gallery.toggle_visible": "ⴼⴼⵔ {number, plural, one {ⵜⴰⵡⵍⴰⴼⵜ} other {ⵜⵉⵡⵍⴰⴼⵉⵏ}}", "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", "mute_modal.duration": "Duration", @@ -296,7 +296,7 @@ "navigation_bar.info": "About this server", "navigation_bar.keyboard_shortcuts": "Hotkeys", "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", + "navigation_bar.logout": "ⴼⴼⵖ", "navigation_bar.mutes": "Muted users", "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", @@ -325,26 +325,28 @@ "notifications.column_settings.push": "Push notifications", "notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", + "notifications.column_settings.sound": "ⵖⵔ ⵉⵎⵙⵍⵉ", "notifications.column_settings.status": "New toots:", - "notifications.filter.all": "All", + "notifications.filter.all": "ⴰⴽⴽⵯ", "notifications.filter.boosts": "Boosts", "notifications.filter.favourites": "Favourites", "notifications.filter.follows": "Follows", "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", "notifications.filter.statuses": "Updates from people you follow", - "notifications.group": "{count} notifications", + "notifications.grant_permission": "Grant permission.", + "notifications.group": "{count} ⵜⵏⵖⵎⵉⵙⵉⵏ", "notifications.mark_as_read": "Mark every notification as read", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", "picture_in_picture.restore": "Put it back", - "poll.closed": "Closed", + "poll.closed": "ⵉⵜⵜⵓⵔⴳⵍ", "poll.refresh": "Refresh", - "poll.total_people": "{count, plural, one {# person} other {# people}}", + "poll.total_people": "{count, plural, one {# ⵓⴼⴳⴰⵏ} other {# ⵉⴼⴳⴰⵏⵏ}}", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", "poll.voted": "You voted for this answer", @@ -352,24 +354,24 @@ "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", "privacy.direct.long": "Visible for mentioned users only", - "privacy.direct.short": "Direct", + "privacy.direct.short": "ⵜⵓⵔⴷⵉⵜ", "privacy.private.long": "Visible for followers only", "privacy.private.short": "Followers-only", "privacy.public.long": "Visible for all, shown in public timelines", - "privacy.public.short": "Public", + "privacy.public.short": "ⵜⴰⴳⴷⵓⴷⴰⵏⵜ", "privacy.unlisted.long": "Visible for all, but not in public timelines", "privacy.unlisted.short": "Unlisted", "refresh": "Refresh", "regeneration_indicator.label": "ⴰⵣⴷⴰⵎ…", "regeneration_indicator.sublabel": "Your home feed is being prepared!", - "relative_time.days": "{number}d", - "relative_time.hours": "{number}h", + "relative_time.days": "{number}ⴰⵙ", + "relative_time.hours": "{number}ⵙⵔⴳ", "relative_time.just_now": "ⴷⵖⵉ", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", - "relative_time.today": "today", - "reply_indicator.cancel": "Cancel", - "report.forward": "Forward to {target}", + "relative_time.minutes": "{number}ⵙⴷ", + "relative_time.seconds": "{number}ⵙⵏ", + "relative_time.today": "ⴰⵙⵙⴰ", + "reply_indicator.cancel": "ⵙⵔ", + "report.forward": "ⵙⵙⵉⴼⴹ ⵉ {target}", "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", "report.placeholder": "Additional comments", @@ -382,30 +384,30 @@ "search_popout.tips.status": "status", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.hashtags": "Hashtags", + "search_results.accounts": "ⵎⵉⴷⴷⵏ", + "search_results.hashtags": "ⵀⴰⵛⵟⴰⴳ", "search_results.statuses": "Toots", "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "status.admin_account": "Open moderation interface for @{name}", "status.admin_status": "Open this status in the moderation interface", - "status.block": "Block @{name}", + "status.block": "ⴳⴷⵍ @{name}", "status.bookmark": "Bookmark", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.copy": "Copy link to status", "status.delete": "ⴽⴽⵙ", "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", + "status.direct": "ⵜⵓⵣⵉⵏⵜ ⵜⵓⵙⵔⵉⴷⵜ ⵉ @{name}", "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", - "status.load_more": "Load more", + "status.load_more": "ⵙⵙⵉⵍⵉ ⵓⴳⴳⴰⵔ", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", - "status.mute_conversation": "Mute conversation", + "status.more": "ⵓⴳⴳⴰⵔ", + "status.mute": "ⵥⵥⵉⵥⵏ @{name}", + "status.mute_conversation": "ⵥⵥⵉⵥⵏ ⴰⵎⵙⴰⵡⴰⵍ", "status.open": "Expand this status", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", @@ -420,11 +422,11 @@ "status.replyAll": "Reply to thread", "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_less": "Show less", - "status.show_less_all": "Show less for all", - "status.show_more": "Show more", - "status.show_more_all": "Show more for all", + "status.share": "ⴱⴹⵓ", + "status.show_less": "ⵙⵎⴰⵍ ⴷⵔⵓⵙ", + "status.show_less_all": "ⵙⵎⴰⵍ ⴷⵔⵓⵙ ⵉ ⵎⴰⵕⵕⴰ", + "status.show_more": "ⵙⵎⴰⵍ ⵓⴳⴳⴰⵔ", + "status.show_more_all": "ⵙⵎⴰⵍ ⵓⴳⴳⴰⵔ ⵉ ⵎⴰⵕⵕⴰ", "status.show_thread": "Show thread", "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", @@ -433,16 +435,16 @@ "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "ⴰⵙⵏⵓⴱⴳ", - "tabs_bar.local_timeline": "Local", + "tabs_bar.local_timeline": "ⴰⴷⵖⴰⵔⴰⵏ", "tabs_bar.notifications": "ⵜⵉⵏⵖⵎⵉⵙⵉⵏ", "tabs_bar.search": "ⵔⵣⵓ", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", + "time_remaining.days": "{number, plural, one {# ⵡⴰⵙⵙ} other {# ⵡⵓⵙⵙⴰⵏ}} ⵉⵇⵇⵉⵎⵏ", "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", - "timeline_hint.resources.followers": "Followers", + "timeline_hint.resources.followers": "ⵉⵎⴹⴼⴰⵕⵏ", "timeline_hint.resources.follows": "Follows", "timeline_hint.resources.statuses": "Older toots", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", @@ -479,6 +481,6 @@ "video.hide": "Hide video", "video.mute": "Mute sound", "video.pause": "Pause", - "video.play": "Play", + "video.play": "ⵖⵔ", "video.unmute": "Unmute sound" } diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 956067e6f..f6af15198 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -149,6 +149,7 @@ "emoji_button.search_results": "搜索结果", "emoji_button.symbols": "符号", "emoji_button.travel": "旅行和地点", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "这里没有嘟文!", "empty_column.account_unavailable": "个人资料不可用", "empty_column.blocks": "你目前没有屏蔽任何用户。", @@ -258,7 +259,6 @@ "lightbox.expand": "放大查看图片", "lightbox.next": "下一个", "lightbox.previous": "上一个", - "lightbox.view_context": "查看上下文", "lists.account.add": "添加到列表", "lists.account.remove": "从列表中移除", "lists.delete": "删除列表", @@ -266,9 +266,9 @@ "lists.edit.submit": "更改标题", "lists.new.create": "新建列表", "lists.new.title_placeholder": "新列表的标题", - "lists.replies_policy.all_replies": "任何关注的用户", - "lists.replies_policy.list_replies": "列表成员", - "lists.replies_policy.no_replies": "没有人", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "显示回复给:", "lists.search": "搜索你关注的人", "lists.subheading": "你的列表", @@ -334,10 +334,12 @@ "notifications.filter.mentions": "提及", "notifications.filter.polls": "投票结果", "notifications.filter.statuses": "你关注的人的动态", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} 条通知", "notifications.mark_as_read": "将所有通知标为已读", "notifications.permission_denied": "由于权限被拒绝,无法启用桌面通知。", "notifications.permission_denied_alert": "由于在此之前浏览器权限请求就已被拒绝,所以启用桌面通知失败", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "启用桌面通知", "notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。您可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。", "notifications_permission_banner.title": "精彩不容错过", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 832e2a6a0..9aa3e37bb 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -4,27 +4,27 @@ "account.badges.bot": "機械人", "account.badges.group": "群組", "account.block": "封鎖 @{name}", - "account.block_domain": "隱藏來自 {domain} 的一切文章", - "account.blocked": "封鎖", - "account.browse_more_on_origin_server": "在該服務器的個人檔案頁上瀏覽更多", + "account.block_domain": "封鎖來自 {domain} 的一切文章", + "account.blocked": "已封鎖", + "account.browse_more_on_origin_server": "瀏覽原服務站上的個人資料頁", "account.cancel_follow_request": "取消關注請求", "account.direct": "私訊 @{name}", "account.disable_notifications": "如果 @{name} 發文請不要再通知我", - "account.domain_blocked": "服務站被隱藏", + "account.domain_blocked": "服務站被封鎖", "account.edit_profile": "修改個人資料", "account.enable_notifications": "如果 @{name} 發文請通知我", - "account.endorse": "在個人資料推薦對方", - "account.follow": "關注", - "account.followers": "關注的人", - "account.followers.empty": "尚沒有人關注這位使用者。", - "account.followers_counter": "被 {count, plural,one {{counter} 人}other {{counter} 人}}關注", + "account.endorse": "在個人資料頁推薦對方", + "account.follow": "正在關注", + "account.followers": "關注者", + "account.followers.empty": "尚未有人關注這位使用者。", + "account.followers_counter": "有 {count, plural,one {{counter} 個} other {{counter} 個}}關注者", "account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}", - "account.follows.empty": "這位使用者尚未關注任何使用者。", + "account.follows.empty": "這位使用者尚未關注任何人。", "account.follows_you": "關注你", "account.hide_reblogs": "隱藏 @{name} 的轉推", "account.last_status": "上次活躍時間", "account.link_verified_on": "此連結的所有權已在 {date} 檢查過", - "account.locked_info": "此用戶的私隱狀態為不公開,關注請求需經過該用戶的審核。", + "account.locked_info": "這位使用者將私隱設定為「不公開」,會手動審批誰能關注他/她。", "account.media": "媒體", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已經遷移到:", @@ -38,15 +38,15 @@ "account.requested": "等候審批", "account.share": "分享 @{name} 的個人資料", "account.show_reblogs": "顯示 @{name} 的推文", - "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文", + "account.statuses_counter": "{count, plural,one {{counter} 篇}other {{counter} 篇}}文章", "account.unblock": "解除對 @{name} 的封鎖", - "account.unblock_domain": "不再隱藏 {domain}", + "account.unblock_domain": "解除對域名 {domain} 的封鎖", "account.unendorse": "不再於個人資料頁面推薦對方", "account.unfollow": "取消關注", "account.unmute": "取消 @{name} 的靜音", "account.unmute_notifications": "取消來自 @{name} 通知的靜音", "account_note.placeholder": "按此添加備注", - "alert.rate_limited.message": "請在 {retry_time, time, medium} 過後重試", + "alert.rate_limited.message": "請在 {retry_time, time, medium} 後重試", "alert.rate_limited.title": "已限速", "alert.unexpected.message": "發生不可預期的錯誤。", "alert.unexpected.title": "噢!", @@ -59,12 +59,12 @@ "bundle_modal_error.close": "關閉", "bundle_modal_error.message": "加載本組件出錯。", "bundle_modal_error.retry": "重試", - "column.blocks": "封鎖用戶", + "column.blocks": "封鎖名單", "column.bookmarks": "書籤", "column.community": "本站時間軸", "column.direct": "個人訊息", "column.directory": "瀏覽個人資料", - "column.domain_blocks": "隱藏的服務站", + "column.domain_blocks": "封鎖的服務站", "column.favourites": "最愛的文章", "column.follow_requests": "關注請求", "column.home": "主頁", @@ -77,25 +77,25 @@ "column_header.hide_settings": "隱藏設定", "column_header.moveLeft_settings": "將欄左移", "column_header.moveRight_settings": "將欄右移", - "column_header.pin": "固定", + "column_header.pin": "置頂", "column_header.show_settings": "顯示設定", - "column_header.unpin": "取下", + "column_header.unpin": "取消置頂", "column_subheading.settings": "設定", "community.column_settings.local_only": "只顯示本站", - "community.column_settings.media_only": "僅媒體", + "community.column_settings.media_only": "只顯示多媒體", "community.column_settings.remote_only": "只顯示外站", - "compose_form.direct_message_warning": "這文章只有被提及的用戶才可以看到。", + "compose_form.direct_message_warning": "這文章只有被提及的使用者才可以看到。", "compose_form.direct_message_warning_learn_more": "了解更多", "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。", - "compose_form.lock_disclaimer": "你的用戶狀態為「{locked}」,任何人都能立即關注你,然後看到「只有關注者能看」的文章。", - "compose_form.lock_disclaimer.lock": "公共", + "compose_form.lock_disclaimer": "你的用戶狀態沒有{locked},任何人都能立即關注你,然後看到「只有關注者能看」的文章。", + "compose_form.lock_disclaimer.lock": "鎖定", "compose_form.placeholder": "你在想甚麼?", "compose_form.poll.add_option": "新增選擇", "compose_form.poll.duration": "投票期限", "compose_form.poll.option_placeholder": "第 {number} 個選擇", "compose_form.poll.remove_option": "移除此選擇", "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項", - "compose_form.poll.switch_to_single": "變更投票為允許單一選項", + "compose_form.poll.switch_to_single": "變更投票為限定單一選項", "compose_form.publish": "發文", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.hide": "標記媒體為敏感內容", @@ -112,8 +112,8 @@ "confirmations.delete.message": "你確定要刪除這文章嗎?", "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", - "confirmations.domain_block.confirm": "隱藏整個網站", - "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。你從此將不會再看到該站的內容和通知。來自該站的關注者亦會被移除。", + "confirmations.domain_block.confirm": "封鎖整個網站", + "confirmations.domain_block.message": "你真的真的確定要封鎖整個 {domain} ?多數情況下,封鎖或靜音幾個特定目標就已經有效,也是比較建議的做法。若然封鎖全站,你將不會再在這裏看到該站的內容和通知。來自該站的關注者亦會被移除。", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", "confirmations.mute.confirm": "靜音", @@ -129,9 +129,9 @@ "conversation.mark_as_read": "標為已讀", "conversation.open": "檢視對話", "conversation.with": "與 {names}", - "directory.federated": "來自已知聯邦宇宙", + "directory.federated": "來自已知的聯盟網絡", "directory.local": "僅來自 {domain}", - "directory.new_arrivals": "新貨", + "directory.new_arrivals": "新內容", "directory.recently_active": "最近活躍", "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", "embed.preview": "看上去會是這樣:", @@ -141,7 +141,7 @@ "emoji_button.food": "飲飲食食", "emoji_button.label": "加入表情符號", "emoji_button.nature": "自然", - "emoji_button.not_found": "沒有表情符號!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "沒找到表情符號!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "物品", "emoji_button.people": "人物", "emoji_button.recent": "常用", @@ -149,6 +149,7 @@ "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊景物", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "這裡還沒有嘟文!", "empty_column.account_unavailable": "無法取得個人資料", "empty_column.blocks": "你還沒有封鎖任何使用者。", @@ -156,11 +157,11 @@ "empty_column.community": "本站時間軸暫時未有內容,快寫一點東西來搶頭香啊!", "empty_column.direct": "你沒有個人訊息。當你發出或接收個人訊息,就會在這裡出現。", "empty_column.domain_blocks": "尚未隱藏任何網域。", - "empty_column.favourited_statuses": "你還沒收藏任何嘟文。這裡將會顯示你收藏的嘟文。", - "empty_column.favourites": "還沒有人收藏這則嘟文。這裡將會顯示被收藏的嘟文。", + "empty_column.favourited_statuses": "你還沒收藏任何文章。這裡將會顯示你收藏的嘟文。", + "empty_column.favourites": "還沒有人收藏這則文章。這裡將會顯示被收藏的嘟文。", "empty_column.follow_requests": "您尚未收到任何關注請求。這裡將會顯示收到的關注請求。", "empty_column.hashtag": "這個標籤暫時未有內容。", - "empty_column.home": "你還沒有關注任何用戶。快看看{public},向其他用戶搭訕吧。", + "empty_column.home": "你還沒有關注任何使用者。快看看{public},向其他使用者搭訕吧。", "empty_column.home.public_timeline": "公共時間軸", "empty_column.list": "這個列表暫時未有內容。", "empty_column.lists": "你還沒有建立任何名單。這裡將會顯示你所建立的名單。", @@ -171,7 +172,7 @@ "error.unexpected_crash.explanation_addons": "此頁面無法被正確顯示,這可能是由於瀏覽器的附加元件或網頁自動翻譯工具造成的。", "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。", "error.unexpected_crash.next_steps_addons": "請嘗試停止使用這些附加元件然後重新載入頁面。如果問題沒有解決,你仍然可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。", - "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿", + "errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿", "errors.unexpected_crash.report_issue": "舉報問題", "follow_request.authorize": "批准", "follow_request.reject": "拒絕", @@ -182,8 +183,8 @@ "getting_started.documentation": "文件", "getting_started.heading": "開始使用", "getting_started.invite": "邀請使用者", - "getting_started.open_source_notice": "Mastodon(萬象)是一個開放源碼的軟件。你可以在官方 GitHub ({github}) 貢獻或者回報問題。", - "getting_started.security": "帳戶安全", + "getting_started.open_source_notice": "Mastodon(萬象)是一個開放源碼的軟件。你可以在官方 GitHub {github} 貢獻或者回報問題。", + "getting_started.security": "帳戶設定", "getting_started.terms": "服務條款", "hashtag.column_header.tag_mode.all": "以及{additional}", "hashtag.column_header.tag_mode.any": "或是{additional}", @@ -193,7 +194,7 @@ "hashtag.column_settings.tag_mode.all": "全部", "hashtag.column_settings.tag_mode.any": "任一", "hashtag.column_settings.tag_mode.none": "全不", - "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.column_settings.tag_toggle": "在這欄位加入額外的標籤", "home.column_settings.basic": "基本", "home.column_settings.show_reblogs": "顯示被轉推的文章", "home.column_settings.show_replies": "顯示回應文章", @@ -203,24 +204,24 @@ "intervals.full.hours": "{number, plural, one {# 小時} other {# 小時}}", "intervals.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}", "introduction.federation.action": "下一步", - "introduction.federation.federated.headline": "站台聯盟", - "introduction.federation.federated.text": "來自聯盟宇宙中其他站台的公開嘟文將會在站點聯盟時間軸中顯示。", + "introduction.federation.federated.headline": "已知服務站", + "introduction.federation.federated.text": "來自社交聯盟其他網站的公開文章,將會顯示在站點跨站時間軸上。", "introduction.federation.home.headline": "首頁", - "introduction.federation.home.text": "你關注使用者的嘟文將會在首頁動態中顯示。你可以關注任何伺服器上的任何人!", - "introduction.federation.local.headline": "本機", - "introduction.federation.local.text": "跟您同伺服器之使用者所發的公開嘟文將會顯示在本機時間軸中。", - "introduction.interactions.action": "Finish toot-orial!", - "introduction.interactions.favourite.headline": "關注", - "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者收藏嘟文,讓作者知道您喜歡這則嘟文。", - "introduction.interactions.reblog.headline": "轉嘟", - "introduction.interactions.reblog.text": "您能藉由轉嘟他人嘟文來分享給您的關注者。", + "introduction.federation.home.text": "你所關注使用者的文章,將會在首頁動態中顯示。你可以關注任何伺服器上的任何人!", + "introduction.federation.local.headline": "本站", + "introduction.federation.local.text": "與你共用一個服務站使用者的公開文章,將會顯示在本站時間軸中。", + "introduction.interactions.action": "完成使用教學", + "introduction.interactions.favourite.headline": "最愛", + "introduction.interactions.favourite.text": "你能用將文章加入「最愛的文章」,一方便把儲存文章稍候觀看,也同時對作者表示支持。", + "introduction.interactions.reblog.headline": "轉推", + "introduction.interactions.reblog.text": "你可以透過「轉推文章」把文章分享給你的關注者。", "introduction.interactions.reply.headline": "回覆", - "introduction.interactions.reply.text": "您能回覆其他人或自己的嘟文,這麼做會把這些回覆串成一串對話。", + "introduction.interactions.reply.text": "你可以回覆其他人或自己的文章,這麼做會把這些回覆串成一串對話。", "introduction.welcome.action": "開始旅程吧!", "introduction.welcome.headline": "第一步", - "introduction.welcome.text": "歡迎來到聯盟宇宙!等等你就可以廣播訊息及跨越各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},非常特別 - 它寄管了你的個人資料,所以請記住它的名字。", - "keyboard_shortcuts.back": "後退", - "keyboard_shortcuts.blocked": "開啟「封鎖使用者」名單", + "introduction.welcome.text": "歡迎來到聯盟社交網絡 (fediverse)!稍後你就可以廣播訊息,同時與多個服務站的不同朋友聊天。但留意 {domain} 這個服務站非常特別——它託管了你的個人資料啊!所以請記住它。", + "keyboard_shortcuts.back": "返回", + "keyboard_shortcuts.blocked": "開啟封鎖名單", "keyboard_shortcuts.boost": "轉推", "keyboard_shortcuts.column": "把標示移動到其中一列", "keyboard_shortcuts.compose": "把標示移動到文字輸入區", @@ -228,20 +229,20 @@ "keyboard_shortcuts.direct": "開啟私訊欄", "keyboard_shortcuts.down": "在列表往下移動", "keyboard_shortcuts.enter": "打開文章", - "keyboard_shortcuts.favourite": "收藏", - "keyboard_shortcuts.favourites": "開啟收藏名單", - "keyboard_shortcuts.federated": "開啟站點聯盟時間軸", + "keyboard_shortcuts.favourite": "收藏文章", + "keyboard_shortcuts.favourites": "開啟最愛的內容", + "keyboard_shortcuts.federated": "打開跨站時間軸", "keyboard_shortcuts.heading": "鍵盤快速鍵", - "keyboard_shortcuts.home": "開啟首頁時間軸", + "keyboard_shortcuts.home": "開啟個人時間軸", "keyboard_shortcuts.hotkey": "快速鍵", "keyboard_shortcuts.legend": "顯示這個說明", - "keyboard_shortcuts.local": "開啟本機時間軸", + "keyboard_shortcuts.local": "開啟本站時間軸", "keyboard_shortcuts.mention": "提及作者", - "keyboard_shortcuts.muted": "開啟靜音使用者名單", + "keyboard_shortcuts.muted": "開啟靜音名單", "keyboard_shortcuts.my_profile": "開啟個人資料頁面", "keyboard_shortcuts.notifications": "開啟通知欄", "keyboard_shortcuts.open_media": "開啟媒體", - "keyboard_shortcuts.pinned": "開啟釘選的嘟文名單", + "keyboard_shortcuts.pinned": "開啟釘選的文章清單", "keyboard_shortcuts.profile": "開啟作者的個人資料頁面", "keyboard_shortcuts.reply": "回覆", "keyboard_shortcuts.requests": "開啟關注請求名單", @@ -250,7 +251,7 @@ "keyboard_shortcuts.start": "開啟「開始使用」欄位", "keyboard_shortcuts.toggle_hidden": "顯示或隱藏被標為敏感的文字", "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體", - "keyboard_shortcuts.toot": "新的推文", + "keyboard_shortcuts.toot": "新的文章", "keyboard_shortcuts.unfocus": "把標示移離文字輸入和搜索", "keyboard_shortcuts.up": "在列表往上移動", "lightbox.close": "關閉", @@ -258,7 +259,6 @@ "lightbox.expand": "擴大檢視", "lightbox.next": "下一頁", "lightbox.previous": "上一頁", - "lightbox.view_context": "檢視內文", "lists.account.add": "新增到列表", "lists.account.remove": "從列表刪除", "lists.delete": "刪除列表", @@ -266,28 +266,28 @@ "lists.edit.submit": "變更標題", "lists.new.create": "新增列表", "lists.new.title_placeholder": "新列表標題", - "lists.replies_policy.all_replies": "任何關注的用戶", - "lists.replies_policy.list_replies": "列表中的用戶", - "lists.replies_policy.no_replies": "沒有人", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "顯示回應文章︰", - "lists.search": "從你關注的用戶中搜索", + "lists.search": "從你關注的人搜索", "lists.subheading": "列表", "load_pending": "{count, plural, other {# 個新項目}}", "loading_indicator.label": "載入中...", - "media_gallery.toggle_visible": "打開或關上", + "media_gallery.toggle_visible": "隱藏圖片", "missing_indicator.label": "找不到內容", "missing_indicator.sublabel": "無法找到內容", "mute_modal.duration": "時間", - "mute_modal.hide_notifications": "隱藏來自這用戶的通知嗎?", + "mute_modal.hide_notifications": "需要隱藏這使用者的通知嗎?", "mute_modal.indefinite": "沒期限", - "navigation_bar.apps": "封鎖的使用者", - "navigation_bar.blocks": "被你封鎖的用戶", + "navigation_bar.apps": "手機 App", + "navigation_bar.blocks": "封鎖名單", "navigation_bar.bookmarks": "書籤", "navigation_bar.community_timeline": "本站時間軸", - "navigation_bar.compose": "撰寫新嘟文", + "navigation_bar.compose": "撰寫新文章", "navigation_bar.direct": "個人訊息", "navigation_bar.discover": "探索", - "navigation_bar.domain_blocks": "隱藏的服務站", + "navigation_bar.domain_blocks": "封鎖的服務站", "navigation_bar.edit_profile": "修改個人資料", "navigation_bar.favourites": "最愛的內容", "navigation_bar.filters": "靜音詞彙", @@ -297,24 +297,24 @@ "navigation_bar.keyboard_shortcuts": "鍵盤快速鍵", "navigation_bar.lists": "列表", "navigation_bar.logout": "登出", - "navigation_bar.mutes": "被你靜音的用戶", + "navigation_bar.mutes": "靜音名單", "navigation_bar.personal": "個人", "navigation_bar.pins": "置頂文章", "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "跨站時間軸", "navigation_bar.security": "安全", - "notification.favourite": "{name} 收藏了你的文章", + "notification.favourite": "{name} 喜歡你的文章", "notification.follow": "{name} 開始關注你", "notification.follow_request": "{name} 要求關注你", "notification.mention": "{name} 提及你", - "notification.own_poll": "您的投票已結束", - "notification.poll": "您投過的投票已經結束", + "notification.own_poll": "你的投票已結束", + "notification.poll": "你參與過的一個投票已經結束", "notification.reblog": "{name} 轉推你的文章", - "notification.status": "{name} 剛剛發了嘟文", + "notification.status": "{name} 剛發表了文章", "notifications.clear": "清空通知紀錄", "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?", "notifications.column_settings.alert": "顯示桌面通知", - "notifications.column_settings.favourite": "收藏了你的文章:", + "notifications.column_settings.favourite": "你最愛的文章:", "notifications.column_settings.filter_bar.advanced": "顯示所有分類", "notifications.column_settings.filter_bar.category": "快速過濾欄", "notifications.column_settings.filter_bar.show": "顯示", @@ -328,32 +328,34 @@ "notifications.column_settings.sound": "播放音效", "notifications.column_settings.status": "新的文章", "notifications.filter.all": "全部", - "notifications.filter.boosts": "轉嘟", + "notifications.filter.boosts": "轉推", "notifications.filter.favourites": "最愛", "notifications.filter.follows": "關注的使用者", "notifications.filter.mentions": "提及", "notifications.filter.polls": "投票結果", "notifications.filter.statuses": "已關注的用戶的最新動態", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} 條通知", "notifications.mark_as_read": "標記所有通知為已讀", - "notifications.permission_denied": "瀏覽器的桌面通知權限設定為拒絕,因此不可以啟用桌面通知", - "notifications.permission_denied_alert": "瀏覽器的桌面通知權限設定為拒絕,因此不可以啟用桌面通知", + "notifications.permission_denied": "本站不能發送桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求", + "notifications.permission_denied_alert": "無法啟用桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "啟用桌面通知", - "notifications_permission_banner.how_to_control": "啟用桌面通知可以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確控制哪些類型的互動會產生桌面通知。", - "notifications_permission_banner.title": "不放過任何通知", + "notifications_permission_banner.how_to_control": "只要啟用桌面通知,便可在 Mastodon 網站沒有打開時收到通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確控制哪些類型的互動會產生桌面通知。", + "notifications_permission_banner.title": "不放過任何事情", "picture_in_picture.restore": "還原影片播放器", "poll.closed": "已關閉", "poll.refresh": "重新整理", - "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}", - "poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}", + "poll.total_people": "{count, plural, one {# 人投票} other {# 人投票}}", + "poll.total_votes": "{count, plural, one {# 票} other {# 票}}", "poll.vote": "投票", - "poll.voted": "你已對此問題投票", + "poll.voted": "你已投票給這答案", "poll_button.add_poll": "建立投票", "poll_button.remove_poll": "移除投票", "privacy.change": "調整私隱設定", - "privacy.direct.long": "只有提及的用戶能看到", + "privacy.direct.long": "只有提及的使用者能看到", "privacy.direct.short": "私人訊息", - "privacy.private.long": "只有關注你用戶能看到", + "privacy.private.long": "只有你的關注者能看到", "privacy.private.short": "關注者", "privacy.public.long": "在公共時間軸顯示", "privacy.public.short": "公共", @@ -362,11 +364,11 @@ "refresh": "重新整理", "regeneration_indicator.label": "載入中……", "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!", - "relative_time.days": "{number}日", - "relative_time.hours": "{number}小時", + "relative_time.days": "{number}日前", + "relative_time.hours": "{number}小時前", "relative_time.just_now": "剛剛", - "relative_time.minutes": "{number}分鐘", - "relative_time.seconds": "{number}秒", + "relative_time.minutes": "{number}分鐘前", + "relative_time.seconds": "{number}秒前", "relative_time.today": "今天", "reply_indicator.cancel": "取消", "report.forward": "轉寄到 {target}", @@ -377,28 +379,28 @@ "report.target": "舉報", "search.placeholder": "搜尋", "search_popout.search_format": "高級搜索格式", - "search_popout.tips.full_text": "輸入簡單的文字,搜索由你發放、收藏、轉推和提及你的文章,以及符合的用戶名稱,帳號名稱和標籤。", + "search_popout.tips.full_text": "輸入簡單的文字,搜索由你發放、收藏、轉推和提及你的文章,以及符合的使用者名稱,顯示名稱和標籤。", "search_popout.tips.hashtag": "標籤", "search_popout.tips.status": "文章", - "search_popout.tips.text": "輸入簡單的文字,搜索符合的用戶名稱,帳號名稱和標籤", - "search_popout.tips.user": "用戶", + "search_popout.tips.text": "輸入簡單的文字,搜索符合的顯示名稱、使用者名稱和標籤", + "search_popout.tips.user": "使用者", "search_results.accounts": "使用者", "search_results.hashtags": "標籤", "search_results.statuses": "文章", - "search_results.statuses_fts_disabled": "「依內容搜尋嘟文」未在此 Mastodon 伺服器啟用。", + "search_results.statuses_fts_disabled": "此 Mastodon 伺服器並未啟用「搜尋文章內章」功能。", "search_results.total": "{count, number} 項結果", "status.admin_account": "開啟 @{name} 的管理介面", - "status.admin_status": "在管理介面開啟此嘟文", + "status.admin_status": "在管理介面開啟這篇文章", "status.block": "封鎖 @{name}", "status.bookmark": "書籤", "status.cancel_reblog_private": "取消轉推", "status.cannot_reblog": "這篇文章無法被轉推", - "status.copy": "將連結複製到嘟文中", + "status.copy": "將連結複製到文章中", "status.delete": "刪除", - "status.detailed_status": "對話的詳細內容", + "status.detailed_status": "詳細對話內容", "status.direct": "私訊 @{name}", - "status.embed": "鑲嵌", - "status.favourite": "收藏", + "status.embed": "嵌入", + "status.favourite": "最愛", "status.filtered": "已過濾", "status.load_more": "載入更多", "status.media_hidden": "隱藏媒體內容", @@ -413,7 +415,7 @@ "status.reblog": "轉推", "status.reblog_private": "轉推到原讀者", "status.reblogged_by": "{name} 轉推", - "status.reblogs.empty": "還沒有人轉嘟。如果有,會顯示在這裡。", + "status.reblogs.empty": "還未有人轉推。有的話會顯示在這裡。", "status.redraft": "刪除並編輯", "status.remove_bookmark": "移除書籤", "status.reply": "回應", @@ -421,38 +423,38 @@ "status.report": "舉報 @{name}", "status.sensitive_warning": "敏感內容", "status.share": "分享", - "status.show_less": "減少顯示", - "status.show_less_all": "減少顯示這類文章", - "status.show_more": "顯示更多", - "status.show_more_all": "顯示更多這類文章", + "status.show_less": "收起", + "status.show_less_all": "全部收起", + "status.show_more": "展開", + "status.show_more_all": "全部展開", "status.show_thread": "顯示討論串", "status.uncached_media_warning": "無法使用", - "status.unmute_conversation": "解禁對話", + "status.unmute_conversation": "對話解除靜音", "status.unpin": "解除置頂", "suggestions.dismiss": "關閉建議", - "suggestions.header": "您可能對這些東西有興趣…", + "suggestions.header": "你可能對這些感興趣…", "tabs_bar.federated_timeline": "跨站", "tabs_bar.home": "主頁", "tabs_bar.local_timeline": "本站", "tabs_bar.notifications": "通知", "tabs_bar.search": "搜尋", - "time_remaining.days": "剩餘{number, plural, one {# 天數} other {# 天數}}", - "time_remaining.hours": "剩餘{number, plural, one {# 小時} other {# 小時}}", - "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}", + "time_remaining.days": "剩餘 {number, plural, one {# 天} other {# 天}}", + "time_remaining.hours": "剩餘 {number, plural, one {# 小時} other {# 小時}}", + "time_remaining.minutes": "剩餘 {number, plural, one {# 分鐘} other {# 分鐘}}", "time_remaining.moments": "剩餘時間", "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}", - "timeline_hint.remote_resource_not_displayed": "不會顯示來自其他服務器的 {resource}", + "timeline_hint.remote_resource_not_displayed": "不會顯示來自其他伺服器的 {resource}", "timeline_hint.resources.followers": "關注者", "timeline_hint.resources.follows": "關注中", - "timeline_hint.resources.statuses": "更早的嘟文", - "trends.counter_by_accounts": "{count, plural,one {{counter} 人}other {{counter} 人}}正在討論", - "trends.trending_now": "目前趨勢", + "timeline_hint.resources.statuses": "更早的文章", + "trends.counter_by_accounts": "{count, plural, one {{counter} 個人}other {{counter} 個人}}正在討論", + "trends.trending_now": "現在流行", "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。", "units.short.billion": "{count}B", "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "將檔案拖放至此上載", - "upload_button.label": "上載媒體檔案", + "upload_button.label": "加入圖片、影片或音訊檔", "upload_error.limit": "已達到檔案上傳限制。", "upload_error.poll": "不允許在投票上傳檔案。", "upload_form.audio_description": "簡單描述內容給聽障人士", @@ -464,7 +466,7 @@ "upload_modal.analyzing_picture": "正在分析圖片…", "upload_modal.apply": "套用", "upload_modal.choose_image": "選擇圖片", - "upload_modal.description_placeholder": "A quick brown fox 跳過那隻懶狗", + "upload_modal.description_placeholder": "一隻敏捷的狐狸,輕巧地跳過那隻懶洋洋的狗", "upload_modal.detect_text": "從圖片偵測文字", "upload_modal.edit_media": "編輯媒體", "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。", @@ -473,9 +475,9 @@ "upload_progress.label": "上載中……", "video.close": "關閉影片", "video.download": "下載檔案", - "video.exit_fullscreen": "退出全熒幕", + "video.exit_fullscreen": "退出全螢幕", "video.expand": "展開影片", - "video.fullscreen": "全熒幕", + "video.fullscreen": "全螢幕", "video.hide": "隱藏影片", "video.mute": "靜音", "video.pause": "暫停", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index a38a7c07a..46cfc4359 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -65,7 +65,7 @@ "column.direct": "私訊", "column.directory": "瀏覽個人資料", "column.domain_blocks": "隱藏的網域", - "column.favourites": "收藏", + "column.favourites": "讚美集", "column.follow_requests": "關注請求", "column.home": "主頁", "column.lists": "名單", @@ -120,7 +120,7 @@ "confirmations.mute.explanation": "這將會隱藏來自他們的貼文與通知,但是他們還是可以查閱你的貼文與關注你。", "confirmations.mute.message": "確定靜音 {name} ?", "confirmations.redraft.confirm": "刪除並重新編輯", - "confirmations.redraft.message": "確定刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及收藏,且回覆這則的嘟文將會變成獨立的嘟文。", + "confirmations.redraft.message": "確定刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及贊美,且回覆這則的嘟文將會變成獨立的嘟文。", "confirmations.reply.confirm": "回覆", "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?", "confirmations.unfollow.confirm": "取消關注", @@ -149,6 +149,7 @@ "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊與地點", + "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "這裡還沒有嘟文!", "empty_column.account_unavailable": "無法取得個人資料", "empty_column.blocks": "你還沒有封鎖任何使用者。", @@ -156,8 +157,8 @@ "empty_column.community": "本地時間軸是空的。快公開嘟些文搶頭香啊!", "empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。", "empty_column.domain_blocks": "尚未隱藏任何網域。", - "empty_column.favourited_statuses": "你還沒收藏任何嘟文。這裡將會顯示你收藏的嘟文。", - "empty_column.favourites": "還沒有人收藏這則嘟文。這裡將會顯示被收藏的嘟文。", + "empty_column.favourited_statuses": "你還沒讚美过任何嘟文。這裡將會顯示你讚美过的嘟文。", + "empty_column.favourites": "還沒人讚美這則嘟文。當有人點讚後,他們將於此列出。", "empty_column.follow_requests": "您尚未收到任何關注請求。這裡將會顯示收到的關注請求。", "empty_column.hashtag": "這個主題標籤下什麼也沒有。", "empty_column.home": "您的首頁時間軸是空的!前往 {public} 或使用搜尋功能來認識其他人。", @@ -210,8 +211,8 @@ "introduction.federation.local.headline": "本機", "introduction.federation.local.text": "跟您同伺服器之使用者所發的公開嘟文將會顯示在本機時間軸中。", "introduction.interactions.action": "完成教學!", - "introduction.interactions.favourite.headline": "關注", - "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者收藏嘟文,讓作者知道您喜歡這則嘟文。", + "introduction.interactions.favourite.headline": "讚美", + "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者讚美嘟文,讓作者知道您喜歡這則嘟文。", "introduction.interactions.reblog.headline": "轉嘟", "introduction.interactions.reblog.text": "您能藉由轉嘟他人嘟文來分享給您的關注者。", "introduction.interactions.reply.headline": "回覆", @@ -228,8 +229,8 @@ "keyboard_shortcuts.direct": "開啟私訊欄", "keyboard_shortcuts.down": "往下移動名單項目", "keyboard_shortcuts.enter": "檢視嘟文", - "keyboard_shortcuts.favourite": "收藏", - "keyboard_shortcuts.favourites": "開啟收藏名單", + "keyboard_shortcuts.favourite": "讚美", + "keyboard_shortcuts.favourites": "開啟讚美者名錄", "keyboard_shortcuts.federated": "開啟站點聯盟時間軸", "keyboard_shortcuts.heading": "鍵盤快速鍵", "keyboard_shortcuts.home": "開啟首頁時間軸", @@ -258,7 +259,6 @@ "lightbox.expand": "展開圖片檢視框", "lightbox.next": "下一步", "lightbox.previous": "上一步", - "lightbox.view_context": "檢視內文", "lists.account.add": "新增至名單", "lists.account.remove": "從名單中移除", "lists.delete": "刪除名單", @@ -266,9 +266,9 @@ "lists.edit.submit": "變更標題", "lists.new.create": "新增名單", "lists.new.title_placeholder": "新名單標題", - "lists.replies_policy.all_replies": "任何跟隨的使用者", - "lists.replies_policy.list_replies": "列表成員", - "lists.replies_policy.no_replies": "沒有人", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", "lists.replies_policy.title": "顯示回覆", "lists.search": "搜尋您關注的使用者", "lists.subheading": "您的名單", @@ -289,7 +289,7 @@ "navigation_bar.discover": "探索", "navigation_bar.domain_blocks": "隱藏的網域", "navigation_bar.edit_profile": "編輯個人資料", - "navigation_bar.favourites": "收藏", + "navigation_bar.favourites": "讚美集", "navigation_bar.filters": "靜音詞彙", "navigation_bar.follow_requests": "關注請求", "navigation_bar.follows_and_followers": "關注及關注者", @@ -303,7 +303,7 @@ "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "聯邦時間軸", "navigation_bar.security": "安全性", - "notification.favourite": "{name} 把你的嘟文加入了最愛", + "notification.favourite": "{name} 讚美了你的嘟文", "notification.follow": "{name} 關注了你", "notification.follow_request": "{name} 要求關注你", "notification.mention": "{name} 提到了你", @@ -314,7 +314,7 @@ "notifications.clear": "清除通知", "notifications.clear_confirmation": "確定要永久清除你的通知嗎?", "notifications.column_settings.alert": "桌面通知", - "notifications.column_settings.favourite": "最愛:", + "notifications.column_settings.favourite": "被讚美:", "notifications.column_settings.filter_bar.advanced": "顯示所有分類", "notifications.column_settings.filter_bar.category": "快速過濾欄", "notifications.column_settings.filter_bar.show": "顯示", @@ -329,15 +329,17 @@ "notifications.column_settings.status": "新嘟文:", "notifications.filter.all": "全部", "notifications.filter.boosts": "轉嘟", - "notifications.filter.favourites": "最愛", + "notifications.filter.favourites": "讚美集", "notifications.filter.follows": "關注的使用者", "notifications.filter.mentions": "提及", "notifications.filter.polls": "投票結果", "notifications.filter.statuses": "已跟隨使用者的最新動態", + "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} 條通知", "notifications.mark_as_read": "將所有通知都標記為已讀", "notifications.permission_denied": "由於之前拒絕了瀏覽器請求,因此桌面通知不可用", "notifications.permission_denied_alert": "因為之前瀏覽器權限被拒絕,無法啟用桌面通知", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", "notifications_permission_banner.enable": "啟用桌面通知", "notifications_permission_banner.how_to_control": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。", "notifications_permission_banner.title": "不要錯過任何東西!", @@ -377,7 +379,7 @@ "report.target": "檢舉 {target}", "search.placeholder": "搜尋", "search_popout.search_format": "進階搜尋格式", - "search_popout.tips.full_text": "輸入簡單的文字,搜尋由你撰寫、最愛、轉嘟或提你的嘟文,以及符合使用者名稱、帳戶名稱和標籤。", + "search_popout.tips.full_text": "輸入簡單的文字,搜尋由你撰寫、贊美、轉嘟或提你的嘟文,以及與關鍵詞匹配的使用者名稱、帳戶名稱和標籤。", "search_popout.tips.hashtag": "主題標籤", "search_popout.tips.status": "嘟文", "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤", @@ -398,7 +400,7 @@ "status.detailed_status": "對話的詳細內容", "status.direct": "發送私訊給 @{name}", "status.embed": "嵌入", - "status.favourite": "最愛", + "status.favourite": "讚美", "status.filtered": "已過濾", "status.load_more": "載入更多", "status.media_hidden": "隱藏媒體內容", diff --git a/config/locales/activerecord.sc.yml b/config/locales/activerecord.sc.yml index 646737269..cae24d30c 100644 --- a/config/locales/activerecord.sc.yml +++ b/config/locales/activerecord.sc.yml @@ -4,3 +4,14 @@ sc: attributes: poll: expires_at: Iscadèntzia + options: Seberos + errors: + models: + account: + attributes: + username: + invalid: petzi lìteras, nùmeros e tratigheddos bassos + status: + attributes: + reblog: + taken: de s'istadu esistet giai diff --git a/config/locales/activerecord.tt.yml b/config/locales/activerecord.tt.yml new file mode 100644 index 000000000..5eab4abff --- /dev/null +++ b/config/locales/activerecord.tt.yml @@ -0,0 +1 @@ +tt: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 3de687ed6..fa49081be 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -60,6 +60,7 @@ ca: one: Seguidor other: Seguidors following: Seguint + instance_actor_flash: Aquest compte és un actor virtual usat per a representar el mateix servidor i no cap usuari individual. Es fa servir per a federar i no s'hauria d'esborrar. joined: Unit des de %{date} last_active: darrer actiu link_verified_on: La propietat d'aquest enllaç s'ha verificat el %{date} @@ -131,6 +132,7 @@ ca: follows: Segueix header: Capçalera inbox_url: URL de la safata d'entrada + invite_request_text: Motiu del registre invited_by: Convidat per ip: IP joined: Unit @@ -255,6 +257,7 @@ ca: unsuspend_account: Desfés la suspensió del compte update_announcement: Actualitza l'anunci update_custom_emoji: Actualitza l'emoji personalitzat + update_domain_block: Actualitza el Bloqueig de Domini update_status: Actualitza l'estat actions: assigned_to_self_report: "%{name} han assignat l'informe %{target} a ells mateixos" @@ -295,6 +298,7 @@ ca: unsuspend_account: "%{name} ha llevat la suspensió del compte de %{target}" update_announcement: "%{name} ha actualitzat l'anunci %{target}" update_custom_emoji: "%{name} ha actualitzat l'emoji %{target}" + update_domain_block: "%{name} ha actualitzat el bloqueig de domini per %{target}" update_status: "%{name} estat actualitzat per %{target}" deleted_status: "(tut esborrat)" empty: No s’han trobat registres. @@ -437,6 +441,7 @@ ca: instances: by_domain: Domini delivery_available: El lliurament està disponible + empty: No s'han trobat dominis. known_accounts: one: "%{count} compte conegut" other: "%{count} comptes coneguts" @@ -514,6 +519,8 @@ ca: comment: none: Cap created_at: Reportat + forwarded: Reenviat + forwarded_to: Reenviat a %{domain} mark_as_resolved: Marca com a resolt mark_as_unresolved: Marcar com a sense resoldre notes: @@ -583,6 +590,9 @@ ca: min_invite_role: disabled: Ningú title: Permet les invitacions de + require_invite_text: + desc_html: Quan el registre requereix aprovació manual, fer que sigui obligatori enlloc d'opcions l escriure el text de la solicitud d'invitació "Perquè vols unirte?" + title: Requerir als nous usuaris omplir el text de la solicitud d'invitació registrations_mode: modes: approved: Es requereix l’aprovació per registrar-se @@ -751,6 +761,7 @@ ca: functional: El teu compte és plenament operatiu. pending: La vostra sol·licitud està pendent de revisió pel nostre personal. Això pot trigar una mica. Rebreu un correu electrònic quan sigui aprovada. redirecting_to: El teu compte és inactiu perquè actualment està redirigint a %{acct}. + too_fast: Formulari enviat massa ràpid, torna a provar-ho. trouble_logging_in: Problemes per iniciar la sessió? use_security_key: Usa clau de seguretat authorize_follow: diff --git a/config/locales/co.yml b/config/locales/co.yml index 7cf6f2108..edb8ced1d 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -255,6 +255,7 @@ co: unsuspend_account: Ùn Suspende Più u Contu update_announcement: Cambià Annunziu update_custom_emoji: Cambià Emoji Persunalizata + update_domain_block: Mette à Ghjornu Blucchime di Duminiu update_status: Cambià Statutu actions: assigned_to_self_report: "%{name} s’hè assignatu u signalamentu %{target}" @@ -842,6 +843,7 @@ co: request: Dumandà u vostr’archiviu size: Pesu blocks: Bluccate + bookmarks: Segnalibri csv: CSV domain_blocks: Blucchime di duminiu lists: Liste @@ -918,6 +920,7 @@ co: success: I vostri dati sò stati impurtati è saranu trattati da quì à pocu types: blocking: Persone chì bluccate + bookmarks: Segnalibri domain_blocking: Lista di blucchimi di duminiu following: Persone chì seguitate muting: Persone chì piattate diff --git a/config/locales/de.yml b/config/locales/de.yml index 78c7c6f15..c2013ab8b 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -60,6 +60,7 @@ de: one: Folgender other: Folgende following: Folgt + instance_actor_flash: Dieses Konto ist ein virtueller Akteur, der den Server selbst repräsentiert und nicht ein einzelner Benutzer. Es wird für Föderationszwecke verwendet und sollte nicht gesperrt werden. joined: Beigetreten am %{date} last_active: zuletzt aktiv link_verified_on: Besitz des Links wurde überprüft am %{date} @@ -131,6 +132,7 @@ de: follows: Folgt header: Titelbild inbox_url: Posteingangs-URL + invite_request_text: Begründung für das beitreten invited_by: Eingeladen von ip: IP-Adresse joined: Beigetreten @@ -255,6 +257,7 @@ de: unsuspend_account: Konto nicht mehr sperren update_announcement: Ankündigung aktualisieren update_custom_emoji: Benutzerdefiniertes Emoji aktualisieren + update_domain_block: Domain Block aktualisieren update_status: Beitrag aktualisieren actions: assigned_to_self_report: "%{name} hat sich die Meldung %{target} selbst zugewiesen" @@ -295,6 +298,7 @@ de: unsuspend_account: "%{name} hat die Verbannung von %{target} aufgehoben" update_announcement: "%{name} aktualisierte Ankündigung %{target}" update_custom_emoji: "%{name} hat das %{target} Emoji geändert" + update_domain_block: "%{name} hat den Domain-Block für %{target} aktualisiert" update_status: "%{name} hat einen Beitrag von %{target} aktualisiert" deleted_status: "(gelöschter Beitrag)" empty: Keine Protokolle gefunden. @@ -437,6 +441,7 @@ de: instances: by_domain: Domain delivery_available: Zustellung funktioniert + empty: Keine Domains gefunden. known_accounts: one: "%{count} bekanntes Konto" other: "%{count} bekannte Konten" @@ -514,6 +519,8 @@ de: comment: none: Kein created_at: Gemeldet + forwarded: Weitergeleitet + forwarded_to: Weitergeleitet an %{domain} mark_as_resolved: Als gelöst markieren mark_as_unresolved: Als ungelöst markieren notes: @@ -583,6 +590,9 @@ de: min_invite_role: disabled: Niemand title: Einladungen erlauben von + require_invite_text: + desc_html: Wenn eine Registrierung manuell genehmigt werden muss, mache den "Warum möchtest du beitreten?" Text eher obligatorisch als optional + title: Neue Benutzer müssen einen Einladungstext ausfüllen registrations_mode: modes: approved: Zustimmung benötigt zur Registrierung @@ -751,6 +761,7 @@ de: functional: Dein Konto ist voll funktionsfähig. pending: Deine Bewerbung wird von unseren Mitarbeitern noch überprüft. Dies kann einige Zeit dauern. Du erhältst eine E-Mail, wenn deine Bewerbung genehmigt wurde. redirecting_to: Dein Konto ist inaktiv, da es derzeit zu %{acct} umgeleitet wird. + too_fast: Formular zu schnell gesendet, versuchen Sie es erneut. trouble_logging_in: Schwierigkeiten beim Anmelden? use_security_key: Sicherheitsschlüssel verwenden authorize_follow: diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml index 7b1aa3874..a60d2e88b 100644 --- a/config/locales/devise.hu.yml +++ b/config/locales/devise.hu.yml @@ -111,5 +111,5 @@ hu: not_found: nem található not_locked: nincs lezárva not_saved: - one: '1 hiba megakadályozta %{resource} mentését:' - other: "%{count} számú hiba megakadályozta %{resource} mentését:" + one: '1 hiba megakadályozta e %{resource} mentését:' + other: "%{count} hiba megakadályozta e %{resource} mentését:" diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index 3916d92b1..92cda21ef 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -82,8 +82,8 @@ ko: success: 성공적으로 %{kind} 계정을 인증 했습니다. passwords: no_token: 패스워드 재설정 이메일을 거치지 않고는 여기에 올 수 없습니다. 만약 패스워드 재설정 메일에서 온 것이라면 URL이 맞는지 확인해 주세요. - send_instructions: 당신의 이메일 주소가 우리의 DB에 있아면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요. - send_paranoid_instructions: 당신의 이메일 주소가 우리의 DB에 있아면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요. + send_instructions: 당신의 이메일 주소가 우리의 DB에 있다면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요. + send_paranoid_instructions: 당신의 이메일 주소가 우리의 DB에 있다면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요. updated: 패스워드가 재설정 되었습니다. 로그인 되었습니다. updated_not_active: 패스워드가 성공적으로 변경 되었습니다. registrations: diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index 3ab4d9f11..fadc48126 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -60,6 +60,23 @@ nl: title: Herstelcodes tweestapsverificatie veranderd unlock_instructions: subject: 'Mastodon: Instructies om opschorten account ongedaan te maken' + webauthn_credential: + added: + explanation: De volgende beveiligingssleutel is aan uw account toegevoegd + subject: 'Mastodon: Nieuwe beveiligingssleutel' + title: Een nieuwe beveiligingssleutel is toegevoegd + deleted: + explanation: De volgende beveiligingssleutel is uit jouw account verwijderd + subject: 'Mastodon: Beveiligingssleutel verwijderd' + title: Een van jouw beveiligingssleutels is verwijderd + webauthn_disabled: + explanation: Verificatie met beveiligingssleutels is uitgeschakeld voor jouw account. Inloggen is nu alleen mogelijk met het gebruik van een door een gepaarde TOTP-app genereerde sleutel. + subject: 'Mastodon: Verificatie met beveiligingssleutels is uitgeschakeld' + title: Beveiligingssleutels uitgeschakeld + webauthn_enabled: + explanation: Verificatie met beveiligingssleutels is ingeschakeld voor jouw account. Jouw beveiligingssleutel kan nu gebruikt worden om in te loggen. + subject: 'Mastodon: Verificatie met beveiligingssleutels is ingeschakeld' + title: Beveiligingssleutels ingeschakeld omniauth_callbacks: failure: Kon je niet inloggen met jouw %{kind} account, omdat "%{reason}". success: Succesvol met jouw %{kind} account ingelogd. diff --git a/config/locales/devise.sc.yml b/config/locales/devise.sc.yml index 91bd6d92f..0256c4674 100644 --- a/config/locales/devise.sc.yml +++ b/config/locales/devise.sc.yml @@ -1 +1,115 @@ +--- sc: + devise: + confirmations: + confirmed: S'indiritzu tuo de posta eletrònica est istadu cunfirmadu. + send_instructions: As a retzire unu messàgiu de posta eletrònica cun is istrutziones pro sa cunfirma de s'indiritzu de posta eletrònica tra pagos minutos. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica. + send_paranoid_instructions: Si s'indiritzu de posta eletrònica tuo esistit in sa base de datos nostra, as a retzire unu messàgiu de posta eletrònica cun is istrutziones pro sa cunfirma de s'indiritzu de posta eletrònica tra pagos minutos. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica. + failure: + already_authenticated: Ses giai intradu. + inactive: Su contu tuo no est ancora ativadu. + invalid: "%{authentication_keys} o crae de intrada non vàlida." + last_attempt: Tenes ancora un'àteru tentativu, in antis chi su contu tuo bèngiat blocadu. + locked: Su contu tuo est blocadu. + not_found_in_database: "%{authentication_keys} o crae de intrada non vàlida." + pending: Su contu tuo est ancora in revisione. + timeout: Sa sessione tua est iscadida. Torra·bi a intrare pro sighire. + unauthenticated: Tocat a ti autenticare o ti registrare prima de sighire. + unconfirmed: Deves cunfirmare s'indiritzu tuo de posta eletrònica prima de sighire. + mailer: + confirmation_instructions: + action: Verìfica s'indiritzu de posta eletrònica + action_with_app: Cunfirma e torra a %{app} + explanation: As creadu unu contu in %{host} cun custu indiritzu de posta eletrònica. T'ammancat unu clic pro s'ativatzione. Si non fias tue, non càrcules custu messàgiu de posta eletrònica. + explanation_when_pending: As pedidu un'invitu a %{host} cun custu indiritzu de posta eletrònica. Cunfirmadu s'indiritzu de posta eletrònica, amus a revisionare sa dimanda tua. Podes intrare pro cambiare is detàllios o cantzellare su contu tuo, ma non podes atzèdere a sa majoria de is funtziones finas a chi su contu tuo siat aprovadu. Si sa dimanda tua est refudada, is datos ant a èssere bogados, duncas no t'ant a pedire prus peruna atzione. Si non fias tue, non càrcules custu messàgiu de posta eletrònica. + extra_html: Verìfica puru is règulas de su server e is cunditziones de servìtziu nostras. + subject: 'Mastodon: Istrutziones de cunfirma pro %{instance}' + title: Verìfica s'indiritzu de posta eletrònica + email_changed: + explanation: 'Custu indiritzu de posta eletrònica pro su contu tuo est istadu mudadu a:' + extra: Si no as mudadu indiritzu de posta, forsis un'àtera persone at otentu s'atzessu de su contu tuo. Muda sa crae tua a sa lestra o chistiona cun s'amministratzione de su server si ses blocadu a foras dae su contu tuo. + subject: 'Mastodon: Indiritzu de posta mudadu' + title: Indiritzu de posta eletrònica nou + password_change: + explanation: Sa crae de su contu tuo est istada mudada. + extra: Si no as mudadu sa crae tua, forsis un'àtera persone at otentu s'atzessu de su contu tuo. Muda sa crae tua a sa lestra o chistiona cun s'amministratzione de su server si ses blocadu a foras dae su contu tuo. + subject: 'Mastodon: Crae mudada' + title: Crae mudada + reconfirmation_instructions: + explanation: Cunfirma s'indiritzu nou pro mudare s'indiritzu de posta eletrònica. + extra: Si custa muda no dd'as pedida tue, non càrcules custu messàgiu de posta eletrònica. Custu indiritzu de posta eletrònica pro su contu de Mastodon no at a mudare finas a s'atzessu tuo a su ligàmene in subra. + subject: 'Mastodon: Cunfirma indiritzu de posta eletrònica pro %{instance}' + title: Verìfica s'indiritzu de posta eletrònica + reset_password_instructions: + action: Muda sa crae + explanation: As pedidu una crae noa pro su contu tuo. + extra: Si no dd'as pedida tue, non càrcules custu messàgiu de posta eletrònica. Custa crae no at a mudare finas a s'atzessu tuo a su ligàmene in subra pro sa creatzione de una noa. + subject: 'Mastodon: Istrutziones pro resetare sa crae' + title: Crae resetada + two_factor_disabled: + explanation: S'autenticatzione a duos fatores est istada disativada pro su contu tuo. Immoe podes intrare impreende isceti indiritzu de posta eletrònica e crae. + subject: 'Mastodon: Autenticatzione a duos fatores disativada' + title: 2FA disativada + two_factor_enabled: + explanation: S'autenticatzione a duos fatores est istada ativada pro su contu tuo. Pro s'atzessu at èssere rechèdidu unu còdighe de autorizatzione generadu dae s'aplicatzione TOTP. + subject: 'Mastodon: Autenticatzione a duos fatores ativada' + title: 2FA ativada + two_factor_recovery_codes_changed: + explanation: Is còdighes de recùperu betzos sunt istados disativados e àteros noos generados. + subject: 'Mastodon: Còdighes de recùperu a duos fatores re-generados' + title: còdighes de recùperu 2FA mudados + unlock_instructions: + subject: 'Mastodon: Istrutziones pro s''isblocu' + webauthn_credential: + added: + explanation: Sa crae de seguresa chi sighit est istada agiunta a su contu tuo + subject: 'Mastodon: Crae de seguresa noa' + title: Est istada agiunta una crae de seguresa noa + deleted: + explanation: Sa crae de seguresa chi sighit est istada cantzellada dae su contu tuo + subject: 'Mastodon: Crae de seguresa cantzellada' + title: Una de is craes de seguresa tuas est istada cantzellada + webauthn_disabled: + explanation: S'autenticatzione cun craes de seguresa est istada disabilitada pro su contu tuo. S'intrada como est possìbile impreende isceti su getone ingendradu dae s'aplicatzione TOTP ligada. + subject: 'Mastodon: Autenticatzione cun craes de seguresa disabilitada' + title: Craes de seguresa disabilitadas + webauthn_enabled: + explanation: S'autenticatzione cun crae de seguresa est istada abilitada pro su contu tuo. Sa crae de seguresa tua como si podet èssere impreare pro intrare. + subject: 'Mastodon: Autenticatzione cun sa crae de seguresa ativada' + title: Craes de seguresa abilitadas + omniauth_callbacks: + failure: Autenticatzione dae %{kind} fallida, ca "%{reason}". + success: Autenticadu dae su contu de %{kind}. + passwords: + no_token: No podes intrare a custa pàgina chene passare dae unu messàgiu de posta eletrònica pro resetare sa crae. Si benes dae su messàgiu de posta pro resetare sa crae, faghe in modu de impreare s'URL intreu chi t'ant donadu. + send_instructions: Si s'indiritzu de posta eletrònica tuo esistit in sa base de datos nostra, as a retzire una unu ligàmene de recùperu de sa crae a s'indiritzu tuo de posta eletrònica tra pagos minutos. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica. + send_paranoid_instructions: Si s'indiritzu de posta eletrònica tuo esistit in sa base de datos nostra, as a retzire una unu ligàmene de recùperu de sa crae a s'indiritzu tuo de posta eletrònica tra pagos minutos. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica. + updated: Sa crae tua est istada mudada. Immoe ses intradu. + updated_not_active: Sa crae tua est istada mudada. + registrations: + destroyed: A si bìdere! Su contu tuo est istadu cantzelladu. Isperamus de ti torrare a bìdere chitzi. + signed_up: Registratzione curreta. Ti donamus sa benebènnida! + signed_up_but_inactive: Registratzione curreta. Mancari de aici, si no ti faghimus intrare est ca su contu tuo no est ancora ativu. + signed_up_but_locked: Registratzione curreta. Mancari de aici, si no ti faghimus intrare est ca su contu tuo est blocadu. + signed_up_but_pending: Unu ligàmene de cunfirma est istadu imbiadu a s'indiritzu tuo de posta eletrònica. A pustis chi incarcas in su ligàmene, amus a revisionare sa dimanda tua. Si aprovada, t'at a arribare una notìfica. + signed_up_but_unconfirmed: Unu ligàmene de cunfirma est istadu imbiadu a s'indiritzu tuo de posta eletrònica. Sighi su ligàmene pro ativare su contu tuo. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica. + update_needs_confirmation: Su contu tuo est istadu atualizadu, ma devimus verificare s'indiritzu tuo de posta eletrònica nou. Controlla sa posta eletrònica e sighi su ligàmene pro cunfirmare s'indiritzu nou de posta eletrònica. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica. + updated: Su contu tuo est istadu atualizadu. + sessions: + already_signed_out: Sessione serrada. + signed_in: Atzessu curretu. + signed_out: Sessione serrada. + unlocks: + send_instructions: As a retzire unu messàgiu de posta eletrònica cun is istrutziones pro isblocare su contu tuo tra pagos minutos. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica. + send_paranoid_instructions: Si su contu tuo esistit, as a retzire unu messàgiu de posta eletrònica cun istrutziones pro ddu isblocare tra pagos minutos. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica. + unlocked: Su contu tuo est istadu isblocadu. Intra pro sighire. + errors: + messages: + already_confirmed: fiat giai cunfirmadu, proa a intrare + confirmation_period_expired: tocat a ddu cunfirmare intro %{period}, pedi·nde unu nou + expired: est iscadidu, pedi·nde unu nou + not_found: no agatadu + not_locked: no fiat blocadu + not_saved: + one: '1 faddina at proibidu de sarvare custu %{resource}:' + other: "%{count} faddinas ant proibidu de sarvare %{resource}:" diff --git a/config/locales/devise.tt.yml b/config/locales/devise.tt.yml new file mode 100644 index 000000000..5eab4abff --- /dev/null +++ b/config/locales/devise.tt.yml @@ -0,0 +1 @@ +tt: diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml index c1914093a..b0a240bf8 100644 --- a/config/locales/devise.vi.yml +++ b/config/locales/devise.vi.yml @@ -21,7 +21,7 @@ vi: action: Xác thực địa chỉ email action_with_app: Xác nhận và quay lại %{app} explanation: Bạn đã tạo một tài khoản trên %{host} với địa chỉ email này. Chỉ cần một cú nhấp chuột nữa để kích hoạt nó. Nếu đây không phải là bạn, xin vui lòng bỏ qua email này. - explanation_when_pending: Bạn đã đăng ký %{host} với địa chỉ email này. Chúng tôi chỉ xem xét đơn đăng ký sau khi bạn xác thực địa chỉ email. Bạn có thể đăng nhập để thay đổi chi tiết hoặc xóa tài khoản của mình, nhưng bạn không thể truy cập hầu hết các chức năng cho đến khi tài khoản của bạn được chấp thuận. Nếu bạn bị từ chối, dữ liệu của bạn sẽ bị xóa, do đó bạn sẽ không cần phải thực hiện thêm hành động nào nữa. Nếu đây không phải là bạn, xin vui lòng bỏ qua email này. + explanation_when_pending: Bạn vừa đăng ký %{host} với địa chỉ email này. Chúng tôi chỉ xem xét đơn đăng ký sau khi bạn xác thực địa chỉ email. Bạn có thể đăng nhập để thay đổi chi tiết hoặc xóa tài khoản của mình, nhưng bạn không thể sử dụng đầy đủ tính năng cho đến khi tài khoản được xác thực. Nếu bạn bị từ chối, dữ liệu của bạn sẽ bị xóa, do đó bạn sẽ không cần phải làm gì thêm nữa. Nếu không phải do bạn đăng ký, xin vui lòng bỏ qua email này. extra_html: Xin đọc kỹ quy tắc máy chủchính sách riêng tư của chúng tôi. subject: 'Mastodon: Xác thực email cho %{instance}' title: Xác thực địa chỉ email @@ -79,7 +79,7 @@ vi: title: Đã kích hoạt khóa bảo mật omniauth_callbacks: failure: Không thể xác thực bạn từ %{kind} bởi vì "%{reason}". - success: Xác thực thành công từ tài khoản %{kind}. + success: Xác thực tài khoản %{kind} thành công. passwords: no_token: Bạn chỉ có thể truy cập trang này khi nhận được email phục hồi mật khẩu. Nếu vẫn không được, vui lòng chắc chắn rằng bạn đã dùng chính xác URL được cung cấp. send_instructions: Nếu địa chỉ email của bạn tồn tại trong cơ sở dữ liệu của chúng tôi, bạn sẽ nhận được liên kết khôi phục mật khẩu tại địa chỉ email của bạn sau vài phút. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này. @@ -87,7 +87,7 @@ vi: updated: Mật khẩu của bạn đã được thay đổi thành công. Hiện tại bạn đã đăng nhập. updated_not_active: Mật khẩu của bạn đã được thay đổi thành công. registrations: - destroyed: Tạm biệt! Tài khoản của bạn đã hủy thành công. Hi vọng chúng tôi sẽ sớm gặp lại bạn. + destroyed: Tạm biệt! Tài khoản của bạn đã bị hủy. Hi vọng chúng tôi sẽ sớm gặp lại bạn. signed_up: Chúc mừng! Bạn đã đăng ký thành công. signed_up_but_inactive: Bạn đã đăng ký thành công. Tuy nhiên, bạn cần phải kích hoạt tài khoản mới có thể đăng nhập. signed_up_but_locked: Bạn đã đăng ký thành công. Tuy nhiên, chúng tôi không thể đăng nhập cho bạn vì tài khoản của bạn bị khóa. @@ -96,9 +96,9 @@ vi: update_needs_confirmation: Bạn đã cập nhật tài khoản thành công, nhưng chúng tôi cần xác thực địa chỉ email mới của bạn. Vui lòng kiểm tra email và nhấp vào liên kết xác thực. Nếu bạn không thấy email, hãy kiểm tra trong thư rác. updated: Tài khoản của bạn đã được cập nhật thành công. sessions: - already_signed_out: Hoàn tất đăng xuất. + already_signed_out: Đã đăng xuất. signed_in: Đã đăng nhập thành công. - signed_out: Hoàn tất đăng xuất. + signed_out: Đã đăng xuất. unlocks: send_instructions: Bạn sẽ nhận được một email hướng dẫn về cách mở khóa tài khoản của bạn trong vài phút tới. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này. send_paranoid_instructions: Nếu tài khoản của bạn tồn tại, bạn sẽ nhận được email hướng dẫn cách mở khóa trong vài phút tới. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này. diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml index 073898d1e..2d9e8ddea 100644 --- a/config/locales/devise.zh-HK.yml +++ b/config/locales/devise.zh-HK.yml @@ -2,16 +2,16 @@ zh-HK: devise: confirmations: - confirmed: 你的電郵地址成功確認。 - send_instructions: 你將會在幾分鐘內收到確認指示電郵,上面有確認你電郵地址的指示。 - send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將會在幾分鐘內收到電郵,確認你電郵地址的指示。 + confirmed: 已確認你的電郵地址。 + send_instructions: 你將會在幾分鐘內收到確認指示電郵,上面有確認你電郵地址的指示。如果它沒有出現在你的收件箱,請檢查一下你的垃圾郵件箱。 + send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將會在幾分鐘內收到電郵,確認你電郵地址的指示。如果它沒有出現在你的收件箱,請檢查一下你的垃圾郵件箱。 failure: already_authenticated: 你之前已經登入了。 - inactive: 您的帳號尚未啟用。 - invalid: 不正確的 %{authentication_keys} 或密碼。 + inactive: 你的帳號尚未被啟用。 + invalid: 不正確的%{authentication_keys}或密碼。 last_attempt: 若你再一次嘗試失敗,我們將鎖定你的帳號,以策安全。 locked: 你的帳號已被鎖定。 - not_found_in_database: 不正確的 %{authentication_keys} 或密碼。 + not_found_in_database: 不正確的%{authentication_keys}或密碼。 pending: 你的帳號仍在審核中 timeout: 你的登入階段已經過期,請重新登入以繼續使用。 unauthenticated: 你必須先登入或登記,以繼續使用。 @@ -20,46 +20,46 @@ zh-HK: confirmation_instructions: action: 驗證電子郵件地址 action_with_app: 確認並回到%{app} - explanation: 你在 %{host} 上使用這個電子郵件地址建立了一個帳戶。只需點擊下面的連結,即可啟用帳戶。如果你並沒有建立過帳戶,請忽略此郵件。 - explanation_when_pending: 您使用此電郵地址申請了%{host} 帳戶。確認電郵地址後,我們將審核您的申請。您可以登錄更改詳細信息或刪除帳戶,但在帳戶獲得批准之前,您無法訪問大部份功能。如果您的申請被拒絕,您的數據會被刪除,因此您無需採取進一步的措施。如果申請人不是您,請忽略此電郵。 - extra_html: 請記得閱讀本服務站的相關規定使用條款。 + explanation: 你已成功用這個電郵在 %{host} 上建立了帳號。只需點擊下面的連結,即可啟用帳戶。如果你並沒有建立過帳戶,請忽略此郵件。 + explanation_when_pending: 你使用此電郵地址申請了%{host} 帳戶。確認電郵地址後,我們將審核你的申請。你可在登入後更改詳細信息,或刪除帳戶,但在帳戶獲得批准之前,你將無法使用大部份功能。如果你的申請被拒絕,你的資料會被直接刪除,而無需你採取任何動作。如果申請人不是你,請忽略此電郵。 + extra_html: 請閱讀站規我們的使用條款。 subject: 'Mastodon: 確認電郵地址 %{instance}' title: 驗證電子郵件地址 email_changed: - explanation: 你的帳戶的電子郵件地址即將變更為: - extra: 如果你沒有請求更改你的電子郵件地址,則他人很有可能已經入侵你的帳戶。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。 - subject: Mastodon:電子郵件地址已被更改 - title: 新電子郵件地址 + explanation: 你的帳號的電郵地址即將變更為: + extra: 如果你沒有更改你的電郵地址,那很有可能已經有其他人入侵你的帳號。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。 + subject: Mastodon:電郵地址已被更改 + title: 新電郵地址 password_change: - explanation: 你的帳戶的密碼已被更改。 - extra: 如果你沒有請求更改你的密碼,則他人很有可能已經入侵你的帳戶。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。 - subject: 'Mastodon: 更改密碼' - title: 密碼已被重設 + explanation: 你的帳號的密碼已被更改。 + extra: 如果你沒有更改你的密碼,那很有可能已經有其他人入侵你的帳號。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。 + subject: 'Mastodon: 密碼已被更改' + title: 密碼已被更改 reconfirmation_instructions: - explanation: 點擊下面的連結來確認你的新電子郵件地址。 + explanation: 點擊下面的連結來確認你的新電郵地址。 extra: 如果你沒有請求本次變更,請忽略此郵件。 Mastodon 帳戶的電子郵件地址只有在你點擊上面的連結後才會更改。 - subject: Mastodon:確認 %{instance} 電子郵件地址 - title: 驗證電子郵件地址 + subject: Mastodon:確認 %{instance} 電郵地址 + title: 驗證電郵地址 reset_password_instructions: action: 更改密碼 - explanation: 點擊下面的連結來更改帳戶的密碼。 - extra: 如果你沒有請求本次變更,請忽略此郵件。你的密碼只有在你點擊上面的連結並輸入新密碼後才會更改。 + explanation: 點擊下面的連結來更改帳號的密碼。 + extra: 如果你沒有請求修改帳號,請忽略此郵件。在你點擊進上面連結並設定新密碼前,帳號密碼會維持不變。 subject: 'Mastodon: 重設密碼' title: 重設密碼 two_factor_disabled: - explanation: 帳號的雙重認證已禁用。現在僅使用郵箱和密碼即可登錄。 - subject: 長毛象:已關閉雙重認證 + explanation: 帳號的雙重認證已被停用。現在只需使用電郵地址和密碼,即可登入。 + subject: Mastodon:已關閉雙重認證 title: 已關閉雙重認證 two_factor_enabled: - explanation: 賬號的雙重認證已啟用。登錄時將需要用已配對的 TOTP 應用生成驗證碼。 - subject: 長毛象:已啟用雙重認證 + explanation: 賬號的雙重認證已被啟用。登錄時,將需要已配對 TOTP 應用程式生成的驗證碼。 + subject: Mastodon:已啟用雙重認證 title: 已啟用雙重認證 two_factor_recovery_codes_changed: explanation: 之前的恢復碼失效了,新的已生成。 - subject: 長毛象:已產生新的雙重認證恢復碼 + subject: Mastodon:已產生新的雙重認證恢復碼 title: 雙重認證恢復碼已更改 unlock_instructions: - subject: 'Mastodon: 解除用戶鎖定' + subject: 'Mastodon: 解除帳號鎖定' webauthn_credential: added: explanation: 以下的安全鑰匙已經加進你的帳號 @@ -72,37 +72,37 @@ zh-HK: webauthn_disabled: explanation: 你的帳號的安全鑰匙身份驗證已經停用。你只可以用過去已經配對好的基於時間一次性密碼程式生成的密碼來登錄。 subject: 'Mastodon: 安全鑰匙身份驗證已經停用' - title: 已啟用安全鑰匙 + title: 已停用安全鑰匙 webauthn_enabled: explanation: 安全鑰匙身份驗證已啟用。你的安全鑰匙現在可以用來登錄。 subject: 'Mastodon: 安全鑰匙身份驗證已啟用' title: 已啟用安全鑰匙 omniauth_callbacks: - failure: 無法以 %{kind} 登入你的用戶,原因是︰「%{reason}」。 + failure: 無法以 %{kind} 登入你的帳號,原因是︰「%{reason}」。 success: 成功以 %{kind} 登入你的用戶。 passwords: no_token: 你必須使用重設密碼電郵內的網址進入本頁。如果你確是使用電郵內的網址,請確認你用了完整的網址。 - send_instructions: 你將在幾分鐘內收到重設密碼的電郵指示。 - send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將會在幾分鐘內收到重設密碼的電郵指示。 + send_instructions: 如果你的電郵存在於我們的資料庫中,你將在幾分鐘內收到重設密碼的電郵指示。如果你未能在收件箱找到該電郵,請檢查垃圾郵件箱。 + send_paranoid_instructions: 如果你的電郵存在於我們的資料庫中,你將在幾分鐘內收到重設密碼的電郵指示。如果你未能在收件箱找到該電郵,請檢查垃圾郵件箱。 updated: 你的密碼已經更新,你現在正登入本站。 updated_not_active: 你的密碼已經更新。 registrations: - destroyed: 再見了!你的用戶已被取消,希望我們相有相見的機會吧。 - signed_up: 歡迎你!你的登記已經成功。 - signed_up_but_inactive: 你的登記已經成功,可是由於你的用戶還被被啟用,暫時還不能讓你登入。 - signed_up_but_locked: 你的登記已經成功,可是由於你的用戶已被鎖定,我們無法讓你登入。 - signed_up_but_pending: 確認連結已發送到您的電郵地址。點擊連結後我們會審核您的申請,一旦通過您將會收到通知。 - signed_up_but_unconfirmed: 一條確認連結已經電郵到你的郵址。請使用讓連結啟用你的用戶。 - update_needs_confirmation: 你的用戶已經更新,但我們需要確認你的電郵地址。請打開你的郵箱,使用確認電郵的連結來確認的地郵址。 - updated: 你的用戶已經成功更新。 + destroyed: 再見!你的帳號已被取消,希望日後能再見到你。 + signed_up: 歡迎你!你已經成功登記。 + signed_up_but_inactive: 你的登記已經成功,可是由於你的帳號還未被啟用,暫時還不能讓你登入。 + signed_up_but_locked: 你的登記已經成功,可是由於你的帳號已被鎖定,我們無法讓你登入。 + signed_up_but_pending: 確認連結已發送到你的電郵地址。在你點擊連結後,我們會審核你的申請。一旦通過審核,你將會收到進一步通知。 + signed_up_but_unconfirmed: 一條確認連結已經電郵到你的郵址。請使用讓連結啟用你的帳號。 + update_needs_confirmation: 你的帳號已經更新,但我們需要確認你的電郵地址。請打開你的郵箱,使用確認電郵的連結來確認的地郵址。如果未能在收件箱找相關電郵指示,請檢查垃圾郵件箱。 + updated: 你的帳號已經成功更新。 sessions: already_signed_out: 成功登出。 signed_in: 成功登入。 signed_out: 成功登出。 unlocks: - send_instructions: 你將在幾分鐘內收到解除用戶鎖定的電郵指示。 - send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將在幾分鐘內收到解除用戶鎖定的電郵指示。 - unlocked: 你的用戶已經解鎖,請登入以繼續。 + send_instructions: 你將在幾分鐘內收到解除用戶鎖定的電郵指示。如果未能在收件箱找到電郵指示,請檢查垃圾郵件箱。 + send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將在幾分鐘內收到解除用戶鎖定的電郵指示。如果未能在收件箱找到電郵指示,請檢查垃圾郵件箱。 + unlocked: 你的帳號已經解鎖,請登入以繼續。 errors: messages: already_confirmed: 先前已經確認,請嘗試登入 diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index ef0da1a9c..6f652f421 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -60,6 +60,23 @@ zh-TW: title: 2FA 復原碼已變更 unlock_instructions: subject: Mastodon:解鎖指引 + webauthn_credential: + added: + explanation: 下面的安全密鑰已經新增至您的帳戶 + subject: 'Mastodon: 新安全密鑰' + title: 已新增新安全密鑰 + deleted: + explanation: 下面的安全密鑰已經從您的帳戶中移除 + subject: 'Mastodon: 安全密鑰已移除' + title: 您的一支安全密鑰已經被移除 + webauthn_disabled: + explanation: 您的帳戶並沒有啟用安全密鑰認證方式。只能以 TOTP app 產生地成對 token 登入。 + subject: 'Mastodon: 安全密鑰認證方式已關閉' + title: 已關閉安全密鑰 + webauthn_enabled: + explanation: 安全密鑰認證已在您的帳戶中啟用。您可以使用安全密鑰登入了。 + subject: 'Mastodon: 以啟用安全密鑰認證' + title: 已開啟安全密鑰 omniauth_callbacks: failure: 無法透過 %{kind} 認證是否為您,因為「%{reason}」。 success: 成功透過 %{kind} 帳戶登入。 diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml index 2fbf0ffd7..61e6cb6a1 100644 --- a/config/locales/doorkeeper.es.yml +++ b/config/locales/doorkeeper.es.yml @@ -1 +1,151 @@ ---- {} +--- +es: + activerecord: + attributes: + doorkeeper/application: + name: Nombre de aplicación + redirect_uri: URI para redirección + scopes: Ámbitos + website: Sitio web + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: no puede contener un fragmento. + invalid_uri: debe ser un URI válido. + relative_uri: debe ser una URI absoluta. + secured_uri: debe ser un URI HTTPS/SSL. + doorkeeper: + applications: + buttons: + authorize: Autorizar + cancel: Cancelar + destroy: Destruir + edit: Editar + submit: Enviar + confirmations: + destroy: "¿Está seguro?" + edit: + title: Editar aplicación + form: + error: "¡Uuups! Compruebe su formulario" + help: + native_redirect_uri: Utilice %{native_redirect_uri} para pruebas locales + redirect_uri: Utilice una línea por URI + scopes: Separe los ámbitos con espacios. Déjelo en blanco para utilizar los ámbitos por defecto. + index: + application: Aplicación + callback_url: URL de callback + delete: Eliminar + empty: No tienes aplicaciones. + name: Nombre + new: Nueva aplicación + scopes: Ámbitos + show: Mostrar + title: Sus aplicaciones + new: + title: Nueva aplicación + show: + actions: Acciones + application_id: Id de la aplicación + callback_urls: URLs de callback + scopes: Ámbitos + secret: Secreto + title: 'Aplicación: %{name}' + authorizations: + buttons: + authorize: Autorizar + deny: Desautorizar + error: + title: Ha ocurrido un error + new: + able_to: Será capaz de + prompt: La aplicación %{client_name} solicita tener acceso a su cuenta + title: Se requiere autorización + show: + title: Copia este código de autorización y pégalo en la aplicación. + authorized_applications: + buttons: + revoke: Revocar + confirmations: + revoke: "¿Está seguro?" + index: + application: Aplicación + created_at: Creado el + date_format: "%A-%m-%d %H:%M:%S" + scopes: Ámbitos + title: Sus aplicaciones autorizadas + errors: + messages: + access_denied: El propietario del recurso o servidor de autorización denegó la petición. + credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar. + invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado. + invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente. + invalid_redirect_uri: La URI de redirección incluida no es válida. + invalid_request: En la petición falta un parámetro necesario o incluye un valor de parámetro no soportado o tiene otro tipo de formato incorrecto. + invalid_resource_owner: Las credenciales proporcionadas del propietario del recurso no son válidas, o el propietario del recurso no puede ser encontrado + invalid_scope: El ámbito pedido es inválido, desconocido o erróneo. + invalid_token: + expired: El autentificador de acceso expiró + revoked: El autentificador de acceso fue revocado + unknown: El autentificador de acceso es inválido + resource_owner_authenticator_not_configured: El propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_authenticator está sin configurar. + server_error: El servidor de la autorización entontró una condición inesperada que le impidió cumplir con la solicitud. + temporarily_unavailable: El servidor de la autorización es actualmente incapaz de manejar la petición debido a una sobrecarga temporal o un trabajo de mantenimiento del servidor. + unauthorized_client: El cliente no está autorizado a realizar esta petición utilizando este método. + unsupported_grant_type: El tipo de concesión de autorización no está soportado por el servidor de autorización. + unsupported_response_type: El servidor de autorización no soporta este tipo de respuesta. + flash: + applications: + create: + notice: Aplicación creada. + destroy: + notice: Aplicación eliminada. + update: + notice: Aplicación actualizada. + authorized_applications: + destroy: + notice: Aplicación revocada. + layouts: + admin: + nav: + applications: Aplicaciones + oauth2_provider: Proveedor OAuth2 + application: + title: OAuth autorización requerida + scopes: + admin:read: leer todos los datos en el servidor + admin:read:accounts: leer información sensible de todas las cuentas + admin:read:reports: leer información sensible de todos los informes y cuentas reportadas + admin:write: modificar todos los datos en el servidor + admin:write:accounts: realizar acciones de moderación en cuentas + admin:write:reports: realizar acciones de moderación en informes + follow: seguir, bloquear, desbloquear y dejar de seguir cuentas + push: recibir tus notificaciones push + read: leer los datos de tu cuenta + read:accounts: ver información de cuentas + read:blocks: ver a quién has bloqueado + read:bookmarks: ver tus marcadores + read:favourites: ver tus favoritos + read:filters: ver tus filtros + read:follows: ver a quién sigues + read:lists: ver tus listas + read:mutes: ver a quién has silenciado + read:notifications: ver tus notificaciones + read:reports: ver tus informes + read:search: buscar en su nombre + read:statuses: ver todos los estados + write: publicar en tu nombre + write:accounts: modifica tu perfil + write:blocks: bloquear cuentas y dominios + write:bookmarks: guardar estados como marcadores + write:favourites: toots favoritos + write:filters: crear filtros + write:follows: seguir usuarios + write:lists: crear listas + write:media: subir archivos multimedia + write:mutes: silenciar usuarios y conversaciones + write:notifications: limpia tus notificaciones + write:reports: reportar a otras personas + write:statuses: publicar estados diff --git a/config/locales/doorkeeper.sc.yml b/config/locales/doorkeeper.sc.yml index 91bd6d92f..2a6aeb2c1 100644 --- a/config/locales/doorkeeper.sc.yml +++ b/config/locales/doorkeeper.sc.yml @@ -1 +1,151 @@ +--- sc: + activerecord: + attributes: + doorkeeper/application: + name: Nòmine de s'aplicatzione + redirect_uri: URL de re-indiritzamentu + scopes: Àmbitos + website: Situ web de s'aplicatzione + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: non podet cuntènnere un'ascra. + invalid_uri: depet èssere un'URI vàlidu. + relative_uri: devet èssere un'URI assolutu. + secured_uri: depet èssere un'URI HTTPS/SSL. + doorkeeper: + applications: + buttons: + authorize: Autoriza + cancel: Annulla + destroy: Distrue + edit: Modìfica + submit: Imbia + confirmations: + destroy: Seguru? + edit: + title: Modìfica s'aplicatzione + form: + error: Controlla si su formulàriu tuo tenet faddinas + help: + native_redirect_uri: Imprea %{native_redirect_uri} pro is tests locales + redirect_uri: Imprea una lìnia pro ogni URI + scopes: Iscroba is àmbitos cun ispàtzios. Lassa bòidu pro impreare is predefinidos. + index: + application: Aplicatzione + callback_url: URL de torrada + delete: Cantzella + empty: No tenes peruna aplicatzione. + name: Nòmine + new: Aplicatzione noa + scopes: Àmbitos + show: Ammustra + title: Is aplicatziones tuas + new: + title: Aplicatzione noa + show: + actions: Atziones + application_id: ID de s'aplicatzione + callback_urls: URLs de torrada + scopes: Àmbitos + secret: Segretu de cliente + title: 'Aplicatzione: %{name}' + authorizations: + buttons: + authorize: Autoriza + deny: Refuda + error: + title: Faddina + new: + able_to: At a pòdere + prompt: S'aplicatzione %{client_name} est preguntende atzessu a su contu tuo + title: Autorizatzione rechesta + show: + title: Còpia custu còdighe de autorizatzione e incolla·ddu a s'aplicatzione. + authorized_applications: + buttons: + revoke: Rèvoca + confirmations: + revoke: Seguru? + index: + application: Aplicatzione + created_at: Autorizada + date_format: "%Y-%m-%d %H:%M:%S" + scopes: Àmbitos + title: Is aplicatziones autorizadas tuas + errors: + messages: + access_denied: Sa propiedade sa resursa o su serbidore de autorizatziones at refudadu sa rechesta. + credential_flow_not_configured: Su flussu de is credentziales de sa crae de intrada de su mere de sa risursa est fallidu pro neghe de su fatu chi Doorkeeper.configure.resource_owner_from_credentials no est cunfiguradu. + invalid_client: S'autenticatzione de su cliente est fallida ca su cliente est disconnotu, s'atzessu a su cliente no est istadu incluidu, o sa manera de autenticatzione no est suportada. + invalid_grant: Su permissu de autorizatzione est invàlidu, iscadidu, revocadu, non currispondet a s'URI de re-indiritzamentu impreadu in sa rechesta de autorizatzione, o est istadu frunidu a un'àteru cliente. + invalid_redirect_uri: S'URI de re-indiritzamentu no est vàlidu. + invalid_request: In sa rechesta mancat unu paràmetru netzessàriu, ddoe est unu valore de unu paràmetru non suportadu o est fata male in carchi àtera manera. + invalid_resource_owner: Is credentziales de su mere de sa risursa frunidas non sunt vàlidas, o su mere de sa risursa non podet èssere agatadu + invalid_scope: S'àmbitu pedidu est invàlidu, disconnotu, o formuladu male. + invalid_token: + expired: Su getone de atzessu est iscadidu + revoked: Su getone de atzessu est istadu revocadu + unknown: Su getone de atzessu no est vàlidu + resource_owner_authenticator_not_configured: Su mere de sa risursa no est istadu agatadu pro neghe de su fatu chi Doorkeeper.configure.resource_owner_authenticator no est configuradu. + server_error: Su serbidore de autorizatzione at agatadu una cunditzione no isetada chi dd'at impedidu de esecutare sa rechesta tua. + temporarily_unavailable: Su serbidore de autorizatzione no est, in custu momentu, in gradu de gestire sa rechesta pro neghe de unu subracàricu temporàneu o de una manutentzione. + unauthorized_client: Su cliente no est autorizadu a esecutare custa rechesta in custa manera. + unsupported_grant_type: Sa casta de modalidade de autorizatzione no est suportada dae su serbidore de atzessu. + unsupported_response_type: Su serbidore de autorizatzione non suportat custa casta de risposta. + flash: + applications: + create: + notice: Aplicatzione creada. + destroy: + notice: Aplicatzione cantzellada. + update: + notice: Aplicatzione atualizada. + authorized_applications: + destroy: + notice: Aplicatzione revocada. + layouts: + admin: + nav: + applications: Aplicatziones + oauth2_provider: Frunidore OAuth2 + application: + title: Autorizatzione OAuth netzessària + scopes: + admin:read: lèghere totu is datos de su serbidore + admin:read:accounts: lèghere informatziones sensìbiles de totu is contos + admin:read:reports: lèghere informatziones sensìbiles de totu is sinnalatziones e is contos sinnalados + admin:write: modificare totu is datos in su serbidore + admin:write:accounts: fàghere atziones de moderatzione in is contos + admin:write:reports: fàghere atziones de moderatzione in is sinnalatziones + follow: modificare is relatziones intre is contos + push: retzire is notìficas push tuas + read: lèghere totu is datos de su contu tuo + read:accounts: bìdere is informatziones in su contu + read:blocks: bìdere is blocos tuos + read:bookmarks: càstia is sinnalibros tuos + read:favourites: bìdere is preferidos tuos + read:filters: bìdere is filtros tuos + read:follows: bìdere is sighiduras tuas + read:lists: bìdere is listas tuas + read:mutes: bìdere is utentes chi as postu a sa muda + read:notifications: bìdere is notìficas tuas + read:reports: bìdere is sinnalatziones tuas + read:search: chircare a nùmene tuo + read:statuses: bìdere totu is istados + write: modificare totu is datos de su contu tuo + write:accounts: modificare su profilu tuo + write:blocks: blocare contos e domìnios + write:bookmarks: agiunghe is istados a is sinnalibros + write:favourites: pònnere istados in is preferidos + write:filters: creare filtros + write:follows: sighire persones + write:lists: creare listas + write:media: càrriga documentos multimediales + write:mutes: impostare persones e arresonadas a sa muda + write:notifications: isboidare is notìficas tuas + write:reports: sinnalare àteras persones + write:statuses: publicare istados diff --git a/config/locales/doorkeeper.tt.yml b/config/locales/doorkeeper.tt.yml new file mode 100644 index 000000000..5eab4abff --- /dev/null +++ b/config/locales/doorkeeper.tt.yml @@ -0,0 +1 @@ +tt: diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index caeba3b71..a51891fd0 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -67,7 +67,7 @@ vi: title: Sao chép mã này và dán nó vào ứng dụng. authorized_applications: buttons: - revoke: Thu hồi + revoke: Gỡ confirmations: revoke: Bạn có chắc không? index: @@ -81,14 +81,14 @@ vi: access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu. credential_flow_not_configured: Resource Owner Password Credentials không thành công do Doorkeeper.configure.resource_owner_from_credentials không được định cấu hình. invalid_client: Xác thực ứng dụng khách không thành công do máy khách mơ hồ, không bao gồm xác thực ứng dụng khách hoặc phương thức xác thực không được hỗ trợ. - invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị thu hồi hoặc không khớp với tài khoản đã cấp phép. Hoặc xung đột với ứng dụng khác. + invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị gỡ hoặc không khớp với tài khoản đã cấp phép. Hoặc xung đột với ứng dụng khác. invalid_redirect_uri: URL chuyển hướng không hợp lệ. invalid_request: Yêu cầu thiếu tham số bắt buộc, bao gồm giá trị tham số không được hỗ trợ hoặc không đúng định dạng. invalid_resource_owner: Thông tin xác thực chủ sở hữu tài nguyên được cung cấp không hợp lệ hoặc không thể tìm thấy chủ sở hữu tài nguyên invalid_scope: Quyền yêu cầu không hợp lệ, không có thật hoặc sai định dạng. invalid_token: expired: Mã thông báo truy cập đã hết hạn - revoked: Mã thông báo truy cập đã bị thu hồi + revoked: Mã token đăng nhập đã bị hủy unknown: Mã thông báo truy cập không hợp lệ resource_owner_authenticator_not_configured: Chủ sở hữu tài nguyên tìm thấy thất bại do Doorkeeper.configure.resource_owner_authenticator không được định cấu hình. server_error: Có một điều kiện không thể chấp nhận khiến máy chủ không thực hiện yêu cầu. @@ -106,7 +106,7 @@ vi: notice: Ứng dụng cập nhật. authorized_applications: destroy: - notice: Ứng dụng bị thu hồi. + notice: Ứng dụng bị gỡ. layouts: admin: nav: diff --git a/config/locales/doorkeeper.zgh.yml b/config/locales/doorkeeper.zgh.yml index 5ec7e04b4..d34b8109c 100644 --- a/config/locales/doorkeeper.zgh.yml +++ b/config/locales/doorkeeper.zgh.yml @@ -4,6 +4,7 @@ zgh: attributes: doorkeeper/application: name: ⵉⵙⵏ ⵏ ⵜⵙⵏⵙⵉ + redirect_uri: ⵜⴰⵏⵙⴰ ⵏ ⵓⵙⵉⴼⴹ website: ⴰⵙⵉⵜ ⵡⵉⴱ ⵏ ⵜⵙⵏⵙⵉ doorkeeper: applications: @@ -16,12 +17,16 @@ zgh: destroy: ⵉⵙ ⵏⵉⵜ? edit: title: ⵙⵏⴼⵍ ⵜⵉⵙⵏⵙⵉ + help: + native_redirect_uri: ⵙⵎⵔⵙ %{native_redirect_uri} ⵉ ⵉⵔⵉⵎⵏ ⵉⴷⵖⴰⵔⴰⵜⵏ + redirect_uri: ⵙⵎⵔⵙ ⵢⴰⵏ ⵓⵣⴳⵉⴳ ⵉ ⵢⴰⵜ ⵜⵖⵓⵏⵉ index: application: ⵜⵉⵙⵏⵙⵉ delete: ⴽⴽⵙ empty: ⵓⵔ ⵖⵓⵔⴽ ⴽⵔⴰ ⵏ ⵜⵙⵏⵙⵉⵡⵉⵏ. name: ⵉⵙⵎ new: ⵜⵉⵙⵏⵙⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ + show: ⵙⵎⴰⵍ title: ⵜⵉⵙⵏⵙⵉⵡⵉⵏ ⵏⵏⴽ new: title: ⵜⵉⵙⵏⵙⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ @@ -32,6 +37,8 @@ zgh: buttons: authorize: ⵙⵙⵓⵔⴳ deny: ⴰⴳⵢ + new: + prompt: ⵜⵙⵙⵓⵜⵓⵔ ⵜⵙⵏⵙⵉ %{client_name} ⴰⵙⴰⴷⴼ ⵖⵔ ⵓⵎⵉⴹⴰⵏ ⵏⵏⴽ authorized_applications: confirmations: revoke: ⵉⵙ ⵏⵉⵜ? @@ -40,6 +47,34 @@ zgh: created_at: ⵜⴻⵜⵜⵓⵙⵓⵔⴳ date_format: "%d-%m-%Y %H:%M:%S" title: ⵜⵉⵙⵏⵙⵉⵡⵉⵏ ⵏⵏⴽ ⵉⵜⵜⵓⵙⵓⵔⴷⵏ + flash: + applications: + create: + notice: ⵜⴻⵜⵜⵓⵙⵏⴼⵍⵓⵍ ⵜⵙⵏⵙⵉ. + destroy: + notice: ⵜⴻⵜⵜⵡⴰⴽⴽⵙ ⵜⵙⵏⵙⵉ. + update: + notice: ⵜⴻⵜⵜⵓⵙⴷⵖⵉ ⵜⵙⵏⵙⵉ. + layouts: + admin: + nav: + applications: ⵜⵉⵙⵏⵙⵉⵡⵉⵏ scopes: + admin:read: ⵖⵔ ⵉⴼⵙⴽⴰ ⴰⴽⴽⵯ ⴳ ⵓⵎⴰⴽⴽⴰⵢ + admin:write: ⵙⵏⴼⵍ ⵉⴼⵙⴽⴰ ⴰⴽⴽⵯ ⴳ ⵓⵎⴰⴽⴽⴰⵢ + read: ⵖⵔ ⵉⴼⵙⴽⴰ ⴰⴽⴽⵯ ⵏ ⵓⵎⵉⴹⴰⵏ + read:filters: ⵥⵕ ⵉⵙⵜⴰⵢⵏ ⵏⵏⴽ + read:follows: ⵥⵕ ⵉⵎⴹⴼⴰⵔⵏ ⵏⵏⴽ + read:lists: ⵥⵕ ⵜⵉⵍⴳⴰⵎⵉⵏ ⵏⵏⴽ read:notifications: ⵥⵕ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵏⵏⴽ + read:search: ⵔⵣⵓ ⵙ ⵢⵉⵙⵎ ⵏⵏⴽ + read:statuses: ⵥⵕ ⴰⴷⴷⴰⴷⵏ ⴰⴽⴽⵯ + write: ⵙⵏⴼⵍ ⵉⴼⵙⴽⴰ ⵏ ⵓⵎⵉⴹⴰⵏ ⵏⵏⴽ + write:accounts: ⵙⵏⴼⵍ ⵉⴼⵔⵙ ⵏⵏⴽ + write:blocks: ⴳⴷⵍ ⵉⵎⵉⴹⴰⵏⵏ ⴷ ⵢⵉⴳⵔⴰⵏ + write:follows: ⴹⴼⵕ ⵎⵉⴷⴷⵏ + write:lists: ⵙⵏⴼⵍⵓⵍ ⵜⵉⵍⴳⴰⵎⵉⵏ + write:mutes: ⵥⵥⵉⵥⵏ ⵎⵉⴷⴷⵏ ⴷ ⵉⵎⵙⴰⵡⴰⵍⵏ write:notifications: ⵙⴼⴹ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵏⵏⴽ + write:reports: ⵎⵍ ⵎⵉⴷⴷⵏ ⵏⵏⵉⴹⵏ + write:statuses: ⴼⵙⵔ ⵜⵉⵥⵕⴰⴳⵉⵏ diff --git a/config/locales/doorkeeper.zh-HK.yml b/config/locales/doorkeeper.zh-HK.yml index 83c552427..872727049 100644 --- a/config/locales/doorkeeper.zh-HK.yml +++ b/config/locales/doorkeeper.zh-HK.yml @@ -3,8 +3,8 @@ zh-HK: activerecord: attributes: doorkeeper/application: - name: 應用名稱 - redirect_uri: 轉接 URI + name: 應用程式名稱 + redirect_uri: 重新導向 URI scopes: 權限範圍 website: 應用網站 errors: @@ -12,10 +12,10 @@ zh-HK: doorkeeper/application: attributes: redirect_uri: - fragment_present: URI 不可包含 "#fragment" 部份。 - invalid_uri: 必需有正確的 URI。 - relative_uri: 必需為完整 URI。 - secured_uri: 必需使用有 HTTPS/SSL 加密的 URI。 + fragment_present: 不能包含 fragment。 + invalid_uri: 必需是一個有效的 URI。 + relative_uri: 必須為絕對 URI。 + secured_uri: 必須為 HTTPS/SSL 加密的 URI。 doorkeeper: applications: buttons: @@ -32,26 +32,26 @@ zh-HK: error: 噢!請檢查你表格的錯誤訊息 help: native_redirect_uri: 使用 %{native_redirect_uri} 作局部測試 - redirect_uri: 每行輸入一個 URI + redirect_uri: 一行一個 URI scopes: 請用半形空格分開權限範圍 (scope)。留空表示使用預設的權限範圍。 index: - application: 應用 - callback_url: 回傳網址 + application: 應用程式 + callback_url: 回傳網址 (Callback URL) delete: 刪除 - empty: 您沒有申請 + empty: 你沒有應用程式 name: 名稱 new: 新增應用程式 - scopes: 權限範圍 + scopes: 權限範圍 (Scopes) show: 顯示 title: 你的應用程式 new: title: 新增應用程式 show: actions: 操作 - application_id: 應用程式 ID - callback_urls: 回傳網址 - scopes: 權限範圍 - secret: 密碼 + application_id: 用戶程式鑰匙 (Client key) + callback_urls: 回傳網址 (Callback URL) + scopes: 權限範圍 (Scopes) + secret: 用戶程式密碼 (Client secret) title: 應用程式︰ %{name} authorizations: buttons: @@ -60,7 +60,7 @@ zh-HK: error: title: 發生錯誤 new: - able_to: 要求獲取權限 + able_to: 它將可以 prompt: 應用程式 %{client_name} 要求得到你用戶的部份權限 title: 需要用戶授權 show: @@ -73,27 +73,27 @@ zh-HK: index: application: 應用程式 created_at: 授權日期 - date_format: "%Y-%m-%d %H:%M:%S" - scopes: 權限範圍 + date_format: "%Y年%m月%d日 %H:%M:%S" + scopes: 權限範圍 (Scopes) title: 已獲你授權的程用程式 errors: messages: access_denied: 資源擁有者或授權伺服器不接受請求。 - credential_flow_not_configured: 資源擁有者密碼認證程序失敗,原因是 Doorkeeper.configure.resource_owner_from_credentials 沒有設定。 - invalid_client: 用戶程式認證失敗,原因是用戶程式未有登記、沒有指定用戶程式、或者使用了不支援的認證方法。 - invalid_grant: 授權申請不正確、過期、已被取消,或者無法對應授權請求內的轉接 URI,或者屬於別的用戶程式。 + credential_flow_not_configured: 資源擁有者密碼認證程序 (Resource Owner Password Credentials flow) 失敗,原因是 Doorkeeper.configure.resource_owner_from_credentials 沒有設定。 + invalid_client: 用戶程式認證 (Client Authentication) 失敗,原因是使用了未知的用戶程式、沒有傳回用戶認證資訊、或者使用了不支援的認證方法 (Authentication Method)。 + invalid_grant: 所提供的認證申請 (authorization grant) 不正確、過期、已被取消、或者無法對應授權請求 (authorization request) 內的轉接 URI,或者屬於別的用戶程式。 invalid_redirect_uri: 不正確的轉接網址。 - invalid_request: 請求缺少了必要的參數、包含了不支援的參數、或者其他輸入錯誤。 - invalid_resource_owner: 資源擁有者的登入資訊錯誤、或者無法找到該資源擁有者 - invalid_scope: 請求的權限範圍 (scope) 不正確、未有定義、或者輸入錯誤。 + invalid_request: 請求缺少必要的參數、有不支援的參數、或包含其他格式錯誤。 + invalid_resource_owner: 資源擁有者的登入資訊無效、或者無法找到該資源擁有者 + invalid_scope: 你所請求的權限範圍 (scope) 無效、未知、或格式錯誤。 invalid_token: - expired: access token 已經過期 - revoked: access token 已被取消 - unknown: access token 不正確 + expired: 存取憑證 (access token) 已過期 + revoked: 存取憑證 (access token) 已被撤銷 + unknown: 存取憑證 (access token) 無效 resource_owner_authenticator_not_configured: 無法找到資源擁有者,原因是 Doorkeeper.configure.resource_owner_authenticator 沒有設定。 - server_error: 認證伺服器遇上未知狀況,令請求無法通過。 + server_error: 認證伺服器遇上未知狀況,令請求無法被正確處理。 temporarily_unavailable: 認證伺服器由於臨時負荷過重或者維護,目前未能處理請求。 - unauthorized_client: 用戶程式無權用此方法 (method) 請行這個請求。 + unauthorized_client: 用戶程式無權使用所選的方法 (method) 進行這個請求。 unsupported_grant_type: 授權伺服器不支援這個授權類型 (grant type)。 unsupported_response_type: 授權伺服器不支援這個回應類型 (response type)。 flash: @@ -119,33 +119,33 @@ zh-HK: admin:read:accounts: 讀取所有帳戶的敏感資訊 admin:read:reports: 讀取所有回報 / 被回報之帳戶的敏感資訊 admin:write: 修改伺服器的所有資料 - admin:write:accounts: 對帳戶進行仲裁管理動作 - admin:write:reports: 對報告進行仲裁管理動作 - follow: 關注、封鎖、解除封鎖及取消關注用戶 + admin:write:accounts: 對帳號進行仲裁管理動作 + admin:write:reports: 對回報進行仲裁管理動作 + follow: 修改帳號的對外聯繫 push: 接收你的帳號的推送通知 - read: 閱讀你的用戶資料 - read:accounts: 檢視帳戶資訊 - read:blocks: 檢視您的封鎖名單 - read:bookmarks: 檢視您的書籤 - read:favourites: 檢視您的收藏項目 - read:filters: 檢視您的過濾條件 - read:follows: 檢視您關注的人 - read:lists: 檢視您的名單 - read:mutes: 檢視您靜音的人 - read:notifications: 檢視您的通知 - read:reports: 檢視您的檢舉 - read:search: 以你的身份搜尋 - read:statuses: 檢視所有嘟文 + read: 閱讀你帳號的所有資料 + read:accounts: 檢視帳號資訊 + read:blocks: 檢視你的封鎖名單 + read:bookmarks: 檢視你的書籤 + read:favourites: 檢視你最愛的文章 + read:filters: 檢視你的過濾條件 + read:follows: 檢視你關注的人 + read:lists: 檢視你的清單 + read:mutes: 檢視被你靜音的人 + read:notifications: 檢視你的通知 + read:reports: 檢視你的檢舉 + read:search: 以你的身份進行搜尋 + read:statuses: 檢視所有文章 write: 以你的名義發佈文章 - write:accounts: 修改您的個人檔案 - write:blocks: 封鎖帳戶及站台 - write:bookmarks: 書籤狀態 - write:favourites: 收藏嘟文 + write:accounts: 修改你的個人檔案 + write:blocks: 封鎖帳號及域名 + write:bookmarks: 把文章加入最愛 + write:favourites: 喜歡的文章 write:filters: 建立過濾條件 write:follows: 關注其他人 - write:lists: 建立名單 + write:lists: 建立清單 write:media: 上傳媒體檔案 write:mutes: 靜音使用者及對話 - write:notifications: 清除您的通知 + write:notifications: 清除你的通知 write:reports: 檢舉其他人 write:statuses: 發布嘟文 diff --git a/config/locales/el.yml b/config/locales/el.yml index 9b9eeaa8d..7658efb18 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -131,6 +131,7 @@ el: follows: Ακολουθεί header: Επικεφαλίδα inbox_url: URL εισερχομένων + invite_request_text: Λόγοι για εγγραφή invited_by: Προσκλήθηκε από ip: IP joined: Γράφτηκε @@ -188,6 +189,8 @@ el: search: Αναζήτηση search_same_email_domain: Άλλοι χρήστες με τον ίδιο τομέα e-mail search_same_ip: Υπόλοιποι χρήστες με την ίδια διεύθυνση IP + sensitive: Ευαίσθητο + sensitized: σήμανση ως ευαίσθητο shared_inbox_url: URL κοινόχρηστων εισερχομένων show: created_reports: Αναφορές από αυτόν το λογαριασμό @@ -202,6 +205,7 @@ el: time_in_queue: Σε αναμονή για %{time} title: Λογαριασμοί unconfirmed_email: Ανεπιβεβαίωτο email + undo_sensitized: Αναίρεση ευαίσθητου undo_silenced: Αναίρεση αποσιώπησης undo_suspension: Αναίρεση παύσης unsilenced_msg: Επιτυχής άρση περιορισμών λογαριασμού του/της %{username} @@ -243,9 +247,11 @@ el: reopen_report: Ξανάνοιγμα Καταγγελίας reset_password_user: Επαναφορά Συνθηματικού resolve_report: Επίλυση Καταγγελίας + sensitive_account: Σήμανση των πολυμέσων στον λογαριασμό σας ως ευαίσθητων silence_account: Σίγαση Λογαριασμού suspend_account: Αναστολή Λογαριασμού unassigned_report: Αποδέσμευση Καταγγελίας + unsensitive_account: Αφαίρεση σήμανσης των πολυμέσων στον λογαριασμό σας ως ευαίσθητων unsilence_account: Άρση Σίγασης Λογαριασμού unsuspend_account: Άρση Αναστολής Λογαριασμού update_announcement: Ενημέρωση Ανακοίνωσης @@ -506,6 +512,8 @@ el: comment: none: Κανένα created_at: Καταγγέλθηκε + forwarded: Προωθημένα + forwarded_to: Προώθημένα προς %{domain} mark_as_resolved: Σημειωμένο ως επιλυμένο mark_as_unresolved: Σημειωμένο ως ανεπίλυτο notes: @@ -834,6 +842,7 @@ el: request: Αιτήσου το αρχείο σου size: Μέγεθος blocks: Μπλοκάρεις + bookmarks: Σελιδοδείκτες csv: CSV domain_blocks: Μπλοκαρίσματα κόμβων lists: Λίστες @@ -910,6 +919,7 @@ el: success: Τα δεδομένα σου μεταφορτώθηκαν επιτυχώς και θα επεξεργαστούν εν καιρώ types: blocking: Λίστα αποκλεισμού + bookmarks: Σελιδοδείκτες domain_blocking: Λίστα αποκλεισμένων τομέων following: Λίστα ακολούθων muting: Λίστα αποσιωπήσεων @@ -1344,6 +1354,7 @@ el: title: disable: Παγωμένος λογαριασμός none: Προειδοποίηση + sensitive: Το πολυμέσο σας έχει σημανθεί ως ευαίσθητο silence: Περιορισμένος λογαριασμός suspend: Λογαριασμός σε αναστολή welcome: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index e9256ad0c..64b7ccfc7 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -35,10 +35,13 @@ eo: status_count_before: Kie skribiĝis tagline: Sekvi amikojn kaj trovi iujn novajn terms: Uzkondiĉoj - unavailable_content: Nedisponebla enhavo + unavailable_content: Kontrolitaj serviloj unavailable_content_description: domain: Servilo reason: 'Kialo:' + rejecting_media_title: Filtritaj aŭdovidaĵoj + silenced_title: Silentigitaj serviloj + suspended_title: Haltigitaj serviloj user_count_after: one: uzanto other: uzantoj @@ -86,6 +89,7 @@ eo: delete: Forigi destroyed_msg: Kontrola noto sukcese detruita! accounts: + add_email_domain_block: Bloki retadresan domajnon approve: Aprobi approve_all: Aprobi ĉiujn are_you_sure: Ĉu vi certas? @@ -101,6 +105,7 @@ eo: confirm: Konfirmi confirmed: Konfirmita confirming: Konfirmante + delete: Forigi datumojn deleted: Forigita demote: Degradi disable: Malebligi @@ -117,6 +122,7 @@ eo: follows: Sekvatoj header: Kapa bildo inbox_url: Enira URL + invite_request_text: 가입하려는 이유 invited_by: Invitita de ip: IP joined: Aliĝis @@ -128,6 +134,7 @@ eo: login_status: Ensaluta stato media_attachments: Ligitaj aŭdovidaĵoj memorialize: Ŝanĝi al memoro + memorialized: Memorita moderation: active: Aktivaj all: Ĉio @@ -167,6 +174,8 @@ eo: user: Uzanto search: Serĉi search_same_ip: Aliaj uzantoj kun la sama IP + sensitive: Tikla + sensitized: markita tikla shared_inbox_url: URL de kunhavigita leterkesto show: created_reports: Kreitaj signaloj @@ -179,15 +188,19 @@ eo: time_in_queue: Atendado en atendovico %{time} title: Kontoj unconfirmed_email: Nekonfirmita retadreso + undo_sensitized: Malfari sentema undo_silenced: Malfari kaŝon undo_suspension: Malfari haltigon unsubscribe: Malaboni username: Uzantnomo + view_domain: Vidi la resumon de la domajno warn: Averti web: Reto whitelisted: En la blanka listo action_logs: action_types: + assigned_to_self_report: Atribui Raporton + change_email_user: Ŝanĝi retadreson de uzanto confirm_user: Konfermi uzanto create_account_warning: Krei Averton create_announcement: Krei Anoncon @@ -195,12 +208,14 @@ eo: create_domain_allow: Krei Domajnan Permeson create_domain_block: Krei blokadon de domajno create_email_domain_block: Krei blokadon de retpoŝta domajno + create_ip_block: Krei IP-regulon demote_user: Malpromocii uzanton destroy_announcement: Forigi Anoncon destroy_custom_emoji: Forigi Propran emoĝion destroy_domain_allow: Forigi Domajnan Permeson destroy_domain_block: Forigi blokadon de domajno destroy_email_domain_block: Forigi blokadon de retpoŝta domajno + destroy_ip_block: Forigi IP-regulon destroy_status: Forigi mesaĝon disable_2fa_user: Malebligi 2FA disable_custom_emoji: Malebligi Propran Emoĝion @@ -212,8 +227,15 @@ eo: reopen_report: Remalfermi signalon reset_password_user: Restarigi pasvorton resolve_report: Solvitaj reporto + sensitive_account: Marki tikla la aŭdovidaĵojn de via konto silence_account: Silentigi konton suspend_account: Haltigi konton + unsilence_account: Malsilentigi konton + unsuspend_account: Malhaltigi konton + update_announcement: Ĝisdatigi anoncon + update_custom_emoji: Ĝisdatigi proprajn emoĝiojn + update_domain_block: Ĝigdatigi domajnan blokadon + update_status: Ĝisdatigi staton actions: assigned_to_self_report: "%{name} asignis signalon %{target} al si mem" change_email_user: "%{name} ŝanĝis retadreson de uzanto %{target}" @@ -224,12 +246,14 @@ eo: create_domain_allow: "%{name} aldonis domajnon %{target} al la blanka listo" create_domain_block: "%{name} blokis domajnon %{target}" create_email_domain_block: "%{name} blokis retpoŝtan domajnon %{target}" + create_ip_block: "%{name} kreis regulon por IP %{target}" demote_user: "%{name} degradis uzanton %{target}" destroy_announcement: "%{name} forigis anoncon %{target}" destroy_custom_emoji: "%{name} neniigis la emoĝion %{target}" destroy_domain_allow: "%{name} forigis domajnon %{target} el la blanka listo" destroy_domain_block: "%{name} malblokis domajnon %{target}" destroy_email_domain_block: "%{name} malblokis retpoŝtan domajnon %{target}" + destroy_ip_block: "%{name} forigis regulon por IP %{target}" destroy_status: "%{name} forigis mesaĝojn de %{target}" disable_2fa_user: "%{name} malebligis dufaktoran aŭtentigon por uzanto %{target}" disable_custom_emoji: "%{name} malebligis emoĝion %{target}" @@ -251,6 +275,9 @@ eo: update_custom_emoji: "%{name} ĝisdatigis emoĝion %{target}" update_status: "%{name} ĝisdatigis mesaĝon de %{target}" deleted_status: "(forigita mesaĝo)" + empty: Neniu protokolo trovita. + filter_by_action: Filtri per ago + filter_by_user: Filtri per uzanto title: Kontrola protokolo announcements: destroyed_msg: Anonco sukcese forigita! @@ -289,6 +316,7 @@ eo: listed: Listigita new: title: Aldoni novan propran emoĝion + not_permitted: Vi ne rajtas plenumi ĉi tiun agon overwrite: Anstataŭigi shortcode: Mallonga kodo shortcode_hint: Almenaŭ 2 signoj, nur literoj, ciferoj kaj substrekoj @@ -385,6 +413,7 @@ eo: instances: by_domain: Domajno delivery_available: Liverado disponeblas + empty: Neniuj domajnoj trovitaj. known_accounts: one: "%{count} konata konto" other: "%{count} konataj kontoj" @@ -409,6 +438,9 @@ eo: title: Filtri title: Invitoj ip_blocks: + add_new: Krei regulon + created_msg: Nova IP-regulo sukcese aldonita + delete: Forigi expires_in: '1209600': 2 semajnoj '15778476': 6 monatoj @@ -416,6 +448,10 @@ eo: '31556952': 1 jaro '86400': 1 tago '94670856': 3 jaroj + new: + title: Krei novan IP-regulon + no_ip_block_selected: Neniu IP-regulo estis ŝanĝita ĉar neniu estis elektita + title: IP-reguloj pending_accounts: title: Pritraktataj kontoj (%{count}) relationships: @@ -670,9 +706,11 @@ eo: status: account_status: Statuso de la konto functional: Via konto estas plene funkcianta. + too_fast: Formularo sendita tro rapide, klopodu denove. trouble_logging_in: Ĝeni ensaluti? authorize_follow: already_following: Vi jam sekvas tiun konton + already_requested: Vi jam sendis peton de sekvado al ĉi tiu konto error: Bedaŭrinde, estis eraro en la serĉado de la fora konto follow: Sekvi follow_request: 'Vi sendis peton de sekvado al:' @@ -753,6 +791,7 @@ eo: request: Peti vian arkivon size: Grandeco blocks: Vi blokas + bookmarks: Legosignoj csv: CSV domain_blocks: Blokoj de domajnoj lists: Listoj @@ -826,6 +865,7 @@ eo: success: Viaj datumoj estis sukcese alŝutitaj kaj estos traktitaj kiel planite types: blocking: Listo de blokitoj + bookmarks: Legosignoj domain_blocking: Listo de blokitaj domajnoj following: Listo de sekvatoj muting: Listo de silentigitoj @@ -930,6 +970,8 @@ eo: quadrillion: Dd thousand: m trillion: Dn + otp_authentication: + enable: Ebligi pagination: newer: Pli nova next: Sekva @@ -974,7 +1016,7 @@ eo: status: Statuso de la konto remote_follow: acct: Enmetu vian uzantnomo@domajno de kie vi volas agi - missing_resource: La URL de plusendado ne estis trovita + missing_resource: La bezonata URL de plusendado por via konto ne estis trovita no_account_html: Ĉu vi ne havas konton? Vi povas registriĝi tie proceed: Daŭrigi por eksekvi prompt: 'Vi eksekvos:' @@ -1120,6 +1162,7 @@ eo: two_factor_authentication: add: Aldoni disable: Malebligi + disabled_success: Dufaktora aŭtentigo sukcese malebligita edit: Redakti enabled: Dufaktora aŭtentigo ebligita enabled_success: Dufaktora aŭtentigo sukcese ebligita @@ -1179,3 +1222,4 @@ eo: verification: Kontrolo webauthn_credentials: delete: Forigi + registered_on: Registrigita je %{date} diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 0108f0784..cb731ee4b 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -60,6 +60,7 @@ es-AR: one: Seguidor other: Seguidores following: Siguiendo + instance_actor_flash: Esta cuenta es un actor virtual usado para representar al servidor en sí mismo y no a ningún usuario individual. Se usa para propósitos de la federación y no debe ser suspendido. joined: En este servidor desde %{date} last_active: última actividad link_verified_on: La propiedad de este enlace fue verificada el %{date} @@ -131,6 +132,7 @@ es-AR: follows: Seguidores header: Cabecera inbox_url: Dirección web de la bandeja de entrada + invite_request_text: Motivos para unirte invited_by: Invitado por ip: Dirección IP joined: Se unió en @@ -255,6 +257,7 @@ es-AR: unsuspend_account: Dejar de suspender cuenta update_announcement: Actualizar anuncio update_custom_emoji: Actualizar emoji personalizado + update_domain_block: Actualizar bloque de dominio update_status: Actualizar toot actions: assigned_to_self_report: "%{name} se asignó la denuncia %{target} a sí" @@ -295,6 +298,7 @@ es-AR: unsuspend_account: "%{name} quitó la suspensión de la cuenta de %{target}" update_announcement: "%{name} actualizó el anuncio %{target}" update_custom_emoji: "%{name} actualizó el emoji %{target}" + update_domain_block: "%{name} actualizó el bloqueo de dominio para %{target}" update_status: "%{name} actualizó el toot de %{target}" deleted_status: "[toot eliminado]" empty: No se encontraron registros. @@ -437,6 +441,7 @@ es-AR: instances: by_domain: Dominio delivery_available: La entrega está disponible + empty: No se encontraron dominios. known_accounts: one: "%{count} cuenta conocida" other: "%{count} cuentas conocidas" @@ -514,6 +519,8 @@ es-AR: comment: none: Ninguno created_at: Denunciado + forwarded: Reenviado + forwarded_to: Reenviado a %{domain} mark_as_resolved: Marcar como resuelta mark_as_unresolved: Marcar como no resuelta notes: @@ -583,6 +590,9 @@ es-AR: min_invite_role: disabled: Nadie title: Permitir invitaciones de + require_invite_text: + desc_html: Cuando los registros requieran aprobación manual, hacé que la solicitud de invitación "¿Por qué querés unirte?" sea obligatoria, en vez de opcional + title: Requerir que los nuevos usuarios llenen un texto de solicitud de invitación registrations_mode: modes: approved: Se requiere aprobación para registrarse @@ -751,6 +761,7 @@ es-AR: functional: Tu cuenta está totalmente operativa. pending: Tu solicitud está pendiente de revisión por nuestra administración. Eso puede tardar algún tiempo. Si se aprueba tu solicitud, vas a recibir un correo electrónico. redirecting_to: Tu cuenta se encuentra inactiva porque está siendo redirigida a %{acct}. + too_fast: Formulario enviado demasiado rápido, probá de nuevo. trouble_logging_in: "¿Tenés problemas para iniciar sesión?" use_security_key: Usar la llave de seguridad authorize_follow: diff --git a/config/locales/es.yml b/config/locales/es.yml index 46285d84f..e26cd79f2 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -60,6 +60,7 @@ es: one: Seguidor other: Seguidores following: Siguiendo + instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al servidor en sí mismo y no a ningún usuario individual. Se utiliza para propósitos de la federación y no se debe suspender. joined: Se unió el %{date} last_active: última conexión link_verified_on: La propiedad de este vínculo fue verificada el %{date} @@ -131,6 +132,7 @@ es: follows: Sigue header: Cabecera inbox_url: URL de la bandeja de entrada + invite_request_text: Razones para unirse invited_by: Invitado por ip: IP joined: Unido @@ -255,6 +257,7 @@ es: unsuspend_account: Dejar de Suspender Cuenta update_announcement: Actualizar Anuncio update_custom_emoji: Actualizar Emoji Personalizado + update_domain_block: Actualizar el Bloqueo de Dominio update_status: Actualizar Estado actions: assigned_to_self_report: "%{name} se ha asignado la denuncia %{target} a sí mismo" @@ -295,6 +298,7 @@ es: unsuspend_account: "%{name} desactivó la suspensión de la cuenta de %{target}" update_announcement: "%{name} actualizó el anuncio %{target}" update_custom_emoji: "%{name} actualizó el emoji %{target}" + update_domain_block: "%{name} actualizó el bloqueo de dominio para %{target}" update_status: "%{name} actualizó el estado de %{target}" deleted_status: "(estado borrado)" empty: No se encontraron registros. @@ -437,6 +441,7 @@ es: instances: by_domain: Dominio delivery_available: Entrega disponible + empty: No se encontraron dominios. known_accounts: one: "%{count} cuenta conocida" other: "%{count} cuentas conocidas" @@ -583,6 +588,9 @@ es: min_invite_role: disabled: Nadie title: Permitir invitaciones de + require_invite_text: + desc_html: Cuando los registros requieren aprobación manual, haga obligatorio en la invitaciones el campo "¿Por qué quieres unirte?" en lugar de opcional + title: Requiere a los nuevos usuarios rellenar un texto de solicitud de invitación registrations_mode: modes: approved: Se requiere aprobación para registrarse @@ -751,6 +759,7 @@ es: functional: Su cuenta está totalmente operativa. pending: Su solicitud está pendiente de revisión por nuestros administradores. Eso puede tardar algún tiempo. Usted recibirá un correo electrónico si el solicitud sea aprobada. redirecting_to: Tu cuenta se encuentra inactiva porque está siendo redirigida a %{acct}. + too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo. trouble_logging_in: "¿Problemas para iniciar sesión?" use_security_key: Usar la clave de seguridad authorize_follow: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 77740e9e3..cf094478a 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -62,6 +62,7 @@ fa: one: پیگیر other: پیگیر following: پی می‌گیرد + instance_actor_flash: این حساب یک عامل مجازی است که به نمایندگی از خود کارساز استفاده می‌شود و نه هیچ یکی از کاربران. این حساب به منظور اتصال به فدراسیون استفاده می‌شود و نباید معلق شود. joined: کاربر از %{date} last_active: آخرین فعالیت link_verified_on: مالکیت این پیوند در %{date} بررسی شد @@ -128,10 +129,12 @@ fa: email_status: وضعیت ایمیل enable: به کار انداختن enabled: به کار افتاده + enabled_msg: حساب %{username} با موفقیت به کار انداخته شد followers: پیگیران follows: پی می‌گیرد header: تصویر زمینه inbox_url: نشانی صندوق ورودی + invite_request_text: دلایل‌تان برای پیوستن invited_by: دعوت‌شده از طرف ip: IP joined: عضو شده در @@ -143,6 +146,8 @@ fa: login_status: وضعیت ورود media_attachments: پیوست‌های رسانه‌ای memorialize: تبدیل به یادمان + memorialized: یادمان‌سازی شده + memorialized_msg: "%{username} با موفقیت به یک حساب یادمانی تبدیل شد" moderation: active: فعّال all: همه @@ -254,6 +259,7 @@ fa: unsuspend_account: رفع تعلیق حساب update_announcement: به‌روز رسانی اعلامیه update_custom_emoji: به‌روز رسانی اموجی سفارشی + update_domain_block: به‌روزرسانی مسدودسازی دامنه update_status: به‌روز رسانی وضعیت actions: assigned_to_self_report: "%{name} رسیدگی به گزارش %{target} را به عهده گرفت" @@ -285,13 +291,16 @@ fa: reopen_report: "%{name} گزارش %{target} را دوباره به جریان انداخت" reset_password_user: "%{name} رمز کاربر %{target} را بازنشاند" resolve_report: "%{name} گزارش %{target} را رفع کرد" + sensitive_account: "%{name} رسانهٔ %{target} را به عنوان حساس علامت‌گذاری کرد" silence_account: "%{name} حساب کاربر %{target} را خاموش (بی‌صدا) کرد" suspend_account: "%{name} حساب کاربر %{target} را تعلیق کرد" unassigned_report: "%{name} بررسی گزارش %{target} را متوقف کرد" + unsensitive_account: "%{name} علامت حساس رسانهٔ %{target} را برداشت" unsilence_account: "%{name} حساب کاربر %{target} را روشن (باصدا) کرد" unsuspend_account: "%{name} حساب کاربر %{target} را از تعلیق خارج کرد" update_announcement: "%{name} اعلامیهٔ %{target} را به‌روز کرد" update_custom_emoji: "%{name} شکلک %{target} را به‌روز کرد" + update_domain_block: "%{name} مسدودسازی دامنه را برای %{target} به‌روزرسانی کرد" update_status: "%{name} نوشتهٔ %{target} را به‌روز کرد" deleted_status: "(نوشتهٔ پاک‌شده)" empty: هیچ گزارشی پیدا نشد. @@ -434,6 +443,7 @@ fa: instances: by_domain: دامین delivery_available: پیام آماده است + empty: هیج دامنه‌ای پیدا نشد. known_accounts: one: "%{count} حساب شناخته‌شده" other: "%{count} حساب شناخته‌شده" @@ -511,6 +521,8 @@ fa: comment: none: هیچ created_at: گزارش‌شده + forwarded: هدایت شده + forwarded_to: هدایت شده به %{domain} mark_as_resolved: علامت‌گذاری به عنوان حل‌شده mark_as_unresolved: علامت‌گذاری به عنوان حل‌نشده notes: @@ -580,6 +592,9 @@ fa: min_invite_role: disabled: هیچ کس title: اجازهٔ دعوت به + require_invite_text: + desc_html: زمانی که نام‌نویسی نیازمند تایید دستی است، متن «چرا می‌خواهید عضو شود؟» بخش درخواست دعوت را به جای اختیاری، اجباری کنید + title: نیازمند پر کردن متن درخواست دعوت توسط کاربران جدید registrations_mode: modes: approved: ثبت نام نیازمند تأیید مدیران است @@ -748,6 +763,7 @@ fa: functional: حساب شما قابل استفاده است. pending: درخواست شما منتظر تأیید مسئولان سایت است و این فرایند ممکن است کمی طول بکشد. اگر درخواست شما پذیرفته شود به شما ایمیلی فرستاده خواهد شد. redirecting_to: حساب شما غیرفعال است زیرا هم‌اکنون به %{acct} منتقل شده است. + too_fast: فرم با سرعت بسیار زیادی فرستاده شد، دوباره تلاش کنید. trouble_logging_in: برای ورود مشکلی دارید؟ use_security_key: استفاده از کلید امنیتی authorize_follow: @@ -1041,6 +1057,7 @@ fa: code_hint: برای تأیید، کدی را که برنامهٔ تأییدکننده ساخته است وارد کنید description_html: اگر ورود دومرحله‌ای را با استفاده از از یک کارهٔ تأییدکننده به کار بیندازید، لازم است برای ورود، به تلفن خود که برایتان یک ژتون خواهد ساخت دسترسی داشته باشید. enable: به کار انداختن + instructions_html: "این کد QR را با برنامهٔ Google Authenticator یا برنامه‌های TOTP مشابه اسکن کنید. از این به بعد، آن برنامه کدهایی موقتی خواهد ساخت که برای ورود باید آن‌ها را وارد کنید." manual_instructions: 'اگر نمی‌توانید رمز QR را بپویید و باید دستی واردظ کنید، متن رمز این‌جاست:' setup: برپا سازی wrong_code: رمز وارد شده نامعتبر بود! آیا زمان کارساز و زمان افزاره درستند؟ @@ -1072,6 +1089,7 @@ fa: relationships: activity: فعالیت حساب dormant: غیرفعال + follow_selected_followers: پیگیری پیگیران انتخاب شده followers: پی‌گیران following: پی می‌گیرد invited: مدعو @@ -1207,6 +1225,8 @@ fa: other: "%{count} رأی" vote: رأی show_more: نمایش + show_newer: نمایش جدیدتر + show_older: نمایش قدیمی‌تر show_thread: نمایش رشته sign_in_to_participate: برای شرکت در گفتگو وارد حساب خود شوید title: '%{name}: "%{quote}"' @@ -1352,6 +1372,7 @@ fa: subject: disable: حساب %{acct} شما متوقف شده است none: هشدار برای %{acct} + sensitive: رسانه‌های فرستاده شده توسط حساب %{acct} شما برچسب حساس خورده‌اند silence: حساب %{acct} شما محدود شده است suspend: حساب %{acct} شما معلق شده است title: @@ -1399,6 +1420,7 @@ fa: success: کلید امنیتیتان با موفّقیت افزوده شد. delete: حذف delete_confirmation: مطمئنید که می‌خواهید این کلید امنیتی را حذف کنید؟ + description_html: اگر احراز هویت کلید امنیتی را فعال کنید، ورود نیازمند این خواهد بود که یکی از کلیدهای امنیتی‌تان را استفاده کنید. destroy: error: حذف کلید امنیتیتان با مشکل مواجه شد. لطفاً دوباره تلاش کنید. success: کلید امنیتیتان با موفّقیت حذف شد. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 90ed7cbe8..52195cbef 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -15,7 +15,7 @@ fr: browse_public_posts: Parcourir un flux en direct de messages publics sur Mastodon contact: Contact contact_missing: Non défini - contact_unavailable: N/D + contact_unavailable: Non disponible discover_users: Découvrez des utilisateur·rice·s documentation: Documentation federation_hint_html: Avec un compte sur %{instance}, vous pourrez suivre les gens sur n’importe quel serveur Mastodon et au-delà. @@ -33,7 +33,7 @@ fr: one: statut other: statuts status_count_before: Ayant publié - tagline: Suivez vos ami·e·s et découvrez-en de nouveaux·elles + tagline: Suivez vos ami·e·s et découvrez en de nouveaux·elles terms: Conditions d’utilisation unavailable_content: Serveurs modérés unavailable_content_description: @@ -60,6 +60,7 @@ fr: one: Abonné·e other: Abonné·e·s following: Abonnements + instance_actor_flash: Ce compte est un acteur virtuel utilisé pour représenter le serveur lui-même et non un utilisateur individuel. Il est utilisé à des fins de fédération et ne doit pas être suspendu. joined: Inscrit·e en %{date} last_active: dernière activité link_verified_on: La propriété de ce lien a été vérifiée le %{date} @@ -131,6 +132,7 @@ fr: follows: Abonnements header: Entête inbox_url: URL d’entrée + invite_request_text: Raisons de l’adhésion invited_by: Invité par ip: Adresse IP joined: Inscrit·e depuis @@ -255,6 +257,7 @@ fr: unsuspend_account: Annuler la suspension du compte update_announcement: Modifier l’annonce update_custom_emoji: Mettre à jour les émojis personnalisés + update_domain_block: Mettre à jour le blocage de domaine update_status: Mettre à jour le statut actions: assigned_to_self_report: "%{name} s’est assigné·e le signalement de %{target}" @@ -295,6 +298,7 @@ fr: unsuspend_account: "%{name} a réactivé le compte de %{target}" update_announcement: "%{name} a actualisé l’annonce %{target}" update_custom_emoji: "%{name} a mis à jour l’émoji %{target}" + update_domain_block: "%{name} a mis à jour le blocage de domaine pour %{target}" update_status: "%{name} a mis à jour le statut de %{target}" deleted_status: "(statut supprimé)" empty: Aucun journal trouvé. @@ -437,6 +441,7 @@ fr: instances: by_domain: Domaine delivery_available: Livraison disponible + empty: Aucun domaine trouvé. known_accounts: one: "%{count} compte connu" other: "%{count} comptes connus" @@ -514,6 +519,8 @@ fr: comment: none: Aucun created_at: Signalé + forwarded: Transféré + forwarded_to: Transféré à %{domain} mark_as_resolved: Marquer comme résolu mark_as_unresolved: Marquer comme non-résolu notes: @@ -583,6 +590,9 @@ fr: min_invite_role: disabled: Personne title: Autoriser les invitations par + require_invite_text: + desc_html: Lorsque les enregistrements nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif + title: Exiger que les nouveaux utilisateurs remplissent un texte de demande d’invitation registrations_mode: modes: approved: Approbation requise pour s’inscrire @@ -751,6 +761,7 @@ fr: functional: Votre compte est entièrement opérationnel. pending: Votre demande est en attente d'examen par notre personnel. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée. redirecting_to: Votre compte est inactif car il est actuellement redirigé vers %{acct}. + too_fast: Formulaire envoyé trop rapidement, veuillez réessayer. trouble_logging_in: Vous avez un problème pour vous connecter ? use_security_key: Utiliser la clé de sécurité authorize_follow: @@ -1092,7 +1103,7 @@ fr: status: État du compte remote_follow: acct: Entrez l’adresse profil@serveur depuis laquelle vous voulez effectuer cette action - missing_resource: L’URL de redirection n’a pas pu être trouvée + missing_resource: L’URL de redirection requise pour votre compte n’a pas pu être trouvée no_account_html: Vous n’avez pas de compte ? Vous pouvez vous inscrire ici proceed: Confirmer l’abonnement prompt: 'Vous allez suivre :' diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 89da4bf82..6d648082f 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -255,6 +255,7 @@ gl: unsuspend_account: Retirar suspensión de conta update_announcement: Actualizar anuncio update_custom_emoji: Actualizar emoticona personalizada + update_domain_block: Actualizar bloqueo do dominio update_status: Actualizar estado actions: assigned_to_self_report: "%{name} atribuíu a denuncia %{target} a el mesmo" @@ -295,6 +296,7 @@ gl: unsuspend_account: "%{name} desactivou a suspensión da conta de %{target}" update_announcement: "%{name} actualizou o anuncio %{target}" update_custom_emoji: "%{name} actualizou a emoticona %{target}" + update_domain_block: "%{name} actualizou o bloqueo do dominio %{target}" update_status: "%{name} actualizou o estado de %{target}" deleted_status: "(estado eliminado)" empty: Non se atoparon rexistros. @@ -437,6 +439,7 @@ gl: instances: by_domain: Dominio delivery_available: Entrega dispoñíbel + empty: Non se atopan dominios. known_accounts: one: "%{count} conta coñecida" other: "%{count} contas coñecidas" @@ -514,6 +517,8 @@ gl: comment: none: Ningún created_at: Denunciado + forwarded: Reenviado + forwarded_to: Reenviado a %{domain} mark_as_resolved: Marcar como resolto mark_as_unresolved: Marcar como non resolto notes: @@ -583,6 +588,9 @@ gl: min_invite_role: disabled: Ninguén title: Permitir convites por + require_invite_text: + desc_html: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo + title: Require que as novas usuarias completen solicitude de texto do convite registrations_mode: modes: approved: Precisa aprobación para rexistrarse @@ -751,6 +759,7 @@ gl: functional: A súa conta está totalmente operativa. pending: A túa aplicación está pendente de revisión. Poderíanos levar algún tempo. Recibirás un correo se a aplicación está aprobada. redirecting_to: A túa conta está inactiva porque está redirixida a %{acct}. + too_fast: Formulario enviado demasiado rápido, inténtao outra vez. trouble_logging_in: Problemas para conectar? use_security_key: Usa chave de seguridade authorize_follow: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 1a112c53a..ef6ec3089 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -60,6 +60,7 @@ hu: one: Követő other: Követő following: Követett + instance_actor_flash: Ez a fiók virtuális és magát a szervert reprezentálja, nem egy konkrét felhasználót. Föderációs okok miatt létezik és nem szabad felfüggeszteni. joined: Csatlakozott %{date} last_active: utoljára aktív link_verified_on: A link tulajdonosát %{date} -n ellenőriztük @@ -131,6 +132,7 @@ hu: follows: Követett header: Fejléc inbox_url: Beérkezett üzenetek URL-je + invite_request_text: Csatlakozás oka invited_by: Meghívta ip: IP joined: Csatlakozott @@ -255,6 +257,7 @@ hu: unsuspend_account: Fiók felfüggesztésének feloldása update_announcement: Közlemény frissítése update_custom_emoji: Egyéni emodzsi frissítése + update_domain_block: Domain blokkolás frissítése update_status: Állapot frissítése actions: assigned_to_self_report: "%{name} a %{target} bejelentést magához rendelte" @@ -295,6 +298,7 @@ hu: unsuspend_account: "%{name} feloldotta %{target} felhasználói fiókjának felfüggesztését" update_announcement: "%{name} frissítette a közleményt %{target}" update_custom_emoji: "%{name} frissítette az alábbi emodzsit: %{target}" + update_domain_block: "%{name} frissítette a(z) %{target} domain blokkolását" update_status: "%{name} frissítette %{target} felhasználó tülkjét" deleted_status: "(törölt tülk)" empty: Nem található napló. @@ -437,6 +441,7 @@ hu: instances: by_domain: Domain delivery_available: Kézbesítés elérhető + empty: Nem található domain. known_accounts: one: "%{count} ismert fiók" other: "%{count} ismert fiók" @@ -514,6 +519,8 @@ hu: comment: none: Egyik sem created_at: Jelentve + forwarded: Továbbítva + forwarded_to: Továbbítva neki %{domain} mark_as_resolved: Megjelölés megoldottként mark_as_unresolved: Megjelölés megoldatlanként notes: @@ -583,6 +590,9 @@ hu: min_invite_role: disabled: Senki title: Meghívások engedélyezése + require_invite_text: + desc_html: Ha a regisztrációhoz kézi jóváhagyásra van szükség, akkor a „Miért akarsz csatlakozni?” válasz kitöltése legyen kötelező, és ne opcionális + title: Az új felhasználóktól legyen megkövetelve a meghívási kérés szövegének kitöltése registrations_mode: modes: approved: A regisztráció engedélyhez kötött @@ -751,6 +761,7 @@ hu: functional: A fiókod teljesen működőképes. pending: A jelentkezésed engedélyezésre vár. Ez eltarthat egy ideig. Kapsz egy e-mailt, ha az elbírálás megtörtént. redirecting_to: A fiókod inaktív, mert jelenleg ide %{acct} van átirányítva. + too_fast: Túl gyorsan küldted el az űrlapot, próbáld később. trouble_logging_in: Problémád van a bejelentkezéssel? use_security_key: Biztonsági kulcs használata authorize_follow: diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 2ea895b63..1afd4d927 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -248,6 +248,7 @@ hy: empty: Ոչ մի գրառում չկայ։ filter_by_action: Զտել ըստ գործողութեան filter_by_user: Զտել ըստ օգտատիրոջ + title: Ստուգման մատեան announcements: destroyed_msg: Յայտարարութիւնը բարեյաջող ջնջուեց edit: @@ -278,6 +279,7 @@ hy: list: Ցանկ listed: Ցուցակագրուած overwrite: Վերագրել + shortcode: Հապավում uncategorized: Չդասակարգուած unlist: Ապացուցակագրում unlisted: Ծածուկ @@ -392,6 +394,7 @@ hy: enabled: Միացված է save_and_enable: Պահպանել եւ միացնել status: Կարգավիճակ + title: Վերահեռարձակիչներ reports: account: notes: @@ -491,6 +494,7 @@ hy: subject: Նոր բողոք %{instance}ի համար(#%{id}) appearance: advanced_web_interface: Սյունակավոր ինտերֆեյս + advanced_web_interface_hint: Եթէ ցանկանում ես օգտագործել էկրանիդ ամբողջ լայնքը, ապա ընդլայնուած վեբ ինտերֆեյսով հնարաւոր է էկրանը բաժանել սիւնակների՝ զուգահեռ տեսնելու տարբեր տիպի ինֆորմացիա՝ տեղական հոսքը, ծանուցումները, ֆեդերացված հոսքը, և ցանկացած թվի ցուցակ ու հեշթեգ։ animations_and_accessibility: Անիմացիաներ եւ հասանելիութիւն discovery: Բացայայտում localization: @@ -715,6 +719,7 @@ hy: public_timelines: Հանրային հոսք relationships: activity: Հաշուի ակտիւութիւնը + dormant: Չգօրծող followers: Հետեւորդներ following: Հետեւում ես invited: Հրաւիրուած է @@ -763,6 +768,7 @@ hy: windows_mobile: Windows Mobile windows_phone: Windows Phone revoke: Չեղարկել + title: Սեսսիա settings: account: Հաշիվ appearance: Տեսք @@ -770,6 +776,7 @@ hy: development: Ծրագրավորում edit_profile: Խմբագրել պրոֆիլը export: Տվյալների արտահանում + identity_proofs: Անձի նոյնացումներ import: Ներմուծել import_and_export: Ներմուծել և արտահանել migrate: Հաշուի տեղափոխում diff --git a/config/locales/id.yml b/config/locales/id.yml index cb9dcb149..fdd87027e 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -251,6 +251,7 @@ id: unsuspend_account: Lepas Status Tangguh Akun update_announcement: Perbarui Pengumuman update_custom_emoji: Perbarui Emoji Khusus + update_domain_block: Perbarui Blokir Domain update_status: Perbarui Status actions: assigned_to_self_report: "%{name} menugaskan laporan %{target} kpd dirinya sendiri" @@ -291,6 +292,7 @@ id: unsuspend_account: "%{name} menghapus penangguhan akun %{target}" update_announcement: "%{name} memperbarui pengumuman %{target}" update_custom_emoji: "%{name} memperbarui emoji %{target}" + update_domain_block: "%{name} memperbarui blokir domain untuk %{target}" update_status: "%{name} memperbarui status %{target}" deleted_status: "(status dihapus)" empty: Log tidak ditemukan. @@ -432,6 +434,7 @@ id: instances: by_domain: Domain delivery_available: Pengiriman tersedia + empty: Domain tidak ditemukan. known_accounts: other: "%{count} akun yang dikenal" moderation: diff --git a/config/locales/is.yml b/config/locales/is.yml index a011322e4..75b80a45d 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -131,6 +131,7 @@ is: follows: Fylgist með header: Haus inbox_url: Slóð á innhólf + invite_request_text: Ástæður fyrir þátttöku invited_by: Boðið af ip: IP-vistfang joined: Gerðist þátttakandi @@ -255,6 +256,7 @@ is: unsuspend_account: Taka notandaaðgang úr bið update_announcement: Uppfæra tilkynningu update_custom_emoji: Uppfæra sérsniðið tjáningartákn + update_domain_block: Uppfæra útilokun léns update_status: Uppfæra stöðufærslu actions: assigned_to_self_report: "%{name} úthlutaði skýrslu %{target} til sín" @@ -295,6 +297,7 @@ is: unsuspend_account: "%{name} tók notandaaðganginn %{target} úr bið" update_announcement: "%{name} uppfærði auglýsingu %{target}" update_custom_emoji: "%{name} uppfærði tjáningartákn %{target}" + update_domain_block: "%{name} uppfærði útilokun lénsins %{target}" update_status: "%{name} uppfærði stöðufærslu frá %{target}" deleted_status: "(eydd stöðufærsla)" empty: Engar atvikaskrár fundust. @@ -437,6 +440,7 @@ is: instances: by_domain: Lén delivery_available: Afhending er til taks + empty: Engin lén fundust. known_accounts: one: "%{count} þekktur notandaaðgangur" other: "%{count} þekktir notendaaðgangar" @@ -514,6 +518,8 @@ is: comment: none: Ekkert created_at: Tilkynnt + forwarded: Áframsent + forwarded_to: Áframsent á %{domain} mark_as_resolved: Merkja sem leyst mark_as_unresolved: Merkja sem óleyst notes: @@ -583,6 +589,9 @@ is: min_invite_role: disabled: Enginn title: Leyfa boð frá + require_invite_text: + desc_html: Þegar nýskráningar krefjast handvirks samþykkis, skal gera "Hvers vegna viltu taka þátt?" boðstexta að skyldu fremur en valkvæðan + title: Krefja nýja notendur um að fylla út boðstexta registrations_mode: modes: approved: Krafist er samþykkt nýskráningar @@ -751,6 +760,7 @@ is: functional: Notandaaðgangurinn þinn er með fulla virkni. pending: Umsóknin þín bíður eftir að starfsfólkið okkar fari yfir hana. Það gæti tekið nokkurn tíma. Þú munt fá tölvupóst ef umsóknin er samþykkt. redirecting_to: Notandaaðgangurinn þinn er óvirkur vegna þess að hann endurbeinist á %{acct}. + too_fast: Innfyllingarform sent inn of hratt, prófaðu aftur. trouble_logging_in: Vandræði við að skrá inn? use_security_key: Nota öryggislykil authorize_follow: @@ -842,6 +852,7 @@ is: request: Biddu um safnskrána þína size: Stærð blocks: Þú útilokar + bookmarks: Bókamerki csv: CSV domain_blocks: Útilokanir á lénum lists: Listar @@ -918,6 +929,7 @@ is: success: Það tókst að senda inn gögnin þín og verður unnið með þau þegar færi gefst types: blocking: Listi yfir útilokanir + bookmarks: Bókamerki domain_blocking: Listi yfir útilokanir léna following: Listi yfir þá sem fylgst er með muting: Listi yfir þagganir diff --git a/config/locales/it.yml b/config/locales/it.yml index 24ccc7d76..5ca2fae92 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -60,6 +60,7 @@ it: one: Seguace other: Seguaci following: Segui + instance_actor_flash: Questo account è un attore virtuale usato per rappresentare il server stesso e non un singolo utente. Viene utilizzato per scopi federativi e non dovrebbe essere sospeso. joined: Dal %{date} last_active: ultima attività link_verified_on: La proprietà di questo link è stata controllata il %{date} @@ -131,6 +132,7 @@ it: follows: Segue header: Intestazione inbox_url: URL inbox + invite_request_text: Motivi per l'iscrizione invited_by: Invitato da ip: IP joined: Iscritto da @@ -255,6 +257,7 @@ it: unsuspend_account: Annulla la sospensione dell'account update_announcement: Aggiorna annuncio update_custom_emoji: Aggiorna emoji personalizzata + update_domain_block: Aggiorna blocco di dominio update_status: Aggiorna stato actions: assigned_to_self_report: "%{name} ha assegnato il rapporto %{target} a se stesso" @@ -295,6 +298,7 @@ it: unsuspend_account: "%{name} ha annullato la sospensione dell'account di %{target}" update_announcement: "%{name} ha aggiornato l'annuncio %{target}" update_custom_emoji: "%{name} ha aggiornato l'emoji %{target}" + update_domain_block: "%{name} ha aggiornato il blocco di dominio per %{target}" update_status: "%{name} stato aggiornato da %{target}" deleted_status: "(stato cancellato)" empty: Nessun log trovato. @@ -437,6 +441,7 @@ it: instances: by_domain: Dominio delivery_available: Distribuzione disponibile + empty: Nessun dominio trovato. known_accounts: one: "%{count} account noto" other: "%{count} account noti" @@ -514,6 +519,8 @@ it: comment: none: Nessuno created_at: Segnalato + forwarded: Inoltrato + forwarded_to: Inoltrato a %{domain} mark_as_resolved: Segna come risolto mark_as_unresolved: Segna come non risolto notes: @@ -583,6 +590,9 @@ it: min_invite_role: disabled: Nessuno title: Permetti inviti da + require_invite_text: + desc_html: Quando le iscrizioni richiedono l'approvazione manuale, rendere la richiesta “Perché si desidera iscriversi?” obbligatoria invece che opzionale + title: Richiedi ai nuovi utenti di rispondere alla richiesta di motivazione per l'iscrizione registrations_mode: modes: approved: Approvazione richiesta per le iscrizioni @@ -753,6 +763,7 @@ it: functional: Il tuo account è pienamente operativo. pending: La tua richiesta è in attesa di esame da parte del nostro staff. Potrebbe richiedere un po' di tempo. Riceverai una e-mail se la richiesta è approvata. redirecting_to: Il tuo account è inattivo perché attualmente reindirizza a %{acct}. + too_fast: Modulo inviato troppo velocemente, riprova. trouble_logging_in: Problemi di accesso? use_security_key: Usa la chiave di sicurezza authorize_follow: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 4d195c448..db9e41f74 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -57,6 +57,7 @@ ja: followers: other: フォロワー following: フォロー中 + instance_actor_flash: このアカウントは、個々のユーザーではなく、サーバー自体を表すために使用される仮想のユーザーです。 連合のために使用されるため、停止しないで下さい。 joined: "%{date} に登録" last_active: 最後の活動 link_verified_on: このリンクの所有権は %{date} に確認されました @@ -127,6 +128,7 @@ ja: follows: フォロー数 header: ヘッダー inbox_url: Inbox URL + invite_request_text: 登録理由 invited_by: 招待した人 ip: IP joined: 登録日 @@ -138,6 +140,7 @@ ja: login_status: ログイン media_attachments: 添付されたメディア memorialize: 追悼アカウント化 + memorialized: 追悼化済み memorialized_msg: "%{username} を追悼アカウント化しました" moderation: active: アクティブ @@ -159,6 +162,7 @@ ja: public: パブリック push_subscription_expires: PuSH購読期限 redownload: プロフィールを更新 + redownloaded_msg: "%{username} のプロフィールを正常に更新しました" reject: 却下 reject_all: すべて却下 rejected_msg: "%{username} の登録申請を却下しました" @@ -201,7 +205,9 @@ ja: undo_sensitized: 閲覧注意から戻す undo_silenced: サイレンスから戻す undo_suspension: 停止から戻す + unsilenced_msg: "%{username} のサイレンス解除に成功しました" unsubscribe: 購読の解除 + unsuspended_msg: "%{username} の無効化を解除しました" username: ユーザー名 view_domain: ドメインの概要を表示 warn: 警告 @@ -247,6 +253,7 @@ ja: unsuspend_account: アカウントの停止を解除 update_announcement: お知らせを更新 update_custom_emoji: カスタム絵文字を更新 + update_domain_block: ドメインブロックを更新 update_status: トゥートを更新 actions: assigned_to_self_report: "%{name} さんが通報 %{target} を自身の担当に割り当てました" @@ -287,6 +294,7 @@ ja: unsuspend_account: "%{name} さんが %{target} さんの停止を解除しました" update_announcement: "%{name} さんがお知らせ %{target} を更新しました" update_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を更新しました" + update_domain_block: "%{name} が %{target} のドメインブロックを更新しました" update_status: "%{name} さんが %{target} さんのトゥートを更新しました" deleted_status: "(削除済)" empty: ログが見つかりませんでした @@ -428,6 +436,7 @@ ja: instances: by_domain: ドメイン delivery_available: 配送可能 + empty: ドメインが見つかりませんでした。 known_accounts: other: 既知のアカウント数 %{count} moderation: @@ -502,6 +511,8 @@ ja: comment: none: なし created_at: 通報日時 + forwarded: 転送済み + forwarded_to: "%{domain} に転送されました" mark_as_resolved: 解決済みとしてマーク mark_as_unresolved: 未解決として再び開く notes: @@ -739,6 +750,7 @@ ja: functional: アカウントは完全に機能しています。 pending: あなたの申請は現在サーバー管理者による審査待ちです。これにはしばらくかかります。申請が承認されるとメールが届きます。 redirecting_to: アカウントは %{acct} に引っ越し設定されているため非アクティブになっています。 + too_fast: フォームの送信が速すぎます。もう一度やり直してください。 trouble_logging_in: ログインできませんか? use_security_key: セキュリティキーを使用 authorize_follow: @@ -765,6 +777,7 @@ ja: date: formats: default: "%Y年%m月%d日" + with_month_name: "%Y年%m月%d日" datetime: distance_in_words: about_x_hours: "%{count}時間" diff --git a/config/locales/kab.yml b/config/locales/kab.yml index fe042301d..403f2b2e7 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -183,6 +183,7 @@ kab: remove_avatar_user: Kkes avaṭar reset_password_user: Ales awennez n wawal n uffir silence_account: Sgugem amiḍan + update_domain_block: Leqqem iḥder n taɣult actions: assigned_to_self_report: "%{name} imudd aneqqis %{target} i yiman-nsen" change_email_user: "%{name} ibeddel imayl n umseqdac %{target}" @@ -215,6 +216,7 @@ kab: unsilence_account: "%{name} yekkes asgugem n umiḍan n %{target}" update_announcement: "%{name} ileqqem taselɣut %{target}" update_custom_emoji: "%{name} yelqem imuji %{target}" + update_domain_block: "%{name} ileqqem iḥder n taɣult i %{target}" update_status: "%{name} yelqem tasuffeɣt n %{target}" deleted_status: "(tasuffeɣt tettwakkes)" empty: Ulac iɣmisen i yellan. @@ -304,6 +306,7 @@ kab: instances: by_domain: Taγult delivery_available: Yella usiweḍ + empty: Ulac taɣultin yettwafen. known_accounts: one: "%{count} n umiḍan i yettwasnen" other: "%{count} n yimiḍanen i yettwassnen" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index f8043534a..c7b63fbf7 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -57,6 +57,7 @@ ko: followers: other: 팔로워 following: 팔로잉 + instance_actor_flash: 이 계정은 서버 자신을 나타내기 위한 가상의 계정이며 개인 사용자가 아닙니다. 이 계정은 연합을 위해 사용되며 정지되지 않아야 합니다. joined: "%{date}에 가입함" last_active: 최근 활동 link_verified_on: "%{date}에 이 링크의 소유가 확인되었습니다" @@ -108,7 +109,7 @@ ko: confirm: 확인 confirmed: 확인됨 confirming: 확인 중 - delete: 데이터 식제 + delete: 데이터 삭제 deleted: 삭제됨 demote: 강등 destroyed_msg: "%{username}의 데이터는 곧 삭제되도록 큐에 들어갔습니다" @@ -251,6 +252,7 @@ ko: unsuspend_account: 계정 정지 취소 update_announcement: 공지사항 업데이트 update_custom_emoji: 커스텀 에모지 업데이트 + update_domain_block: 도메인 차단 갱신 update_status: 게시물 게시 actions: assigned_to_self_report: "%{name}이 리포트 %{target}을 자신에게 할당했습니다" @@ -291,6 +293,7 @@ ko: unsuspend_account: "%{name}이 %{target}에 대한 정지를 해제했습니다" update_announcement: "%{name} 님이 공지 %{target}을 갱신했습니다" update_custom_emoji: "%{name}이 에모지 %{target}를 업데이트 했습니다" + update_domain_block: "%{name} 님이 %{target}에 대한 도메인 차단을 갱신했습니다" update_status: "%{name}이 %{target}의 상태를 업데이트 했습니다" deleted_status: "(삭제됨)" empty: 로그를 찾을 수 없습니다 @@ -434,6 +437,7 @@ ko: instances: by_domain: 도메인 delivery_available: 전송 가능 + empty: 도메인이 하나도 없습니다. known_accounts: other: 알려진 계정 %{count}개 moderation: @@ -508,6 +512,8 @@ ko: comment: none: 없음 created_at: 리포트 시각 + forwarded: 전달됨 + forwarded_to: "%{domain}에게 전달됨" mark_as_resolved: 해결 완료 처리 mark_as_unresolved: 미해결로 표시 notes: @@ -577,6 +583,9 @@ ko: min_invite_role: disabled: 아무도 못 하게 title: 초대링크를 만들 수 있는 권한 + require_invite_text: + desc_html: 가입이 수동 승인을 필요로 할 때, "왜 가입하려고 하나요?" 항목을 선택사항으로 두는 것보다는 필수로 두는 것이 낫습니다 + title: 새 사용자가 초대 요청 글을 작성해야 하도록 registrations_mode: modes: approved: 가입하려면 승인이 필요함 @@ -745,6 +754,7 @@ ko: functional: 계정이 완벽히 작동합니다. pending: 당신의 가입 신청은 스태프의 검사를 위해 대기중입니다. 이것은 시간이 다소 소요됩니다. 가입 신청이 승인 될 경우 이메일을 받게 됩니다. redirecting_to: 계정이 %{acct}로 리다이렉트 중이기 때문에 비활성 상태입니다. + too_fast: 너무 빠르게 양식이 제출되었습니다, 다시 시도하세요. trouble_logging_in: 로그인 하는데 문제가 있나요? use_security_key: 보안 키 사용 authorize_follow: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index d7232b6ff..0d76e1b97 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -188,6 +188,8 @@ ku: search: گەڕان search_same_email_domain: بەکارهێنەرانی دیکە بە ئیمەیلی یەکسان search_same_ip: بەکارهێنەرانی تر بەهەمان ئای پی + sensitive: هەستیار + sensitized: وەک هەستیار نیشان کراوە shared_inbox_url: بەستەری سندوقی هاوبەشکراو show: created_reports: گوزارشتی تۆمارکراوە @@ -202,6 +204,7 @@ ku: time_in_queue: چاوەڕوانی لە ڕیزدا %{time} title: هەژمارەکان unconfirmed_email: ئیمەیڵی پشتڕاستنەکراو + undo_sensitized: " هەستیار نەکردن" undo_silenced: بێدەنگ ببە undo_suspension: دووبارە ڕاگرتن unsilenced_msg: هەژماری %{username} بە سەرکەوتوویی بێسنوور کرا @@ -243,9 +246,11 @@ ku: reopen_report: دووبارە کردنەوەی گوزارشت reset_password_user: گەڕانەوەی تێپەڕوشە resolve_report: گوزارشت چارەسەربکە + sensitive_account: میدیاکە لە هەژمارەکەت وەک هەستیار نیشانە بکە silence_account: هەژماری بێدەنگی suspend_account: ڕاگرتنی هەژمارە unassigned_report: گوزارشتی دیارینەکراو + unsensitive_account: میدیاکە لە هەژمارەکەت وەک هەستیار نیشانە مەکە unsilence_account: هەژماری بێ دەنگ unsuspend_account: هەژماری هەڵنەوەستێنراو update_announcement: بەڕۆژکردنەوەی راگەیەندراو @@ -281,9 +286,11 @@ ku: reopen_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە" reset_password_user: "%{name} تێپەروشەی بەکارهێنەری %{target} گەڕانەوە" resolve_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە" + sensitive_account: "%{name} بە %{target}'s میدیا وەک هەستیار دیاری کراوە" silence_account: "%{name} هەژماری %{target}'s بێدەنگ کرا" suspend_account: "%{name} هەژماری %{target}'ی ڕاگیرا" unassigned_report: "%{name} ڕاپۆرتی دیاری نەکراوی %{target}" + unsensitive_account: "%{name} بە %{target}'s میدیا وەک هەستیار دیاری نەکراوە" unsilence_account: "%{name} هەژماری %{target}'s بێ دەنگ" unsuspend_account: "%{name} هەژماری %{target}'s هەڵنەپەسێردراو" update_announcement: "%{name} بەڕۆژکراوەی راگەیاندنی %{target}" @@ -835,6 +842,7 @@ ku: request: داوای ئەرشیفەکەت بکە size: قەبارە blocks: تۆ بلۆک دەکەیت + bookmarks: نیشانکراوەکان csv: CSV domain_blocks: دۆمەین قەپاتکرا lists: لیستەکان @@ -911,6 +919,7 @@ ku: success: داتاکەت بە سەرکەوتوویی بارکرا و ئێستا لە کاتی خۆیدا پرۆسێس دەکرێت types: blocking: لیستی بلۆککردن + bookmarks: نیشانەکان domain_blocking: لیستی بلۆککردنی دۆمەین following: لیستی خوارەوە muting: لیستی کپکردنەوە @@ -961,6 +970,7 @@ ku: incoming_migrations: گواستنەوە لە هەژمارەی جیاواز incoming_migrations_html: بۆ گواستنەوە لە هەژمارەیەکی ترەوە بۆ ئەم هەژمارە، سەرەتا پێویستە ئەژمێرێک دروست بکەی. moved_msg: هەژمارەکەت ئێستا دووبارە ئاڕاستە دەکرێتەوە بۆ %{acct} و شوێنکەوتوانی تۆ گواستراوەتەوە بۆ ئەوێ. + not_redirecting: هەژمارەکەت لە ئێستادا دووبارە ئاڕاستە ناکرێتەوە بۆ هیچ هەژمارەیەکی دیکە. on_cooldown: تۆ بەم دواییە هەژمارەکەت کۆچ کردووە. ئەم کارە لە رۆژەکانی %{count} دا جارێکی تر بەردەست دەبێت. past_migrations: گەواستنەوەکانی ڕابردوو proceed_with_move: شوێنکەوتوان بگوازەوە @@ -1066,6 +1076,7 @@ ku: relationships: activity: چالاکی هەژمارە dormant: ناچالاک + follow_selected_followers: شوێنکەوتوان دیاریکراو بکە followers: شوێنکەوتوان following: شوێن‌کەوتووی invited: بانگهێشتەکان @@ -1201,6 +1212,8 @@ ku: other: "%{count} دەنگەکان" vote: دەنگ show_more: زیاتر پیشان بدە + show_newer: نوێتر پیشان بدە + show_older: پیشاندانی کۆنتر show_thread: نیشاندانی ڕشتە sign_in_to_participate: بچۆ ژوورەوە بۆ بەشداریکردن لە گفتوگۆکەدا title: '%{name}: "%{quote}"' @@ -1333,6 +1346,7 @@ ku: warning: explanation: disable: تا کاتێک هەژمارەی ئێوە نەوێستاوە، دراوەکانی ئێوە دەستکاری ناکرێت.بەڵام تا کاتێک کە هەژمارەکەتان ناکرێتەوە. ناتوانن هیچ ئیشێکی لەسەر بکەن. + sensitive: پەڕگە میدیایە بارکراوەکانت و میدیا لینککراوەکانت وەک هەستیار مامەڵەیان لەگەڵ دەکرێت. silence: تا کاتیک هەژمارەکەتان سنووردار بێت، تەنها ئەو کەسانە کە پێشتر شوێنکەوتووی ئێوە بوون نووسراوەکانی ئێوە لەم ڕاژە دەبینن. شایەد ئێوە لە زۆر پێرستی گشتی دیار نەکەون؛ بەڵام خەڵکانی دیکە دەتوانن بە دڵی خۆیان پەیگیری ئێوە بن. suspend: هەژمارەکەتان هەڵواسراوە، وە تەواو توت و میدیاکان کە لەسەر ئەم ڕاژە بارتان کردووە یان ئەو ڕاژانە کە شوێنکەوتووتان لە سەری بووە ئیتر ناگەڕێنەوە. get_in_touch: بە وڵام دانەوەی ئەم ئیمەیلە دەتوانن لە گەڵ لیژنەی %{instance} لە پەیوەندی بن. @@ -1341,11 +1355,13 @@ ku: subject: disable: هەژمارەکەت %{acct} بەستراوە none: ئاگاداری بۆ %{acct} + sensitive: هەژمارەکەت %{acct} میدیایەکی پۆست کردن بە هەستیار نیشان کراوە silence: هەژمارەکەی %{acct} سنووردار کراوە suspend: هەژمارەکەی %{acct} ڕاگیرا title: disable: هەژمارە بەستراوە none: ئاگاداری + sensitive: میدیاکەت بە هەستیار نیشان کراوە silence: هەژماری سنووردار suspend: هەژمار ڕاگیرا welcome: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index fe268d546..d9c4e20fa 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -98,6 +98,7 @@ nl: add_email_domain_block: E-maildomein blokkeren approve: Goedkeuren approve_all: Alles goedkeuren + approved_msg: Het goedkeuren van het registratieverzoek van %{username} is geslaagd are_you_sure: Weet je het zeker? avatar: Avatar by_domain: Domein @@ -111,8 +112,10 @@ nl: confirm: Bevestigen confirmed: Bevestigd confirming: Bevestiging + delete: Gegevens verwijderen deleted: Verwijderd demote: Degraderen + destroyed_msg: De verwijdering van de gegevens van %{username} staat nu in de wachtrij disable: Bevriezen disable_two_factor_authentication: 2FA uitschakelen disabled: Bevroren @@ -123,6 +126,7 @@ nl: email_status: E-mailstatus enable: Ontdooien enabled: Ingeschakeld + enabled_msg: Het ontdooien van het account van %{username} is geslaagd followers: Volgers follows: Volgt header: Omslagfoto @@ -137,7 +141,9 @@ nl: title: Locatie login_status: Loginstatus media_attachments: Mediabijlagen - memorialize: In gedenkpagina veranderen + memorialize: Naar een In memoriam veranderen + memorialized: In memoriam + memorialized_msg: Het naar een In memoriam veranderen van het account van %{username} is geslaagd moderation: active: Actief all: Alles @@ -158,10 +164,14 @@ nl: public: Openbaar push_subscription_expires: PuSH-abonnement verloopt op redownload: Profiel vernieuwen + redownloaded_msg: Het herstellen van het oorspronkelijke profiel van %{username} is geslaagd reject: Afkeuren reject_all: Alles afkeuren + rejected_msg: Het afwijzen van het registratieverzoek van %{username} is geslaagd remove_avatar: Avatar verwijderen remove_header: Omslagfoto verwijderen + removed_avatar_msg: Het verwijderen van de avatar van %{username} is geslaagd + removed_header_msg: Het verwijderen van de omslagfoto van %{username} is geslaagd resend_confirmation: already_confirmed: Deze gebruiker is al bevestigd send: Verzend bevestigingsmail opnieuw @@ -178,6 +188,8 @@ nl: search: Zoeken search_same_email_domain: Andere gebruikers met hetzelfde e-maildomein search_same_ip: Andere gebruikers met hetzelfde IP-adres + sensitive: Gevoelig + sensitized: als gevoelig gemarkeerd shared_inbox_url: Gedeelde inbox-URL show: created_reports: Aangemaakte rapportages @@ -187,9 +199,12 @@ nl: statuses: Toots subscribe: Abonneren suspended: Opgeschort + suspension_irreversible: De gegevens van dit account zijn onomkeerbaar verwijderd. Je kunt het opschorten van dit account ongedaan maken zodat het weer valt te gebruiken, maar de verwijderde gegevens worden hiermee niet hersteld. + suspension_reversible_hint_html: Dit account is opgeschort en de gegevens worden volledig verwijderd op %{date}. Tot die tijd kan dit account worden hersteld zonder nadelige gevolgen. Wanneer je alle gegevens van dit account onmiddellijk wilt verwijderen, kun je dit hieronder doen. time_in_queue: "%{time} in de wachtrij" title: Accounts unconfirmed_email: Onbevestigd e-mailadres + undo_sensitized: Niet meer als gevoelig markeren undo_silenced: Niet langer negeren undo_suspension: Niet langer opschorten unsubscribe: Opzeggen @@ -208,19 +223,21 @@ nl: create_domain_allow: Domeingoedkeuring aanmaken create_domain_block: Domeinblokkade aanmaken create_email_domain_block: E-maildomeinblokkade aanmaken + create_ip_block: IP-regel aanmaken demote_user: Gebruiker degraderen destroy_announcement: Mededeling verwijderen destroy_custom_emoji: Lokale emoji verwijderen destroy_domain_allow: Domeingoedkeuring verwijderen destroy_domain_block: Domeinblokkade verwijderen destroy_email_domain_block: E-maildomeinblokkade verwijderen + destroy_ip_block: IP-regel verwijderen destroy_status: Toot verwijderen disable_2fa_user: Tweestapsverificatie uitschakelen disable_custom_emoji: Lokale emojij uitschakelen disable_user: Gebruiker uitschakelen enable_custom_emoji: Lokale emoji inschakelen enable_user: Gebruiker inschakelen - memorialize_account: Account in gedenkpagina veranderen + memorialize_account: Het account in een In memoriam veranderen promote_user: Gebruiker promoveren remove_avatar_user: Avatar verwijderen reopen_report: Rapportage heropenen @@ -256,7 +273,7 @@ nl: disable_user: Inloggen voor %{target} is door %{name} uitgeschakeld enable_custom_emoji: Emoji %{target} is door %{name} ingeschakeld enable_user: Inloggen voor %{target} is door %{name} ingeschakeld - memorialize_account: Account %{target} is door %{name} in een gedenkpagina veranderd + memorialize_account: Het account %{target} is door %{name} in een In memoriam veranderd promote_user: Gebruiker %{target} is door %{name} gepromoveerd remove_avatar_user: "%{name} verwijderde de avatar van %{target}" reopen_report: "%{name} heeft rapportage %{target} heropend" @@ -434,6 +451,21 @@ nl: expired: Verlopen title: Filter title: Uitnodigingen + ip_blocks: + add_new: Regel aanmaken + created_msg: Het toevoegen van een nieuwe IP-regel is geslaagd + delete: Verwijderen + expires_in: + '1209600': 2 weken + '15778476': 6 maanden + '2629746': 1 maand + '31556952': 1 jaar + '86400': 1 dag + '94670856': 3 jaar + new: + title: Nieuwe IP-regel aanmaken + no_ip_block_selected: Er zijn geen IP-regels veranderd, omdat er geen een was geselecteerd + title: IP-regels pending_accounts: title: Accounts in afwachting (%{count}) relationships: @@ -681,8 +713,11 @@ nl: prefix_sign_up: Registreer je vandaag nog op Mastodon! suffix: Met een account ben je in staat om mensen te volgen, berichten te plaatsen en uit te wisselen met mensen die zich op andere Mastodonservers bevinden en meer! didnt_get_confirmation: Geen bevestigingsinstructies ontvangen? + dont_have_your_security_key: Heb je jouw beveiligingssleutel niet bij de hand? forgot_password: Wachtwoord vergeten? invalid_reset_password_token: De code om jouw wachtwoord opnieuw in te stellen is verlopen. Vraag een nieuwe aan. + link_to_otp: Voer een tweestapsverificatiecode van je telefoon of een herstelcode in + link_to_webauth: Jouw apparaat met de authenticatie-app gebruiken login: Inloggen logout: Uitloggen migrate_account: Naar een ander account verhuizen @@ -708,6 +743,7 @@ nl: pending: Jouw aanvraag moet nog worden beoordeeld door een van onze medewerkers. Dit kan misschien eventjes duren. Je ontvangt een e-mail wanneer jouw aanvraag is goedgekeurd. redirecting_to: Jouw account is inactief omdat het momenteel wordt doorverwezen naar %{acct}. trouble_logging_in: Problemen met inloggen? + use_security_key: Beveiligingssleutel gebruiken authorize_follow: already_following: Je volgt dit account al already_requested: Je hebt al een volgverzoek naar dat account verstuurd @@ -732,6 +768,7 @@ nl: date: formats: default: "%d %b %Y" + with_month_name: "%d %B %Y" datetime: distance_in_words: about_x_hours: "%{count}u" @@ -796,6 +833,7 @@ nl: request: Jouw archief opvragen size: Omvang blocks: Jij blokkeert + bookmarks: Bladwijzers csv: CSV domain_blocks: Domeinblokkades lists: Lijsten @@ -809,7 +847,7 @@ nl: filters: contexts: account: Profielen - home: Starttijdlijn + home: Starttijdlijn en lijsten notifications: Meldingen public: Openbare tijdlijnen thread: Gesprekken @@ -872,6 +910,7 @@ nl: success: Jouw gegevens zijn succesvol geüpload en worden binnenkort verwerkt types: blocking: Blokkeerlijst + bookmarks: Bladwijzers domain_blocking: Lijst met genegeerde servers following: Volglijst muting: Negeerlijst @@ -992,6 +1031,14 @@ nl: quadrillion: qdn. thousand: K trillion: bln. + otp_authentication: + code_hint: Voer de code in die door de authenticatie-app werd gegenereerd + description_html: Na het instellen van tweestapsverificatie met een authenticatie-app, kun je alleen inloggen als je jouw mobiele telefoon bij je hebt. Hiermee genereer je namelijk de in te voeren aanmeldcode. + enable: Inschakelen + instructions_html: "Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon. Van nu af aan genereert deze app aanmeldcodes die je bij het inloggen moet invoeren." + manual_instructions: 'Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren, vind je hieronder de geheime code in platte tekst:' + setup: Instellen + wrong_code: De ingevoerde code is ongeldig! Klopt de systeemtijd van de server en die van jouw apparaat? pagination: newer: Nieuwer next: Volgende @@ -1020,6 +1067,7 @@ nl: relationships: activity: Accountactiviteit dormant: Sluimerend + follow_selected_followers: Geselecteerde volgers volgen followers: Volgers following: Volgend invited: Uitgenodigd @@ -1116,6 +1164,7 @@ nl: profile: Profiel relationships: Volgers en gevolgden two_factor_authentication: Tweestapsverificatie + webauthn_authentication: Beveiligingssleutels spam_check: spam_detected: Dit is een automatisch gegenereerde rapportage. Er is spam gedetecteerd. statuses: @@ -1154,6 +1203,8 @@ nl: other: "%{count} stemmen" vote: Stemmen show_more: Meer tonen + show_newer: Nieuwere tonen + show_older: Oudere tonen show_thread: Gesprek tonen sign_in_to_participate: Meld je aan om aan dit gesprek mee te doen title: '%{name}: "%{quote}"' @@ -1262,14 +1313,20 @@ nl: default: "%d %B %Y om %H:%M" month: "%b %Y" two_factor_authentication: + add: Toevoegen disable: Tweestapsverificatie uitschakelen + disabled_success: Uitschakelen tweestapsverificatie is geslaagd + edit: Bewerken enabled: Tweestapsverificatie is ingeschakeld enabled_success: Inschakelen tweestapsverificatie geslaagd generate_recovery_codes: Herstelcodes genereren lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig. + methods: Methoden voor tweestapsverificatie + otp: Authenticatie-app recovery_codes: Herstelcodes back-uppen recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren. + webauthn: Beveiligingssleutels user_mailer: backup_ready: explanation: Je hebt een volledige back-up van jouw Mastodon-account opgevraagd. Het staat nu klaar om te worden gedownload! @@ -1284,6 +1341,7 @@ nl: warning: explanation: disable: Zolang jouw account is bevroren blijven jouw accountgegevens intact, maar kun je geen handelingen uitvoeren totdat het account is vrijgegeven. + sensitive: De mediabestanden die je upload en gekoppelde media worden als gevoelig behandeld. silence: Zolang jouw account wordt beperkt, kunnen alleen mensen die jou al volgen jouw toots op deze server zien. Tevens ben je niet zichtbaar in meldingen, gesprekken en op openbare tijdlijnen. Anderen kunnen je echter wel handmatig volgen. suspend: Jouw account is opgeschort. Jouw toots en geüploade media zijn onomkeerbaar van deze server verwijderd, en ook o.a. van de servers waar jij volgers had. get_in_touch: Je kunt deze e-mail beantwoorden om in contact te komen met de medewerkers van %{instance}. @@ -1317,9 +1375,11 @@ nl: tips: Tips title: Welkom aan boord %{name}! users: + blocked_email_provider: Deze e-mailprovider is niet toegestaan follow_limit_reached: Je kunt niet meer dan %{limit} accounts volgen generic_access_help_html: Problemen met toegang tot je account? Neem dan contact op met %{email} voor assistentie invalid_email: E-mailadres is ongeldig + invalid_email_mx: Het e-mailadres lijkt niet te bestaan invalid_otp_token: Ongeldige tweestaps-aanmeldcode invalid_sign_in_token: Ongeldige beveiligingscode otp_lost_help_html: Als je toegang tot beiden kwijt bent geraakt, neem dan contact op via %{email} @@ -1329,3 +1389,15 @@ nl: verification: explanation_html: 'Je kunt jezelf verifiëren als de eigenaar van de links in de metadata van jouw profiel. Hiervoor moet op de gelinkte website een link terug naar jouw Mastodonprofiel staan. Deze link moet het rel="me"-attribuut bevatten. De omschrijving van de link maakt niet uit. Hier is een voorbeeld:' verification: Verificatie + webauthn_credentials: + add: Nieuwe beveiligingssleutel toevoegen + create: + success: Het toevoegen van je beveiligingssleutel is geslaagd. + delete: Verwijderen + delete_confirmation: Weet je zeker dat je deze beveiligingssleutel wilt verwijderen? + invalid_credential: Ongeldige beveiligingssleutel + nickname_hint: Voer de bijnaam in van jouw nieuwe beveiligingssleutel + not_enabled: Je hebt WebAuthn nog niet ingeschakeld + not_supported: Deze browser ondersteunt geen beveiligingssleutels + otp_required: Om beveiligingssleutels te kunnen gebruiken, moet je eerst tweestapsverificatie inschakelen. + registered_on: Geregistreerd op %{date} diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 18d81bae3..763a59fbb 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -953,6 +953,7 @@ oc: trillion: T otp_authentication: enable: Activar + setup: Parametrar pagination: newer: Mai recents next: Seguent @@ -1077,6 +1078,7 @@ oc: profile: Perfil relationships: Abonaments e seguidors two_factor_authentication: Autentificacion en dos temps + webauthn_authentication: Claus de seguretat spam_check: spam_detected: Aquò es un senhalament automatic. D’spam es estat detectat. statuses: @@ -1220,7 +1222,9 @@ oc: default: Lo %e %B de %Y a %Ho%M month: "%B de %Y" two_factor_authentication: + add: Ajustar disable: Desactivar + edit: Modificar enabled: Autentificacion en dos temps activada enabled_success: L’autentificacion en dos temps es ben activada generate_recovery_codes: Generar los còdis de recuperacion @@ -1279,3 +1283,5 @@ oc: verification: explanation_html: 'Podètz verificar vosautres meteisses coma proprietari dels ligams per las metadonadas de vòstre perfil. Per aquò far, lo site Web ligat deu conténer un ligam cap a vòstre perfil Mastodon. Lo ligam deu aver un atribut rel="me". Lo contengut tèxte del ligam impòrta pas. Vaquí un exemple :' verification: Verificacion + webauthn_credentials: + registered_on: Inscripcion del %{date} diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 1e77ef21d..327ad81c1 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -66,6 +66,7 @@ pl: one: śledzący other: Śledzących following: śledzonych + instance_actor_flash: To konto jest wirtualnym profilem używanym do reprezentowania samego serwera, a nie żadnego indywidualnego użytkownika. Jest ono stosowane do celów federacji i nie powinien być zawieszany. joined: Dołączył(a) %{date} last_active: ostatnio aktywny(-a) link_verified_on: Własność tego odnośnika została sprawdzona %{date} @@ -139,6 +140,7 @@ pl: follows: Śledzeni header: Nagłówek inbox_url: Adres skrzynki + invite_request_text: Powody rejestracji invited_by: Zaproszony(-a) przez ip: Adres IP joined: Dołączył(-a) @@ -263,6 +265,7 @@ pl: unsuspend_account: Cofnij zawieszenie konta update_announcement: Aktualizuj ogłoszenie update_custom_emoji: Aktualizuj niestandardowe emoji + update_domain_block: Zaktualizuj blokadę domeny update_status: Aktualizuj wpis actions: assigned_to_self_report: "%{name} przypisał(a) sobie zgłoszenie %{target}" @@ -303,6 +306,7 @@ pl: unsuspend_account: "%{name} cofnął(-ęła) zawieszenie konta %{target}" update_announcement: "%{name} zaktualizował(-a) ogłoszenie %{target}" update_custom_emoji: "%{name} zaktualizował(a) emoji %{target}" + update_domain_block: "%{name} zaktualizował(-a) blokadę domeny dla %{target}" update_status: "%{name} zaktualizował(a) wpis użytkownika %{target}" deleted_status: "(usunięty wpis)" empty: Nie znaleziono aktywności w dzienniku. @@ -447,6 +451,7 @@ pl: instances: by_domain: Domena delivery_available: Doręczanie jest dostępne + empty: Nie znaleziono domen. known_accounts: few: "%{count} znane konta" many: "%{count} znane konta" @@ -530,6 +535,8 @@ pl: comment: none: Brak created_at: Zgłoszono + forwarded: Przekazano + forwarded_to: Przekazano do %{domain} mark_as_resolved: Oznacz jako rozwiązane mark_as_unresolved: Oznacz jako nierozwiązane notes: @@ -599,6 +606,9 @@ pl: min_invite_role: disabled: Nikt title: Kto może zapraszać użytkowników + require_invite_text: + desc_html: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne + title: Wymagaj od nowych użytkowników wypełnienia tekstu prośby o zaproszenie registrations_mode: modes: approved: Przyjęcie jest wymagane do rejestracji @@ -767,6 +777,7 @@ pl: functional: Twoje konto całkowicie funkcjonuje. pending: Twoje zgłoszenie czeka na zatwierdzenie przez nas. Może to trochę potrwać. Jeżeli zgłoszenie zostanie przyjęte, otrzymasz wiadomość e-mail. redirecting_to: Twoje konto jest nieaktywne, ponieważ obecnie przekierowuje je na %{acct}. + too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie. trouble_logging_in: Masz problem z zalogowaniem się? use_security_key: Użyj klucza bezpieczeństwa authorize_follow: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 8d66efba9..ca8d75a16 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -751,6 +751,7 @@ pt-PT: functional: A sua conta está totalmente operacional. pending: A sua inscrição está pendente de revisão pela nossa equipa. Isso pode demorar algum tempo. Receberá um e-mail se a sua conta for aprovada. redirecting_to: A sua conta está inativa porque está atualmente a ser redirecionada para %{acct}. + too_fast: Formulário enviado muito rapidamente, tente novamente. trouble_logging_in: Problemas em iniciar sessão? use_security_key: Usar chave de segurança authorize_follow: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 2de389864..9895f9a55 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -66,6 +66,7 @@ ru: one: подписчик other: подписчиков following: подписки + instance_actor_flash: Эта учетная запись - виртуальный пользователь, используемый для представления самого сервера, а не отдельного пользователя. Она используется для организационных целей и не может быть заморожена. joined: 'Дата регистрации: %{date}' last_active: последняя активность link_verified_on: Владение этой ссылкой было проверено %{date} @@ -139,6 +140,7 @@ ru: follows: Подписки header: Шапка inbox_url: URL входящих + invite_request_text: Причины для присоединения invited_by: Приглашение выдал(а) ip: IP joined: Дата регистрации @@ -263,6 +265,7 @@ ru: unsuspend_account: Разблокировка пользователей update_announcement: Обновление объявлений update_custom_emoji: Обновление эмодзи + update_domain_block: Изменить блокировку домена update_status: Изменение постов actions: assigned_to_self_report: "%{name} назначил(а) себя для решения жалобы %{target}" @@ -303,6 +306,7 @@ ru: unsuspend_account: "%{name} снял(а) блокировку с пользователя %{target}" update_announcement: "%{name} обновил объявление %{target}" update_custom_emoji: "%{name} обновил(а) эмодзи %{target}" + update_domain_block: "%{name} обновил блокировку домена для %{target}" update_status: "%{name} изменил(а) пост пользователя %{target}" deleted_status: "(удалённый пост)" empty: Журнал пуст. @@ -452,6 +456,7 @@ ru: instances: by_domain: Домен delivery_available: Доставка возможна + empty: Домены не найдены. known_accounts: few: "%{count} известные учётные записи" many: "%{count} известных учётных записей" @@ -535,6 +540,8 @@ ru: comment: none: Нет created_at: Создана + forwarded: Переслано + forwarded_to: Переслано на %{domain} mark_as_resolved: Отметить как решённую mark_as_unresolved: Отметить как нерешённую notes: @@ -604,6 +611,9 @@ ru: min_invite_role: disabled: Никого title: Разрешать приглашения от + require_invite_text: + desc_html: Когда регистрация требует ручного подтверждения, сделать ответ на вопрос "Почему вы хотите присоединиться?" обязательным, а не опциональным + title: Обязать новых пользователей заполнять текст запроса на приглашение registrations_mode: modes: approved: Для регистрации требуется подтверждение @@ -772,6 +782,7 @@ ru: functional: Ваша учётная запись в полном порядке. pending: Ваша заявка ожидает одобрения администраторами, это может занять немного времени. Вы получите письмо, как только заявку одобрят. redirecting_to: Ваша учётная запись деактивированна, потому что вы настроили перенаправление на %{acct}. + too_fast: Форма отправлена слишком быстро, попробуйте еще раз. trouble_logging_in: Не удаётся войти? use_security_key: Использовать ключ безопасности authorize_follow: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 4e3322589..626c7671c 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -1,12 +1,1420 @@ --- sc: + about: + about_hashtag_html: Custos sunt tuts pùblicos etichetados cun #%{hashtag}. Bi podes intrare in cuntatu si tenes unu contu in cale si siat logu de su fediversu. + about_mastodon_html: 'Sa rete sotziale de su benidore: sena publitzidade, sena vigilàntzia corporativa, disignu èticu e detzentralizatzione! Sias mere de is datos tuos cun Mastodon!' + about_this: Informatziones + active_count_after: ativu + active_footnote: Utentes Ativos Mensiles (UAM) + administered_by: 'Amministradu dae:' + api: "*API" + apps: Aplicatziones mòbiles + apps_platforms: Imprea Mastodon dae iOS, Android e àteras prataformas + browse_directory: Nàviga su diretòriu de profilos e filtra segundu interessos + browse_local_posts: Nàviga unu flussu in direta de messàgios pùblicos de custu serbidore + browse_public_posts: Nàviga unu flussu in direta de messàgios pùblicos in Mastodon + contact: Cuntatu + contact_missing: No impostadu + contact_unavailable: No a disponimentu + discover_users: Iscoberi utentes + documentation: Documentatzione + federation_hint_html: Cun unu contu in %{instance} as a pòdere sighire persones in cale si siat serbidore de Mastodon o de su fediversu. + get_apps: Proa un'aplicatzione mòbile + hosted_on: Mastodon acasagiadu in %{domain} + instance_actor_flash: 'Custu contu est un''atore virtuale impreadu pro rapresentare su serbidore matessi, no est un''utente individuale. Benit impreadu pro punnas de federatzione e non lu dias dèpere blocare si non cheres blocare su domìniu intreu, e in cussu casu dias dèpere impreare unu blocu de domìniu. + +' + learn_more: Àteras informatziones + privacy_policy: Polìtica de riservadesa + see_whats_happening: Càstia su chi est acontessende + server_stats: 'Istatìsticas de su serbidore:' + source_code: Còdighe mitza + status_count_after: + one: istadu + other: istados + status_count_before: Autores de + tagline: Sighi is amigos tuos e iscoberi·nde de noos + terms: Cunditziones de su servìtziu + unavailable_content: Serbidores moderados + unavailable_content_description: + domain: Serbidore + reason: Resone + rejecting_media: 'Is documentos multimediales de custos serbidores no at a èssere protzessadu o sarvadu e peruna miniadura at a èssere ammustradas, ca tenent bisòngiu de un''incarcu manuale in su documentu originale:' + rejecting_media_title: Mèdios filtrados + silenced: 'Is messàgios dae custos serbidores ant a èssere cuados in is lìnias de tempus e is arresonadas pùblicas, e no at a èssere generada peruna notìfica dae is interatziones de is utentes, francu chi nde sias sighende:' + silenced_title: Serbidores a sa muda + suspended: 'Perunu datu de custos serbidores at a èssere protzessadu, immagasinadu o cuncambiadu; est impossìbile duncas cale si siat interatzione o comunicatzione cun is utentes de custos serbidores:' + suspended_title: Serbidores suspèndidos + unavailable_content_html: Mastodon ti permitit de bìdere su cuntenutu de utentes de cale si siat àteru serbidore de su fediversu. Custas sunt etzetziones chi fatas in custu serbidore particulare. + user_count_after: + one: utente + other: utentes + user_count_before: Allogiadu dae + what_is_mastodon: Ite est Mastodon? + accounts: + choices_html: 'Sèberos de %{name}:' + endorsements_hint: Podes cussigiare gente chi sighis dae s'interfache web, e at a aparèssere inoghe. + featured_tags_hint: Podes evidentziare etichetas ispetzìficas chi ant a èssere ammustradas inoghe. + follow: Sighi + followers: + one: Sighidura + other: Sighiduras + following: Sighende + joined: At aderidu su %{date} + last_active: ùrtima atividade + link_verified_on: Sa propiedade de custu ligàmene est istada controllada su %{date} + media: Elementos multimediales + moved_html: "%{name} est istadu trasferidu a %{new_profile_link}:" + network_hidden: Custa informatzione no a disponimentu + never_active: Mai + nothing_here: Nudda inoghe. + people_followed_by: Gente sighida dae %{name} + people_who_follow: Gente chi sighit a %{name} + pin_errors: + following: Depes sighire sa persone chi boles promòvere + posts: + one: Tut + other: Tuts + posts_tab_heading: Tuts + posts_with_replies: Tuts e rispostas + reserved_username: Custu nòmine de utente est giai impreadu + roles: + admin: Admin + bot: Bot + group: Grupu + moderator: Moderadore + unavailable: Su profilu no est a disponimentu + unfollow: Non sigas prus + admin: + account_actions: + action: Faghe un'atzione + title: Faghe un'atzione de moderatzione in %{acct} + account_moderation_notes: + create: Lassa una nota + created_msg: As creadu una nota de moderatzione. + delete: Cantzella + destroyed_msg: As cantzelladu una nota de moderatzione. + accounts: + add_email_domain_block: Bloca domìniu de posta eletrònica + approve: Aprova + approve_all: Aprova totus + approved_msg: Sa dimanda de registru de %{username} est istada aprovada + are_you_sure: Seguru? + avatar: Immàgine de profilu + by_domain: Domìniu + change_email: + changed_msg: As cambiadu s'indiritzu eletrònicu. + current_email: Indiritzu eletrònicu atuale + label: Muda s'indiritzu eletrònicu + new_email: Indiritzu de eletrònicu nou + submit: Muda s'indiritzu eletrònicu + title: Muda s'indiritzu eletrònicu de %{username} + confirm: Cunfirma + confirmed: Cunfirmadu + confirming: Cunfirmende + delete: Cantzella datos + deleted: Cantzelladu + demote: Degrada + destroyed_msg: Is datos de %{username} sunt a sa coa pro èssere cantzellados luego + disable: Disativa + disable_two_factor_authentication: Disativa 2FA + disabled: Disativadu + display_name: Nòmine visìbile + domain: Domìniu + edit: Modìfica + email: Posta eletrònica + email_status: Istadu de s'indiritzu eletrònicu + enable: Ativa + enabled: Ativadu + enabled_msg: Su contu de %{username} est istadu ativadu + followers: Sighiduras + follows: Sighende + header: Intestatzione + inbox_url: URL de intrada + invited_by: Invitu dae + ip: IP + joined: At aderidu + location: + all: Totus + local: Locale + remote: Remotu + title: Positzione + login_status: Istadu de atzessu + media_attachments: Allegados multimediales + memorialize: Cunverte in memoriam + memorialized: Memorializadu + memorialized_msg: As trasformadu %{username} in unu contu de ammentu + moderation: + active: Ativu + all: Totus + pending: De imbiare + silenced: A sa muda + suspended: Suspèndidu + title: Moderatzione + moderation_notes: Notas de moderatzione + most_recent_activity: Atividade prus reghente + most_recent_ip: IP prus reghente + no_account_selected: Perunu contu est istadu mudadu, dae chi non nd'as seletzionadu + no_limits_imposed: Sena lìmites + not_subscribed: Sena sutiscritzione + pending: De revisionare + perform_full_suspension: Suspèndidu + promote: Promove + protocol: Protocollu + public: Pùblicu + push_subscription_expires: Sa sutiscritzione PuSH iscadit + redownload: Atualiza su profilu + redownloaded_msg: Su profilu de %{username} est istadu agiornadu dae s'orìgine + reject: Refuda + reject_all: Refuda totu + rejected_msg: Sa dimanda de registru de %{username} est istada refudada + remove_avatar: Boga immàgine de profilu + remove_header: Boga s'intestatzione + removed_avatar_msg: S'immàgine de d'àvatar de %{username} est istada bogada + removed_header_msg: S'immàgine de intestatzione de %{username} est istada bogada + resend_confirmation: + already_confirmed: Custa persone est giai cunfirmada + send: Torra a imbiare messàgiu eletrònicu de cunfirmatzione + success: Messàgiu eletrònicu de cunfirmatzione imbiadu. + reset: Reseta + reset_password: Reseta sa crae + resubscribe: Torra a sutascrìere + role: Permissos + roles: + admin: Admin + moderator: Mod + staff: Personale + user: Utente + search: Chirca + search_same_email_domain: Àteras persones cun su pròpiu domìniu de posta + search_same_ip: Àteras persones cun sa pròpiu IP + sensitive: Sensìbile + sensitized: marcadu comente a sensìbile + shared_inbox_url: URL de intrada cumpartzida + show: + created_reports: Informes creados + targeted_reports: Informes de àtere + silence: Lìmita + silenced: Limitadas + statuses: Tuts + subscribe: Sutascrie·ti + suspended: Suspèndidu + suspension_irreversible: Is datos de custu contu sunt istados cantzellados in manera irreversìbile. Podes bogare sa suspensione a su contu pro chi si potzat impreare, ma no at a recuperare datu perunu de is chi teniat in antis. + suspension_reversible_hint_html: Su contu est istadu suspèndidu, e is datos ant a èssere cantzelladu de su totu su %{date}. Finas a tando, su contu si podet ripristinare sena efetu malu perunu. Si boles cantzellare totu is datos de su contu immediatamente ddu podes fàghere inoghe in bassu. + time_in_queue: Isetende in coa %{time} + title: Contos + unconfirmed_email: Posta eletrònica sena cunfirmare + undo_sensitized: Boga sa marcadura comente "sensìbile" + undo_silenced: Non pòngias a sa muda + undo_suspension: Iscontza sa suspensione + unsilenced_msg: As bogadu is lìmites a su contu de %{username} + unsubscribe: Annulla sa sutiscritzione + unsuspended_msg: As bogadu sa suspensione a su contu de %{username} + username: Nòmine utente + view_domain: Càstia unu resumu pro su domìniu + warn: Avisu + web: Web + whitelisted: Federatzione permìtida + action_logs: + action_types: + assigned_to_self_report: Assigna s'informe + change_email_user: Muda s'indiritzu eletrònicu pro s'utente + confirm_user: Cunfirma s'utente + create_account_warning: Crea un'avisu + create_announcement: Crea un'annùntziu + create_custom_emoji: Crea un'emoji personalizadu + create_domain_allow: Crea unu domìniu permìtidu + create_domain_block: Crea unu blocu de domìniu + create_email_domain_block: Crea unu blocu de domìniu de indiritzu de posta + create_ip_block: Crea una règula IP + demote_user: Degrada s'utente + destroy_announcement: Cantzella s'annùntziu + destroy_custom_emoji: Cantzella s'emoji personalizadu + destroy_domain_allow: Cantzella su domìniu permìtidu + destroy_domain_block: Cantzella su blocu de domìniu + destroy_email_domain_block: Cantzella su blocu de domìniu de s'indiritzu de posta + destroy_ip_block: Cantzella sa règula IP + destroy_status: Cantzella s'istadu + disable_2fa_user: Disativa 2FA + disable_custom_emoji: Disativa s'emoji personalizadu + disable_user: Disativa utente + enable_custom_emoji: Ativa s'emoji personalizadu + enable_user: Ativa utente + memorialize_account: Regorda su contu + promote_user: Promove utente + remove_avatar_user: Cantzella immàgine de profilu + reopen_report: Torra a abèrrere s'informe + reset_password_user: Reseta sa crae + resolve_report: Isorve s'informe + sensitive_account: Marca sos cuntenutos multimediales in su contu tuo comente sensìbile + silence_account: Pone custu contu a sa muda + suspend_account: Suspende custu contu + unassigned_report: Boga s'assignatzione de custu informe + unsensitive_account: Boga sa marcadura "sensìbiles" a is elementos multimediales in su contu tuo + unsilence_account: Boga custu contu de is contos a sa muda + unsuspend_account: Boga custu contu de is contos suspèndidos + update_announcement: Atualiza s'annùntziu + update_custom_emoji: Atualiza s'emoji personalizadu + update_status: Atualiza s'istadu + actions: + assigned_to_self_report: "%{name} s'est auto-assignadu s'informe %{target}" + change_email_user: "%{name} at mudadu s'indiritzu de posta eletrònica de s'utente %{target}" + confirm_user: "%{name} at cunfirmadu s'indiritzu de posta eletrònica de s'utente %{target}" + create_account_warning: "%{name} at imbiadu un'avisu a %{target}" + create_announcement: "%{name} at creadu un'annùntziu nou %{target}" + create_custom_emoji: "%{name} at carrigadu un'emoji nou%{target}" + create_domain_allow: "%{name} at permìtidu sa federatzione cun su domìniu %{target}" + create_domain_block: "%{name} at blocadu su domìniu %{target}" + create_email_domain_block: "%{name} at blocadu su domìniu de posta eletrònica %{target}" + create_ip_block: "%{name} at creadu una règula pro s'IP %{target}" + demote_user: "%{name} at degradadu s'utente %{target}" + destroy_announcement: "%{name} at cantzelladu s'annùntziu %{target}" + destroy_custom_emoji: "%{name} at cantzelladu s'emoji %{target}" + destroy_domain_allow: "%{name} no at permìtidu sa federatzione cun su domìniu %{target}" + destroy_domain_block: "%{name} at isblocadu su domìniu %{target}" + destroy_email_domain_block: "%{name} at isblocadu su domìniu de posta eletrònica %{target}" + destroy_ip_block: "%{name} at cantzelladu sa règula pro s'IP %{target}" + destroy_status: "%{name} at eliminadu s'istadu de %{target}" + disable_2fa_user: "%{name} at disativadu su rechisitu de duos fatores pro s'utente %{target}" + disable_custom_emoji: "%{name} at disativadu s'emoji %{target}" + disable_user: "%{name} at disativadu s'atzessu pro s'utente %{target}" + enable_custom_emoji: "%{name} at ativadu s'emoji %{target}" + enable_user: "%{name} at ativadu s'atzessu pro s'utente %{target}" + memorialize_account: "%{name} at cunvertidu su contu %{target} in una pàgina in memoriam" + promote_user: "%{name} at promòvidu s'utente %{target}" + remove_avatar_user: "%{name} at cantzelladu s'immàgine de profilu de %{target}" + reopen_report: "%{name} at torradu a abèrrere s'informe %{target}" + reset_password_user: "%{name} at restadu sa crae de s'utente %{target}" + resolve_report: "%{name} at isòrvidu s'informe %{target}" + sensitive_account: "%{name} at marcadu s'elementu multimediale de %{target} comente sensìbile" + silence_account: "%{name} at postu su contu de %{target} a sa muda" + suspend_account: "%{name} at suspèndidu su contu de %{target}" + unassigned_report: "%{name} at bogadu s'assignatzione de s'informe %{target}" + unsensitive_account: '%{name} at bogadu sa marcadura "sensìbile" a s''elementu multimediale de %{target}' + unsilence_account: "%{name} at postu su contu de %{target} a sa muda" + unsuspend_account: "%{name} at bogadu sa suspensione de su contu de %{target}" + update_announcement: "%{name} at atualizadu s'annùntziu %{target}" + update_custom_emoji: "%{name} at atualizadu s'emoji %{target}" + update_status: "%{name} at atualizadu s'istadu de %{target}" + deleted_status: "(istadu cantzelladu)" + empty: Perunu registru agatadu. + filter_by_action: Filtra pro atzione + filter_by_user: Filtra pro utente + title: Registru de controllu + announcements: + destroyed_msg: As cantzelladu s'annùntziu. + edit: + title: Modìfica s'annùntziu + empty: Perunu annùntziu agatadu. + live: In direta + new: + create: Crea un'annùntziu + title: Annùntziu nou + published_msg: As publicadu s'annùntziu. + scheduled_for: Programmadu pro %{time} + scheduled_msg: As programmadu s'annùntziu pro èssere publicadu! + title: Annùntzios + unpublished_msg: As ritiradu s'annùntziu! + updated_msg: As atualizadu s'annùntziu. + custom_emojis: + assign_category: Assigna a una categoria + by_domain: Domìniu + copied_msg: As creadu sa còpia locale de s'emoji + copy: Còpia + copy_failed_msg: Impossìbile fàghere una còpia locale de custu emoji + create_new_category: Crea una categoria noa + created_msg: As creadu s'emoji. + delete: Cantzella + destroyed_msg: As cantzelladu s'emoji. + disable: Disativa + disabled: Disativu + disabled_msg: As disativadu s'emoji + emoji: Emoji + enable: Ativa + enabled: Ativadu + enabled_msg: As ativadu s'emoji + image_hint: PNG de finas a 50 KB + list: Lista + listed: Listadu + new: + title: Agiunghe emoji personalizadu nou + not_permitted: Non tenes su permissu de fàghere custa atzione + overwrite: Subraiscrie + shortcode: Incurtzadura + shortcode_hint: Mìnimu 2 caràteres, isceti caràteres alfanumèricos e tratigheddos bàscios + title: Emojis personalizados + uncategorized: Sena categoria + unlist: Esclude de sa lista + unlisted: Esclùidu de sa lista + update_failed_msg: Impossìbile atualizare custu emoji + updated_msg: Emoji atualizadu + upload: Càrriga + dashboard: + authorized_fetch_mode: Modalidade segura + backlog: tareas arretradas + config: Cunfiguratzione + feature_deletions: Eliminatzione de contos + feature_invites: Ligàmenes de invitu + feature_profile_directory: Diretòriu de profilos + feature_registrations: Registradas + feature_relay: Ripetidore de federatzione + feature_spam_check: Anti-àliga + feature_timeline_preview: Pre-visualizatzione de sa lìnia de tempus + features: Caraterìsticas + hidden_service: Federatzione cun servìtzios cuados + open_reports: informes abertos + pending_tags: etichetas de revisionare + pending_users: persones de revisionare + recent_users: Persones reghentes + search: Chirca de testu cumpletu + single_user_mode: Modalidade de utente ùnicu + software: Programmas + space: Impreu de ispàtziu + title: Pannellu + total_users: persones in totale + trends: Tendèntzias + week_interactions: interatziones de custa chida + week_users_active: persones ativas custa chida + week_users_new: persones noas de custa chida + whitelist_mode: Modalidade de federatzione limitada + domain_allows: + add_new: Permite sa federatzione cun domìniu + created_msg: Sa federatzione cun su domìniu est istada permìtida + destroyed_msg: Sa federatzione cun su domìniu no est istada permìtida + undo: Non permitas sa federatzione cun su domìniu + domain_blocks: + add_new: Agiunghe blocu de domìniu nou + created_msg: Protzessende su blocu de domìniu + destroyed_msg: Su blocu de domìniu est istadu iscontzadu + domain: Domìniu + edit: Modìfica su blocu de su domìniu + existing_domain_block_html: As giai impostu lìmites prus astrintos a %{name}, ddu dias dèpere isblocare prima. + new: + create: Crea unu blocu + hint: Su blocu de domìniu no at a impedire sa creatzione de contos noos in sa base de datos, ma ant a èssere aplicados in manera retroativa mètodos de moderatzione ispetzìficos subra custos contos. + severity: + desc_html: "A sa muda at a pònnere is messàgios de custos contos comente invisìbiles a sa gente chi no ddi siat sighende. Sa suspensione at a cantzellare totu su cuntenutu de su contu, elementos multimediales e datos de profilu. Imprea Perunu si boles isceti refudare is archìvios multimediales." + noop: Perunu + silence: A sa muda + suspend: Suspèndidu + title: Blocu de domìniu nou + private_comment: Cummentu privadu + private_comment_hint: Lassa unu cummentu a subra de custa limitatzione de domìniu pro impreu internu de s'iscuadra de moderatzione. + public_comment: Cummentu pùblicu + public_comment_hint: Lassa unu cummentu pro su pùblicu generale a subra de custa limitatzione de su domìniu, si sa publicatzione de sa lista de limitatziones de domìniu est abilitada. + reject_media: Refuda documentos multimediales + reject_media_hint: Cantzellat documentos multimediales sarvados in locale e refudat iscarrigamentos in su benidore. Non rilevante pro is suspensiones + reject_reports: Refuda informes + reject_reports_hint: Iscarta informes chi benint de custu domìniu. Non rilevante pro is suspensiones + rejecting_media: refudende documentos multimediales + rejecting_reports: refudende informes + severity: + silence: a sa muda + suspend: suspèndidu + show: + affected_accounts: + one: Unu contu de sa base de datos implicadu + other: "%{count} contos de sa base de datos implicados" + retroactive: + silence: Boga de is contos a sa muda is contos de custu domìniu implicados + suspend: Boga sa suspensione de is contos de custu domìniu implicados + title: Iscontza su blocu de domìniu de %{domain} + undo: Iscontza + undo: Iscontza su blocu de domìniu + view: Bide su blocu de domìniu + email_domain_blocks: + add_new: Agiunghe noa + created_msg: Domìniu de posta eletrònica blocadu + delete: Cantzella + destroyed_msg: Domìniu de posta eletrònica isblocadu + domain: Domìniu + empty: Perunu domìniu de posta eletrònica blocadu. + from_html: dae %{domain} + new: + create: Agiunghe unu domìniu + title: Bloca su domìniu de posta eletrònica nou + title: Domìnios de posta eletrònica blocados + instances: + by_domain: Domìniu + delivery_available: Sa cunsigna est a disponimentu + known_accounts: + one: "%{count} contu connòschidu" + other: "%{count} contos connòschidos" + moderation: + all: Totus + limited: Limitadas + title: Moderatzione + private_comment: Cummentu privadu + public_comment: Cummentu pùblicu + title: Federatzione + total_blocked_by_us: Blocados dae nois + total_followed_by_them: Sighidos dae àtere + total_followed_by_us: Sighidos dae nois + total_reported: Informes a subra de àtere + total_storage: Allegados multimediales + invites: + deactivate_all: Disativa totu + filter: + all: Totus + available: A disponimentu + expired: Iscadidu + title: Filtru + title: Invitos + ip_blocks: + add_new: Crea una règula + created_msg: As agiuntu una règula IP noa + delete: Cantzella + expires_in: + '1209600': 2 chidas + '15778476': 6 meses + '2629746': 1 mese + '31556952': 1 annu + '86400': 1 die + '94670856': 3 annos + new: + title: Crea una règula IP noa + no_ip_block_selected: Peruna règula IP est istada mudada dae chi non nd'as seletzionadu + title: Règulas IP + pending_accounts: + title: Contos in ispera (%{count}) + relationships: + title: relatziones de %{acct} + relays: + add_new: Agiunghe unu ripetidore nou + delete: Cantzella + description_html: Unu ripetidore de federatzione est unu serbidore intermediàriu chi cuncàmbiat volùmenes mannos de tuts pùblicos intre serbidores chi si connetent e bi pùblicant. Podet agiudare a serbidores minores e medianos a iscobèrrere cuntenutu de su fediversu, in manera chi is utentes locales non tèngiant bisòngiu de sighire a manu àtera gente de serbidores remotos. + disable: Disativa + disabled: Disativu + enable: Ativa + enable_hint: Si abilitadu, su serbidore tuo at a èssere sutascritu a totu is tuts pùblicos de custu ripetidore e bi at a cumintzare a imbiare totu is tuts pùblicos de custu serbidore. + enabled: Ativadu + inbox_url: URL de su ripetidore + pending: Isetende s'aprovatzione de su ripetidore + save_and_enable: Sarva e ativa + setup: Cunfigura una connessione cun unu ripetidore + signatures_not_enabled: Is ripetidores no ant a funtzionare comente si tocat si sa modalidade segura o sa modalidade a federatzione limitada sunt abilitadas + status: Istadu + title: Ripetidores + report_notes: + created_msg: As creadu sa nota de s'informe + destroyed_msg: As cantzelladu sa nota de s'informe + reports: + account: + notes: + one: "%{count} nota" + other: "%{count} notas" + reports: + one: "%{count} informe" + other: "%{count} informes" + action_taken_by: Mesuras adotadas dae + are_you_sure: Seguru? + assign_to_self: Assigna a mie + assigned: Moderatzione assignada + by_target_domain: Domìniu de su contu signaladu + comment: + none: Perunu + created_at: Signaladu + mark_as_resolved: Marca comente a isòrvidu + mark_as_unresolved: Marcare comente a non isòrvidu + notes: + create: Agiunghe una nota + create_and_resolve: Isorve cun una nota + create_and_unresolve: Torra a abèrrere cun una nota + delete: Cantzella + placeholder: Descrie is atziones chi as pigadu o cale si siat àtera atualizatzione de importu... + reopen: Torra a abèrrere s'informe + report: 'Informe #%{id}' + reported_account: Contu signaladu + reported_by: Signaladu dae + resolved: Isòrvidu + resolved_msg: Informe isòrvidu. + status: Istadu + title: Informes + unassign: Boga s'assignatzione + unresolved: No isòrvidu + updated_at: Atualizadu + settings: + activity_api_enabled: + desc_html: Nùmeru de tuts publicados in locale, utentes ativos e registros noos in perìodos chidajolos + title: Pùblica istatìsticas agregadas subra s'atividade de s'utente + bootstrap_timeline_accounts: + desc_html: Imprea vìrgulas intre is nòmines de utente. Isceti is contos locales e isblocados ant a funtzionare. Su valore predefinidu cando est bòidu est totu is admins locales. + title: Sighidura predefinida pro persones noas + contact_information: + email: Indiritzu eletrònicu de impresa + username: Nòmine de utente de su cuntatu + custom_css: + desc_html: Modìfica s'aspetu cun CSS carrigadu in cada pàgina + title: CSS personalizadu + default_noindex: + desc_html: Ìmplicat a totu is utentes chi no apant modificadu custa cunfiguratzione + title: Esclude in manera predefinida is utentes dae s'inditzamentu de is motores de chirca + domain_blocks: + all: Pro totus + disabled: Pro nemos + title: Ammustra blocos de domìniu + users: Pro utentes locales in lìnia + domain_blocks_rationale: + title: Ammustra sa resone + enable_bootstrap_timeline_accounts: + title: Ativa s sighiduras predefinidas pro is persones noas + hero: + desc_html: Ammustradu in sa pàgina printzipale. Cussigiadu a su mancu 600x100px. Si no est cunfiguradu, at a èssere ammustradu cussu de su serbidore + title: Immàgine de eroe + mascot: + desc_html: Ammustrada in vàrias pàginas. Cussigiadu a su mancu 293x205px. Si no est cunfiguradu, torra a su personàgiu predefinidu + title: Immàgine de su personàgiu + peers_api_enabled: + desc_html: Is nòmines de domìniu chi custu serbidore at agatadu in su fediversu + title: Pùblica sa lista de serbidores iscobertos + preview_sensitive_media: + desc_html: Is antiprimas de ligòngios de àteros sitos web ant a ammustrare una miniadura mancari is mèdios de comunicatzione siant marcados comente a sensìbiles + title: Ammustra mèdios sensìbiles in sas previsualizatziones de OpenGraph + profile_directory: + desc_html: Permite a is persone de èssere iscobertas + title: Ativa diretòriu de profilos + registrations: + closed_message: + desc_html: Ammustradu in sa prima pàgina cando is registratziones sunt serradas. Podes impreare etichetas HTML + title: Messàgiu de registru serradu + deletion: + desc_html: Permite a chie si siat de cantzellare su contu suo + title: Aberi s'eliminatzione de su contu + min_invite_role: + disabled: Perunu + title: Permite invitos de + registrations_mode: + modes: + approved: Aprovatzione rechesta pro si registrare + none: Nemos si podet registrare + open: Chie si siat si podet registrare + title: Modu de registratzione + show_known_fediverse_at_about_page: + desc_html: Cando ativu, ammustrat in sa previsualizatzione is tuts de totu is istàntzias connòschidas. Si nono, ammustrat isceti is cuntenutos locales + title: Include su cuntenutu federadu in sa pàgina no autenticada de sa lìnia de tempus pùblica + show_staff_badge: + desc_html: Ammustra un'insigna de personale in sa pàgina de utente + title: Ammustra insigna de personale + site_description: + desc_html: Paràgrafu de introdutzione a s'API. Descrie ite rendet ispatziale custu serbidore de Mastodon e cale si siat àtera cosa de importu. Podes impreare etichetas HTML, mescamente <a> e <em>. + title: Descritzione de su serbidore + site_description_extended: + desc_html: Unu logu adatu pro publicare su còdighe de cumportamentu, règulas, diretivas e àteras caraterìsticas ispetzìficas de su serbidore tuo. Podes impreare etichetas HTML + title: Descritzione estèndida de su logu + site_short_description: + desc_html: Ammustradu in sa barra laterale e in is meta-etichetas. Descrie ite est Mastodon e pro ite custu serbidore est ispetziale in unu paràgrafu. + title: Descritzione curtza de su serbidore + site_terms: + desc_html: Podes iscriere sa tua normativa de riservadesa pròpia, cunditziones de servìtziu e àteras normas legales. Podes impreare etichetas HTML + title: Termes de su servìtziu personalizados + site_title: Nòmine de su serbidore + spam_check_enabled: + desc_html: Mastodon podet signalare in automàticu contos chi imbiant messàgios non rechestos in manera repetitiva. Bi podent èssere falsos positivos. + title: Automatzione anti-spam + thumbnail: + desc_html: Impreadu pro otènnere pre-visualizatziones pro mèdiu de OpenGraph e API. Cussigiadu 1200x630px + title: Miniadura de su serbidore + timeline_preview: + desc_html: Ammustra su ligàmene a sa lìnia de tempus pùblica in sa pàgina initziale e permite s'atzessu pro mèdiu de s'API a sa lìnia de tempus pùblica sena autenticatzione + title: Permite s'atzessu no autenticadu a sa lìnia de tempus pùblica + title: Cunfiguratzione de su logu + trendable_by_default: + desc_html: Tocat a is etichetas chi non siant istadas refudadas prima + title: Permite chi is etichetas divenant tendèntzia sena revisione pretzedente + trends: + desc_html: Ammustra in pùblicu is etichetas chi siant istadas revisionadas in passadu e chi oe siant in tendèntzia + title: Etichetas de tendèntzia + site_uploads: + delete: Cantzella s'archìviu carrigadu + destroyed_msg: Càrriga de su situ cantzellada. + statuses: + back_to_account: Torra a sa pàgina de su contu + batch: + delete: Cantzella + nsfw_off: Signala comente a non sensìbile + nsfw_on: Signala comente a sensìbile + deleted: Cantzelladu + failed_to_execute: Faddina in s'esecutzione + media: + title: Elementos multimediales + no_media: Perunu elementu multimediale + no_status_selected: Perunu istadu est istadu mudadu dae chi non nd'as seletzionadu + title: Istados de su contu + with_media: Cun elementos multimediales + tags: + accounts_today: Impreos ùnicos atuales + accounts_week: Impreos ùnicos de custa chida + breakdown: Detàllios de s'impreu atuale pro orìgine + context: Cuntestu + directory: In su diretòriu + in_directory: "%{count} in su diretòriu" + last_active: Ùrtima atividade + most_popular: Prus populares + most_recent: Prus reghentes + name: Eticheta + review: Revisiona s'istadu + reviewed: Revisionadas + title: Etichetas + trending_right_now: In tendèntzia immoe + unique_uses_today: "%{count} publicatziones de oe" + unreviewed: Sena revisionare + updated_msg: Cunfiguratzione de etichetas atualizada + title: Amministratzione + warning_presets: + add_new: Agiunghe noa + delete: Cantzella + edit_preset: Modìfica s'avisu predefinidu + title: Gesti is cunfiguratziones predefinidas de is avisos + admin_mailer: + new_pending_account: + body: Is detàllios de su contu nou sunt a suta. Podes aprovare o refudare custa rechesta. + subject: Contu nou de revisionare in %{instance} (%{username}) + new_report: + body: "%{reporter} at signaladu %{target}" + body_remote: Calicunu de su domìniu %{domain} at signaladu %{target} + subject: Informe nou pro %{instance} (#%{id}) + new_trending_tag: + body: 'S''eticheta #%{name} est in tendèntzia oe, ma non est istada revisionada in passadu. No at a èssere ammustrada in pùblicu francu chi ddu permitas; si sarvas formulàriu sena ddu modificare no ddu as a bìdere mai prus.' + subject: Eticheta noa de revisionare in %{instance} (#%{name}) + aliases: + add_new: Crea unu nomìngiu + created_msg: Nomìngiu creadu. Immoe podes cumintzare a tramudare dae su contu betzu. + deleted_msg: Nomìngiu bogadu. Sa tràmuda dae cussu contu a custu no at a èssere prus possìbile. + empty: No tenes perunu nomìngiu. + hint_html: Si boles mudare dae un'àteru contu a custu, inoghe as a pòdere creare unu nomìngiu, chi est rechestu in antis de sighire cun sa tràmuda de is persones chi ti sighint dae su contu betzu a custu. Custa atzione est innòcua e reversìbile. Tràmuda de su contu betzu cumintzada. + remove: Disconnete su nomìngiu + appearance: + advanced_web_interface: Interfache web avantzada + advanced_web_interface_hint: 'Si impreare totu sa largària de s''ischermu, s''interfache web avantzada ti permitit de cunfigurare diversas colunnas pro bìdere meda prus informatzione in contemporànea: printzipale, notìficas, lìnia de tempus federada e cale si siat nùmeru de listas e etichetas.' + animations_and_accessibility: Animatziones e atzessibilidade + confirmation_dialogs: Diàlogos de cunfirmatzione + discovery: Iscoberta + localization: + body: Mastodon est bortadu in manera voluntària. + guide_link: https://crowdin.com/project/mastodon + guide_link_text: Chie si siat podet contribuire. + sensitive_content: Cuntenutu sensìbile + toot_layout: Dispositzione de is tuts + application_mailer: + notification_preferences: Muda is preferèntzias de posta + salutation: "%{name}," + settings: 'Muda is preferèntzias de posta: %{link}' + view: 'Visualizatzione:' + view_profile: Visualiza profilu + view_status: Ammustra s'istadu + applications: + created: Aplicatzione creada + destroyed: Aplicatzione cantzellada + invalid_url: S'URL frunidu no est curretu + regenerate_token: Torra a generare s'identificadore de atzessu + token_regenerated: Identificadore de atzessu generadu + warning: Dae cara a custos datos. Non ddos cumpartzas mai cun nemos! + your_token: S'identificadore tuo de atzessu + auth: + apply_for_account: Pedi un'invitu + change_password: Crae + checkbox_agreement_html: So de acòrdiu cun is règulas de su serbidore e is cunditziones de su servìtziu + checkbox_agreement_without_rules_html: So de acòrdiu cun is cunditziones de su servìtziu + delete_account: Cantzella su contu + delete_account_html: Si boles cantzellare su contu, ddu podes fàghere inoghe. T'amus a dimandare una cunfirmatzione. + description: + prefix_invited_by_user: "@%{name} t'at invitadu a custu serbidore de Mastodon!" + prefix_sign_up: Registra·ti oe a Mastodon! + suffix: Cun unu contu as a pòdere sighire gente, publicare e cuncambiare messàgios cun persones de cale si siat serbidore de Mastodon e àteru! + didnt_get_confirmation: No as retzidu su messàgiu de cunfirmatzione? + dont_have_your_security_key: Non tenes sa crae de seguresa tua? + forgot_password: Ti ses iscarèssidu de sa crae? + invalid_reset_password_token: Su còdighe de autorizatzione pro resetare sa crae no est vàlidu o est iscadidu. Dimanda·nde un'àteru. + link_to_otp: Inserta unu còdighe a duas fases dae su telèfono tuo o unu còdighe de recùperu + link_to_webauth: Imprea su dispositivu tuo de crae de seguresa + login: Intra + logout: Essi + migrate_account: Moe a unu contu diferente + migrate_account_html: Si boles torrare a indiritzare custu contu a un'àteru, ddu as a pòdere fàghere inoghe. + or_log_in_with: O intra cun + providers: + cas: CAS + saml: SAML + register: Registru + registration_closed: "%{instance} no atzetat àteras persones" + resend_confirmation: Torra a imbiare is istrutziones de cunfirmatzione + reset_password: Reseta sa crae + security: Seguresa + set_new_password: Cunfigura una crae noa + setup: + email_below_hint_html: Si s'indiritzu de posta eletrònica imbeniente no est curreta, dda podes mudare inoghe e as a retzire unu messàgiu de cunfirmatzione nou. + email_settings_hint_html: Messàgiu de cunfirmatzione imbiadu a %{email}. Si custu indiritzu de posta eletrònica no est curretu, ddu podes mudare dae is cunfiguratziones de su contu. + title: Cunfiguratzione + status: + account_status: Istadu de su contu + confirming: Isetende chi sa posta eletrònica siat cumpletada. + functional: Su contu tuo est operativu. + pending: Sa dimanda tua est in protzessu de revisione dae su personale nostru. Podet serbire unu pagu de tempus. As a retzire unu messàgiu eletrònicu si sa dimanda est aprovada. + redirecting_to: Su contu tuo est inativu ca in die de oe est torrende a indiritzare a %{acct}. + too_fast: Mòdulu imbiadu tropu a lestru, torra a proare. + trouble_logging_in: Tenes problemas de atzessu? + use_security_key: Imprea una crae de seguresa + authorize_follow: + already_following: Ses giai sighende custu contu + already_requested: As giai imbiadu una dimanda de sighidura a custa persone + error: Faddina in sa chirca de su contu remotu + follow: Sighi + follow_request: 'As imbiadu una dimanda de sighidura a:' + following: 'Fatu! Immoe ses sighende:' + post_follow: + close: O, podes serrare custa ventana. + return: Ammustra su profilu de custa persone + web: Bae a su situ web + title: Sighi %{acct} + challenge: + confirm: Sighi + hint_html: "Cussìgiu: No t'amus a torrare a dimandare sa crae in s'ora imbeniente." + invalid_password: Sa crae no est vàlida + prompt: Cunfirma sa crae pro sighire + crypto: + errors: + invalid_key: no est una crae Ed25519 o Curve25519 vàlida + invalid_signature: no est una firma Ed25519 vàlida + date: + formats: + default: "%d %b %Y" + with_month_name: "%d %B %Y" + datetime: + distance_in_words: + about_x_hours: "%{count} o" + about_x_months: "%{count} me" + about_x_years: "%{count} an" + almost_x_years: "%{count} an" + half_a_minute: Immoe etotu + less_than_x_minutes: "%{count} m" + less_than_x_seconds: Immoe etotu + over_x_years: "%{count} an" + x_days: "%{count} d" + x_minutes: "%{count} m" + x_months: "%{count} me" + x_seconds: "%{count} s" + deletes: + challenge_not_passed: S'informatzione insertada no est curreta + confirm_password: Inserta·nche sa crae atuale pro verificare s'identidade + confirm_username: Iscrie su nòmine de utente tuo cunfirmare su protzedimentu + proceed: Cantzella su contu + success_msg: Contu cantzelladu + warning: + before: 'In antis de sighire, leghe custu cun atentzione:' + caches: Su cuntenutu chi siat istadu sarvadu in sa memòria temporànea de àteros serbidores podet sighire a esìstere + data_removal: Is publicatziones tuas e àteros datos ant a èssere cantzellados in manera permanente + email_change_html: Podes mudare s'indiritzu tuo de posta eletrònica sena cantzellare su contu + email_contact_html: Si no est ancora arribada, podes imbiare unu messàgiu a %{email} e dimandare agiudu + email_reconfirmation_html: Si no ses retzende su messàgiu de cunfirmatzione, ddu podes torrare a dimandare + irreversible: No as a pòdere ripristinare o torrare a ativare su contu tuo + more_details_html: Pro àteros detàllios, bide sa normativa de riservadesa. + username_available: Su nòmine de utente tuo at a torrare a èssere a disponimentu + username_unavailable: Su nòmine de utente tuo no at a abarrare a disponimentu + directories: + directory: Diretòriu de profilos + explanation: Iscoberi gente segundu is interessos suos + explore_mastodon: Esplora %{title} + domain_validator: + invalid_domain: no est unu nòmine de domìniu vàlidu 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. - '422': - '429': Too many requests - '500': - '503': The page could not be served due to a temporary server failure. + '400': Sa dimanda chi as imbiadu non fiat vàlida o non fiat curreta. + '403': Non tenes permissu pro bìdere custa pàgina. + '404': Sa pàgina chi ses chirchende no est inoghe. + '406': Custa pàgina no est a disponimentu in su formadu chi as pregontadu. + '410': Sa pàgina chi ses chirchende no esistet prus. + '422': + content: Faddina in sa verìfica de seguresa. Ses blochende is boboettos? + title: Faddina in sa verìfica de seguresa + '429': Tropu rechestas + '500': + content: Faddina dae s'ala nostra. + title: Custa pàgina no est curreta + '503': Faddina in sa trasmissione de sa pàgina pro more de una faddina temporànea de su serbidore. + noscript_html: Pro impreare s'aplicatzione web de Mastodon, ativa JavaScript. In alternativa, proa una de is aplicatziones nativas pro Mastodon in sa prataforma tua. + existing_username_validator: + not_found: impossìbile agatare utentes locales cun cussu nòmine + not_found_multiple: impossìbile agatare %{usernames} + exports: + archive_takeout: + date: Data + download: Iscàrriga s'archìviu + hint_html: Podes dimandare un'archìviu cun is tuts tuos e is mèdias chi as carrigadu. Is datos sunt in formadu ActivityPub, leghìbile dae is programmas cumpatìbiles. Podes pregontare un'archìviu cada 7 dies. + in_progress: Compilende s'archìviu tuo... + request: Pregonta s'archìviu tuo + size: Mannària + blocks: Ses blochende + bookmarks: Sinnalibros + csv: CSV + domain_blocks: Blocos de domìnios + lists: Listas + mutes: Ses ponende a sa muda + storage: Immagasinamentu + featured_tags: + add_new: Agiunghe noa + errors: + limit: As giai evidentziadu sa cantidade màssima de etichetas + hint_html: "Ite sunt is etichetas in evidèntzia? Sunt ammustradas in evidèntzia in su profilu pùblicu tuo e permitint a sa gente de navigare is messàgios pùblicos tuos in cussas etichetas ispetzìficas. Sunt un'aina perfeta pro tènnere unu registru de òperas creativas o progetos longos." + filters: + contexts: + account: Profilos + home: Pàgina printzipale e listas + notifications: Notìficas + public: Lìnias de tempos pùblicas + thread: Arresonadas + edit: + title: Modìfica filtru + errors: + invalid_context: Cuntestu mancante o non vàlidu + invalid_irreversible: Su filtràgiu non reversìbile funtzionat isceti in is cuntestos printzipale o de notìficas + index: + delete: Cantzella + empty: Non tenes perunu filtru. + title: Filtros + new: + title: Agiunghe unu filtru nou + footer: + developers: Iscuadra de isvilupu + more: Àteru… + resources: Resursas + trending_now: Est tendèntzia immoe + generic: + all: Totus + changes_saved_msg: Modìficas sarvadas. + copy: Còpia + delete: Cantzella + no_batch_actions_available: Peruna atzione in blocu a disponimentu dae custa pàgina + order_by: Òrdina pro + save_changes: Sarva is modìficas + validation_errors: + one: Calicuna cosa ancora no est andende. Bide sa faddina in bàsciu + other: Calicuna cosa ancora no est andende. Bide is %{count} faddinas in bàsciu + html_validator: + invalid_markup: 'cuntenet etichetas HTML non vàlidas: %{error}' + identity_proofs: + active: Ativu + authorize: Eja, autoriza + authorize_connection_prompt: Boles autorizare custa connessione critografada? + errors: + failed: Faddina in sa connessione critografada. Torra·bi a proare dae %{provider}. + keybase: + invalid_token: Is còdighes de autorizatzione de Keybase sunt hash de firmas e depent tènnere 66 caràteres esadetzimales + verification_failed: Keybase non reconnoschet custu còdighe de autorizatzione che a firma de s'utente de Keybase %{kb_username}. Torra·bi a proare dae Keybase. + wrong_user: Impossìbile creare una proa pro %{proving} cando as fatu s'atzessu che a %{current}. Intra che a %{proving} e torra·bi a proare. + explanation_html: Inoghe podes collegare critograficamente is àteras identidades tuas dae àteras prataformas, che a Keybase. Custu permitit a àteras persones de t'imbiare messàgios tzifrados in cussas prataformas e de tènnere sa seguresa chi sos cuntenutos chi lis mandas benit dae tene. + i_am_html: So %{username} in %{service}. + identity: Identidade + inactive: Inativu + publicize_checkbox: 'E imbiat custu tut:' + publicize_toot: 'Verificadu! So %{username} in %{service}: %{url}' + remove: Boga sa proa dae su contu + removed: Proa bogada dae su contu + status: Istadu de verìfica + view_proof: Bìdere sa proa + imports: + modes: + merge: Uni + merge_long: Mantene is registros chi esistint e agiunghe·nde àteros + overwrite: Subraiscrie + overwrite_long: Sostitui is registros atuales cun cussos noos + preface: Podes importare datos chi as esportadu dae unu àteru serbidore, che a sa lista de sa gente chi ses sighende o blochende. + success: Datos carrigados; ant a èssere protzessados luego + types: + blocking: Lista de blocados + bookmarks: Sinnalibros + domain_blocking: Lista domìnios blocados + following: Lista de sighiduras + muting: Lista gente a sa muda + upload: Càrriga + in_memoriam_html: In memoriam. + invites: + delete: Disativa + expired: Iscadidu + expires_in: + '1800': 30 minutos + '21600': 6 oras + '3600': 1 ora + '43200': 12 oras + '604800': 1 chida + '86400': 1 die + expires_in_prompt: Mai + generate: Gènera ligàmene de invitu + invited_by: 'As retzidu unu messàgiu de invitu dae:' + max_uses: + one: 1 impreu + other: "%{count} impreos" + max_uses_prompt: Sena lìmite + prompt: Gènera e cumpartzi ligàmenes cun àteras persones pro dare atzessu a custu serbidore + table: + expires_at: Iscadit + uses: Impreos + title: Invita gente + lists: + errors: + limit: Cantidade màssima de listas cròmpida + media_attachments: + validations: + images_and_video: Non si podet allegare unu vìdeu in una publicatzione chi cuntenet giai immàgines + not_ready: Impossìbile allegare archìvios chi no siant istados protzessados in manera totale. Torra·bi a proare a pustis + too_many: Impossìbile allegare prus de 4 archìvios + migrations: + acct: Mòidu a + cancel: Annulla s'indiritzamentu + cancel_explanation: Si annullas s'indiritzamentu, su contu tuo at a èssere torradu a ativare, però is sighiduras chi apas tramudadu a cussu contu no ant a pòdere èssere recuperadas. + cancelled_msg: Indiritzamentu annulladu. + errors: + already_moved: est su pròpiu contu a su chi as giai tramudadu + missing_also_known_as: no est unu nomìngiu de custu countu + move_to_self: non podet èssere su contu atuale + not_found: no agatadu + on_cooldown: Ses in perìodu de pàusa intre una tràmuda e s'àtera + followers_count: Gente chi ti sighiat in su momentu de sa tràmuda + incoming_migrations: Tramudada dae unu contu diferente + incoming_migrations_html: Pro tramudare cuntenutos dae un'àteru contu a custu, prima depes creare unu nomìngiu. + moved_msg: Su contu tuo immoe est torrende a indiritzare a %{acct} e sa gente chi ti sighit at a èssere tramudada. + not_redirecting: Su contu tuo no est torrende a indiritzare a perunu àteru contu immoe. + on_cooldown: As tramudadu su contu tuo de reghente. Custa funtzionalidade at a torrare a èssere a disponimentu de immoe a %{count} dies. + past_migrations: Tràmudas pretzedentes + proceed_with_move: Tràmuda sa gente chi ti sighit + redirected_msg: Su contu tuo immoe est torrende a indiritzare a %{acct}. + redirecting_to: Su contu tuo est torrende a indiritzare a %{acct}. + set_redirect: Cunfigura s'indiritzamentu + warning: + backreference_required: Su contu nou depet èssere prima cunfiguradu pro pòdere fàghere riferimentu a custu + before: 'In antis de sighire, leghe custu cun atentzione:' + cooldown: A pustis de tramudare, ddoe at a èssere unu perìodu de pàusa in su chi no as a pòdere torrare a tramudare + disabled_account: A pustis, su contu atuale tuo no at a èssere prus operativu in manera cumpleta. Sende gasi, as a tènnere atzessu a s'esportatzione de datos e a sa re-ativatzione. + followers: Custa atzione at a tramudare totu sa gente chi ti sighit dae su contu atuale a su contu nou + only_redirect_html: In alternativa, podes isceti cunfigurare un'indiritzamentu in su profilu tuo. + other_data: Perunu àteru datu at a èssere tramudadu in automàticu + redirect: Su profilu de su contu atuale tuo at a èssere atualizadu cun un'avisu de indiritzamentu e at a èssere esclùidu dae is chircas + moderation: + title: Moderatzione + move_handler: + carry_blocks_over_text: Custu utente s'est tramudadu dae %{acct}, chi as blocadu. + carry_mutes_over_text: Custu utente s'est tramudadu dae %{acct}, chi as impostadu a sa muda. + copy_account_note_text: 'Custu utente s''est tramudadu dae %{acct}, custas sunt sas notas antepostas tuas chi li pertocant:' + notification_mailer: + digest: + action: Ammustra totu is notìficas + body: Custu est unu resumu de su chi ti est sutzèdidu dae sa visita ùrtima tua su %{since} + mention: "%{name} t'at mentovadu in:" + new_followers_summary: + one: In prus, %{count} persone noa ti sighit dae cando fias assente. Incredìbile! + other: In prus, %{count} persones noas ti sighint dae cando fias assente. Incredìbile! + subject: + one: "1 notìfica noa dae s'ùrtima visita tua \U0001F418" + other: "%{count} notìficas noas dae s'ùrtima visita tua \U0001F418" + title: Durante s'ausèntzia tua... + favourite: + body: "%{name} at marcadu comente a preferidu s'istadu tuo:" + subject: "%{name} at marcadu comente a preferidu s'istadu tuo" + title: Preferidu nou + follow: + body: "%{name} t'est sighende!" + subject: "%{name} t'est sighende" + title: Una sighidura noa + follow_request: + action: Gesti is rechestas de sighidura + body: "%{name} at rechestu de ti sighire" + subject: 'Sighidura in ispera: %{name}' + title: Rechesta de sighidura noa + mention: + action: Risponde + body: "%{name} t'at mentovadu in:" + subject: "%{name} t'at mentovadu" + title: Mentovu nou + reblog: + body: "%{name} at cumpartzidu s'istadu tuo:" + subject: "%{name} at cumpartzidu s'istadu tuo" + title: Cumpartzidura noa + notifications: + email_events: Eventos pro notìficas cun posta eletrònica + email_events_hint: 'Seletziona eventos pro is chi boles retzire notìficas:' + other_settings: Àteras configuratziones de notìficas + number: + human: + decimal_units: + format: "%n%u" + units: + billion: Mrd + million: M + quadrillion: Blr + thousand: m + trillion: Bln + otp_authentication: + code_hint: Inserta·nche su còdighe generadu dae s'aplicatzione di autenticatzione pro cunfirmare + description_html: Si as a abilitare s'autenticatzione in duas fases impreende un'aplicatzione de autenticatzione, pro s'intrada as a dèpere tènnere in fatu su telèfonu tuo, chi at a ingendrare getones pro ti fàghere intrare. + enable: Ativa + instructions_html: "Iscansi custu còdighe QR in s'autenticadore de Google o in un'aplicatzione TOTP simigiante in su telèfonu tuo. Dae como a in antis, cuss'aplicatzione at a ingendrare getones chi as a dèpere insertare pro pòdere fàghere s'atzessu." + manual_instructions: 'Si non podet iscansire su còdighe QR e tenes bisòngiu de dd''insertare manualmente, inoghe ddoe est su còdighe segretu in testu craru:' + setup: Cunfigura + wrong_code: Su còdighe insertadu no est vàlidu! S'ora de su serbidore e de su dispositivu sunt curretas? + pagination: + newer: Prus reghente + next: Sighi + older: Prus betzu + prev: A coa + truncate: "…" + polls: + errors: + already_voted: As giai votadu in custu sondàgiu + duplicate_options: cuntenet elementos duplicados + duration_too_long: est tropu a tesu in su benidore + duration_too_short: est tropu chitzi + expired: Su sondàgiu est giai concruidu + invalid_choice: Su sèberu de votu chi as seberadu no esistet + over_character_limit: non podet èssere superiore a %{max} caràteres cadaunu + too_few_options: depet tènnere prus de un'elementu + too_many_options: non podet cuntènnere prus de %{max} elementos + preferences: + other: Àteru + posting_defaults: Valores predefinidos de publicatzione + public_timelines: Lìnias de tempos pùblicas + reactions: + errors: + limit_reached: Lìmite de reatziones diferentes cròmpidu + unrecognized_emoji: no est un'emoji reconnotu + relationships: + activity: Atividade de su contu + dormant: Firmu + follow_selected_followers: Sighi is persones seletzionadas + followers: Sighiduras + following: Sighende + invited: Invitos + last_active: Ùrtima atividade + most_recent: Prus reghentes + moved: Tramudadu + mutual: Pari-pari + primary: Primàriu + relationship: Relatzione + remove_selected_domains: Boga totu is sighiduras de is domìnios seletzionados + remove_selected_followers: Boga is sighiduras seletzionadas + remove_selected_follows: Non sigas prus is persones seletzionadas + status: Istadu de su contu + remote_follow: + acct: Inserta·nche s'utente@domìniu tuo dae su chi boles sighire custa persone + missing_resource: Impossìbile agatare sa rechesta de indiritzamentu URL pro su contu tuo + no_account_html: Non tenes ancora unu contu? Ti podes registrare inoghe + proceed: Cumintza a sighire + prompt: 'As a sighire a:' + reason_html: "Pro ite serbit custu? Podet èssere chi %{instance} non siat su serbidore aunde ses registradu, pro custu tenimus bisòngiu de ti torrare a indiritzare prima a su serbidore tuo." + remote_interaction: + favourite: + proceed: Sighi pro marcare che a preferidu + prompt: 'Boles marcare comente a preferidu custu tut:' + reblog: + proceed: Sighi pro cumpartzire + prompt: 'Boles cumpartzire custu tut:' + reply: + proceed: Sighi pro rispòndere + prompt: 'Boles rispòndere a custu tut:' + scheduled_statuses: + over_daily_limit: As superadu su lìmite de %{limit} tuts programmados pro cudda die + over_total_limit: As superadu su lìmite de %{limit} tuts programmados + too_soon: Sa data programmada depet èssere benidora + sessions: + activity: Ùrtima atividade + browser: Navigadore + browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Navigadore disconnotu + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Navigadore Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: Sessione atuale + description: "%{browser} de %{platform}" + explanation: Custos sunt is navigadores web de is chi ses intradu in su contu tuo de Mastodon. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: macOS + other: prataforma disconnota + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Rèvoca + revoke_success: Sessione revocada + title: Sessiones + settings: + account: Contu + account_settings: Cunfiguratziones de su contu + aliases: Nomìngios de su contu + appearance: Aspetu + authorized_apps: Aplicatziones autorizadas + back: Torra a Mastodon + delete: Eliminatzione de su contu + development: Isvilupu + edit_profile: Modìfica profilu + export: Esportatzione de datos + featured_tags: Etichetas in evidèntzia + identity_proofs: Proas de identidade + import: Importatzione + import_and_export: Importatzione e esportatzione + migrate: Tràmuda de contu + notifications: Notìficas + preferences: Preferèntzias + profile: Profilu + relationships: Persones chi sighis e chi ti sighint + two_factor_authentication: Autenticatzione de duos fatores + webauthn_authentication: Craes de seguresa + spam_check: + spam_detected: Custu est un'informe automàticu. Àliga rilevada. + statuses: + attached: + audio: + one: "%{count} àudio" + other: "%{count} àudios" + description: 'Allegadu: %{attached}' + image: + one: "%{count} immàgine" + other: "%{count} immàgines" + video: + one: "%{count} vìdeu" + other: "%{count} vìdeos" + boosted_from_html: Cumpartzidu dae %{acct_link} + content_warning: 'Avisu de cuntenutu: %{warning}' + disallowed_hashtags: + one: 'cuntenet un''eticheta non permìtida: %{tags}' + other: 'cuntenet is etichetas non permìtidas: %{tags}' + errors: + in_reply_not_found: Ses chirchende de rispòndere a unu tut chi no esistit prus. + language_detection: Rileva sa limba in automàticu + open_in_web: Aberi in sa web + over_character_limit: lìmite de caràteres de %{max} superadu + pin_errors: + limit: As giai apicadu su nùmeru màssimu de tuts + ownership: Is tuts de àtere non podent èssere apicados + private: Is tuts non pùblicos non podent èssere apicados + reblog: Is cumpartziduras non podent èssere apicadas + poll: + total_people: + one: "%{count} persone" + other: "%{count} persones" + total_votes: + one: "%{count} votu" + other: "%{count} votos" + vote: Vota + show_more: Ammustra·nde prus + show_newer: Ammustra is prus noos + show_older: Ammustra is prus betzos + show_thread: Ammustra su tema + sign_in_to_participate: Cumintzat sa sessione pro partetzipare in s'arresonada + title: '%{name}: "%{quote}"' + visibilities: + private: Isceti pro chie ti sighit + private_long: Ammustra isceti a chie ti sighit + public: Pùblicu + public_long: Podet èssere bidu dae chie si siat + unlisted: Esclùidu de sa lista + unlisted_long: Podet èssere bidu dae chie si siat, però non podet èssere ammustradu in lìnias de tempus pùblicas + stream_entries: + pinned: Tut apicadu + reblogged: cumpartzidu + sensitive_content: Cuntenutu sensìbile + tags: + does_not_match_previous_name: non cointzidet cun su nòmine anteriore + terms: + body_html: | +

    Polìtica de riservadesa

    +

    Ite informatziones collimus?

    + +
      +
    • Informatziones de base de su contu: Si t'as a registrare in custu serbidore, ti diant pòdere pedire de insertare unu nòmine utente, un'indiritzu de posta eletrònica e una crae de intrada. Dias pòdere insertare fintzas àteras informatziones de profilu, che a unu nòmine de ammustrare e una biografia, e carrigare un'immàgine de profilu e una de cobertedda. Su nòmine utente, cussu ammustradu, sa biografia, s'immàgine de profilu e de cobertedda sunt semper allistados in pùblicu.
    • +
    • Publicatziones, sighidores e àteras informatziones pùblicas: Sa lista de is persones chi sighis est allistada in pùblicu, e sa matessi cosa balet pro is chi ti sighint. Cando imbias unu messàgiu sa data e s'ora benint sarbadas, gasi comente s'aplicatzione dae sa cale as imbiadu su messàgiu. Is messàgios diant pòdere cuntènnere cuntenutos multimediales allongiados, che a immàgines e vìdeos. Is publicatziones pùblicas e no allistadas sunt a disponimentu in abertu. Cando ammustras una publicatzione in su profilu tuo, fintzas cussa est un'informatzione a disponimentu pùblicu. Is publicatziones tuas benint imbiadas a is sighidores tuos, cosa chi a bortas bolet nàrrere chi benint intregadas a serbidores diferentes chi nde sarbant còpias in cue. Cando cantzellas publicatziones, custu acontessimentu benit imbiadu fintzas issu a is sighidores tuos. S'atzione de torrare a cumpartzire o de pònnere in is preferidos un'àtera publicatzione est semper pùblica.
    • +
    • Publicatziones diretas e pro is sighidores ebbia: Totu is publicatziones benint archiviadas e protzessadas in su serbidore. Is publicatziones pro is sighidores ebbia benint intregadas a is sighidores tuos e a is utentes chi ddoe sunt mentovados in intro, e is publicatziones diretas benint intregadas isceti a is sighidores chi ddoe sunt mentovados in intro. In unos cantos casos bolet nàrrere chi benint intregados a serbidores diferentes e chi còpias issoro benint sarvadas in cue. Nois chircamus de limitare s'atzessu a custas publicatziones a is persones autorizadas ebbia, ma àteros serbidores bi diant pòdere non resessere. Pro custa resone est de importu mannu su de revisionare is serbidores a is cales faghent parte is sighidores tuos. Podes impreare un'optzione pro aprovare o refudare in manera automàtica sighidores noos in is cunfiguratziones. Ammenta·ti chi is operadores de su serbidore e cale si siat serbidore chi ddos retzit podent castiare custos messàgios, e chi is retzidores ddos diant pòdere sarvare faghende caturas, copiende·los o torrende·los a cumpartzire in àteras maneras. Non cumpartzas peruna informatzione perigulosa impreende Mastodon.
    • +
    • IP e àteros metadatos: Cando intras in su contu tuo sarvamus s'indiritzu IP dae su cale lu ses faghende, e fintzas su nòmine de s'aplicatzione chi impreas comente navigadore. Totu is sessiones de atzessu abertas sunt a disponimentu pro sa revisione e sa rèvoca in is cunfiguratziones tuas. S'ùrtimu indiritzu IP impreadu benit sarvadu finas a 12 meses. Diamus pòdere archiviare fintzas raportos chi includent is indiritzos IP de totu is rechestas a su serbidore nostru.
    • +
    + +
    + +

    Pro ite cosas impreamus is informatziones tuas?

    + +

    Totu is informatziones chi collimus dae tene diat pòdere èssere impreadas in is maneras chi sighint:

    + +
      +
    • Pro frunire sa funtzionalidade de base de Mastodon. Podes interagire cun is cuntenutos de is àteras persones, e cumpartzire is tuos, isceti cando ses intradu in su contu tuo. A esèmpiu, podes sighire àteras persones pro castiare is publicatziones cumbinadas issoro in sa lìnia de tempus personalizada printzipale tua.
    • +
    • Pro agiudare sa moderatzione de sa comunidade, a esèmpiu cunfrontende s'indiritzu IP tuo cun àteros giai connotos pro verificare evasiones de blocos o àteras violatziones.
    • +
    • S'indiritzu de posta eletrònica chi as a frunire diat pòdere èssere impreadu pro t'imbiare informatziones, notìficas a pitzu de àteras persones chi ant a interagire cun is cuntenutos tuos o chi t'ant a imbiare messàgios, e pro rispòndere a interrogativos e/o àteras rechestas o preguntas.
    • +
    + +
    + +

    Comente amparamus is informatziones tuas?

    + +

    Impreamus medidas de seguresa vàrias pro amparare sa seguresa de is informatziones personales tuas cando insertas o imbias is informatziones personales tuas, o cando b'atzedes. In paris a àteras cosas, sa sessione de su navigadore tuo, e fintzas su tràficu intre s'aplicatzione tua e s'API, benint amparados cun SSL, e sa crae tua benit tzifrada impreende un'algoritmu forte a una diretzione. Pro afortiare sa seguresa de s'atzessu a su contu tuo galu de prus podes abilitare s'autenticatzione in duos fatores.

    + +
    + +

    Cale est sa polìtica nostra de archiviatzione de is datos?

    + +

    Amus a fàghere un'isfortzu in fide bona pro chircare de:

    + +
      +
    • Mantènnere in archìviu is raportos chi cuntenent is indiritzos IP de totu is rechestas a custu serbidore, cando cussas rechestas benint registradas, pro non prus de 90 dies.
    • +
    • Mantènnere in archìviu is indiritzos IP assotziados a is utentes registrados pro non prus de 12 meses.
    • +
    + +

    Podes pedire e iscarrigare un'archìviu de is cuntenutos tuos chi includet is publicatziones tuas, is elementos multimediales allongiados, s'immàgine de profilu e cussa de cobertedda.

    + +

    Podes cantzellare su contu tuo in manera irreversìbile in cale si siat momentu.

    + +
    + +

    Impreamus is testimòngios?

    + +

    Eja. Is testimòngios ("cookies") sunt documentos minores chi unu situ o su frunidore de servìtzios suos tramudant a su discu tèteru de s'elaboradore tuo pro mèdiu de su navigadore web tuo (si bi lu permitis). Custos testimòngios permitint a su situ de reconnòschere su navigadore tuo e, si tenes unu contu registradu, de dd'assotziare cun su contu tuo.

    + +

    Impreamus is testimòngios pro cumprèndere e sarvare is preferèntzias tuas pro is bìsitas imbenientes.

    + +
    + +

    Rivelamus carchi informatzione a tertzas partes?

    + +

    Non bendimus, cuncambiamus, o tramudamus in àteras maneras is informatziones tuas chi ti diant pòdere individuare in manera personale. Custu no incluit sugetos de tertzas partes fidados chi nos agiudant a amministrare su situ, fàghere is fainas nostras, o a t'agiudare, finas a cando cussos sugetos atzetant de mantènnere cunfidentziales cussas informatziones. Diamus fintzas pòdere frunire is informatziones tuas si amus a èssere cumbintos chi siat apropriadu pro sighire is leges, aplicare is polìticas de su situ nostru, e amparare is deretos, propiedades o seguresas nostros o de àteros.

    + +

    Is cuntenutos pùblicos tuos diant pòdere èssere iscarrigados dae àteros serbidores in sa retza. Is publicatziones pùblicas e pro is sighidores ebbia benint intregadas a is serbidores in ue istant is retzidores, si istant in unu serbidore chi no est custu.

    + +

    Cando autorizas un'aplicatzione a impreare su contu tuo, a segunda de sa mannària de is permissos chi frunis, cussa diat pòdere atzèdere a is informatziones pùblicas de profilu tuas, a sa lista de is persones chi sighis e chi ti sighint, a is listas tuas, a totu is publicatziones tuas e a is referidos tuos. Is aplicatziones non podent mai tènnere atzessu a s'indiritzu de posta eletrònica tuo e a sa crae de intrada tua.

    + +
    + +

    Impreu de custu situ dae arte de pitzinnos

    + +

    Si custu serbidore est in s'UE o in s'ÀEE: Su situ nostru, is produtos nostros e is servìtzios nostros sunt totu cantos pensados pro persones chi tenent a su mancu 16 annos de edade. Si tenes de mancu de 16 annos, in aplicatzione de is rechisitos de su GDPR (General Data Protection Regulation) no imprees custu situ.

    + +

    Si custu serbidore est in sos IUA: Su situ nostru, is produtos e is servìtzios suos sunt totu cantos pensados pro persones chi tenent a su mancu 13 annos de edade. Si tenes de mancu de 13 annos, in aplicatzione de su COPPA (Children's Online Privacy Protection Act) no imprees custu situ.

    + +

    Is rechisidos de sa lege diant pòdere èssere diferentes si custu serbidore est in suta de un'àtera giurisditzione.

    + +
    + +

    Modìficas a sa polìtica de riservadesa nostra

    + +

    Si amus a isseberare de cambiare sa polìtica de riservadesa nostra amus a publicare is modìficas in custa pàgina.

    + +

    Custu documentu tenet una litzèntzia CC-BY-SA. Est istadu agiornadu s'ùrtima borta su 7 de martzu de su 2018.

    + +

    Adatadu, in orìgine, dae sa Polìtica de riservadesa de Discourse.

    + title: "%{instance} Cunditziones de su servìtziu e polìtica de riservadesa" + themes: + contrast: Mastodon (cuntrastu artu) + default: Mastodon (iscuru) + mastodon-light: Mastodon (craru) + time: + formats: + default: "%d %b %Y, %H:%M" + month: "%b %Y" + two_factor_authentication: + add: Agiunghe + disable: Disativa 2FA + disabled_success: Autenticatzione de duos fatores disativada + edit: Modìfica + enabled: Autenticatzione de duos fatores ativada + enabled_success: Autenticatzione de duos fatores ativada + generate_recovery_codes: Gènera còdighes de recùperu + lost_recovery_codes: Is còdighes de recùperu ti permitint de recuperare s'atzessu a su contu tuo si as a pèrdere su telèfonu tuo. Si perdes is còdighes de recùperu tuos, ddos podes torrare a ingendrare inoghe. Is còdighes betzos tuos s'ant a invalidare. + methods: Mètodos in duos fatores + otp: Aplicatzione de autenticatzione + recovery_codes: Còdighes de recùperu de còpia de seguridade + recovery_codes_regenerated: Còdighes de recùperu torrados a generare + recovery_instructions_html: Si una die as a pèrdere s'atzessu a su telèfonu tuo, as a pòdere impreare unu de is còdighes de recùperu inoghe in suta pro recuperare s'atzessu a su contu tuo. Cunserva is còdighes in manera segura. A esèmpiu, ddos dias pòdere imprentare e archiviare in paris a àteros documentos de importu. + webauthn: Craes de seguresa + user_mailer: + backup_ready: + explanation: As pedidu una còpia de seguresa totale de su contu de Mastodon tuo. Como est pronta pro s'iscarrigamentu! + subject: S'archìviu tuo est prontu pro èssere iscarrigadu + title: Collida dae s'archìviu + sign_in_token: + details: 'Custos sunt is detàllios de su tentativu:' + explanation: 'Amus rilevadu unu tentativu de identificatzione in su contu tuo dae un''indiritzu IP non reconnotu. Si fias tue, inserta su còdighe de seguresa in bàsciu in sa pàgina disafiu de identificatzione:' + further_actions: 'Si no fias tue, càmbia sa crae tua e ativa s''autenticatzione in duos passos in su contu tuo. Ddu podes fàghere inoghe:' + subject: Cunfirma su tentativu de identificatzione + title: Tentativu de identificatzione + warning: + explanation: + disable: Non podes prus intrare in su contu tuo o dd'impreare in cale si siat àtera manera, ma su profilu e is àteros datos tuos abarrant intatos. + sensitive: Is elementos e documentos multimediales carrigados e ligados tuos ant a èssere tratados che a sensìbiles. + silence: Podes ancora impreare so contu tuo, ma isceti is persones chi ti sunt giai sighende ant a bìdere is tuts tuos in custu serbidore, e dias pòdere èssere esclùdidu dae unas cantas listas pùblicas. Nointames custu, is àteros ti diant pòdere galu sighire in manera manuale. + suspend: Non podes prus impreare su contu tuo, e su profilu e àteros datos non sunt prus atzessìbiles. Bi podes galu intrare pro pedire una còpia de seguresa de is datos tuos finas a cando no ant a èssere cantzellados de su totu, ma nd'amus a mantènnere unos cantos pro non ti permìtere de evàdere sa suspensione. + get_in_touch: Podes rispòndere a custu indiritzu de posta eletrònica pro cuntatare cun su personale de %{instance}. + review_server_policies: Revisionat sas polìticas de su serbidore + statuses: 'In manera cuncreta, pro:' + subject: + disable: Su contu tuo %{acct} est istadu cungeladu + none: Avisu pro %{acct} + sensitive: Is elementos multimediales de publicatzione de su contu tuo %{acct} sunt istados marcados comente sensìbiles + silence: Su contu tuo %{acct} est istadu limitadu + suspend: Su contu tuo %{acct} est istadu suspèndidu + title: + disable: Contu congeladu + none: Atentzione + sensitive: S'elementu multimediale tuo est istadu marcadu comente sensìbile + silence: Contu limitadu + suspend: Contu suspèndidu + welcome: + edit_profile_action: Cunfigura su profilu + edit_profile_step: Podes personalizare su profilu tuo carrighende un'àvatar o un'intestatzione, cambiende su nòmine visìbile tuo e faghende fintzas àteru. Si boles revisionare is sighidores noos in antis chi tèngiant su permissu de ti sighire podes blocare su contu tuo. + explanation: Inoghe b'ant una paja de impòsitos pro cumintzare + final_action: Cumintza a publicare + final_step: 'Cumintza a publicare! Fintzas si no ti sighit nemos is àteros podent bìdere is messàgios pùblicos tuos, pro esèmpiu in sa lìnia de tempus locale e in is etichetas ("hashtags"). Ti dias pòdere bòlere introduire a sa comunidade cun s''eticheta #introductions.' + full_handle: Su nòmine utente intreu tuo + full_handle_hint: Custu est su chi dias nàrrere a is amigos tuos pro chi ti potzant imbiare messàgios o sighire dae un'àteru serbidore. + review_preferences_action: Muda is preferèntzias + review_preferences_step: Ammenta·ti de impostare is preferèntzias tuas, che a is lìteras de posta eletrònicas chi boles retzire, o ite livellu de riservadesa dias bòlere chi siat predefinidu pro is messàgios tuos. Si is immàgines in movimentu non ti infadant podes isseberare de abilitare sa riprodutzione automàtica de is GIF. + subject: Ti donamus su benebènnidu a Mastodon + tip_federated_timeline: Sa lìnia de tempus federada est una vista globale de sa retza de Mastodon. Ma incluit isceti is persones sighidas dae is bighinos tuos, duncas no est totale. + tip_following: Pro more de is cunfiguratziones predefinidas sighis s'amministratzione de su serbidore tuo. Pro agatare àteras persones de interessu, càstia is lìnias de su tempus locale e federada. + tip_local_timeline: Sa lìnia de tempus locale est una vista globale de is persones in %{instance}. Custos sunt is bighinos tuos! + tip_mobile_webapp: Si su navigadore mòbile tuo t'oferit de agiùnghere Mastodon a s'ischermada printzipale tua podes retzire notìficas push. Funtzionat che a un'aplicatzione nativa in maneras medas! + tips: Impòsitos + title: Bene bènnidu a bordu, %{name}! + users: + blocked_email_provider: Custu frunidore de posta eletrònica no est permìtidu + follow_limit_reached: Non podes sighire prus de %{limit} persones + generic_access_help_html: Tenes problemas a intrare in su contu tuo? Podes cuntatare a %{email} pro retzire agiudu + invalid_email: Custu indiritzu de posta eletrònica no est vàlidu + invalid_email_mx: Custu indiritzu de posta eletrònica paret chi no esistat + invalid_otp_token: Còdighe a duas fases non vàlidu + invalid_sign_in_token: Còdighe de seguresa non vàlidu + otp_lost_help_html: Si as pèrdidu s'atzessu a ambos, podes cuntatare a %{email} + seamless_external_login: Ses intradu pro mèdiu de unu servìtziu esternu, e pro custa resone is impostatziones de sa crae de intrada e de posta eletrònica non sunt a disponimentu. + signed_in_as: 'Sessione aberta comente:' + suspicious_sign_in_confirmation: Paret chi tue non sias giai intradu dae custu dispositivu e non ses intradu dae unu pagu de tempus, duncas ti semus mandende unu còdighe de seguresa a s'indiritzu de posta eletrònica tuo pro cunfirmare chi ses tue. + verification: + explanation_html: 'Ti podes verificare a sa sola comente mere de is ligòngios in is metadatos de su profilu tuo. Pro ddu fàghere su situ ligadu depet cuntènnere unu ligòngiu chi torret a su profilu de Mastodon tuo. Su ligòngiu in su situ depet tènnere un''atributu rel="me". Su testu cuntenutu in su ligòngiu no est de importu. Custu est un''esèmpiu:' + verification: Verìfica + webauthn_credentials: + add: Agiunghe una crae de seguresa noa + create: + error: Ddoe est istadu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare. + success: Sa crae de seguresa tua est istada agiunta. + delete: Cantzella + delete_confirmation: Seguru chi boles cantzellare custa crae de seguresa? + description_html: Si permites s'autenticatzione cun crae de seguresa, as a tènnere bisòngiu de impreare una de is craes de seguresa tuas pro ti identificare. + destroy: + error: Ddoe est istadu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare. + success: Sa crae de seguresa tua est istada cantzellada. + invalid_credential: Crae de seguresa non vàlida + nickname_hint: Inserta su nomìngiu de sa crae de seguresa tua noa + not_enabled: No as ativadu ancora WebAuthn + not_supported: Custu navigadore no est cumpatìbile cun is craes de seguresa + otp_required: Pro impreare is craes de seguresa depes ativare prima s'autenticatzione in duos passos. + registered_on: 'Registratzione: %{date}' diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index b4d356279..b3692f5ba 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -126,6 +126,7 @@ ca: expires_in: Expira després fields: Metadades del perfil header: Capçalera + honeypot: "%{label} (no omplir)" inbox_url: URL de la safata d'entrada del relay irreversible: Cau en lloc d'ocultar locale: Llengua de la interfície diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 72303a375..711dbf5c6 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -126,6 +126,7 @@ de: expires_in: Läuft ab fields: Tabellenfelder header: Titelbild + honeypot: "%{label} (nicht ausfüllen)" inbox_url: Inbox-URL des Relais irreversible: Verwerfen statt verstecken locale: Sprache der Benutzeroberfläche diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index aaa0d7ae0..d4c8a2da6 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -65,6 +65,12 @@ el: data: Αρχείο CSV που έχει εξαχθεί από διαφορετικό κόμβο Mastodon invite_request: text: Αυτό θα μας βοηθήσει να επιθεωρήσουμε την αίτησή σου + ip_block: + comment: Προαιρετικό. Θυμηθείτε γιατί προσθέσατε αυτόν τον κανόνα. + severities: + no_access: Αποκλεισμός πρόσβασης σε όλους τους πόρους + sign_up_requires_approval: Νέες εγγραφές θα απαιτούν την έγκριση σας + severity: Επιλέξτε τι θα γίνεται με αιτήσεις από αυτήν την διεύθυνση IP sessions: otp: 'Βάλε τον κωδικό δυο παραγόντων (2FA) από την εφαρμογή του τηλεφώνου σου ή χρησιμοποίησε κάποιον από τους κωδικούς ανάκτησης σου:' webauthn: Αν πρόκειται για ένα κλειδί USB βεβαιωθείτε ότι είναι συνδεδεμένο και αν απαιτείται πατήστε το ελαφρά. @@ -92,6 +98,7 @@ el: types: disable: Απενεργοποίηση none: Καμία ενέργεια + sensitive: Ευαίσθητο silence: Αποσιώπηση suspend: Αναστολή και αμετάκλητη διαγραφή στοιχείων λογαριασμού warning_preset_id: Χρήση προκαθορισμένης προειδοποίησης @@ -117,6 +124,7 @@ el: expires_in: Λήξη μετά από fields: Μεταδεδομένα προφίλ header: Επικεφαλίδα + honeypot: "%{label} (μη συμπληρώνετε)" inbox_url: Το URL του inbox του ανταποκριτή (relay) irreversible: Απόρριψη αντί για κρύψιμο locale: Γλώσσα χρήσης @@ -136,6 +144,7 @@ el: setting_default_privacy: Ιδιωτικότητα δημοσιεύσεων setting_default_sensitive: Σημείωση όλων των πολυμέσων ως ευαίσθητου περιεχομένου setting_delete_modal: Επιβεβαίωση πριν τη διαγραφή ενός τουτ + setting_disable_swiping: Απενεργοποίηση κινήσεων συρσίματος setting_display_media: Εμφάνιση πολυμέσων setting_display_media_default: Προκαθορισμένο setting_display_media_hide_all: Απόκρυψη όλων @@ -172,6 +181,9 @@ el: ip_block: comment: Σχόλιο ip: IP + severities: + no_access: Αποκλεισμός πρόσβασης + sign_up_requires_approval: Περιορισμός εγγραφών severity: Κανόνας notification_emails: digest: Αποστολή συνοπτικών email diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 98fda0916..3f399deae 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -47,6 +47,9 @@ eo: data: CSV-dosiero el alia Mastodon-servilo invite_request: text: Ĉi tio helpos nin revizii vian kandidatiĝon + ip_block: + severities: + sign_up_requires_approval: Novaj registriĝoj devigos vian aprobon sessions: otp: 'Enmetu la kodon de dufaktora aŭtentigo el via telefono aŭ uzu unu el viaj realiraj kodoj:' user: @@ -70,6 +73,7 @@ eo: types: disable: Malebligi none: Fari nenion + sensitive: Tikla silence: Silentigi suspend: Haltigi kaj nemalfereble forigi kontajn datumojn warning_preset_id: Uzi antaŭagorditan averton @@ -95,6 +99,7 @@ eo: expires_in: Eksvalidiĝas post fields: Profilaj metadatumoj header: Fonbildo + honeypot: "%{label} (ne plenigi)" inbox_url: URL de la ripetila enirkesto irreversible: Forĵeti anstataŭ kaŝi locale: Interfaca lingvo @@ -108,12 +113,12 @@ eo: setting_advanced_layout: Ebligi altnivelan retpaĝan interfacon setting_aggregate_reblogs: Grupigi diskonigojn en tempolinioj setting_auto_play_gif: Aŭtomate ekigi GIF-ojn - setting_boost_modal: Montri fenestron por konfirmi antaŭ ol diskonigi mesaĝon + setting_boost_modal: Montri konfirman fenestron antaŭ ol diskonigi mesaĝon setting_crop_images: Stuci bildojn en negrandigitaj mesaĝoj al 16x9 setting_default_language: Publikada lingvo setting_default_privacy: Mesaĝa videbleco setting_default_sensitive: Ĉiam marki aŭdovidaĵojn tiklaj - setting_delete_modal: Montri fenestron por konfirmi antaŭ ol forigi mesaĝon + setting_delete_modal: Montri konfirman fenestron antaŭ ol forigi mesaĝon setting_display_media: Aŭdovidaĵa montrado setting_display_media_default: Dekomenca setting_display_media_hide_all: Kaŝi ĉiujn @@ -126,7 +131,7 @@ eo: setting_system_font_ui: Uzi la dekomencan tiparon de la sistemo setting_theme: Reteja etoso setting_trends: Montri hodiaŭajn furoraĵojn - setting_unfollow_modal: Montri fenestron por konfirmi antaŭ ol ĉesi sekvi iun + setting_unfollow_modal: Montri konfirman fenestron antaŭ ol ĉesi sekvi iun setting_use_blurhash: Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj setting_use_pending_items: Malrapida reĝimo severity: Graveco @@ -145,6 +150,13 @@ eo: comment: Komento invite_request: text: Kial vi volas aliĝi? + ip_block: + comment: Komento + ip: IP + severities: + no_access: Bloki atingon + sign_up_requires_approval: Limigi registriĝojn + severity: Regulo notification_emails: digest: Sendi resumajn retmesaĝojn favourite: Sendi retmesaĝon kiam iu stelumas vian mesaĝon diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index cc27b9643..153c1101d 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -126,6 +126,7 @@ es-AR: expires_in: Vence después de fields: Metadatos de perfil header: Cabecera + honeypot: "%{label} (no rellenar)" inbox_url: Dirección web de la bandeja de entrada del relé irreversible: Dejar en lugar de ocultar locale: Idioma de la interface diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index f53bdd143..5da47d54a 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -126,6 +126,7 @@ es: expires_in: Expirar tras fields: Metadatos de perfil header: Img. cabecera + honeypot: "%{label} (no rellenar)" inbox_url: URL de la entrada de relés irreversible: Dejar en lugar de ocultar locale: Idioma diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 6425011b6..5960c2610 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -126,6 +126,7 @@ fa: expires_in: تاریخ انقضا fields: اطلاعات تکمیلی نمایه header: تصویر زمینه + honeypot: "%{label} (پر نکنید)" inbox_url: نشانی صندوق ورودی رله irreversible: به جای پنهان‌سازی، حذف کن locale: زبان محیط کاربری diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 51446f63c..e173dc0dc 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -126,6 +126,7 @@ fr: expires_in: Expire après fields: Métadonnées du profil header: Image d’en-tête + honeypot: "%{label} (ne pas remplir)" inbox_url: URL de la boîte de relais irreversible: Supprimer plutôt que masquer locale: Langue de l’interface @@ -172,15 +173,15 @@ fr: featured_tag: name: Hashtag interactions: - must_be_follower: Masquer les notifications des personnes qui ne vous suivent pas - must_be_following: Masquer les notifications des personnes que vous ne suivez pas + must_be_follower: Bloquer les notifications des personnes qui ne vous suivent pas + must_be_following: Bloquer les notifications des personnes que vous ne suivez pas must_be_following_dm: Bloquer les messages directs des personnes que vous ne suivez pas invite: comment: Commentaire invite_request: text: Pourquoi voulez-vous vous inscrire ? ip_block: - comment: Commenter + comment: Commentaire ip: IP severities: no_access: Bloquer l’accès @@ -188,13 +189,13 @@ fr: severity: Règle notification_emails: digest: Envoyer des courriels récapitulatifs - favourite: Envoyer un courriel lorsque quelqu’un ajoute mes statuts à ses favoris - follow: Envoyer un courriel lorsque quelqu’un me suit - follow_request: Envoyer un courriel lorsque quelqu’un demande à me suivre - mention: Envoyer un courriel lorsque quelqu’un me mentionne + favourite: Quelqu’un ajoute mon pouet à ses favoris + follow: Quelqu’un vient de me suivre + follow_request: Quelqu’un demande à me suivre + mention: Quelqu’un me mentionne pending_account: Nouveau compte en attente d’approbation - reblog: Quelqu’un a partagé votre pouet - report: Envoyer un courriel lorsqu’un nouveau rapport est soumis + reblog: Quelqu’un partage mon pouet + report: Un nouveau rapport est envoyé trending_tag: Un hashtag non approuvé est dans les tendances tag: listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index f2ebf1d6e..799312e33 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -56,7 +56,7 @@ gl: domain: Este dominio estará en disposición de obter datos desde este servidor e datos de entrada a el poderán ser procesados e gardados email_domain_block: domain: Esto pode ser o nome de dominio que aparece no enderezo do correo, o rexistro MX que resolve o dominio, ou o IP do servidor que resolve o rexistro MX. Estos confrontaranse contra o rexistro da usuaria e o rexistro será rexeitado. - with_dns_records: Vaise facer un intento de resolver os rexistros DNS propocionados e os resultados tamén irán a lista negra + with_dns_records: Vaise facer un intento de resolver os rexistros DNS proporcionados e os resultados tamén irán a lista de bloqueo featured_tag: name: 'Poderías usar algunha destas:' form_challenge: @@ -98,11 +98,11 @@ gl: text: Aviso personalizado type: Acción types: - disable: Desactivar conexión - none: Non facer nada + disable: Desactivar + none: Enviar un aviso sensitive: Sensible - silence: Acalar - suspend: Suspender e eliminar irreversiblemente datos da conta + silence: Limitar + suspend: Suspender warning_preset_id: Utilizar un aviso preestablecido announcement: all_day: Evento para todo o día @@ -126,6 +126,7 @@ gl: expires_in: Caduca tras fields: Metadatos do perfil header: Cabeceira + honeypot: "%{label} (non completar)" inbox_url: URL da caixa de entrada do repetidor irreversible: Soltar en lugar de agochar locale: Idioma da interface diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 242f1ffac..d5e82ecb2 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -126,6 +126,7 @@ hu: expires_in: Elévül fields: Profil metaadatok header: Fejléc + honeypot: "%{label} (ne töltsd ki)" inbox_url: Relé inbox-hoz tartozó URL irreversible: Eldobás elrejtés helyett locale: Felhasználói felület nyelve diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index aaa5d88e5..cdea55a5d 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -66,6 +66,7 @@ hy: invite_request: text: Սա կօգնի մեզ ստուգել քո յաւելուածը ip_block: + expires_in: IP հասցէները սահմանափակ են, դրանք երբեմն օգտագործուում են ընդհանուր կամ անցնում ձեռքից ձեռք։ Այդ պատճառով խորհուրդ չի տրւում IP-ների անժամկետ արգելափակումը։ ip: Ներմուծէք IPv4 կամ IPv6 հասցէն։ Նաև կարող ես արգելափակել հասցէների միջակայքեր օգտագործելով CIDR սինտաքսը։ Զգոյշ եղիր՝ ինքդ քեզ չարգելափակես։ sessions: otp: Մուտքագրիր երկքայլ նոյնականացման կոդը, որը գեներացուես ես քո բջջային յաւելուածի օգնութեամբ կամ օգտագործիր այս կոդերից կէկը՝ diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index ed948a699..53e34f00c 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -126,6 +126,7 @@ is: expires_in: Rennur út eftir fields: Lýsigögn notandasniðs header: Síðuhaus + honeypot: "%{label} (ekki fylla út)" inbox_url: URL-slóð á innhólf endurvarpa irreversible: Fella niður í staðinn fyrir að fela locale: Tungumál viðmóts diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 1e79d593d..82f12861f 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -126,6 +126,7 @@ it: expires_in: Scade dopo fields: Metadati del profilo header: Intestazione + honeypot: "%{label} (non compilare)" inbox_url: URL della inbox del ripetitore irreversible: Elimina invece di nascondere locale: Lingua dell'interfaccia diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 8588073d8..5c47a99c4 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -126,6 +126,7 @@ ko: expires_in: 만료시각 fields: 프로필 메타데이터 header: 헤더 + honeypot: "%{label} (채우지 마시오)" inbox_url: 릴레이 서버의 inbox URL irreversible: 숨기는 대신 삭제 locale: 인터페이스 언어 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index 2a0cdc66b..8ff8a5a46 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -100,6 +100,7 @@ ku: types: disable: بەستن none: ناردنی ئاگاداری + sensitive: هەستیار silence: سنوور suspend: ڕاگرتن warning_preset_id: بەکاهێنانی ئاگاداری پێش وەختە diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 7989f6981..bdaa1dd5c 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -65,6 +65,10 @@ nl: data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd invite_request: text: Dit helpt ons om jouw aanvraag te beoordelen + ip_block: + comment: Optioneel. Vergeet niet te onthouden waarom je deze regel hebt toegevoegd. + severities: + sign_up_requires_approval: Nieuwe registraties vereisen jouw goedkeuring sessions: otp: 'Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:' tag: @@ -91,6 +95,7 @@ nl: types: disable: Bevriezen none: Waarschuwing sturen + sensitive: Gevoelig silence: Beperken suspend: Opschorten en onomkeerbaar accountgegevens verwijderen warning_preset_id: Gebruik een voorinstelling van een waarschuwing @@ -135,6 +140,7 @@ nl: setting_default_privacy: Standaardzichtbaarheid van jouw toots setting_default_sensitive: Media altijd als gevoelig markeren setting_delete_modal: Vraag voor het verwijderen van een toot een bevestiging + setting_disable_swiping: Swipebewegingen uitschakelen setting_display_media: Mediaweergave setting_display_media_default: Standaard setting_display_media_hide_all: Alles verbergen @@ -168,6 +174,13 @@ nl: comment: Opmerking invite_request: text: Waarom wil jij je aanmelden? + ip_block: + comment: Opmerking + ip: IP + severities: + no_access: Toegang blokkeren + sign_up_requires_approval: Registraties beperken + severity: Regel notification_emails: digest: Periodiek e-mails met een samenvatting versturen favourite: Wanneer iemand jouw toot aan hun favorieten heeft toegevoegd @@ -188,4 +201,7 @@ nl: required: mark: "*" text: vereist + title: + sessions: + webauthn: Gebruik een van uw beveiligingssleutels om in te loggen 'yes': Ja diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index a02d0be35..6fc33ab08 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -126,6 +126,7 @@ pl: expires_in: Wygaśnie po fields: Metadane profilu header: Nagłówek + honeypot: "%{label} (nie wypełniaj)" inbox_url: Adres skrzynki przekaźnika irreversible: Usuwaj zamiast ukrywać locale: Język interfejsu diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 614d78c55..869ecaddc 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -126,6 +126,7 @@ pt-PT: expires_in: Expira em fields: Meta-dados de perfil header: Cabeçalho + honeypot: "%{label} (não preencher)" inbox_url: URL da caixa de entrada do repetidor irreversible: Expandir em vez de esconder locale: Idioma diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index fdd60c881..5baa9d46e 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -126,6 +126,7 @@ ru: expires_in: Истекает через fields: Метаданные профиля header: Шапка + honeypot: "%{label} (не заполнять)" inbox_url: URL для входящих от ретрансляторов irreversible: Удалять, а не скрывать locale: Язык интерфейса diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml index 91bd6d92f..99d5ab429 100644 --- a/config/locales/simple_form.sc.yml +++ b/config/locales/simple_form.sc.yml @@ -1 +1,213 @@ +--- sc: + simple_form: + hints: + account_alias: + acct: Dislinda su nòmineutente@domìniu de su contu dae su cale ti boles mòere + account_migration: + acct: Dislinda su nòmineutente@domìniu de su contu cara a su cale ti boles mòere + account_warning_preset: + text: Podes impreare sa sintassi de is tuts, che a is URL, is etichetas e is mentovos + title: Optzionale. Invisìbile a s'àtera persone + admin_account_action: + include_statuses: S'utente at a bìdere is tuts chi ant causadu s'atzione o s'avisu de moderatzione + send_email_notification: S'utente at a retzire un'ispiegatzione de su chi siat sutzèdidu in su contu suo + text_html: Optzionale. Podes impreare sa sintassi de is tuts. Podes agiùnghere avisos pre-impostados pro risparmiare tempus + type_html: Sèbera ite fàghere cun %{acct} + warning_preset_id: Optzionale. Podes ancora agiùnghere testu personalizadu a s'acabu de cussu predefinidu + announcement: + all_day: Si est marcadu, ant a èssere ammustradas isceti is datas de s'intervallu de tempus + ends_at: Optzionale. S'annùntziu at a acabbare de abarrare publicadu in custu momentu + scheduled_at: Lassa bòidu pro publicare s'annùntziu immediatamente + starts_at: Optzionale. S'in casu chi s'annùntziu tuo siat ligadu a un'intervallu de tempus ispetzìficu + text: Podes impreare sa sintassi de is tuts. Dae cara a su tretu chi s'annùntziu at a pigare in s'ischermu de s'utente + defaults: + autofollow: Is persones chi s'ant a registrare pro mèdiu de s'invitu t'ant a sighire in manera automàtica + avatar: PNG, GIF o JPG. Màssimu %{size}. Ant a èssere iscaladas a %{dimensions}px + bot: Custu contu faghet pro su prus atziones automatizadas e diat pòdere no èssere monitoradu + context: Unu o prus cuntestos in ue su filtru si diat dèpere aplicare + current_password: Pro chistiones de seguresa inserta sa crae de intrada de su contu atuale + current_username: Pro cunfirmare inserta su nòmine utente de su contu atuale + digest: Imbiadu isceti a pustis de unu perìodu longu de inatividade, e isceti si as retzidu carchi messàgiu personale cando non bi fias + discoverable: Sa cartella de is profilos est un'àtera manera pro fàghere otènnere unu pùblicu prus mannu a su contu tuo + email: T'amus a mandare unu messàgiu eletrònicu de cunfirma + fields: Podes tènnere finas a 4 elementos ammustrados in una tabella in su profilu tuo + header: PNG, GIF o JPG. Màssimu %{size}. Ant a èssere iscaladas a %{dimensions}px + inbox_url: Còpia s'URL dae sa pàgina printzipale de su ripetidore chi boles impreare + irreversible: Is tuts filtrados ant a isparèssere in manera irreversìbile, fintzas si prus a tardu s'at a bogare su filtru + locale: Sa limba de s'interfache de s'utente, de is lìteras de posta eletrònica e de is notìficas push + locked: Tenet bisòngiu chi aproves a manu is sighiduras + password: Imprea a su mancu 8 caràteres + phrase: Su cunfrontu s'at a fàghere chena pigare in cunsideru si su testu de sa publicatzione est minùsculu o majùsculu o si tenet un'avisu de cuntenutu + scopes: A ite API s'aplicatzione at a pòdere atzèdere. Si seletziones un'àmbitu de livellu artu no tenes bisòngiu de nde seletzionare de sìngulos. + setting_aggregate_reblogs: No ammustres cumpartziduras noas pro tuts chi sunt istados cumpartzidos dae pagu (tenet efetu isceti pro is cumpartziduras retzidas noas) + setting_default_sensitive: Is elementos multimediales sensìbiles benint cuados dae is cunfiguratziones predefinidas e si podent rivelare cun un'incarcu + setting_display_media_default: Cua elementos multimediales marcados comente sensìbiles + setting_display_media_hide_all: Cua semper is elementos multimediales + setting_display_media_show_all: Ammustra semper is elementos multimediales + setting_hide_network: Sa gente chi sighis o chi ti sighit no at a èssere ammustrada in su profilu tuo + setting_noindex: Tenet efetu in su profilu pùblicu tuo e in is pàginas de is istados + setting_show_application: S'aplicatzione chi impreas pro publicare tuts at a èssere ammustrada in sa visualizatzione de detàlliu de is tuts + setting_use_blurhash: Is gradientes sunt basados in subra de is colores de is immàgines cuadas ma imbelant totu is minujas + setting_use_pending_items: Cua is atualizatziones in segus de un'incarcu imbetzes de iscùrrere in automàticu su flussu de publicatziones + username: Su nòmine de utente tuo at a èssere ùnicu in %{domain} + whole_word: Cando sa paràula o sa fràsia crae est alfanumèrica ebbia s'at a aplicare isceti si currispondet a sa paràula intrea + domain_allow: + domain: Custu domìniu at a pòdere recuperare datos dae custu serbidore e is datos in intrada dae cue ant a èssere protzessados e archiviados + email_domain_block: + domain: Custu podet èssere su nòmine de domìniu chi benit ammustradu in s'indiritzu de posta eletrònica, in su registru MX in ue si risolvet su domìniu o s'IP de su serbidore in ue si risolvet su registru MX. Custos ant a èssere verificados a pustis de sa registratzione e sa registratzione at a èssere refudada. + with_dns_records: S'at a fàghere unu tentativu de risòlvere is registros DNS de su domìniu e fintzas is risultados ant a èssere blocados + featured_tag: + name: 'Forsis boles impreare unu de custos:' + form_challenge: + current_password: Ses intrende in un'àrea segura + imports: + data: Archìviu CSV esportadu dae un'àteru serbidore de Mastodon + invite_request: + text: Custu si at a agiudare a revisionare sa dimanda tua + ip_block: + comment: Optzionale. Regorda pro ite as agiuntu custa règula. + expires_in: Is indiritzos IP sunt una risursa limitada, fatu-fatu benint cumpartzidos e podent mudare de mere. Pro custa resone is blocos indefinidos de indiritzos IP non sunt racumandados. + ip: Inserta un'indiritzu IPv4 o IPv6. Podes blocare intervallos intreos impreende sa sintassi CIDR. Dae cara e non ti bloches a sa sola! + severities: + no_access: Bloca s'atzessu a totu is resursas + sign_up_requires_approval: As a dèpere aprovare is iscritziones noas + severity: Sèbera ite at a sutzèdere cun is rechestas de custa IP + sessions: + otp: 'Inserta su còdighe de atzessu in duos passos generadu dae s''aplicatzione mòbile tua o imprea unu de custos còdighes de recùperu:' + webauthn: Si est una crae USB assegura·ti de l'insertare e, si serbit, de la tocare. + tag: + name: Podes isceti cambiare su minùsculu/maiùsculu de is lìteras, a esèmpiu, pro fàghere in manera chi siant prus fàtziles de lèghere + user: + chosen_languages: Cando est incarcadu, isceti is tuts in is limbas ischertadas ant a èssere ammustrados in is lìnias de tempus pùblicas + labels: + account: + fields: + name: Eticheta + value: Cuntenutu + account_alias: + acct: Nòmine utente de su contu betzu + account_migration: + acct: Nòmine utente de su contu nou + account_warning_preset: + text: Testu predefinidu + title: Tìtulu + admin_account_action: + include_statuses: Include is tuts sinnalados in sa lìtera eletrònica + send_email_notification: Notìfica s'utente pro mèdiu de posta eletrònica + text: Avisu personalizadu + type: Atzione + types: + disable: Disativa + none: Imbia un'avisu + sensitive: Sensìbile + silence: A sa muda + suspend: Suspende + warning_preset_id: Imprea un'avisu predefinidu + announcement: + all_day: Eventu de totu sa die + ends_at: Fine de s'eventu + scheduled_at: Programma sa publicatzione + starts_at: Cumintzu de s'eventu + text: Annùntziu + defaults: + autofollow: Invita a sighire su contu tuo + avatar: Immàgine de profilu + bot: Custu contu est unu bot + chosen_languages: Filtra limbas + confirm_new_password: Cunfirma sa crae noa + confirm_password: Cunfirma sa crae + context: Filtra cuntestos + current_password: Crae atuale + data: Data + discoverable: Ammustra custu contu in su diretòriu + display_name: Nòmine visìbile + email: Indiritzu de posta eletrònica + expires_in: Iscadit a pustis de + fields: Metadatos de su profilu + header: Intestatzione + honeypot: "%{label} (non compiles)" + inbox_url: URL de sa cartella de intrada de su ripetidore + irreversible: Cantzella imbetzes de cuare + locale: Limba de s'interfache + locked: Bloca su contu + max_uses: Nùmeru màssimu de impreos + new_password: Crae noa + note: Biografia + otp_attempt: Còdighe in duos fatores + password: Crae + phrase: Paràula o fràsia crae + setting_advanced_layout: Abìlita s'interfache web avantzada + setting_aggregate_reblogs: Agrupa is cumpartziduras in is lìnias de tempus + setting_auto_play_gif: Riprodui is GIFs animadas in manera automàtica + setting_boost_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de cumpartzire + setting_crop_images: Retàllia is immàgines in is tuts no ismanniados a 16x9 + setting_default_language: Limba de publicatzione + setting_default_privacy: Riservadesa de publicatzione + setting_default_sensitive: Marca semper is elementos multimediales comente sensìbiles + setting_delete_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de cantzellare unu tut + setting_disable_swiping: Disabìlita is movimentos de trisinadura + setting_display_media: Visualizatzione de is elementos multimediales + setting_display_media_default: Predefinida + setting_display_media_hide_all: Cua totu + setting_display_media_show_all: Ammustra totu + setting_expand_spoilers: Ismànnia semper is tuts marcados cun avisos de cuntenutu + setting_hide_network: Cua sa retza tua + setting_noindex: Pedi de non ti fàghere inditzizare dae is motores de chirca + setting_reduce_motion: Mìnima su movimentu in is animatziones + setting_show_application: Rivela s'aplicatzione impreada pro imbiare tuts + setting_system_font_ui: Imprea su caràtere predefinidu de su sistema + setting_theme: Tema de su situ + setting_trends: Ammustra is tendèntzias de oe + setting_unfollow_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de acabbare de sighire a calicunu + setting_use_blurhash: Ammustra gradientes colorados pro is elementos multimediales cuados + setting_use_pending_items: Modalidade lenta + severity: Severidade + sign_in_token_attempt: Còdighe de seguresa + type: Casta de importatzione + username: Nòmine utente + username_or_email: Nòmine utente o indiritzu de posta eletrònica + whole_word: Paràula intrea + email_domain_block: + with_dns_records: Include registros MX e indiritzos IP de su domìniu + featured_tag: + name: Eticheta + interactions: + must_be_follower: Bloca is notìficas dae chie non ti sighit + must_be_following: Bloca is notìficas dae persones chi non sighis + must_be_following_dm: Bloca is messàgios diretos dae persones chi non sighis + invite: + comment: Cummenta + invite_request: + text: Proite ti cheres iscrìere? + ip_block: + comment: Cummentu + ip: IP + severities: + no_access: Bloca s'atzessu + sign_up_requires_approval: Lìmita is registratziones + severity: Règula + notification_emails: + digest: Imbia lìteras eletrònicas de resumu + favourite: Calicunu at postu s'istadu tuo in is preferidos suos + follow: Calicunu at incumentzadu a ti sighire + follow_request: Calicunu at pedidu de ti sighire + mention: Calicunu t'at mentovadu + pending_account: Unu contu nou bisòngiat de una revisione + reblog: Calicunu at cumpartzidu s'istadu tuo + report: Est istadu imbiadu unu raportu nou + trending_tag: Un'eticheta non revisionada est in tendèntzia + tag: + listable: Permite a cust'eticheta de apàrrere in is chircas e in sa cartella de is profilos + name: Eticheta + trendable: Permite a cust'eticheta de apàrrere in is tendèntzias + usable: Permite a is tuts de impreare cust'eticheta + 'no': Nono + recommended: Racumandadu + required: + mark: "*" + text: netzessàriu + title: + sessions: + webauthn: Imprea una de is craes de seguresa tuas pro intrare + 'yes': Eja diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index ac95ab570..18211e69e 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -126,6 +126,7 @@ sq: expires_in: Skadon pas fields: Tejtëdhëna profili header: Krye + honeypot: "%{label} (mos plotësoni gjë këtu)" inbox_url: URL e Të marrëve të relesë irreversible: Heqje, në vend se fshehje locale: Gjuhë ndërfaqeje diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index dd7769fca..8500f109e 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -73,6 +73,7 @@ sv: expires_in: Förfaller efter fields: Profil-metadata header: Bakgrundsbild + honeypot: "%{label} (fyll inte i)" locale: Språk locked: Lås konto max_uses: Högst antal användningar diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 7d2116740..23add1d45 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -91,10 +91,11 @@ th: text: คำเตือนที่กำหนดเอง type: การกระทำ types: - disable: แช่แข็ง - none: ไม่ทำสิ่งใด - silence: ทำให้เงียบ - suspend: ระงับและลบข้อมูลบัญชีอย่างถาวร + disable: อายัด + none: ส่งคำเตือน + sensitive: ละเอียดอ่อน + silence: จำกัด + suspend: ระงับ warning_preset_id: ใช้คำเตือนที่ตั้งไว้ล่วงหน้า announcement: all_day: เหตุการณ์ตลอดทั้งวัน @@ -137,6 +138,7 @@ th: setting_default_privacy: ความเป็นส่วนตัวของการโพสต์ setting_default_sensitive: ทำเครื่องหมายสื่อว่าละเอียดอ่อนเสมอ setting_delete_modal: แสดงกล่องโต้ตอบการยืนยันก่อนลบโพสต์ + setting_disable_swiping: ปิดใช้งานการเคลื่อนไหวในการปัด setting_display_media: การแสดงสื่อ setting_display_media_default: ค่าเริ่มต้น setting_display_media_hide_all: ซ่อนทั้งหมด diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 04b0f26a3..39ae58dc2 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -126,6 +126,7 @@ tr: expires_in: Bitiş tarihi fields: Profil meta verisi header: Kapak resmi + honeypot: "%{label} (doldurmayın)" inbox_url: Aktarıcı gelen kutusunun URL'si irreversible: Gizlemek yerine bırak locale: Arayüz dili diff --git a/config/locales/simple_form.tt.yml b/config/locales/simple_form.tt.yml new file mode 100644 index 000000000..5eab4abff --- /dev/null +++ b/config/locales/simple_form.tt.yml @@ -0,0 +1 @@ +tt: diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index 99611febf..dfe1ae36e 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -10,7 +10,7 @@ vi: text: Bạn có thể dùng URL, hashtag và nhắc đến title: Tùy chọn. Không cho người nhận xem admin_account_action: - include_statuses: Người dùng sẽ thấy các tút bị kiểm duyệt + include_statuses: Người dùng sẽ thấy các tút nào của họ bị kiểm duyệt send_email_notification: Người dùng sẽ nhận được lời giải thích về những gì xảy ra với tài khoản của họ text_html: Tùy chọn. Bạn nên dùng cảnh cáo cài sẵn để tiết kiệm thời gian type_html: Chọn làm gì với %{acct} @@ -126,6 +126,7 @@ vi: expires_in: Hết hạn sau fields: Metadata header: Ảnh bìa + honeypot: "%{label} (đừng điền vào)" inbox_url: Hộp thư relay irreversible: Xóa bỏ vĩnh viễn locale: Ngôn ngữ diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 6d2eb2f49..35222c076 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -126,6 +126,7 @@ zh-CN: expires_in: 失效时间 fields: 个人资料附加信息 header: 个人资料页横幅图片 + honeypot: "%{label} (请勿填写)" inbox_url: 中继站收件箱的 URL irreversible: 丢弃而非隐藏 locale: 界面语言 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 843157815..eaed6e32b 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -3,72 +3,81 @@ zh-HK: simple_form: hints: account_alias: - acct: 指定欲移動之帳戶的 使用者名稱@站台 + acct: 指定欲移動之帳戶的「使用者名稱@域名」 account_migration: - acct: 指定欲移動至之帳戶的 使用者名稱@站台 + acct: 指定欲移動至之帳戶的「使用者名稱@域名」 account_warning_preset: - text: 您可使用嘟文語法,例如網址、「#」標籤和提及功能 - title: 可選,對接收者不可見 + text: 你可使用 toot 格式,例如網址、「#」標籤和提及功能 + title: 可選,接收者不會見到 admin_account_action: - include_statuses: 用戶將會看到哪些嘟文導致檢舉或警告 + include_statuses: 使用者將會看到哪些文章導致檢舉或警告 send_email_notification: 使用者將收到帳戶發生之事情的解釋 - text_html: 選用。您能使用嘟文語法。您可 新增警告預設 來節省時間 + text_html: 選用。你能使用 toot 語法。你可 新增警告預設 來節省時間 type_html: 設定要使用 %{acct} 做的事 - warning_preset_id: 選用。您仍可在預設的結尾新增自訂文字 + warning_preset_id: 選用。你仍可在預設訊息的結尾加入自訂文字 announcement: - all_day: 核取後,只會顯示出時間範圍中的日期部分 + all_day: 勾選後,只會顯示出時間範圍中的日期部分 ends_at: 可選,公告會在該時間點自動取消發布 - scheduled_at: 空白則立即發布公告 + scheduled_at: 留空此項以立即發布公告 starts_at: 可選,你可以讓公告在指定時間範圍內顯示 - text: 你可以使用嘟文格式,但請注意不要讓公告佔據太多用戶屏幕空間。 + text: 你可以使用文章格式,但請小心別讓公告佔據太大的使用者畫面空間。 defaults: autofollow: 通過邀請網址註冊的用戶將會自動關注你 avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px - bot: 提醒用戶本帳號是機械人 - context: 應該套用過濾器的一項或多項內容 - current_password: 因安全因素,請輸入目前帳戶的密碼 + bot: 這個帳號是機械人,所做的事情可能沒有經人為監察 + context: 過濾器應該套用的一項或多項條件 + current_password: 基於保安緣故,請輸入目前帳號的密碼 current_username: 請輸入目前帳戶的使用者名稱以確認 digest: 僅在你長時間未登錄,且收到了私信時發送 - discoverable: 用戶目錄可以讓您的帳戶被更多人知道 - email: 您將收到一封確認電子郵件 + discoverable: 個人資料目錄可以讓你的帳號更廣為人知 + email: 你將收到一封確認電郵 fields: 個人資料頁可顯示多至 4 個項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px - inbox_url: 從您想要使用的中繼首頁複製網址 - irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器移除之後也一樣 + inbox_url: 在你想要使用的中繼站首頁,複製它的網址 + irreversible: 文章過濾是不可還原的,即使日後過濾器被移除,也無法重新看到被它濾走的文章 locale: 使用者介面、電郵和通知的語言 - locked: 你必須人手核准每個用戶對你的關注請求,而你的文章私隱會被預設為「只有關注你的人能看」 + locked: 你必須手動審核每個人對你的關注請求 password: 使用至少 8 個字元 - phrase: 無論是嘟文的本文或是內容警告都會被過濾 - scopes: 允許讓應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。 - setting_aggregate_reblogs: 請勿顯示最近已被轉嘟之嘟文的最新轉嘟(只影響最新收到的嘟文) + phrase: 過濾器會閱讀文章和內容警告標語的字眼,然後決定過濾與否 + scopes: 選擇應用程式可以存取的 API。 若你選擇最高階的權限範圍,則無須選擇個別項目。 + setting_aggregate_reblogs: 請勿顯示新近被轉推的文章(只影響最新被推的文章) setting_default_sensitive: 敏感媒體預設隱藏,且按一下即可重新顯示 setting_display_media_default: 隱藏標為敏感的媒體 setting_display_media_hide_all: 總是隱藏所有媒體 setting_display_media_show_all: 總是顯示標為敏感的媒體 - setting_hide_network: 你關注的人和關注你的人將不會在你的個人資料頁上顯示 + setting_hide_network: 你所關注的人,和關注你的人,將不會在你的個人資料頁上顯示 setting_noindex: 此設定會影響到你的公開個人資料以及文章頁面 - setting_show_application: 您用來發嘟文的應用程式將會在您嘟文的詳細檢視顯示 - setting_use_blurhash: 漸變基於隱藏的視覺效果顏色,但會模糊所有細節 + setting_show_application: 你用來發表文章的應用程式,將會顯示在你文章的詳細檢視中 + setting_use_blurhash: 漸變圖樣會基於隱藏媒體內容產生,但所有細節會變得模糊 setting_use_pending_items: 關閉自動滾動更新,時間軸會在點擊後更新 - username: 您的使用者名稱將在 %{domain} 是獨一無二的 + username: 你的使用者名稱在 %{domain} 將是獨一無二的 whole_word: 如果關鍵字或詞組僅有字母與數字,則其將只在符合整個單字的時候才會套用 domain_allow: - domain: 此域將能從此站獲取數據,而此站發出的數據也會被處理和存儲。 + domain: 此網域將能從此站獲取資料,而此站發出的數據也會被處理和存儲。 email_domain_block: domain: 這裡可以是電郵地址中的域名、域名解析到的MX記錄、或MX紀錄解析到的服務器IP。如果上述資料被封禁,那麼註冊將被拒絕。 with_dns_records: Mastodon 會嘗試解析所給域名的 DNS 記錄,然後與解析結果一併封禁 featured_tag: - name: 您可能想使用其中一個: + name: 你可能想使用其中一個: form_challenge: - current_password: 您正要進入安全區域 + current_password: 你正要進入安全區域 imports: data: 自其他服務站匯出的 CSV 檔案 invite_request: - text: 這會協助我們審核您的應用程式 + text: 這將有助我們審核你的應用程式 + ip_block: + comment: 可選,但請記得自己為甚麼添加了這個規則。 + expires_in: 因為 IP 位址是經常被分享或轉手的有限資源,所以我們不建議你無限期地封鎖 IP 位址。 + ip: 請輸入 IPv4 或 IPv6 位址,你亦可以用 CIDR 語法來封鎖整個 IP 區段。請小心使用,不要把自己給一併封鎖! + severities: + no_access: 封鎖所有資源存取 + sign_up_requires_approval: 新登記申請正等候你審批 + severity: 請設定伺服器將如何處理來自這個 IP 位址的請求 sessions: otp: 輸入你手機上生成的雙重認證碼,或者任意一個恢復代碼: + webauthn: 如果它是 USB 安全鑰匙的話,請先插入電腦。如鑰匙設計有需要,請按鍵啟用。 tag: - name: 您只能變更大小寫,例如,以使其更易讀。 + name: 你只能變更大小寫(以使其更易讀)。 user: chosen_languages: 只有被選擇的語言會在公開時間軸內顯示 labels: @@ -77,23 +86,24 @@ zh-HK: name: 標籤 value: 內容 account_alias: - acct: 處理舊帳戶 + acct: 舊帳號名稱 account_migration: - acct: 處理新帳戶 + acct: 新帳號名稱 account_warning_preset: text: 預設文字 title: 標題 admin_account_action: - include_statuses: 在電子郵件中加入檢舉的嘟文 + include_statuses: 在電郵中加入被檢舉的文章 send_email_notification: 透過電子信件通知使用者 text: 自訂警告 - type: 動作 + type: 操作 types: disable: 停用 - none: 什麼也不做 - silence: 安靜 - suspend: 停權並不可逆的刪除帳戶資料 - warning_preset_id: 使用警告預設 + none: 發送警告 + sensitive: 敏感内容 + silence: 限制 + suspend: 停權 + warning_preset_id: 使用預設警告 announcement: all_day: 全天活動 ends_at: 活動結束時間 @@ -101,25 +111,26 @@ zh-HK: starts_at: 活動開始時間 text: 公告 defaults: - autofollow: 邀請別人關注你的賬號 + autofollow: 邀請別人關注你的帳號 avatar: 個人頭像 bot: 這帳號是機械人 - chosen_languages: 語言過濾 + chosen_languages: 所過濾語言 confirm_new_password: 確認新密碼 confirm_password: 確認密碼 - context: 過濾情境 + context: 所過濾情境 current_password: 目前密碼 data: 資料 - discoverable: 在目錄列出此帳戶 + discoverable: 在目錄列出此帳號 display_name: 顯示名稱 email: 電郵地址 expires_in: 失效時間 fields: 資料 header: 個人頁面頂部 + honeypot: "%{label} (請不要填寫)" inbox_url: 中繼收件匣的 URL - irreversible: 放棄而非隱藏 + irreversible: 丟棄而非隱藏 locale: 介面語言 - locked: 將用戶轉為「私人」 + locked: 將帳號轉為「私人」 max_uses: 最大使用次數 new_password: 新密碼 note: 簡介 @@ -127,67 +138,76 @@ zh-HK: password: 密碼 phrase: 關鍵字或片語 setting_advanced_layout: 啟用進階網頁介面 - setting_aggregate_reblogs: 時間軸中的群組轉嘟 + setting_aggregate_reblogs: 時間軸中的群組轉推 setting_auto_play_gif: 自動播放 GIF setting_boost_modal: 在轉推前詢問我 - setting_crop_images: 把未展開嘟文中的圖片裁剪到 16x9 + setting_crop_images: 將未展開文章中的圖片裁剪到 16x9 setting_default_language: 文章語言 setting_default_privacy: 文章預設為 setting_default_sensitive: 預設我的內容為敏感內容 - setting_delete_modal: 刪推前詢問我 + setting_delete_modal: 刪除文章前,請要求我確認 + setting_disable_swiping: 停用滑動手勢 setting_display_media: 媒體顯示 setting_display_media_default: 預設 setting_display_media_hide_all: 全部隱藏 setting_display_media_show_all: 全部顯示 - setting_expand_spoilers: 永遠展開標有內容警告的嘟文 + setting_expand_spoilers: 永遠展開標有內容警告的文章 setting_hide_network: 隱藏你的社交網絡 - setting_noindex: 阻止搜尋引擎檢索 - setting_reduce_motion: 減低動畫效果 - setting_show_application: 顯示用來傳送嘟文的應用程式 + setting_noindex: 聲明本站不希望搜尋器讓外界搜尋 + setting_reduce_motion: 減少動畫效果 + setting_show_application: 顯示用來發表文章的應用程式 setting_system_font_ui: 使用系統預設字型 setting_theme: 網站主題 - setting_trends: 顯示本日趨勢 - setting_unfollow_modal: 取消關注前跳出詢問我 - setting_use_blurhash: 將隱藏媒體顯示為彩色漸變 + setting_trends: 顯示今天熱門主題 + setting_unfollow_modal: 取消關注前請讓我確定 + setting_use_blurhash: 將隱藏媒體以彩色漸變圖樣表示 setting_use_pending_items: 限速模式 severity: 等級 sign_in_token_attempt: 安全碼 type: 匯入資料類型 - username: 用戶名稱 - username_or_email: 用戶名稱或電郵 + username: 使用者名稱 + username_or_email: 使用者名稱或電郵 whole_word: 整個詞彙 email_domain_block: - with_dns_records: 包括域名的 MX 記錄和 IP 地址 + with_dns_records: 包括域名的 MX 記錄和 IP 位址 featured_tag: - name: "「#」標籤" + name: 主題標籤 (Hashtag) interactions: - must_be_follower: 隱藏沒有關注你的用戶的通知 - must_be_following: 隱藏你不關注的用戶的通知 - must_be_following_dm: 隱藏你不關注的用戶的私信 + must_be_follower: 隱藏你關注者以外的人的通知 + must_be_following: 隱藏你不關注的人的通知 + must_be_following_dm: 隱藏你不關注的人的私信 invite: comment: 備註 invite_request: text: 加入的原因 ip_block: - ip: IP 地址 + comment: 備註 + ip: IP 位址 + severities: + no_access: 封鎖 + sign_up_requires_approval: 限制註冊 + severity: 規則 notification_emails: digest: 定期電郵摘要 - favourite: 當有用戶喜歡你的文章時,發電郵通知 - follow: 當有用戶關注你時,發電郵通知 - follow_request: 當有用戶要求關注你時,發電郵通知 - mention: 當有用戶在文章提及你時,發電郵通知 - pending_account: 需要審核的新帳戶 - reblog: 當有用戶轉推你的文章時,發電郵通知 - report: 當提交新檢舉時傳送電子郵件 - trending_tag: 當未審核的話題成為當前熱門時發郵件提醒 + favourite: 有人喜歡你的文章 + follow: 當有人關注你時 + follow_request: 當有人要求關注你時 + mention: 當有人在文章提及你時 + pending_account: 有新帳號需要審核時 + reblog: 當有人轉推你的文章時 + report: 收到新檢舉時 + trending_tag: 當未審核的標籤成為當前熱門時 tag: listable: 允許此主題標籤在搜尋及個人檔案目錄中顯示 name: 主題標籤 trendable: 允許此主題標籤在趨勢下顯示 - usable: 允許嘟文使用此主題標籤 + usable: 允許文章使用此主題標籤 'no': 否 recommended: 建議 required: mark: "*" text: 必須填寫 + title: + sessions: + webauthn: 使用你的安全密鑰裝置來登入 'yes': 是 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 80cc8c2ee..000ec529b 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -75,6 +75,7 @@ zh-TW: types: disable: 停用 none: 什麼也不做 + sensitive: 有雷小心 silence: 安靜 suspend: 停權並不可逆的刪除帳戶資料 warning_preset_id: 使用警告預設 @@ -147,6 +148,13 @@ zh-TW: comment: 備註 invite_request: text: 加入的原因 + ip_block: + comment: 備註 + ip: IP 位址 + severities: + no_access: 封鎖 + sign_up_requires_approval: 限制註冊 + severity: 規則 notification_emails: digest: 傳送摘要信件 favourite: 當有使用者喜歡你的嘟文時,傳送電子信件通知 @@ -166,4 +174,7 @@ zh-TW: required: mark: "*" text: 必須填寫 + title: + sessions: + webauthn: 使用您的安全金鑰來登入 'yes': 是 diff --git a/config/locales/sq.yml b/config/locales/sq.yml index d08d726c0..127495a82 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -131,6 +131,7 @@ sq: follows: Ndjekje header: Krye inbox_url: URL Mesazhesh të Marrë + invite_request_text: Arsye për pjesëmarrje invited_by: Ftuar nga ip: IP joined: U bë pjesë @@ -255,6 +256,7 @@ sq: unsuspend_account: Hiqe Pezullimin e Llogarisë update_announcement: Përditëso Lajmërimin update_custom_emoji: Përditëso Emotikon Vetjak + update_domain_block: Përditëso Bllok Përkatësish update_status: Përditëso Gjendjen actions: assigned_to_self_report: "%{name} ia kaloi raportimin %{target} në ngarkim vetvetes" @@ -295,6 +297,7 @@ sq: unsuspend_account: "%{name} hoqi pezullimin për llogarinë e %{target}" update_announcement: "%{name} përditësoi lajmërimin %{target}" update_custom_emoji: "%{name} përditësoi emotikonin %{target}" + update_domain_block: "%{name} përditësoi bllok përkatësish për %{target}" update_status: "%{name} përditësoi gjendjen me %{target}" deleted_status: "(fshiu gjendjen)" empty: S’u gjetën regjistra. @@ -437,6 +440,7 @@ sq: instances: by_domain: Përkatësi delivery_available: Ka shpërndarje të mundshme + empty: S’u gjetën përkatësi. known_accounts: one: "%{count} llogari e njohur" other: "%{count} llogari të njohura" @@ -514,6 +518,8 @@ sq: comment: none: Asnjë created_at: Raportuar më + forwarded: U përcoll + forwarded_to: U përcoll te %{domain} mark_as_resolved: Vëri shenjë si i zgjidhur mark_as_unresolved: Vëri shenjë si të pazgjidhur notes: @@ -583,6 +589,9 @@ sq: min_invite_role: disabled: Asnjë title: Lejo ftesa nga + require_invite_text: + desc_html: Kur regjistrimet lypin miratim dorazi, tekstin e kërkesës për ftesë “Pse doni të merrni pjesë?” bëje të detyrueshëm, në vend se opsional + title: Kërkoju përdoruesve të rinj të plotësojnë doemos një tekst kërkese për ftesë registrations_mode: modes: approved: Për regjistrim, lypset miratimi @@ -751,6 +760,7 @@ sq: functional: Llogaria juaj është tërësisht funksionale. pending: Aplikimi juaj është në pritje të shqyrtimit nga stafi ynë. Kjo mund të dojë ca kohë. Nëse aplikimi juaj miratohet, do të merrni një email. redirecting_to: Llogaria juaj është joaktive, ngaqë aktualisht ridrejton te %{acct}. + too_fast: Formulari u parashtrua shumë shpejt, riprovoni. trouble_logging_in: Probleme me hyrjen? use_security_key: Përdor kyç sigurie authorize_follow: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index a84d5cdbd..264170b4e 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -221,6 +221,7 @@ sv: unsuspend_account: Återaktivera konto update_announcement: Uppdatera meddelande update_custom_emoji: Uppdatera egna emojis + update_domain_block: Uppdatera blockerad domän update_status: Uppdatera status actions: assigned_to_self_report: "%{name} tilldelade anmälan %{target} till sig själv" @@ -256,6 +257,7 @@ sv: unsilence_account: "%{name} återljudade %{target}s konto" unsuspend_account: "%{name} aktiverade %{target}s konto" update_custom_emoji: "%{name} uppdaterade emoji %{target}" + update_domain_block: "%{name} uppdaterade blockerad domän för %{target}" update_status: "%{name} uppdaterade status för %{target}" deleted_status: "(raderad status)" empty: Inga loggar hittades. @@ -376,6 +378,7 @@ sv: title: E-postdomänblock instances: by_domain: Domän + empty: Inga domäner hittades. moderation: all: Alla limited: Begränsad @@ -417,6 +420,8 @@ sv: comment: none: Ingen created_at: Anmäld + forwarded: Vidarebefordrad + forwarded_to: Vidarebefordrad till %{domain} mark_as_resolved: Markera som löst mark_as_unresolved: Markera som olöst notes: @@ -479,6 +484,9 @@ sv: min_invite_role: disabled: Ingen title: Tillåt inbjudningar av + require_invite_text: + desc_html: När nyregistrering kräver manuellt godkännande, gör det obligatoriskt att fylla i text i fältet "Varför vill du gå med?" + title: Kräv att nya användare fyller i en inbjudningsförfrågan show_known_fediverse_at_about_page: desc_html: När den växlas, kommer toots från hela fediverse visas på förhandsvisning. Annars visas bara lokala toots. title: Visa det kända fediverse på tidslinjens förhandsgranskning @@ -577,6 +585,7 @@ sv: status: account_status: Kontostatus redirecting_to: Ditt konto är inaktivt eftersom det för närvarande dirigeras om till %{acct}. + too_fast: Formuläret har skickats för snabbt, försök igen. authorize_follow: already_following: Du följer redan detta konto already_requested: Du har redan skickat en vänförfrågan till det kontot @@ -778,6 +787,7 @@ sv: missing_resource: Det gick inte att hitta den begärda omdirigeringsadressen för ditt konto proceed: Fortsätt för att följa prompt: 'Du kommer att följa:' + reason_html: "Varför är det här steget nödvändigt? %{instance} är kanske inte den server du är registrerad vid, så vi behöver dirigera dig till din hemserver först." sessions: activity: Senaste aktivitet browser: Webbläsare diff --git a/config/locales/th.yml b/config/locales/th.yml index fcfa2fbc9..8d50e805a 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -102,15 +102,15 @@ th: delete: ลบข้อมูล deleted: ลบแล้ว demote: ลดขั้น - disable: ปิดใช้งาน + disable: อายัด disable_two_factor_authentication: ปิดใช้งาน 2FA - disabled: ปิดใช้งานอยู่ + disabled: อายัดอยู่ display_name: ชื่อที่แสดง domain: โดเมน edit: แก้ไข email: อีเมล email_status: สถานะอีเมล - enable: เปิดใช้งาน + enable: เลิกอายัด enabled: เปิดใช้งานอยู่ followers: ผู้ติดตาม follows: การติดตาม @@ -172,8 +172,8 @@ th: show: created_reports: รายงานที่สร้าง targeted_reports: รายงานโดยผู้อื่น - silence: ทำให้เงียบ - silenced: เงียบอยู่ + silence: จำกัด + silenced: จำกัดอยู่ statuses: สถานะ subscribe: บอกรับ suspended: ระงับอยู่ @@ -602,6 +602,8 @@ th: edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า admin_mailer: + new_pending_account: + body: รายละเอียดของบัญชีใหม่อยู่ด้านล่าง คุณสามารถอนุมัติหรือปฏิเสธใบสมัครนี้ new_report: body: "%{reporter} ได้รายงาน %{target}" body_remote: ใครสักคนจาก %{domain} ได้รายงาน %{target} @@ -660,6 +662,7 @@ th: cas: CAS saml: SAML register: ลงทะเบียน + registration_closed: "%{instance} ไม่ได้กำลังเปิดรับสมาชิกใหม่" resend_confirmation: ส่งคำแนะนำการยืนยันใหม่ reset_password: ตั้งรหัสผ่านใหม่ security: ความปลอดภัย @@ -764,7 +767,7 @@ th: filters: contexts: account: โปรไฟล์ - home: เส้นเวลาหน้าแรก + home: หน้าแรกและรายการ notifications: การแจ้งเตือน public: เส้นเวลาสาธารณะ thread: การสนทนา @@ -818,6 +821,7 @@ th: in_memoriam_html: เพื่อระลึกถึง invites: delete: ปิดใช้งาน + expired: หมดอายุแล้ว expires_in: '1800': 30 นาที '21600': 6 ชั่วโมง @@ -1074,7 +1078,7 @@ th: month: "%b %Y" two_factor_authentication: add: เพิ่ม - disable: ปิดใช้งาน + disable: ปิดใช้งาน 2FA disabled_success: ปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำเร็จ edit: แก้ไข enabled: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว @@ -1129,4 +1133,5 @@ th: invalid_credential: กุญแจความปลอดภัยไม่ถูกต้อง not_enabled: คุณยังไม่ได้เปิดใช้งาน WebAuthn not_supported: เบราว์เซอร์นี้ไม่รองรับกุญแจความปลอดภัย + otp_required: เพื่อใช้กุญแจความปลอดภัย โปรดเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยก่อน registered_on: ลงทะเบียนเมื่อ %{date} diff --git a/config/locales/tr.yml b/config/locales/tr.yml index bc5c9a43f..62247bf56 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -255,6 +255,7 @@ tr: unsuspend_account: Hesabı Askıdan Kaldır update_announcement: Duyuruyu Güncelle update_custom_emoji: Özel İfadeyi Güncelle + update_domain_block: Engellenen Alan Adını Güncelle update_status: Durumu Güncelle actions: assigned_to_self_report: "%{name} kendilerine %{target} adlı raporu verdi" @@ -295,6 +296,7 @@ tr: unsuspend_account: "%{name} %{target}'in hesabının uzaklaştırmasını kaldırdı" update_announcement: "%{name}, %{target} duyurusunu güncelledi" update_custom_emoji: "%{name} %{target} emojiyi güncelledi" + update_domain_block: "%{name}, %{target} için alan adı engelini güncelledi" update_status: "%{name}, %{target} kullanıcısının durumunu güncelledi" deleted_status: "(silinmiş durum)" empty: Kayıt bulunamadı. @@ -437,6 +439,7 @@ tr: instances: by_domain: Alan adı delivery_available: Teslimat mevcut + empty: Alan adı bulunamadı. known_accounts: one: "%{count} bilinen hesap" other: "%{count} bilinen hesap" @@ -751,6 +754,7 @@ tr: functional: Hesabınız tamamen kullanıma hazır. pending: Başvurunuz personelimiz tarafından gözden geçirilmeyi beklemektedir. Bu biraz zaman alabilir. Başvurunuz onaylanırsa bir e-posta alacaksınız. redirecting_to: Hesabınız aktif değil çünkü şu anda %{acct} adresine yönlendirilmektedir. + too_fast: Form çok hızlı gönderildi, tekrar deneyin. trouble_logging_in: Oturum açarken sorun mu yaşıyorsunuz? use_security_key: Güvenlik anahtarını kullan authorize_follow: diff --git a/config/locales/tt.yml b/config/locales/tt.yml new file mode 100644 index 000000000..e35b5da21 --- /dev/null +++ b/config/locales/tt.yml @@ -0,0 +1,12 @@ +--- +tt: + 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. + '422': + '429': Too many requests + '500': + '503': The page could not be served due to a temporary server failure. diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 0170185f1..3795c171b 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1,16 +1,16 @@ --- vi: about: - about_hashtag_html: Đây là các tút công khai trong mạng liên hợp được gắn thẻ #%{hashtag}. Bạn có thể tương tác với chúng nếu đã đăng nhập. + about_hashtag_html: Đây là các tút #%{hashtag} trên mạng liên hợp. Bạn có thể tương tác với chúng sau khi đăng nhập. about_mastodon_html: 'Mạng xã hội của tương lai: Không quảng cáo, không theo dõi người dùng và phi tập quyền! Làm chủ quyền riêng tư của bạn với Mastodon!' about_this: Giới thiệu active_count_after: hoạt động - active_footnote: Người dùng hoạt động hàng tháng + active_footnote: Người dùng hoạt động hàng tháng (MAU) administered_by: 'Quản trị viên:' api: API apps: Ứng dụng di động apps_platforms: Lướt Mastodon trên iOS, Android và các nền tảng khác - browse_directory: Tìm những người có sở thích giống bạn + browse_directory: Tìm những người cùng chung sở thích browse_local_posts: Xem những gì đang xảy ra browse_public_posts: Xem thử những tút công khai trên mạng Mastodon contact: Liên lạc @@ -21,10 +21,10 @@ vi: federation_hint_html: Đăng ký tài khoản %{instance} là bạn có thể giao tiếp với mọi người trên bất kỳ máy chủ Mastodon nào và còn hơn thế nữa. get_apps: Ứng dụng di động hosted_on: "%{domain} vận hành nhờ Mastodon" - instance_actor_flash: 'Tài khoản này là một tác nhân ảo được sử dụng để đại diện cho chính máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên bị chặn trừ khi bạn muốn chặn toàn bộ máy chủ. + instance_actor_flash: 'Đây là một tài khoản ảo được sử dụng để đại diện cho máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên chặn trừ khi bạn muốn chặn toàn bộ máy chủ. ' - learn_more: Tìm hiểu thêm + learn_more: Tìm hiểu privacy_policy: Chính sách bảo mật see_whats_happening: Dòng thời gian server_stats: 'Cộng đồng:' @@ -32,7 +32,7 @@ vi: status_count_after: other: tút status_count_before: Nơi lưu giữ - tagline: Mạng xã hội liên hợp lớn nhất + tagline: Theo dõi bạn bè và khám phá thế giới terms: Điều khoản dịch vụ unavailable_content: Giới hạn chung unavailable_content_description: @@ -57,12 +57,13 @@ vi: followers: other: Người theo dõi following: Theo dõi + instance_actor_flash: Tài khoản này được dùng để đại diện cho máy chủ và không phải là người thật. Đừng bao giờ vô hiệu hóa tài khoản này. joined: Đã tham gia %{date} last_active: online link_verified_on: Liên kết này đã được xác thực quyền sở hữu vào %{date} media: Bộ sưu tập moved_html: "%{name} đã dời sang %{new_profile_link}:" - network_hidden: Người dùng đã ẩn thông tin này + network_hidden: Dữ liệu đã bị ẩn never_active: Chưa có nothing_here: Trống trơn! people_followed_by: Những người %{name} theo dõi @@ -73,7 +74,7 @@ vi: other: Tút posts_tab_heading: Tút posts_with_replies: Tương tác - reserved_username: Tên người dùng đã có rồi + reserved_username: Tên này đã sử dụng rồi roles: admin: Quản trị viên bot: Tài khoản Bot @@ -83,7 +84,7 @@ vi: unfollow: Ngưng theo dõi admin: account_actions: - action: Thực hiện các hành động + action: Thực hiện hành động title: Áp đặt kiểm duyệt với %{acct} account_moderation_notes: create: Gửi tin nhắn kiểm duyệt @@ -91,7 +92,7 @@ vi: delete: Xóa bỏ destroyed_msg: Đã ghi chú kiểm duyệt xong! accounts: - add_email_domain_block: Chặn địa chỉ email + add_email_domain_block: Chặn tên miền email approve: Phê duyệt approve_all: Phê duyệt tất cả approved_msg: Đã phê duyệt %{username} đăng ký thành công @@ -110,7 +111,7 @@ vi: confirming: Chờ xác nhận delete: Xóa dữ liệu deleted: Đã xóa - demote: Gỡ bỏ chức vụ + demote: Xóa chức vụ destroyed_msg: Dữ liệu %{username} sẽ được lên lịch xóa ngay bây giờ disable: Tạm khóa disable_two_factor_authentication: Vô hiệu hóa xác thực hai bước @@ -127,6 +128,7 @@ vi: follows: Đang theo dõi header: Ảnh bìa inbox_url: Hộp thư của người này + invite_request_text: Lý do đăng ký invited_by: Được mời bởi ip: IP joined: Đã tham gia @@ -139,7 +141,7 @@ vi: media_attachments: Tệp đính kèm memorialize: Chuyển sang tài khoản tưởng niệm memorialized: Tưởng nhớ - memorialized_msg: Đã chuyển thành công %{username} thành tài khoản tưởng nhớ + memorialized_msg: Đã chuyển %{username} thành tài khoản tưởng nhớ moderation: active: Hoạt động all: Toàn bộ @@ -160,14 +162,14 @@ vi: public: Công khai push_subscription_expires: Đăng ký PuSH hết hạn redownload: Làm mới trang cá nhân - redownloaded_msg: Đã làm tươi tài khoản %{username} thành công + redownloaded_msg: Đã tiếp nhận tài khoản %{username} thành công reject: Từ chối reject_all: Từ chối tất cả - rejected_msg: Đã từ chối đăng ký tài khoản %{username} thành công + rejected_msg: Đã từ chối đăng ký tài khoản %{username} remove_avatar: Xóa ảnh đại diện remove_header: Xóa ảnh bìa - removed_avatar_msg: Đã xóa bỏ ảnh đại diện của %{username} thành công - removed_header_msg: Đã xóa bỏ ảnh bìa của %{username} thành công + removed_avatar_msg: Đã xóa bỏ ảnh đại diện của %{username} + removed_header_msg: Đã xóa bỏ ảnh bìa của %{username} resend_confirmation: already_confirmed: Người dùng này đã được xác thực send: Gửi lại email xác nhận @@ -182,8 +184,8 @@ vi: staff: Đội ngũ quản lý user: Người dùng search: Tìm kiếm - search_same_email_domain: Tìm người dùng giống địa chỉ email - search_same_ip: Tìm người dùng giống IP + search_same_email_domain: Tra cứu email + search_same_ip: Tra cứu IP sensitive: Nhạy cảm sensitized: đánh dấu nhạy cảm shared_inbox_url: Hộp thư của máy chủ người này @@ -196,7 +198,7 @@ vi: subscribe: Đăng ký suspended: Đã vô hiệu hóa suspension_irreversible: Toàn bộ dữ liệu của người dùng này sẽ bị xóa hết. Bạn vẫn có thể ngừng vô hiệu hóa nhưng dữ liệu sẽ không thể phục hồi. - suspension_reversible_hint_html: Dữ liệu của tài khoản này sẽ bị xóa sạch vào %{date}. Trước thời hạn này, tài khoản vẫn có thể phục hồi dữ liệu. Nếu bạn muốn xóa dữ liệu của người này ngay bây giờ, hãy tiếp tục. + suspension_reversible_hint_html: Mọi dữ liệu của người này sẽ bị xóa sạch vào %{date}. Trước thời hạn này, dữ liệu vẫn có thể phục hồi. Nếu bạn muốn xóa dữ liệu của người này ngay lập tức, hãy tiếp tục. time_in_queue: Đang chờ cách đây %{time} title: Tài khoản unconfirmed_email: Email chưa được xác thực @@ -205,7 +207,7 @@ vi: undo_suspension: Ngừng vô hiệu hóa unsilenced_msg: Bỏ ẩn %{username} thành công unsubscribe: Hủy đăng ký - unsuspended_msg: Đã kích hoạt lại tài khoản %{username} thành công + unsuspended_msg: Đã kích hoạt lại %{username} thành công username: Tài khoản view_domain: Xem mô tả tài khoản này warn: Cấm upload @@ -213,19 +215,19 @@ vi: whitelisted: Danh sách trắng action_logs: action_types: - assigned_to_self_report: Báo cáo từ đội ngũ + assigned_to_self_report: Xử lý báo cáo được giao change_email_user: Đổi email cho người dùng confirm_user: Xác nhận người dùng - create_account_warning: Tạo cảnh cáo cài sẵn + create_account_warning: Gửi cảnh cáo create_announcement: Tạo thông báo create_custom_emoji: Tạo Emoji mới - create_domain_allow: Tạo danh sách máy chủ cho phép - create_domain_block: Tạo danh sách máy chủ chặn - create_email_domain_block: Tạo danh sách địa chỉ email chặn + create_domain_allow: Cho phép máy chủ + create_domain_block: Chặn máy chủ + create_email_domain_block: Chặn tên miền email create_ip_block: Chặn IP - demote_user: Gỡ bỏ chức vụ - destroy_announcement: Gỡ thông báo - destroy_custom_emoji: Gỡ Emoji + demote_user: Xóa chức vụ + destroy_announcement: Xóa thông báo + destroy_custom_emoji: Xóa Emoji destroy_domain_allow: Gỡ máy chủ cho phép destroy_domain_block: Gỡ máy chủ chặn destroy_email_domain_block: Gỡ email đã chặn @@ -233,27 +235,28 @@ vi: destroy_status: Xóa tút disable_2fa_user: Vô hiệu hóa xác thực hai bước disable_custom_emoji: Vô hiệu hóa Emoji - disable_user: Vô hiệu hóa người dùng - enable_custom_emoji: Bật Emoji - enable_user: Mở lại người dùng + disable_user: Tạm khóa người dùng + enable_custom_emoji: Cho phép Emoji + enable_user: Mở khóa người dùng memorialize_account: Tài khoản tưởng niệm promote_user: Chỉ định chức vụ - remove_avatar_user: Gỡ bỏ ảnh đại diện + remove_avatar_user: Xóa ảnh đại diện reopen_report: Mở lại báo cáo reset_password_user: Đặt lại mật khẩu - resolve_report: Xem xét lại báo cáo - sensitive_account: Đánh dấu nhạy cảm cho ảnh và video trên tài khoản của bạn + resolve_report: Xử lý báo cáo + sensitive_account: Đánh dấu nhạy cảm cho tài khoản silence_account: Tài khoản bị ẩn - suspend_account: Tài khoản bị vô hiệu hóa - unassigned_report: Báo cáo chưa xem - unsensitive_account: Ảnh và video trên tài khoản của bạn là bình thường + suspend_account: Vô hiệu hóa người dùng + unassigned_report: Báo cáo chưa xử lý + unsensitive_account: Đánh dấu tài khoản là bình thường unsilence_account: Tài khoản bỏ ẩn - unsuspend_account: Tài khoản đã ngừng vô hiệu hóa + unsuspend_account: Ngừng vô hiệu hóa update_announcement: Cập nhật thông báo update_custom_emoji: Cập nhật Emoji mới - update_status: Cập nhật trạng thái máy chủ + update_domain_block: Cập nhật máy chủ chặn + update_status: Cập nhật tút actions: - assigned_to_self_report: "%{name} đã xuất báo cáo %{target} cho chính họ" + assigned_to_self_report: "%{name} đã xử lý báo cáo được giao %{target}" change_email_user: "%{name} đã thay đổi địa chỉ email cho %{target}" confirm_user: "%{name} xác nhận địa chỉ email của người dùng %{target}" create_account_warning: "%{name} đã gửi cảnh cáo %{target}" @@ -261,21 +264,21 @@ vi: create_custom_emoji: "%{name} đã tải lên biểu tượng cảm xúc mới %{target}" create_domain_allow: "%{name} kích hoạt liên hợp với %{target}" create_domain_block: "%{name} chặn máy chủ %{target}" - create_email_domain_block: "%{name} chặn địa chỉ email %{target}" + create_email_domain_block: "%{name} chặn tên miền email %{target}" create_ip_block: "%{name} đã chặn IP %{target}" - demote_user: "%{name} đã gỡ bỏ chức vụ %{target}" - destroy_announcement: "%{name} gỡ thông báo %{target}" - destroy_custom_emoji: "%{name} biểu tượng cảm xúc bị phá hủy %{target}" + demote_user: "%{name} đã xóa chức vụ %{target}" + destroy_announcement: "%{name} xóa thông báo %{target}" + destroy_custom_emoji: "%{name} đã xóa emoji %{target}" destroy_domain_allow: "%{name} đã xóa tên miền %{target} khỏi danh sách trắng" destroy_domain_block: "%{name} bỏ chặn máy chủ %{target}" - destroy_email_domain_block: "%{name} bỏ chặn địa chỉ email %{target}" + destroy_email_domain_block: "%{name} bỏ chặn tên miền email %{target}" destroy_ip_block: "%{name} bỏ chặn IP %{target}" - destroy_status: "%{name} đã gỡ bỏ tút của %{target}" + destroy_status: "%{name} đã xóa tút của %{target}" disable_2fa_user: "%{name} đã vô hiệu hóa xác thực hai yếu tố của %{target}" - disable_custom_emoji: "%{name} đã gỡ bỏ Emoji %{target}" - disable_user: "%{name} vô hiệu hóa đăng nhập của người dùng %{target}" - enable_custom_emoji: "%{name} kích hoạt Emoji %{target}" - enable_user: "%{name} phê duyệt đăng nhập cho người dùng %{target}" + disable_custom_emoji: "%{name} đã ẩn emoji %{target}" + disable_user: "%{name} tạm khóa %{target}" + enable_custom_emoji: "%{name} cho phép Emoji %{target}" + enable_user: "%{name} mở khóa cho người dùng %{target}" memorialize_account: "%{name} đã biến tài khoản %{target} thành một trang tưởng niệm" promote_user: "%{name} đã chỉ định chức vụ cho %{target}" remove_avatar_user: "%{name} đã xóa ảnh đại diện của %{target}" @@ -291,11 +294,12 @@ vi: unsuspend_account: "%{name} đã ngừng vô hiệu hóa %{target}" update_announcement: "%{name} cập nhật thông báo cho %{target}" update_custom_emoji: "%{name} đã cập nhật biểu tượng cảm xúc %{target}" + update_domain_block: "%{name} cập nhật chặn máy chủ %{target}" update_status: "%{name} cập nhật tút của %{target}" deleted_status: "(tút đã xóa)" empty: Không tìm thấy bản ghi. filter_by_action: Lọc theo hành động - filter_by_user: Lọc theo người dùng + filter_by_user: Lọc theo người title: Nhật ký kiểm duyệt announcements: destroyed_msg: Xóa thông báo thành công! @@ -310,7 +314,7 @@ vi: scheduled_for: Đã lên lịch %{time} scheduled_msg: Thông báo đã lên lịch! title: Thông báo - unpublished_msg: Gỡ bỏ thông báo thành xong! + unpublished_msg: Xóa bỏ thông báo thành xong! updated_msg: Cập nhật thông báo thành công! custom_emojis: assign_category: Xếp vào danh mục @@ -321,14 +325,14 @@ vi: create_new_category: Tạo danh mục mới created_msg: Emoji được tạo thành công! delete: Xóa bỏ - destroyed_msg: Đã gỡ Emoji thành công! + destroyed_msg: Đã xóa Emoji thành công! disable: Vô hiệu hóa disabled: Đã vô hiệu hóa disabled_msg: Vô hiệu hóa thành công Emoji này emoji: Emoji enable: Cho phép - enabled: Đã kích hoạt - enabled_msg: Kích hoạt thành công Emoji này + enabled: Đã cho phép + enabled_msg: Đã cho phép thành công Emoji này image_hint: PNG tối đa 50KB list: Danh sách listed: Liệt kê @@ -341,7 +345,7 @@ vi: title: Emoji uncategorized: Chưa phân loại unlist: Bỏ danh sách - unlisted: Chưa niêm yết + unlisted: Chưa cho phép update_failed_msg: Không thể cập nhật Emoji này updated_msg: Cập nhật thành công Emoji! upload: Tải lên @@ -419,21 +423,22 @@ vi: view: Xem máy chủ chặn email_domain_blocks: add_new: Thêm mới - created_msg: Đã chặn địa chỉ email này + created_msg: Đã chặn tên miền email này delete: Xóa bỏ - destroyed_msg: Đã bỏ chặn địa chỉ email này + destroyed_msg: Đã bỏ chặn tên miền email này domain: Địa chỉ email - empty: Chưa chặn địa chỉ email nào. + empty: Chưa chặn tên miền email nào. from_html: từ %{domain} new: create: Thêm địa chỉ - title: Chặn địa chỉ email mới - title: Địa chỉ email đã chặn + title: Chặn tên miền email mới + title: Tên miền email đã chặn instances: by_domain: Máy chủ delivery_available: Cho phép liên kết + empty: Không có máy chủ nào. known_accounts: - other: "%{count} tài khoản đã xác thực" + other: "%{count} tài khoản đã biết" moderation: all: Tất cả limited: Hạn chế @@ -444,7 +449,7 @@ vi: total_blocked_by_us: Bị chặn bởi chúng ta total_followed_by_them: Được họ theo dõi total_followed_by_us: Được quản trị viên theo dõi - total_reported: Báo cáo tổng hợp + total_reported: Toàn bộ báo cáo total_storage: Ảnh và video invites: deactivate_all: Vô hiệu hóa tất cả @@ -490,7 +495,7 @@ vi: status: Trạng thái hiện tại title: Mạng liên hợp report_notes: - created_msg: Báo cáo tổng hợp kiểm duyệt đã tạo xong! + created_msg: Ghi chú kiểm duyệt đã tạo xong! destroyed_msg: Đã xóa báo cáo kiểm duyệt! reports: account: @@ -506,6 +511,8 @@ vi: comment: none: Không có mô tả created_at: Báo cáo lúc + forwarded: Chuyển tiếp + forwarded_to: Chuyển tiếp tới %{domain} mark_as_resolved: Đánh dấu là đã giải quyết mark_as_unresolved: Đánh dấu là chưa giải quyết notes: @@ -527,7 +534,7 @@ vi: updated_at: Cập nhật lúc settings: activity_api_enabled: - desc_html: Số lượng trạng thái được đăng tại địa phương, người dùng hoạt động và đăng ký mới trong nhóm hàng tuần + desc_html: Thu thập số lượng tút được đăng, người dùng hoạt động và người dùng đăng ký mới hàng tuần title: Công khai số liệu thống kê về hoạt động người dùng bootstrap_timeline_accounts: desc_html: Tách tên người dùng bằng dấu phẩy. Chỉ có hiệu lực với các tài khoản công khai thuộc máy chủ. Mặc định khi trống là tất cả quản trị viên. @@ -575,6 +582,9 @@ vi: min_invite_role: disabled: Không một ai title: Cho phép lời mời bằng cách + require_invite_text: + desc_html: Khi chọn phê duyệt người dùng thủ công, hiện “Tại sao bạn muốn đăng ký?” thay cho tùy chọn nhập + title: Người đăng ký mới phải nhập mã mời tham gia registrations_mode: modes: approved: Yêu cầu phê duyệt để đăng ký @@ -743,11 +753,12 @@ vi: functional: Tài khoản của bạn đã được xác thực. pending: Đơn đăng ký của bạn đang chờ phê duyệt. Điều này có thể mất một thời gian. Bạn sẽ nhận được email nếu đơn đăng ký của bạn được chấp thuận. redirecting_to: Tài khoản của bạn không hoạt động vì hiện đang chuyển hướng đến %{acct}. + too_fast: Nghi vấn đăng ký spam, xin thử lại. trouble_logging_in: Gặp sự cố khi đăng nhập? use_security_key: Dùng khóa bảo mật authorize_follow: - already_following: Bạn đang theo dõi người dùng này - already_requested: Bạn vừa gửi một yêu cầu theo dõi tới người dùng này + already_following: Bạn đang theo dõi người này + already_requested: Bạn vừa gửi một yêu cầu theo dõi tới người này error: Rất tiếc, đã xảy ra lỗi khi tìm kiếm tài khoản từ nơi khác follow: Theo dõi follow_request: Bạn đã gửi yêu cầu theo dõi tới @@ -768,7 +779,7 @@ vi: invalid_signature: không phải là chữ ký số Ed25519 đúng date: formats: - default: "%d.%m.%Y" + default: "%-d %B, %Y" with_month_name: "%B %d, %Y" datetime: distance_in_words: @@ -802,8 +813,8 @@ vi: username_available: Tên người dùng của bạn sẽ có thể đăng ký lại username_unavailable: Tên người dùng của bạn sẽ không thể đăng ký mới directories: - directory: Kết bạn - explanation: Tìm và kết bạn với những người cùng sở thích + directory: Khám phá + explanation: Tìm và theo dõi những người cùng sở thích explore_mastodon: Thành viên %{title} domain_validator: invalid_domain: không phải là một tên miền hợp lệ @@ -890,7 +901,7 @@ vi: invalid_token: Mã đăng nhập Keybase giống như chữ ký số và phải đảm bảo 66 ký tự hex verification_failed: Keybase không nhận ra mã đăng nhập này là chữ ký của người dùng Keybase %{kb_username}. Vui lòng thử lại từ Keybase. wrong_user: Không thể tạo bằng chứng cho %{proving} trong khi đăng nhập là %{current}. Đăng nhập bằng %{proving} và thử lại. - explanation_html: Tại đây, bạn có thể kết nối mật mã các danh tính khác của mình, chẳng hạn như hồ sơ Keybase. Điều này cho phép người khác gửi cho bạn tin nhắn được mã hóa và tin tưởng nội dung bạn gửi cho họ. + explanation_html: Tại đây, bạn có thể kết nối mã hóa tài khoản của bạn trên các nền tảng khác, chẳng hạn như Keybase. Điều này cho phép người khác gửi cho bạn tin nhắn được mã hóa và tin tưởng nội dung bạn gửi cho họ. i_am_html: Tôi là %{username} trên %{service}. identity: Danh tính inactive: Không hoạt động @@ -913,7 +924,7 @@ vi: bookmarks: Đã lưu domain_blocking: Danh sách máy chủ đã chặn following: Danh sách người theo dõi - muting: Danh sách người dùng ẩn + muting: Danh sách người đã ẩn upload: Tải lên in_memoriam_html: Tưởng Niệm invites: @@ -961,7 +972,7 @@ vi: incoming_migrations_html: Để chuyển từ tài khoản khác sang tài khoản này, trước tiên bạn cần tạo tham chiếu tài khoản. moved_msg: Tài khoản của bạn hiện đang chuyển hướng đến %{acct} và những người theo dõi bạn cũng sẽ được chuyển đi. not_redirecting: Tài khoản của bạn hiện không chuyển hướng đến bất kỳ tài khoản nào khác. - on_cooldown: Gần đây bạn đã di chuyển tài khoản của bạn. Chức năng này sẽ trở nên khả dụng một lần nữa sau %{count} ngày. + on_cooldown: Bạn vừa mới chuyển tài khoản của bạn đi nơi khác. Chỉ có thể sử dụng tiếp tính năng này sau %{count} ngày. past_migrations: Những lần dời nhà cũ proceed_with_move: Chuyển hướng người theo dõi redirected_msg: Tài khoản của bạn đã chuyển hướng đến %{acct}. @@ -1044,7 +1055,7 @@ vi: truncate: "…" polls: errors: - already_voted: Bạn đã bình chọn rồi + already_voted: Bạn đã bình chọn xong rồi duplicate_options: chứa các lựa chọn trùng lặp duration_too_long: quá xa so với thời điểm hiện tại duration_too_short: quá sớm @@ -1076,7 +1087,7 @@ vi: relationship: Mối 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: Hủy theo dõi người dùng đã chọn + remove_selected_follows: Ngưng theo dõi những người đã chọn status: Trạng thái tài khoản remote_follow: acct: Nhập địa chỉ Mastodon của bạn (tên@máy chủ) @@ -1137,11 +1148,11 @@ vi: windows: Windows windows_mobile: Windows Mobile windows_phone: Điện thoại Windows - revoke: Thu hồi - revoke_success: Thu hồi phiên thành công + revoke: Gỡ + revoke_success: Gỡ phiên thành công title: Phiên settings: - account: Tài khoản + account: Bảo mật account_settings: Cài đặt tài khoản aliases: Kết nối tài khoản appearance: Giao diện @@ -1149,7 +1160,7 @@ vi: back: Quay lại Mastodon delete: Xóa tài khoản development: Lập trình - edit_profile: Giới thiệu bản thân + edit_profile: Cá nhân hóa export: Xuất dữ liệu featured_tags: Hashtags thường dùng identity_proofs: Bằng chứng nhận dạng @@ -1167,7 +1178,7 @@ vi: statuses: attached: audio: - other: "%{count} bài hát" + other: "%{count} âm thanh" description: 'Đính kèm: %{attached}' image: other: "%{count} hình ảnh" @@ -1191,7 +1202,7 @@ vi: total_people: other: "%{count} người" total_votes: - other: "%{count} bình chọn" + other: "%{count} người" vote: Bình chọn show_more: Đọc thêm show_newer: Mới hơn @@ -1200,12 +1211,12 @@ vi: sign_in_to_participate: Đăng nhập để trả lời chủ đề này title: '%{name}: "%{quote}"' visibilities: - private: Đóng + private: Người theo dõi private_long: Chỉ người theo dõi mới xem được tút public: Công khai public_long: Ai cũng có thể thấy - unlisted: Mở - unlisted_long: Công khai nhưng không hiện trên bảng tin máy chủ + unlisted: Riêng tư + unlisted_long: Không hiện trên bảng tin máy chủ stream_entries: pinned: Tút được ghim reblogged: chia sẻ @@ -1219,28 +1230,28 @@ vi:
    • Thông tin tài khoản cơ bản: Nếu bạn đăng ký trên máy chủ này, bạn phải cung cấp tên người dùng, địa chỉ email và mật khẩu. Bạn cũng có thể tùy chọn bổ sung tên hiển thị, mô tả, ảnh đại diện, ảnh bìa. Tên người dùng, tên hiển thị, mô tả, ảnh hồ sơ và ảnh bìa luôn được hiển thị công khai.
    • -
    • Tút, lượt theo dõi và thông tin công khai khác: Danh sách những người bạn theo dõi được liệt kê công khai, cũng tương tự như danh sách những người theo dõi bạn. Khi bạn gửi tin nhắn, ngày giờ và ứng dụng sử dụng được lưu trữ. Tin nhắn có thể chứa tệp đính kèm hình ảnh và video. Bài viết công khai và bài viết đóng sẽ hiển thị công khai. Khi bạn đăng một tút trên trang cá nhân của bạn, đó là thông tin công khai. Tút của bạn được gửi đến những người theo dõi của bạn, điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và sẽ có các bản sao được lưu trữ ở đó. Khi bạn xóa bài viết, bản sao từ những người theo dõi của bạn cũng bị xóa theo. Hành động chia sẻ hoặc thích một tút luôn luôn là công khai.
    • -
    • Tin nhắn và tút chỉ dành cho người theo dõi: Tất cả tút được lưu trữ và xử lý trên máy chủ. Các tút chỉ dành cho người theo dõi được gửi đến những người theo dõi và người dùng của bạn được gắn thẻ trong đó. Còn các tin nhắn chỉ được gửi cho người dùng được gắn thẻ trong đó. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi khuyến nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét các máy chủ của người theo dõi của bạn. Bạn có thể thiết lập phê duyệt và từ chối người theo dõi mới theo cách thủ công trong cài đặt. Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.
    • -
    • Địa chỉ IP và siêu dữ liệu khác: Khi bạn đăng nhập, chúng tôi ghi nhớ địa chỉ IP bạn đăng nhập cũng như tên trình duyệt của bạn. Tất cả các phiên đăng nhập sẽ để bạn xem xét và hủy bỏ trong phần cài đặt. Địa chỉ IP sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của những yêu cầu truy cập máy chủ của chúng tôi.
    • +
    • Tút, lượt theo dõi và nội dung công khai khác: Danh sách những người bạn theo dõi được liệt kê công khai, cũng tương tự như danh sách những người theo dõi bạn. Khi bạn đăng tút, ngày giờ và ứng dụng sử dụng được lưu trữ. Tút có thể chứa tệp đính kèm hình ảnh và video. Tút công khai và tút mở sẽ hiển thị công khai. Khi bạn đăng một tút trên trang cá nhân của bạn, đó là nội dung công khai. Tút của bạn sẽ gửi đến những người theo dõi của bạn, đồng nghĩa với việc sẽ có các bản sao được lưu trữ ở máy chủ của họ. Khi bạn xóa bài viết, bản sao từ những người theo dõi của bạn cũng bị xóa theo. Hành động chia sẻ hoặc thích một tút luôn luôn là công khai.
    • +
    • Tin nhắn và tút dành cho người theo dõi: Tất cả tút được lưu trữ và xử lý trên máy chủ. Các tút dành cho người theo dõi được gửi đến những người theo dõi và những người được gắn thẻ trong tút. Còn các tin nhắn chỉ được gửi đến cho người nhận. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi đề nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét kỹ máy chủ của người theo dõi của bạn. Bạn có thể thiết lập tự mình phê duyệt và từ chối người theo dõi mới trong cài đặt. Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.
    • +
    • Địa chỉ IP và siêu dữ liệu khác: Khi bạn đăng nhập, chúng tôi ghi nhớ địa chỉ IP đăng nhập cũng như tên trình duyệt của bạn. Tất cả các phiên đăng nhập sẽ để bạn xem xét và hủy bỏ trong phần cài đặt. Địa chỉ IP sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của những lượt đăng ký tài khoản trên máy chủ của chúng tôi.

    Chúng tôi sử dụng thông tin của bạn để làm gì?

    Bất kỳ thông tin nào chúng tôi thu thập từ bạn là:

      -
    • Để cung cấp các chức năng cốt lõi của Mastodon. Bạn chỉ có thể tương tác với nội dung của người khác và đăng nội dung của riêng bạn khi bạn đã đăng nhập. Ví dụ: bạn có thể theo dõi người khác để xem các tút của họ trong bảng tin cá nhân hóa của bạn.
    • -
    • Để hỗ trợ kiểm duyệt cộng đồng, ví dụ so sánh địa chỉ IP của bạn với các địa chỉ đã biết khác để xác định hacker hoặc vi phạm khác.
    • -
    • Địa chỉ email bạn cung cấp chỉ được sử dụng để gửi cho bạn thông tin, thông báo về những người khác tương tác với nội dung của bạn hoặc gửi tin nhắn cho bạn hoặc để trả lời các câu hỏi cũng như các yêu cầu khác từ chính bạn.
    • +
    • Để cung cấp các chức năng cốt lõi của Mastodon. Sau khi đăng nhập, bạn mới có thể tương tác với nội dung của người khác và đăng nội dung của riêng bạn. Ví dụ: bạn có thể theo dõi người khác để xem các tút của họ trong bảng tin của bạn.
    • +
    • Để hỗ trợ kiểm duyệt. Ví dụ so sánh địa chỉ IP của bạn với các địa chỉ đã biết khác để xác định hacker hoặc spammer.
    • +
    • Địa chỉ email bạn cung cấp chỉ được sử dụng để gửi các thông báo quan trọng, trả lời các câu hỏi cũng như yêu cầu khác từ chính bạn.

    Chúng tôi bảo vệ thông tin của bạn như thế nào?

    -

    Chúng tôi thực hiện nhiều biện pháp bảo mật để duy trì sự an toàn khi bạn nhập, gửi hoặc truy cập thông tin cá nhân của bạn. Một vài trong số đó như là biện pháp kiểm soát phiên đăng nhập của bạn, lưu lượng giữa các ứng dụng và API của bạn, bảo mật bằng SSL và băm nhỏ mật khẩu nhờ thuật toán một chiều mạnh mẽ. Bạn có thể kích hoạt xác thực hai yếu tố để tiếp tục truy cập an toàn vào tài khoản của mình.

    +

    Chúng tôi thực hiện nhiều biện pháp để duy trì sự an toàn khi bạn nhập, gửi hoặc truy cập thông tin cá nhân của bạn. Một vài trong số đó như là kiểm soát phiên đăng nhập của bạn, lưu lượng giữa các ứng dụng và API, bảo mật bằng SSL và băm nhỏ mật khẩu nhờ thuật toán một chiều mạnh mẽ. Bạn có thể kích hoạt xác thực hai yếu tố để tiếp tục truy cập an toàn vào tài khoản của mình.


    Chúng tôi lưu trữ dữ liệu như thế nào?

    -

    Chúng tôi sẽ thực hiện:

    +

    Chúng tôi tiến hành:

      -
    • Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó được lưu giữ, không quá 90 ngày.
    • -
    • Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký không quá 12 tháng.
    • +
    • Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó bị xóa đi trong vòng 90 ngày.
    • +
    • Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký trong vòng 12 tháng.
    -

    Bạn có thể tải xuống một bản sao nội dung lưu trữ của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và hảnh bìa.

    +

    Bạn có thể tải xuống một bản sao lưu trữ nội dung của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và ảnh bìa.

    Bạn có thể xóa tài khoản của mình bất cứ lúc nào.


    Chúng tôi có sử dụng cookie không?

    @@ -1248,9 +1259,9 @@ vi:

    Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tương lai.


    Chúng tôi có tiết lộ bất cứ thông tin nào ra ngoài không?

    -

    Chúng tôi thề danh dự không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn khi chúng tôi tin rằng việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc của ai đó.

    -

    Nội dung công khai của bạn có thể được tải xuống bởi các máy chủ khác trong mạng liên kết. Các tút công khai và chỉ dành cho người theo dõi của bạn được gửi đến các máy chủ nơi người theo dõi của bạn thuộc về và tin nhắn được gửi đến máy chủ của người nhận, cho đến khi những người theo dõi hoặc người nhận đó chuyển sang một máy chủ khác.

    -

    Khi bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.

    +

    Chúng tôi không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn nếu việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc bất kỳ ai.

    +

    Nội dung công khai của bạn có thể được tải xuống bởi các máy chủ khác trong mạng liên hợp. Các tút công khai hay dành cho người theo dõi được gửi đến các máy chủ nơi người theo dõi của bạn là thành viên và tin nhắn được gửi đến máy chủ của người nhận, cho đến khi những người theo dõi hoặc người nhận đó chuyển sang một máy chủ khác.

    +

    Nếu bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.


    Cấm trẻ em sử dụng

    Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, theo yêu cầu của GDPR (Quy định bảo vệ dữ liệu chung) thì không được sử dụng trang web này.

    @@ -1259,8 +1270,8 @@ vi:

    Cập nhật thay đổi

    Nếu có thay đổi chính sách bảo mật, chúng tôi sẽ đăng những thay đổi đó ở mục này.

    -

    Tài liệu này phát hành dưới hình thức CC-BY-SA. Nó được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.

    -

    Biên tập từ Discourse.

    +

    Tài liệu này phát hành dưới hình thức CC-BY-SA và được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.

    +

    Chỉnh sửa và hoàn thiện từ Discourse.

    title: "%{instance} Điều khoản dịch vụ và chính sách bảo mật" themes: contrast: Mastodon (Độ tương phản cao) diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml index 8e4867b2f..0123836ec 100644 --- a/config/locales/zgh.yml +++ b/config/locales/zgh.yml @@ -5,15 +5,23 @@ zgh: api: API contact: ⴰⵎⵢⴰⵡⴰⴹ learn_more: ⵙⵙⵏ ⵓⴳⴳⴰⵔ + status_count_after: + one: ⴰⴷⴷⴰⴷ + other: ⴰⴷⴷⴰⴷⵏ unavailable_content_description: domain: ⴰⵎⴰⴽⴽⴰⵢ what_is_mastodon: ⵎⴰ'ⵢⴷ ⵉⴳⴰⵏ ⵎⴰⵙⵜⵔⴷⵓⵎ? accounts: follow: ⴹⴼⵕ + followers: + one: ⴰⵎⴹⴼⴰⵕ + other: ⵉⵎⴹⴼⴰⵕⵏ + media: ⵉⵙⵏⵖⵎⵉⵙⵏ never_active: ⵓⵙⴰⵔ roles: bot: ⴰⴱⵓⵜ group: ⵜⴰⵔⴰⴱⴱⵓⵜ + unfollow: ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ admin: account_moderation_notes: delete: ⴽⴽⵙ @@ -28,6 +36,7 @@ zgh: edit: ⵙⵏⴼⵍ email: ⵉⵎⴰⵢⵍ email_status: ⴰⴷⴷⴰⴷ ⵏ ⵢⵉⵍⴰⵢⵍ + followers: ⵉⵎⴹⴼⴰⵕⵏ location: all: ⵎⴰⵕⵕⴰ local: ⴰⴷⵖⴰⵔⴰⵏ @@ -137,8 +146,12 @@ zgh: notification_mailer: mention: action: ⵔⴰⵔ + relationships: + remove_selected_follows: ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ ⵉ ⵉⵏⵙⵙⵎⵔⵙⵏ ⵜⵜⵓⵙⵜⵢⵏⵉⵏ settings: account: ⴰⵎⵉⴹⴰⵏ account_settings: ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵎⵉⴹⴰⵏ + back: ⴰⵖⵓⵍ ⵖⵔ ⵎⴰⵙⵜⵓⴷⵓⵏ + edit_profile: ⵙⵏⴼⵍ ⵉⴼⵔⵙ notifications: ⵜⵉⵏⵖⵎⵉⵙⵉⵏ profile: ⵉⴼⵔⵙ diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index f93d6c03f..6c9079834 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -127,6 +127,7 @@ zh-CN: follows: 正在关注 header: 个人资料页横幅图片 inbox_url: 收件箱(Inbox)URL + invite_request_text: 加入理由 invited_by: 邀请者为 ip: IP 地址 joined: 加入于 @@ -251,6 +252,7 @@ zh-CN: unsuspend_account: 解除账号封禁 update_announcement: 更新公告 update_custom_emoji: 更新自定义表情符号 + update_domain_block: 更新域名屏蔽 update_status: 更新嘟文 actions: assigned_to_self_report: "%{name} 接管了举报 %{target}" @@ -291,6 +293,7 @@ zh-CN: unsuspend_account: "%{name} 解除了用户 %{target} 的封禁状态" update_announcement: "%{name} 更新了公告 %{target}" update_custom_emoji: "%{name} 更新了自定义表情 %{target}" + update_domain_block: "%{name} 更新了对 %{target} 的域名屏蔽" update_status: "%{name} 刷新了 %{target} 的嘟文" deleted_status: "(嘟文已删除)" empty: 没有找到日志 @@ -432,6 +435,7 @@ zh-CN: instances: by_domain: 域名 delivery_available: 可投递 + empty: 暂无域名。 known_accounts: other: "%{count} 个已知帐户" moderation: @@ -506,6 +510,8 @@ zh-CN: comment: none: 没有 created_at: 举报时间 + forwarded: 已转发 + forwarded_to: 转发举报至 %{domain} mark_as_resolved: 标记为“已处理” mark_as_unresolved: 标记为“未处理” notes: @@ -575,6 +581,9 @@ zh-CN: min_invite_role: disabled: 没有人 title: 允许发送邀请的用户组 + require_invite_text: + desc_html: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项 + title: 要求新用户填写注册申请 registrations_mode: modes: approved: 注册时需要批准 @@ -743,6 +752,7 @@ zh-CN: functional: 您的帐号可以正常使用了。 pending: 工作人员正在审核您的申请。这需要花点时间。在申请被批准后,您将收到一封电子邮件。 redirecting_to: 您的帐户无效,因为它已被设置为跳转到 %{acct} + too_fast: 表单提交过快,请重试。 trouble_logging_in: 登录有问题? use_security_key: 使用安全密钥 authorize_follow: @@ -1332,7 +1342,7 @@ zh-CN: warning: explanation: disable: 虽然您的帐户被冻结,您的帐户数据仍然完整;但是您无法在解锁前执行任何操作。 - sensitive: 你上传的媒体文件和链接的媒体将被视作敏感内容。 + sensitive: 你上传的媒体文件和媒体链接将被视作敏感内容。 silence: 当您的帐户受限时,只有已经关注过你的人才会这台服务器上看到你的嘟文,并且您会被排除在各种公共列表之外。但是,其他人仍然可以手动关注你。 suspend: 您的帐户已被封禁,所有的嘟文和您上传的媒体文件都已经从该服务器和您的关注者的服务器上删除并且不可恢复。 get_in_touch: 您可回复该邮件以联系 %{instance} 的工作人员。 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index bb0cc716d..d34b69d46 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1,116 +1,134 @@ --- zh-HK: about: - about_hashtag_html: 這些是包含「#%{hashtag}」標籤的公開文章。只要你有任何 Mastodon 服務站、或者聯盟網站的用戶,便可以與他們互動。 - about_mastodon_html: Mastodon(萬象)是自由、開源的社交網絡。服務站各自獨立而互連,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的網絡交流。 + about_hashtag_html: 這些是包含「#%{hashtag}」標籤的公開文章。只要你是任何聯盟網站的用戶,便可以與他們互動。 + about_mastodon_html: Mastodon(萬象)是屬於未來的社交網絡︰無廣告煩擾、無企業監控、設計講道義、分散無大台!立即重奪個人資料的控制權,使用 Mastodon 吧! about_this: 關於本服務站 active_count_after: 活躍 active_footnote: 每月活躍使用者 (MAU) administered_by: 管理者: api: API - apps: 行動應用程式 + apps: 手機 App apps_platforms: 在 iOS、Android 和其他平台使用 Mastodon browse_directory: 依興趣瀏覽個人資料目錄和過濾器 - browse_local_posts: 瀏覽這台伺服器中公開嘟文的直播串流 - browse_public_posts: 在 Mastodon 瀏覽公開嘟文的即時串流 + browse_local_posts: 瀏覽這個伺服器的公開文章即時串流 + browse_public_posts: 在 Mastodon 瀏覽公開文章的即時串流 contact: 聯絡 contact_missing: 未設定 - contact_unavailable: 未公開 + contact_unavailable: 不適用 discover_users: 探索使用者 - documentation: 文件 - federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤隨便一台 Mastodon 伺服器上的人等等。 - get_apps: 嘗試行動應用程式 - hosted_on: 在 %{domain} 運作的 Mastodon 服務站 + documentation: 說明文件 + federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤任何 Mastodon 服務站上的人! + get_apps: 嘗試使用手機 App + hosted_on: 在 %{domain} 運作的 Mastodon 伺服器 + instance_actor_flash: | + 這個帳戶是代表伺服器,而非代表任何個人用戶的虛擬帳號。 + 此帳戶是為聯盟協定而設。除非你想封鎖整個伺服器的話,否則請不要封鎖這個帳戶。如果你想封鎖伺服器,請使用網域封鎖以達到相同效果。 learn_more: 了解更多 privacy_policy: 隱私權政策 see_whats_happening: 看看發生什麼事 server_stats: 伺服器統計: source_code: 源代碼 status_count_after: - other: 條嘟文 - status_count_before: 他們共發佈了 + other: 篇文章 + status_count_before: 共發佈了 tagline: 關注朋友並探索新朋友 terms: 使用條款 - unavailable_content: 無法取得的內容 + unavailable_content: 受限制的伺服器 unavailable_content_description: domain: 伺服器 reason: 原因 + rejecting_media: 這些伺服器的媒體檔案將不會被處理或儲存,我們亦不會展示其縮圖。請手動點擊以觀看原始檔: + rejecting_media_title: 被篩選的媒體檔案 + silenced: 除非你已經關注個別使用者,否則來自這些伺服器的文章和通知將會被隱藏。 + silenced_title: 已靜音的伺服器 + suspended: 來自這些伺服器的所有數據將不會被處理。你將不可能聯絡來自這些伺服器的使用者。 + suspended_title: 已停權的伺服器 + unavailable_content_html: Mastodon 通常讓你瀏覽其他社交聯盟網站的所有內容,但是對於這個特定網站,有這些特別的例外規則。 user_count_after: other: 位使用者 - user_count_before: 這裏共註冊有 - what_is_mastodon: Mastodon 是甚麼? + user_count_before: 本站共有 + what_is_mastodon: Mastodon (萬象)是甚麼? accounts: choices_html: "%{name} 的選擇:" + endorsements_hint: 你可以推薦正在關注的人,他們會被顯示在你的個人頁面。 + featured_tags_hint: 你可以推薦不同標籤,它們也會在此處出現。 follow: 關注 followers: other: 關注者 following: 正在關注 - joined: 加入於 %{date} + joined: 於 %{date} 加入 last_active: 上次活躍時間 link_verified_on: 此連結的所有權已在 %{date} 檢查過 media: 媒體 moved_html: "%{name} 已經轉移到 %{new_profile_link}:" network_hidden: 此信息不可用 never_active: 永不 - nothing_here: 暫時未有內容可以顯示。 + nothing_here: 暫時未有內容可以顯示! people_followed_by: "%{name} 關注的人" people_who_follow: 關注 %{name} 的人 + pin_errors: + following: 你只能推薦你正在關注的使用者。 posts: - other: 嘟文 - posts_tab_heading: 嘟文 - posts_with_replies: 文章和回覆 - reserved_username: 此用戶名已被保留 + other: 文章 + posts_tab_heading: 文章 + posts_with_replies: 包含回覆的文章 + reserved_username: 這個使用者名稱已被保留 roles: admin: 管理員 bot: 機械人 group: 群組 - moderator: 監察員 + moderator: 板主 unavailable: 無法取得個人檔案 unfollow: 取消關注 admin: account_actions: action: 執行動作 - title: 在 %{acct} 執行管理員動作 + title: 在 %{acct} 執行管理操作 account_moderation_notes: - create: 記錄 - created_msg: 管理記錄已新增 + create: 加入管理紀錄 + created_msg: 已新增管理紀錄 delete: 刪除 - destroyed_msg: 管理記錄已被刪除 + destroyed_msg: 管理紀錄已被刪除 accounts: - add_email_domain_block: 將電子郵件網域加入黑名單 + add_email_domain_block: 封鎖電郵網域 approve: 核准 approve_all: 全部批准 + approved_msg: 成功審核了%{username} 的新帳號申請 are_you_sure: 你確定嗎? avatar: 頭像 by_domain: 域名 change_email: changed_msg: 帳號電郵更新成功! current_email: 現時電郵 - label: 改變電郵 + label: 更改電郵 new_email: 新的電郵 submit: 改變電郵 title: 改變 %{username} 的電郵 confirm: 確定 confirmed: 已確定 confirming: 確定 + delete: 刪除資料 deleted: 已刪除 - demote: 降任 + demote: 降權 + destroyed_msg: 即將刪除 %{username} 的數據 disable: 停用 - disable_two_factor_authentication: 停用雙重認證 - disabled: 已停用 + disable_two_factor_authentication: 關閉雙重認證 + disabled: 已凍結 display_name: 顯示名稱 domain: 域名 edit: 編輯 email: 電郵地址 - email_status: 电子邮件状态 - enable: 啟用 + email_status: 電郵狀態 + enable: 解除凍結 enabled: 已啟用 + enabled_msg: 成功解除 %{username} 帳號的凍結 followers: 關注者 follows: 正在關注 - header: 開頭 + header: 個人資料頁頂圖片 inbox_url: 收件箱(Inbox)URL invited_by: 邀請者 - ip: IP 位域 + ip: IP 位址 joined: 已加入 location: all: 全部 @@ -120,117 +138,177 @@ zh-HK: login_status: 登入狀態 media_attachments: 媒體檔案 memorialize: 設定為追悼帳戶 + memorialized: 被悼念的 + memorialized_msg: 成功將%{username} 的帳號變為紀念帳號 moderation: active: 活躍 all: 全部 - pending: 等待中 + pending: 處理中 silenced: 被靜音的 - suspended: 被停權的 + suspended: 已停權 title: 管理操作 - moderation_notes: 管理記錄 - most_recent_activity: 最新活動 - most_recent_ip: 最新 IP 位域 + moderation_notes: 管理備註 + most_recent_activity: 最近活動 + most_recent_ip: 最近的 IP 位址 + no_account_selected: 因未選擇帳號而未有任何變更 no_limits_imposed: 未受限制 not_subscribed: 未訂閱 pending: 等待審核中 - perform_full_suspension: 完全停權 - promote: 升任 + perform_full_suspension: 已停權 + promote: 提升權限 protocol: 協議 - public: 公共 + public: 公開 push_subscription_expires: PuSH 訂閱過期 - redownload: 更新頭像 + redownload: 更新頁面 + redownloaded_msg: 成功重新載入 %{username} 的個人資料頁面 reject: 拒絕 reject_all: 全部拒絕 - remove_avatar: 取消頭像 - remove_header: 移除開頭 + rejected_msg: 成功拒絕了 %{username} 的新帳號申請 + remove_avatar: 刪除頭像 + remove_header: 移除頁面頂端 + removed_avatar_msg: 成功刪除 %{username} 的頭像 + removed_header_msg: 成功刪除 %{username} 的頁面頂端圖片 resend_confirmation: - already_confirmed: 该用户已被确认 - send: 重发确认邮件 - success: 确认电子邮件成功发送! + already_confirmed: 這個使用者先前已經被確認過 + send: 重寄確認郵件 + success: 確認電郵發送成功! reset: 重設 reset_password: 重設密碼 resubscribe: 重新訂閱 - role: 身份 + role: 權限 roles: admin: 管理員 - moderator: 監察員 - staff: 管理人員 - user: 普通用戶 - search: 搜索 - search_same_email_domain: 其他有同個電子郵件網域的使用者 - search_same_ip: 其他有同個 IP 的使用者 + moderator: 管理員 + staff: 工作人員 + user: 普通使用者 + search: 搜尋 + search_same_email_domain: 其他有相同電郵網域的使用者 + search_same_ip: 其他有相同 IP 位址的使用者 sensitive: 敏感内容 sensitized: 已標記為敏感內容 shared_inbox_url: 公共收件箱(Shared Inbox)URL show: - created_reports: 此用戶所提舉報的紀錄 - targeted_reports: 此用戶被舉報的紀錄 + created_reports: 舉報紀錄 + targeted_reports: 被其他人舉報的紀錄 silence: 靜音 silenced: 已靜音 statuses: 文章 subscribe: 訂閱 suspended: 已停權 - time_in_queue: 正在佇列等待 %{time} - title: 用戶 + suspension_irreversible: 已永久刪除此帳號的數據。你可以取消此帳號的停權狀態,但帳號的資料已被永久刪除。 + suspension_reversible_hint_html: 此帳戶已被停權及所有數據將會於 %{date} 被刪除。在此之前,你仍可以完全回復帳號。如果你想即時刪除此帳戶的資料,可以在下面進行操作。 + time_in_queue: 排隊中 %{time} + title: 帳號 unconfirmed_email: 未確認的電郵 + undo_sensitized: 取消敏感狀態 undo_silenced: 解除靜音 undo_suspension: 解除停權 + unsilenced_msg: 成功取消對 %{username} 帳號的限制 unsubscribe: 取消訂閱 - username: 用戶名稱 + unsuspended_msg: 成功取消對 %{username} 帳號的停權操作 + username: 使用者名稱 + view_domain: 查看域名概要 warn: 警告 - web: 用戶頁面 - whitelisted: 已加入白名單 + web: 頁面 + whitelisted: 容許互傳文章 action_logs: + action_types: + assigned_to_self_report: 指派舉報 + change_email_user: 更改使用者的電郵 + confirm_user: 確認使用者 + create_account_warning: 新增警告 + create_announcement: 建立公告 + create_custom_emoji: 新增自訂的 Emoji + create_domain_allow: 新增允許的域名 + create_domain_block: 封鎖域名 + create_email_domain_block: 封鎖電郵域名 + create_ip_block: 新增IP規則 + demote_user: 將帳號降級 + destroy_announcement: 刪除公告 + destroy_custom_emoji: 刪除自定的 Emoji 表情符號 + destroy_domain_allow: 刪除允許的域名 + destroy_domain_block: 刪除已封鎖的域名 + destroy_email_domain_block: 刪除已封鎖的電郵城名 + destroy_ip_block: 刪除 IP 規則 + destroy_status: 刪除文章 + disable_2fa_user: 停用兩步驟驗證 + disable_custom_emoji: 停用自定的 Emoji 表情符號 + disable_user: 停用帳號 + enable_custom_emoji: 啟用自定的 Emoji 表情符號 + enable_user: 啟用帳號 + memorialize_account: 把帳號設定為悼念帳號 + promote_user: 提升帳號權限 + remove_avatar_user: 刪除頭像 + reopen_report: 重開舉報個案 + reset_password_user: 重設密碼 + resolve_report: 解決舉報個案 + sensitive_account: 把你的帳號的媒體設定為敏感內容 + silence_account: 把帳號靜音 + suspend_account: 把帳號停權 + unassigned_report: 取消指派舉報 + unsensitive_account: 取消把你帳號的媒體設定為敏感內容 + unsilence_account: 取消帳號的靜音狀態 + unsuspend_account: 取消帳號的停權狀態 + update_announcement: 更新公告 + update_custom_emoji: 更新自定的 Emoji 表情符號 + update_status: 更新文章 actions: assigned_to_self_report: "%{name} 指派了 %{target} 的舉報給自己" - change_email_user: "%{name} 改變了用戶 %{target} 的電郵地址" - confirm_user: "%{name} 確認了用戶 %{target} 的電郵地址" - create_account_warning: "%{name} 已對 %{target} 送出警告" - create_announcement: "%{name} 建立了新公告 %{target}" - create_custom_emoji: "%{name} 加入自訂表情符號 %{target}" - create_domain_allow: "%{name} 將 %{target} 網域加入黑名單了" - create_domain_block: "%{name} 阻隔了網域 %{target}" - create_email_domain_block: "%{name} 阻隔了電郵網域 %{target}" - demote_user: "%{name} 把用戶 %{target} 降任" + change_email_user: "%{name} 改變了使用者 %{target} 的電郵地址" + confirm_user: "%{name} 確認了使用者 %{target} 的電郵地址" + create_account_warning: "%{name} 已警告了 %{target}" + create_announcement: "%{name} 新增了公告 %{target}" + create_custom_emoji: "%{name} 加入了新的 Emoji %{target}" + create_domain_allow: "%{name} 和 %{target} 網域結盟了" + create_domain_block: "%{name} 封鎖了網域 %{target}" + create_email_domain_block: "%{name} 封鎖了電郵網域 %{target}" + create_ip_block: "%{name} 已經設定了針對 IP %{target} 的規則" + demote_user: "%{name} 把使用者 %{target} 降權" destroy_announcement: "%{name} 刪除了公告 %{target}" - destroy_custom_emoji: "%{name} 破壞了 %{target} 表情符號" - destroy_domain_allow: "%{name} 從白名單中移除了 %{target} 網域" - destroy_domain_block: "%{name} 取消了對網域 %{target} 的阻隔" - destroy_email_domain_block: "%{name} 取消了對電郵網域 %{target} 的阻隔" + destroy_custom_emoji: "%{name} 刪除了 Emoji %{target}" + destroy_domain_allow: "%{name} 禁止了與 %{target} 網域進行訊息聯網" + destroy_domain_block: "%{name} 取消了對網域 %{target} 的封鎖" + destroy_email_domain_block: "%{name} 取消了對電郵網域 %{target} 的封鎖" + destroy_ip_block: "%{name} 已經刪除了 IP %{target} 的規則" destroy_status: "%{name} 刪除了 %{target} 的文章" - disable_2fa_user: "%{name} 停用了用戶 %{target} 的雙重認證" - disable_custom_emoji: "%{name} 停用了自訂表情符號 %{target}" - disable_user: "%{name} 把用戶 %{target} 設定為禁止登入" - enable_custom_emoji: "%{name} 啟用了自訂表情符號 %{target}" - enable_user: "%{name} 把用戶 %{target} 設定為允許登入" + disable_2fa_user: "%{name} 停用了使用者 %{target} 的雙重認證" + disable_custom_emoji: "%{name} 停用了 Emoji %{target}" + disable_user: "%{name} 把使用者 %{target} 設定為禁止登入" + enable_custom_emoji: "%{name} 啟用了 Emoji %{target}" + enable_user: "%{name} 把使用者 %{target} 設定為允許登入" memorialize_account: "%{name} 把 %{target} 設定為追悼帳戶" - promote_user: "%{name} 對用戶 %{target} 进行了升任操作" + promote_user: "%{name} 對提升了使用者 %{target} 的權限" remove_avatar_user: "%{name} 取消了 %{target} 的頭像" - reopen_report: "%{name} 重開 %{target} 的舉報" - reset_password_user: "%{name} 重設了用戶 %{target} 的密碼" - resolve_report: "%{name} 處理了 %{target} 的舉報" - silence_account: "%{name} 靜音了用戶 %{target}" - suspend_account: "%{name} 停權了用戶 %{target}" + reopen_report: "%{name} 重開 %{target} 的舉報個案" + reset_password_user: "%{name} 重設了使用者 %{target} 的密碼" + resolve_report: "%{name} 處理了 %{target} 的舉報個案" + sensitive_account: "%{name} 將 %{target} 的媒體檔案列為敏感" + silence_account: "%{name} 靜音了帳號 %{target}" + suspend_account: "%{name} 將帳號 %{target} 停權" unassigned_report: "%{name} 取消指派 %{target} 的舉報" + unsensitive_account: "%{name} 取消將 %{target} 的媒體檔案的設為敏感" unsilence_account: "%{name} 取消了用戶 %{target} 的靜音狀態" - unsuspend_account: "%{name} 取消了用戶 %{target} 的停權狀態" + unsuspend_account: "%{name} 取消了帳號 %{target} 的停權狀態" update_announcement: "%{name} 更新了公告 %{target}" - update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}" - update_status: "%{name} 刷新了 %{target} 的文章" - deleted_status: "(已刪除嘟文)" + update_custom_emoji: "%{name} 更新了 Emoji 表情符號 %{target}" + update_status: "%{name} 更新了 %{target} 的文章" + deleted_status: "(已刪除文章)" + empty: 找不到任何日誌。 + filter_by_action: 按動作篩選 + filter_by_user: 按帳號篩選 title: 營運日誌 announcements: destroyed_msg: 成功刪除公告! edit: title: 編輯公告 empty: 找不到公告。 - live: 直播 + live: 在線 new: create: 建立公告 title: 新增公告 published_msg: 成功發布公告! scheduled_for: 排定 %{time} - scheduled_msg: 公告已排定公開! + scheduled_msg: 公告已排程! title: 公告 unpublished_msg: 成功取消發布公告! updated_msg: 成功更新公告! @@ -239,7 +317,7 @@ zh-HK: by_domain: 網域 copied_msg: 成功將表情複製到本地 copy: 複製 - copy_failed_msg: 無法將表情複製到本地 + copy_failed_msg: 無法將表情符號複製到本地 create_new_category: 建立新分類 created_msg: 已新增表情符號 delete: 刪除 @@ -247,20 +325,22 @@ zh-HK: disable: 停用 disabled: 已停用 disabled_msg: 已停用表情符號 - emoji: emoji + emoji: Emoji 表情符號 enable: 啟用 enabled: 已啟用 enabled_msg: 已啟用表情符號 image_hint: PNG 格式,最大 50KB - list: 列表 - listed: 已顯示 + list: 列出 + listed: 已列出 new: - title: 加入新的自訂表情符號 + title: 加入新的自訂 Emoji 表情符號 + not_permitted: 你無權執行此操作 overwrite: 覆蓋 shortcode: 短代碼 shortcode_hint: 至少 2 個字元,只能使用字母、數字和下劃線 - title: 自訂 emoji + title: 自訂 Emoji 表情符號 uncategorized: 未分類 + unlist: 隱藏 unlisted: 已隱藏 update_failed_msg: 無法更新表情符號 updated_msg: 已更新表情符號 @@ -269,26 +349,26 @@ zh-HK: authorized_fetch_mode: 安全模式 backlog: 未處理工作數 config: 設定 - feature_deletions: 帳戶刪除 + feature_deletions: 刪除帳號功能 feature_invites: 邀請連結 feature_profile_directory: 個人資料目錄 feature_registrations: 註冊 - feature_relay: 聯邦中繼站 + feature_relay: 聯網中繼站 feature_spam_check: 防垃圾訊息 feature_timeline_preview: 時間軸預覽 features: 功能 hidden_service: 與隱密服務互連 - open_reports: 待處理檢舉數 + open_reports: 未處理的舉報個案數 pending_tags: 等待審核的主題標籤 pending_users: 等待審核的使用者 recent_users: 最近加入的使用者 search: 全文搜尋 single_user_mode: 單一使用者模式 - software: 軟體 + software: 軟件 space: 儲存空間用量 title: 儀表板 total_users: 總使用者數 - trends: 趨勢 + trends: 近期流行 week_interactions: 本週互動次數 week_users_active: 本週活躍使用者數 week_users_new: 本週新使用者數 @@ -299,22 +379,28 @@ zh-HK: destroyed_msg: 網域已成功從白名單移除 undo: 從白名單移除 domain_blocks: - add_new: 新增 - created_msg: 正處理域名阻隔 + add_new: 新增域名阻隔規則 + created_msg: 正處理阻隔域名的請求 destroyed_msg: 已撤銷域名阻隔 domain: 域名阻隔 + edit: 更改域名阻隔 + existing_domain_block_html: 你已經對 %{name} 施加了更嚴格的限制,你需要先對他取消封鎖。 new: create: 新增域名阻隔 - hint: "「域名阻隔」不會隔絕該域名用戶的用戶進入本站資料庫,而是會在時候自動套用特定的審批操作。" + hint: "「域名阻隔」不會隔絕該域名帳號進入本站資料庫,但是會在符合條件的帳號進入資料庫後,自動對它們套用特定審批操作。" severity: - desc_html: "「自動靜音」令該域名下用戶的文章,設為只對關注者顯示,沒有關注的人會看不到。 「自動刪除」會刪除將該域名下用戶的文章、媒體檔案和個人資料。「」則會拒絕接收來自該域名的媒體檔案。" + desc_html: "「自動靜音」令該域名下帳號的文章,被設為只對關注者顯示,沒有關注的人會看不到。 「自動刪除」會刪除將該域名下用戶的文章、媒體檔案和個人資料。「」則會拒絕接收來自該域名的媒體檔案。" noop: 無 silence: 自動靜音 suspend: 自動刪除 title: 新增域名阻隔 + private_comment: 私人留言 + private_comment_hint: 請提供更多有關此域名限制的資訊以供管理員作內部參考。 + public_comment: 公開留言 + public_comment_hint: 如果你已經啟用域名限制列表的公告,請為一般大眾提供更多有關此域名限制的資訊。 reject_media: 拒絕媒體檔案 reject_media_hint: 刪除本地緩存的媒體檔案,再也不在未來下載這個站點的檔案。和自動刪除無關 - reject_reports: 拒絕檢舉 + reject_reports: 拒絕檢舉個案 reject_reports_hint: 忽略所有來自此站點的檢舉。與停權無關 rejecting_media: 拒絕媒體檔案 rejecting_reports: 拒絕檢舉中 @@ -323,66 +409,117 @@ zh-HK: suspend: 已停權 show: affected_accounts: - other: 將影響到資料庫中的 %{count} 個帳戶 + other: 將影響到資料庫中的 %{count} 個帳號 retroactive: - silence: 對此域名的所有用戶取消靜音 - suspend: 對此域名的所有用戶取消除名 + silence: 對此域名的所有帳號取消靜音 + suspend: 對此域名的所有帳號取消除名 title: 撤銷 %{domain} 的域名阻隔 undo: 撤銷 - undo: 撤銷 + undo: 撤銷域名阻隔 + view: 顯示正被阻隔的網域 email_domain_blocks: - add_new: 加入新項目 + add_new: 新增 created_msg: 已新增電郵網域阻隔 delete: 刪除 destroyed_msg: 已刪除電郵網域阻隔 domain: 網域 + empty: 現時並沒有電郵域名被阻隔。 + from_html: 由%{domain} new: create: 新增網域 title: 新增電郵網域阻隔 title: 電郵網域阻隔 instances: + by_domain: 域名 + delivery_available: 傳送可用 + known_accounts: + other: "%{count} 已知的帳號" moderation: all: 全部 limited: 限制 title: 版主 + private_comment: 私人留言 + public_comment: 公開留言 title: 已知服務站 - total_followed_by_us: 開始關注你 + total_blocked_by_us: 被我們封鎖 + total_followed_by_them: 被他們關注 + total_followed_by_us: 被我們關注 + total_reported: 關於他們的舉報 + total_storage: 媒體附件 invites: + deactivate_all: 全部停用 filter: all: 全部 available: 可用 expired: 已失效 title: 篩選 - title: 邀請用戶 + title: 邀請 + ip_blocks: + add_new: 新增規則 + created_msg: 成功新增 IP 規則 + delete: 刪除 + expires_in: + '1209600': 2 週 + '15778476': 6 個月 + '2629746': 1 個月 + '31556952': 1 年 + '86400': 1 日 + '94670856': 3 年 + new: + title: 新增 IP 規則 + no_ip_block_selected: 因未選擇 IP 規則而未有任何變更。 + title: IP 規則 + pending_accounts: + title: 待處理帳戶(%{count}) + relationships: + title: "%{acct} 的關係" relays: - description_html: "聯邦中繼站 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。中繼站也能協助小型或中型伺服器從聯邦中探索內容,而無須本地使用者手動關注遠端伺服器的其他使用者。" - disabled: 停用 + add_new: 新增中繼 + delete: 刪除 + description_html: "聯盟中繼站是一種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。中繼站也能協助小型或中型伺服器從聯邦中探索內容,而無須本地使用者手動關注遠端伺服器的其他使用者。" + disable: 停用 + disabled: 已停用 enable: 啟用 + enable_hint: 啟用後,你的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。 + enabled: 已啟用 + inbox_url: 中繼 URL + pending: 正在等待中繼許可 + save_and_enable: 儲存並啟用 + setup: 建立中繼通訊 + signatures_not_enabled: 中繼不會在安全模式或有限聯盟模式被開啓的情況下正常運作 + status: 狀態 + title: 中繼 report_notes: - created_msg: 舉報筆記已建立。 - destroyed_msg: 舉報筆記已刪除。 + created_msg: 舉報備註已建立! + destroyed_msg: 舉報備註已刪除! reports: + account: + notes: + other: "%{count} 則備註" + reports: + other: "%{count} 則舉報" action_taken_by: 操作執行者 are_you_sure: 你確認嗎? assign_to_self: 指派給自己 - assigned: 指派負責人 + assigned: 指派版主 + by_target_domain: 被舉報帳號的域名 comment: none: 沒有 created_at: 日期 mark_as_resolved: 標示為「已處理」 mark_as_unresolved: 標示為「未處理」 notes: - create: 建立筆記 - create_and_resolve: 建立筆記並標示為「已處理」 - create_and_unresolve: 建立筆記並標示為「未處理」 + create: 建立備註 + create_and_resolve: 標示為「已處理」並留下備註 + create_and_unresolve: 標示為「未處理」並留下備註 delete: 刪除 placeholder: 記錄已執行的動作,或其他相關的更新…… - reopen: 重開舉報 + reopen: 重開舉報個案 report: '舉報 #%{id}' reported_account: 舉報用戶 reported_by: 舉報者 resolved: 已處理 - resolved_msg: 舉報已處理。 + resolved_msg: 舉報個案已被處理! status: 狀態 title: 舉報 unassign: 取消指派 @@ -390,38 +527,51 @@ zh-HK: updated_at: 更新 settings: activity_api_enabled: - desc_html: 本站用戶發佈的文章,以及本站的活躍用戶和一週內新用戶數 - title: 公開用戶活躍度的統計數據 + desc_html: 本站的文章數量、活躍使用者數量、及每週新註冊使用者數量 + title: 公佈使用者活躍度的統計數據 bootstrap_timeline_accounts: - desc_html: 以半形逗號分隔多個用戶名。只能加入來自本站且未開啟保護的帳號。如果留空,則默認關注本站所有管理員。 - title: 新用戶默認關注 + desc_html: 以半形逗號分隔多個使用者名稱。只能加入來自本站且未開啟保護的帳號。如果留空,則默認關注本站所有管理員。 + title: 新使用者預設關注的對像 contact_information: email: 輸入一個公開的電郵地址 - username: 輸入用戶名稱 + username: 輸入使用者名稱 + custom_css: + desc_html: 透過 CSS 自訂每一頁的外觀 + title: 自訂 CSS + default_noindex: + desc_html: 影響所有未自行設定的帳號 + title: 預設帳號不在搜尋引擎索引之內 domain_blocks: all: 給任何人 disabled: 給沒有人 title: 顯示封鎖的網域 + users: 所有已登入的帳號 + domain_blocks_rationale: + title: 顯示原因予 enable_bootstrap_timeline_accounts: - title: 啟用新使用者的預設追蹤 + title: 啟用「新使用者預設關注」功能 hero: desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會默認為服務站縮圖 title: 主題圖片 + mascot: + desc_html: 在不同頁面顯示。推薦最小 293×205px。如果留空,就會默認為伺服器縮圖。 + title: 縮圖 peers_api_enabled: desc_html: 現時本服務站在網絡中已發現的域名 title: 公開已知服務站的列表 preview_sensitive_media: + desc_html: 在其他頁面預覽的連結將會在敏感媒體的情況下顯示縮圖 title: 在 OpenGraph 預覽中顯示敏感媒體 profile_directory: - desc_html: 允許能探索使用者 + desc_html: 允許使用者被搜尋 title: 啟用個人資料目錄 registrations: closed_message: desc_html: 當本站暫停接受註冊時,會顯示這個訊息。
    可使用 HTML title: 暫停註冊訊息 deletion: - desc_html: 允許所有人刪除自己的帳戶 - title: 開放刪除帳戶的權限 + desc_html: 允許所有人刪除自己的帳號 + title: 容許刪除帳號 min_invite_role: disabled: 沒有人 title: 允許發送邀請的身份 @@ -432,11 +582,11 @@ zh-HK: open: 任何人皆能註冊 title: 註冊模式 show_known_fediverse_at_about_page: - desc_html: 如果開啟,就會在時間軸預覽顯示跨站文章,否則就只會顯示本站文章。 - title: 在時間軸預覽顯示跨站文章 + desc_html: 如果停用,將會只在本站的歡迎頁顯示本站的文章。 + title: 在訪客預覽本站的時間軸上,顯示跨站文章 show_staff_badge: - desc_html: 在個人資料頁上顯示管理人員標誌 - title: 顯示管理人員標誌 + desc_html: 在個人資料頁上顯示工作人員標誌 + title: 顯示工作人員標誌 site_description: desc_html: 在首頁顯示,及在 meta 標籤使用作網站介紹。
    你可以在此使用 <a><em> 等 HTML 標籤。 title: 本站介紹 @@ -444,12 +594,14 @@ zh-HK: desc_html: 本站詳細資訊頁的內文
    你可以在此使用 HTML title: 本站詳細資訊 site_short_description: + desc_html: "顯示在側邊欄和網頁標籤(meta tags)。以一句話描述Mastodon是甚麼,有甚麼令這個伺服器脫\U000294D9而出。" title: 伺服器短描述 site_terms: desc_html: 可以填寫自己的隱私權政策、使用條款或其他法律文本。可以使用 HTML 標籤 title: 自訂使用條款 site_title: 本站名稱 spam_check_enabled: + desc_html: Mastodon可以自動舉報產生重複的垃圾內容的帳號,不過未必準確。 title: 自動防廣告訊息 thumbnail: desc_html: 用於在 OpenGraph 和 API 中顯示預覽圖。推薦大小 1200×630px @@ -458,7 +610,11 @@ zh-HK: desc_html: 在主頁顯示本站時間軸 title: 時間軸預覽 title: 網站設定 + trendable_by_default: + desc_html: 影響之前並未禁止的標籤 + title: 容許標籤不需要審核來成為今期流行 trends: + desc_html: 公開地顯示已審核的標籤為今期流行 title: 趨勢主題標籤 site_uploads: delete: 刪除上傳的檔案 @@ -478,13 +634,17 @@ zh-HK: title: 帳戶文章 with_media: 含有媒體檔案 tags: + accounts_today: 今日特殊使用 + accounts_week: 今週特殊使用 + breakdown: 根據來源剖析是日用量 context: 上下文 directory: 在目錄中 in_directory: 目錄中有 %{count} 個 last_active: 上次活躍 most_popular: 最熱門 most_recent: 最近 - review: 審核嘟文 + name: 主題標籤 + review: 審核文章 reviewed: 已審核 title: 主題標籤 trending_right_now: 最新趨勢 @@ -495,50 +655,100 @@ zh-HK: warning_presets: add_new: 新增 delete: 刪除 + edit_preset: 設定警告預設 + title: 管理警告預設 admin_mailer: + new_pending_account: + body: 以下是新帳戶的資訊。你可以審核這項申請。 + subject: 在 %{instance} 上未審核的新用戶(%{username}) new_report: - body: "%{reporter} 舉報了用戶 %{target}" - body_remote: 來自 %{domain} 的用戶舉報了用戶 %{target} - subject: 來自 %{instance} 的用戶舉報(#%{id}) + body: "%{reporter} 舉報了 %{target}" + body_remote: 來自 %{domain} 的人舉報了 %{target} + subject: 針對 %{instance} 的舉報(#%{id}) + new_trending_tag: + body: '今天流行使用未被審核的 #%{name} 主題標籤。在你允許之前,它不會被公開地顯示,你亦可以無視它使它不再污染你的眼睛。' + subject: 在 %{instance} 上未審核的主題標籤 (%{name}) + aliases: + add_new: 建立別名 (Alias) + created_msg: 成功建立別名 (alias)。你可以從舊帳號開始轉移。 + deleted_msg: 成功刪除別名 (alias)。你將不可以由舊帳號轉移到當前帳號。 + empty: 你沒有別名 (alias)。 + hint_html: 如果你想由另一個帳戶轉移到此帳號,你可以在此處創建別名 (alias),然後系統容許你將關注者由舊帳戶轉移到此帳號。此操作是無害且可以還原的帳號遷移程序,需要在舊帳號啟動。 + remove: 取消連結別名 (Alias) appearance: + advanced_web_interface: 進階網頁介面 + advanced_web_interface_hint: 如果你想善用整個螢幕闊度,你可以啟用「進階網頁介面」,在畫面上配置多個不同的欄目,讓你能根據需要,同時查看盡可能多的信息,支援的欄位包括:主頁、通知、其他站點和任何的列表和標籤。 + animations_and_accessibility: 動畫和輔助功能 + confirmation_dialogs: 確認對話框 + discovery: 探索 localization: body: Mastodon 是由志願者翻譯的。 + guide_link: https://crowdin.com/project/mastodon guide_link_text: 每個人都能貢獻。 + sensitive_content: 敏感內容 + toot_layout: 發文介面 application_mailer: - notification_preferences: 更改電郵首選項 + notification_preferences: 更改電郵設定 salutation: "%{name}:" settings: 修改電郵設定︰%{link} view: 進入瀏覽︰ view_profile: 檢視個人資料頁 view_status: 檢視文章 applications: - created: 已建立應用 - destroyed: 已刪除應用 + created: 已建立應用程式 + destroyed: 已刪除應用程式 invalid_url: 所提供的網址不正確 regenerate_token: 重設 token token_regenerated: 已重設 token warning: 警告,不要把它分享給任何人! your_token: token auth: + apply_for_account: 請求邀請 change_password: 密碼 - delete_account: 刪除帳戶 - delete_account_html: 如果你想刪除你的帳戶,請點擊這裡繼續。你需要確認你的操作。 + checkbox_agreement_html: 我同意 的伺服器規則服務條款 + checkbox_agreement_without_rules_html: 我同意 服務條款 + delete_account: 刪除帳號 + delete_account_html: 如果你想刪除你的帳號,請點擊這裡繼續。你需要確認你的操作。 + description: + prefix_invited_by_user: "@%{name} 邀請你加入這個 Mastodon 服務站!" + prefix_sign_up: 立即註冊 Mastodon! + suffix: 有了一個帳戶,就可以從任何Mastodon服務器關注任何人,發佈更新並與任何Mastodon服務器的用戶交流! didnt_get_confirmation: 沒有收到確認指示電郵? + dont_have_your_security_key: 找不到安全密鑰? forgot_password: 忘記了密碼? invalid_reset_password_token: 密碼重置 token 無效或已過期。請重新重設密碼。 + link_to_otp: 請輸入兩步䮕認證碼或恢復碼 + link_to_webauth: 使用你的安全密鑰裝置 login: 登入 logout: 登出 migrate_account: 轉移到另一個帳號 migrate_account_html: 想要將這個帳號指向另一個帳號可到這裡設定。 or_log_in_with: 或登入於 + providers: + cas: CAS + saml: SAML register: 登記 + registration_closed: "%{instance} 並不接受新成員請求" resend_confirmation: 重發確認指示電郵 reset_password: 重設密碼 security: 登入資訊 set_new_password: 設定新密碼 + setup: + email_below_hint_html: 如果下面的電郵地址不正確,你可在此修改,然後接收電郵進行確認。 + email_settings_hint_html: 確認電郵已發送至 %{email}。電郵地址不正確的話,你可以在帳戶設置中進行更改。 + title: 設定 + status: + account_status: 帳戶文章 + confirming: 正在等待確認電郵地址。 + functional: 你的帳戶可以正常使用。 + pending: 管理員正在處理你的申請。可能會需要一點時間處理。我們將會在申請被批準的時候馬上寄電郵給你。 + redirecting_to: 你的帳戶因為正在重新定向到 %{acct},所以暫時被停用。 + too_fast: 你太快遞交了,請再試一次。 + trouble_logging_in: 不能登入? + use_security_key: 使用安全密鑰裝置 authorize_follow: already_following: 你已經關注了這個帳號 - already_requested: 您早已向該帳戶寄送追蹤請求 + already_requested: 你先前已向該帳號發送關注請求 error: 對不起,尋找這個跨站用戶的過程發生錯誤 follow: 關注 follow_request: 關注請求已發送给: @@ -548,6 +758,19 @@ zh-HK: return: 顯示個人資料頁 web: 返回本站 title: 關注 %{acct} + challenge: + confirm: 繼續 + hint_html: "温馨提示 我們在未來一小時內不會再要求你填寫密碼。" + invalid_password: 密碼錯誤 + prompt: 確認密碼以繼續 + crypto: + errors: + invalid_key: 不是一個有效的 Ed25519 或 Curve25519 密鑰 + invalid_signature: 不是一個有效的 Ed25519 簽名 + date: + formats: + default: "%Y年%b月%d日" + with_month_name: "%B %d, %Y" datetime: distance_in_words: about_x_hours: "%{count}小時前" @@ -563,14 +786,33 @@ zh-HK: x_months: "%{count}個月" x_seconds: "%{count}秒" deletes: + challenge_not_passed: 你填寫的資料不正確 confirm_password: 輸入你現在的密碼來驗證身份 + confirm_username: 請填寫你的登入名稱以確認程序 proceed: 刪除帳戶 success_msg: 你的帳戶已經成功刪除 + warning: + before: 在繼續之前,請仔細閱讀以下說明: + caches: 已被其他服務器緩存的內容可能不會消失 + data_removal: 你的文章和其他資料將被永久刪除 + email_change_html: 你可以在不刪除帳戶的情況下更改電子郵件地址 + email_contact_html: 如果仍然沒有送達,你可以通過電子郵件發送到%{email}以獲得協助 + email_reconfirmation_html: 如果你沒有收到確認電郵,你可以要求再次發送它 + irreversible: 你將無法重啟你的帳戶 + more_details_html: 請參見隱私政策以瀏覽細節。 + username_available: 你的登入名稱將可被其他人使用 + username_unavailable: 你的登入名稱將不能讓其他人使用 + directories: + directory: 個人資料目錄 + explanation: 根據興趣認識新朋友 + explore_mastodon: 探索%{title} + domain_validator: + invalid_domain: 不是一個可用域名 errors: - '400': The request you submitted was invalid or malformed. + '400': 你的請求無效或格式不正確。 '403': 你沒有觀看本頁的權限。 '404': 找不到內容。 - '406': This page is not available in the requested format. + '406': 無法根據的格式顯示此頁面 '410': 內容已被刪除。 '422': content: 無法確認登入資訊。會不會你阻擋了本站使用 Cookies 的權限? @@ -579,37 +821,98 @@ zh-HK: '500': content: 抱歉,我們的後台出錯了。 title: 這個頁面有問題 - '503': The page could not be served due to a temporary server failure. + '503': 因短暫的伺服器錯誤而未能提供此頁面 noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。你也可以選擇適用於你的平台的 Mastodon 應用。 + existing_username_validator: + not_found: 無法找到位於本伺服器的用戶 + not_found_multiple: 無法找到%{usernames} exports: archive_takeout: date: 日期 download: 下載檔案 - hint_html: 你可以下載包含你的文章和媒體的檔案。資料以 ActivityPub 格式儲存,可用於相容的軟體。你可以每七天下載一次。 + hint_html: 你可以下載包含你的文章和媒體的檔案。資料以 ActivityPub 格式儲存,可用於相容的軟體。你可以每 7 天下載一次。 in_progress: 檔案製作中... request: 下載檔案 size: 檔案大小 blocks: 被你封鎖的用戶 + bookmarks: 書籤 + csv: CSV + domain_blocks: 域名封鎖 lists: 列表 mutes: 你所靜音的用戶 storage: 媒體容量大小 + featured_tags: + add_new: 新增 + errors: + limit: 你所推薦的標籤數量已經達到上限 + hint_html: "甚麼是推薦主題標籤? 它們會被顯示在你的個人資料頁面,讓其他人可以根據標籤瀏覽你的公開文章,令人們更易找到你創作或者長期作品!" filters: + contexts: + account: 個人資料 + home: 主頁和列表 + notifications: 通知 + public: 公共時間軸 + thread: 對話 + edit: + title: 編輯篩選器 + errors: + invalid_context: 沒有提供內文或內文無效 + invalid_irreversible: 不可逆的篩選器只適用放主頁或通知頁面 index: - empty: 您沒有過濾器。 + delete: 刪除 + empty: 你沒有過濾器。 + title: 篩選 + new: + title: 新增篩選器 footer: + developers: 開發者 more: 更多...... + resources: 項目 + trending_now: 今期流行 generic: all: 全部 changes_saved_msg: 已成功儲存修改。 copy: 複製 + delete: 刪除 + no_batch_actions_available: 此頁目沒有可用的批次操作 + order_by: 排序 save_changes: 儲存修改 validation_errors: other: 提交的資料有 %{count} 項問題 + html_validator: + invalid_markup: 含有無效的HTML標記:%{error} + identity_proofs: + active: 活躍 + authorize: 是的,請授權 + authorize_connection_prompt: 授權此加密通訊? + errors: + failed: 加密通訊失敗。請在%{provider} 重試。 + keybase: + invalid_token: Keybase tokens必定為66個16位元字符的簽名檔散列。 + verification_failed: Keybase不能識別此令牌為Keybase用戶%{kb_username} 的簽名。請在Keybase再試一次。 + wrong_user: 未能以%{current} 為 %{proving} 建立身份驗證。請登入為%{proving} 再試一次。 + explanation_html: 在此你連結其他網路平台(如 Keybase)上的加密身份。讓其他人可以在那些平台上,傳送加密信息給你,並驗證你的身份。 + i_am_html: 我是 %{service} 上的 %{username} + identity: 身份 + inactive: 停用 + publicize_checkbox: 發表文章: + publicize_toot: 驗證成功!我在%{service} 是%{username} :%{url} + remove: 刪除帳號的驗證 + removed: 成功刪除身份驗證 + status: 確認狀態 + view_proof: 查看證明 imports: + modes: + merge: 合併 + merge_long: 留下舊有記錄並添加新的資訊 + overwrite: 覆蓋 + overwrite_long: 用新記錄覆蓋當前記錄 preface: 你可以在此匯入你在其他服務站所匯出的資料檔,包括︰你所關注的用戶,被你封鎖的用戶。 success: 你已成功上載資料檔,我們正將資料匯入,請稍候 types: blocking: 被你封鎖的用戶名單 + bookmarks: 書籤 + domain_blocking: 域名封鎖名單 following: 你所關注的用戶名單 muting: 靜音名單 upload: 上載 @@ -641,11 +944,45 @@ zh-HK: media_attachments: validations: images_and_video: 不能在已有圖片的文章上加入影片 + not_ready: 無法附加尚未處理完的檔案。 請稍後再試! too_many: 不可以加入超過 4 個檔案 migrations: acct: 新帳戶的 用戶名@域名 + cancel: 取消定向 + cancel_explanation: 取消重新定向將會重新激活當前帳戶,但並不會還原已移至該帳戶的關注者。 + cancelled_msg: 成功取消定向。 + errors: + already_moved: 是已經移至的相同帳戶 + missing_also_known_as: 不是此帳戶的別名(alias) + move_to_self: 不能移至當前帳戶 + not_found: 找不到 + on_cooldown: 你正在處於冷卻狀態 + followers_count: 轉移時的追隨者 + incoming_migrations: 由另一個帳號轉移 + incoming_migrations_html: 要由其他帳戶轉移至當前帳戶的話,首先你需要 新增帳戶別名(alias). + moved_msg: 你的帳號正被轉接至 %{acct} ,你的關注者正在同步轉移至該帳號。 + not_redirecting: 你的帳號現時並未被重新定向。 + on_cooldown: 你最近已經轉移過帳戶。此功能將在 %{count} 天後可重新使用。 + past_migrations: 以往的帳戶轉移 + proceed_with_move: 移動追隨者 + redirected_msg: 你的帳戶即將被重新定向至%{acct}。 + redirecting_to: 你的帳戶正被重新定向至%{acct}。 + set_redirect: 設定重新定向 + warning: + backreference_required: 新帳戶必須首先反向標識(back-reference)當前帳戶 + before: 在繼續之前,請仔細閱讀以下說明: + cooldown: 在轉移帳號之後將會有一段冷卻時間,在冷卻時間內你將不能再次轉移帳號 + disabled_account: 你的當前帳號將不能完整地運作。但你將會有權力匯出你的數據和重新啟用你的帳號。 + followers: 此操作將會由當前帳號轉移所有追隨者至新帳號 + only_redirect_html: 另外,你亦可只在你的個人資料頁面放上重新定向標記. + other_data: 並不會自動轉移其他數據 + redirect: 你的當前帳號的個人資料頁面將會加上一個重新定向公告,並會在搜尋結果中被剔除。 moderation: title: 營運 + move_handler: + carry_blocks_over_text: 此用戶從%{acct} 轉移,該帳號已被你封鎖。 + carry_mutes_over_text: 此用戶從%{acct} 轉移,該帳號已被你靜音。 + copy_account_note_text: 此用戶從%{acct} 轉移,這是你之前在該帳號留下的備注: notification_mailer: digest: action: 查看所有通知 @@ -657,9 +994,9 @@ zh-HK: other: "自從上次登入以來,你收到 %{count} 則新的通知 \U0001F418" title: 在你不在的這段時間…… favourite: - body: 您的文章被 %{name} 收藏: - subject: "%{name} 收藏了你的文章" - title: 新的收藏 + body: 你的文章被 %{name} 喜愛: + subject: "%{name} 喜歡你的文章" + title: 新的最愛 follow: body: "%{name} 開始關注你!" subject: "%{name} 現正關注你" @@ -675,22 +1012,94 @@ zh-HK: subject: "%{name} 在文章中提及你" title: 新的提及 reblog: - body: 您的文章被 %{name} 轉推: + body: 你的文章被 %{name} 轉推: subject: "%{name} 轉推了你的文章" title: 新的轉推 + notifications: + email_events: 電郵通知活動 + email_events_hint: 選擇你想接收通知的活動: + other_settings: 其他通知設定 + number: + human: + decimal_units: + format: "%n%u" + units: + billion: 十億 + million: 百萬 + quadrillion: 千兆 + thousand: 千 + trillion: 兆 + otp_authentication: + code_hint: 請輸入你認證器所產生的代碼,以確認設定 + description_html: 當你啟用雙重認證後,你登入時將需要使用你的手機或其他認證器所產生的代碼。 + enable: 啟用 + instructions_html: "請用你手機的認證器應用程式(如 Google Authenticator、Authy),掃描這裏的QR 圖形碼。在雙重認證啟用後,你登入時將須要使用此應用程式產生的認證碼。" + manual_instructions: 如果你無法掃描 QR 圖形碼,請手動輸入這個文字密碼︰ + setup: 設定 + wrong_code: 你輸入的認證碼並不正確!可能伺服器時間和你手機不一致,請檢查你手機的時鐘,或與本站管理員聯絡。 pagination: newer: 較新 next: 下一頁 older: 較舊 prev: 上一頁 truncate: "……" + polls: + errors: + already_voted: 你已投票 + duplicate_options: 含有重覆項目 + duration_too_long: 太久了! + duration_too_short: 時間太近了! + expired: 投票已結束 + invalid_choice: 你所選的投票選項不存在 + over_character_limit: 不能多於 %{max} 個字符 + too_few_options: 一定要多於一個項目 + too_many_options: 不能多於 %{max} 個項目 + preferences: + other: 其他 + posting_defaults: 發佈預設值 + public_timelines: 公共時間軸 + reactions: + errors: + limit_reached: 已達到可以給予反應極限 + unrecognized_emoji: 不能識別這個emoji relationships: + activity: 帳戶活動 + dormant: 潛在 + follow_selected_followers: 關注所選的追隨者 + followers: 追隨者 + following: 正在關注 + invited: 已邀請 + last_active: 上次活躍 + most_recent: 最近 + moved: 已轉移 + mutual: 共同 + primary: 主要 + relationship: 關係 + remove_selected_domains: 從所選伺服器清除所有追隨者 remove_selected_followers: 刪除所選選項 + remove_selected_follows: 取消關注所選用戶 + status: 帳戶帖文 remote_follow: - acct: 請輸入你的︰用戶名稱@服務點域名 + acct: 請輸入你想使用的「使用者名稱@域名」身份 missing_resource: 無法找到你用戶的轉接網址 + no_account_html: 沒有帳號?你可以在這裏註冊 proceed: 下一步 prompt: 你希望關注︰ + reason_html: "為甚麼有必要做這個步驟?因為%{instance}未必是你註冊的伺服器,所以我們首先需要將你帶回你的伺服器。" + remote_interaction: + favourite: + proceed: 下一步 + prompt: 你要求把這篇文章加入最愛: + reblog: + proceed: 繼續轉嘟 + prompt: 你想轉推: + reply: + proceed: 下一步 + prompt: 你想回覆: + scheduled_statuses: + over_daily_limit: 你已經超越了當天排定發文的限額 (%{limit}) + over_total_limit: 你已經超越了排定發文的限額 (%{limit}) + too_soon: 不可以改變過去哦,嘟文只可以排定在未來 sessions: activity: 最近活動 browser: 瀏覽器 @@ -717,24 +1126,49 @@ zh-HK: explanation: 這些是現在正登入於你的 Mastodon 帳號的瀏覽器。 ip: IP 位址 platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux mac: Mac + other: 未知平台 + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: 取消 revoke_success: 作業階段成功取消 title: 作業階段 settings: + account: 帳戶 + account_settings: 帳戶設定 + aliases: 帳戶別名(aliases) + appearance: 外觀設定 authorized_apps: 授權應用程式 back: 回到 Mastodon delete: 刪除帳戶 development: 開發 edit_profile: 修改個人資料 export: 匯出 + featured_tags: 推薦的標籤 + identity_proofs: 身份驗證 import: 匯入 + import_and_export: 匯入及匯出 migrate: 帳戶遷移 notifications: 通知 preferences: 偏好設定 + profile: 個人資料 + relationships: 關注及追隨者 two_factor_authentication: 雙重認證 + webauthn_authentication: 安全鑰匙 + spam_check: + spam_detected: 此為系統的自動報告:已發現垃圾訊息。 statuses: attached: + audio: + other: "%{count} 段影片" description: 附件: %{attached} image: other: "%{count} 幅圖片" @@ -744,6 +1178,8 @@ zh-HK: content_warning: 內容警告: %{warning} disallowed_hashtags: other: 包含不允許的標籤: %{tags} + errors: + in_reply_not_found: 你所回覆的嘟文並不存在。 language_detection: 自動偵測語言 open_in_web: 開啟網頁 over_character_limit: 超過了 %{max} 字的限制 @@ -753,8 +1189,16 @@ zh-HK: private: 不能置頂非公開的文章 reblog: 不能置頂轉推 poll: + total_people: + other: "%{count} 人" + total_votes: + other: "%{count} 票" vote: 投票 show_more: 顯示更多 + show_newer: 顯示較新嘟文 + show_older: 顯示較舊嘟文 + show_thread: 顯示討論串 + sign_in_to_participate: 登入以加入討論 title: "%{name}:「%{quote}」" visibilities: private: 關注者觀看 @@ -767,7 +1211,90 @@ zh-HK: pinned: 置頂文章 reblogged: 轉推 sensitive_content: 敏感內容 + tags: + does_not_match_previous_name: 和舊有名稱並不符合 terms: + body_html: | +

    隱私權政策

    +

    我們蒐集甚麼資訊?

    + +
      +
    • 基本帳戶資訊:如果您在此服務器上註冊,我們可能會要求您輸入用戶名、電子郵件地址和密碼。 您還可以輸入其他個人資料信息(例如顯示名稱和自我簡介),並上傳個人資料圖片和標題圖片。 用戶名、顯示名稱、自我簡介、個人資料圖片和標題圖片會持續公開。
    • +
    • 帖文,關注和其他公共信息:您的關注和追隨者名單為公開資訊。 在發佈帖文時,我們將會存儲日期和時間,以及您用以發佈帖文的應用程序。 帖文可能包含多媒體附件,例如圖片和視頻。 公開和非公開(unlisted)的帖文為公開資訊。 您在個人資料上推薦的帖文時也是公開的資訊。 您的追隨者會收到你的帖文,在某些情況下,它們有可能會在不同的服務器互相傳遞並將儲存副本。 您刪除帖文時亦同樣會傳遞給您的追隨者。 轉發或收藏其他帖文的操作始終是公開的。
    • +
    • 私訊和追隨者限定的帖文:所有的帖子都在服務器上被儲存和處理。 追隨者限定的帖文將傳遞給您的追隨者和其中提及的用家,而私訊僅會傳遞給其中提及的用戶。 在某些情況下,它們有可能會在不同的服務器互相傳遞並將儲存副本。 我們將努力地將訪問權限制為僅授權人員,但其他服務器可能無法這樣做。 因此,請檢查您的追隨者所屬的服務器。 您可以在設置中選擇手動批准和拒絕新追隨者。請記住,服務器和任何接收服務器的操作員都可以查看此類消息,並且收件人可以截屏,複製或以其他方式重新分享。 請勿在Mastodon上分享任何危險信息。
    • +
    • IP和其他元數據:登錄時,我們會記錄您登錄時使用的IP位址以及瀏覽器應用程序的名稱。 您可以在設置中查看和撤消所有已登錄的作業階段。 最新上傳的IP位址最多可以儲存12個月。 我們還可能保留服務器日誌,其中包括對我們服務器的每個請求的IP地位。
    • +
    + +
    + +

    您的資訊將會被用在甚麼用途?

    + +

    我們從您那裡收集的任何資訊都可能通過以下方式使用:

    + +
      +
    • 提供Mastodon的核心功能:您只可以在登錄後與其他人的內容交流並發佈自己的內容。例如,您可以追隨其他人以在自己的個人化主頁中查看他們的帖文。
    • +
    • 社區管理:例如將您的IP位址與其他已知的IP位址進行比較來鑑定逃避封鎖或其他侵權行為。
    • +
    • 您的電郵地址:可能會被用於向您發送信息,有關其他人與您互動或向您發送消息的通知,並用於答複查詢和/或其他請求或問題。
    • +
    + +
    + +

    我們如何保護您的資訊?

    + +

    當您輸入,提交或訪問您的個人信息時,我們會採取各種安全措施來維護您的個人信息的安全。 除其他事項外,您的瀏覽器作業階段以及應用程序和API之間的流量均使用SSL進行保護。您的密碼也會以強大的單向算法進行散列處理。 您亦可以啟用多重驗證,以進一步安全地訪問您的帳戶。

    + +
    + +

    我們的數據保留政策

    + +

    我們會致力:

    + +
      +
    • 保留包含對該服務器所有請求的IP位址的服務器日誌,而保留時間將不會超過90天。
    • +
    • 保留與註冊用戶關聯的IP位址不超過12個月。
    • +
    + +

    您可以請求並下載您的內容備份,包括您的帖文,媒體附件,個人資料圖片和標題圖片。

    + +

    您亦可以隨時不可逆地刪除您的帳戶。

    + +
    + +

    我們使用cookies嗎?

    + +

    是。 Cookies是站點或其服務提供商通過Web瀏覽器(如果允許)傳輸到計算機硬盤的小文件。 這些cookies使站點能夠識別您的瀏覽器,並且如果您已經擁有註冊帳戶,會連結至您的註冊帳戶。

    + +

    我們使用Cookie來了解並保存您的偏好,以供將來訪問。

    + +
    + +

    我們會否透露任何信息給第三方機構?

    + +

    我們不會將您的個人身份信息出售,交易或以其他方式轉讓給第三方。 這不包括同意對這些信息保密的運營方,和我們開展業務或為您提供服務的受信任的第三方。我們或會在基於對法律的尊重,或在執行我們的網站政策或保護我們或其他人的權利、財產或安全時釋出你的個人資料。

    + +

    您的公開內容可能會被網絡中的其他服務器下載。 只要這些追隨者或收件人位於與之不同的服務器上,您的公開帖文和追隨者限定帖文將傳遞到您的追隨者所在的服務器,而私信將傳遞給收件人的服務器。

    + +

    當您授權應用程序使用您的帳戶時,根據您批准的權限範圍,它可能會訪問您的公開資訊,您的關注列表,您的關注者,您的列表,所有帖文以及您的收藏夾。 應用程序永遠無法取得您的電子郵件地址或密碼。

    + +
    + +

    兒童在網站的應用

    + +

    如果此服務器位於歐盟或EEA中:我們的網站,產品和服務只為16歲或以上的人提供服務。 如果您未滿16歲,請按照GDPR的要求 (歐盟一般資料保護規範)不使用此網站。

    + +

    如果此服務器位於美國:我們的網站,產品和服務只為13歲或以上的人提供服務。 如果您未滿13歲,請按照COPPA的要求 (兒童在線隱私權保護法)不使用此網站。

    + +

    在其他管轄區內,法律要求可能會有所不同。

    + +
    + +

    隱私權政策更改

    + +

    請根據英文版本所準,此中文版本只為英文版隱私政策的翻譯版本

    + +

    此文件以 CC-BY-SA 授權。英文版本的發佈日期為2018年3月7日。此中文翻譯的翻譯日期為2020年11月28日。

    + +

    最初改編自 Discourse的隱私權政策.

    title: "%{instance} 使用條款和隱私權政策" themes: contrast: 高對比 @@ -776,40 +1303,100 @@ zh-HK: time: formats: default: "%Y年%-m月%d日 %H:%M" + month: "%b %Y" two_factor_authentication: + add: 新增 disable: 停用 + disabled_success: 已成功啟用雙重認證 + edit: 編輯 enabled: 雙重認證已啟用 enabled_success: 已成功啟用雙重認證 generate_recovery_codes: 產生備用驗證碼 lost_recovery_codes: 讓你可以在遺失電話時,使用備用驗證碼登入。如果你遺失了備用驗證碼,可以在這裏產生一批新的,舊有的備用驗證碼將會失效。 + methods: 雙重認證 + otp: 多重認證軟件 recovery_codes: 備份恢復驗證碼 recovery_codes_regenerated: 成功產生新的備用驗證碼 recovery_instructions_html: 如果你遺失了安裝認證器的裝置(如︰你的電話),你可以使用備用驗證碼進行登入。請確保將備用驗證碼收藏穩當,(如列印出來,和你其他重要文件一起存放)。 + webauthn: 安全密鑰 user_mailer: backup_ready: explanation: 你要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載。 subject: 你的備份檔已可供下載 title: 檔案匯出 + sign_in_token: + details: 這是嘗試的詳細資訊 + explanation: 我們發現有人嘗試以未使用過的 IP 位址登入到你的帳號。 如果這個登入的人是你,請在「登入請求」頁面上輸入以下安全代碼: + further_actions: 如果這不是你,請到這裏更改你的密碼,並啟用雙重認證: + subject: 請確認登入請求 + title: 登入請求 + warning: + explanation: + disable: 你不能以任何方式登入或使用你的帳號,但你的個人資料頁面和其他資料仍保持完整。 + sensitive: 你上載的媒體檔案和連結媒體將被標記為敏感項目。 + silence: 你仍然可以使用你的帳號,但只有你現時的追隨者會看見你在此伺服器的嘟文。你或從公開名冊中被剔除。但是其他人仍然可以主動關注你。 + suspend: 你將不能使用您的帳號,你的個人資料頁面及其他資料將不能再被取得。你仍可在資料被完全刪除前請求下載你的數據,但我們仍會保留一部份資料,以防止有人規避停權處罰。 + get_in_touch: 你可以回覆此電郵來跟我們(%{instance})聯絡 + review_server_policies: 審視伺服器政策 + statuses: 特別是: + subject: + disable: 你的帳號 %{acct} 已經被涷結 + none: 警告帳號%{acct} + sensitive: 你的帳號 %{acct} 的媒體已被標記為敏感內容 + silence: 你的帳號 %{acct} 已經被限制 + suspend: 你的帳號 %{acct} 已經被停權 + title: + disable: 帳號涷結 + none: 警告 + sensitive: 你的媒體已被標記為敏感內容 + silence: 賬戶已被限制 + suspend: 帳號已停用 welcome: edit_profile_action: 設定個人資料 edit_profile_step: 你可以設定你的個人資料,包括上傳頭像、橫幅圖片、更改顯示名稱等等。如果你想在新的關注者關注你之前對他們進行審核,你也可以選擇為你的帳戶設為「私人」。 explanation: 下面是幾個小貼士,希望它們能幫到你 final_action: 開始發文 final_step: '開始發文吧!即使你現在沒有關注者,其他人仍然能在本站時間軸或者話題標籤等地方看到你的公開文章。試著用 #introductions 這個話題標籤介紹一下自己吧。' - full_handle: 你的完整用戶地址 - full_handle_hint: 你需要把這個告訴你的朋友們,這樣他們就能從另一個實例向你發送信息或者關注你。 - review_preferences_action: 更改首選項 - review_preferences_step: 記得調整你的偏好設置,比如你想接收什麼類型的郵件,或者你想把你的文章可見範圍默認設定為什麼級別。如果你沒有暈車的話,考慮一下啟用「自動播放 GIF 動畫」這個選項吧。 - subject: 歡迎來到 Mastodon - tip_federated_timeline: 跨站公共時間軸可以讓你一窺更廣闊的 Mastodon 網絡。不過,由於它只顯示你的鄰居們所訂閱的內容,所以並不是全部。 - tip_following: 默認情況下,你會自動關注你所在服務站的管理員。想結交更多有趣的人的話,記得多逛逛本站時間軸和跨站公共時間軸哦。 - tip_local_timeline: 本站時間軸可以讓你一窺 %{instance} 上的用戶。他們就是離你最近的鄰居! - tip_mobile_webapp: 如果你的移動設備瀏覽器允許你將 Mastodon 添加到主屏幕,你就能夠接收推送消息。它就像本地應用一樣好使! + full_handle: 你的完整 Mastodon 地址 + full_handle_hint: 這訊息將顯示給你朋友們,讓他們能從另一個服務站發信息給你,或者關注你的。 + review_preferences_action: 更改偏好設定 + review_preferences_step: 記得調整你的偏好設定,比如你想接收什麼類型的郵件,或者你想把你的文章可見範圍默認設定為什麼級別。如果你沒有暈車的話,考慮一下啟用「自動播放 GIF 動畫」這個選項吧。 + subject: 歡迎來到 Mastodon (萬象) + tip_federated_timeline: 跨站時間軸可以讓你一窺更廣闊的 Mastodon 網絡。不過,由於它只顯示你的鄰居們所訂閱的內容,所以並不是全部。 + tip_following: 你會預設關注你服務站的管理員。想結交更多有趣的人的話,記得多逛逛本站時間軸和跨站時間軸哦。 + tip_local_timeline: 本站時間軸可以讓你一窺 %{instance} 本站上的用戶。他們就是離你最近的鄰居! + tip_mobile_webapp: 如果你的移動設備瀏覽器支援,你可以將 Mastodon 加到裝置的主畫面,讓你可以選擇接收推送通知,就像本機的 App 一樣方便! tips: 小貼士 - title: "%{name},歡迎你的加入!" + title: 歡迎 %{name} 加入! users: + blocked_email_provider: 此電郵提供商並不被允許 + follow_limit_reached: 你不能關注多於%{limit} 人 + generic_access_help_html: 不能登入?你可以寄電郵至 %{email} 尋求協助 invalid_email: 電郵地址格式不正確 - invalid_otp_token: 雙重認證確認碼不正確 - otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫 - seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼和電郵。 + invalid_email_mx: 此電郵地址不存在 + invalid_otp_token: 雙重認證碼不正確 + invalid_sign_in_token: 無效的安全碼 + otp_lost_help_html: 如果這兩者你均無法登入,你可以聯繫 %{email} + seamless_external_login: 因為你正在使用第三方服務登入,所以不能設定密碼和電郵。 signed_in_as: 目前登入的帳戶: + suspicious_sign_in_confirmation: 你似乎未曾從此設備登入,而你又有一段時間沒有登入了。我們剛剛把安全碼傳送到你的電郵地址,請查看你的電郵信箱,以確認你是帳號擁有者本人。 + verification: + explanation_html: 你可以認證個人資料頁面的元數據 (Metadata) 連結是屬於你的。要認證,那些連結的目的地網站必須有一條回到你 Mastodon 個人頁面的連結,而且連結必須具有rel="me"屬性。連結的文字內容都不會影響認證。這裏有一個例子: + verification: 驗證 + webauthn_credentials: + add: 新增安全密鑰裝置 + create: + error: 新增安全密鑰裝置時出現了問題。請重新再試一次。 + success: 你已成功將安全密鑰裝置加入帳號。 + delete: 刪除 + delete_confirmation: 你確定要刪除這個安全密鑰裝置嗎? + description_html: 如果你啟用安全密鑰驗證的話,登入時你將需要使用其中一個安全密鑰。 + destroy: + error: 刪除安全密鑰裝置時出現了問題。請重新再試一次。 + success: 你已成功將安全密鑰裝置從帳號移除。 + invalid_credential: 無效的安全密鑰裝置 + nickname_hint: 請為你的安全密鑰裝置命名 + not_enabled: 你還未啟用 WebAuthn + not_supported: 這個瀏覽器並不支援安全密鑰裝置 + otp_required: 請開啟雙重認證以使用安全密鑰裝置 + registered_on: 在 %{date} 注冊 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 0f761a03e..a2ad6fbde 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -21,6 +21,9 @@ zh-TW: federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤隨便一台 Mastodon 伺服器上的人等等。 get_apps: 嘗試行動應用程式 hosted_on: 在 %{domain} 運作的 Mastodon 站點 + instance_actor_flash: '這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 + +' learn_more: 了解詳細 privacy_policy: 隱私權政策 see_whats_happening: 看看發生什麼事 @@ -37,14 +40,19 @@ zh-TW: reason: 原因 rejecting_media: 不會處理或儲存這些伺服器的媒體檔案,也不會顯示縮圖,需要手動點選原始檔: rejecting_media_title: 過濾的媒體 + silenced: 這些伺服器的嘟文會被從公開時間軸與對話中隱藏,而且與它們的使用者互動並不會產生任何通知,除非您追蹤他們: silenced_title: 靜音的伺服器 + suspended: 來自這些伺服器的資料都不會被處理、儲存或交換,也無法和這些伺服器上的使用者互動與溝通: suspended_title: 暫停的伺服器 + unavailable_content_html: Mastodon 一般來說允許您閱讀並和任何聯盟伺服器上的使用者互動。這些伺服器是這個站台設下的例外。 user_count_after: other: 位使用者 user_count_before: 註冊使用者數 what_is_mastodon: 什麼是 Mastodon? accounts: choices_html: "%{name} 的選擇:" + endorsements_hint: 推薦您已經關注的人,把他們釘在您的個人頁面。 + featured_tags_hint: 您可以推薦不同主題標籤,它們也會在此處出現。 follow: 關注 followers: other: 關注者 @@ -59,6 +67,8 @@ zh-TW: nothing_here: 暫時沒有內容可供顯示! people_followed_by: "%{name} 關注的人" people_who_follow: 關注 %{name} 的人 + pin_errors: + following: 你只能推薦你正在關注的使用者。 posts: other: 嘟文 posts_tab_heading: 嘟文 @@ -84,6 +94,7 @@ zh-TW: add_email_domain_block: 將電子郵件網域加入黑名單 approve: 核准 approve_all: 全部批准 + approved_msg: 成功審核了%{username} 的新帳戶申請 are_you_sure: 您確定嗎? avatar: 頭像 by_domain: 站點 @@ -97,8 +108,10 @@ zh-TW: confirm: 確定 confirmed: 已確定 confirming: 確定 + delete: 刪除資料 deleted: 已刪除 demote: 降級 + destroyed_msg: 即將刪除 %{username} 的數據 disable: 停用 disable_two_factor_authentication: 停用兩階段認證 disabled: 已停用 @@ -109,6 +122,7 @@ zh-TW: email_status: 電子信箱狀態 enable: 啟用 enabled: 已啟用 + enabled_msg: 成功解除 %{username} 帳戶的凍結 followers: 關注者 follows: 正在關注 header: 開頭 @@ -124,6 +138,8 @@ zh-TW: login_status: 登入狀態 media_attachments: 多媒體附件 memorialize: 設定為追悼帳戶 + memorialized: 被悼念的 + memorialized_msg: 成功將%{username} 的帳號變為紀念帳號 moderation: active: 活躍 all: 全部 @@ -144,10 +160,14 @@ zh-TW: public: 公開 push_subscription_expires: PuSH 訂閱過期 redownload: 重新整理個人資料 + redownloaded_msg: 成功重新載入%{username} 的個人資料頁面 reject: 拒絕 reject_all: 全部拒絕 + rejected_msg: 成功拒絕了%{username} 的新帳號申請 remove_avatar: 取消頭像 remove_header: 移除開頭 + removed_avatar_msg: 成功刪除了 %{username} 的頭像 + removed_header_msg: 成功刪除了 %{username} 的頁面頂端 resend_confirmation: already_confirmed: 此使用者已被確認 send: 重新發送驗證信 @@ -164,6 +184,8 @@ zh-TW: search: 搜尋 search_same_email_domain: 其他有同個電子郵件網域的使用者 search_same_ip: 其他有同個 IP 的使用者 + sensitive: 敏感内容 + sensitized: 已標記為敏感內容 shared_inbox_url: 共享收件箱網址 show: created_reports: 建立檢舉 @@ -173,13 +195,19 @@ zh-TW: statuses: 嘟文 subscribe: 訂閱 suspended: 已停權 + suspension_irreversible: 已永久刪除這個帳戶的數據。雖然這個帳戶的數據已被永久刪除,但是您仍然可以取消暫停這個帳戶。 + suspension_reversible_hint_html: 這個帳戶已被暫停,所有數據將會在 %{date} 被刪除。在此之前,您可以完全回復您的帳戶。如果您想即時刪除這個帳戶的數據,您可以在下面進行操作。 time_in_queue: 正在佇列等待 %{time} title: 帳戶 unconfirmed_email: 未確認的電子信箱位址 + undo_sensitized: 取消敏感狀態 undo_silenced: 取消靜音 undo_suspension: 取消停權 + unsilenced_msg: 成功解除 %{username} 的帳戶限制 unsubscribe: 取消訂閱 + unsuspended_msg: 成功取消暫停 %{username} 的帳戶 username: 使用者名稱 + view_domain: 查看站台概要 warn: 警告 web: 頁面 whitelisted: 已加入白名單 @@ -193,17 +221,37 @@ zh-TW: create_custom_emoji: 建立自訂顏文字 create_domain_allow: 建立允許網域 create_domain_block: 建立阻擋網域 + create_email_domain_block: 封鎖電子郵件站台 + create_ip_block: 新增IP規則 + demote_user: 把用戶降級 destroy_announcement: 刪除公告 destroy_custom_emoji: 刪除自訂顏文字 destroy_domain_allow: 刪除允許網域 destroy_domain_block: 刪除阻擋網域 destroy_email_domain_block: 刪除阻擋電郵網域 + destroy_ip_block: 刪除 IP 規則 destroy_status: 刪除狀態 disable_2fa_user: 停用兩階段認證 disable_custom_emoji: 停用自訂顏文字 disable_user: 停用帳戶 enable_custom_emoji: 啓用自訂顏文字 enable_user: 啓用帳戶 + memorialize_account: 設定成紀念帳號 + promote_user: 把用戶升級 + remove_avatar_user: 刪除大頭貼 + reopen_report: 重開舉報 + reset_password_user: 重設密碼 + resolve_report: 消除舉報 + sensitive_account: 把您的帳號的媒體標記為敏感內容 + silence_account: 靜音用戶 + suspend_account: 暫停用戶 + unassigned_report: 取消指派舉報 + unsensitive_account: 取消把您的帳號的媒體設定為敏感內容 + unsilence_account: 取消用戶的靜音狀態 + unsuspend_account: 取消用戶的暫停狀態 + update_announcement: 更新公告 + update_custom_emoji: 更新自訂顏文字 + update_status: 更新狀態 actions: assigned_to_self_report: "%{name} 接受了檢舉 %{target}" change_email_user: "%{name} 變更了使用者 %{target} 的電子信箱位址" @@ -214,12 +262,14 @@ zh-TW: create_domain_allow: "%{name} 將 %{target} 網域加入黑名單了" create_domain_block: "%{name} 封鎖了站點 %{target}" create_email_domain_block: "%{name} 封鎖了電子信箱網域 %{target}" + create_ip_block: "%{name} 已經設定了IP %{target} 的規則" demote_user: "%{name} 把使用者 %{target} 降級" destroy_announcement: "%{name} 刪除了公告 %{target}" destroy_custom_emoji: "%{name} 破壞了 %{target} 表情符號" destroy_domain_allow: "%{name} 從白名單中移除了 %{target} 網域" destroy_domain_block: "%{name} 取消了對站點 %{target} 的封鎖" destroy_email_domain_block: "%{name} 取消了對電子信箱網域 %{target} 的封鎖" + destroy_ip_block: "%{name} 已經刪除了 IP %{target} 的規則" destroy_status: "%{name} 刪除了 %{target} 的嘟文" disable_2fa_user: "%{name} 停用了使用者 %{target} 的兩階段認證" disable_custom_emoji: "%{name} 停用了自訂表情符號 %{target}" @@ -232,15 +282,20 @@ zh-TW: reopen_report: "%{name} 重新開啟 %{target} 的檢舉" reset_password_user: "%{name} 重新設定了使用者 %{target} 的密碼" resolve_report: "%{name} 處理了 %{target} 的檢舉" + sensitive_account: "%{name} 將 %{target} 的媒體檔案標記為敏感內容" silence_account: "%{name} 靜音了使用者 %{target}" suspend_account: "%{name} 停權了使用者 %{target}" unassigned_report: "%{name} 取消指派 %{target} 的檢舉" + unsensitive_account: "%{name} 將 %{target} 的媒體檔案的敏感狀態取消" unsilence_account: "%{name} 取消了使用者 %{target} 的靜音狀態" unsuspend_account: "%{name} 取消了使用者 %{target} 的停權狀態" update_announcement: "%{name} 更新了公告 %{target}" update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}" update_status: "%{name} 重整了 %{target} 的嘟文" deleted_status: "(已刪除嘟文)" + empty: 找不到 log + filter_by_action: 按動作篩選 + filter_by_user: 按使用者篩選 title: 營運日誌 announcements: destroyed_msg: 成功刪除公告! @@ -279,11 +334,13 @@ zh-TW: listed: 已顯示 new: title: 加入新的自訂表情符號 + not_permitted: 您無權執行此操作 overwrite: 覆蓋 shortcode: 短代碼 shortcode_hint: 至少 2 個字元,只能使用字母、數字和下劃線 title: 自訂表情符號 uncategorized: 未分類 + unlist: 不公開 unlisted: 已隱藏 update_failed_msg: 無法更新表情符號 updated_msg: 已更新表情符號! @@ -326,6 +383,8 @@ zh-TW: created_msg: 正在進行站點封鎖 destroyed_msg: 已撤銷站點封鎖 domain: 站點 + edit: 更改封鎖的站台 + existing_domain_block_html: 您已經對 %{name} 施加了更嚴格的限制,您需要先把他取消封鎖。 new: create: 新增封鎖 hint: 站點封鎖動作並不會阻止帳戶紀錄被新增至資料庫,但會自動回溯性地對那些帳戶套用特定管理設定。 @@ -335,6 +394,10 @@ zh-TW: silence: 靜音 suspend: 停權 title: 新增封鎖站點 + private_comment: 私人留言 + private_comment_hint: 請提供更多有關此站台限制的資訊以供版主作內部參考。 + public_comment: 公開留言 + public_comment_hint: 如果你已經啟用站台限制列表的公告,請為一般大眾提供更多有關此站台限制的資訊。 reject_media: 拒絕媒體檔案 reject_media_hint: 刪除本地快取的媒體檔案,並且不再接收來自該站點的任何媒體檔案。與停權無關 reject_reports: 拒絕檢舉 @@ -353,33 +416,75 @@ zh-TW: title: 撤銷 %{domain} 的站點封鎖 undo: 撤銷 undo: 復原欲封鎖域名 + view: 顯示阻擋的網域 email_domain_blocks: add_new: 加入新項目 created_msg: 已成功將電子信箱網域加入黑名單 delete: 刪除 destroyed_msg: 已成功從黑名單刪除電子信箱網域 domain: 站點 + empty: 現在沒有阻擋任何 e-mail 網域。 + from_html: 由 %{domain} new: create: 新增站點 title: 新增電子信箱黑名單項目 title: 電子信箱黑名單 instances: + by_domain: 站台 + delivery_available: 可傳送 + known_accounts: + other: "%{count} 已知的帳戶" moderation: all: 全部 limited: 限制 title: 版主 + private_comment: 私人留言 + public_comment: 公開留言 title: 聯邦 + total_blocked_by_us: 被我們封鎖 + total_followed_by_them: 被他們關注 + total_followed_by_us: 被我們關注 + total_reported: 關於他們的舉報 + total_storage: 多媒體附檔 invites: + deactivate_all: 全部停用 filter: all: 全部 available: 可用 expired: 已失效 title: 篩選 title: 邀請使用者 + ip_blocks: + add_new: 建立規則 + created_msg: 更新 IP 規則成功 + delete: 刪除 + expires_in: + '1209600': 2 個星期 + '15778476': 6 個月 + '2629746': 1 個月 + '31556952': 1 年 + '86400': 1 天 + '94670856': 3 年 + new: + title: 建立新的 IP 規則 + no_ip_block_selected: 因為沒有選擇任何 IP 規則,所以什麼事都沒發生 + title: IP 規則 + pending_accounts: + title: 待處理帳戶(%{count}) + relationships: + title: "%{acct} 的關係" relays: + add_new: 新增中繼站 + delete: 刪除 description_html: "聯邦中繼站 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。中繼站也能協助小型或中型伺服器從聯邦中探索內容,而無須本地使用者手動關注遠端伺服器的其他使用者。" + disable: 停用 disabled: 停用 enable: 啟用 + enable_hint: 啟用後,你的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。 + enabled: 已啟用 + inbox_url: 中繼URL + save_and_enable: 儲存並啟用 + status: 狀態 report_notes: created_msg: 檢舉記錄建立成功! destroyed_msg: 檢舉記錄刪除成功! @@ -420,6 +525,8 @@ zh-TW: contact_information: email: 用於聯絡的公開電子信箱位址 username: 請輸入使用者名稱 + custom_css: + title: 自訂 CSS domain_blocks: all: 給任何人 disabled: 給沒有人 @@ -429,6 +536,9 @@ zh-TW: hero: desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會重設回伺服器預覽圖 title: 主題圖片 + mascot: + desc_html: 在許多頁面都會顯示。推薦最小 293x205px。如果留空,將採用預設的吉祥物 + title: 吉祥物圖片 peers_api_enabled: desc_html: 本伺服器在聯邦中發現的站點 title: 發布已知伺服器的列表 @@ -447,6 +557,8 @@ zh-TW: min_invite_role: disabled: 沒有人 title: 允許發送邀請的身份 + require_invite_text: + title: 要求新使用者填申請書以索取邀請 registrations_mode: modes: approved: 註冊需要核准 @@ -480,6 +592,8 @@ zh-TW: desc_html: 在主頁顯示本站時間軸 title: 時間軸預覽 title: 網站設定 + trendable_by_default: + title: 允許熱門的主題標籤直接顯示於趨勢區,不需經過審核 trends: title: 趨勢主題標籤 site_uploads: @@ -500,6 +614,8 @@ zh-TW: title: 帳戶嘟文 with_media: 含有媒體檔案 tags: + accounts_today: 本日不重複使用者數 + accounts_week: 本週不重複使用者數 context: 上下文 directory: 在目錄中 in_directory: 目錄中有 %{count} 個 @@ -527,6 +643,7 @@ zh-TW: advanced_web_interface: 進階網頁介面 advanced_web_interface_hint: 進階網頁界面可讓您配置許多不同的欄位來善用多餘的螢幕空間,依需要同時查看盡可能多的資訊如:首頁、通知、站點聯邦時間軸、任意數量的列表和主題標籤。 animations_and_accessibility: 動畫與可用性 + discovery: 探索 localization: body: Mastodon 是由志願者翻譯的。 guide_link: https://crowdin.com/project/mastodon @@ -549,12 +666,16 @@ zh-TW: warning: 警告,不要把它分享給任何人! your_token: 你的 token auth: + apply_for_account: 索取註冊邀請 change_password: 密碼 delete_account: 刪除帳戶 delete_account_html: 如果你想刪除你的帳戶,請點擊這裡繼續。你需要確認你的操作。 + description: + prefix_sign_up: 現在就註冊 Mastodon 帳號吧! didnt_get_confirmation: 沒有收到驗證信? forgot_password: 忘記密碼? invalid_reset_password_token: 密碼重設 token 無效或已過期。請重新設定密碼。 + link_to_webauth: 使用您的安全金鑰 login: 登入 logout: 登出 migrate_account: 轉移到另一個帳戶 @@ -563,10 +684,14 @@ zh-TW: providers: saml: SAML register: 註冊 + registration_closed: "%{instance} 現在不開放新成員" resend_confirmation: 重新寄送確認指引 reset_password: 重設密碼 security: 登入資訊 set_new_password: 設定新密碼 + setup: + email_settings_hint_html: 請確認 e-mail 是否傳送到 %{email} 。如果不對的話,可以從帳號設定修改。 + title: 設定 authorize_follow: already_following: 你已經關注了這個使用者 already_requested: 您早已向該帳戶寄送追蹤請求 @@ -630,12 +755,15 @@ zh-TW: filters: index: empty: 您沒有過濾器。 + title: 過濾器 footer: more: 更多...... + trending_now: 現正熱門 generic: all: 全部 changes_saved_msg: 已成功儲存修改! copy: 複製 + delete: 刪除 save_changes: 儲存修改 imports: preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。 @@ -674,6 +802,8 @@ zh-TW: too_many: 無法加入超過 4 個檔案 migrations: acct: 新帳戶的 使用者名稱@站點網域 + proceed_with_move: 移動關注者 + redirected_msg: 您的帳號現在指向 %{acct} moderation: title: 營運 notification_mailer: @@ -855,3 +985,5 @@ zh-TW: verification: explanation_html: 您在 Mastodon 個人資料頁上所列出的連結,可以用此方式驗證您確實掌控該連結網頁的內容。您可以在連結的網頁上加上一個連回 Mastodon 個人資料頁的連結,該連結的原始碼 必須包含rel="me"屬性。連結的顯示文字可自由發揮,以下為範例: verification: 驗證連結 + webauthn_credentials: + registered_on: 註冊於 %{date} From b1feb47055c121c1b6949bd7ef6734bf56c847bd Mon Sep 17 00:00:00 2001 From: ThibG Date: Thu, 17 Dec 2020 06:51:49 +0100 Subject: [PATCH 49/83] Improve searching for private toots from URL (#14856) * Improve searching for private toots from URL Most of the time, when sharing toots, people use the toot URL rather than the toot URI, which makes sense since it is the user-facing URL. In Mastodon's case, the URL and URI are different, and Mastodon does not have an index on URL, which means searching a private toot by URL is done with a slow query that will only succeed for very recent toots. This change gets rid of the slow query, and attempts to guess the URI from URL instead, as Mastodon's are predictable. * Add tests * Only return status with guessed uri if url matches Co-authored-by: Claire --- app/services/resolve_url_service.rb | 12 ++- spec/services/resolve_url_service_spec.rb | 97 +++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb index 78080d878..5981e4d98 100644 --- a/app/services/resolve_url_service.rb +++ b/app/services/resolve_url_service.rb @@ -34,7 +34,17 @@ class ResolveURLService < BaseService # It may happen that the resource is a private toot, and thus not fetchable, # but we can return the toot if we already know about it. - status = Status.find_by(uri: @url) || Status.find_by(url: @url) + scope = Status.where(uri: @url) + + # We don't have an index on `url`, so try guessing the `uri` from `url` + parsed_url = Addressable::URI.parse(@url) + parsed_url.path.match(%r{/@(?#{Account::USERNAME_RE})/(?[0-9]+)\Z}) do |matched| + parsed_url.path = "/users/#{matched[:username]}/statuses/#{matched[:status_id]}" + scope = scope.or(Status.where(uri: parsed_url.to_s, url: @url)) + end + + status = scope.first + authorize_with @on_behalf_of, status, :show? unless status.nil? status rescue Mastodon::NotPermittedError diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb index aa4204637..a38b23590 100644 --- a/spec/services/resolve_url_service_spec.rb +++ b/spec/services/resolve_url_service_spec.rb @@ -15,5 +15,102 @@ describe ResolveURLService, type: :service do expect(subject.call(url)).to be_nil end + + context 'searching for a remote private status' do + let(:account) { Fabricate(:account) } + let(:poster) { Fabricate(:account, domain: 'example.com') } + let(:url) { 'https://example.com/@foo/42' } + let(:uri) { 'https://example.com/users/foo/statuses/42' } + let!(:status) { Fabricate(:status, url: url, uri: uri, account: poster, visibility: :private) } + + before do + stub_request(:get, url).to_return(status: 404) if url.present? + stub_request(:get, uri).to_return(status: 404) + end + + context 'when the account follows the poster' do + before do + account.follow!(poster) + end + + context 'when the status uses Mastodon-style URLs' do + let(:url) { 'https://example.com/@foo/42' } + let(:uri) { 'https://example.com/users/foo/statuses/42' } + + it 'returns status by url' do + expect(subject.call(url, on_behalf_of: account)).to eq(status) + end + + it 'returns status by uri' do + expect(subject.call(uri, on_behalf_of: account)).to eq(status) + end + end + + context 'when the status uses pleroma-style URLs' do + let(:url) { nil } + let(:uri) { 'https://example.com/objects/0123-456-789-abc-def' } + + it 'returns status by uri' do + expect(subject.call(uri, on_behalf_of: account)).to eq(status) + end + end + end + + context 'when the account does not follow the poster' do + context 'when the status uses Mastodon-style URLs' do + let(:url) { 'https://example.com/@foo/42' } + let(:uri) { 'https://example.com/users/foo/statuses/42' } + + it 'does not return the status by url' do + expect(subject.call(url, on_behalf_of: account)).to be_nil + end + + it 'does not return the status by uri' do + expect(subject.call(uri, on_behalf_of: account)).to be_nil + end + end + + context 'when the status uses pleroma-style URLs' do + let(:url) { nil } + let(:uri) { 'https://example.com/objects/0123-456-789-abc-def' } + + it 'returns status by uri' do + expect(subject.call(uri, on_behalf_of: account)).to be_nil + end + end + end + end + + context 'searching for a local private status' do + let(:account) { Fabricate(:account) } + let(:poster) { Fabricate(:account) } + let!(:status) { Fabricate(:status, account: poster, visibility: :private) } + let(:url) { ActivityPub::TagManager.instance.url_for(status) } + let(:uri) { ActivityPub::TagManager.instance.uri_for(status) } + + context 'when the account follows the poster' do + before do + account.follow!(poster) + end + + it 'returns status by url' do + expect(subject.call(url, on_behalf_of: account)).to eq(status) + end + + it 'returns status by uri' do + expect(subject.call(uri, on_behalf_of: account)).to eq(status) + end + end + + context 'when the account does not follow the poster' do + it 'does not return the status by url' do + expect(subject.call(url, on_behalf_of: account)).to be_nil + end + + it 'does not return the status by uri' do + expect(subject.call(uri, on_behalf_of: account)).to be_nil + end + end + end end end From 8a95867693dfe072241d5ddcd0ba7ed8546eab1e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 18 Dec 2020 08:30:41 +0100 Subject: [PATCH 50/83] Add option to obfuscate domain name in public list of domain blocks (#15355) - Replace the middle of the domain with * characters (except for periods) - Add SHA-256 digest of the domain name in tooltip --- .../admin/domain_blocks_controller.rb | 4 ++-- app/models/domain_block.rb | 20 +++++++++++++++++++ app/views/about/_domain_blocks.html.haml | 2 +- app/views/admin/domain_blocks/edit.html.haml | 3 +++ app/views/admin/domain_blocks/new.html.haml | 3 +++ config/locales/en.yml | 2 ++ ...18054746_add_obfuscate_to_domain_blocks.rb | 15 ++++++++++++++ db/schema.rb | 3 ++- 8 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index 6a5b41a74..ba927b04a 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -74,11 +74,11 @@ module Admin end def update_params - params.require(:domain_block).permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment) + params.require(:domain_block).permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) end def resource_params - params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment) + params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) end end end diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index 829d7583b..bba04c603 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -12,6 +12,7 @@ # reject_reports :boolean default(FALSE), not null # private_comment :text # public_comment :text +# obfuscate :boolean default(FALSE), not null # class DomainBlock < ApplicationRecord @@ -73,4 +74,23 @@ class DomainBlock < ApplicationRecord scope = suspend? ? accounts.where(suspended_at: created_at) : accounts.where(silenced_at: created_at) scope.count end + + def public_domain + return domain unless obfuscate? + + length = domain.size + visible_ratio = length / 4 + + domain.chars.map.with_index do |chr, i| + if i > visible_ratio && i < length - visible_ratio && chr != '.' + '*' + else + chr + end + end.join + end + + def domain_digest + Digest::SHA256.hexdigest(domain) + end end diff --git a/app/views/about/_domain_blocks.html.haml b/app/views/about/_domain_blocks.html.haml index e0c5df41d..35a30f16e 100644 --- a/app/views/about/_domain_blocks.html.haml +++ b/app/views/about/_domain_blocks.html.haml @@ -7,6 +7,6 @@ - domain_blocks.each do |domain_block| %tr %td.nowrap - %span{ title: domain_block.domain }= domain_block.domain + %span{ title: "SHA-256: #{domain_block.domain_digest}" }= domain_block.public_domain %td = domain_block.public_comment if display_blocks_rationale? diff --git a/app/views/admin/domain_blocks/edit.html.haml b/app/views/admin/domain_blocks/edit.html.haml index d5868070a..6fe2edc82 100644 --- a/app/views/admin/domain_blocks/edit.html.haml +++ b/app/views/admin/domain_blocks/edit.html.haml @@ -20,6 +20,9 @@ .fields-group = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint') + .fields-group + = f.input :obfuscate, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.obfuscate'), hint: I18n.t('admin.domain_blocks.obfuscate_hint') + .field-group = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6 diff --git a/app/views/admin/domain_blocks/new.html.haml b/app/views/admin/domain_blocks/new.html.haml index f503f9b77..8b78f71f2 100644 --- a/app/views/admin/domain_blocks/new.html.haml +++ b/app/views/admin/domain_blocks/new.html.haml @@ -20,6 +20,9 @@ .fields-group = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint') + .fields-group + = f.input :obfuscate, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.obfuscate'), hint: I18n.t('admin.domain_blocks.obfuscate_hint') + .field-group = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6 diff --git a/config/locales/en.yml b/config/locales/en.yml index 83f75b28f..e91f4344f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -402,6 +402,8 @@ en: silence: Silence suspend: Suspend title: New domain block + obfuscate: Obfuscate domain name + obfuscate_hint: Partially obfuscate the domain name in the list if advertising the list of domain limitations is enabled private_comment: Private comment private_comment_hint: Comment about this domain limitation for internal use by the moderators. public_comment: Public comment diff --git a/db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb b/db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb new file mode 100644 index 000000000..26f4ddb85 --- /dev/null +++ b/db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb @@ -0,0 +1,15 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddObfuscateToDomainBlocks < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured { add_column_with_default :domain_blocks, :obfuscate, :boolean, default: false, allow_null: false } + end + + def down + remove_column :domain_blocks, :obfuscate + end +end diff --git a/db/schema.rb b/db/schema.rb index 55822a4b3..18bf1d4ca 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.define(version: 2020_12_06_004238) do +ActiveRecord::Schema.define(version: 2020_12_18_054746) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -360,6 +360,7 @@ ActiveRecord::Schema.define(version: 2020_12_06_004238) do t.boolean "reject_reports", default: false, null: false t.text "private_comment" t.text "public_comment" + t.boolean "obfuscate", default: false, null: false t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true end From 941ff04b03a8a3e3f03e95c108f0cfa621226fb1 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 18 Dec 2020 08:47:36 +0100 Subject: [PATCH 51/83] Fix styles for RTL languages and the light theme (#15356) --- .../styles/mastodon-light/diff.scss | 42 ++++++++++++++++- app/javascript/styles/mastodon/rtl.scss | 46 ++++++++++++++++++- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 64f4adb84..d4290d7e6 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -355,11 +355,45 @@ html { .error-modal, .onboarding-modal, .report-modal__comment .setting-text__wrapper, -.report-modal__comment .setting-text { +.report-modal__comment .setting-text, +.announcements, +.picture-in-picture__header, +.picture-in-picture__footer, +.reactions-bar__item { background: $white; border: 1px solid lighten($ui-base-color, 8%); } +.reactions-bar__item { + &:hover, + &:focus, + &:active { + background-color: $ui-base-color; + } +} + +.reactions-bar__item.active { + background-color: mix($white, $ui-highlight-color, 80%); + border-color: mix(lighten($ui-base-color, 8%), $ui-highlight-color, 80%); +} + +.media-modal__overlay .picture-in-picture__footer { + border: 0; +} + +.picture-in-picture__header { + border-bottom: 0; +} + +.announcements, +.picture-in-picture__footer { + border-top: 0; +} + +.icon-with-badge__badge { + border-color: $white; +} + .report-modal__comment { border-right-color: lighten($ui-base-color, 8%); } @@ -512,6 +546,12 @@ html { } } +.picture-in-picture-placeholder { + background: $white; + border-color: lighten($ui-base-color, 8%); + color: lighten($ui-base-color, 8%); +} + .brand__tagline { color: $ui-secondary-color; } diff --git a/app/javascript/styles/mastodon/rtl.scss b/app/javascript/styles/mastodon/rtl.scss index fbf26e30b..8051e4edb 100644 --- a/app/javascript/styles/mastodon/rtl.scss +++ b/app/javascript/styles/mastodon/rtl.scss @@ -17,15 +17,38 @@ body.rtl { margin-right: 15px; } - .display-name { + .display-name, + .announcements__item { text-align: right; } + .announcements__item__range { + padding-right: 0; + padding-left: 18px; + } + + .reactions-bar { + margin-left: auto; + margin-right: -2px; + direction: rtl; + } + + .reactions-bar__item__count { + margin-left: 0; + margin-right: 6px; + } + + .announcements__pagination { + right: auto; + left: 0; + } + .notification__message { margin-left: 0; margin-right: 68px; } + .announcements__mastodon, .drawer__inner__mastodon > img { transform: scaleX(-1); } @@ -195,6 +218,7 @@ body.rtl { margin-right: 0; } + .picture-in-picture__header__account .display-name, .detailed-status__display-name .display-name { text-align: right; } @@ -205,6 +229,21 @@ body.rtl { float: right; } + .picture-in-picture__header__account .account__avatar { + margin-right: 0; + margin-left: 10px; + } + + .icon-button__counter { + margin-left: 0; + margin-right: 4px; + } + + .notifications-permission-banner__close { + right: auto; + left: 10px; + } + .detailed-status__favorites, .detailed-status__reblogs { margin-left: 0; @@ -416,4 +455,9 @@ body.rtl { left: auto; right: 0; } + + .picture-in-picture { + right: auto; + left: 20px; + } } From eb35be0431b2cdd2bbf3339beb9c5a0839e1088b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 18 Dec 2020 09:18:31 +0100 Subject: [PATCH 52/83] Fix follow limit preventing re-following of a moved account (#14207) --- app/models/follow.rb | 2 +- app/models/follow_request.rb | 2 +- app/models/import.rb | 1 + app/services/import_service.rb | 7 ++--- app/validators/import_validator.rb | 44 ++++++++++++++++++++++++++++++ config/locales/en.yml | 2 ++ spec/models/follow_spec.rb | 2 +- spec/models/import_spec.rb | 10 +++++++ 8 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 app/validators/import_validator.rb diff --git a/app/models/follow.rb b/app/models/follow.rb index 55a9da792..69a1722b3 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -26,7 +26,7 @@ class Follow < ApplicationRecord has_one :notification, as: :activity, dependent: :destroy validates :account_id, uniqueness: { scope: :target_account_id } - validates_with FollowLimitValidator, on: :create + validates_with FollowLimitValidator, on: :create, if: :rate_limit? scope :recent, -> { reorder(id: :desc) } diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb index c1f19149b..2d2a77b59 100644 --- a/app/models/follow_request.rb +++ b/app/models/follow_request.rb @@ -26,7 +26,7 @@ class FollowRequest < ApplicationRecord has_one :notification, as: :activity, dependent: :destroy validates :account_id, uniqueness: { scope: :target_account_id } - validates_with FollowLimitValidator, on: :create + validates_with FollowLimitValidator, on: :create, if: :rate_limit? def authorize! account.follow!(target_account, reblogs: show_reblogs, notify: notify, uri: uri) diff --git a/app/models/import.rb b/app/models/import.rb index 702453289..00a54892e 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -27,6 +27,7 @@ class Import < ApplicationRecord enum type: [:following, :blocking, :muting, :domain_blocking, :bookmarks] validates :type, presence: true + validates_with ImportValidator, on: :create has_attached_file :data validates_attachment_content_type :data, content_type: FILE_TYPES diff --git a/app/services/import_service.rb b/app/services/import_service.rb index 288e47f1e..0c6ef2238 100644 --- a/app/services/import_service.rb +++ b/app/services/import_service.rb @@ -27,7 +27,7 @@ class ImportService < BaseService def import_follows! parse_import_data!(['Account address']) - import_relationships!('follow', 'unfollow', @account.following, follow_limit, reblogs: { header: 'Show boosts', default: true }) + import_relationships!('follow', 'unfollow', @account.following, ROWS_PROCESSING_LIMIT, reblogs: { header: 'Show boosts', default: true }) end def import_blocks! @@ -85,6 +85,7 @@ class ImportService < BaseService head_items = items.uniq { |acct, _| acct.split('@')[1] } tail_items = items - head_items + Import::RelationshipWorker.push_bulk(head_items + tail_items) do |acct, extra| [@account.id, acct, action, extra] end @@ -133,10 +134,6 @@ class ImportService < BaseService Paperclip.io_adapters.for(@import.data).read end - def follow_limit - FollowLimitValidator.limit_for_account(@account) - end - def relations_map_for_account(account, account_ids) { blocking: {}, diff --git a/app/validators/import_validator.rb b/app/validators/import_validator.rb new file mode 100644 index 000000000..a182abfa5 --- /dev/null +++ b/app/validators/import_validator.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +class ImportValidator < ActiveModel::Validator + KNOWN_HEADERS = [ + 'Account address', + '#domain', + '#uri', + ].freeze + + def validate(import) + return if import.type.blank? || import.data.blank? + + # We parse because newlines could be part of individual rows. This + # runs on create so we should be reading the local file here before + # it is uploaded to object storage or moved anywhere... + csv_data = CSV.parse(import.data.queued_for_write[:original].read) + + row_count = csv_data.size + row_count -= 1 if KNOWN_HEADERS.include?(csv_data.first&.first) + + import.errors.add(:data, I18n.t('imports.errors.over_rows_processing_limit', count: ImportService::ROWS_PROCESSING_LIMIT)) if row_count > ImportService::ROWS_PROCESSING_LIMIT + + case import.type + when 'following' + validate_following_import(import, row_count) + end + end + + private + + def validate_following_import(import, row_count) + base_limit = FollowLimitValidator.limit_for_account(import.account) + + limit = begin + if import.overwrite? + base_limit + else + base_limit - import.account.following_count + end + end + + import.errors.add(:data, I18n.t('users.follow_limit_reached', limit: base_limit)) if row_count > limit + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index e91f4344f..18a207f5e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -923,6 +923,8 @@ en: status: Verification status view_proof: View proof imports: + errors: + over_rows_processing_limit: contains more than %{count} rows modes: merge: Merge merge_long: Keep existing records and add new ones diff --git a/spec/models/follow_spec.rb b/spec/models/follow_spec.rb index 0c84e5e7b..e723a1ef2 100644 --- a/spec/models/follow_spec.rb +++ b/spec/models/follow_spec.rb @@ -5,7 +5,7 @@ RSpec.describe Follow, type: :model do let(:bob) { Fabricate(:account, username: 'bob') } describe 'validations' do - subject { Follow.new(account: alice, target_account: bob) } + subject { Follow.new(account: alice, target_account: bob, rate_limit: true) } it 'has a valid fabricator' do follow = Fabricate.build(:follow) diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb index 321761166..a5eec1722 100644 --- a/spec/models/import_spec.rb +++ b/spec/models/import_spec.rb @@ -20,5 +20,15 @@ RSpec.describe Import, type: :model do import = Import.create(account: account, type: type) expect(import).to model_have_error_on_field(:data) end + + it 'is invalid with too many rows in data' do + import = Import.create(account: account, type: type, data: StringIO.new("foo@bar.com\n" * (ImportService::ROWS_PROCESSING_LIMIT + 10))) + expect(import).to model_have_error_on_field(:data) + end + + it 'is invalid when there are more rows when following limit' do + import = Import.create(account: account, type: type, data: StringIO.new("foo@bar.com\n" * (FollowLimitValidator.limit_for_account(account) + 10))) + expect(import).to model_have_error_on_field(:data) + end end end From 47c6c54d31fe43cdda2fab55d39ad5f99c0538be Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 18 Dec 2020 09:43:33 +0100 Subject: [PATCH 53/83] Fix styling issue on /about when server admin has a long username (#15357) Co-authored-by: Claire --- app/javascript/styles/mastodon/about.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 3be0aee49..d6bd9e3c6 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -732,6 +732,7 @@ $small-breakpoint: 960px; &__column { flex: 1 1 50%; + overflow-x: hidden; } } From 75944a2f2dc83d1b12fa7cbddb18f673513fbb45 Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 18 Dec 2020 09:46:59 +0100 Subject: [PATCH 54/83] Bump max supported schema version in maintenance script (#15359) Co-authored-by: Claire --- lib/mastodon/maintenance_cli.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/maintenance_cli.rb b/lib/mastodon/maintenance_cli.rb index ffad3f6a2..822051ceb 100644 --- a/lib/mastodon/maintenance_cli.rb +++ b/lib/mastodon/maintenance_cli.rb @@ -14,7 +14,7 @@ module Mastodon end MIN_SUPPORTED_VERSION = 2019_10_01_213028 - MAX_SUPPORTED_VERSION = 2020_12_06_004238 + MAX_SUPPORTED_VERSION = 2020_12_18_054746 # Stubs to enjoy ActiveRecord queries while not depending on a particular # version of the code/database From 1a028822442f10416f3782341307b4b759681b58 Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 18 Dec 2020 09:57:54 +0100 Subject: [PATCH 55/83] Reword invite text settings in admin views for consistency (#15358) For consistency with #15265 Co-authored-by: Claire --- config/locales/en.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 18a207f5e..7ea4ea154 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -593,8 +593,8 @@ en: disabled: No one title: Allow invitations by require_invite_text: - desc_html: When registrations require manual approval, make the “Why do you want to join?” invite request text mandatory rather than optional - title: Require new users to fill an invite request text + desc_html: When registrations require manual approval, make the “Why do you want to join?” text input mandatory rather than optional + title: Require new users to enter a reason to join registrations_mode: modes: approved: Approval required for sign up From 052249588b77fe3d8e29658076eb385f64511d6b Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 18 Dec 2020 17:51:24 +0100 Subject: [PATCH 56/83] Fix old migration script not being able to run if it fails midway (#15361) * Fix old migration script not being able to run if it fails midway Improve the robustness of a migration script likely to fail because of database corruption so it can run again once database corruptions are fixed. * Display a specific error message in case of index corruption Co-authored-by: Eugen Rochko Co-authored-by: Claire --- ...3_add_fixed_lowercase_index_to_accounts.rb | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb index c5688681f..c3aa8e33c 100644 --- a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb +++ b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb @@ -1,10 +1,30 @@ class AddFixedLowercaseIndexToAccounts < ActiveRecord::Migration[5.2] disable_ddl_transaction! + class CorruptionError < StandardError + def cause + nil + end + + def backtrace + [] + end + end + def up - rename_index :accounts, 'index_accounts_on_username_and_domain_lower', 'old_index_accounts_on_username_and_domain_lower' unless index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') - add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true, algorithm: :concurrently - remove_index :accounts, name: 'old_index_accounts_on_username_and_domain_lower' + if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') && index_name_exists?(:accounts, 'index_accounts_on_username_and_domain_lower') + remove_index :accounts, name: 'index_accounts_on_username_and_domain_lower' + elsif index_name_exists?(:accounts, 'index_accounts_on_username_and_domain_lower') + rename_index :accounts, 'index_accounts_on_username_and_domain_lower', 'old_index_accounts_on_username_and_domain_lower' + end + + begin + add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true, algorithm: :concurrently + rescue ActiveRecord::RecordNotUnique + raise CorruptionError, 'Migration failed because of index corruption, see https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#fixing' + end + + remove_index :accounts, name: 'old_index_accounts_on_username_and_domain_lower' if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') end def down From a60d9335d8e7c4aa070f081719ee2a438b0e0202 Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 18 Dec 2020 23:26:26 +0100 Subject: [PATCH 57/83] Fix resolving accounts sometimes creating duplicate records for a given AP id (#15364) * Fix ResolveAccountService accepting mismatching acct: URI * Set attributes that should be updated regardless of suspension * Fix key fetching * Automatically merge remote accounts with duplicate `uri` * Add tests * Add "tootctl accounts fix-duplicates" Finds duplicate accounts sharing a same ActivityPub `id`, re-fetch them and merge them under the canonical `acct:` URI. Co-authored-by: Claire --- .../fetch_remote_account_service.rb | 2 +- .../activitypub/process_account_service.rb | 28 ++++++++-- app/services/resolve_account_service.rb | 17 +----- app/workers/account_merging_worker.rb | 18 ++++++ lib/mastodon/accounts_cli.rb | 19 +++++++ spec/services/resolve_account_service_spec.rb | 56 ++++++++++++++++++- 6 files changed, 116 insertions(+), 24 deletions(-) create mode 100644 app/workers/account_merging_worker.rb diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb index e5bd0c47c..9d01f5386 100644 --- a/app/services/activitypub/fetch_remote_account_service.rb +++ b/app/services/activitypub/fetch_remote_account_service.rb @@ -28,7 +28,7 @@ class ActivityPub::FetchRemoteAccountService < BaseService return unless only_key || verified_webfinger? - ActivityPub::ProcessAccountService.new.call(@username, @domain, @json, only_key: only_key) + ActivityPub::ProcessAccountService.new.call(@username, @domain, @json, only_key: only_key, verified_webfinger: !only_key) rescue Oj::ParseError nil end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 4cb8e09db..6afeb92d6 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -28,6 +28,8 @@ class ActivityPub::ProcessAccountService < BaseService update_account process_tags process_attachments + + process_duplicate_accounts! if @options[:verified_webfinger] else raise Mastodon::RaceConditionError end @@ -69,34 +71,42 @@ class ActivityPub::ProcessAccountService < BaseService @account.protocol = :activitypub set_suspension! + set_immediate_protocol_attributes! + set_fetchable_key! unless @account.suspended? && @account.suspension_origin_local? set_immediate_attributes! unless @account.suspended? - set_fetchable_attributes! unless @options[:only_keys] || @account.suspended? + set_fetchable_attributes! unless @options[:only_key] || @account.suspended? @account.save_with_optional_media! end - def set_immediate_attributes! + def set_immediate_protocol_attributes! @account.inbox_url = @json['inbox'] || '' @account.outbox_url = @json['outbox'] || '' @account.shared_inbox_url = (@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox']) || '' @account.followers_url = @json['followers'] || '' - @account.featured_collection_url = @json['featured'] || '' - @account.devices_url = @json['devices'] || '' @account.url = url || @uri @account.uri = @uri + @account.actor_type = actor_type + end + + def set_immediate_attributes! + @account.featured_collection_url = @json['featured'] || '' + @account.devices_url = @json['devices'] || '' @account.display_name = @json['name'] || '' @account.note = @json['summary'] || '' @account.locked = @json['manuallyApprovesFollowers'] || false @account.fields = property_values || {} @account.also_known_as = as_array(@json['alsoKnownAs'] || []).map { |item| value_or_id(item) } - @account.actor_type = actor_type @account.discoverable = @json['discoverable'] || false end + def set_fetchable_key! + @account.public_key = public_key || '' + end + def set_fetchable_attributes! @account.avatar_remote_url = image_url('icon') || '' unless skip_download? @account.header_remote_url = image_url('image') || '' unless skip_download? - @account.public_key = public_key || '' @account.statuses_count = outbox_total_items if outbox_total_items.present? @account.following_count = following_total_items if following_total_items.present? @account.followers_count = followers_total_items if followers_total_items.present? @@ -140,6 +150,12 @@ class ActivityPub::ProcessAccountService < BaseService VerifyAccountLinksWorker.perform_async(@account.id) end + def process_duplicate_accounts! + return unless Account.where(uri: @account.uri).where.not(id: @account.id).exists? + + AccountMergingWorker.perform_async(@account.id) + end + def actor_type if @json['type'].is_a?(Array) @json['type'].find { |type| ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES.include?(type) } diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb index 74b0b82d0..3301aaf51 100644 --- a/app/services/resolve_account_service.rb +++ b/app/services/resolve_account_service.rb @@ -49,7 +49,7 @@ class ResolveAccountService < BaseService # Now it is certain, it is definitely a remote account, and it # either needs to be created, or updated from fresh data - process_account! + fetch_account! rescue Webfinger::Error, Oj::ParseError => e Rails.logger.debug "Webfinger query for #{@uri} failed: #{e}" nil @@ -104,16 +104,12 @@ class ResolveAccountService < BaseService acct.gsub(/\Aacct:/, '').split('@') end - def process_account! + def fetch_account! return unless activitypub_ready? RedisLock.acquire(lock_options) do |lock| if lock.acquired? - @account = Account.find_remote(@username, @domain) - - next if actor_json.nil? - - @account = ActivityPub::ProcessAccountService.new.call(@username, @domain, actor_json) + @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url) else raise Mastodon::RaceConditionError end @@ -136,13 +132,6 @@ class ResolveAccountService < BaseService @actor_url ||= @webfinger.link('self', 'href') end - def actor_json - return @actor_json if defined?(@actor_json) - - json = fetch_resource(actor_url, false) - @actor_json = supported_context?(json) && equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES) ? json : nil - end - def gone_from_origin? @gone end diff --git a/app/workers/account_merging_worker.rb b/app/workers/account_merging_worker.rb new file mode 100644 index 000000000..8c234e7ac --- /dev/null +++ b/app/workers/account_merging_worker.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class AccountMergingWorker + include Sidekiq::Worker + + sidekiq_options queue: 'pull' + + def perform(account_id) + account = Account.find(account_id) + + return true if account.nil? || account.local? + + Account.where(uri: account.uri).where.not(id: account.id).find_each do |duplicate| + account.merge_with!(duplicate) + duplicate.destroy + end + end +end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index bef4093a8..474643869 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -236,6 +236,25 @@ module Mastodon say('OK', :green) end + desc 'fix-duplicates', 'Find duplicate remote accounts and merge them' + option :dry_run, type: :boolean + long_desc <<-LONG_DESC + Merge known remote accounts sharing an ActivityPub actor identifier. + + Such duplicates can occur when a remote server admin misconfigures their + domain configuration. + LONG_DESC + def fix_duplicates + Account.remote.select(:uri, 'count(*)').group(:uri).having('count(*) > 1').pluck_each(:uri) do |uri| + say("Duplicates found for #{uri}") + begin + ActivityPub::FetchRemotAccountService.new.call(uri) unless options[:dry_run] + rescue => e + say("Error processing #{uri}: #{e}", :red) + end + end + end + desc 'backup USERNAME', 'Request a backup for a user' long_desc <<-LONG_DESC Request a new backup for an account with a given USERNAME. diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb index 5bd0ec264..a604e90b5 100644 --- a/spec/services/resolve_account_service_spec.rb +++ b/spec/services/resolve_account_service_spec.rb @@ -60,7 +60,22 @@ RSpec.describe ResolveAccountService, type: :service do context 'with a legitimate webfinger redirection' do before do - webfinger = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo' }] } + webfinger = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] } + stub_request(:get, 'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'returns new remote account' do + account = subject.call('Foo@redirected.example.com') + + expect(account.activitypub?).to eq true + expect(account.acct).to eq 'foo@ap.example.com' + expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' + end + end + + context 'with a misconfigured redirection' do + before do + webfinger = { subject: 'acct:Foo@redirected.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] } stub_request(:get, 'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -75,9 +90,9 @@ RSpec.describe ResolveAccountService, type: :service do context 'with too many webfinger redirections' do before do - webfinger = { subject: 'acct:foo@evil.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo' }] } + webfinger = { subject: 'acct:foo@evil.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] } stub_request(:get, 'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) - webfinger2 = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo' }] } + webfinger2 = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] } stub_request(:get, 'https://evil.example.com/.well-known/webfinger?resource=acct:foo@evil.example.com').to_return(body: Oj.dump(webfinger2), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -111,6 +126,41 @@ RSpec.describe ResolveAccountService, type: :service do end end + context 'with an already-known actor changing acct: URI' do + let!(:duplicate) { Fabricate(:account, username: 'foo', domain: 'old.example.com', uri: 'https://ap.example.com/users/foo') } + let!(:status) { Fabricate(:status, account: duplicate, text: 'foo') } + + it 'returns new remote account' do + account = subject.call('foo@ap.example.com') + + expect(account.activitypub?).to eq true + expect(account.domain).to eq 'ap.example.com' + expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' + expect(account.uri).to eq 'https://ap.example.com/users/foo' + end + + it 'merges accounts' do + account = subject.call('foo@ap.example.com') + + expect(status.reload.account_id).to eq account.id + expect(Account.where(uri: account.uri).count).to eq 1 + end + end + + context 'with an already-known acct: URI changing ActivityPub id' do + let!(:old_account) { Fabricate(:account, username: 'foo', domain: 'ap.example.com', uri: 'https://old.example.com/users/foo', last_webfingered_at: nil) } + let!(:status) { Fabricate(:status, account: old_account, text: 'foo') } + + it 'returns new remote account' do + account = subject.call('foo@ap.example.com') + + expect(account.activitypub?).to eq true + expect(account.domain).to eq 'ap.example.com' + expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' + expect(account.uri).to eq 'https://ap.example.com/users/foo' + end + end + it 'processes one remote account at a time using locks' do wait_for_start = true fail_occurred = false From 59343ef4d19b104deb2751399846823675772df3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 19 Dec 2020 00:19:15 +0100 Subject: [PATCH 58/83] Fix missing description on enable bootstrap timeline accounts toggle in admin UI (#15367) --- app/views/admin/settings/edit.html.haml | 3 ++- config/locales/en.yml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index a162490b5..159bd4b0a 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -50,7 +50,8 @@ %hr.spacer/ .fields-group - = f.input :enable_bootstrap_timeline_accounts, as: :boolean, wrapper: :with_label, label: t('admin.settings.enable_bootstrap_timeline_accounts.title') + = f.input :enable_bootstrap_timeline_accounts, as: :boolean, wrapper: :with_label, label: t('admin.settings.enable_bootstrap_timeline_accounts.title'), hint: t('admin.settings.enable_bootstrap_timeline_accounts.desc_html') + .fields-group = f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html'), disabled: !Setting.enable_bootstrap_timeline_accounts diff --git a/config/locales/en.yml b/config/locales/en.yml index 7ea4ea154..8245397d7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -566,6 +566,7 @@ en: domain_blocks_rationale: title: Show rationale enable_bootstrap_timeline_accounts: + desc_html: Make new users automatically follow configured accounts so their home feed doesn't start out empty title: Enable default follows for new users hero: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to server thumbnail From 1c41ce32175931981dff9f9705a8a8ecfb465749 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 19 Dec 2020 00:21:01 +0100 Subject: [PATCH 59/83] New Crowdin updates (#15353) * New translations en.json (Danish) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations simple_form.en.yml (Danish) [ci skip] * New translations doorkeeper.en.yml (Danish) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.json (Greek) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations doorkeeper.en.yml (Greek) [ci skip] * New translations en.json (Basque) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations doorkeeper.en.yml (Basque) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations doorkeeper.en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations simple_form.en.yml (Arabic) [ci skip] * New translations doorkeeper.en.yml (Arabic) [ci skip] * New translations en.yml (Bulgarian) [ci skip] * New translations simple_form.en.yml (Bulgarian) [ci skip] * New translations doorkeeper.en.yml (Bulgarian) [ci skip] * New translations en.json (Catalan) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (Catalan) [ci skip] * New translations doorkeeper.en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations doorkeeper.en.yml (Breton) [ci skip] * New translations simple_form.en.yml (Breton) [ci skip] * New translations en.json (Kannada) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations en.json (Hindi) [ci skip] * New translations en.yml (Hindi) [ci skip] * New translations doorkeeper.en.yml (Hindi) [ci skip] * New translations en.json (Malay) [ci skip] * New translations en.yml (Malay) [ci skip] * New translations en.json (Telugu) [ci skip] * New translations en.yml (Telugu) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations doorkeeper.en.yml (Welsh) [ci skip] * New translations doorkeeper.en.yml (Esperanto) [ci skip] * New translations en.json (Uyghur) [ci skip] * New translations en.yml (Uyghur) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations simple_form.en.yml (Malayalam) [ci skip] * New translations doorkeeper.en.yml (Malayalam) [ci skip] * New translations en.yml (Kannada) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Taigi) [ci skip] * New translations simple_form.en.yml (Kabyle) [ci skip] * New translations doorkeeper.en.yml (Kabyle) [ci skip] * New translations en.json (Ido) [ci skip] * New translations en.yml (Ido) [ci skip] * New translations simple_form.en.yml (Ido) [ci skip] * New translations doorkeeper.en.yml (Ido) [ci skip] * New translations en.yml (Taigi) [ci skip] * New translations en.json (Silesian) [ci skip] * New translations en.yml (Silesian) [ci skip] * New translations en.yml (Kabyle) [ci skip] * New translations en.json (Asturian) [ci skip] * New translations en.json (Serbian (Latin)) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations simple_form.en.yml (Asturian) [ci skip] * New translations doorkeeper.en.yml (Asturian) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations doorkeeper.en.yml (Occitan) [ci skip] * New translations en.yml (Latvian) [ci skip] * New translations en.yml (Sanskrit) [ci skip] * New translations simple_form.en.yml (Serbian (Latin)) [ci skip] * New translations doorkeeper.en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations doorkeeper.en.yml (Corsican) [ci skip] * New translations en.json (Sanskrit) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Latvian) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Sorani (Kurdish)) [ci skip] * New translations en.yml (Sorani (Kurdish)) [ci skip] * New translations en.json (Sorani (Kurdish)) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations en.yml (Sardinian) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations doorkeeper.en.yml (Indonesian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations en.json (Sardinian) [ci skip] * New translations simple_form.en.yml (Sardinian) [ci skip] * New translations en.json (Tamil) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations doorkeeper.en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.yml (Tatar) [ci skip] * New translations en.json (Kabyle) [ci skip] * New translations en.json (Tatar) [ci skip] * New translations en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations doorkeeper.en.yml (Sardinian) [ci skip] * New translations doorkeeper.en.yml (Sorani (Kurdish)) [ci skip] * New translations doorkeeper.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations doorkeeper.en.yml (Persian) [ci skip] * New translations en.yml (Tamil) [ci skip] * New translations doorkeeper.en.yml (Estonian) [ci skip] * New translations doorkeeper.en.yml (Norwegian Nynorsk) [ci skip] * New translations en.yml (Croatian) [ci skip] * New translations simple_form.en.yml (Croatian) [ci skip] * New translations doorkeeper.en.yml (Croatian) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.yml (Norwegian Nynorsk) [ci skip] * New translations simple_form.en.yml (Norwegian Nynorsk) [ci skip] * New translations en.json (Kazakh) [ci skip] * New translations doorkeeper.en.yml (Thai) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations simple_form.en.yml (Kazakh) [ci skip] * New translations doorkeeper.en.yml (Kazakh) [ci skip] * New translations en.json (Estonian) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations simple_form.en.yml (Estonian) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations doorkeeper.en.yml (Marathi) [ci skip] * New translations simple_form.en.yml (Tamil) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Tamil) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Spanish, Argentina) [ci skip] * New translations doorkeeper.en.yml (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations en.json (Bengali) [ci skip] * New translations en.yml (Bengali) [ci skip] * New translations simple_form.en.yml (Bengali) [ci skip] * New translations en.json (Marathi) [ci skip] * New translations en.yml (Marathi) [ci skip] * New translations simple_form.en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.json (French) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Catalan) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.json (Polish) [ci skip] * New translations en.json (Albanian) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.json (Albanian) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.json (Icelandic) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.json (Icelandic) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.yml (Kabyle) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations simple_form.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Mexico) [ci skip] * New translations en.yml (Spanish, Mexico) [ci skip] * New translations doorkeeper.en.yml (Spanish, Mexico) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.json (Indonesian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.json (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Thai) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/ca.json | 12 ++++++------ app/javascript/mastodon/locales/co.json | 14 +++++++------- app/javascript/mastodon/locales/el.json | 12 ++++++------ app/javascript/mastodon/locales/es-AR.json | 12 ++++++------ app/javascript/mastodon/locales/es.json | 12 ++++++------ app/javascript/mastodon/locales/fa.json | 14 +++++++------- app/javascript/mastodon/locales/fr.json | 12 ++++++------ app/javascript/mastodon/locales/gl.json | 14 +++++++------- app/javascript/mastodon/locales/hu.json | 12 ++++++------ app/javascript/mastodon/locales/id.json | 12 ++++++------ app/javascript/mastodon/locales/is.json | 12 ++++++------ app/javascript/mastodon/locales/it.json | 12 ++++++------ app/javascript/mastodon/locales/ja.json | 12 ++++++------ app/javascript/mastodon/locales/ko.json | 12 ++++++------ app/javascript/mastodon/locales/pl.json | 12 ++++++------ app/javascript/mastodon/locales/pt-BR.json | 12 ++++++------ app/javascript/mastodon/locales/pt-PT.json | 12 ++++++------ app/javascript/mastodon/locales/ru.json | 12 ++++++------ app/javascript/mastodon/locales/sq.json | 12 ++++++------ app/javascript/mastodon/locales/th.json | 8 ++++---- app/javascript/mastodon/locales/vi.json | 12 ++++++------ app/javascript/mastodon/locales/zh-HK.json | 12 ++++++------ config/locales/bn.yml | 2 +- config/locales/ca.yml | 4 ++++ config/locales/co.yml | 11 ++++++++++- config/locales/doorkeeper.hy.yml | 6 +++--- config/locales/el.yml | 2 ++ config/locales/es-AR.yml | 4 ++++ config/locales/es.yml | 6 ++++++ config/locales/eu.yml | 2 +- config/locales/fr.yml | 4 ++++ config/locales/gl.yml | 10 ++++++---- config/locales/hu.yml | 18 +++++++++++------- config/locales/hy.yml | 2 +- config/locales/id.yml | 12 +++++++++++- config/locales/is.yml | 5 +++++ config/locales/it.yml | 4 ++++ config/locales/ja.yml | 2 +- config/locales/kab.yml | 3 +++ config/locales/nl.yml | 2 +- config/locales/no.yml | 2 +- config/locales/pl.yml | 4 ++++ config/locales/pt-BR.yml | 13 +++++++++++++ config/locales/pt-PT.yml | 14 ++++++++++++++ config/locales/sc.yml | 2 +- config/locales/simple_form.co.yml | 1 + config/locales/simple_form.id.yml | 1 + config/locales/simple_form.pt-BR.yml | 3 ++- config/locales/sq.yml | 5 +++++ config/locales/sv.yml | 6 +++++- config/locales/th.yml | 8 ++++++++ config/locales/uk.yml | 2 +- config/locales/vi.yml | 16 ++++++++++------ config/locales/zh-CN.yml | 2 +- config/locales/zh-HK.yml | 12 +++++++++++- config/locales/zh-TW.yml | 2 +- 56 files changed, 290 insertions(+), 168 deletions(-) diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 7066d9999..13e9e885b 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Resultats de la cerca", "emoji_button.symbols": "Símbols", "emoji_button.travel": "Viatges i Llocs", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Compte suspès", "empty_column.account_timeline": "No hi ha tuts aquí!", "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Encara no has bloquejat cap usuari.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Canvi de títol", "lists.new.create": "Afegir llista", "lists.new.title_placeholder": "Nova llista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Qualsevol usuari seguit", + "lists.replies_policy.list": "Membres de la llista", + "lists.replies_policy.none": "Ningú", "lists.replies_policy.title": "Mostra respostes a:", "lists.search": "Cercar entre les persones que segueixes", "lists.subheading": "Les teves llistes", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Mencions", "notifications.filter.polls": "Resultats de l'enquesta", "notifications.filter.statuses": "Actualitzacions de gent que segueixes", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Concedir permís.", "notifications.group": "{count} notificacions", "notifications.mark_as_read": "Marca cada notificació com a llegida", "notifications.permission_denied": "No s’ha pogut activar les notificacions d’escriptori perquè s’ha denegat el permís.", "notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.", "notifications_permission_banner.enable": "Activar les notificacions d’escriptori", "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no està obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.", "notifications_permission_banner.title": "Mai et perdis res", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 7058fa7b1..43e1f6c10 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Risultati di a cerca", "emoji_button.symbols": "Simbuli", "emoji_button.travel": "Lochi è Viaghju", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Contu suspesu", "empty_column.account_timeline": "Nisun statutu quì!", "empty_column.account_unavailable": "Prufile micca dispunibule", "empty_column.blocks": "Per avà ùn avete bluccatu manc'un utilizatore.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambià u titulu", "lists.new.create": "Aghjunghje", "lists.new.title_placeholder": "Titulu di a lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Tutti i vostri abbunamenti", + "lists.replies_policy.list": "Membri di a lista", + "lists.replies_policy.none": "Nimu", "lists.replies_policy.title": "Vede e risposte à:", "lists.search": "Circà indè i vostr'abbunamenti", "lists.subheading": "E vo liste", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Minzione", "notifications.filter.polls": "Risultati di u scandagliu", "notifications.filter.statuses": "Messe à ghjornu di e persone chì siguitate", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Auturizà.", "notifications.group": "{count} nutificazione", "notifications.mark_as_read": "Marcà tutte e nutificazione cum'è lette", - "notifications.permission_denied": "Ùn si po micca attivà e nutificazione desktop perchè a dumanda d'auturizazione hè stata ricusata", + "notifications.permission_denied": "Ùn si po micca attivà e nutificazione desktop perchè l'auturizazione hè stata ricusata", "notifications.permission_denied_alert": "Ùn pudete micca attivà e nutificazione nant'à l'urdinatore, perchè avete digià ricusatu a dumanda d'auturizazione di u navigatore", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Ùn si po micca attivà e nutificazione desktop perchè a l'auturizazione richiesta ùn hè micca stata data.", "notifications_permission_banner.enable": "Attivà e nutificazione nant'à l'urdinatore", "notifications_permission_banner.how_to_control": "Per riceve nutificazione quandu Mastodon ùn hè micca aperta, attivate e nutificazione nant'à l'urdinatore. Pudete decide quali tippi d'interazione anu da mandà ste nutificazione cù u buttone {icon} quì sopra quandu saranu attivate.", "notifications_permission_banner.title": "Ùn mancate mai nunda", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 4d1aa5782..7b7373165 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Αποτελέσματα αναζήτησης", "emoji_button.symbols": "Σύμβολα", "emoji_button.travel": "Ταξίδια & Τοποθεσίες", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Λογαριασμός σε αναστολή", "empty_column.account_timeline": "Δεν έχει τουτ εδώ!", "empty_column.account_unavailable": "Μη διαθέσιμο προφίλ", "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμα.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Αλλαγή τίτλου", "lists.new.create": "Προσθήκη λίστας", "lists.new.title_placeholder": "Τίτλος νέας λίστα", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Οποιοσδήποτε χρήστης που ακολουθείς", + "lists.replies_policy.list": "Μέλη της λίστας", + "lists.replies_policy.none": "Κανένας", "lists.replies_policy.title": "Εμφάνιση απαντήσεων σε:", "lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς", "lists.subheading": "Οι λίστες σου", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Αναφορές", "notifications.filter.polls": "Αποτελέσματα ψηφοφορίας", "notifications.filter.statuses": "Ενημερώσεις από όσους ακολουθείς", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Χορήγηση άδειας.", "notifications.group": "{count} ειδοποιήσεις", "notifications.mark_as_read": "Σημείωσε όλες τις ειδοποιήσεις ως αναγνωσμένες", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Οι ειδοποιήσεις δεν είναι διαθέσιμες επειδή δεν έχει δοθεί η απαιτούμενη άδεια.", "notifications_permission_banner.enable": "Ενεργοποίηση ειδοποιήσεων επιφάνειας εργασίας", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Μη χάσετε τίποτα", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 5ca1d6959..434382e20 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Cuenta suspendida", "empty_column.account_timeline": "¡No hay toots acá!", "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambiar título", "lists.new.create": "Agregar lista", "lists.new.title_placeholder": "Nuevo título de lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Cualquier cuenta seguida", + "lists.replies_policy.list": "Miembros de la lista", + "lists.replies_policy.none": "Nadie", "lists.replies_policy.title": "Mostrar respuestas a:", "lists.search": "Buscar entre la gente que seguís", "lists.subheading": "Tus listas", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Menciones", "notifications.filter.polls": "Resultados de encuesta", "notifications.filter.statuses": "Actualizaciones de cuentas que seguís", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Conceder permiso.", "notifications.group": "{count} notificaciones", "notifications.mark_as_read": "Marcar cada notificación como leída", "notifications.permission_denied": "Las notificaciones de escritorio no están disponibles, debido a una solicitud de permiso del navegador web previamente denegada", "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado antes", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Las notificaciones de escritorio no están disponibles porque no se concedió el permiso requerido.", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no está abierto, habilitá las notificaciones de escritorio. Podés controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba, una vez que estén habilitadas.", "notifications_permission_banner.title": "No te pierdas nada", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 461929472..dfad44c6d 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Cuenta suspendida", "empty_column.account_timeline": "¡No hay toots aquí!", "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambiar título", "lists.new.create": "Añadir lista", "lists.new.title_placeholder": "Título de la nueva lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Cualquier usuario seguido", + "lists.replies_policy.list": "Miembros de la lista", + "lists.replies_policy.none": "Nadie", "lists.replies_policy.title": "Mostrar respuestas a:", "lists.search": "Buscar entre la gente a la que sigues", "lists.subheading": "Tus listas", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Menciones", "notifications.filter.polls": "Resultados de la votación", "notifications.filter.statuses": "Actualizaciones de gente a la que sigues", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Conceder permiso.", "notifications.group": "{count} notificaciones", "notifications.mark_as_read": "Marcar todas las notificaciones como leídas", "notifications.permission_denied": "No se pueden habilitar las notificaciones de escritorio ya que se denegó el permiso.", "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado anteriormente", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Las notificaciones de escritorio no están disponibles porque no se ha concedido el permiso requerido.", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no esté abierto, habilite las notificaciones de escritorio. Puedes controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba una vez que estén habilitadas.", "notifications_permission_banner.title": "Nunca te pierdas nada", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 7bda6dcb2..b062ec18b 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -81,7 +81,7 @@ "column_header.show_settings": "نمایش تنظیمات", "column_header.unpin": "رهاکردن", "column_subheading.settings": "ساماندهی", - "community.column_settings.local_only": "تنها بومی", + "community.column_settings.local_only": "فقط محلّی", "community.column_settings.media_only": "فقط رسانه", "community.column_settings.remote_only": "تنها دوردست", "compose_form.direct_message_warning": "این بوق تنها به کاربرانی که از آن‌ها نام برده شده فرستاده خواهد شد.", @@ -149,7 +149,7 @@ "emoji_button.search_results": "نتایج جستجو", "emoji_button.symbols": "نمادها", "emoji_button.travel": "سفر و مکان", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "حساب معلق شد", "empty_column.account_timeline": "هیچ بوقی این‌جا نیست!", "empty_column.account_unavailable": "نمایهٔ موجود نیست", "empty_column.blocks": "هنوز کسی را مسدود نکرده‌اید.", @@ -266,9 +266,9 @@ "lists.edit.submit": "تغییر عنوان", "lists.new.create": "افزودن فهرست", "lists.new.title_placeholder": "عنوان فهرست تازه", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "هر کاربر پیگرفته", + "lists.replies_policy.list": "اعضای فهرست", + "lists.replies_policy.none": "هیچ کدام", "lists.replies_policy.title": "نمایش پاسخ‌ها به:", "lists.search": "بین کسانی که پی می‌گیرید بگردید", "lists.subheading": "فهرست‌های شما", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "نام‌بردن‌ها", "notifications.filter.polls": "نتایج نظرسنجی", "notifications.filter.statuses": "به‌روز رسانی‌ها از کسانی که پی‌گیرشانید", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "اعطای مجوز.", "notifications.group": "{count} اعلان", "notifications.mark_as_read": "نشانه‌گذاری همهٔ آگاهی‌ها به عنوان خوانده‌شده", "notifications.permission_denied": "آگاهی‌های میزکار به دلیل رد کردن درخواست اجازهٔ پیشین مرورگر، در دسترس نیستند", "notifications.permission_denied_alert": "از آن‌جا که پیش از این اجازهٔ مرورگر رد شده است، آگاهی‌های میزکار نمی‌توانند به کار بیفتند", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "اعلان‌های میزکار در دسترس نیستند زیرا نیازمند مجوزی هستند که اعطا نشده است.", "notifications_permission_banner.enable": "به کار انداختن آگاهی‌های میزکار", "notifications_permission_banner.how_to_control": "اگر می‌خواهید حتی زمانی که ماستودون باز نیست اعلان‌ها نمایش یابند، اعلان‌های میزکار را فعال کنید. به محض فعال شدن از طریق دکمه {icon} بالا می‌توانید به دقت کنترل کنید که چه نوع از تعامل‌ها باعث صادر شدن اعلان‌ها شوند.", "notifications_permission_banner.title": "هرگز چیزی را از دست ندهید", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 1376d150d..0ea82acbc 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Résultats de la recherche", "emoji_button.symbols": "Symboles", "emoji_button.travel": "Lieux & Voyages", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Compte suspendu", "empty_column.account_timeline": "Aucun pouet ici !", "empty_column.account_unavailable": "Profil non disponible", "empty_column.blocks": "Vous n’avez bloqué aucun·e utilisateur·rice pour le moment.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Modifier le titre", "lists.new.create": "Ajouter une liste", "lists.new.title_placeholder": "Titre de la nouvelle liste", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "N’importe quel·le utilisateur·rice suivi·e", + "lists.replies_policy.list": "Membres de la liste", + "lists.replies_policy.none": "Personne", "lists.replies_policy.title": "Afficher les réponses à :", "lists.search": "Rechercher parmi les gens que vous suivez", "lists.subheading": "Vos listes", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Résultats des sondages", "notifications.filter.statuses": "Mises à jour des personnes que vous suivez", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Accorder l’autorisation.", "notifications.group": "{count} notifications", "notifications.mark_as_read": "Marquer toutes les notifications comme lues", "notifications.permission_denied": "Impossible d’activer les notifications de bureau car l’autorisation a été refusée.", "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a été refusée avant", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Les notifications de bureau ne sont pas disponibles car l’autorisation requise n’a pas été accordée.", "notifications_permission_banner.enable": "Activer les notifications de bureau", "notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon n’est pas ouvert, activez les notifications du bureau. Vous pouvez contrôler précisément quels types d’interactions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois qu’elles sont activées.", "notifications_permission_banner.title": "Toujours au courant", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 771b6c990..854e31554 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Resultados da procura", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viaxes e Lugares", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Conta suspendida", "empty_column.account_timeline": "Non hai toots aquí!", "empty_column.account_unavailable": "Perfil non dispoñible", "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Mudar o título", "lists.new.create": "Engadir listaxe", "lists.new.title_placeholder": "Título da nova listaxe", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Toda usuaria seguida", + "lists.replies_policy.list": "Membros da lista", + "lists.replies_policy.none": "Ninguén", "lists.replies_policy.title": "Mostrar respostas a:", "lists.search": "Procurar entre as persoas que segues", "lists.subheading": "As túas listaxes", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Mencións", "notifications.filter.polls": "Resultados da enquisa", "notifications.filter.statuses": "Actualizacións de xente á que segues", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Conceder permiso.", "notifications.group": "{count} notificacións", "notifications.mark_as_read": "Marcar todas as notificacións como lidas", "notifications.permission_denied": "Non se activaron as notificacións de escritorio porque se denegou o permiso", "notifications.permission_denied_alert": "Non se poden activar as notificacións de escritorio, xa que o permiso para o navegador foi denegado previamente", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "As notificacións de escritorio non están dispoñibles porque non se concedeu o permiso necesario.", "notifications_permission_banner.enable": "Activar notificacións de escritorio", "notifications_permission_banner.how_to_control": "Activa as notificacións de escritorio para recibir notificacións mentras Mastodon non está aberto. Podes controlar de xeito preciso o tipo de interaccións que crean as notificacións de escritorio a través da {icon} superior unha vez están activadas.", "notifications_permission_banner.title": "Non perder nada", @@ -362,7 +362,7 @@ "privacy.unlisted.long": "Non publicar nas cronoloxías públicas", "privacy.unlisted.short": "Non listado", "refresh": "Actualizar", - "regeneration_indicator.label": "Cargando…", + "regeneration_indicator.label": "Estase a cargar…", "regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index aac91f9a0..a0ae7305c 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Keresési találatok", "emoji_button.symbols": "Szimbólumok", "emoji_button.travel": "Utazás és Helyek", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Fiók felfüggesztve", "empty_column.account_timeline": "Itt nincs tülkölés!", "empty_column.account_unavailable": "A profil nem érhető el", "empty_column.blocks": "Még senkit sem tiltottál le.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cím megváltoztatása", "lists.new.create": "Lista hozzáadása", "lists.new.title_placeholder": "Új lista címe", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Bármely követett felhasználó", + "lists.replies_policy.list": "A lista tagjai", + "lists.replies_policy.none": "Senki", "lists.replies_policy.title": "Nekik mutassuk a válaszokat:", "lists.search": "Keresés a követett személyek között", "lists.subheading": "Listáid", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Megemlítések", "notifications.filter.polls": "Szavazások eredményei", "notifications.filter.statuses": "Frissítések azoktól, akiket követsz", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Engedély megadása.", "notifications.group": "{count} értesítés", "notifications.mark_as_read": "Minden értesítés olvasottnak jelölése", "notifications.permission_denied": "Nem tudjuk engedélyezni az asztali értesítéseket, mert az engedélyt megtagadták.", "notifications.permission_denied_alert": "Az asztali értesítések nem engedélyezhetőek, mert az engedélyt megtagadták a böngészőben", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Az asztali értesítések nem elérhetőek, mert a szükséges engedélyt nem adtad meg.", "notifications_permission_banner.enable": "Asztali értesítések engedélyezése", "notifications_permission_banner.how_to_control": "Ahhoz, hogy értesítéseket kapj akkor, amikor a Mastodon nincs megnyitva, engedélyezd az asztali értesítéseket. Pontosan be tudod állítani, hogy milyen interakciókról értesülj a fenti {icon} gombon keresztül, ha egyszer már engedélyezted őket.", "notifications_permission_banner.title": "Soha ne mulassz el semmit", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index d0ae2befc..24f100b6a 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Hasil pencarian", "emoji_button.symbols": "Simbol", "emoji_button.travel": "Tempat Wisata", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Akun ditangguhkan", "empty_column.account_timeline": "Tidak ada toot di sini!", "empty_column.account_unavailable": "Profil tidak tersedia", "empty_column.blocks": "Anda belum memblokir siapapun.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Ubah judul", "lists.new.create": "Tambah daftar", "lists.new.title_placeholder": "Judul daftar baru", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Siapapun pengguna yang diikuti", + "lists.replies_policy.list": "Anggota di daftar tersebut", + "lists.replies_policy.none": "Tidak ada satu pun", "lists.replies_policy.title": "Tampilkan balasan ke:", "lists.search": "Cari di antara orang yang Anda ikuti", "lists.subheading": "Daftar Anda", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Sebutan", "notifications.filter.polls": "Hasil japat", "notifications.filter.statuses": "Pembaruan dari orang yang Anda ikuti", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Setujui izin.", "notifications.group": "{count} notifikasi", "notifications.mark_as_read": "Tandai setiap notifikasi sebagai sudah dibaca", "notifications.permission_denied": "Tidak dapat mengaktifkan notifikasi desktop karena izin ditolak.", "notifications.permission_denied_alert": "Notifikasi desktop tidak dapat diaktifkan karena izin peramban telah ditolak sebelumnya", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Notifikasi desktop tidak tersedia karena izin yang dibutuhkan belum disetujui.", "notifications_permission_banner.enable": "Aktifkan notifikasi desktop", "notifications_permission_banner.how_to_control": "Untuk menerima notifikasi saat Mastodon terbuka, aktifkan notifikasi desktop. Anda dapat mengendalikan tipe interaksi mana yang ditampilkan notifikasi desktop melalui tombol {icon} di atas saat sudah aktif.", "notifications_permission_banner.title": "Jangan lewatkan apapun", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 6910e9e5f..d90156835 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Leitarniðurstöður", "emoji_button.symbols": "Tákn", "emoji_button.travel": "Ferðalög og staðir", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Notandaaðgangur í bið", "empty_column.account_timeline": "Engin tíst hér!", "empty_column.account_unavailable": "Notandasnið ekki tiltækt", "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Breyta titli", "lists.new.create": "Bæta við lista", "lists.new.title_placeholder": "Titill á nýjum lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Allra notenda sem fylgst er með", + "lists.replies_policy.list": "Meðlima listans", + "lists.replies_policy.none": "Engra", "lists.replies_policy.title": "Sýna svör til:", "lists.search": "Leita meðal þeirra sem þú fylgist með", "lists.subheading": "Listarnir þínir", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Tilvísanir", "notifications.filter.polls": "Niðurstöður könnunar", "notifications.filter.statuses": "Uppfærslur frá fólki sem þú fylgist með", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Veita heimild.", "notifications.group": "{count} tilkynningar", "notifications.mark_as_read": "Merkja allar tilkynningar sem lesnar", "notifications.permission_denied": "Tilkynningar á skjáborði eru ekki aðgengilegar megna áður hafnaðra beiðna fyrir vafra", "notifications.permission_denied_alert": "Ekki var hægt að virkja tilkynningar á skjáborði, þar sem heimildum fyrir vafra var áður hafnað", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Tilkynningar á skjáborði eru ekki aðgengilegar þar sem nauðsynlegar heimildir hafa ekki verið veittar.", "notifications_permission_banner.enable": "Virkja tilkynningar á skjáborði", "notifications_permission_banner.how_to_control": "Til að taka á móti tilkynningum þegar Mastodon er ekki opið, skaltu virkja tilkynningar á skjáborði. Þegar þær eru orðnar virkar geturðu stýrt nákvæmlega hverskonar atvik framleiða tilkynningar með því að nota {icon}-hnappinn hér fyrir ofan.", "notifications_permission_banner.title": "Aldrei missa af neinu", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 746d33df0..b63b231ae 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Risultati della ricerca", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Viaggi & Luoghi", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Account sospeso", "empty_column.account_timeline": "Nessun toot qui!", "empty_column.account_unavailable": "Profilo non disponibile", "empty_column.blocks": "Non hai ancora bloccato alcun utente.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambia titolo", "lists.new.create": "Aggiungi lista", "lists.new.title_placeholder": "Titolo della nuova lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Qualsiasi utente seguito", + "lists.replies_policy.list": "Iscritti alla lista", + "lists.replies_policy.none": "Nessuno", "lists.replies_policy.title": "Mostra risposte a:", "lists.search": "Cerca tra le persone che segui", "lists.subheading": "Le tue liste", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Menzioni", "notifications.filter.polls": "Risultati del sondaggio", "notifications.filter.statuses": "Aggiornamenti dalle persone che segui", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Dai il permesso.", "notifications.group": "{count} notifiche", "notifications.mark_as_read": "Segna tutte le notifiche come lette", "notifications.permission_denied": "Impossibile abilitare le notifiche sul desktop perché il permesso è stato negato.", "notifications.permission_denied_alert": "Le notifiche sul desktop non possono essere abilitate, poiché il permesso nel browser è stato negato in precedenza", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Le notifiche desktop non sono disponibili perché l'autorizzazione richiesta non è stata concessa.", "notifications_permission_banner.enable": "Abilita le notifiche sul desktop", "notifications_permission_banner.how_to_control": "Per ricevere notifiche quando Mastodon non è aperto, abilita le notifiche desktop. Puoi controllare con precisione quali tipi di interazioni generano notifiche desktop tramite il pulsante {icon} qui sopra, dopo averle abilitate.", "notifications_permission_banner.title": "Non perderti mai nulla", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index ccf8970ea..012f88a68 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "検索結果", "emoji_button.symbols": "記号", "emoji_button.travel": "旅行と場所", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "アカウントは停止されています", "empty_column.account_timeline": "トゥートがありません!", "empty_column.account_unavailable": "プロフィールは利用できません", "empty_column.blocks": "まだ誰もブロックしていません。", @@ -266,9 +266,9 @@ "lists.edit.submit": "タイトルを変更", "lists.new.create": "リストを作成", "lists.new.title_placeholder": "新規リスト名", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "フォロー中のユーザー全員", + "lists.replies_policy.list": "リストのメンバー", + "lists.replies_policy.none": "表示しない", "lists.replies_policy.title": "リプライを表示:", "lists.search": "フォローしている人の中から検索", "lists.subheading": "あなたのリスト", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "返信", "notifications.filter.polls": "アンケート結果", "notifications.filter.statuses": "フォローしている人の新着情報", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "権限の付与", "notifications.group": "{count} 件の通知", "notifications.mark_as_read": "すべて既読にする", "notifications.permission_denied": "ブラウザの通知が拒否されているためデスクトップ通知は利用できません", "notifications.permission_denied_alert": "ブラウザの通知が拒否されているためデスクトップ通知を有効にできません", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "必要な権限が付与されていないため、デスクトップ通知は利用できません。", "notifications_permission_banner.enable": "デスクトップ通知を有効にする", "notifications_permission_banner.how_to_control": "Mastodon を閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。", "notifications_permission_banner.title": "お見逃しなく", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index c254ef6d8..10f7eabcf 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "검색 결과", "emoji_button.symbols": "기호", "emoji_button.travel": "여행과 장소", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "계정 정지됨", "empty_column.account_timeline": "여긴 툿이 없어요!", "empty_column.account_unavailable": "프로필 사용 불가", "empty_column.blocks": "아직 아무도 차단하지 않았습니다.", @@ -266,9 +266,9 @@ "lists.edit.submit": "제목 수정", "lists.new.create": "리스트 추가", "lists.new.title_placeholder": "새 리스트의 이름", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "팔로우 한 사용자 누구나", + "lists.replies_policy.list": "리스트의 구성원들", + "lists.replies_policy.none": "아무도 없음", "lists.replies_policy.title": "답글 표시:", "lists.search": "팔로우 중인 사람들 중에서 찾기", "lists.subheading": "당신의 리스트", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "멘션", "notifications.filter.polls": "투표 결과", "notifications.filter.statuses": "팔로우 하는 사람들의 최신 게시물", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "권한 부여.", "notifications.group": "{count} 개의 알림", "notifications.mark_as_read": "모든 알림을 읽은 상태로 표시", "notifications.permission_denied": "권한이 거부되었기 때문에 데스크탑 알림을 활성화할 수 없음", "notifications.permission_denied_alert": "이전에 브라우저 권한이 거부되었기 때문에, 데스크탑 알림이 활성화 될 수 없습니다.", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "필요한 권한이 승인되지 않아 데스크탑 알림을 사용할 수 없습니다.", "notifications_permission_banner.enable": "데스크탑 알림 활성화", "notifications_permission_banner.how_to_control": "마스토돈이 열려 있지 않을 때에도 알림을 받으려면, 데스크탑 알림을 활성화 하세요. 당신은 어떤 종류의 반응이 데스크탑 알림을 발생할 지를 {icon} 버튼을 통해 세세하게 설정할 수 있습니다.", "notifications_permission_banner.title": "아무것도 놓치지 마세요", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index badea8dcd..0af58e351 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Wyniki wyszukiwania", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Podróże i miejsca", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Konto zawieszone", "empty_column.account_timeline": "Brak wpisów tutaj!", "empty_column.account_unavailable": "Profil niedostępny", "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Zmień tytuł", "lists.new.create": "Utwórz listę", "lists.new.title_placeholder": "Wprowadź tytuł listy", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Dowolny obserwowany użytkownik", + "lists.replies_policy.list": "Członkowie listy", + "lists.replies_policy.none": "Nikt", "lists.replies_policy.title": "Pokazuj odpowiedzi dla:", "lists.search": "Szukaj wśród osób które śledzisz", "lists.subheading": "Twoje listy", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Wspomienia", "notifications.filter.polls": "Wyniki głosowania", "notifications.filter.statuses": "Aktualizacje od osób które obserwujesz", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Przyznaj uprawnienia.", "notifications.group": "{count, number} {count, plural, one {powiadomienie} few {powiadomienia} many {powiadomień} more {powiadomień}}", "notifications.mark_as_read": "Oznacz wszystkie powiadomienia jako przeczytane", "notifications.permission_denied": "Powiadomienia na pulpicie nie są dostępne, ponieważ wcześniej nie udzielono uprawnień w przeglądarce", "notifications.permission_denied_alert": "Powiadomienia na pulpicie nie mogą zostać włączone, ponieważ wcześniej odmówiono uprawnień", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Powiadomienia na pulpicie nie są dostępne, ponieważ nie przyznano wymaganego uprawnienia.", "notifications_permission_banner.enable": "Włącz powiadomienia na pulpicie", "notifications_permission_banner.how_to_control": "Aby otrzymywać powiadomienia, gdy Mastodon nie jest otwarty, włącz powiadomienia pulpitu. Możesz dokładnie kontrolować, októrych działaniach będziesz powiadomienia na pulpicie za pomocą przycisku {icon} powyżej, jeżeli tylko zostaną włączone.", "notifications_permission_banner.title": "Nie przegap niczego", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 4e45927a5..65d5815ed 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Resultados da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagem & Lugares", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Conta suspensa", "empty_column.account_timeline": "Nada aqui!", "empty_column.account_unavailable": "Perfil indisponível", "empty_column.blocks": "Nada aqui.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Renomear", "lists.new.create": "Criar lista", "lists.new.title_placeholder": "Nome da lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Qualquer usuário seguido", + "lists.replies_policy.list": "Membros da lista", + "lists.replies_policy.none": "Ninguém", "lists.replies_policy.title": "Mostrar respostas para:", "lists.search": "Procurar entre as pessoas que você segue", "lists.subheading": "Suas listas", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Menções", "notifications.filter.polls": "Resultados de enquete", "notifications.filter.statuses": "Atualizações de pessoas que você segue", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Conceder permissão.", "notifications.group": "{count} notificações", "notifications.mark_as_read": "Marcar todas as notificações como lidas", "notifications.permission_denied": "Não é possível habilitar as notificações da área de trabalho pois a permissão foi negada.", "notifications.permission_denied_alert": "As notificações da área de trabalho não podem ser habilitdas pois a permissão do navegador foi negada antes", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Notificações da área de trabalho não estão disponíveis porque a permissão necessária não foi concedida.", "notifications_permission_banner.enable": "Habilitar notificações da área de trabalho", "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, habilite as notificações da área de trabalho. Você pode controlar precisamente quais tipos de interações geram notificações da área de trabalho através do botão {icon} acima uma vez habilitadas.", "notifications_permission_banner.title": "Nunca perca nada", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 0ff168002..dd3b4eba2 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Resultados da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagens & Lugares", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Conta suspensa", "empty_column.account_timeline": "Sem toots por aqui!", "empty_column.account_unavailable": "Perfil indisponível", "empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Mudar o título", "lists.new.create": "Adicionar lista", "lists.new.title_placeholder": "Título da nova lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Qualquer utilizador seguido", + "lists.replies_policy.list": "Membros da lista", + "lists.replies_policy.none": "Ninguém", "lists.replies_policy.title": "Mostrar respostas para:", "lists.search": "Pesquisa entre as pessoas que segues", "lists.subheading": "As tuas listas", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Menções", "notifications.filter.polls": "Votações", "notifications.filter.statuses": "Atualizações de pessoas que você segue", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Conceder permissões.", "notifications.group": "{count} notificações", "notifications.mark_as_read": "Marcar todas as notificações como lidas", "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente", "notifications.permission_denied_alert": "Notificações no ambinente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão necessária não foi concedida.", "notifications_permission_banner.enable": "Ativar notificações no ambiente de trabalho", "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no ambiente de trabalho. Depois da sua ativação, pode controlar precisamente quais tipos de interações geram notificações, através do botão {icon} acima.", "notifications_permission_banner.title": "Nunca perca nada", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index bde219846..2853b3302 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Результаты поиска", "emoji_button.symbols": "Символы", "emoji_button.travel": "Путешествия и места", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Учетная запись заблокирована", "empty_column.account_timeline": "Здесь нет постов!", "empty_column.account_unavailable": "Профиль недоступен", "empty_column.blocks": "Вы ещё никого не заблокировали.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Изменить название", "lists.new.create": "Создать список", "lists.new.title_placeholder": "Название для нового списка", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Любой подписанный пользователь", + "lists.replies_policy.list": "Пользователи в списке", + "lists.replies_policy.none": "Никого", "lists.replies_policy.title": "Показать ответы только:", "lists.search": "Искать среди подписок", "lists.subheading": "Ваши списки", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Упоминания", "notifications.filter.polls": "Результаты опросов", "notifications.filter.statuses": "Обновления от людей, на которых вы подписаны", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Дать разрешение.", "notifications.group": "{count} уведомл.", "notifications.mark_as_read": "Отмечать все уведомления прочитанными", "notifications.permission_denied": "Уведомления на рабочем столе недоступны из-за ранее отклонённого запроса разрешений браузера", "notifications.permission_denied_alert": "Уведомления на рабочем столе не могут быть включены, так как раньше было отказано в разрешении браузера", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Десктоп нотификации недоступны, потому что требуемое разрешение не было предоставлено.", "notifications_permission_banner.enable": "Включить уведомления на рабочем столе", "notifications_permission_banner.how_to_control": "Чтобы получать уведомления, когда Мастодон не открыт, включите уведомления рабочего стола. Вы можете точно управлять, какие типы взаимодействия генерируют уведомления рабочего стола с помощью кнопки {icon} выше, когда они включены.", "notifications_permission_banner.title": "Ничего не пропустите", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index d73c7802b..b45f62cd5 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Përfundime kërkimi", "emoji_button.symbols": "Simbole", "emoji_button.travel": "Udhëtime & Vende", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Llogaria u pezullua", "empty_column.account_timeline": "S’ka mesazhe këtu!", "empty_column.account_unavailable": "Profil jashtë funksionimi", "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Ndryshoni titullin", "lists.new.create": "Shtoni listë", "lists.new.title_placeholder": "Titull liste të re", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Cilido përdorues i ndjekur", + "lists.replies_policy.list": "Anëtarë të listës", + "lists.replies_policy.none": "Askush", "lists.replies_policy.title": "Shfaq përgjigje për:", "lists.search": "Kërkoni mes personash që ndiqni", "lists.subheading": "Listat tuaja", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Përmendje", "notifications.filter.polls": "Përfundime pyetësori", "notifications.filter.statuses": "Përditësime prej personash që ndiqni", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Akordoji leje.", "notifications.group": "{count}s njoftime", "notifications.mark_as_read": "Vëri shenjë çdo njoftimi si të lexuar", "notifications.permission_denied": "S’mund të aktivizohen njoftime në desktop, ngaqë janë mohuar lejet për këtë.", "notifications.permission_denied_alert": "S’mund të aktivizohen njoftimet në desktop, ngaqë lejet e shfletuesit për këtë janë mohuar më herët", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "S’merren dot njoftime desktop, ngaqë s’është akorduar leja përkatëse.", "notifications_permission_banner.enable": "Aktivizo njoftime në desktop", "notifications_permission_banner.how_to_control": "Për të marrë njoftime, kur Mastodon-i s’është i hapur, aktivizoni njoftime në desktop. Përmes butoni {icon} më sipër, mund të kontrolloni me përpikëri cilat lloje ndërveprimesh prodhojnë njoftime në dekstop, pasi të jenë aktivizuar.", "notifications_permission_banner.title": "Mos t’ju shpëtojë gjë", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index d036a0896..30ec26809 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "ผลลัพธ์การค้นหา", "emoji_button.symbols": "สัญลักษณ์", "emoji_button.travel": "การเดินทางและสถานที่", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "ระงับบัญชีอยู่", "empty_column.account_timeline": "ไม่มีโพสต์ที่นี่!", "empty_column.account_unavailable": "ไม่มีโปรไฟล์", "empty_column.blocks": "คุณยังไม่ได้ปิดกั้นผู้ใช้ใด ๆ", @@ -266,9 +266,9 @@ "lists.edit.submit": "เปลี่ยนชื่อเรื่อง", "lists.new.create": "เพิ่มรายการ", "lists.new.title_placeholder": "ชื่อเรื่องรายการใหม่", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "ผู้ใช้ใด ๆ ที่ติดตาม", + "lists.replies_policy.list": "สมาชิกของรายการ", + "lists.replies_policy.none": "ไม่มีใคร", "lists.replies_policy.title": "แสดงการตอบกลับแก่:", "lists.search": "ค้นหาในหมู่ผู้คนที่คุณติดตาม", "lists.subheading": "รายการของคุณ", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 005ed9923..4814dda91 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Kết quả tìm kiếm", "emoji_button.symbols": "Biểu tượng", "emoji_button.travel": "Du lịch", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Tài khoản vô hiệu hóa", "empty_column.account_timeline": "Chưa có tút nào!", "empty_column.account_unavailable": "Tài khoản bị đình chỉ", "empty_column.blocks": "Bạn chưa chặn bất cứ ai.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Thay đổi tiêu đề", "lists.new.create": "Tạo danh sách mới", "lists.new.title_placeholder": "Tên danh sách mới", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Người theo dõi", + "lists.replies_policy.list": "Người trong danh sách", + "lists.replies_policy.none": "Không ai", "lists.replies_policy.title": "Cho phép bình luận với:", "lists.search": "Tìm kiếm những người mà bạn quan tâm", "lists.subheading": "Danh sách của bạn", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Lượt nhắc đến", "notifications.filter.polls": "Kết quả bình chọn", "notifications.filter.statuses": "Cập nhật từ những người bạn theo dõi", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Cho phép.", "notifications.group": "{count} thông báo", "notifications.mark_as_read": "Đánh dấu tất cả thông báo là đã đọc", "notifications.permission_denied": "Trình duyệt không cho phép hiển thị thông báo trên màn hình.", "notifications.permission_denied_alert": "Không thể bật thông báo trên màn hình bởi vì trình duyệt đã cấm trước đó", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Không hiện thông báo trên màn hình bởi vì chưa cho phép.", "notifications_permission_banner.enable": "Cho phép thông báo trên màn hình", "notifications_permission_banner.how_to_control": "Hãy bật thông báo trên màn hình để không bỏ lỡ những thông báo từ Mastodon. Một khi đã bật, bạn có thể lựa chọn từng loại thông báo khác nhau thông qua {icon} nút bên dưới.", "notifications_permission_banner.title": "Không bỏ lỡ điều thú vị nào", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 9aa3e37bb..1a62ccbb3 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊景物", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "帳號已停權", "empty_column.account_timeline": "這裡還沒有嘟文!", "empty_column.account_unavailable": "無法取得個人資料", "empty_column.blocks": "你還沒有封鎖任何使用者。", @@ -266,9 +266,9 @@ "lists.edit.submit": "變更標題", "lists.new.create": "新增列表", "lists.new.title_placeholder": "新列表標題", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "任何已關注的用戶", + "lists.replies_policy.list": "列表中的用戶", + "lists.replies_policy.none": "無人", "lists.replies_policy.title": "顯示回應文章︰", "lists.search": "從你關注的人搜索", "lists.subheading": "列表", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "提及", "notifications.filter.polls": "投票結果", "notifications.filter.statuses": "已關注的用戶的最新動態", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "授予權限", "notifications.group": "{count} 條通知", "notifications.mark_as_read": "標記所有通知為已讀", "notifications.permission_denied": "本站不能發送桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求", "notifications.permission_denied_alert": "無法啟用桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "由於瀏覽器未有授予桌面通知權限,本站暫未能發送桌面通知。", "notifications_permission_banner.enable": "啟用桌面通知", "notifications_permission_banner.how_to_control": "只要啟用桌面通知,便可在 Mastodon 網站沒有打開時收到通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確控制哪些類型的互動會產生桌面通知。", "notifications_permission_banner.title": "不放過任何事情", diff --git a/config/locales/bn.yml b/config/locales/bn.yml index 0cf936d68..a79f10131 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -23,7 +23,7 @@ bn: hosted_on: এই মাস্টাডনটি আছে %{domain} এ instance_actor_flash: 'এই অ্যাকাউন্টটি ভার্চুয়াল এক্টর যা নিজে কোনও সার্ভারের প্রতিনিধিত্ব করতে ব্যবহৃত হয় এবং কোনও পৃথক ব্যবহারকারী নয়। এটি ফেডারেশনের উদ্দেশ্যে ব্যবহৃত হয় এবং আপনি যদি পুরো ইনস্ট্যান্স ব্লক করতে না চান তবে অবরুদ্ধ করা উচিত নয়, সেক্ষেত্রে আপনার ডোমেন ব্লক ব্যবহার করা উচিত। -' + ' learn_more: বিস্তারিত জানুন privacy_policy: গোপনীয়তা নীতি see_whats_happening: কী কী হচ্ছে দেখুন diff --git a/config/locales/ca.yml b/config/locales/ca.yml index fa49081be..439249d1b 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -402,6 +402,8 @@ ca: silence: Silenci suspend: Suspensió title: Bloqueig de domini nou + obfuscate: Oculta el nom del domini + obfuscate_hint: Oculta parcialment el nom del domini si està activat mostrar la llista de dominis limitats private_comment: Comentari privat private_comment_hint: Comentari sobre aquesta limitació del domini per a ús intern dels moderadors. public_comment: Comentari públic @@ -921,6 +923,8 @@ ca: status: Estat de verificació view_proof: Veure la prova imports: + errors: + over_rows_processing_limit: conté més de %{count} files modes: merge: Fusionar merge_long: Mantenir els registres existents i afegir-ne de nous diff --git a/config/locales/co.yml b/config/locales/co.yml index edb8ced1d..29ba79688 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -60,6 +60,7 @@ co: one: Abbunatu·a other: Abbunati following: Abbunamenti + instance_actor_flash: Stu contu virtuale riprisenta u servore stessu, micca un'utilizatore individuale. Hè utilizatu per scopi di federazione è ùn duveria mai esse suspesu. joined: Quì dapoi %{date} last_active: ultima attività link_verified_on: A pruprietà d'issu ligame hè stata verificata u %{date} @@ -131,6 +132,7 @@ co: follows: Abbunamenti header: Ritrattu di cuprendula inbox_url: URL di l’inbox + invite_request_text: Ragione di l'arregistramentu invited_by: Invitatu da ip: IP joined: Ghjuntu @@ -296,6 +298,7 @@ co: unsuspend_account: "%{name} hà fattu che u contu di %{target} ùn hè più suspesu" update_announcement: "%{name} hà cambiatu u novu annunziu %{target}" update_custom_emoji: "%{name} hà messu à ghjornu l’emoji %{target}" + update_domain_block: "%{name} hà messu à ghjornu u blucchime di duminiu per %{target}" update_status: "%{name} hà cambiatu u statutu di %{target}" deleted_status: "(statutu sguassatu)" empty: Nunda trovu. @@ -438,6 +441,7 @@ co: instances: by_domain: Duminiu delivery_available: Rimessa dispunibule + empty: Mancun duminiu trovu. known_accounts: one: "%{count} contu cunnisciutu" other: "%{count} conti cunnisciuti" @@ -515,6 +519,8 @@ co: comment: none: Nisunu created_at: Palisatu + forwarded: Trasferitu + forwarded_to: Trasferistu à %{domain} mark_as_resolved: Indicà cum’è chjosu mark_as_unresolved: Indicà cum’è sempre apertu notes: @@ -582,8 +588,10 @@ co: desc_html: Auturizà tuttu u mondu à sguassà u so propiu contu title: Auturizà à sguassà i conti min_invite_role: - disabled: Nisunu + disabled: Nimu title: Auturizà l’invitazione da + require_invite_text: + title: Richiede chì i novi utilizatori empiinu una dumanda d'invitazione registrations_mode: modes: approved: Apprubazione necessaria per arregistrassi @@ -752,6 +760,7 @@ co: functional: U vostru contu hè uperaziunale. pending: A vostra dumanda hè in attesa di rivista da a squadra di muderazione. Quessa pò piglià un certu tempu. Avete da riceve un'e-mail s'ella hè appruvata. redirecting_to: U vostru contu hè inattivu perchè riindirizza versu %{acct}. + too_fast: Furmulariu mandatu troppu prestu, ripruvate. trouble_logging_in: Difficultà per cunnettavi? use_security_key: Utilizà a chjave di sicurità authorize_follow: diff --git a/config/locales/doorkeeper.hy.yml b/config/locales/doorkeeper.hy.yml index ba3f4e124..7b0e1f03c 100644 --- a/config/locales/doorkeeper.hy.yml +++ b/config/locales/doorkeeper.hy.yml @@ -8,7 +8,7 @@ hy: scopes: Դաշտեր website: 'Յաւելուածի վէբկայք -' + ' errors: models: doorkeeper/application: @@ -52,7 +52,7 @@ hy: actions: Գործողութիւններ application_id: 'Կլիենտի բանալի -' + ' callback_urls: URL֊ների ետկանչ scopes: Դաշտեր secret: Կլիենտի գաղտնիք @@ -147,7 +147,7 @@ hy: write:favourites: հաւանել գրառումները write:filters: 'ստեղծել ֆիլտրեր -' + ' write:follows: հետեւել write:lists: ստեղծել ցանկեր write:media: բեռնել մեդիա ֆայլեր diff --git a/config/locales/el.yml b/config/locales/el.yml index 7658efb18..837d6f416 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -910,6 +910,8 @@ el: status: Κατάσταση επαλήθευσης view_proof: Εμφάνιση απόδειξης imports: + errors: + over_rows_processing_limit: περιέχει περισσότερες από %{count} γραμμές modes: merge: Συγχώνευση merge_long: Διατήρηση των εγγράφων που υπάρχουν και προσθηκη των νέων diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index cb731ee4b..93f663641 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -402,6 +402,8 @@ es-AR: silence: Silenciar suspend: Suspender title: Nuevo bloqueo de dominio + obfuscate: Obfuscar nombre de dominio + obfuscate_hint: Obfusca parcialmente el nombre de dominio en la lista si el anuncio de la lista de limitaciones de dominio está habilitado private_comment: Comentario privado private_comment_hint: Comentario sobre la limitación de este dominio, para uso interno de los moderadores. public_comment: Comentario público @@ -921,6 +923,8 @@ es-AR: status: Estado de verificación view_proof: Ver prueba imports: + errors: + over_rows_processing_limit: contiene más de %{count} filas modes: merge: Combinar merge_long: Mantener registros existentes y agregar nuevos diff --git a/config/locales/es.yml b/config/locales/es.yml index e26cd79f2..8d458edc6 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -402,6 +402,8 @@ es: silence: Silenciar suspend: Suspender title: Nuevo bloque de dominio + obfuscate: Ocultar nombre de dominio + obfuscate_hint: Oculta parcialmente el nombre de dominio en la lista si mostrar la lista de limitaciones de dominio está habilitado private_comment: Comentario privado private_comment_hint: Comentario sobre esta limitación de dominio para el uso interno por parte de los moderadores. public_comment: Comentario público @@ -519,6 +521,8 @@ es: comment: none: Ninguno created_at: Denunciado + forwarded: Reenviado + forwarded_to: Reenviado a %{domain} mark_as_resolved: Marcar como resuelto mark_as_unresolved: Marcar como no resuelto notes: @@ -919,6 +923,8 @@ es: status: Estado de la verificación view_proof: Ver prueba imports: + errors: + over_rows_processing_limit: contiene más de %{count} filas modes: merge: Unir merge_long: Mantener registros existentes y añadir nuevos diff --git a/config/locales/eu.yml b/config/locales/eu.yml index cd82a5d9a..4cd4c00f8 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -23,7 +23,7 @@ eu: hosted_on: Mastodon %{domain} domeinuan ostatatua instance_actor_flash: 'Kontu hau zerbitzaria bera adierazten duen aktore birtual bat da, ez norbanako bat. Federaziorako erabiltzen da eta ez zenuke blokeatu behar instantzia osoa blokeatu nahi ez baduzu, kasu horretan domeinua blokeatzea egokia litzateke. -' + ' learn_more: Ikasi gehiago privacy_policy: Pribatutasun politika see_whats_happening: Ikusi zer gertatzen ari den diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 52195cbef..bed43fee1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -402,6 +402,8 @@ fr: silence: Masqué suspend: Suspendre title: Nouveau blocage de domaine + obfuscate: Obfusquer le nom de domaine + obfuscate_hint: Obfusquer partiellement le nom de domaine dans la liste si la liste des limitations de domaine est activée private_comment: Commentaire privé private_comment_hint: Commenter sur cette limitation de domaine pour informer les modérateurs internes. public_comment: Commentaire public @@ -921,6 +923,8 @@ fr: status: État de la vérification view_proof: Voir la preuve imports: + errors: + over_rows_processing_limit: contient plus de %{count} lignes modes: merge: Fusionner merge_long: Garder les enregistrements existants et ajouter les nouveaux diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 6d648082f..597a05d23 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -23,7 +23,7 @@ gl: hosted_on: Mastodon aloxado en %{domain} instance_actor_flash: 'Esta conta é un actor virtual utilizado para representar ao servidor e non a unha usuaria individual. Utilízase para propósitos de federación e non debería estar bloqueada a menos que queiras bloquear a toda a instancia, en tal caso deberías utilizar o bloqueo do dominio. -' + ' learn_more: Saber máis privacy_policy: Política de privacidade see_whats_happening: Ver o que está a acontecer @@ -60,6 +60,7 @@ gl: one: Seguidora other: Seguidoras following: Seguindo + instance_actor_flash: Esta conta é un actor virtual utilizado para representar ó servidor mesmo e non a unha usuaria individual. Utilízase por motivos de federación e non debería estar suspendida. joined: Uniuse en %{date} last_active: última actividade link_verified_on: A propiedade desta ligazón foi verificada en %{date} @@ -131,6 +132,7 @@ gl: follows: Seguindo header: Cabeceira inbox_url: URL da caixa de entrada + invite_request_text: Razóns para unirte invited_by: Convidada por ip: IP joined: Uniuse @@ -1347,8 +1349,8 @@ gl: webauthn: Chaves de seguridade user_mailer: backup_ready: - explanation: Solicitou un respaldo completo da súa conta de Mastodon. Xa está listo para descargar! - subject: O seu ficheiro xa está listo para descargar + explanation: Solicitaches os datos completos da túa conta de Mastodon. Xa está preparados para descargar! + subject: O teu ficheiro xa está preparado para descargar title: Leve o ficheiro sign_in_token: details: 'Detalles sobre o intento:' @@ -1379,7 +1381,7 @@ gl: suspend: Conta suspendida welcome: edit_profile_action: Configurar perfil - edit_profile_step: Podes personalizar o teu perfil subindo un avatar, cabeceira, cambiar o nome público e aínda máis. Se restrinxes a tua conta podes revisar a conta das persoas que solicitan seguirte antes de permitirlles o acceso aos teus toots. + edit_profile_step: Podes personalizar o teu perfil subindo un avatar, cabeceira, cambiar o nome público e aínda máis. Se restrinxes a túa conta podes revisar a conta das persoas que solicitan seguirte antes de permitirlles o acceso aos teus toots. explanation: Aquí ten alunhas endereitas para ir aprendendo final_action: Comece a publicar final_step: 'Publica! Incluso sen seguidoras as túas mensaxes serán vistas por outras, por exemplo na liña temporal local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.' diff --git a/config/locales/hu.yml b/config/locales/hu.yml index ef6ec3089..01fecb99c 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -23,7 +23,7 @@ hu: hosted_on: "%{domain} Mastodon szerver" instance_actor_flash: 'Ez a fiók egy virtuális szereplő, mely magát a szervert reprezentálja, nem egy felhasználót. Ez a föderáció támogatására készült, ezért nem szabad blokkolni, hacsak egy teljes szervert nem akarsz kitiltani, amire persze a domain blokkolása jobb megoldás. -' + ' learn_more: Tudj meg többet privacy_policy: Adatvédelmi szabályzat see_whats_happening: Nézd, mi történik @@ -60,7 +60,7 @@ hu: one: Követő other: Követő following: Követett - instance_actor_flash: Ez a fiók virtuális és magát a szervert reprezentálja, nem egy konkrét felhasználót. Föderációs okok miatt létezik és nem szabad felfüggeszteni. + instance_actor_flash: Ez a fiók virtuális és magát a kiszolgálót reprezentálja, nem egy konkrét felhasználót. Föderációs célokból használt, és nem szabad felfüggeszteni. joined: Csatlakozott %{date} last_active: utoljára aktív link_verified_on: A link tulajdonosát %{date} -n ellenőriztük @@ -142,7 +142,7 @@ hu: remote: Távoli title: Hely login_status: Bejelentkezési állapot - media_attachments: Média-csatolmányok + media_attachments: Médiamellékletek memorialize: Emlékállítás memorialized: Emlékezetünkben memorialized_msg: A %{username} fiókot sikeresen emlékké nyilvánítottuk @@ -402,6 +402,8 @@ hu: silence: Némítás suspend: Felfüggesztés title: Új domain tiltása + obfuscate: Domain név álcázása + obfuscate_hint: Részlegesen álcázza a domain nevet a listában, ha a domain korlátozások listájának közzététele engedélyezett private_comment: Privát megjegyzés private_comment_hint: Megjegyzés domain tiltásával kapcsolatban belső használatra, a többi moderátor részére. public_comment: Nyilvános megjegyzés @@ -520,7 +522,7 @@ hu: none: Egyik sem created_at: Jelentve forwarded: Továbbítva - forwarded_to: Továbbítva neki %{domain} + forwarded_to: 'Továbbítva ide: %{domain}' mark_as_resolved: Megjelölés megoldottként mark_as_unresolved: Megjelölés megoldatlanként notes: @@ -896,8 +898,8 @@ hu: order_by: Rendezés save_changes: Változások mentése validation_errors: - one: Valami nincs rendjén! Kérlek tekintsd meg a hibát alant - other: Valami nincs rendjén! Kérlek tekintsd meg a %{count} darab hibát alant + one: Valami nincs rendjén! Tekintsd meg a hibát lent + other: Valami nincs rendjén! Tekintsd meg a(z) %{count} hibát lent html_validator: invalid_markup: 'hibás HTML leíró: %{error}' identity_proofs: @@ -921,6 +923,8 @@ hu: status: Ellenőrzés állapota view_proof: Tanúsítás megtekintése imports: + errors: + over_rows_processing_limit: több mint %{count} sort tartalmaz modes: merge: Összefésülés merge_long: Megtartjuk a meglévő bejegyzéseket és hozzávesszük az újakat @@ -1222,7 +1226,7 @@ hu: one: "%{count} szavazat" other: "%{count} szavazat" vote: Szavazás - show_more: Mutass többet + show_more: Több megjelenítése show_newer: Újabbak mutatása show_older: Régebbiek mutatása show_thread: Szál mutatása diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 1afd4d927..049044627 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -23,7 +23,7 @@ hy: hosted_on: Մաստոդոնը տեղակայուած է %{domain}ում instance_actor_flash: 'Այս հաշիւ վիրտուալ դերասան է, օգտագործուում է սպասարկիչը, այլ ոչ անհատ օգտատիրոջը ներկայացնելու, համար։ Օգտագործուում է ֆեդերացիայի նպատակով, ու չպէտք է արգելափակուի, եթէ չէք ցանկանում արգելափակել ողջ հանգոյցը, որի դէպքում պէտք է օգտագործէք տիրոյթի արգելափակումը։ -' + ' learn_more: Իմանալ ավելին privacy_policy: Գաղտնիության քաղաքականություն see_whats_happening: Տես ինչ ա կատարվում diff --git a/config/locales/id.yml b/config/locales/id.yml index fdd87027e..498c285d7 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -23,7 +23,7 @@ id: hosted_on: Mastodon dihosting di %{domain} instance_actor_flash: 'Akun ini adalah aktor virtual yang dipakai untuk merepresentasikan server, bukan pengguna individu. Ini dipakai untuk tujuan federasi dan jangan diblokir kecuali Anda ingin memblokir seluruh instansi, yang seharusnya Anda pakai blokir domain. -' + ' learn_more: Pelajari selengkapnya privacy_policy: Kebijakan Privasi see_whats_happening: Lihat apa yang sedang terjadi @@ -57,6 +57,7 @@ id: followers: other: Pengikut following: Mengikuti + instance_actor_flash: Akun ini adalah aktor virtual yang merepresentasikan server itu sendiri dan bukan pengguna individu. Ini dipakai untuk tujuan gabungan dan seharusnya tidak ditangguhkan. joined: Bergabung pada %{date} last_active: terakhir aktif link_verified_on: Kepemilikan tautan ini telah dicek pada %{date} @@ -127,6 +128,7 @@ id: follows: Mengikut header: Tajuk inbox_url: URL Kotak masuk + invite_request_text: Alasan bergabung invited_by: Diundang oleh ip: IP joined: Bergabung @@ -509,6 +511,8 @@ id: comment: none: Tidak ada created_at: Dilaporkan + forwarded: Diteruskan + forwarded_to: Diteruskan ke %{domain} mark_as_resolved: Tandai telah diseleseikan mark_as_unresolved: Tandai belum terselesaikan notes: @@ -578,6 +582,9 @@ id: min_invite_role: disabled: Tidak ada satu pun title: Izinkan undangan oleh + require_invite_text: + desc_html: Saat pendaftaran harus disetujui manual, buat input teks "Mengapa Anda ingin bergabung?" sebagai hal wajib bukan opsional + title: Pengguna baru harus memasukkan alasan bergabung registrations_mode: modes: approved: Persetujuan diperlukan untuk mendaftar @@ -746,6 +753,7 @@ id: functional: Akun Anda kini beroperasi penuh. pending: Permintaan Anda sedang ditinjau oleh staf kami. Ini mungkin butuh beberapa waktu. Anda akan menerima email jika permintaan Anda diterima. redirecting_to: Akun Anda tidak aktif karena sekarang dialihkan ke %{acct}. + too_fast: Formulir dikirim terlalu cepat, coba lagi. trouble_logging_in: Kesulitan masuk? use_security_key: Gunakan kunci keamanan authorize_follow: @@ -904,6 +912,8 @@ id: status: Status verifikasi view_proof: Lihat bukti imports: + errors: + over_rows_processing_limit: berisi lebih dari %{count} baris modes: merge: Gabung merge_long: Pertahankan rekaman yang sudah ada dan buat baru diff --git a/config/locales/is.yml b/config/locales/is.yml index 75b80a45d..97ac62a4d 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -60,6 +60,7 @@ is: one: fylgjandi other: fylgjendur following: Fylgist með + instance_actor_flash: Þessi notandaaðgangur er sýndarnotandi sem stendur fyrir sjálfan netþjóninn en ekki neinn einstakling. Hann er notaður við skýjasambandsmiðlun og ætti ekki að setja hann í bið eða banna. joined: Gerðist þátttakandi %{date} last_active: síðasta virkni link_verified_on: Eignarhald á þessum tengli var athugað þann %{date} @@ -401,6 +402,8 @@ is: silence: Hylja suspend: Setja í bið title: Ný útilokun á léni + obfuscate: Gera heiti léns ólæsilegt + obfuscate_hint: Gera heiti léns ólæsilegt að hluta í listanum ef auglýsing er virk fyrir lista yfir takmarkanir léna private_comment: Einkaathugasemd private_comment_hint: Athugasemd um þessa útilokun á léni til innanhússnotkunar fyrir umsjónarmenn. public_comment: Opinber athugasemd @@ -920,6 +923,8 @@ is: status: Staða sannvottunar view_proof: Skoða sönnun imports: + errors: + over_rows_processing_limit: inniheldur meira en %{count} raðir modes: merge: Sameina merge_long: Halda fyrirliggjandi færslum og bæta við nýjum diff --git a/config/locales/it.yml b/config/locales/it.yml index 5ca2fae92..65e24a4c7 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -402,6 +402,8 @@ it: silence: Silenzia suspend: Sospendi title: Nuovo blocco dominio + obfuscate: Nascondi nome di dominio + obfuscate_hint: Nascondere parzialmente il nome di dominio, se è abilitata la visualizzazione pubblica dell'elenco delle limitazioni di dominio private_comment: Commento privato private_comment_hint: Commento su questa limitazione di dominio per uso interno da parte dei moderatori. public_comment: Commento pubblico @@ -923,6 +925,8 @@ it: status: Stato della verifica view_proof: Vedi prova imports: + errors: + over_rows_processing_limit: contiene più di %{count} righe modes: merge: Fondi merge_long: Mantieni record esistenti e aggiungine di nuovi diff --git a/config/locales/ja.yml b/config/locales/ja.yml index db9e41f74..3a929c6ca 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -23,7 +23,7 @@ ja: hosted_on: Mastodon hosted on %{domain} instance_actor_flash: 'このアカウントはサーバーそのものを示す仮想的なもので、特定のユーザーを示すものではありません。これはサーバーの連合のために使用されます。サーバー全体をブロックするときは、このアカウントをブロックせずに、ドメインブロックを使用してください。 -' + ' learn_more: もっと詳しく privacy_policy: プライバシーポリシー see_whats_happening: やりとりを見てみる diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 403f2b2e7..af83d5fc6 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -72,6 +72,8 @@ kab: unavailable: Ur nufi ara amaɣnu-a unfollow: Ur ṭṭafaṛ ara admin: + account_actions: + action: Eg tigawt account_moderation_notes: create: Eǧǧ tazmilt delete: Kkes @@ -108,6 +110,7 @@ kab: follows: Yeṭafaṛ header: Ixef inbox_url: URL n yinekcam + invite_request_text: Timental n tmerna invited_by: Inced-it-id ip: Tansa IP joined: Ikcemed deg diff --git a/config/locales/nl.yml b/config/locales/nl.yml index d9c4e20fa..e1f10c813 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -23,7 +23,7 @@ nl: hosted_on: Mastodon op %{domain} instance_actor_flash: 'Dit account is een virtuel actor dat wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wilt blokkeren. In zo''n geval dien je echter een domeinblokkade te gebruiken. -' + ' learn_more: Meer leren privacy_policy: Privacybeleid see_whats_happening: Kijk wat er aan de hand is diff --git a/config/locales/no.yml b/config/locales/no.yml index b70eb167c..3d51fc6cd 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -23,7 +23,7 @@ hosted_on: Mastodon driftet på %{domain} instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet. -' + ' learn_more: Lær mer privacy_policy: Privatlivsretningslinjer see_whats_happening: Se hva som skjer diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 327ad81c1..6b0f5ae58 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -410,6 +410,8 @@ pl: silence: Wycisz suspend: Zawieś title: Nowa blokada domen + obfuscate: Ukryj nazwę domeny + obfuscate_hint: Częściowo ukryj nazwę domeny na liście, gdy reklamowanie listy limitów domen jest włączone private_comment: Prywatny komentarz private_comment_hint: Komentarz na temat ograniczeń dla tej domeny do wewnętrznej informacji dla moderatorów. public_comment: Publiczny komentarz @@ -939,6 +941,8 @@ pl: status: Stan weryfikacji view_proof: Wyświetl dowód imports: + errors: + over_rows_processing_limit: zawiera więcej niż %{count} wierszy modes: merge: Połącz merge_long: Zachowaj obecne wpisy i dodaj nowe diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 28c7a3204..529548225 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -60,6 +60,7 @@ pt-BR: one: Seguidor other: Seguidores following: Seguindo + instance_actor_flash: Esta conta é um ator virtual usado para representar o próprio servidor e não um usuário individual. É utilizada para fins de federação e não deve ser suspensa. joined: Entrou em %{date} last_active: última atividade link_verified_on: O link foi verificado em %{date} @@ -131,6 +132,7 @@ pt-BR: follows: Seguindo header: Capa inbox_url: URL da caixa de entrada + invite_request_text: Motivos para entrar invited_by: Convidado por ip: IP joined: Entrou @@ -255,6 +257,7 @@ pt-BR: unsuspend_account: Remover suspensão de conta update_announcement: Editar anúncio update_custom_emoji: Editar Emoji Personalizado + update_domain_block: Atualizar bloqueio de domínio update_status: Editar Status actions: assigned_to_self_report: "%{name} pegou a denúncia %{target}" @@ -295,6 +298,7 @@ pt-BR: unsuspend_account: "%{name} removeu a suspensão da conta de %{target}" update_announcement: "%{name} atualizou o anúncio %{target}" update_custom_emoji: "%{name} atualizou o emoji %{target}" + update_domain_block: "%{name} atualizou o bloqueio de domínio para %{target}" update_status: "%{name} atualizou o status de %{target}" deleted_status: "(status excluído)" empty: Nenhum registro encontrado. @@ -437,6 +441,7 @@ pt-BR: instances: by_domain: Domínio delivery_available: Envio disponível + empty: Nenhum domínio encontrado. known_accounts: one: "%{count} conta conhecida" other: "%{count} contas conhecidas" @@ -514,6 +519,8 @@ pt-BR: comment: none: Nenhum created_at: Denunciado + forwarded: Encaminhados + forwarded_to: Encaminhado para %{domain} mark_as_resolved: Marcar como resolvido mark_as_unresolved: Marcar como não resolvido notes: @@ -583,6 +590,9 @@ pt-BR: min_invite_role: disabled: Ninguém title: Permitir convites de + require_invite_text: + desc_html: Quando o cadastro de novas contas exigir aprovação manual, tornar obrigatório, ao invés de opcional, o texto de solicitação de convite em "Por que você deseja criar uma conta aqui?" + title: Exigir que novos usuários preencham um texto de solicitação de convite registrations_mode: modes: approved: Aprovação necessária para criar conta @@ -751,6 +761,7 @@ pt-BR: functional: Sua conta está totalmente operacional. pending: Sua solicitação está com revisão pendente por parte de nossa equipe. Você receberá um e-mail se ela for aprovada. redirecting_to: Sua conta está inativa porque atualmente está redirecionando para %{acct}. + too_fast: O formulário foi enviado muito rapidamente, tente novamente. trouble_logging_in: Problemas para entrar? use_security_key: Usar chave de segurança authorize_follow: @@ -842,6 +853,7 @@ pt-BR: request: Solicitar o seu arquivo size: Tamanho blocks: Você bloqueou + bookmarks: Marcadores csv: CSV domain_blocks: Bloqueios de domínio lists: Listas @@ -918,6 +930,7 @@ pt-BR: success: Os seus dados foram enviados com sucesso e serão processados em instantes types: blocking: Lista de bloqueio + bookmarks: Marcadores domain_blocking: Lista de domínios bloqueados following: Pessoas que você segue muting: Lista de silenciados diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index ca8d75a16..19584201f 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -60,6 +60,7 @@ pt-PT: one: Seguidor other: Seguidores following: A seguir + instance_actor_flash: Esta conta é um actor virtual usado para representar a própria instância e não um utilizador individual. É usada para motivos de federação e não deve ser suspenso. joined: Aderiu %{date} last_active: última vez activo link_verified_on: A posse deste link foi verificada em %{date} @@ -131,6 +132,7 @@ pt-PT: follows: A seguir header: Cabeçalho inbox_url: URL da caixa de entrada + invite_request_text: Razões para se juntar a nós invited_by: Convidado(a) por ip: IP joined: Aderiu @@ -255,6 +257,7 @@ pt-PT: unsuspend_account: Retirar Suspensão à Conta update_announcement: Atualizar Anúncio update_custom_emoji: Atualizar Emoji Personalizado + update_domain_block: Atualizar Bloqueio de Domínio update_status: Atualizar Estado actions: assigned_to_self_report: "%{name} atribuiu o relatório %{target} a si próprios" @@ -295,6 +298,7 @@ pt-PT: unsuspend_account: "%{name} desativou a suspensão de %{target}" update_announcement: "%{name} atualizou o anúncio %{target}" update_custom_emoji: "%{name} atualizou o emoji %{target}" + update_domain_block: "%{name} atualizou o bloqueio de domínio para %{target}" update_status: "%{name} atualizou o estado de %{target}" deleted_status: "(apagou a publicação)" empty: Não foram encontrados registos. @@ -398,6 +402,8 @@ pt-PT: silence: Silenciar suspend: Suspender title: Novo bloqueio de domínio + obfuscate: Ofuscar nome de domínio + obfuscate_hint: Ofuscar parcialmente o nome de domínio na lista, se estiverem habilitadas as limitações na publicação da lista de domínios private_comment: Comentário privado private_comment_hint: Comentário sobre essa limitação de domínio para uso interno pelos moderadores. public_comment: Comentário público @@ -437,6 +443,7 @@ pt-PT: instances: by_domain: Domínio delivery_available: Entrega disponível + empty: Não foram encontrados domínios. known_accounts: one: "%{count} conta conhecida" other: "%{count} contas conhecidas" @@ -514,6 +521,8 @@ pt-PT: comment: none: Nenhum created_at: Relatado + forwarded: Encaminhado + forwarded_to: Encaminhado para %{domain} mark_as_resolved: Marcar como resolvido mark_as_unresolved: Marcar como não resolvido notes: @@ -583,6 +592,9 @@ pt-PT: min_invite_role: disabled: Ninguém title: Permitir convites de + require_invite_text: + desc_html: Quando os registos exigirem aprovação manual, faça o texto "Porque se quer juntar a nós?" da solicitação de convite obrigatório, em vez de opcional + title: Exigir que novos utilizadores preencham um texto de solicitação de convite registrations_mode: modes: approved: Registo sujeito a aprovação @@ -911,6 +923,8 @@ pt-PT: status: Estado da verificação view_proof: Ver prova imports: + errors: + over_rows_processing_limit: contém mais de %{count} linhas modes: merge: Juntar merge_long: Manter os registos existentes e adicionar novos registos diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 626c7671c..492474d7a 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -23,7 +23,7 @@ sc: hosted_on: Mastodon acasagiadu in %{domain} instance_actor_flash: 'Custu contu est un''atore virtuale impreadu pro rapresentare su serbidore matessi, no est un''utente individuale. Benit impreadu pro punnas de federatzione e non lu dias dèpere blocare si non cheres blocare su domìniu intreu, e in cussu casu dias dèpere impreare unu blocu de domìniu. -' + ' learn_more: Àteras informatziones privacy_policy: Polìtica de riservadesa see_whats_happening: Càstia su chi est acontessende diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 508ecbc5f..1d41066d1 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -126,6 +126,7 @@ co: expires_in: Spira dopu à fields: Metadata di u prufile header: Ritrattu di cuprendula + honeypot: "%{label} (ùn empie micca)" inbox_url: URL di l'inbox di u ripetitore irreversible: Sguassà invece di piattà locale: Lingua di l'interfaccia diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index c94a5377a..4b469cd93 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -126,6 +126,7 @@ id: expires_in: Kedaluwarsa setelah fields: Metadata profil header: Tajuk + honeypot: "%{label} (jangan diisi)" inbox_url: URL kotak relai irreversible: Hapus alih-alih sembunyikan locale: Bahasa diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index ea53a3c83..574a3e3dc 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -67,7 +67,7 @@ pt-BR: text: Isso vai nos ajudar a revisar sua aplicação ip_block: comment: Opcional. Lembrar de por que você adicionou esta regra. - expires_in: Endereços IP são um recurso limitado, algumas vezes são compartilhados e muitas vezes mudam de mãos. Por essa razão, blocos de IP indefinidos não são recomendados. + expires_in: Endereços IP são um recurso limitado, algumas vezes são compartilhados e muitas vezes mudam de mãos. Por esse motivo, blocos de IP indefinidos não são recomendados. ip: Digite um endereço IPv4 ou IPv6. Você pode bloquear intervalos inteiros usando a sintaxe CIDR. Tenha cuidado para não bloquear a si mesmo! severities: no_access: Bloquear o acesso a todos os recursos @@ -126,6 +126,7 @@ pt-BR: expires_in: Expira em fields: Metadados do perfil header: Cabeçalho + honeypot: "%{label} (não preencher)" inbox_url: Link da caixa de entrada do repetidor irreversible: Ignorar ao invés de ocultar locale: Idioma da interface diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 127495a82..a46c3a586 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -60,6 +60,7 @@ sq: one: Ndjekës other: Ndjekës following: Ndjekje + instance_actor_flash: Kjo llogari është një aktor virtual, i përdorur për të përfaqësuar vetë shërbyesin dhe jo ndonjë përdorues individual. Përdoret për qëllime federimi dhe s’duhet pezulluar. joined: U bë pjesë më %{date} last_active: aktiv së fundi link_verified_on: Pronësia e kësaj lidhjeje qe kontrolluar më %{date} @@ -401,6 +402,8 @@ sq: silence: Heshtoji suspend: Pezulloje title: Bllokim i ri përkatësie + obfuscate: Errësoje emrin e përkatësisë + obfuscate_hint: Errësoje pjesërisht emrin e përkatësisë te lista, nëse është aktivizuar publikimi i listës së kufizimeve të përkatësive private_comment: Koment privat private_comment_hint: Koment mbi këtë kufizim përkatësie për përdorim të brendshëm nga moderatorët. public_comment: Koment publik @@ -920,6 +923,8 @@ sq: status: Gjendje verifikimi view_proof: Shihni provën imports: + errors: + over_rows_processing_limit: përmban më shumë se %{count} rreshta modes: merge: Përzieji merge_long: Mbaji zërat ekzistues dhe shto të rinjtë diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 264170b4e..3fff6517c 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -23,7 +23,7 @@ sv: hosted_on: Mastodon-värd på %{domain} instance_actor_flash: 'Detta konto är en virtuell agent som används för att representera servern själv och inte någon individuell användare. Det används av sammanslutningsskäl och ska inte blockeras såvitt du inte vill blockera hela instansen, och för detta fall ska domänblockering användas. -' + ' learn_more: Lär dig mer privacy_policy: Integritetspolicy see_whats_happening: Se vad som händer @@ -346,6 +346,8 @@ sv: silence: Tysta ner suspend: Suspendera title: Nytt domänblock + obfuscate: Dölj domännamn + obfuscate_hint: Dölj domännamnet i listan till viss del, om underrättelser för listan över domänbegränsningar aktiverats private_comment: Privat kommentar private_comment_hint: Kommentar för moderatorer om denna domänbegränsning. public_comment: Offentlig kommentar @@ -684,6 +686,8 @@ sv: active: Aktiv inactive: Inaktiv imports: + errors: + over_rows_processing_limit: innehåller fler än %{count} rader preface: Du kan importera data som du exporterat från en annan instans, till exempel en lista över personer du följer eller blockerar. success: Dina uppgifter har laddats upp och kommer nu att behandlas snarast types: diff --git a/config/locales/th.yml b/config/locales/th.yml index 8d50e805a..63ce98d4b 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -116,6 +116,7 @@ th: follows: การติดตาม header: ส่วนหัว inbox_url: URL กล่องขาเข้า + invite_request_text: เหตุผลสำหรับการเข้าร่วม invited_by: เชิญโดย ip: IP joined: เข้าร่วมเมื่อ @@ -228,6 +229,7 @@ th: unsuspend_account: เลิกระงับบัญชี update_announcement: อัปเดตประกาศ update_custom_emoji: อัปเดตอีโมจิที่กำหนดเอง + update_domain_block: อัปเดตการปิดกั้นโดเมน update_status: อัปเดตสถานะ actions: assigned_to_self_report: "%{name} ได้มอบหมายรายงาน %{target} ให้กับตนเอง" @@ -268,6 +270,7 @@ th: unsuspend_account: "%{name} ได้เลิกระงับบัญชีของ %{target}" update_announcement: "%{name} ได้อัปเดตประกาศ %{target}" update_custom_emoji: "%{name} ได้อัปเดตอีโมจิ %{target}" + update_domain_block: "%{name} ได้อัปเดตการปิดกั้นโดเมนสำหรับ %{target}" update_status: "%{name} ได้อัปเดตสถานะโดย %{target}" deleted_status: "(สถานะที่ลบแล้ว)" empty: ไม่พบรายการบันทึก @@ -403,6 +406,7 @@ th: title: โดเมนอีเมลที่ปิดกั้นอยู่ instances: by_domain: โดเมน + empty: ไม่พบโดเมน known_accounts: other: "%{count} บัญชีที่รู้จัก" moderation: @@ -471,6 +475,8 @@ th: comment: none: ไม่มี created_at: รายงานเมื่อ + forwarded: ส่งต่อแล้ว + forwarded_to: ส่งต่อไปยัง %{domain} แล้ว mark_as_resolved: ทำเครื่องหมายว่าแก้ปัญหาแล้ว mark_as_unresolved: ทำเครื่องหมายว่ายังไม่ได้แก้ปัญหา notes: @@ -806,6 +812,8 @@ th: status: สถานะการตรวจสอบ view_proof: ดูการพิสูจน์ imports: + errors: + over_rows_processing_limit: มีมากกว่า %{count} แถว modes: merge: ผสาน merge_long: เก็บระเบียนที่มีอยู่และเพิ่มระเบียนใหม่ diff --git a/config/locales/uk.yml b/config/locales/uk.yml index dee947dc6..8f11ce76c 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -23,7 +23,7 @@ uk: hosted_on: Mastodon розміщено на %{domain} instance_actor_flash: 'Цей обліковий запис є віртуальною особою, яка використовується для представлення самого сервера, а не певного користувача. Він використовується для потреб федерації і не повинен бути заблокований, якщо тільки ви не хочете заблокувати весь сервер, у цьому випадку ви повинні скористатися блокуванням домену. -' + ' learn_more: Дізнатися більше privacy_policy: Політика приватності see_whats_happening: Погляньте, що відбувається diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 3795c171b..e9842acf6 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -23,7 +23,7 @@ vi: hosted_on: "%{domain} vận hành nhờ Mastodon" instance_actor_flash: 'Đây là một tài khoản ảo được sử dụng để đại diện cho máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên chặn trừ khi bạn muốn chặn toàn bộ máy chủ. -' + ' learn_more: Tìm hiểu privacy_policy: Chính sách bảo mật see_whats_happening: Dòng thời gian @@ -398,6 +398,8 @@ vi: silence: Ẩn suspend: Vô hiệu hóa title: Máy chủ bị chặn mới + obfuscate: Làm mờ tên máy chủ + obfuscate_hint: Làm mờ tên máy chủ trong danh sách nếu giới hạn máy chủ đã bật private_comment: Bình luận riêng private_comment_hint: Cho biết vì sao chặn máy chủ này để tiện kiểm duyệt viên tham khảo. public_comment: Bình luận công khai @@ -506,7 +508,7 @@ vi: action_taken_by: Hành động được thực hiện bởi are_you_sure: Bạn có chắc không? assign_to_self: Giao cho tôi - assigned: Phân công kiểm duyệt + assigned: Người xử lý by_target_domain: Tên tài khoản bị báo cáo comment: none: Không có mô tả @@ -754,7 +756,7 @@ vi: pending: Đơn đăng ký của bạn đang chờ phê duyệt. Điều này có thể mất một thời gian. Bạn sẽ nhận được email nếu đơn đăng ký của bạn được chấp thuận. redirecting_to: Tài khoản của bạn không hoạt động vì hiện đang chuyển hướng đến %{acct}. too_fast: Nghi vấn đăng ký spam, xin thử lại. - trouble_logging_in: Gặp sự cố khi đăng nhập? + trouble_logging_in: Quên mật khẩu? use_security_key: Dùng khóa bảo mật authorize_follow: already_following: Bạn đang theo dõi người này @@ -912,6 +914,8 @@ vi: status: Tình trạng xác minh view_proof: Xem bằng chứng imports: + errors: + over_rows_processing_limit: chứa nhiều hơn %{count} hàng modes: merge: Hợp nhất merge_long: Giữ hồ sơ hiện có và thêm hồ sơ mới @@ -1082,7 +1086,7 @@ vi: last_active: Hoạt động lần cuối most_recent: Mới nhất moved: Đã xóa - mutual: Cả hai + mutual: Đồng thời primary: Bình thường relationship: Mối quan hệ remove_selected_domains: Xóa hết người theo dõi từ các máy chủ đã chọn @@ -1165,7 +1169,7 @@ vi: featured_tags: Hashtags thường dùng identity_proofs: Bằng chứng nhận dạng import: Nhập dữ liệu - import_and_export: Nhập và xuất dữ liệu + import_and_export: Dữ liệu migrate: Chuyển tài khoản sang máy chủ khác notifications: Thông báo preferences: Chung @@ -1191,7 +1195,7 @@ vi: errors: in_reply_not_found: Bạn đang trả lời một tút không còn tồn tại. language_detection: Tự động phát hiện ngôn ngữ - open_in_web: Mở trên web + open_in_web: Xem trong Mastodon over_character_limit: vượt quá giới hạn %{max} ký tự pin_errors: limit: Bạn đã ghim quá số lượng tút cho phép diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 6c9079834..56d1962b2 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -23,7 +23,7 @@ zh-CN: hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例 instance_actor_flash: '这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。 -' + ' learn_more: 了解详情 privacy_policy: 隐私政策 see_whats_happening: 看一看现在在发生什么 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index d34b69d46..2140db4aa 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -57,6 +57,7 @@ zh-HK: followers: other: 關注者 following: 正在關注 + instance_actor_flash: 這個帳戶是結盟用的本伺服器的虛擬象徵,並不代表任何個別用戶。請不要把帳號停權。 joined: 於 %{date} 加入 last_active: 上次活躍時間 link_verified_on: 此連結的所有權已在 %{date} 檢查過 @@ -127,6 +128,7 @@ zh-HK: follows: 正在關注 header: 個人資料頁頂圖片 inbox_url: 收件箱(Inbox)URL + invite_request_text: 加入的原因 invited_by: 邀請者 ip: IP 位址 joined: 已加入 @@ -251,6 +253,7 @@ zh-HK: unsuspend_account: 取消帳號的停權狀態 update_announcement: 更新公告 update_custom_emoji: 更新自定的 Emoji 表情符號 + update_domain_block: 更新域名阻隔 update_status: 更新文章 actions: assigned_to_self_report: "%{name} 指派了 %{target} 的舉報給自己" @@ -291,6 +294,7 @@ zh-HK: unsuspend_account: "%{name} 取消了帳號 %{target} 的停權狀態" update_announcement: "%{name} 更新了公告 %{target}" update_custom_emoji: "%{name} 更新了 Emoji 表情符號 %{target}" + update_domain_block: "%{name} 更新了對 %{target} 的域名阻隔" update_status: "%{name} 更新了 %{target} 的文章" deleted_status: "(已刪除文章)" empty: 找不到任何日誌。 @@ -431,7 +435,8 @@ zh-HK: title: 電郵網域阻隔 instances: by_domain: 域名 - delivery_available: 傳送可用 + delivery_available: 可傳送 + empty: 找不到域名。 known_accounts: other: "%{count} 已知的帳號" moderation: @@ -506,6 +511,8 @@ zh-HK: comment: none: 沒有 created_at: 日期 + forwarded: 已轉寄 + forwarded_to: 已轉寄到 %{domain} mark_as_resolved: 標示為「已處理」 mark_as_unresolved: 標示為「未處理」 notes: @@ -575,6 +582,9 @@ zh-HK: min_invite_role: disabled: 沒有人 title: 允許發送邀請的身份 + require_invite_text: + desc_html: 如果已設定為手動審核注冊,請把「加入的原因」設定為必填項目。 + title: 要求新用戶填寫注冊申請 registrations_mode: modes: approved: 註冊需要核准 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index a2ad6fbde..5420f40e8 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -23,7 +23,7 @@ zh-TW: hosted_on: 在 %{domain} 運作的 Mastodon 站點 instance_actor_flash: '這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 -' + ' learn_more: 了解詳細 privacy_policy: 隱私權政策 see_whats_happening: 看看發生什麼事 From c6598b17d9212c2d48395da73fa9529025d704cc Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 19 Dec 2020 00:28:38 +0100 Subject: [PATCH 60/83] Bump version to 3.3.0rc2 (#15365) --- AUTHORS.md | 81 +++++++++++++++++++++++------------------ CHANGELOG.md | 42 ++++++++++++++++----- lib/mastodon/version.rb | 2 +- 3 files changed, 80 insertions(+), 45 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 12d0736bd..a2913bfe9 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -5,38 +5,39 @@ Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon) and provided thanks to the work of the following contributors: * [Gargron](https://github.com/Gargron) -* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview) * [ThibG](https://github.com/ThibG) -* [ykzts](https://github.com/ykzts) +* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview) * [dependabot[bot]](https://github.com/apps/dependabot) +* [ykzts](https://github.com/ykzts) * [akihikodaki](https://github.com/akihikodaki) * [mjankowski](https://github.com/mjankowski) * [unarist](https://github.com/unarist) * [yiskah](https://github.com/yiskah) * [nolanlawson](https://github.com/nolanlawson) * [abcang](https://github.com/abcang) -* [ysksn](https://github.com/ysksn) * [mayaeh](https://github.com/mayaeh) +* [ysksn](https://github.com/ysksn) * [sorin-davidoi](https://github.com/sorin-davidoi) +* [noellabo](https://github.com/noellabo) * [lynlynlynx](https://github.com/lynlynlynx) * [m4sk1n](mailto:me@m4sk.in) * [Marcin Mikołajczak](mailto:me@m4sk.in) * [Kjwon15](https://github.com/Kjwon15) -* [noellabo](https://github.com/noellabo) * [renatolond](https://github.com/renatolond) * [alpaca-tc](https://github.com/alpaca-tc) * [jeroenpraat](https://github.com/jeroenpraat) * [nclm](https://github.com/nclm) * [ineffyble](https://github.com/ineffyble) -* [shleeable](https://github.com/shleeable) * [zunda](https://github.com/zunda) +* [shleeable](https://github.com/shleeable) * [Masoud Abkenar](mailto:ampbox@gmail.com) * [blackle](https://github.com/blackle) * [Quent-in](https://github.com/Quent-in) * [JantsoP](https://github.com/JantsoP) * [nullkal](https://github.com/nullkal) * [yookoala](https://github.com/yookoala) -* [Sasha-Sorokin](https://github.com/Sasha-Sorokin) +* [Brawaru](https://github.com/Brawaru) +* [ariasuni](https://github.com/ariasuni) * [Aditoo17](https://github.com/Aditoo17) * [Quenty31](https://github.com/Quenty31) * [marek-lach](https://github.com/marek-lach) @@ -45,7 +46,6 @@ and provided thanks to the work of the following contributors: * [danhunsaker](https://github.com/danhunsaker) * [eramdam](https://github.com/eramdam) * [takayamaki](https://github.com/takayamaki) -* [ariasuni](https://github.com/ariasuni) * [masarakki](https://github.com/masarakki) * [ticky](https://github.com/ticky) * [ThisIsMissEm](https://github.com/ThisIsMissEm) @@ -53,14 +53,15 @@ and provided thanks to the work of the following contributors: * [hcmiya](https://github.com/hcmiya) * [stephenburgess8](https://github.com/stephenburgess8) * [Wonderfall](mailto:wonderfall@targaryen.house) +* [trwnh](https://github.com/trwnh) * [matteoaquila](https://github.com/matteoaquila) * [yukimochi](https://github.com/yukimochi) * [palindromordnilap](https://github.com/palindromordnilap) * [rkarabut](https://github.com/rkarabut) -* [trwnh](https://github.com/trwnh) * [nightpool](https://github.com/nightpool) * [Artoria2e5](https://github.com/Artoria2e5) * [marrus-sh](https://github.com/marrus-sh) +* [dunn](https://github.com/dunn) * [krainboltgreene](https://github.com/krainboltgreene) * [pfigel](https://github.com/pfigel) * [BoFFire](https://github.com/BoFFire) @@ -84,25 +85,25 @@ and provided thanks to the work of the following contributors: * [ashleyhull-versent](https://github.com/ashleyhull-versent) * [yhirano55](https://github.com/yhirano55) * [rinsuki](https://github.com/rinsuki) -* [dunn](https://github.com/dunn) * [devkral](https://github.com/devkral) * [camponez](https://github.com/camponez) * [hugogameiro](https://github.com/hugogameiro) * [SerCom_KC](mailto:szescxz@gmail.com) * [aschmitz](https://github.com/aschmitz) +* [mfmfuyu](https://github.com/mfmfuyu) +* [kedamaDQ](https://github.com/kedamaDQ) * [fpiesche](https://github.com/fpiesche) * [gandaro](https://github.com/gandaro) * [johnsudaar](https://github.com/johnsudaar) * [trebmuh](https://github.com/trebmuh) * [rmhasan](https://github.com/rmhasan) -* [kedamaDQ](https://github.com/kedamaDQ) * [lindwurm](https://github.com/lindwurm) * [victorhck](mailto:victorhck@geeko.site) * [voidsatisfaction](https://github.com/voidsatisfaction) +* [mkljczk](https://github.com/mkljczk) * [hikari-no-yume](https://github.com/hikari-no-yume) * [seefood](https://github.com/seefood) * [jackjennings](https://github.com/jackjennings) -* [mfmfuyu](https://github.com/mfmfuyu) * [puckipedia](https://github.com/puckipedia) * [spla](mailto:spla@mastodont.cat) * [walf443](https://github.com/walf443) @@ -111,14 +112,15 @@ and provided thanks to the work of the following contributors: * [Ashley](mailto:expenses@airmail.cc) * [xqus](https://github.com/xqus) * [pfm-eyesightjp](https://github.com/pfm-eyesightjp) -* [Samy KACIMI](mailto:samy.kacimi@gmail.com) +* [fakenine](https://github.com/fakenine) * [tsuwatch](https://github.com/tsuwatch) * [victorhck](https://github.com/victorhck) -* [mkljczk](https://github.com/mkljczk) * [manuelviens](https://github.com/manuelviens) +* [tateisu](https://github.com/tateisu) * [fvh-P](https://github.com/fvh-P) * [rtucker](https://github.com/rtucker) * [Anna e só](mailto:contraexemplos@gmail.com) +* [dariusk](https://github.com/dariusk) * [kazu9su](https://github.com/kazu9su) * [Komic](https://github.com/Komic) * [lmorchard](https://github.com/lmorchard) @@ -145,9 +147,9 @@ and provided thanks to the work of the following contributors: * [fhemberger](https://github.com/fhemberger) * [Gomasy](https://github.com/Gomasy) * [greysteil](https://github.com/greysteil) -* [hencatsmith](https://github.com/hencatsmith) +* [hendotcat](https://github.com/hendotcat) * [d6rkaiz](https://github.com/d6rkaiz) -* [Reverite](https://github.com/Reverite) +* [ladyisatis](https://github.com/ladyisatis) * [JohnD28](https://github.com/JohnD28) * [znz](https://github.com/znz) * [saper](https://github.com/saper) @@ -160,14 +162,14 @@ and provided thanks to the work of the following contributors: * [leopku](https://github.com/leopku) * [SansPseudoFix](https://github.com/SansPseudoFix) * [spla](mailto:sp@mastodont.cat) -* [tateisu](https://github.com/tateisu) * [tomfhowe](https://github.com/tomfhowe) * [noraworld](https://github.com/noraworld) * [lfuelling](https://github.com/lfuelling) -* [theboss](https://github.com/theboss) +* [aji-su](https://github.com/aji-su) * [nzws](https://github.com/nzws) * [duxovni](https://github.com/duxovni) * [smorimoto](https://github.com/smorimoto) +* [mashirozx](https://github.com/mashirozx) * [178inaba](https://github.com/178inaba) * [acid-chicken](https://github.com/acid-chicken) * [xgess](https://github.com/xgess) @@ -175,7 +177,6 @@ and provided thanks to the work of the following contributors: * [aablinov](https://github.com/aablinov) * [stalker314314](https://github.com/stalker314314) * [cutls](https://github.com/cutls) -* [dariusk](https://github.com/dariusk) * [huertanix](https://github.com/huertanix) * [eleboucher](https://github.com/eleboucher) * [halkeye](https://github.com/halkeye) @@ -183,7 +184,7 @@ and provided thanks to the work of the following contributors: * [treby](https://github.com/treby) * [jpdevries](https://github.com/jpdevries) * [gdpelican](https://github.com/gdpelican) -* [kmichl](https://github.com/kmichl) +* [Korbinian](mailto:kontakt@korbinian-michl.de) * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name) * [panarom](https://github.com/panarom) * [Dar13](https://github.com/Dar13) @@ -225,6 +226,7 @@ and provided thanks to the work of the following contributors: * [aaribaud](https://github.com/aaribaud) * [pointlessone](https://github.com/pointlessone) * [Andrew](mailto:andrewlchronister@gmail.com) +* [arielrodrigues](https://github.com/arielrodrigues) * [aurelien-reeves](https://github.com/aurelien-reeves) * [elegaanz](https://github.com/elegaanz) * [estuans](https://github.com/estuans) @@ -238,6 +240,7 @@ and provided thanks to the work of the following contributors: * [muffinista](https://github.com/muffinista) * [cdutson](https://github.com/cdutson) * [farlistener](https://github.com/farlistener) +* [divergentdave](https://github.com/divergentdave) * [DavidLibeau](https://github.com/DavidLibeau) * [dmerejkowsky](https://github.com/dmerejkowsky) * [ddevault](https://github.com/ddevault) @@ -276,7 +279,7 @@ and provided thanks to the work of the following contributors: * [xPaw](https://github.com/xPaw) * [petzah](https://github.com/petzah) * [ignisf](https://github.com/ignisf) -* [raymestalez](https://github.com/raymestalez) +* [lumenwrites](https://github.com/lumenwrites) * [remram44](https://github.com/remram44) * [sts10](https://github.com/sts10) * [SuperSandro2000](https://github.com/SuperSandro2000) @@ -286,8 +289,9 @@ and provided thanks to the work of the following contributors: * [Sir-Boops](https://github.com/Sir-Boops) * [stemid](https://github.com/stemid) * [sumdog](https://github.com/sumdog) +* [OmmyZhang](https://github.com/OmmyZhang) * [ThomasLeister](https://github.com/ThomasLeister) -* [mcat-ee](https://github.com/mcat-ee) +* [Tom McAtee](mailto:a1608768@student.adelaide.edu.au) * [tototoshi](https://github.com/tototoshi) * [TrashMacNugget](https://github.com/TrashMacNugget) * [VirtuBox](https://github.com/VirtuBox) @@ -314,11 +318,13 @@ and provided thanks to the work of the following contributors: * [matsurai25](https://github.com/matsurai25) * [mecab](https://github.com/mecab) * [nicobz25](https://github.com/nicobz25) +* [niwatori24](https://github.com/niwatori24) * [oliverkeeble](https://github.com/oliverkeeble) * [partev](https://github.com/partev) * [pinfort](https://github.com/pinfort) * [rbaumert](https://github.com/rbaumert) * [rhoio](https://github.com/rhoio) +* [santiagorodriguez96](https://github.com/santiagorodriguez96) * [sclaire-1](https://github.com/sclaire-1) * [umonaca](https://github.com/umonaca) * [usagi-f](https://github.com/usagi-f) @@ -327,7 +333,7 @@ and provided thanks to the work of the following contributors: * [wxcafe](https://github.com/wxcafe) * [Grawl](https://github.com/Grawl) * [新都心(Neet Shin)](mailto:nucx@dio-vox.com) -* [clarfon](https://github.com/clarfon) +* [clarfonthey](https://github.com/clarfonthey) * [cygnan](https://github.com/cygnan) * [Awea](https://github.com/Awea) * [eai04191](https://github.com/eai04191) @@ -358,11 +364,11 @@ and provided thanks to the work of the following contributors: * [schas002](https://github.com/schas002) * [contraexemplo](https://github.com/contraexemplo) * [abackstrom](https://github.com/abackstrom) -* [arielrodrigues](https://github.com/arielrodrigues) * [orlea](https://github.com/orlea) * [armandfardeau](https://github.com/armandfardeau) * [raboof](https://github.com/raboof) * [jumbosushi](https://github.com/jumbosushi) +* [acuteaura](https://github.com/acuteaura) * [ayumin](https://github.com/ayumin) * [bzg](https://github.com/bzg) * [BastienDurel](https://github.com/BastienDurel) @@ -389,7 +395,7 @@ and provided thanks to the work of the following contributors: * [colindean](https://github.com/colindean) * [DeeUnderscore](https://github.com/DeeUnderscore) * [dachinat](https://github.com/dachinat) -* [shapeshifter-system](https://github.com/shapeshifter-system) +* [monsterpit-firedemon](https://github.com/monsterpit-firedemon) * [watilde](https://github.com/watilde) * [daprice](https://github.com/daprice) * [da2x](https://github.com/da2x) @@ -400,14 +406,13 @@ and provided thanks to the work of the following contributors: * [singingwolfboy](https://github.com/singingwolfboy) * [caldwell](https://github.com/caldwell) * [davidcelis](https://github.com/davidcelis) -* [divergentdave](https://github.com/divergentdave) * [davefp](https://github.com/davefp) * [yipdw](https://github.com/yipdw) * [debanshuk](https://github.com/debanshuk) * [mascali33](https://github.com/mascali33) * [DerekNonGeneric](https://github.com/DerekNonGeneric) * [dblandin](https://github.com/dblandin) -* [Drew Gates](mailto:aranaur@users.noreply.github.com) +* [Aranaur](https://github.com/Aranaur) * [dtschust](https://github.com/dtschust) * [Dryusdan](https://github.com/Dryusdan) * [d3vgru](https://github.com/d3vgru) @@ -451,22 +456,25 @@ and provided thanks to the work of the following contributors: * [J Yeary](mailto:usbsnowcrash@users.noreply.github.com) * [jack-michaud](https://github.com/jack-michaud) * [Floppy](https://github.com/Floppy) -* [loomchild](https://github.com/loomchild) -* [jglauche](https://github.com/jglauche) -* [jenkr55](https://github.com/jenkr55) -* [hyenagirl64](https://github.com/hyenagirl64) -* [press5](https://github.com/press5) -* [TrollDecker](https://github.com/TrollDecker) -* [jmontane](https://github.com/jmontane) +* [Jarek Lipski](mailto:pub@loomchild.net) +* [Jennifer Glauche](mailto:=^.^=@github19.jglauche.de) +* [Jennifer Kruse](mailto:jenkr55@gmail.com) +* [Jeremy Rose](mailto:nornagon@nornagon.net) +* [Jessica](mailto:46502909+hyenagirl64@users.noreply.github.com) +* [Jessica K. Litwin](mailto:jessica@litw.in) +* [Jo Decker](mailto:trolldecker@users.noreply.github.com) +* [Joan Montané](mailto:jmontane@users.noreply.github.com) * [Jonathan Klee](mailto:klee.jonathan@gmail.com) * [Jordan Guerder](mailto:jguerder@fr.pulseheberg.net) * [Joseph Mingrone](mailto:jehops@users.noreply.github.com) +* [Josh Leeb-du Toit](mailto:mail@joshleeb.com) * [Joshua Wood](mailto:josh@joshuawood.net) * [Julien](mailto:tiwy57@users.noreply.github.com) * [Julien Deswaef](mailto:juego@requiem4tv.com) * [June Sallou](mailto:jnsll@users.noreply.github.com) * [Jérémy Benoist](mailto:j0k3r@users.noreply.github.com) * [KEINOS](mailto:github@keinos.com) +* [Kairui Song | 宋恺睿](mailto:ryncsn@gmail.com) * [Keiji Matsuzaki](mailto:futoase@gmail.com) * [Kevin Liu](mailto:kevin@potatofrom.space) * [Kit Redgrave](mailto:qwertyitis@gmail.com) @@ -482,7 +490,6 @@ and provided thanks to the work of the following contributors: * [Lukas Burk](mailto:jemus42@users.noreply.github.com) * [Manato Kameya](mailto:grabacr07+github@gmail.com) * [Mantas](mailto:mistermantas@users.noreply.github.com) -* [Marcin Mikołajczak](mailto:me@mkljczk.pl) * [Mareena Kunjachan](mailto:mareenakunjachan@gmail.com) * [Marek Lach](mailto:marek.brohatwack.lach@gmail.com) * [Markus R](mailto:wirehack7@users.noreply.github.com) @@ -529,10 +536,12 @@ and provided thanks to the work of the following contributors: * [Norayr Chilingarian](mailto:norayr@arnet.am) * [Noëlle Anthony](mailto:noelle.d.anthony@gmail.com) * [N氏](mailto:uenok.htc@gmail.com) +* [OSAMU SATO](mailto:satosamu@gmail.com) * [Olivier Nicole](mailto:olivierthnicole@gmail.com) * [Oskari Noppa](mailto:noppa@users.noreply.github.com) * [Otakan](mailto:otakan951@gmail.com) * [Padraig Fahy](mailto:tech@padraigfahy.com) +* [Patrice Ferlet](mailto:metal3d@gmail.com) * [PatrickRWells](mailto:32802366+patrickrwells@users.noreply.github.com) * [Paul](mailto:naydex.mc+github@gmail.com) * [Pete Keen](mailto:pete@petekeen.net) @@ -574,7 +583,6 @@ and provided thanks to the work of the following contributors: * [TakesxiSximada](mailto:takesxi.sximada@gmail.com) * [Tao Bror Bojlén](mailto:brortao@users.noreply.github.com) * [Taras Gogol](mailto:taras2358@gmail.com) -* [Tdxdxoz](mailto:tdxdxoz@gmail.com) * [TheInventrix](mailto:theinventrix@users.noreply.github.com) * [TheMainOne](mailto:50847364+theevilskeleton@users.noreply.github.com) * [Thomas Alberola](mailto:thomas@needacoffee.fr) @@ -594,6 +602,7 @@ and provided thanks to the work of the following contributors: * [Wesley Ellis](mailto:tahnok@gmail.com) * [Wiktor](mailto:wiktor@metacode.biz) * [Wonderfall](mailto:wonderfall@schrodinger.io) +* [Y.Yamashiro](mailto:shukukei@mojizuri.jp) * [YDrogen](mailto:ydrogen45@gmail.com) * [YMHuang](mailto:ymhuang@fmbase.tw) * [YOSHIOKA Eiichiro](mailto:yoshioka.eiichiro@gmail.com) @@ -638,6 +647,7 @@ and provided thanks to the work of the following contributors: * [jumoru](mailto:jumoru@mailbox.org) * [kaiyou](mailto:pierre@jaury.eu) * [karlyeurl](mailto:karl.yeurl@gmail.com) +* [kawaguchi](mailto:jiikko@users.noreply.github.com) * [kedama](mailto:32974885+kedamadq@users.noreply.github.com) * [kuro5hin](mailto:rusty@kuro5hin.org) * [leo60228](mailto:leo@60228.dev) @@ -655,6 +665,7 @@ and provided thanks to the work of the following contributors: * [notozeki](mailto:notozeki@users.noreply.github.com) * [ntl-purism](mailto:57806346+ntl-purism@users.noreply.github.com) * [nzws](mailto:git-yuzu@svk.jp) +* [proxy](mailto:51172302+3n-k1@users.noreply.github.com) * [rch850](mailto:rich850@gmail.com) * [roikale](mailto:roikale@users.noreply.github.com) * [rysiekpl](mailto:rysiek@hackerspace.pl) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe2c1b8b3..64bf6655c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ All notable changes to this project will be documented in this file. - Add border around 🐞 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14712)) - Add home link to the getting started column when home isn't mounted ([ThibG](https://github.com/tootsuite/mastodon/pull/14707)) - Add option to disable swiping motions across the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13885)) -- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14870), [Gargron](https://github.com/tootsuite/mastodon/pull/15157), [Gargron](https://github.com/tootsuite/mastodon/pull/14915)) +- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14870), [Gargron](https://github.com/tootsuite/mastodon/pull/15157), [Gargron](https://github.com/tootsuite/mastodon/pull/14915), [noellabo](https://github.com/tootsuite/mastodon/pull/15309)) - Continue watching/listening when you scroll away - Action bar to interact with/open toot from the pop-out player - Add unread notification markers in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14818), [ThibG](https://github.com/tootsuite/mastodon/pull/14960), [ThibG](https://github.com/tootsuite/mastodon/pull/14954), [noellabo](https://github.com/tootsuite/mastodon/pull/14897), [noellabo](https://github.com/tootsuite/mastodon/pull/14907)) @@ -27,14 +27,16 @@ All notable changes to this project will be documented in this file. - If you have a proxy cache in front of object storage, deleted files will persist until the cache expires - If enabled, cache buster will make a special request to the proxy to signal a cache reset - Add duration option to the mute function ([aquarla](https://github.com/tootsuite/mastodon/pull/13831)) -- Add replies policy option to the list function ([ThibG](https://github.com/tootsuite/mastodon/pull/9205)) +- Add replies policy option to the list function ([ThibG](https://github.com/tootsuite/mastodon/pull/9205), [trwnh](https://github.com/tootsuite/mastodon/pull/15304)) - Add `og:published_time` OpenGraph tags on toots ([nornagon](https://github.com/tootsuite/mastodon/pull/14865)) - **Add option to be notified when a followed user posts** ([Gargron](https://github.com/tootsuite/mastodon/pull/13546), [ThibG](https://github.com/tootsuite/mastodon/pull/14896), [Gargron](https://github.com/tootsuite/mastodon/pull/14822)) - If you don't want to miss a toot, click the bell button! - Add client-side validation in password change forms ([ThibG](https://github.com/tootsuite/mastodon/pull/14564)) - Add client-side validation in the registration form ([ThibG](https://github.com/tootsuite/mastodon/pull/14560), [ThibG](https://github.com/tootsuite/mastodon/pull/14599)) - Add support for Gemini URLs ([joshleeb](https://github.com/tootsuite/mastodon/pull/15013)) +- Add app shortcuts to web app manifest ([mkljczk](https://github.com/tootsuite/mastodon/pull/15234)) - Add WebAuthn as an alternative 2FA method ([santiagorodriguez96](https://github.com/tootsuite/mastodon/pull/14466), [jiikko](https://github.com/tootsuite/mastodon/pull/14806)) +- Add honeypot fields and minimum fill-out time for sign-up form ([ThibG](https://github.com/tootsuite/mastodon/pull/15276)) - Add icon for mutual relationships in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15149)) - Add follow selected followers button in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15148)) - **Add subresource integrity for JS and CSS assets** ([Gargron](https://github.com/tootsuite/mastodon/pull/15096)) @@ -42,7 +44,7 @@ All notable changes to this project will be documented in this file. - Subresource integrity compares server-generated asset digests with what's actually served from the CDN and prevents such attacks - Add `ku`, `sa`, `sc`, `zgh` to available locales ([ykzts](https://github.com/tootsuite/mastodon/pull/15138)) - Add ability to force an account to mark media as sensitive ([noellabo](https://github.com/tootsuite/mastodon/pull/14361)) -- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/tootsuite/mastodon/pull/14963)) +- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/tootsuite/mastodon/pull/14963), [ThibG](https://github.com/tootsuite/mastodon/pull/15263)) - Add rules for IPs or CIDR ranges that automatically expire after a configurable amount of time - Choose the severity of the rule, either blocking all access or merely limiting sign-ups - **Add support for reversible suspensions through ActivityPub** ([Gargron](https://github.com/tootsuite/mastodon/pull/14989)) @@ -50,14 +52,18 @@ All notable changes to this project will be documented in this file. - During suspension, the account can only delete its own content - A reversal of the suspension can be signalled the same way - A local suspension always overrides a remote one +- Add indication to admin UI of whether a report has been forwarded ([ThibG](https://github.com/tootsuite/mastodon/pull/13237)) +- Add display of reasons for joining of an account in admin UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15265)) +- Add option to obfuscate domain name in public list of domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/15355)) +- Add option to make reasons for joining required on sign-up ([ThibG](https://github.com/tootsuite/mastodon/pull/15326), [ThibG](https://github.com/tootsuite/mastodon/pull/15358)) - Add ActivityPub follower synchronization mechanism ([ThibG](https://github.com/tootsuite/mastodon/pull/14510), [ThibG](https://github.com/tootsuite/mastodon/pull/15026)) - Add outbox attribute to instance actor ([ThibG](https://github.com/tootsuite/mastodon/pull/14721)) -- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595)) +- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595), [noellabo](https://github.com/tootsuite/mastodon/pull/15277)) - Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/tootsuite/mastodon/pull/14683), [noellabo](https://github.com/tootsuite/mastodon/pull/14981)) - Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/14952)) - Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ThibG](https://github.com/tootsuite/mastodon/pull/14722)) - Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/14383), [uist1idrju3i](https://github.com/tootsuite/mastodon/pull/14715)) -- Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201)) +- Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201), [ThibG](https://github.com/tootsuite/mastodon/pull/15264), [ThibG](https://github.com/tootsuite/mastodon/pull/15256)) - Has someone changed their domain or subdomain thereby creating two accounts where there should be one? - This command will fix it on your end - Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223)) @@ -68,12 +74,13 @@ All notable changes to this project will be documented in this file. - More connections means more resource consumption on both ends, not to mention the (ever so slight) delay when establishing a new connection - Now, with just a single WebSocket connection you can subscribe and unsubscribe to and from multiple streams - Add support for limiting results by both `min_id` and `max_id` at the same time in REST API ([tateisu](https://github.com/tootsuite/mastodon/pull/14776)) -- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817)) +- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817), [noellabo](https://github.com/tootsuite/mastodon/pull/15270)) +- Add stoplight for object storage failures, return HTTP 503 in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13043)) - Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14396)) ### Changed -- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221)) +- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221), [Gargron](https://github.com/tootsuite/mastodon/pull/15284), [Gargron](https://github.com/tootsuite/mastodon/pull/15283), [Kjwon15](https://github.com/tootsuite/mastodon/pull/15308), [noellabo](https://github.com/tootsuite/mastodon/pull/15305)) - Background of the overlay matches the color of the image - Action bar to interact with or open the toot from the modal - Change order of announcements in admin UI to be newest-first ([ThibG](https://github.com/tootsuite/mastodon/pull/15091)) @@ -83,7 +90,7 @@ All notable changes to this project will be documented in this file. - Immediate deletion of data is still available as an explicit option - Suspended accounts can request an archive of their data through the UI - Change REST API to return empty data for suspended accounts (14765) -- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/14766)) +- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/14766), [Gargron](https://github.com/tootsuite/mastodon/pull/15345)) - Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/tootsuite/mastodon/pull/14760)) - Change direct toots to appear in the home feed again ([Gargron](https://github.com/tootsuite/mastodon/pull/14711), [ThibG](https://github.com/tootsuite/mastodon/pull/15182), [noellabo](https://github.com/tootsuite/mastodon/pull/14727)) - Return to treating all toots the same instead of trying to retrofit direct visibility into an instant messaging model @@ -96,7 +103,14 @@ All notable changes to this project will be documented in this file. - Change string "Boost to original audience" to "Boost with original visibility" in web UI ([3n-k1](https://github.com/tootsuite/mastodon/pull/14598)) - Change string "Show more" to "Show newer" and "Show older" on public pages ([ariasuni](https://github.com/tootsuite/mastodon/pull/15052)) - Change order of announcements to be reverse chronological in web UI ([dariusk](https://github.com/tootsuite/mastodon/pull/15065), [dariusk](https://github.com/tootsuite/mastodon/pull/15070)) +- Change RTL detection to rely on unicode-bidi paragraph by paragraph in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14573)) - Change visibility icon next to timestamp to be clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15053), [mayaeh](https://github.com/tootsuite/mastodon/pull/15055)) +- Change public thread view to hide "Show thread" link ([ThibG](https://github.com/tootsuite/mastodon/pull/15266)) +- Change number format on about page from full to shortened ([Gargron](https://github.com/tootsuite/mastodon/pull/15327)) +- Change how scheduled tasks run in multi-process environments ([noellabo](https://github.com/tootsuite/mastodon/pull/15314)) + - New dedicated queue `scheduler` + - Runs by default when Sidekiq is executed with no options + - Has to be added manually in a multi-process environment ### Removed @@ -107,6 +121,8 @@ All notable changes to this project will be documented in this file. ### Fixed +- Fix layout on about page when contact account has a long username ([ThibG](https://github.com/tootsuite/mastodon/pull/15357)) +- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/tootsuite/mastodon/pull/14207)) - **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/tootsuite/mastodon/pull/15200)) - Previously, delete of a toot would be primarily sent to the followers of its author, people mentioned in the toot, and people who reblogged the toot - Now, additionally, it is ensured that it is sent to people who replied to it, favourited it, and to the person it replies to even if that person is not mentioned @@ -123,7 +139,7 @@ All notable changes to this project will be documented in this file. - Fix poll ending notifications being created for each vote ([ThibG](https://github.com/tootsuite/mastodon/pull/15071)) - Fix multiple boosts of a same toot erroneously appearing in TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14759)) - Fix asset builds not picking up `CDN_HOST` change ([ThibG](https://github.com/tootsuite/mastodon/pull/14381)) -- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543)) +- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543), [ThibG](https://github.com/tootsuite/mastodon/pull/15176)) - Some time ago, browsers added a requirement that desktop notification prompts could only be displayed in response to a user-generated event (such as a click) - This means that for some time, users who haven't already given the permission before were not getting a prompt and as such were not receiving desktop notifications - Fix "Mark media as sensitive" string not supporting pluralizations in other languages in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15051)) @@ -139,11 +155,18 @@ All notable changes to this project will be documented in this file. - Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14456)) - Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/14484), [ThibG](https://github.com/tootsuite/mastodon/pull/14513)) - Fix home last read marker mishandling gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14809)) +- Fix unnecessary re-rendering of various components when typing in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15286)) +- Fix notifications being unnecessarily re-rendered in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15312)) +- Fix column swiping animation logic in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15301)) - Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/14861), [akihikodaki](https://github.com/tootsuite/mastodon/pull/14662)) - Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674)) - Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673)) - Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675)) - Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534)) +- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287)) +- Fix performance on instances list in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15282)) +- Fix server actor appearing in list of accounts in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14567)) +- Fix "bootstrap timeline accounts" toggle in site settings in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15325)) - Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/tootsuite/mastodon/pull/15072)) - Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/tootsuite/mastodon/pull/12685)) - Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/tootsuite/mastodon/pull/14686)) @@ -152,6 +175,7 @@ All notable changes to this project will be documented in this file. - Fix streaming API allowing connections to persist after access token invalidation ([Gargron](https://github.com/tootsuite/mastodon/pull/15111)) - Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) +- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364)) ## [3.2.1] - 2020-10-19 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 46aed7d8d..7282ea7b5 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def flags - 'rc1' + 'rc2' end def suffix From 2dd3643dbcea7a08335405243b48234d916442a5 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 19 Dec 2020 10:23:42 +0900 Subject: [PATCH 61/83] Ran `i18n-tasks normalize` (#15372) --- config/locales/bn.yml | 2 +- config/locales/doorkeeper.hy.yml | 6 +++--- config/locales/eu.yml | 2 +- config/locales/gl.yml | 2 +- config/locales/hu.yml | 2 +- config/locales/hy.yml | 2 +- config/locales/id.yml | 2 +- config/locales/ja.yml | 2 +- config/locales/nl.yml | 2 +- config/locales/no.yml | 2 +- config/locales/sc.yml | 2 +- config/locales/sv.yml | 2 +- config/locales/uk.yml | 2 +- config/locales/vi.yml | 2 +- config/locales/zh-CN.yml | 2 +- config/locales/zh-TW.yml | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/config/locales/bn.yml b/config/locales/bn.yml index a79f10131..0cf936d68 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -23,7 +23,7 @@ bn: hosted_on: এই মাস্টাডনটি আছে %{domain} এ instance_actor_flash: 'এই অ্যাকাউন্টটি ভার্চুয়াল এক্টর যা নিজে কোনও সার্ভারের প্রতিনিধিত্ব করতে ব্যবহৃত হয় এবং কোনও পৃথক ব্যবহারকারী নয়। এটি ফেডারেশনের উদ্দেশ্যে ব্যবহৃত হয় এবং আপনি যদি পুরো ইনস্ট্যান্স ব্লক করতে না চান তবে অবরুদ্ধ করা উচিত নয়, সেক্ষেত্রে আপনার ডোমেন ব্লক ব্যবহার করা উচিত। - ' +' learn_more: বিস্তারিত জানুন privacy_policy: গোপনীয়তা নীতি see_whats_happening: কী কী হচ্ছে দেখুন diff --git a/config/locales/doorkeeper.hy.yml b/config/locales/doorkeeper.hy.yml index 7b0e1f03c..ba3f4e124 100644 --- a/config/locales/doorkeeper.hy.yml +++ b/config/locales/doorkeeper.hy.yml @@ -8,7 +8,7 @@ hy: scopes: Դաշտեր website: 'Յաւելուածի վէբկայք - ' +' errors: models: doorkeeper/application: @@ -52,7 +52,7 @@ hy: actions: Գործողութիւններ application_id: 'Կլիենտի բանալի - ' +' callback_urls: URL֊ների ետկանչ scopes: Դաշտեր secret: Կլիենտի գաղտնիք @@ -147,7 +147,7 @@ hy: write:favourites: հաւանել գրառումները write:filters: 'ստեղծել ֆիլտրեր - ' +' write:follows: հետեւել write:lists: ստեղծել ցանկեր write:media: բեռնել մեդիա ֆայլեր diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 4cd4c00f8..cd82a5d9a 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -23,7 +23,7 @@ eu: hosted_on: Mastodon %{domain} domeinuan ostatatua instance_actor_flash: 'Kontu hau zerbitzaria bera adierazten duen aktore birtual bat da, ez norbanako bat. Federaziorako erabiltzen da eta ez zenuke blokeatu behar instantzia osoa blokeatu nahi ez baduzu, kasu horretan domeinua blokeatzea egokia litzateke. - ' +' learn_more: Ikasi gehiago privacy_policy: Pribatutasun politika see_whats_happening: Ikusi zer gertatzen ari den diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 597a05d23..36980f800 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -23,7 +23,7 @@ gl: hosted_on: Mastodon aloxado en %{domain} instance_actor_flash: 'Esta conta é un actor virtual utilizado para representar ao servidor e non a unha usuaria individual. Utilízase para propósitos de federación e non debería estar bloqueada a menos que queiras bloquear a toda a instancia, en tal caso deberías utilizar o bloqueo do dominio. - ' +' learn_more: Saber máis privacy_policy: Política de privacidade see_whats_happening: Ver o que está a acontecer diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 01fecb99c..0fc35c9ac 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -23,7 +23,7 @@ hu: hosted_on: "%{domain} Mastodon szerver" instance_actor_flash: 'Ez a fiók egy virtuális szereplő, mely magát a szervert reprezentálja, nem egy felhasználót. Ez a föderáció támogatására készült, ezért nem szabad blokkolni, hacsak egy teljes szervert nem akarsz kitiltani, amire persze a domain blokkolása jobb megoldás. - ' +' learn_more: Tudj meg többet privacy_policy: Adatvédelmi szabályzat see_whats_happening: Nézd, mi történik diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 049044627..1afd4d927 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -23,7 +23,7 @@ hy: hosted_on: Մաստոդոնը տեղակայուած է %{domain}ում instance_actor_flash: 'Այս հաշիւ վիրտուալ դերասան է, օգտագործուում է սպասարկիչը, այլ ոչ անհատ օգտատիրոջը ներկայացնելու, համար։ Օգտագործուում է ֆեդերացիայի նպատակով, ու չպէտք է արգելափակուի, եթէ չէք ցանկանում արգելափակել ողջ հանգոյցը, որի դէպքում պէտք է օգտագործէք տիրոյթի արգելափակումը։ - ' +' learn_more: Իմանալ ավելին privacy_policy: Գաղտնիության քաղաքականություն see_whats_happening: Տես ինչ ա կատարվում diff --git a/config/locales/id.yml b/config/locales/id.yml index 498c285d7..8d3291adf 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -23,7 +23,7 @@ id: hosted_on: Mastodon dihosting di %{domain} instance_actor_flash: 'Akun ini adalah aktor virtual yang dipakai untuk merepresentasikan server, bukan pengguna individu. Ini dipakai untuk tujuan federasi dan jangan diblokir kecuali Anda ingin memblokir seluruh instansi, yang seharusnya Anda pakai blokir domain. - ' +' learn_more: Pelajari selengkapnya privacy_policy: Kebijakan Privasi see_whats_happening: Lihat apa yang sedang terjadi diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 3a929c6ca..db9e41f74 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -23,7 +23,7 @@ ja: hosted_on: Mastodon hosted on %{domain} instance_actor_flash: 'このアカウントはサーバーそのものを示す仮想的なもので、特定のユーザーを示すものではありません。これはサーバーの連合のために使用されます。サーバー全体をブロックするときは、このアカウントをブロックせずに、ドメインブロックを使用してください。 - ' +' learn_more: もっと詳しく privacy_policy: プライバシーポリシー see_whats_happening: やりとりを見てみる diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e1f10c813..d9c4e20fa 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -23,7 +23,7 @@ nl: hosted_on: Mastodon op %{domain} instance_actor_flash: 'Dit account is een virtuel actor dat wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wilt blokkeren. In zo''n geval dien je echter een domeinblokkade te gebruiken. - ' +' learn_more: Meer leren privacy_policy: Privacybeleid see_whats_happening: Kijk wat er aan de hand is diff --git a/config/locales/no.yml b/config/locales/no.yml index 3d51fc6cd..b70eb167c 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -23,7 +23,7 @@ hosted_on: Mastodon driftet på %{domain} instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet. - ' +' learn_more: Lær mer privacy_policy: Privatlivsretningslinjer see_whats_happening: Se hva som skjer diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 492474d7a..626c7671c 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -23,7 +23,7 @@ sc: hosted_on: Mastodon acasagiadu in %{domain} instance_actor_flash: 'Custu contu est un''atore virtuale impreadu pro rapresentare su serbidore matessi, no est un''utente individuale. Benit impreadu pro punnas de federatzione e non lu dias dèpere blocare si non cheres blocare su domìniu intreu, e in cussu casu dias dèpere impreare unu blocu de domìniu. - ' +' learn_more: Àteras informatziones privacy_policy: Polìtica de riservadesa see_whats_happening: Càstia su chi est acontessende diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 3fff6517c..36154b49b 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -23,7 +23,7 @@ sv: hosted_on: Mastodon-värd på %{domain} instance_actor_flash: 'Detta konto är en virtuell agent som används för att representera servern själv och inte någon individuell användare. Det används av sammanslutningsskäl och ska inte blockeras såvitt du inte vill blockera hela instansen, och för detta fall ska domänblockering användas. - ' +' learn_more: Lär dig mer privacy_policy: Integritetspolicy see_whats_happening: Se vad som händer diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 8f11ce76c..dee947dc6 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -23,7 +23,7 @@ uk: hosted_on: Mastodon розміщено на %{domain} instance_actor_flash: 'Цей обліковий запис є віртуальною особою, яка використовується для представлення самого сервера, а не певного користувача. Він використовується для потреб федерації і не повинен бути заблокований, якщо тільки ви не хочете заблокувати весь сервер, у цьому випадку ви повинні скористатися блокуванням домену. - ' +' learn_more: Дізнатися більше privacy_policy: Політика приватності see_whats_happening: Погляньте, що відбувається diff --git a/config/locales/vi.yml b/config/locales/vi.yml index e9842acf6..be681b3a6 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -23,7 +23,7 @@ vi: hosted_on: "%{domain} vận hành nhờ Mastodon" instance_actor_flash: 'Đây là một tài khoản ảo được sử dụng để đại diện cho máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên chặn trừ khi bạn muốn chặn toàn bộ máy chủ. - ' +' learn_more: Tìm hiểu privacy_policy: Chính sách bảo mật see_whats_happening: Dòng thời gian diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 56d1962b2..6c9079834 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -23,7 +23,7 @@ zh-CN: hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例 instance_actor_flash: '这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。 - ' +' learn_more: 了解详情 privacy_policy: 隐私政策 see_whats_happening: 看一看现在在发生什么 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 5420f40e8..a2ad6fbde 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -23,7 +23,7 @@ zh-TW: hosted_on: 在 %{domain} 運作的 Mastodon 站點 instance_actor_flash: '這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 - ' +' learn_more: 了解詳細 privacy_policy: 隱私權政策 see_whats_happening: 看看發生什麼事 From 3561f8fabed2a6c40130cb5f1d1d732393dc0200 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 19 Dec 2020 03:13:50 +0100 Subject: [PATCH 62/83] Forward-port v3.2.2 changelog (#15370) --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ chart/Chart.yaml | 4 ++-- chart/values.yaml.template | 2 +- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64bf6655c..4396dc96c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -177,6 +177,32 @@ All notable changes to this project will be documented in this file. - Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) - Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364)) +## [3.2.2] - 2020-12-19 +### Added + +- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223)) + - Index corruption in the database? + - This command is for you + +### Removed + +- Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574)) + +### Fixed + +- Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107)) +- Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867)) +- Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906)) +- Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108)) +- Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027)) +- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ThibG](https://github.com/tootsuite/mastodon/pull/15187)) +- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287)) + +### Security + +- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) +- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364)) + ## [3.2.1] - 2020-10-19 ### Added diff --git a/chart/Chart.yaml b/chart/Chart.yaml index 783569451..19f9c64c7 100644 --- a/chart/Chart.yaml +++ b/chart/Chart.yaml @@ -15,12 +15,12 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 +version: 0.1.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 3.1.5 +appVersion: 3.3.0 dependencies: - name: elasticsearch diff --git a/chart/values.yaml.template b/chart/values.yaml.template index c1dc29f57..9e50c6dac 100644 --- a/chart/values.yaml.template +++ b/chart/values.yaml.template @@ -4,7 +4,7 @@ image: repository: tootsuite/mastodon pullPolicy: Always # https://hub.docker.com/r/tootsuite/mastodon/tags - tag: v3.2.1 + tag: v3.3.0 # alternatively, use `latest` for the latest release or `edge` for the image # built from the most recent commit # From c4e860277dbc391a0c6ec0311f66a8484cca862b Mon Sep 17 00:00:00 2001 From: ThibG Date: Sat, 19 Dec 2020 13:34:16 +0100 Subject: [PATCH 63/83] Fix "tootctl accounts fix-duplicates" (#15373) - `pluck_each` cannot be used this way with `group` - typo Co-authored-by: Claire --- lib/mastodon/accounts_cli.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 474643869..5275f04cf 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -245,10 +245,10 @@ module Mastodon domain configuration. LONG_DESC def fix_duplicates - Account.remote.select(:uri, 'count(*)').group(:uri).having('count(*) > 1').pluck_each(:uri) do |uri| + Account.remote.select(:uri, 'count(*)').group(:uri).having('count(*) > 1').pluck(:uri).each do |uri| say("Duplicates found for #{uri}") begin - ActivityPub::FetchRemotAccountService.new.call(uri) unless options[:dry_run] + ActivityPub::FetchRemoteAccountService.new.call(uri) unless options[:dry_run] rescue => e say("Error processing #{uri}: #{e}", :red) end From 9734c9b6fe2d2e4a980d8ad94c5de0300b23c809 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 20 Dec 2020 18:05:03 +0100 Subject: [PATCH 64/83] Add clean error message when RAILS_ENV is unset (#15381) By default, an unset RAILS_ENV is understood as RAILS_ENV=development. However, this is not what most people expect, and due to development-only dependencies, users are often left with confusing error messages. This commit changes it so that an explicit RAILS_ENV is required, and failing that, an error message is displayed before loading the app. Co-authored-by: Claire --- config/boot.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/boot.rb b/config/boot.rb index f3e36203a..6cde5319d 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,3 +1,8 @@ +unless ENV.key?('RAILS_ENV') + STDERR.puts 'ERROR: Missing RAILS_ENV environment variable, please set it to "production", "development", or "test".' + exit 1 +end + ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. From 7bf3c6e57b52cd9390f2140a1cc17292c281aacf Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 20 Dec 2020 18:25:00 +0100 Subject: [PATCH 65/83] Fix AccountDeletionWorker crashing and clogging sidekiq queues (#15380) * Fix account deletion workers being queued multiple times for a single account * Fix poll votes being unnecessarily instantiated on poll deletion * Fix favourites being unnecessarily instantiated on status deletion * Remove inaccurate comments * Delete polls instead of destroying them Co-authored-by: Claire --- app/models/poll.rb | 2 +- app/models/status.rb | 2 +- app/services/batched_remove_status_service.rb | 3 --- app/services/delete_account_service.rb | 4 +++- app/workers/account_deletion_worker.rb | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/models/poll.rb b/app/models/poll.rb index b5deafcc2..e1ca55252 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -25,7 +25,7 @@ class Poll < ApplicationRecord belongs_to :account belongs_to :status - has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :destroy + has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :delete_all has_many :notifications, as: :activity, dependent: :destroy diff --git a/app/models/status.rb b/app/models/status.rb index 96d90e1c2..f1b3b75ce 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -56,7 +56,7 @@ class Status < ApplicationRecord belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true - has_many :favourites, inverse_of: :status, dependent: :destroy + has_many :favourites, inverse_of: :status, dependent: :delete_all has_many :bookmarks, inverse_of: :status, dependent: :destroy has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index 2295a01dc..28e5468b3 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -4,8 +4,6 @@ class BatchedRemoveStatusService < BaseService include Redisable # Delete given statuses and reblogs of them - # Dispatch PuSH updates of the deleted statuses, but only local ones - # Dispatch Salmon deletes, unique per domain, of the deleted statuses, but only local ones # Remove statuses from home feeds # Push delete events to streaming API for home feeds and public feeds # @param [Enumerable] statuses A preferably batched array of statuses @@ -19,7 +17,6 @@ class BatchedRemoveStatusService < BaseService @json_payloads = statuses.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) } - # Ensure that rendered XML reflects destroyed state statuses.each do |status| status.mark_for_mass_destruction! status.destroy diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index 9cb80c95a..fe9b30b17 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -122,7 +122,9 @@ class DeleteAccountService < BaseService @account.polls.reorder(nil).find_each do |poll| next if @options[:reserve_username] && reported_status_ids.include?(poll.status_id) - poll.destroy + # We can safely delete the poll rather than destroy it, as any non-reported + # status should have been deleted already + poll.delete end associations_for_destruction.each do |association_name| diff --git a/app/workers/account_deletion_worker.rb b/app/workers/account_deletion_worker.rb index 98b67419d..fdf013e01 100644 --- a/app/workers/account_deletion_worker.rb +++ b/app/workers/account_deletion_worker.rb @@ -3,7 +3,7 @@ class AccountDeletionWorker include Sidekiq::Worker - sidekiq_options queue: 'pull' + sidekiq_options queue: 'pull', lock: :until_executed def perform(account_id, options = {}) reserve_username = options.with_indifferent_access.fetch(:reserve_username, true) From 6f51fd743590c8fd8dd95e48dc24e4472d46480b Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 21 Dec 2020 00:47:02 +0100 Subject: [PATCH 66/83] Fix invitation links not working when invite request text is required (#15385) Fixes #15383 Co-authored-by: Claire --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 6088f1994..dd96bbf8c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -83,7 +83,7 @@ class User < ApplicationRecord has_one :invite_request, class_name: 'UserInviteRequest', inverse_of: :user, dependent: :destroy accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? && !Setting.require_invite_text } - validates :invite_request, presence: true, on: :create, if: -> { Setting.require_invite_text } + validates :invite_request, presence: true, on: :create, if: -> { Setting.require_invite_text && !invited? } validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale? validates_with BlacklistedEmailValidator, on: :create From 43961035a906cd8bccdf4c1ac023980b37823bb3 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 21 Dec 2020 18:22:17 +0100 Subject: [PATCH 67/83] Fix some notifications not being deleted on poll/status deletion (#15402) * Fix deleting polls not deleting notifications * Fix fav notification deletion when deleting a toot * Refactor DeleteAccountService spec * Add DeleteAccountService tests for other associations and notifications * Add favourite handling spec in status removal Co-authored-by: Claire --- app/models/status.rb | 2 +- app/services/delete_account_service.rb | 4 +- spec/services/delete_account_service_spec.rb | 116 ++++++++++--------- spec/services/remove_status_service_spec.rb | 14 ++- 4 files changed, 80 insertions(+), 56 deletions(-) diff --git a/app/models/status.rb b/app/models/status.rb index f1b3b75ce..96d90e1c2 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -56,7 +56,7 @@ class Status < ApplicationRecord belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true - has_many :favourites, inverse_of: :status, dependent: :delete_all + has_many :favourites, inverse_of: :status, dependent: :destroy has_many :bookmarks, inverse_of: :status, dependent: :destroy has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index fe9b30b17..fa834e775 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -123,7 +123,9 @@ class DeleteAccountService < BaseService next if @options[:reserve_username] && reported_status_ids.include?(poll.status_id) # We can safely delete the poll rather than destroy it, as any non-reported - # status should have been deleted already + # status should have been deleted already, as long as we take care of + # notifications. + Notification.where(poll: poll).delete_all poll.delete end diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb index d208b25b8..cd7d32d59 100644 --- a/spec/services/delete_account_service_spec.rb +++ b/spec/services/delete_account_service_spec.rb @@ -1,28 +1,31 @@ require 'rails_helper' RSpec.describe DeleteAccountService, type: :service do - describe '#call on local account' do - before do - stub_request(:post, "https://alice.com/inbox").to_return(status: 201) - stub_request(:post, "https://bob.com/inbox").to_return(status: 201) - end + shared_examples 'common behavior' do + let!(:status) { Fabricate(:status, account: account) } + let!(:mention) { Fabricate(:mention, account: local_follower) } + let!(:status_with_mention) { Fabricate(:status, account: account, mentions: [mention]) } + let!(:media_attachment) { Fabricate(:media_attachment, account: account) } + let!(:notification) { Fabricate(:notification, account: account) } + let!(:favourite) { Fabricate(:favourite, account: account, status: Fabricate(:status, account: local_follower)) } + let!(:poll) { Fabricate(:poll, account: account) } + let!(:poll_vote) { Fabricate(:poll_vote, account: local_follower, poll: poll) } + + let!(:active_relationship) { Fabricate(:follow, account: account, target_account: local_follower) } + let!(:passive_relationship) { Fabricate(:follow, account: local_follower, target_account: account) } + let!(:endorsement) { Fabricate(:account_pin, account: local_follower, target_account: account) } + + let!(:mention_notification) { Fabricate(:notification, account: local_follower, activity: mention, type: :mention) } + let!(:status_notification) { Fabricate(:notification, account: local_follower, activity: status, type: :status) } + let!(:poll_notification) { Fabricate(:notification, account: local_follower, activity: poll, type: :poll) } + let!(:favourite_notification) { Fabricate(:notification, account: local_follower, activity: favourite, type: :favourite) } + let!(:follow_notification) { Fabricate(:notification, account: local_follower, activity: active_relationship, type: :follow) } subject do -> { described_class.new.call(account) } end - let!(:account) { Fabricate(:account) } - let!(:status) { Fabricate(:status, account: account) } - let!(:media_attachment) { Fabricate(:media_attachment, account: account) } - let!(:notification) { Fabricate(:notification, account: account) } - let!(:favourite) { Fabricate(:favourite, account: account) } - let!(:active_relationship) { Fabricate(:follow, account: account) } - let!(:passive_relationship) { Fabricate(:follow, target_account: account) } - let!(:remote_alice) { Fabricate(:account, inbox_url: 'https://alice.com/inbox', protocol: :activitypub) } - let!(:remote_bob) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } - let!(:endorsment) { Fabricate(:account_pin, account: passive_relationship.account, target_account: account) } - - it 'deletes associated records' do + it 'deletes associated owned records' do is_expected.to change { [ account.statuses, @@ -31,15 +34,46 @@ RSpec.describe DeleteAccountService, type: :service do account.favourites, account.active_relationships, account.passive_relationships, - AccountPin.where(target_account: account), + account.polls, ].map(&:count) - }.from([1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0]) + }.from([2, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0]) end - it 'sends a delete actor activity to all known inboxes' do - subject.call - expect(a_request(:post, "https://alice.com/inbox")).to have_been_made.once - expect(a_request(:post, "https://bob.com/inbox")).to have_been_made.once + it 'deletes associated target records' do + is_expected.to change { + [ + AccountPin.where(target_account: account), + ].map(&:count) + }.from([1]).to([0]) + end + + it 'deletes associated target notifications' do + is_expected.to change { + [ + 'poll', 'favourite', 'status', 'mention', 'follow' + ].map { |type| Notification.where(type: type).count } + }.from([1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0]) + end + end + + describe '#call on local account' do + before do + stub_request(:post, "https://alice.com/inbox").to_return(status: 201) + stub_request(:post, "https://bob.com/inbox").to_return(status: 201) + end + + let!(:remote_alice) { Fabricate(:account, inbox_url: 'https://alice.com/inbox', protocol: :activitypub) } + let!(:remote_bob) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } + + include_examples 'common behavior' do + let!(:account) { Fabricate(:account) } + let!(:local_follower) { Fabricate(:account) } + + it 'sends a delete actor activity to all known inboxes' do + subject.call + expect(a_request(:post, "https://alice.com/inbox")).to have_been_made.once + expect(a_request(:post, "https://bob.com/inbox")).to have_been_made.once + end end end @@ -49,36 +83,14 @@ RSpec.describe DeleteAccountService, type: :service do stub_request(:post, "https://bob.com/inbox").to_return(status: 201) end - subject do - -> { described_class.new.call(remote_bob) } - end + include_examples 'common behavior' do + let!(:account) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } + let!(:local_follower) { Fabricate(:account) } - let!(:account) { Fabricate(:account) } - let!(:remote_alice) { Fabricate(:account, inbox_url: 'https://alice.com/inbox', protocol: :activitypub) } - let!(:remote_bob) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } - let!(:status) { Fabricate(:status, account: remote_bob) } - let!(:media_attachment) { Fabricate(:media_attachment, account: remote_bob) } - let!(:notification) { Fabricate(:notification, account: remote_bob) } - let!(:favourite) { Fabricate(:favourite, account: remote_bob) } - let!(:active_relationship) { Fabricate(:follow, account: remote_bob, target_account: account) } - let!(:passive_relationship) { Fabricate(:follow, target_account: remote_bob) } - - it 'deletes associated records' do - is_expected.to change { - [ - remote_bob.statuses, - remote_bob.media_attachments, - remote_bob.notifications, - remote_bob.favourites, - remote_bob.active_relationships, - remote_bob.passive_relationships, - ].map(&:count) - }.from([1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0]) - end - - it 'sends a reject follow to follwer inboxes' do - subject.call - expect(a_request(:post, remote_bob.inbox_url)).to have_been_made.once + it 'sends a reject follow to follwer inboxes' do + subject.call + expect(a_request(:post, account.inbox_url)).to have_been_made.once + end end end end diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb index 06676ec45..7ce75b2c7 100644 --- a/spec/services/remove_status_service_spec.rb +++ b/spec/services/remove_status_service_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe RemoveStatusService, type: :service do subject { RemoveStatusService.new } - let!(:alice) { Fabricate(:account) } + let!(:alice) { Fabricate(:account, user: Fabricate(:user)) } let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://example.com/salmon') } let!(:jeff) { Fabricate(:account) } let!(:hank) { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } @@ -17,23 +17,33 @@ RSpec.describe RemoveStatusService, type: :service do hank.follow!(alice) @status = PostStatusService.new.call(alice, text: 'Hello @bob@example.com') + FavouriteService.new.call(jeff, @status) Fabricate(:status, account: bill, reblog: @status, uri: 'hoge') - subject.call(@status) end it 'removes status from author\'s home feed' do + subject.call(@status) expect(HomeFeed.new(alice).get(10)).to_not include(@status.id) end it 'removes status from local follower\'s home feed' do + subject.call(@status) expect(HomeFeed.new(jeff).get(10)).to_not include(@status.id) end it 'sends delete activity to followers' do + subject.call(@status) expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.twice end it 'sends delete activity to rebloggers' do + subject.call(@status) expect(a_request(:post, 'http://example2.com/inbox')).to have_been_made end + + it 'remove status from notifications' do + expect { subject.call(@status) }.to change { + Notification.where(activity_type: 'Favourite', from_account: jeff, account: alice).count + }.from(1).to(0) + end end From 67ebd61f1180e63fcc671c583e7251e1e09755d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Dec 2020 05:12:11 +0100 Subject: [PATCH 68/83] Bump node-notifier from 8.0.0 to 8.0.1 (#15404) Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/mikaelbr/node-notifier/releases) - [Changelog](https://github.com/mikaelbr/node-notifier/blob/v8.0.1/CHANGELOG.md) - [Commits](https://github.com/mikaelbr/node-notifier/compare/v8.0.0...v8.0.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 653d67133..4aa8f6380 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7303,9 +7303,9 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.0.tgz#a7eee2d51da6d0f7ff5094bc7108c911240c1620" - integrity sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA== + version "8.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" + integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== dependencies: growly "^1.3.0" is-wsl "^2.2.0" @@ -9551,9 +9551,11 @@ semver@^6.0.0, semver@^6.3.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" send@0.17.1: version "0.17.1" @@ -10845,9 +10847,9 @@ uuid@^3.3.2, uuid@^3.4.0: integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^8.3.0, uuid@^8.3.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" - integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: version "2.2.0" From 9915d11c0d7a15b6775af8e78fcc4d836368f88d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 22 Dec 2020 17:13:55 +0100 Subject: [PATCH 69/83] Fix unnecessary queries when batch-removing statuses, 100x faster (#15387) --- app/models/favourite.rb | 2 +- app/models/status.rb | 12 +- app/services/batched_remove_status_service.rb | 91 +++++++------ app/services/delete_account_service.rb | 128 ++++++++++++++---- config/initializers/chewy.rb | 5 + lib/chewy/strategy/custom_sidekiq.rb | 25 +--- .../batched_remove_status_service_spec.rb | 5 + 7 files changed, 168 insertions(+), 100 deletions(-) diff --git a/app/models/favourite.rb b/app/models/favourite.rb index bf0ec4449..35028b7dd 100644 --- a/app/models/favourite.rb +++ b/app/models/favourite.rb @@ -36,7 +36,7 @@ class Favourite < ApplicationRecord end def decrement_cache_counters - return if association(:status).loaded? && (status.marked_for_destruction? || status.marked_for_mass_destruction?) + return if association(:status).loaded? && status.marked_for_destruction? status&.decrement_count!(:favourites_count) end end diff --git a/app/models/status.rb b/app/models/status.rb index 96d90e1c2..b426f9d5b 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -228,14 +228,6 @@ class Status < ApplicationRecord @emojis = CustomEmoji.from_text(fields.join(' '), account.domain) end - def mark_for_mass_destruction! - @marked_for_mass_destruction = true - end - - def marked_for_mass_destruction? - @marked_for_mass_destruction - end - def replies_count status_stat&.replies_count || 0 end @@ -430,7 +422,7 @@ class Status < ApplicationRecord end def decrement_counter_caches - return if direct_visibility? || marked_for_mass_destruction? + return if direct_visibility? account&.decrement_count!(:statuses_count) reblog&.decrement_count!(:reblogs_count) if reblog? @@ -440,7 +432,7 @@ class Status < ApplicationRecord def unlink_from_conversations return unless direct_visibility? - mentioned_accounts = mentions.includes(:account).map(&:account) + mentioned_accounts = (association(:mentions).loaded? ? mentions : mentions.includes(:account)).map(&:account) inbox_owners = mentioned_accounts.select(&:local?) + (account.local? ? [account] : []) inbox_owners.each do |inbox_owner| diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index 28e5468b3..63ab89f2d 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -3,29 +3,45 @@ class BatchedRemoveStatusService < BaseService include Redisable - # Delete given statuses and reblogs of them - # Remove statuses from home feeds - # Push delete events to streaming API for home feeds and public feeds - # @param [Enumerable] statuses A preferably batched array of statuses + # Delete multiple statuses and reblogs of them as efficiently as possible + # @param [Enumerable] statuses An array of statuses # @param [Hash] options - # @option [Boolean] :skip_side_effects + # @option [Boolean] :skip_side_effects Do not modify feeds and send updates to streaming API def call(statuses, **options) - statuses = Status.where(id: statuses.map(&:id)).includes(:account).flat_map { |status| [status] + status.reblogs.includes(:account).to_a } + ActiveRecord::Associations::Preloader.new.preload(statuses, options[:skip_side_effects] ? :reblogs : [:account, reblogs: :account]) - @mentions = statuses.each_with_object({}) { |s, h| h[s.id] = s.active_mentions.includes(:account).to_a } - @tags = statuses.each_with_object({}) { |s, h| h[s.id] = s.tags.pluck(:name) } + statuses_and_reblogs = statuses.flat_map { |status| [status] + status.reblogs } - @json_payloads = statuses.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) } + # The conversations for direct visibility statuses also need + # to be manually updated. This part is not efficient but we + # rely on direct visibility statuses being relatively rare. + statuses_with_account_conversations = statuses.select(&:direct_visibility?) - statuses.each do |status| - status.mark_for_mass_destruction! - status.destroy + ActiveRecord::Associations::Preloader.new.preload(statuses_with_account_conversations, [mentions: :account]) + + statuses_with_account_conversations.each do |status| + status.send(:unlink_from_conversations) end + # We do not batch all deletes into one to avoid having a long-running + # transaction lock the database, but we use the delete method instead + # of destroy to avoid all callbacks. We rely on foreign keys to + # cascade the delete faster without loading the associations. + statuses_and_reblogs.each(&:delete) + + # Since we skipped all callbacks, we also need to manually + # deindex the statuses + Chewy.strategy.current.update(StatusesIndex, statuses_and_reblogs) + return if options[:skip_side_effects] + ActiveRecord::Associations::Preloader.new.preload(statuses_and_reblogs, :tags) + + @tags = statuses_and_reblogs.each_with_object({}) { |s, h| h[s.id] = s.tags.map { |tag| tag.name.mb_chars.downcase } } + @json_payloads = statuses_and_reblogs.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) } + # Batch by source account - statuses.group_by(&:account_id).each_value do |account_statuses| + statuses_and_reblogs.group_by(&:account_id).each_value do |account_statuses| account = account_statuses.first.account next unless account @@ -35,27 +51,31 @@ class BatchedRemoveStatusService < BaseService end # Cannot be batched - statuses.each do |status| - unpush_from_public_timelines(status) + redis.pipelined do + statuses_and_reblogs.each do |status| + unpush_from_public_timelines(status) + end end end private def unpush_from_home_timelines(account, statuses) - recipients = account.followers_for_local_distribution.to_a - - recipients << account if account.local? - - recipients.each do |follower| + account.followers_for_local_distribution.includes(:user).find_each do |follower| statuses.each do |status| FeedManager.instance.unpush_from_home(follower, status) end end + + return unless account.local? + + statuses.each do |status| + FeedManager.instance.unpush_from_home(account, status) + end end def unpush_from_list_timelines(account, statuses) - account.lists_for_local_distribution.select(:id, :account_id).each do |list| + account.lists_for_local_distribution.select(:id, :account_id).includes(account: :user).find_each do |list| statuses.each do |status| FeedManager.instance.unpush_from_list(list, status) end @@ -67,26 +87,17 @@ class BatchedRemoveStatusService < BaseService payload = @json_payloads[status.id] - redis.pipelined do - redis.publish('timeline:public', payload) - if status.local? - redis.publish('timeline:public:local', payload) - else - redis.publish('timeline:public:remote', payload) - end - if status.media_attachments.any? - redis.publish('timeline:public:media', payload) - if status.local? - redis.publish('timeline:public:local:media', payload) - else - redis.publish('timeline:public:remote:media', payload) - end - end + redis.publish('timeline:public', payload) + redis.publish(status.local? ? 'timeline:public:local' : 'timeline:public:remote', payload) - @tags[status.id].each do |hashtag| - redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}", payload) - redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}:local", payload) if status.local? - end + if status.media_attachments.any? + redis.publish('timeline:public:media', payload) + redis.publish(status.local? ? 'timeline:public:local:media' : 'timeline:public:remote:media', payload) + end + + @tags[status.id].each do |hashtag| + redis.publish("timeline:hashtag:#{hashtag}", payload) + redis.publish("timeline:hashtag:#{hashtag}:local", payload) if status.local? end end end diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index fa834e775..5123a4697 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -6,15 +6,21 @@ class DeleteAccountService < BaseService ASSOCIATIONS_ON_SUSPEND = %w( account_pins active_relationships + aliases block_relationships blocked_by_relationships + bookmarks conversation_mutes conversations custom_filters + devices domain_blocks favourites + featured_tags follow_requests + identity_proofs list_accounts + migrations mute_relationships muted_by_relationships notifications @@ -25,6 +31,29 @@ class DeleteAccountService < BaseService status_pins ).freeze + # The following associations have no important side-effects + # in callbacks and all of their own associations are secured + # by foreign keys, making them safe to delete without loading + # into memory + ASSOCIATIONS_WITHOUT_SIDE_EFFECTS = %w( + account_pins + aliases + conversation_mutes + conversations + custom_filters + devices + domain_blocks + featured_tags + follow_requests + identity_proofs + migrations + mute_relationships + muted_by_relationships + notifications + scheduled_statuses + status_pins + ) + ASSOCIATIONS_ON_DESTROY = %w( reports targeted_moderation_notes @@ -55,19 +84,25 @@ class DeleteAccountService < BaseService @options[:skip_activitypub] = true if @options[:skip_side_effects] - reject_follows! - undo_follows! - purge_user! - purge_profile! + distribute_activities! purge_content! fulfill_deletion_request! end private - def reject_follows! - return if @account.local? || !@account.activitypub? || @options[:skip_activitypub] + def distribute_activities! + return if skip_activitypub? + if @account.local? + delete_actor! + elsif @account.activitypub? + reject_follows! + undo_follows! + end + end + + def reject_follows! # When deleting a remote account, the account obviously doesn't # actually become deleted on its origin server, i.e. unlike a # locally deleted account it continues to have access to its home @@ -81,8 +116,6 @@ class DeleteAccountService < BaseService end def undo_follows! - return if @account.local? || !@account.activitypub? || @options[:skip_activitypub] - # When deleting a remote account, the account obviously doesn't # actually become deleted on its origin server, but following relationships # are severed on our end. Therefore, make the remote server aware that the @@ -97,7 +130,7 @@ class DeleteAccountService < BaseService def purge_user! return if !@account.local? || @account.user.nil? - if @options[:reserve_email] + if keep_user_record? @account.user.disable! @account.user.invites.where(uses: 0).destroy_all else @@ -106,34 +139,52 @@ class DeleteAccountService < BaseService end def purge_content! - distribute_delete_actor! if @account.local? && !@options[:skip_side_effects] + purge_user! + purge_profile! + purge_statuses! + purge_media_attachments! + purge_polls! + purge_generated_notifications! + purge_other_associations! + @account.destroy unless keep_account_record? + end + + def purge_statuses! @account.statuses.reorder(nil).find_in_batches do |statuses| - statuses.reject! { |status| reported_status_ids.include?(status.id) } if @options[:reserve_username] - BatchedRemoveStatusService.new.call(statuses, skip_side_effects: @options[:skip_side_effects]) - end + statuses.reject! { |status| reported_status_ids.include?(status.id) } if keep_account_record? + BatchedRemoveStatusService.new.call(statuses, skip_side_effects: skip_side_effects?) + end + end + + def purge_media_attachments! @account.media_attachments.reorder(nil).find_each do |media_attachment| - next if @options[:reserve_username] && reported_status_ids.include?(media_attachment.status_id) + next if keep_account_record? && reported_status_ids.include?(media_attachment.status_id) media_attachment.destroy end + end + def purge_polls! @account.polls.reorder(nil).find_each do |poll| - next if @options[:reserve_username] && reported_status_ids.include?(poll.status_id) + next if keep_account_record? && reported_status_ids.include?(poll.status_id) - # We can safely delete the poll rather than destroy it, as any non-reported - # status should have been deleted already, as long as we take care of - # notifications. - Notification.where(poll: poll).delete_all poll.delete end + end + def purge_generated_notifications! + # By deleting polls and statuses without callbacks, we've left behind + # polymorphically associated notifications generated by this account + + Notification.where(from_account: @account).in_batches.delete_all + end + + def purge_other_associations! associations_for_destruction.each do |association_name| - destroy_all(@account.public_send(association_name)) + purge_association(association_name) end - - @account.destroy unless @options[:reserve_username] end def purge_profile! @@ -141,7 +192,7 @@ class DeleteAccountService < BaseService # there is no point wasting time updating # its values first - return unless @options[:reserve_username] + return unless keep_account_record? @account.silenced_at = nil @account.suspended_at = @options[:suspended_at] || Time.now.utc @@ -156,6 +207,7 @@ class DeleteAccountService < BaseService @account.followers_count = 0 @account.following_count = 0 @account.moved_to_account = nil + @account.also_known_as = [] @account.trust_level = :untrusted @account.avatar.destroy @account.header.destroy @@ -166,11 +218,17 @@ class DeleteAccountService < BaseService @account.deletion_request&.destroy end - def destroy_all(association) - association.in_batches.destroy_all + def purge_association(association_name) + association = @account.public_send(association_name) + + if ASSOCIATIONS_WITHOUT_SIDE_EFFECTS.include?(association_name) + association.in_batches.delete_all + else + association.in_batches.destroy_all + end end - def distribute_delete_actor! + def delete_actor! ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url| [delete_actor_json, @account.id, inbox_url] end @@ -197,10 +255,26 @@ class DeleteAccountService < BaseService end def associations_for_destruction - if @options[:reserve_username] + if keep_account_record? ASSOCIATIONS_ON_SUSPEND else ASSOCIATIONS_ON_SUSPEND + ASSOCIATIONS_ON_DESTROY end end + + def keep_user_record? + @options[:reserve_email] + end + + def keep_account_record? + @options[:reserve_username] + end + + def skip_side_effects? + @options[:skip_side_effects] + end + + def skip_activitypub? + @options[:skip_activitypub] + end end diff --git a/config/initializers/chewy.rb b/config/initializers/chewy.rb index 8f54abf77..9fc9b2f1a 100644 --- a/config/initializers/chewy.rb +++ b/config/initializers/chewy.rb @@ -12,6 +12,10 @@ Chewy.settings = { sidekiq: { queue: 'pull' }, } +# We use our own async strategy even outside the request-response +# cycle, which takes care of checking if ElasticSearch is enabled +# or not. However, mind that for the Rails console, the :urgent +# strategy is set automatically with no way to override it. Chewy.root_strategy = :custom_sidekiq Chewy.request_strategy = :custom_sidekiq Chewy.use_after_commit_callbacks = false @@ -37,6 +41,7 @@ Elasticsearch::Transport::Client.prepend Module.new { super arguments end } + Elasticsearch::API::Indices::IndicesClient.prepend Module.new { def create(arguments = {}) arguments[:include_type_name] = true diff --git a/lib/chewy/strategy/custom_sidekiq.rb b/lib/chewy/strategy/custom_sidekiq.rb index 3e54326ba..794ae4ed4 100644 --- a/lib/chewy/strategy/custom_sidekiq.rb +++ b/lib/chewy/strategy/custom_sidekiq.rb @@ -2,29 +2,10 @@ module Chewy class Strategy - class CustomSidekiq < Base - class Worker - include ::Sidekiq::Worker - - sidekiq_options queue: 'pull' - - def perform(type, ids, options = {}) - options[:refresh] = !Chewy.disable_refresh_async if Chewy.disable_refresh_async - type.constantize.import!(ids, options) - end + class CustomSidekiq < Sidekiq + def update(_type, _objects, _options = {}) + super if Chewy.enabled? end - - def update(type, objects, _options = {}) - return unless Chewy.enabled? - - ids = type.root.id ? Array.wrap(objects) : type.adapter.identify(objects) - - return if ids.empty? - - Worker.perform_async(type.name, ids) - end - - def leave; end end end end diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb index f84256f18..239859f06 100644 --- a/spec/services/batched_remove_status_service_spec.rb +++ b/spec/services/batched_remove_status_service_spec.rb @@ -26,6 +26,11 @@ RSpec.describe BatchedRemoveStatusService, type: :service do subject.call([status1, status2]) end + it 'removes statuses' do + expect { Status.find(status1.id) }.to raise_error ActiveRecord::RecordNotFound + expect { Status.find(status2.id) }.to raise_error ActiveRecord::RecordNotFound + end + it 'removes statuses from author\'s home feed' do expect(HomeFeed.new(alice).get(10)).to_not include([status1.id, status2.id]) end From 1cf2c3a810bba937c7702c342a3ff37c3d37391a Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 22 Dec 2020 17:14:32 +0100 Subject: [PATCH 70/83] Fix external user creation failing when invite request text is required (#15405) * Fix external user creation failing when invite request text is required Also fixes tootctl-based user creation. * Add test about invites when invite request text is otherwise required Co-authored-by: Claire --- app/models/user.rb | 12 ++++++++++-- lib/mastodon/accounts_cli.rb | 2 +- lib/tasks/mastodon.rake | 2 +- .../auth/registrations_controller_spec.rb | 5 ++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index dd96bbf8c..f8c8a6ab5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -83,7 +83,7 @@ class User < ApplicationRecord has_one :invite_request, class_name: 'UserInviteRequest', inverse_of: :user, dependent: :destroy accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? && !Setting.require_invite_text } - validates :invite_request, presence: true, on: :create, if: -> { Setting.require_invite_text && !invited? } + validates :invite_request, presence: true, on: :create, if: :invite_text_required? validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale? validates_with BlacklistedEmailValidator, on: :create @@ -128,7 +128,7 @@ class User < ApplicationRecord to: :settings, prefix: :setting, allow_nil: false attr_reader :invite_code, :sign_in_token_attempt - attr_writer :external + attr_writer :external, :bypass_invite_request_check def confirmed? confirmed_at.present? @@ -429,6 +429,10 @@ class User < ApplicationRecord !!@external end + def bypass_invite_request_check? + @bypass_invite_request_check + end + def sanitize_languages return if chosen_languages.nil? chosen_languages.reject!(&:blank?) @@ -466,4 +470,8 @@ class User < ApplicationRecord def validate_email_dns? email_changed? && !(Rails.env.test? || Rails.env.development?) end + + def invite_text_required? + Setting.require_invite_text && !invited? && !external? && !bypass_invite_request_check? + end end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 5275f04cf..cdd1db995 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -77,7 +77,7 @@ module Mastodon def create(username) account = Account.new(username: username) password = SecureRandom.hex - user = User.new(email: options[:email], password: password, agreement: true, approved: true, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: options[:confirmed] ? Time.now.utc : nil) + user = User.new(email: options[:email], password: password, agreement: true, approved: true, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: options[:confirmed] ? Time.now.utc : nil, bypass_invite_request_check: true) if options[:reattach] account = Account.find_local(username) || Account.new(username: username) diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 9e80989ef..2ad1e778b 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -412,7 +412,7 @@ namespace :mastodon do password = SecureRandom.hex(16) - user = User.new(admin: true, email: email, password: password, confirmed_at: Time.now.utc, account_attributes: { username: username }) + user = User.new(admin: true, email: email, password: password, confirmed_at: Time.now.utc, account_attributes: { username: username }, bypass_invite_request_check: true) user.save(validate: false) prompt.ok "You can login with the password: #{password}" diff --git a/spec/controllers/auth/registrations_controller_spec.rb b/spec/controllers/auth/registrations_controller_spec.rb index c701a3b8b..ccf304a93 100644 --- a/spec/controllers/auth/registrations_controller_spec.rb +++ b/spec/controllers/auth/registrations_controller_spec.rb @@ -195,16 +195,19 @@ RSpec.describe Auth::RegistrationsController, type: :controller do end end - context 'approval-based registrations with valid invite' do + context 'approval-based registrations with valid invite and required invite text' do around do |example| registrations_mode = Setting.registrations_mode + require_invite_text = Setting.require_invite_text example.run + Setting.require_invite_text = require_invite_text Setting.registrations_mode = registrations_mode end subject do inviter = Fabricate(:user, confirmed_at: 2.days.ago) Setting.registrations_mode = 'approved' + Setting.require_invite_text = true request.headers["Accept-Language"] = accept_language invite = Fabricate(:invite, user: inviter, max_uses: nil, expires_at: 1.hour.from_now) post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', 'invite_code': invite.code, agreement: 'true' } } From f18349640b686a3c3866711bfcd1d14edd5bc41a Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 22 Dec 2020 20:24:55 +0100 Subject: [PATCH 71/83] Fix batch order warnings in BatchedRemoveStatusService (#15409) Co-authored-by: Claire --- app/services/batched_remove_status_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index 63ab89f2d..3ec000110 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -61,7 +61,7 @@ class BatchedRemoveStatusService < BaseService private def unpush_from_home_timelines(account, statuses) - account.followers_for_local_distribution.includes(:user).find_each do |follower| + account.followers_for_local_distribution.includes(:user).reorder(nil).find_each do |follower| statuses.each do |status| FeedManager.instance.unpush_from_home(follower, status) end @@ -75,7 +75,7 @@ class BatchedRemoveStatusService < BaseService end def unpush_from_list_timelines(account, statuses) - account.lists_for_local_distribution.select(:id, :account_id).includes(account: :user).find_each do |list| + account.lists_for_local_distribution.select(:id, :account_id).includes(account: :user).reorder(nil).find_each do |list| statuses.each do |status| FeedManager.instance.unpush_from_list(list, status) end From 3249d35bdcd9a495af3277dfb4b2129d7ef80f15 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 22 Dec 2020 23:57:46 +0100 Subject: [PATCH 72/83] Improve account deletion performances further (#15407) * Delete status records by batches of 50 * Do not precompute values that are only used once * Do not generate redis events for removal of public toots older than two weeks * Filter reported toots a priori for polls and status deletion * Do not process reblogs when cleaning up public timelines As in Mastodon proper, reblogs don't appear in public TLs * Clean the deleted account's own feed in one go * Refactor Account#clean_feed_manager and List#clean_feed_manager * Delete instead of destroy a few more associations * Fix preloading Co-authored-by: Claire --- app/lib/feed_manager.rb | 30 +++++++++++++++++++ app/models/account.rb | 13 +------- app/models/list.rb | 13 +------- app/services/batched_remove_status_service.rb | 24 +++++---------- app/services/delete_account_service.rb | 20 ++++++++----- .../scheduler/feed_cleanup_scheduler.rb | 30 ++----------------- .../batched_remove_status_service_spec.rb | 4 --- 7 files changed, 53 insertions(+), 81 deletions(-) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 5e01ef67a..f0ad3e21f 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -230,6 +230,36 @@ class FeedManager end end + # Completely clear multiple feeds at once + # @param [Symbol] type + # @param [Array] ids + # @return [void] + def clean_feeds!(type, ids) + reblogged_id_sets = {} + + redis.pipelined do + ids.each do |feed_id| + redis.del(key(type, feed_id)) + reblog_key = key(type, feed_id, 'reblogs') + # We collect a future for this: we don't block while getting + # it, but we can iterate over it later. + reblogged_id_sets[feed_id] = redis.zrange(reblog_key, 0, -1) + redis.del(reblog_key) + end + end + + # Remove all of the reblog tracking keys we just removed the + # references to. + redis.pipelined do + reblogged_id_sets.each do |feed_id, future| + future.value.each do |reblogged_id| + reblog_set_key = key(type, feed_id, "reblogs:#{reblogged_id}") + redis.del(reblog_set_key) + end + end + end + end + private # Trim a feed to maximum size by removing older items diff --git a/app/models/account.rb b/app/models/account.rb index 80eb92a71..e6cf03fa8 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -578,17 +578,6 @@ class Account < ApplicationRecord end def clean_feed_manager - reblog_key = FeedManager.instance.key(:home, id, 'reblogs') - reblogged_id_set = Redis.current.zrange(reblog_key, 0, -1) - - Redis.current.pipelined do - Redis.current.del(FeedManager.instance.key(:home, id)) - Redis.current.del(reblog_key) - - reblogged_id_set.each do |reblogged_id| - reblog_set_key = FeedManager.instance.key(:home, id, "reblogs:#{reblogged_id}") - Redis.current.del(reblog_set_key) - end - end + FeedManager.instance.clean_feeds!(:home, [id]) end end diff --git a/app/models/list.rb b/app/models/list.rb index 655d55ff6..cdc6ebdb3 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -34,17 +34,6 @@ class List < ApplicationRecord private def clean_feed_manager - reblog_key = FeedManager.instance.key(:list, id, 'reblogs') - reblogged_id_set = Redis.current.zrange(reblog_key, 0, -1) - - Redis.current.pipelined do - Redis.current.del(FeedManager.instance.key(:list, id)) - Redis.current.del(reblog_key) - - reblogged_id_set.each do |reblogged_id| - reblog_set_key = FeedManager.instance.key(:list, id, "reblogs:#{reblogged_id}") - Redis.current.del(reblog_set_key) - end - end + FeedManager.instance.clean_feeds!(:list, [id]) end end diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index 3ec000110..61617d958 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -8,7 +8,7 @@ class BatchedRemoveStatusService < BaseService # @param [Hash] options # @option [Boolean] :skip_side_effects Do not modify feeds and send updates to streaming API def call(statuses, **options) - ActiveRecord::Associations::Preloader.new.preload(statuses, options[:skip_side_effects] ? :reblogs : [:account, reblogs: :account]) + ActiveRecord::Associations::Preloader.new.preload(statuses, options[:skip_side_effects] ? :reblogs : [:account, :tags, reblogs: :account]) statuses_and_reblogs = statuses.flat_map { |status| [status] + status.reblogs } @@ -27,7 +27,7 @@ class BatchedRemoveStatusService < BaseService # transaction lock the database, but we use the delete method instead # of destroy to avoid all callbacks. We rely on foreign keys to # cascade the delete faster without loading the associations. - statuses_and_reblogs.each(&:delete) + statuses_and_reblogs.each_slice(50) { |slice| Status.where(id: slice.map(&:id)).delete_all } # Since we skipped all callbacks, we also need to manually # deindex the statuses @@ -35,11 +35,6 @@ class BatchedRemoveStatusService < BaseService return if options[:skip_side_effects] - ActiveRecord::Associations::Preloader.new.preload(statuses_and_reblogs, :tags) - - @tags = statuses_and_reblogs.each_with_object({}) { |s, h| h[s.id] = s.tags.map { |tag| tag.name.mb_chars.downcase } } - @json_payloads = statuses_and_reblogs.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) } - # Batch by source account statuses_and_reblogs.group_by(&:account_id).each_value do |account_statuses| account = account_statuses.first.account @@ -51,8 +46,9 @@ class BatchedRemoveStatusService < BaseService end # Cannot be batched + @status_id_cutoff = Mastodon::Snowflake.id_at(2.weeks.ago) redis.pipelined do - statuses_and_reblogs.each do |status| + statuses.each do |status| unpush_from_public_timelines(status) end end @@ -66,12 +62,6 @@ class BatchedRemoveStatusService < BaseService FeedManager.instance.unpush_from_home(follower, status) end end - - return unless account.local? - - statuses.each do |status| - FeedManager.instance.unpush_from_home(account, status) - end end def unpush_from_list_timelines(account, statuses) @@ -83,9 +73,9 @@ class BatchedRemoveStatusService < BaseService end def unpush_from_public_timelines(status) - return unless status.public_visibility? + return unless status.public_visibility? && status.id > @status_id_cutoff - payload = @json_payloads[status.id] + payload = Oj.dump(event: :delete, payload: status.id.to_s) redis.publish('timeline:public', payload) redis.publish(status.local? ? 'timeline:public:local' : 'timeline:public:remote', payload) @@ -95,7 +85,7 @@ class BatchedRemoveStatusService < BaseService redis.publish(status.local? ? 'timeline:public:local:media' : 'timeline:public:remote:media', payload) end - @tags[status.id].each do |hashtag| + status.tags.map { |tag| tag.name.mb_chars.downcase }.each do |hashtag| redis.publish("timeline:hashtag:#{hashtag}", payload) redis.publish("timeline:hashtag:#{hashtag}:local", payload) if status.local? end diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index 5123a4697..58f6ef2ab 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -46,10 +46,12 @@ class DeleteAccountService < BaseService featured_tags follow_requests identity_proofs + list_accounts migrations mute_relationships muted_by_relationships notifications + owned_lists scheduled_statuses status_pins ) @@ -145,15 +147,14 @@ class DeleteAccountService < BaseService purge_media_attachments! purge_polls! purge_generated_notifications! + purge_feeds! purge_other_associations! @account.destroy unless keep_account_record? end def purge_statuses! - @account.statuses.reorder(nil).find_in_batches do |statuses| - statuses.reject! { |status| reported_status_ids.include?(status.id) } if keep_account_record? - + @account.statuses.reorder(nil).where.not(id: reported_status_ids).in_batches do |statuses| BatchedRemoveStatusService.new.call(statuses, skip_side_effects: skip_side_effects?) end end @@ -167,11 +168,7 @@ class DeleteAccountService < BaseService end def purge_polls! - @account.polls.reorder(nil).find_each do |poll| - next if keep_account_record? && reported_status_ids.include?(poll.status_id) - - poll.delete - end + @account.polls.reorder(nil).where.not(status_id: reported_status_ids).in_batches.delete_all end def purge_generated_notifications! @@ -187,6 +184,13 @@ class DeleteAccountService < BaseService end end + def purge_feeds! + return unless @account.local? + + FeedManager.instance.clean_feeds!(:home, [@account.id]) + FeedManager.instance.clean_feeds!(:list, @account.owned_lists.pluck(:id)) + end + def purge_profile! # If the account is going to be destroyed # there is no point wasting time updating diff --git a/app/workers/scheduler/feed_cleanup_scheduler.rb b/app/workers/scheduler/feed_cleanup_scheduler.rb index 458fe6193..42b29f4ec 100644 --- a/app/workers/scheduler/feed_cleanup_scheduler.rb +++ b/app/workers/scheduler/feed_cleanup_scheduler.rb @@ -14,37 +14,11 @@ class Scheduler::FeedCleanupScheduler private def clean_home_feeds! - clean_feeds!(inactive_account_ids, :home) + feed_manager.clean_feeds!(:home, inactive_account_ids) end def clean_list_feeds! - clean_feeds!(inactive_list_ids, :list) - end - - def clean_feeds!(ids, type) - reblogged_id_sets = {} - - redis.pipelined do - ids.each do |feed_id| - redis.del(feed_manager.key(type, feed_id)) - reblog_key = feed_manager.key(type, feed_id, 'reblogs') - # We collect a future for this: we don't block while getting - # it, but we can iterate over it later. - reblogged_id_sets[feed_id] = redis.zrange(reblog_key, 0, -1) - redis.del(reblog_key) - end - end - - # Remove all of the reblog tracking keys we just removed the - # references to. - redis.pipelined do - reblogged_id_sets.each do |feed_id, future| - future.value.each do |reblogged_id| - reblog_set_key = feed_manager.key(type, feed_id, "reblogs:#{reblogged_id}") - redis.del(reblog_set_key) - end - end - end + feed_manager.clean_feeds!(:list, inactive_list_ids) end def inactive_account_ids diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb index 239859f06..c1f54a6fd 100644 --- a/spec/services/batched_remove_status_service_spec.rb +++ b/spec/services/batched_remove_status_service_spec.rb @@ -43,10 +43,6 @@ RSpec.describe BatchedRemoveStatusService, type: :service do expect(Redis.current).to have_received(:publish).with("timeline:#{jeff.id}", any_args).at_least(:once) end - it 'notifies streaming API of author' do - expect(Redis.current).to have_received(:publish).with("timeline:#{alice.id}", any_args).at_least(:once) - end - it 'notifies streaming API of public timeline' do expect(Redis.current).to have_received(:publish).with('timeline:public', any_args).at_least(:once) end From 2ab3e91eaf6c386f3933d79007ca87215397f06c Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 23 Dec 2020 00:04:52 +0100 Subject: [PATCH 73/83] Fix BatchedRemoveStatusService not working without ES in rails console (#15408) Not a huge deal but may cause surprising failures in custom scripts and development. Co-authored-by: Claire --- app/services/batched_remove_status_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index 61617d958..5000062e4 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -31,7 +31,7 @@ class BatchedRemoveStatusService < BaseService # Since we skipped all callbacks, we also need to manually # deindex the statuses - Chewy.strategy.current.update(StatusesIndex, statuses_and_reblogs) + Chewy.strategy.current.update(StatusesIndex, statuses_and_reblogs) if Chewy.enabled? return if options[:skip_side_effects] From 62e42bd15be081596773d2b29009e437ebf27d8b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 23 Dec 2020 00:10:58 +0100 Subject: [PATCH 74/83] New Crowdin updates (#15369) * New translations doorkeeper.en.yml (Esperanto) [ci skip] * New translations doorkeeper.en.yml (Albanian) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations doorkeeper.en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Romanian) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Romanian) [ci skip] * New translations en.yml (Tatar) [ci skip] * New translations en.json (Tatar) [ci skip] * New translations en.yml (Standard Moroccan Tamazight) [ci skip] * New translations en.json (Standard Moroccan Tamazight) [ci skip] * New translations doorkeeper.en.yml (Sardinian) [ci skip] * New translations en.yml (Romanian) [ci skip] * New translations doorkeeper.en.yml (Romanian) [ci skip] * New translations doorkeeper.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations simple_form.en.yml (Catalan) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations doorkeeper.en.yml (Bulgarian) [ci skip] * New translations simple_form.en.yml (Bulgarian) [ci skip] * New translations en.yml (Bulgarian) [ci skip] * New translations doorkeeper.en.yml (Arabic) [ci skip] * New translations en.yml (French) [ci skip] * New translations simple_form.en.yml (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations doorkeeper.en.yml (French) [ci skip] * New translations doorkeeper.en.yml (Sorani (Kurdish)) [ci skip] * New translations doorkeeper.en.yml (Vietnamese) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.json (Swedish) [ci skip] * New translations simple_form.en.yml (Chinese Simplified) [ci skip] * New translations en.json (Kabyle) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Sardinian) [ci skip] * New translations en.yml (Sardinian) [ci skip] * New translations en.json (Sardinian) [ci skip] * New translations simple_form.en.yml (Sorani (Kurdish)) [ci skip] * New translations en.yml (Sorani (Kurdish)) [ci skip] * New translations en.json (Sorani (Kurdish)) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations doorkeeper.en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations doorkeeper.en.yml (Norwegian) [ci skip] * New translations simple_form.en.yml (Norwegian) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.json (Norwegian) [ci skip] * New translations doorkeeper.en.yml (Dutch) [ci skip] * New translations en.yml (Macedonian) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations en.json (Macedonian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.json (Lithuanian) [ci skip] * New translations doorkeeper.en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations doorkeeper.en.yml (Polish) [ci skip] * New translations doorkeeper.en.yml (Georgian) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations doorkeeper.en.yml (Slovenian) [ci skip] * New translations simple_form.en.yml (Slovenian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.json (Slovenian) [ci skip] * New translations doorkeeper.en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (Slovak) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations doorkeeper.en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations doorkeeper.en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Georgian) [ci skip] * New translations doorkeeper.en.yml (Czech) [ci skip] * New translations doorkeeper.en.yml (Greek) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations doorkeeper.en.yml (Basque) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.json (Basque) [ci skip] * New translations en.json (Greek) [ci skip] * New translations doorkeeper.en.yml (Finnish) [ci skip] * New translations doorkeeper.en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations doorkeeper.en.yml (Danish) [ci skip] * New translations simple_form.en.yml (Danish) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.json (Danish) [ci skip] * New translations simple_form.en.yml (Finnish) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.json (Georgian) [ci skip] * New translations doorkeeper.en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations doorkeeper.en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations doorkeeper.en.yml (Armenian) [ci skip] * New translations en.yml (Hebrew) [ci skip] * New translations simple_form.en.yml (Armenian) [ci skip] * New translations doorkeeper.en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations doorkeeper.en.yml (Hebrew) [ci skip] * New translations simple_form.en.yml (Hebrew) [ci skip] * New translations simple_form.en.yml (Vietnamese) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.json (French) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations en.json (French) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (German) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (German) [ci skip] * New translations devise.en.yml (German) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations simple_form.en.yml (Armenian) [ci skip] * New translations simple_form.en.yml (Armenian) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.json (Chinese Simplified) [ci skip] * New translations en.json (Chinese Simplified) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations simple_form.en.yml (Malayalam) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations devise.en.yml (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations devise.en.yml (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations devise.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations devise.en.yml (Chinese Traditional) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations en.yml (Malayalam) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations activerecord.en.yml (Kabyle) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Esperanto) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/de.json | 12 +- app/javascript/mastodon/locales/eo.json | 10 +- app/javascript/mastodon/locales/fr.json | 2 +- app/javascript/mastodon/locales/hr.json | 20 +- app/javascript/mastodon/locales/hy.json | 10 +- app/javascript/mastodon/locales/ml.json | 264 ++++++++++----------- app/javascript/mastodon/locales/nl.json | 12 +- app/javascript/mastodon/locales/oc.json | 12 +- app/javascript/mastodon/locales/tr.json | 4 +- app/javascript/mastodon/locales/vi.json | 2 +- app/javascript/mastodon/locales/zh-CN.json | 22 +- app/javascript/mastodon/locales/zh-TW.json | 256 ++++++++++---------- config/locales/activerecord.kab.yml | 2 +- config/locales/ca.yml | 1 + config/locales/de.yml | 5 + config/locales/devise.zh-TW.yml | 30 +-- config/locales/el.yml | 1 + config/locales/es-AR.yml | 1 + config/locales/es.yml | 1 + config/locales/fr.yml | 1 + config/locales/gl.yml | 5 + config/locales/hu.yml | 41 ++-- config/locales/hy.yml | 48 +++- config/locales/id.yml | 1 + config/locales/is.yml | 1 + config/locales/it.yml | 1 + config/locales/ko.yml | 4 + config/locales/ml.yml | 89 ++++++- config/locales/nl.yml | 21 ++ config/locales/oc.yml | 10 + config/locales/pl.yml | 1 + config/locales/pt-PT.yml | 1 + config/locales/simple_form.hy.yml | 2 + config/locales/simple_form.ml.yml | 4 + config/locales/simple_form.nl.yml | 3 +- config/locales/simple_form.oc.yml | 1 + config/locales/sq.yml | 1 + config/locales/vi.yml | 1 + config/locales/zh-CN.yml | 8 +- config/locales/zh-TW.yml | 28 +++ 40 files changed, 587 insertions(+), 352 deletions(-) diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index c2bb08596..1c1773029 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Suchergebnisse", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Reisen und Orte", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Konto gesperrt", "empty_column.account_timeline": "Keine Beiträge!", "empty_column.account_unavailable": "Konto nicht verfügbar", "empty_column.blocks": "Du hast keine Profile blockiert.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Titel ändern", "lists.new.create": "Liste hinzufügen", "lists.new.title_placeholder": "Neuer Titel der Liste", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Jeder gefolgte Benutzer", + "lists.replies_policy.list": "Mitglieder der Liste", + "lists.replies_policy.none": "Niemand", "lists.replies_policy.title": "Antworten anzeigen für:", "lists.search": "Suche nach Leuten denen du folgst", "lists.subheading": "Deine Listen", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Erwähnungen", "notifications.filter.polls": "Ergebnisse der Umfrage", "notifications.filter.statuses": "Updates von Personen, denen du folgst", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Zugriff gewährt.", "notifications.group": "{count} Benachrichtigungen", "notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren", "notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.", "notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Desktop-Benachrichtigungen sind nicht verfügbar, da die erforderliche Berechtigung nicht erteilt wurde.", "notifications_permission_banner.enable": "Aktiviere Desktop-Benachrichtigungen", "notifications_permission_banner.how_to_control": "Um Benachrichtigungen zu erhalten, wenn Mastodon nicht geöffnet ist, aktiviere die Desktop-Benachrichtigungen. Du kannst genau bestimmen, welche Arten von Interaktionen Desktop-Benachrichtigungen über die {icon} -Taste erzeugen, sobald diese aktiviert sind.", "notifications_permission_banner.title": "Verpasse nie etwas", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 57e3208fb..5cff6c5af 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -353,13 +353,13 @@ "poll_button.add_poll": "Aldoni balotenketon", "poll_button.remove_poll": "Forigi balotenketon", "privacy.change": "Agordi mesaĝan privatecon", - "privacy.direct.long": "Afiŝi nur al menciitaj uzantoj", + "privacy.direct.long": "Videbla nur al menciitaj uzantoj", "privacy.direct.short": "Rekta", - "privacy.private.long": "Afiŝi nur al sekvantoj", - "privacy.private.short": "Nur por sekvantoj", - "privacy.public.long": "Afiŝi en publikaj tempolinioj", + "privacy.private.long": "Videbla nur al viaj sekvantoj", + "privacy.private.short": "Nur al sekvantoj", + "privacy.public.long": "Videbla al ĉiuj, afiŝita en publikaj tempolinioj", "privacy.public.short": "Publika", - "privacy.unlisted.long": "Ne afiŝi en publikaj tempolinioj", + "privacy.unlisted.long": "Videbla al ĉiuj, sed ne en publikaj tempolinioj", "privacy.unlisted.short": "Nelistigita", "refresh": "Refreŝigu", "regeneration_indicator.label": "Ŝargado…", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 0ea82acbc..214f3aeea 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -438,7 +438,7 @@ "tabs_bar.local_timeline": "Fil public local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Chercher", - "time_remaining.days": "{number, plural, one {# day} other {# days}} restants", + "time_remaining.days": "{number, plural, one {# jour} other {# jours}} restant·s", "time_remaining.hours": "{number, plural, one {# heure} other {# heures}} restantes", "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} restantes", "time_remaining.moments": "Encore quelques instants", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 0b4ce2235..f1b78eda4 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -134,7 +134,7 @@ "directory.new_arrivals": "New arrivals", "directory.recently_active": "Nedavno aktivni", "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", + "embed.preview": "Evo kako će izgledati:", "emoji_button.activity": "Aktivnost", "emoji_button.custom": "Prilagođeno", "emoji_button.flags": "Zastave", @@ -149,7 +149,7 @@ "emoji_button.search_results": "Rezultati pretraživanja", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Putovanje i mjesta", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Račun je suspendiran", "empty_column.account_timeline": "Ovdje nema tootova!", "empty_column.account_unavailable": "Profil nije dostupan", "empty_column.blocks": "Još niste blokirali nikoga.", @@ -165,7 +165,7 @@ "empty_column.home.public_timeline": "javnu vremensku crtu", "empty_column.list": "Na ovoj listi još nema ničega. Kada članovi ove liste objave nove tootove, oni će se pojaviti ovdje.", "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.mutes": "Niste utišali nijednog korisnika.", "empty_column.notifications": "Još nemate obavijesti. Komunicirajte s drugima kako biste započeli razgovor.", "empty_column.public": "Ovdje nema ništa! Napišite nešto javno ili ručno pratite korisnike s drugi poslužitelja da biste ovo popunili", "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Promijeni naslov", "lists.new.create": "Dodaj listu", "lists.new.title_placeholder": "Naziv nove liste", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Bilo koji praćeni korisnik", + "lists.replies_policy.list": "Članovi liste", + "lists.replies_policy.none": "Nitko", "lists.replies_policy.title": "Show replies to:", "lists.search": "Traži među praćenim ljudima", "lists.subheading": "Vaše liste", @@ -277,10 +277,10 @@ "media_gallery.toggle_visible": "Sakrij {number, plural, one {sliku} other {slike}}", "missing_indicator.label": "Nije pronađeno", "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.duration": "Duration", + "mute_modal.duration": "Trajanje", "mute_modal.hide_notifications": "Hide notifications from this user?", "mute_modal.indefinite": "Indefinite", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "Mobilne aplikacije", "navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Lokalna vremenska crta", @@ -336,7 +336,7 @@ "notifications.filter.statuses": "Updates from people you follow", "notifications.grant_permission": "Grant permission.", "notifications.group": "{count} obavijesti", - "notifications.mark_as_read": "Mark every notification as read", + "notifications.mark_as_read": "Označi sve obavijesti kao pročitane", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", @@ -384,7 +384,7 @@ "search_popout.tips.status": "toot", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", "search_popout.tips.user": "korisnik", - "search_results.accounts": "People", + "search_results.accounts": "Ljudi", "search_results.hashtags": "Hashtags", "search_results.statuses": "Toots", "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 91377d7c5..4d9d0b63e 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -128,7 +128,7 @@ "conversation.delete": "Ջնջել խօսակցութիւնը", "conversation.mark_as_read": "Նշել որպէս ընթերցուած", "conversation.open": "Դիտել խօսակցութիւնը", - "conversation.with": "{names}֊երի հետ", + "conversation.with": "{names}-ի հետ", "directory.federated": "Յայտնի դաշնեզերքից", "directory.local": "{domain} տիրոյթից միայն", "directory.new_arrivals": "Նորեկներ", @@ -268,7 +268,7 @@ "lists.new.title_placeholder": "Նոր ցանկի վերնագիր", "lists.replies_policy.followed": "Any followed user", "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.none": "Ոչ ոք", "lists.replies_policy.title": "Show replies to:", "lists.search": "Փնտրել քո հետեւած մարդկանց մեջ", "lists.subheading": "Քո ցանկերը", @@ -334,7 +334,7 @@ "notifications.filter.mentions": "Նշումները", "notifications.filter.polls": "Հարցման արդիւնքները", "notifications.filter.statuses": "Updates from people you follow", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Թոյլատրել։", "notifications.group": "{count} ծանուցում", "notifications.mark_as_read": "Համարել բոլոր ծանուցումները ընթերցած", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", @@ -343,7 +343,7 @@ "notifications_permission_banner.enable": "Միացնել դիտարկչից ծանուցումները", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", + "picture_in_picture.restore": "Հետ բերել", "poll.closed": "Փակ", "poll.refresh": "Թարմացնել", "poll.total_people": "{count, plural, one {# հոգի} other {# հոգի}}", @@ -470,7 +470,7 @@ "upload_modal.detect_text": "Հայտնբերել տեքստը նկարից", "upload_modal.edit_media": "Խմբագրել մեդիան", "upload_modal.hint": "Սեղմէք եւ տեղաշարժէք նախադիտման շրջանակը՝ որ ընտրէք մանրապատկերում միշտ տեսանելի կէտը։", - "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.preparing_ocr": "Գրաճանաչման նախապատրաստում…", "upload_modal.preview_label": "Նախադիտում ({ratio})", "upload_progress.label": "Վերբեռնվում է…", "video.close": "Փակել տեսագրութիւնը", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 9d7b913f9..97b4ec401 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -2,17 +2,17 @@ "account.account_note_header": "കുറിപ്പ്", "account.add_or_remove_from_list": "പട്ടികയിൽ ചേർക്കുകയോ അല്ലെങ്കിൽ മാറ്റുകയോ ചെയ്യുക", "account.badges.bot": "റോബോട്ട്", - "account.badges.group": "കൂട്ടം", - "account.block": "@{name} നെ ബ്ലോക്ക് ചെയ്യുക", + "account.badges.group": "ഗ്രൂപ്പ്", + "account.block": "@{name} -നെ തടയുക", "account.block_domain": "{domain} ൽ നിന്നുള്ള എല്ലാം മറയ്കുക", "account.blocked": "തടഞ്ഞു", "account.browse_more_on_origin_server": "യഥാർത്ഥ പ്രൊഫൈലിലേക്ക് പോവുക", "account.cancel_follow_request": "പിന്തുടരാനുള്ള അപേക്ഷ നിരസിക്കുക", "account.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക", - "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.disable_notifications": "@{name} പോസ്റ്റുചെയ്യുന്നത് എന്നെ അറിയിക്കുന്നത് നിർത്തുക", "account.domain_blocked": "മേഖല മറയ്ക്കപ്പെട്ടിരിക്കുന്നു", "account.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "@{name} പോസ്റ്റ് ചെയ്യുമ്പോൾ എന്നെ അറിയിക്കുക", "account.endorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കുക", "account.follow": "പിന്തുടരുക", "account.followers": "പിന്തുടരുന്നവർ", @@ -67,7 +67,7 @@ "column.domain_blocks": "മറയ്ക്കപ്പെട്ട മേഖലകൾ", "column.favourites": "പ്രിയപ്പെട്ടവ", "column.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ", - "column.home": "ഭവനം", + "column.home": "ഹോം", "column.lists": "പട്ടികകൾ", "column.mutes": "നിശബ്ദമാക്കപ്പെട്ട ഉപയോക്താക്കൾ", "column.notifications": "അറിയിപ്പുകൾ", @@ -105,17 +105,17 @@ "compose_form.spoiler.unmarked": "എഴുത്ത് മറയ്ക്കപ്പെട്ടിട്ടില്ല", "compose_form.spoiler_placeholder": "നിങ്ങളുടെ മുന്നറിയിപ്പ് ഇവിടെ എഴുതുക", "confirmation_modal.cancel": "റദ്ദാക്കുക", - "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.block_and_report": "തടയുകയും റിപ്പോർട്ടും ചെയ്യുക", "confirmations.block.confirm": "തടയുക", - "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.block.message": "{name} തടയാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?", "confirmations.delete.confirm": "മായ്ക്കുക", - "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete.message": "ഈ ടൂട്ട് ഇല്ലാതാക്കണം എന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", "confirmations.delete_list.confirm": "മായ്ക്കുക", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.delete_list.message": "ഈ പട്ടിക എന്നെന്നേക്കുമായി നീക്കം ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?", + "confirmations.domain_block.confirm": "മുഴുവൻ ഡൊമെയ്‌നും തടയുക", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.logout.confirm": "പുറത്തുകടക്കുക", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.message": "നിങ്ങൾക്ക് ലോഗ് ഔട്ട് ചെയ്യണമെന്ന് ഉറപ്പാണോ?", "confirmations.mute.confirm": "നിശ്ശബ്ദമാക്കുക", "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", "confirmations.mute.message": "Are you sure you want to mute {name}?", @@ -133,7 +133,7 @@ "directory.local": "{domain} ൽ നിന്ന് മാത്രം", "directory.new_arrivals": "പുതിയ വരവുകൾ", "directory.recently_active": "അടുത്തിടെയായി സജീവമായ", - "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.instructions": "ചുവടെയുള്ള കോഡ് പകർത്തിക്കൊണ്ട് നിങ്ങളുടെ വെബ്‌സൈറ്റിൽ ഈ ടൂട്ട് ഉൾച്ചേർക്കുക.", "embed.preview": "ഇത് ഇങ്ങനെ കാണപ്പെടും:", "emoji_button.activity": "പ്രവര്‍ത്തനം", "emoji_button.custom": "സ്വന്തമായ ഭേദഗതി", @@ -141,7 +141,7 @@ "emoji_button.food": "ഭക്ഷണവും പാനീയവും", "emoji_button.label": "ഇമോജി ചേർക്കുക", "emoji_button.nature": "പ്രകൃതി", - "emoji_button.not_found": "എമോജി പാടില്ല (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "ഇമോജി പാടില്ല (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "വസ്തുക്കൾ", "emoji_button.people": "ആളുകൾ", "emoji_button.recent": "അടിക്കടി ഉപയോഗിക്കുന്നവ", @@ -149,7 +149,7 @@ "emoji_button.search_results": "തിരച്ചിൽ ഫലങ്ങൾ", "emoji_button.symbols": "ചിഹ്നങ്ങൾ", "emoji_button.travel": "യാത്രയും സ്ഥലങ്ങളും", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "അക്കൗണ്ട് താൽക്കാലികമായി നിർത്തിവച്ചു", "empty_column.account_timeline": "ഇവിടെ ടൂട്ടുകൾ ഇല്ല!", "empty_column.account_unavailable": "പ്രൊഫൈൽ ലഭ്യമല്ല", "empty_column.blocks": "നിങ്ങൾ ഇതുവരെ ഒരു ഉപയോക്താക്കളെയും തടഞ്ഞിട്ടില്ല.", @@ -160,7 +160,7 @@ "empty_column.favourited_statuses": "നിങ്ങൾക്ക് ഇത് വരെ ഒരു പ്രിയപ്പെട്ട ടൂട്ടും ഇല്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് പ്രിയപ്പെടുന്ന പക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.", "empty_column.favourites": "ഇതുവരെ ആരും ഈ ടൂട്ട് പ്രിയപ്പെട്ടതായി അടയാളപ്പെടുത്തിയിട്ടില്ല. ആരെങ്കിലും അങ്ങനെ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.", "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.hashtag": "ഈ ഹാഷ്‌ടാഗിൽ ഇതുവരെ ഒന്നുമില്ല.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "പൊതു സമയരേഖ", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", @@ -179,7 +179,7 @@ "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", "generic.saved": "സംരക്ഷിച്ചു", "getting_started.developers": "വികസിപ്പിക്കുന്നവർ", - "getting_started.directory": "രൂപരേഖ നാമഗൃഹസൂചി", + "getting_started.directory": "പ്രൊഫൈൽ ഡയറക്ടറി", "getting_started.documentation": "രേഖാ സമാഹരണം", "getting_started.heading": "തുടക്കം കുറിക്കുക", "getting_started.invite": "ആളുകളെ ക്ഷണിക്കുക", @@ -190,7 +190,7 @@ "hashtag.column_header.tag_mode.any": "അല്ലെങ്കിൽ {additional}", "hashtag.column_header.tag_mode.none": "{additional} ഇല്ലാതെ", "hashtag.column_settings.select.no_options_message": "ഒരു സൂചനയും കണ്ടെത്തിയില്ല", - "hashtag.column_settings.select.placeholder": "ചർച്ചാവിഷയങ്ങൾ എഴുതുക…", + "hashtag.column_settings.select.placeholder": "ഹാഷ്ടാഗുകൾ എഴുതുക…", "hashtag.column_settings.tag_mode.all": "ഇവയെല്ലാം", "hashtag.column_settings.tag_mode.any": "ഇവയിലേതെങ്കിലും", "hashtag.column_settings.tag_mode.none": "ഇതിലൊന്നുമല്ല", @@ -206,7 +206,7 @@ "introduction.federation.action": "അടുത്തത്", "introduction.federation.federated.headline": "സംയുക്തമാക്കിയ", "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", - "introduction.federation.home.headline": "ഭവനം", + "introduction.federation.home.headline": "ഹോം", "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", "introduction.federation.local.headline": "പ്രാദേശികം", "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", @@ -233,17 +233,17 @@ "keyboard_shortcuts.favourites": "to open favourites list", "keyboard_shortcuts.federated": "to open federated timeline", "keyboard_shortcuts.heading": "കീബോർഡ് എളുപ്പവഴികൾ", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "ഹോം ടൈംലൈൻ തുറക്കുന്നതിന്", "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "പ്രാദേശിക സമയരേഖ തുറക്കാൻ", "keyboard_shortcuts.mention": "to mention author", "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.my_profile": "നിങ്ങളുടെ പ്രൊഫൈൽ തുറക്കാൻ", "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.open_media": "to open media", + "keyboard_shortcuts.open_media": "മീഡിയ തുറക്കാൻ", "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.profile": "രചയിതാവിന്റെ പ്രൊഫൈൽ തുറക്കുന്നതിന്", "keyboard_shortcuts.reply": "മറുപടി അയക്കാൻ", "keyboard_shortcuts.requests": "to open follow requests list", "keyboard_shortcuts.search": "to focus search", @@ -268,7 +268,7 @@ "lists.new.title_placeholder": "New list title", "lists.replies_policy.followed": "Any followed user", "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.none": "ആരുമില്ല", "lists.replies_policy.title": "Show replies to:", "lists.search": "Search among people you follow", "lists.subheading": "എന്റെ പട്ടികകൾ", @@ -277,208 +277,208 @@ "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}", "missing_indicator.label": "കാണാനില്ല", "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.duration": "Duration", + "mute_modal.duration": "കാലാവധി", "mute_modal.hide_notifications": "Hide notifications from this user?", - "mute_modal.indefinite": "Indefinite", - "navigation_bar.apps": "Mobile apps", - "navigation_bar.blocks": "Blocked users", - "navigation_bar.bookmarks": "അടയാളങ്ങൾ", - "navigation_bar.community_timeline": "Local timeline", + "mute_modal.indefinite": "അനിശ്ചിതകാല", + "navigation_bar.apps": "മൊബൈൽ ആപ്പുകൾ", + "navigation_bar.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ", + "navigation_bar.bookmarks": "ബുക്ക്മാർക്കുകൾ", + "navigation_bar.community_timeline": "പ്രാദേശിക സമയരേഖ", "navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", + "navigation_bar.direct": "നേരിട്ടുള്ള സന്ദേശങ്ങൾ", + "navigation_bar.discover": "കണ്ടെത്തുക", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Favourites", + "navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക", + "navigation_bar.favourites": "പ്രിയപ്പെട്ടവ", "navigation_bar.filters": "Muted words", - "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ", "navigation_bar.follows_and_followers": "Follows and followers", - "navigation_bar.info": "About this server", + "navigation_bar.info": "ഈ സെർവറിനെക്കുറിച്ച്", "navigation_bar.keyboard_shortcuts": "Hotkeys", - "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", - "navigation_bar.mutes": "Muted users", + "navigation_bar.lists": "ലിസ്റ്റുകൾ", + "navigation_bar.logout": "ലോഗൗട്ട്", + "navigation_bar.mutes": "നിശബ്ദമാക്കപ്പെട്ട ഉപയോക്താക്കൾ", "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", - "navigation_bar.preferences": "Preferences", + "navigation_bar.preferences": "ക്രമീകരണങ്ങൾ", "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.security": "Security", + "navigation_bar.security": "സുരക്ഷ", "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} followed you", + "notification.follow": "{name} നിങ്ങളെ പിന്തുടർന്നു", "notification.follow_request": "{name} has requested to follow you", "notification.mention": "{name} mentioned you", - "notification.own_poll": "Your poll has ended", + "notification.own_poll": "നിങ്ങളുടെ പോൾ അവസാനിച്ചു", "notification.poll": "A poll you have voted in has ended", - "notification.reblog": "{name} boosted your status", - "notification.status": "{name} just posted", - "notifications.clear": "Clear notifications", + "notification.reblog": "{name} നിങ്ങളുടെ പോസ്റ്റ് ബൂസ്റ്റ് ചെയ്തു", + "notification.status": "{name} ഇപ്പോൾ പോസ്റ്റുചെയ്‌തു", + "notifications.clear": "അറിയിപ്പ് മായ്ക്കുക", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", - "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Favourites:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.alert": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ", + "notifications.column_settings.favourite": "പ്രിയപ്പെട്ടവ:", + "notifications.column_settings.filter_bar.advanced": "എല്ലാ വിഭാഗങ്ങളും പ്രദർശിപ്പിക്കുക", "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.filter_bar.show": "കാണിക്കുക", "notifications.column_settings.follow": "New followers:", - "notifications.column_settings.follow_request": "New follow requests:", + "notifications.column_settings.follow_request": "പുതിയ പിന്തുടരൽ അഭ്യർത്ഥനകൾ:", "notifications.column_settings.mention": "Mentions:", - "notifications.column_settings.poll": "Poll results:", + "notifications.column_settings.poll": "പോൾ ഫലങ്ങൾ:", "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.reblog": "ബൂസ്റ്റുകൾ:", "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.column_settings.status": "New toots:", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", - "notifications.filter.follows": "Follows", + "notifications.column_settings.sound": "ശബ്ദം പ്ലേ ചെയ്യുക", + "notifications.column_settings.status": "പുതിയ ടൂട്ടുകൾ:", + "notifications.filter.all": "എല്ലാം", + "notifications.filter.boosts": "ബൂസ്റ്റുകൾ", + "notifications.filter.favourites": "പ്രിയപ്പെട്ടവ", + "notifications.filter.follows": "പിന്തുടരുന്നു", "notifications.filter.mentions": "Mentions", - "notifications.filter.polls": "Poll results", - "notifications.filter.statuses": "Updates from people you follow", - "notifications.grant_permission": "Grant permission.", - "notifications.group": "{count} notifications", - "notifications.mark_as_read": "Mark every notification as read", + "notifications.filter.polls": "പോൾ ഫലങ്ങൾ", + "notifications.filter.statuses": "നിങ്ങൾ പിന്തുടരുന്ന ആളുകളിൽ നിന്നുള്ള അപ്‌ഡേറ്റുകൾ", + "notifications.grant_permission": "അനുമതി നൽകുക.", + "notifications.group": "{count} അറിയിപ്പുകൾ", + "notifications.mark_as_read": "എല്ലാ അറിയിപ്പുകളും വായിച്ചതായി അടയാളപ്പെടുത്തുക", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", - "notifications_permission_banner.enable": "Enable desktop notifications", + "notifications_permission_banner.enable": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ പ്രാപ്തമാക്കുക", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", - "poll.closed": "Closed", - "poll.refresh": "Refresh", + "picture_in_picture.restore": "തിരികെ വയ്ക്കുക", + "poll.closed": "അടച്ചു", + "poll.refresh": "പുതുക്കുക", "poll.total_people": "{count, plural, one {# person} other {# people}}", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", - "poll.vote": "Vote", + "poll.vote": "വോട്ട് ചെയ്യുക", "poll.voted": "You voted for this answer", - "poll_button.add_poll": "Add a poll", - "poll_button.remove_poll": "Remove poll", + "poll_button.add_poll": "ഒരു പോൾ ചേർക്കുക", + "poll_button.remove_poll": "പോൾ നീക്കംചെയ്യുക", "privacy.change": "Adjust status privacy", "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", + "privacy.direct.short": "നേരിട്ട്", "privacy.private.long": "Post to followers only", "privacy.private.short": "Followers-only", "privacy.public.long": "Post to public timelines", "privacy.public.short": "Public", "privacy.unlisted.long": "Do not show in public timelines", "privacy.unlisted.short": "Unlisted", - "refresh": "Refresh", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "refresh": "പുതുക്കുക", + "regeneration_indicator.label": "ലഭ്യമാക്കുന്നു…", + "regeneration_indicator.sublabel": "നിങ്ങളുടെ ഹോം ഫീഡ് തയാറാക്കുന്നു!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "ഇപ്പോൾ", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "relative_time.today": "today", - "reply_indicator.cancel": "Cancel", + "relative_time.today": "ഇന്ന്", + "reply_indicator.cancel": "റദ്ദാക്കുക", "report.forward": "Forward to {target}", "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", - "report.placeholder": "Additional comments", - "report.submit": "Submit", + "report.placeholder": "കൂടുതൽ അഭിപ്രായങ്ങൾ", + "report.submit": "സമർപ്പിക്കുക", "report.target": "Report {target}", - "search.placeholder": "Search", + "search.placeholder": "തിരയുക", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", + "search_popout.tips.hashtag": "ഹാഷ്ടാഗ്", + "search_popout.tips.status": "ടൂട്ട്", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.hashtags": "Hashtags", - "search_results.statuses": "Toots", + "search_popout.tips.user": "ഉപയോക്താവ്", + "search_results.accounts": "ആളുകൾ", + "search_results.hashtags": "ഹാഷ്ടാഗുകൾ", + "search_results.statuses": "ടൂട്ടുകൾ", "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "status.admin_account": "Open moderation interface for @{name}", "status.admin_status": "Open this status in the moderation interface", - "status.block": "Block @{name}", - "status.bookmark": "Bookmark", + "status.block": "@{name} -നെ തടയുക", + "status.bookmark": "ബുക്ക്മാർക്ക്", "status.cancel_reblog_private": "Unboost", - "status.cannot_reblog": "This post cannot be boosted", - "status.copy": "Copy link to status", + "status.cannot_reblog": "ഈ പോസ്റ്റ് ബൂസ്റ്ചെയ്യാൻ കഴിയില്ല", + "status.copy": "ടൂട്ടിലേക്ക് ലിങ്ക് പകർത്തുക", "status.delete": "മായ്ക്കുക", "status.detailed_status": "വിശദമായ സംഭാഷണ കാഴ്‌ച", "status.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക", "status.embed": "ഉൾച്ചേർക്കുക", "status.favourite": "പ്രിയപ്പെട്ടത്", - "status.filtered": "Filtered", + "status.filtered": "ഫിൽട്ടർ ചെയ്‌തു", "status.load_more": "കൂടുതൽ ലോഡു ചെയ്യുക", - "status.media_hidden": "Media hidden", + "status.media_hidden": "മീഡിയ മറച്ചു", "status.mention": "@{name} സൂചിപ്പിക്കുക", - "status.more": "More", - "status.mute": "Mute @{name}", + "status.more": "കൂടുതൽ", + "status.mute": "@{name}-നെ നിശ്ശബ്ദമാക്കുക", "status.mute_conversation": "Mute conversation", "status.open": "Expand this status", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", - "status.read_more": "Read more", - "status.reblog": "Boost", + "status.read_more": "കൂടുതൽ വായിക്കുക", + "status.reblog": "ബൂസ്റ്റ്", "status.reblog_private": "Boost with original visibility", - "status.reblogged_by": "{name} boosted", + "status.reblogged_by": "{name} ബൂസ്റ്റ് ചെയ്തു", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", - "status.remove_bookmark": "Remove bookmark", - "status.reply": "Reply", + "status.redraft": "ഇല്ലാതാക്കുക & വീണ്ടും ഡ്രാഫ്റ്റ് ചെയ്യുക", + "status.remove_bookmark": "ബുക്ക്മാർക്ക് നീക്കംചെയ്യുക", + "status.reply": "മറുപടി", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_less": "Show less", + "status.share": "പങ്കിടുക", + "status.show_less": "കുറച്ച് കാണിക്കുക", "status.show_less_all": "Show less for all", - "status.show_more": "Show more", - "status.show_more_all": "Show more for all", + "status.show_more": "കൂടുതകൽ കാണിക്കുക", + "status.show_more_all": "എല്ലാവർക്കുമായി കൂടുതൽ കാണിക്കുക", "status.show_thread": "Show thread", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "ലഭ്യമല്ല", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", - "tabs_bar.federated_timeline": "Federated", - "tabs_bar.home": "Home", - "tabs_bar.local_timeline": "Local", - "tabs_bar.notifications": "Notifications", - "tabs_bar.search": "Search", + "suggestions.header": "നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടാകാം…", + "tabs_bar.federated_timeline": "സംയുക്തമാക്കിയ", + "tabs_bar.home": "ഹോം", + "tabs_bar.local_timeline": "പ്രാദേശികം", + "tabs_bar.notifications": "അറിയിപ്പുകൾ", + "tabs_bar.search": "തിരയുക", "time_remaining.days": "{number, plural, one {# day} other {# days}} left", "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", - "timeline_hint.resources.followers": "Followers", - "timeline_hint.resources.follows": "Follows", - "timeline_hint.resources.statuses": "Older toots", + "timeline_hint.resources.followers": "പിന്തുടരുന്നവർ", + "timeline_hint.resources.follows": "പിന്തുടരുന്നു", + "timeline_hint.resources.statuses": "പഴയ ടൂട്ടുകൾ", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", - "trends.trending_now": "Trending now", + "trends.trending_now": "ഇപ്പോൾ ട്രെൻഡിംഗ്", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "units.short.billion": "{count}B", - "units.short.million": "{count}M", + "units.short.million": "{count}ദശലക്ഷം", "units.short.thousand": "{count}K", - "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add images, a video or an audio file", - "upload_error.limit": "File upload limit exceeded.", + "upload_area.title": "അപ്‌ലോഡുചെയ്യാൻ വലിച്ചിടുക", + "upload_button.label": "ഇമേജുകൾ, ഒരു വീഡിയോ അല്ലെങ്കിൽ ഓഡിയോ ഫയൽ ചേർക്കുക", + "upload_error.limit": "ഫയൽ അപ്‌ലോഡ് പരിധി കവിഞ്ഞു.", "upload_error.poll": "File upload not allowed with polls.", - "upload_form.audio_description": "Describe for people with hearing loss", - "upload_form.description": "Describe for the visually impaired", - "upload_form.edit": "Edit", - "upload_form.thumbnail": "Change thumbnail", - "upload_form.undo": "Delete", + "upload_form.audio_description": "കേൾവിശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ", + "upload_form.description": "കാഴ്ചശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ", + "upload_form.edit": "തിരുത്തുക", + "upload_form.thumbnail": "ലഘുചിത്രം മാറ്റുക", + "upload_form.undo": "ഇല്ലാതാക്കുക", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.choose_image": "Choose image", + "upload_modal.apply": "പ്രയോഗിക്കുക", + "upload_modal.choose_image": "ചിത്രം തിരഞ്ഞെടുക്കുക", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.edit_media": "മീഡിയ തിരുത്തുക", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", "upload_modal.preparing_ocr": "Preparing OCR…", "upload_modal.preview_label": "Preview ({ratio})", "upload_progress.label": "Uploading…", - "video.close": "Close video", - "video.download": "Download file", + "video.close": "വീഡിയോ അടയ്ക്കുക", + "video.download": "ഫയൽ ഡൌൺലോഡ് ചെയ്യുക", "video.exit_fullscreen": "Exit full screen", "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", + "video.fullscreen": "പൂർണ്ണ സ്ക്രീൻ", + "video.hide": "വീഡിയോ മറയ്ക്കുക", "video.mute": "Mute sound", "video.pause": "Pause", "video.play": "Play", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index c910a28ab..e19f0b6d3 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Zoekresultaten", "emoji_button.symbols": "Symbolen", "emoji_button.travel": "Reizen en plekken", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Account opgeschort", "empty_column.account_timeline": "Hier zijn geen toots!", "empty_column.account_unavailable": "Profiel is niet beschikbaar", "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Titel veranderen", "lists.new.create": "Lijst toevoegen", "lists.new.title_placeholder": "Naam nieuwe lijst", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Elke gevolgde gebruiker", + "lists.replies_policy.list": "Leden van de lijst", + "lists.replies_policy.none": "Niemand", "lists.replies_policy.title": "Toon reacties aan:", "lists.search": "Zoek naar mensen die je volgt", "lists.subheading": "Jouw lijsten", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Vermeldingen", "notifications.filter.polls": "Pollresultaten", "notifications.filter.statuses": "Updates van mensen die je volgt", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Toestemming geven.", "notifications.group": "{count} meldingen", "notifications.mark_as_read": "Markeer elke melding als gelezen", "notifications.permission_denied": "Desktopmeldingen zijn niet beschikbaar omdat een eerdere browsertoestemming werd geweigerd", "notifications.permission_denied_alert": "Desktopmeldingen kunnen niet worden ingeschakeld, omdat een eerdere browsertoestemming werd geweigerd", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Desktopmeldingen zijn niet beschikbaar omdat de benodigde toestemming niet is verleend.", "notifications_permission_banner.enable": "Desktopmeldingen inschakelen", "notifications_permission_banner.how_to_control": "Om meldingen te ontvangen wanneer Mastodon niet open is. Je kunt precies bepalen welke soort interacties wel of geen desktopmeldingen geven via de bovenstaande {icon} knop.", "notifications_permission_banner.title": "Mis nooit meer iets", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index ba41f83d6..f56d337d3 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Resultats de recèrca", "emoji_button.symbols": "Simbòls", "emoji_button.travel": "Viatges & lòcs", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Compte suspendut", "empty_column.account_timeline": "Cap de tuts aquí !", "empty_column.account_unavailable": "Perfil pas disponible", "empty_column.blocks": "Avètz pas blocat degun pel moment.", @@ -266,9 +266,9 @@ "lists.edit.submit": "Cambiar lo títol", "lists.new.create": "Ajustar una lista", "lists.new.title_placeholder": "Títol de la nòva lista", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "Quin seguidor que siá", + "lists.replies_policy.list": "Membres de la lista", + "lists.replies_policy.none": "Degun", "lists.replies_policy.title": "Mostrar las responsas a :", "lists.search": "Cercar demest lo mond que seguètz", "lists.subheading": "Vòstras listas", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "Mencions", "notifications.filter.polls": "Resultats del sondatge", "notifications.filter.statuses": "Mesas a jorn del monde que seguissètz", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "Acordar l’autorizacion.", "notifications.group": "{count} notificacions", "notifications.mark_as_read": "Marcar totas las notificacions coma legidas", "notifications.permission_denied": "Las notificacion burèu son pas disponiblas a causa del refús de las demandas d’autorizacion navigador", "notifications.permission_denied_alert": "Las notificacions burèu son pas activada, per çò que las autorizacions son estadas refusada abans", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "Las notificacions de burèu son pas indisponiblas perque las permissions requeridas son pas estadas acordadas.", "notifications_permission_banner.enable": "Activar las notificacions burèu", "notifications_permission_banner.how_to_control": "Per recebre las notificacions de Mastodon quand es pas dobèrt, activatz las notificacions de burèu. Podètz precisar quin tipe de notificacion generarà una notificacion de burèu via lo boton {icon} dessús un còp activadas.", "notifications_permission_banner.title": "Manquetz pas jamai res", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 76407efce..1d56d169c 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -149,7 +149,7 @@ "emoji_button.search_results": "Arama sonuçları", "emoji_button.symbols": "Semboller", "emoji_button.travel": "Seyahat ve Yerler", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "Hesap askıya alındı", "empty_column.account_timeline": "Burada hiç toot yok!", "empty_column.account_unavailable": "Profil kullanılamıyor", "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.", @@ -267,7 +267,7 @@ "lists.new.create": "Liste ekle", "lists.new.title_placeholder": "Yeni liste başlığı", "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.list": "Listenin üyeleri", "lists.replies_policy.none": "No one", "lists.replies_policy.title": "Yanıtları göster:", "lists.search": "Takip ettiğiniz kişiler arasından arayın", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 4814dda91..14c74830b 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -179,7 +179,7 @@ "follow_requests.unlocked_explanation": "Mặc dù tài khoản của bạn đang ở chế độ công khai, quản trị viên của {domain} vẫn tin rằng bạn sẽ muốn xem lại yêu cầu theo dõi từ những người khác.", "generic.saved": "Đã lưu", "getting_started.developers": "Nhà phát triển", - "getting_started.directory": "Cộng đồng", + "getting_started.directory": "Mạng lưới", "getting_started.documentation": "Tài liệu", "getting_started.heading": "Quản lý", "getting_started.invite": "Mời bạn bè", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index f6af15198..6c746bf96 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -133,7 +133,7 @@ "directory.local": "仅来自 {domain}", "directory.new_arrivals": "新来者", "directory.recently_active": "最近活跃", - "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。", + "embed.instructions": "要在你的网站上嵌入此嘟文,请复制以下代码。", "embed.preview": "它会像这样显示出来:", "emoji_button.activity": "活动", "emoji_button.custom": "自定义", @@ -149,7 +149,7 @@ "emoji_button.search_results": "搜索结果", "emoji_button.symbols": "符号", "emoji_button.travel": "旅行和地点", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "账户被封禁", "empty_column.account_timeline": "这里没有嘟文!", "empty_column.account_unavailable": "个人资料不可用", "empty_column.blocks": "你目前没有屏蔽任何用户。", @@ -163,7 +163,7 @@ "empty_column.hashtag": "这个话题标签下暂时没有内容。", "empty_column.home": "你还没有关注任何用户。快看看{public},向其他人问个好吧。", "empty_column.home.public_timeline": "公共时间轴", - "empty_column.list": "这个列表中暂时没有内容。列表中用户所发送的的新嘟文将会在这里显示。", + "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的的新嘟文将会在这里显示。", "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。", "empty_column.mutes": "你没有隐藏任何用户。", "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。", @@ -266,9 +266,9 @@ "lists.edit.submit": "更改标题", "lists.new.create": "新建列表", "lists.new.title_placeholder": "新列表的标题", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "任何被关注的用户", + "lists.replies_policy.list": "列表成员", + "lists.replies_policy.none": "没有人", "lists.replies_policy.title": "显示回复给:", "lists.search": "搜索你关注的人", "lists.subheading": "你的列表", @@ -334,12 +334,12 @@ "notifications.filter.mentions": "提及", "notifications.filter.polls": "投票结果", "notifications.filter.statuses": "你关注的人的动态", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "授予权限", "notifications.group": "{count} 条通知", "notifications.mark_as_read": "将所有通知标为已读", "notifications.permission_denied": "由于权限被拒绝,无法启用桌面通知。", "notifications.permission_denied_alert": "由于在此之前浏览器权限请求就已被拒绝,所以启用桌面通知失败", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "所需权限未被授予,所以桌面通知不可用", "notifications_permission_banner.enable": "启用桌面通知", "notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。您可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。", "notifications_permission_banner.title": "精彩不容错过", @@ -403,7 +403,7 @@ "status.favourite": "喜欢", "status.filtered": "已过滤", "status.load_more": "加载更多", - "status.media_hidden": "隐藏媒体内容", + "status.media_hidden": "已隐藏的媒体内容", "status.mention": "提及 @{name}", "status.more": "更多", "status.mute": "隐藏 @{name}", @@ -429,7 +429,7 @@ "status.show_more_all": "显示所有内容", "status.show_thread": "显示全部对话", "status.uncached_media_warning": "暂不可用", - "status.unmute_conversation": "不再隐藏此对话", + "status.unmute_conversation": "将此对话解除静音", "status.unpin": "在个人资料页面取消置顶", "suggestions.dismiss": "关闭建议", "suggestions.header": "您可能会感兴趣…", @@ -454,7 +454,7 @@ "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "将文件拖放到此处开始上传", - "upload_button.label": "上传媒体文件", + "upload_button.label": "上传图片、视频或音频", "upload_error.limit": "文件大小超过限制。", "upload_error.poll": "投票中不允许上传文件。", "upload_form.audio_description": "为听障人士添加文字描述", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 46cfc4359..cc996e91b 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -4,27 +4,27 @@ "account.badges.bot": "機器人", "account.badges.group": "群組", "account.block": "封鎖 @{name}", - "account.block_domain": "隱藏來自 {domain} 的所有內容", + "account.block_domain": "封鎖來自 {domain} 網域的所有內容", "account.blocked": "已封鎖", - "account.browse_more_on_origin_server": "在該服務器的個人檔案頁上瀏覽更多", + "account.browse_more_on_origin_server": "在該伺服器的個人檔案頁上瀏覽更多", "account.cancel_follow_request": "取消關注請求", "account.direct": "傳私訊給 @{name}", - "account.disable_notifications": "當 @{name} 嘟文時不要再通知我", - "account.domain_blocked": "已隱藏網域", + "account.disable_notifications": "取消來自 @{name} 嘟文的通知", + "account.domain_blocked": "已封鎖網域", "account.edit_profile": "編輯個人資料", "account.enable_notifications": "當 @{name} 嘟文時通知我", "account.endorse": "在個人資料推薦對方", "account.follow": "關注", "account.followers": "關注者", - "account.followers.empty": "尚沒有人關注這位使用者。", + "account.followers.empty": "尚未有人關注這位使用者。", "account.followers_counter": "被 {count, plural,one {{counter} 人}other {{counter} 人}}關注", "account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}", - "account.follows.empty": "這位使用者尚未關注任何使用者。", - "account.follows_you": "關注了你", - "account.hide_reblogs": "隱藏來自 @{name} 的轉推", - "account.last_status": "上次活躍", + "account.follows.empty": "這位使用者尚未關注任何人。", + "account.follows_you": "關注了您", + "account.hide_reblogs": "隱藏來自 @{name} 的轉嘟", + "account.last_status": "上次活躍時間", "account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限", - "account.locked_info": "這隻帳戶的隱私狀態被設成鎖定。該擁有者會手動審核能關注這隻帳號的人。", + "account.locked_info": "此帳號的隱私狀態被設為鎖定。該擁有者會手動審核能關注此帳號的人。", "account.media": "媒體", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已遷移至:", @@ -40,13 +40,13 @@ "account.show_reblogs": "顯示來自 @{name} 的嘟文", "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文", "account.unblock": "取消封鎖 @{name}", - "account.unblock_domain": "取消隱藏 {domain}", + "account.unblock_domain": "取消封鎖域名 {domain}", "account.unendorse": "不再於個人資料頁面推薦對方", "account.unfollow": "取消關注", "account.unmute": "取消靜音 @{name}", "account.unmute_notifications": "重新接收來自 @{name} 的通知", "account_note.placeholder": "按此添加備注", - "alert.rate_limited.message": "請在 {retry_time, time, medium} 過後重試", + "alert.rate_limited.message": "請在 {retry_time, time, medium} 後重試", "alert.rate_limited.title": "已限速", "alert.unexpected.message": "發生了非預期的錯誤。", "alert.unexpected.title": "哎呀!", @@ -59,17 +59,17 @@ "bundle_modal_error.close": "關閉", "bundle_modal_error.message": "載入此元件時發生錯誤。", "bundle_modal_error.retry": "重試", - "column.blocks": "封鎖的使用者", + "column.blocks": "已封鎖的使用者", "column.bookmarks": "書籤", "column.community": "本機時間軸", "column.direct": "私訊", "column.directory": "瀏覽個人資料", - "column.domain_blocks": "隱藏的網域", - "column.favourites": "讚美集", + "column.domain_blocks": "已封鎖的網域", + "column.favourites": "收藏", "column.follow_requests": "關注請求", - "column.home": "主頁", + "column.home": "首頁", "column.lists": "名單", - "column.mutes": "被靜音的使用者", + "column.mutes": "已靜音的使用者", "column.notifications": "通知", "column.pins": "釘選的嘟文", "column.public": "聯邦時間軸", @@ -81,116 +81,116 @@ "column_header.show_settings": "顯示設定", "column_header.unpin": "取消釘選", "column_subheading.settings": "設定", - "community.column_settings.local_only": "只有本地", + "community.column_settings.local_only": "只有本機", "community.column_settings.media_only": "只有媒體", "community.column_settings.remote_only": "只有遠端", "compose_form.direct_message_warning": "這條嘟文只有被提及的使用者才看得到。", "compose_form.direct_message_warning_learn_more": "了解更多", - "compose_form.hashtag_warning": "由於這則嘟文被設定成「不公開」,所以它將不會被列在任何主題標籤下。只有公開的嘟文才能藉主題標籤找到。", + "compose_form.hashtag_warning": "由於這則嘟文設定為「不公開」,它將不會被列於任何主題標籤下。只有公開的嘟文才能藉由主題標籤找到。", "compose_form.lock_disclaimer": "您的帳戶尚未{locked}。任何人都能關注您並看到您設定成只有關注者能看的嘟文。", "compose_form.lock_disclaimer.lock": "上鎖", - "compose_form.placeholder": "您正在想些什麼?", - "compose_form.poll.add_option": "新增選擇", + "compose_form.placeholder": "正在想些什麼嗎?", + "compose_form.poll.add_option": "新增選項", "compose_form.poll.duration": "投票期限", - "compose_form.poll.option_placeholder": "第 {number} 個選擇", - "compose_form.poll.remove_option": "移除此選擇", + "compose_form.poll.option_placeholder": "第 {number} 個選項", + "compose_form.poll.remove_option": "移除此選項", "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項", "compose_form.poll.switch_to_single": "變更投票為允許單一選項", "compose_form.publish": "嘟出去", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.hide": "標記媒體為敏感內容", "compose_form.sensitive.marked": "此媒體被標記為敏感內容", - "compose_form.sensitive.unmarked": "此媒體未標記為敏感內容", + "compose_form.sensitive.unmarked": "此媒體未被標記為敏感內容", "compose_form.spoiler.marked": "正文已隱藏到警告之後", "compose_form.spoiler.unmarked": "正文未被隱藏", "compose_form.spoiler_placeholder": "請在此處寫入警告訊息", "confirmation_modal.cancel": "取消", "confirmations.block.block_and_report": "封鎖並檢舉", "confirmations.block.confirm": "封鎖", - "confirmations.block.message": "確定封鎖 {name} ?", + "confirmations.block.message": "確定要封鎖 {name} 嗎?", "confirmations.delete.confirm": "刪除", - "confirmations.delete.message": "你確定要刪除這條嘟文?", + "confirmations.delete.message": "您確定要刪除這則嘟文?", "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "確定永久刪除此名單?", - "confirmations.domain_block.confirm": "隱藏整個網域", - "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 嗎?大部分情況下,你只需要封鎖或靜音少數特定的人就能滿足需求了。你將不能在任何公開的時間軸及通知中看到那個網域的內容。你來自該網域的關注者也會被移除。", + "confirmations.domain_block.confirm": "隱藏整個域名", + "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳號就能滿足需求了。您將不能在任何公開的時間軸及通知中看到此網域的內容。您來自該網域的關注者也將被移除。", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", "confirmations.mute.confirm": "靜音", - "confirmations.mute.explanation": "這將會隱藏來自他們的貼文與通知,但是他們還是可以查閱你的貼文與關注你。", + "confirmations.mute.explanation": "這將會隱藏來自他們的貼文與通知,但是他們還是可以查閱你的貼文與關注您。", "confirmations.mute.message": "確定靜音 {name} ?", "confirmations.redraft.confirm": "刪除並重新編輯", - "confirmations.redraft.message": "確定刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及贊美,且回覆這則的嘟文將會變成獨立的嘟文。", + "confirmations.redraft.message": "確定刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及收藏,且回覆這則的嘟文將會變成獨立的嘟文。", "confirmations.reply.confirm": "回覆", "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?", "confirmations.unfollow.confirm": "取消關注", - "confirmations.unfollow.message": "真的要取消關注 {name} 嗎?", + "confirmations.unfollow.message": "確定要取消關注 {name} 嗎?", "conversation.delete": "刪除對話", - "conversation.mark_as_read": "標為已讀", + "conversation.mark_as_read": "標記為已讀", "conversation.open": "檢視對話", "conversation.with": "與 {names}", "directory.federated": "來自已知聯邦宇宙", - "directory.local": "僅來自 {domain}", + "directory.local": "僅來自 {domain} 網域", "directory.new_arrivals": "新人", "directory.recently_active": "最近活躍", - "embed.instructions": "要嵌入此嘟文,請將以下程式碼貼進你的網站。", - "embed.preview": "他會顯示成這樣:", + "embed.instructions": "要在您的網站嵌入此嘟文,請複製以下程式碼。", + "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", "emoji_button.custom": "自訂", - "emoji_button.flags": "旗標", - "emoji_button.food": "飲食", + "emoji_button.flags": "旗幟", + "emoji_button.food": "食物 & 飲料", "emoji_button.label": "插入表情符號", - "emoji_button.nature": "大自然", + "emoji_button.nature": "自然", "emoji_button.not_found": "啊就沒這表情符號吼!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "物件", - "emoji_button.people": "使用者", + "emoji_button.people": "人物", "emoji_button.recent": "最常使用", "emoji_button.search": "搜尋…", "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊與地點", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "帳號被暫停", "empty_column.account_timeline": "這裡還沒有嘟文!", "empty_column.account_unavailable": "無法取得個人資料", - "empty_column.blocks": "你還沒有封鎖任何使用者。", - "empty_column.bookmarked_statuses": "你還沒建立任何書籤。這裡將會顯示你建立的書籤。", - "empty_column.community": "本地時間軸是空的。快公開嘟些文搶頭香啊!", + "empty_column.blocks": "您還沒有封鎖任何使用者。", + "empty_column.bookmarked_statuses": "您還沒建立任何書籤。當您建立書簽時,它將於此顯示。", + "empty_column.community": "本機時間軸是空的。快公開嘟些文搶頭香啊!", "empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。", - "empty_column.domain_blocks": "尚未隱藏任何網域。", - "empty_column.favourited_statuses": "你還沒讚美过任何嘟文。這裡將會顯示你讚美过的嘟文。", - "empty_column.favourites": "還沒人讚美這則嘟文。當有人點讚後,他們將於此列出。", + "empty_column.domain_blocks": "尚未封鎖任何網域。", + "empty_column.favourited_statuses": "您還沒收藏過任何嘟文。當您收藏嘟文時,它將於此顯示。", + "empty_column.favourites": "還沒有人收藏過這則嘟文。當有人收藏嘟文時,它將於此顯示。", "empty_column.follow_requests": "您尚未收到任何關注請求。這裡將會顯示收到的關注請求。", "empty_column.hashtag": "這個主題標籤下什麼也沒有。", "empty_column.home": "您的首頁時間軸是空的!前往 {public} 或使用搜尋功能來認識其他人。", "empty_column.home.public_timeline": "公開時間軸", "empty_column.list": "這份名單還沒有東西。當此名單的成員嘟出了新的嘟文時,它們就會顯示於此。", - "empty_column.lists": "你還沒有建立任何名單。這裡將會顯示你所建立的名單。", - "empty_column.mutes": "你尚未靜音任何使用者。", + "empty_column.lists": "您還沒有建立任何名單。這裡將會顯示您所建立的名單。", + "empty_column.mutes": "您尚未靜音任何使用者。", "empty_column.notifications": "您尚未收到任何通知,和別人互動開啟對話吧。", "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或著自己關注其他伺服器的使用者後就會有嘟文出現了", - "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。", + "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,無法正常顯示此頁面。", "error.unexpected_crash.explanation_addons": "此頁面無法被正常顯示,這可能是由瀏覽器附加元件或網頁自動翻譯工具造成的。", - "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。", - "error.unexpected_crash.next_steps_addons": "請嘗試重新整理頁面。如果狀況沒有進展,您可以嘗試使用不同的瀏覽器或 Mastodon 應用程式來檢視。", - "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿", - "errors.unexpected_crash.report_issue": "舉報問題", + "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式來檢視來使用 Mastodon。", + "error.unexpected_crash.next_steps_addons": "請嘗試關閉他們然後重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式來檢視來使用 Mastodon。", + "errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿", + "errors.unexpected_crash.report_issue": "回報問題", "follow_request.authorize": "授權", "follow_request.reject": "拒絕", - "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的員工認為可能想要自己審核這些帳號的追蹤請求。", + "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的員工認為您可能想要自己審核這些帳號的追蹤請求。", "generic.saved": "已儲存", "getting_started.developers": "開發者", "getting_started.directory": "個人資料目錄", "getting_started.documentation": "文件", "getting_started.heading": "開始使用", "getting_started.invite": "邀請使用者", - "getting_started.open_source_notice": "Mastodon 是開源軟體。你可以在 GitHub {github} 上貢獻或是回報問題。", - "getting_started.security": "安全性", + "getting_started.open_source_notice": "Mastodon 是開源軟體。您可以在 GitHub {github} 上貢獻或是回報問題。", + "getting_started.security": "帳號安全性設定", "getting_started.terms": "服務條款", - "hashtag.column_header.tag_mode.all": "以及{additional}", - "hashtag.column_header.tag_mode.any": "或是{additional}", - "hashtag.column_header.tag_mode.none": "而無需{additional}", + "hashtag.column_header.tag_mode.all": "以及 {additional}", + "hashtag.column_header.tag_mode.any": "或是 {additional}", + "hashtag.column_header.tag_mode.none": "而無需 {additional}", "hashtag.column_settings.select.no_options_message": "找不到建議", - "hashtag.column_settings.select.placeholder": "輸入主題標籤…", + "hashtag.column_settings.select.placeholder": "請輸入主題標籤…", "hashtag.column_settings.tag_mode.all": "全部", "hashtag.column_settings.tag_mode.any": "任一", "hashtag.column_settings.tag_mode.none": "全不", @@ -204,38 +204,38 @@ "intervals.full.hours": "{number, plural, one {# 小時} other {# 小時}}", "intervals.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}", "introduction.federation.action": "下一步", - "introduction.federation.federated.headline": "站台聯盟", - "introduction.federation.federated.text": "來自聯盟宇宙中其他站台的公開嘟文將會在站點聯盟時間軸中顯示。", + "introduction.federation.federated.headline": "聯邦", + "introduction.federation.federated.text": "來自聯盟宇宙中其他伺服器的公開嘟文將會在聯邦時間軸中顯示。", "introduction.federation.home.headline": "首頁", "introduction.federation.home.text": "你關注使用者的嘟文將會在首頁動態中顯示。你可以關注任何伺服器上的任何人!", "introduction.federation.local.headline": "本機", "introduction.federation.local.text": "跟您同伺服器之使用者所發的公開嘟文將會顯示在本機時間軸中。", "introduction.interactions.action": "完成教學!", - "introduction.interactions.favourite.headline": "讚美", - "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者讚美嘟文,讓作者知道您喜歡這則嘟文。", + "introduction.interactions.favourite.headline": "收藏", + "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者收藏嘟文,讓作者知道您喜歡這則嘟文。", "introduction.interactions.reblog.headline": "轉嘟", "introduction.interactions.reblog.text": "您能藉由轉嘟他人嘟文來分享給您的關注者。", "introduction.interactions.reply.headline": "回覆", "introduction.interactions.reply.text": "您能回覆其他人或自己的嘟文,這麼做會把這些回覆串成一串對話。", "introduction.welcome.action": "開始旅程吧!", "introduction.welcome.headline": "第一步", - "introduction.welcome.text": "歡迎來到聯盟宇宙!等等你就可以廣播訊息及跨越各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},非常特別 - 它寄管了你的個人資料,所以請記住它的名字。", + "introduction.welcome.text": "歡迎來到聯盟宇宙!稍候您就可以廣播訊息及跨越各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},非常特別 - 它承載了您的個人資料,所以請記住它的名字。", "keyboard_shortcuts.back": "返回上一頁", "keyboard_shortcuts.blocked": "開啟「封鎖使用者」名單", "keyboard_shortcuts.boost": "轉嘟", "keyboard_shortcuts.column": "將焦點放在其中一欄的嘟文", "keyboard_shortcuts.compose": "將焦點移至撰寫文字區塊", - "keyboard_shortcuts.description": "描述", + "keyboard_shortcuts.description": "說明", "keyboard_shortcuts.direct": "開啟私訊欄", - "keyboard_shortcuts.down": "往下移動名單項目", + "keyboard_shortcuts.down": "在名單中往下移動", "keyboard_shortcuts.enter": "檢視嘟文", - "keyboard_shortcuts.favourite": "讚美", - "keyboard_shortcuts.favourites": "開啟讚美者名錄", - "keyboard_shortcuts.federated": "開啟站點聯盟時間軸", + "keyboard_shortcuts.favourite": "加到收藏", + "keyboard_shortcuts.favourites": "開啟收藏名單", + "keyboard_shortcuts.federated": "開啟聯邦時間軸", "keyboard_shortcuts.heading": "鍵盤快速鍵", "keyboard_shortcuts.home": "開啟首頁時間軸", "keyboard_shortcuts.hotkey": "快速鍵", - "keyboard_shortcuts.legend": "顯示此列表", + "keyboard_shortcuts.legend": "顯示此圖例", "keyboard_shortcuts.local": "開啟本機時間軸", "keyboard_shortcuts.mention": "提及作者", "keyboard_shortcuts.muted": "開啟靜音使用者名單", @@ -244,7 +244,7 @@ "keyboard_shortcuts.open_media": "開啟媒體", "keyboard_shortcuts.pinned": "開啟釘選的嘟文名單", "keyboard_shortcuts.profile": "開啟作者的個人資料頁面", - "keyboard_shortcuts.reply": "回覆", + "keyboard_shortcuts.reply": "回應嘟文", "keyboard_shortcuts.requests": "開啟關注請求名單", "keyboard_shortcuts.search": "將焦點移至搜尋框", "keyboard_shortcuts.spoilers": "顯示或隱藏被折疊的正文", @@ -253,7 +253,7 @@ "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體", "keyboard_shortcuts.toot": "開始發出新嘟文", "keyboard_shortcuts.unfocus": "取消輸入文字區塊 / 搜尋的焦點", - "keyboard_shortcuts.up": "往上移動名單項目", + "keyboard_shortcuts.up": "在名單中往上移動", "lightbox.close": "關閉", "lightbox.compress": "折疊圖片檢視框", "lightbox.expand": "展開圖片檢視框", @@ -266,13 +266,13 @@ "lists.edit.submit": "變更標題", "lists.new.create": "新增名單", "lists.new.title_placeholder": "新名單標題", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", - "lists.replies_policy.title": "顯示回覆", + "lists.replies_policy.followed": "任何跟隨的使用者", + "lists.replies_policy.list": "列表成員", + "lists.replies_policy.none": "沒有人", + "lists.replies_policy.title": "顯示回覆:", "lists.search": "搜尋您關注的使用者", "lists.subheading": "您的名單", - "load_pending": "{count, plural, other {# 個新項目}}", + "load_pending": "{count, plural, one {# 個新項目} other {# 個新項目}}", "loading_indicator.label": "讀取中...", "media_gallery.toggle_visible": "切換可見性", "missing_indicator.label": "找不到", @@ -289,7 +289,7 @@ "navigation_bar.discover": "探索", "navigation_bar.domain_blocks": "隱藏的網域", "navigation_bar.edit_profile": "編輯個人資料", - "navigation_bar.favourites": "讚美集", + "navigation_bar.favourites": "收藏", "navigation_bar.filters": "靜音詞彙", "navigation_bar.follow_requests": "關注請求", "navigation_bar.follows_and_followers": "關注及關注者", @@ -303,45 +303,45 @@ "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "聯邦時間軸", "navigation_bar.security": "安全性", - "notification.favourite": "{name} 讚美了你的嘟文", - "notification.follow": "{name} 關注了你", - "notification.follow_request": "{name} 要求關注你", - "notification.mention": "{name} 提到了你", + "notification.favourite": "{name} 把您的嘟文加入了最愛", + "notification.follow": "{name} 關注了您", + "notification.follow_request": "{name} 要求關注您", + "notification.mention": "{name} 提到了您", "notification.own_poll": "您的投票已結束", - "notification.poll": "您投過的投票已經結束", - "notification.reblog": "{name}轉嘟了你的嘟文", + "notification.poll": "您曾投過的投票已經結束", + "notification.reblog": "{name} 轉嘟了您的嘟文", "notification.status": "{name} 剛剛嘟文", "notifications.clear": "清除通知", - "notifications.clear_confirmation": "確定要永久清除你的通知嗎?", + "notifications.clear_confirmation": "確定要永久清除您的通知嗎?", "notifications.column_settings.alert": "桌面通知", - "notifications.column_settings.favourite": "被讚美:", + "notifications.column_settings.favourite": "最愛:", "notifications.column_settings.filter_bar.advanced": "顯示所有分類", "notifications.column_settings.filter_bar.category": "快速過濾欄", "notifications.column_settings.filter_bar.show": "顯示", "notifications.column_settings.follow": "新關注者:", - "notifications.column_settings.follow_request": "新的關注請求:", + "notifications.column_settings.follow_request": "新的關注請求:", "notifications.column_settings.mention": "提及:", "notifications.column_settings.poll": "投票結果:", - "notifications.column_settings.push": "推送通知", + "notifications.column_settings.push": "推播通知", "notifications.column_settings.reblog": "轉嘟:", "notifications.column_settings.show": "在欄位中顯示", - "notifications.column_settings.sound": "播放音效", - "notifications.column_settings.status": "新嘟文:", + "notifications.column_settings.sound": "播放聲音", + "notifications.column_settings.status": "新嘟文:", "notifications.filter.all": "全部", "notifications.filter.boosts": "轉嘟", - "notifications.filter.favourites": "讚美集", + "notifications.filter.favourites": "最愛", "notifications.filter.follows": "關注的使用者", "notifications.filter.mentions": "提及", "notifications.filter.polls": "投票結果", "notifications.filter.statuses": "已跟隨使用者的最新動態", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "授予權限", "notifications.group": "{count} 條通知", "notifications.mark_as_read": "將所有通知都標記為已讀", "notifications.permission_denied": "由於之前拒絕了瀏覽器請求,因此桌面通知不可用", "notifications.permission_denied_alert": "因為之前瀏覽器權限被拒絕,無法啟用桌面通知", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "因為尚未授予所需的權限,所以桌面通知不可用。", "notifications_permission_banner.enable": "啟用桌面通知", - "notifications_permission_banner.how_to_control": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。", + "notifications_permission_banner.how_to_control": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,您可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。", "notifications_permission_banner.title": "不要錯過任何東西!", "picture_in_picture.restore": "還原", "poll.closed": "已關閉", @@ -349,37 +349,37 @@ "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}", "poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}", "poll.vote": "投票", - "poll.voted": "你已對此問題投票", + "poll.voted": "您已對此問題投票", "poll_button.add_poll": "建立投票", "poll_button.remove_poll": "移除投票", - "privacy.change": "調整隱私狀態", - "privacy.direct.long": "只有被提到的使用者能看到", + "privacy.change": "調整嘟文隱私狀態", + "privacy.direct.long": "只有被提及的使用者能看到", "privacy.direct.short": "私訊", - "privacy.private.long": "只有關注你的使用者能看到", + "privacy.private.long": "只有關注您的使用者能看到", "privacy.private.short": "僅關注者", - "privacy.public.long": "嘟到公開時間軸", + "privacy.public.long": "公開,且顯示於公開時間軸", "privacy.public.short": "公開", "privacy.unlisted.long": "公開,但不會顯示在公開時間軸", "privacy.unlisted.short": "不公開", "refresh": "重新整理", "regeneration_indicator.label": "載入中…", - "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!", + "regeneration_indicator.sublabel": "您的主頁時間軸正在準備中!", "relative_time.days": "{number} 天", - "relative_time.hours": "{number} 小時", + "relative_time.hours": "{number}小時前", "relative_time.just_now": "剛剛", - "relative_time.minutes": "{number} 分", + "relative_time.minutes": "{number} 分前", "relative_time.seconds": "{number} 秒", "relative_time.today": "今天", "reply_indicator.cancel": "取消", "report.forward": "轉寄到 {target}", - "report.forward_hint": "這個帳戶屬於其他站點。要像該站點發送匿名的檢舉訊息嗎?", - "report.hint": "這項訊息會發送到您伺服器的管理員。你可以提供檢舉這個帳戶的理由:", - "report.placeholder": "更多訊息", + "report.forward_hint": "這個帳戶屬於其他伺服器。要像該伺服器發送匿名的檢舉訊息嗎?", + "report.hint": "這項訊息會發送到您伺服器的管理員。您可以提供檢舉這個帳戶的理由:", + "report.placeholder": "其他備註", "report.submit": "送出", "report.target": "檢舉 {target}", "search.placeholder": "搜尋", "search_popout.search_format": "進階搜尋格式", - "search_popout.tips.full_text": "輸入簡單的文字,搜尋由你撰寫、贊美、轉嘟或提你的嘟文,以及與關鍵詞匹配的使用者名稱、帳戶名稱和標籤。", + "search_popout.tips.full_text": "輸入簡單的文字,搜尋由您撰寫、收藏、轉嘟或提您的嘟文,以及與關鍵詞匹配的使用者名稱、帳戶顯示名稱和主題標籤。", "search_popout.tips.hashtag": "主題標籤", "search_popout.tips.status": "嘟文", "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤", @@ -394,32 +394,32 @@ "status.block": "封鎖 @{name}", "status.bookmark": "書籤", "status.cancel_reblog_private": "取消轉嘟", - "status.cannot_reblog": "這篇嘟文無法被轉嘟", + "status.cannot_reblog": "這則嘟文無法被轉嘟", "status.copy": "複製嘟文連結", "status.delete": "刪除", - "status.detailed_status": "對話的詳細內容", + "status.detailed_status": "詳細的對話內容", "status.direct": "發送私訊給 @{name}", - "status.embed": "嵌入", - "status.favourite": "讚美", + "status.embed": "內嵌", + "status.favourite": "最愛", "status.filtered": "已過濾", "status.load_more": "載入更多", "status.media_hidden": "隱藏媒體內容", - "status.mention": "提到 @{name}", + "status.mention": "提及 @{name}", "status.more": "更多", "status.mute": "靜音 @{name}", "status.mute_conversation": "靜音對話", - "status.open": "展開嘟文", + "status.open": "展開此嘟文", "status.pin": "釘選到個人資料頁", "status.pinned": "釘選的嘟文", "status.read_more": "閱讀更多", "status.reblog": "轉嘟", "status.reblog_private": "轉嘟給原有關注者", "status.reblogged_by": "{name} 轉嘟了", - "status.reblogs.empty": "還沒有人轉嘟。如果有,會顯示在這裡。", + "status.reblogs.empty": "還沒有人轉嘟過這則嘟文。當有人轉嘟時,它將於此顯示。", "status.redraft": "刪除 & 編輯", "status.remove_bookmark": "移除書籤", "status.reply": "回覆", - "status.replyAll": "回覆所有人", + "status.replyAll": "回覆討論串", "status.report": "檢舉 @{name}", "status.sensitive_warning": "敏感內容", "status.share": "分享", @@ -430,15 +430,15 @@ "status.show_thread": "顯示討論串", "status.uncached_media_warning": "無法使用", "status.unmute_conversation": "解除此對話的靜音", - "status.unpin": "解除置頂", + "status.unpin": "從個人頁面解除釘選", "suggestions.dismiss": "關閉建議", "suggestions.header": "您可能對這些東西有興趣…", - "tabs_bar.federated_timeline": "其他站點", - "tabs_bar.home": "主頁", - "tabs_bar.local_timeline": "本站", + "tabs_bar.federated_timeline": "聯邦宇宙", + "tabs_bar.home": "首頁", + "tabs_bar.local_timeline": "本機", "tabs_bar.notifications": "通知", "tabs_bar.search": "搜尋", - "time_remaining.days": "剩餘{number, plural, one {# 天數} other {# 天數}}", + "time_remaining.days": "剩餘{number, plural, one {# 天} other {# 天}}", "time_remaining.hours": "剩餘{number, plural, one {# 小時} other {# 小時}}", "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}", "time_remaining.moments": "剩餘時間", @@ -449,27 +449,27 @@ "timeline_hint.resources.statuses": "更早的嘟文", "trends.counter_by_accounts": "{count, plural,one {{counter} 人}other {{counter} 人}}正在討論", "trends.trending_now": "目前趨勢", - "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。", + "ui.beforeunload": "如果離開 Mastodon,您的草稿將會不見。", "units.short.billion": "{count}B", "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "拖放來上傳", - "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_button.label": "上傳圖像、影片、或音樂檔案", "upload_error.limit": "已達到檔案上傳限制。", - "upload_error.poll": "不允許在投票上傳檔案。", - "upload_form.audio_description": "簡單描述內容給聽障人士", + "upload_error.poll": "不允許在投票中上傳檔案。", + "upload_form.audio_description": "描述內容給聽障人士", "upload_form.description": "為視障人士增加文字說明", "upload_form.edit": "編輯", "upload_form.thumbnail": "更改預覽圖", "upload_form.undo": "刪除", - "upload_form.video_description": "簡單描述給聽障或視障人士", + "upload_form.video_description": "描述給聽障或視障人士", "upload_modal.analyzing_picture": "正在分析圖片…", "upload_modal.apply": "套用", "upload_modal.choose_image": "選擇圖片", - "upload_modal.description_placeholder": "A quick brown fox 跳過那隻懶狗", - "upload_modal.detect_text": "從圖片偵測文字", + "upload_modal.description_placeholder": "我能吞下玻璃而不傷身體", + "upload_modal.detect_text": "從圖片中偵測文字", "upload_modal.edit_media": "編輯媒體", - "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。", + "upload_modal.hint": "於預覽中點擊或拖曳圓圈以選擇將於所有縮圖中顯示的焦點。", "upload_modal.preparing_ocr": "準備 OCR 中……", "upload_modal.preview_label": "預覽 ({ratio})", "upload_progress.label": "上傳中...", diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml index 24e2760da..d6b3c40e4 100644 --- a/config/locales/activerecord.kab.yml +++ b/config/locales/activerecord.kab.yml @@ -3,7 +3,7 @@ kab: activerecord: attributes: poll: - expires_at: Azemz n tagara + expires_at: Azemz n taggara options: Tifranin errors: models: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 439249d1b..ee3c554b4 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -566,6 +566,7 @@ ca: domain_blocks_rationale: title: Mostra el raonament enable_bootstrap_timeline_accounts: + desc_html: Fer que els nous usuaris segueixin automàticament als comptes configurats i la seva línia de temps no arrenqui buida title: Activa els seguiments per defecte per els usuaris nous hero: desc_html: Es mostra en pàgina frontal. Recomanat al menys 600x100px. Si no es configura es mostrarà el del servidor diff --git a/config/locales/de.yml b/config/locales/de.yml index c2013ab8b..34d03f808 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -402,6 +402,8 @@ de: silence: Stummschaltung suspend: Sperre title: Neue Domain-Blockade + obfuscate: Domainname verschleiern + obfuscate_hint: Den Domainnamen in der Liste teilweise verschleiern, wenn die Liste der Domänenbeschränkungen aktiviert ist private_comment: Privater Kommentar private_comment_hint: Kommentar zu dieser Domain-Beschränkung für die interne Nutzung durch die Moderatoren. public_comment: Öffentlicher Kommentar @@ -564,6 +566,7 @@ de: domain_blocks_rationale: title: Rationale anzeigen enable_bootstrap_timeline_accounts: + desc_html: Neue Benutzer automatisch den konfigurierten Konten folgen lassen, sodass ihr Home-Feed nicht leer startet title: Aktiviere die Option "Konten, denen Neu-Angemeldete automatisch folgen" hero: desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Server-Thumbnail dafür verwendet @@ -921,6 +924,8 @@ de: status: Verifizierungsstatus view_proof: Zeige Nachweis imports: + errors: + over_rows_processing_limit: enthält mehr als %{count} Zeilen modes: merge: Zusammenführen merge_long: Behalte existierende Datensätze und füge neue hinzu diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index 6f652f421..f7b087824 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -21,18 +21,18 @@ zh-TW: action: 驗證電子信箱位址 action_with_app: 確認並返回 %{app} explanation: 您已經在 %{host} 上以此電子信箱位址建立了一支帳戶。您距離啟用它只剩一點之遙了。若這不是您,請忽略此信件。 - explanation_when_pending: 您使用此電子信箱位址申請了 %{host} 的邀請。當您確認電子信箱後我們將審核您的申請,而直到核准前您都無法登入。當您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您,請忽略此信件。 + explanation_when_pending: 您使用此電子信箱位址申請了 %{host} 的邀請。當您確認電子信箱後我們將審核您的申請。您可以登入以改變您的細節或刪除您的帳號,但直到您的帳號被核准之前,您無法操作大部分的功能。若您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您,請忽略此信件。 extra_html: 同時也請看看伺服器規則服務條款。 subject: Mastodon:%{instance} 確認說明 title: 驗證電子信箱位址 email_changed: explanation: 您帳戶的電子信箱位址將變更為: - extra: 若您未變更電子信箱,那麼很有可能是某人取得了你帳戶的存取權限。請立刻變更密碼,或當帳戶被鎖定時,請聯絡伺服器的管理員。 + extra: 若您未變更電子信箱,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或當帳戶被鎖定時,請聯絡伺服器的管理員。 subject: Mastodon:已變更電子信箱 title: 新電子信箱位址 password_change: explanation: 您帳戶的密碼已變更。 - extra: 如果您未變更密碼,那麼很有可能是某人取得了帳戶的存取權限。請立刻變更密碼,或若帳戶被鎖定時,請聯絡伺服器的管理員。 + extra: 若您未變更密碼,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或若帳戶被鎖定時,請聯絡伺服器的管理員。 subject: Mastodon:已變更密碼 title: 密碼已變更 reconfirmation_instructions: @@ -43,7 +43,7 @@ zh-TW: reset_password_instructions: action: 變更密碼 explanation: 您已請求帳戶的新密碼。 - extra: 若您並未請求,請忽略此信件。您的密碼在存取上方連結並建立新連結前不會變更。 + extra: 若您並未請求,請忽略此信件。您的密碼在存取上方連結並建立新密碼前不會變更。 subject: Mastodon:重設密碼指引 title: 重設密碼 two_factor_disabled: @@ -63,27 +63,27 @@ zh-TW: webauthn_credential: added: explanation: 下面的安全密鑰已經新增至您的帳戶 - subject: 'Mastodon: 新安全密鑰' + subject: Mastodon:新安全密鑰 title: 已新增新安全密鑰 deleted: - explanation: 下面的安全密鑰已經從您的帳戶中移除 - subject: 'Mastodon: 安全密鑰已移除' + explanation: 以下的安全密鑰已經從您的帳戶中移除 + subject: Mastodon:安全密鑰已移除 title: 您的一支安全密鑰已經被移除 webauthn_disabled: explanation: 您的帳戶並沒有啟用安全密鑰認證方式。只能以 TOTP app 產生地成對 token 登入。 - subject: 'Mastodon: 安全密鑰認證方式已關閉' + subject: Mastodon:安全密鑰認證方式已關閉 title: 已關閉安全密鑰 webauthn_enabled: - explanation: 安全密鑰認證已在您的帳戶中啟用。您可以使用安全密鑰登入了。 - subject: 'Mastodon: 以啟用安全密鑰認證' - title: 已開啟安全密鑰 + explanation: 您的帳戶已啟用安全密鑰認證。您可以使用安全密鑰登入了。 + subject: Mastodon:已啟用安全密鑰認證 + title: 已啟用安全密鑰 omniauth_callbacks: failure: 無法透過 %{kind} 認證是否為您,因為「%{reason}」。 success: 成功透過 %{kind} 帳戶登入。 passwords: no_token: 您必須透過密碼重設信件才能存取此頁面。若確實如此,請確定輸入的網址是完整的。 - send_instructions: 若電子信箱位址存在於資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 - send_paranoid_instructions: 若電子信箱位址存在於資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 + send_instructions: 若電子信箱位址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 + send_paranoid_instructions: 若電子信箱位址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 updated: 您的密碼已成功變更,現在已經登入。 updated_not_active: 您的密碼已成功變更。 registrations: @@ -93,14 +93,14 @@ zh-TW: signed_up_but_locked: 您已註冊成功,但由於您的帳戶已被鎖定,我們無法讓您登入。 signed_up_but_pending: 包含確認連結的訊息已寄到您的電子信箱。按下此連結後我們將審核您的申請。核准後將通知您。 signed_up_but_unconfirmed: 包含確認連結的訊息已寄到您的電子信箱。請前往連結以啟用帳號。若未收到請檢查垃圾郵件資料夾。 - update_needs_confirmation: 已更新您的帳號,但仍需驗證您的新信箱。請檢查電子信箱並前往確認連結來確認新信箱位址。若未收到請檢查垃圾郵件資料夾。 + update_needs_confirmation: 已成功更新您的帳號,但仍需驗證您的新信箱。請檢查電子信箱並前往確認連結來確認新信箱位址。若未收到請檢查垃圾郵件資料夾。 updated: 您的帳戶已成功更新。 sessions: already_signed_out: 已成功登出。 signed_in: 已成功登入。 signed_out: 已成功登出。 unlocks: - send_instructions: 幾分鐘後您將收到確認信件。若未收到此信件,請檢查垃圾郵件資料夾。 + send_instructions: 幾分鐘後您將收到解鎖帳號的指引信件。若未收到請檢查垃圾郵件資料夾。 send_paranoid_instructions: 若此帳號存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。 unlocked: 已解鎖您的帳戶,請登入繼續。 errors: diff --git a/config/locales/el.yml b/config/locales/el.yml index 837d6f416..5442d38b8 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -557,6 +557,7 @@ el: domain_blocks_rationale: title: Εμφάνιση σκεπτικού enable_bootstrap_timeline_accounts: + desc_html: Οι νέοι χρήστες να ακολουθούν τους προρυθμισμένουνς λογαριασμούς ώστε η αρχική ροή τους να μην είναι άδεια title: Προεπιλογή παρακολούθησης για τους νέους χρήστες hero: desc_html: Εμφανίζεται στην μπροστινή σελίδα. Συνίσταται τουλάχιστον 600x100px. Όταν λείπει, χρησιμοποιείται η μικρογραφία του κόμβου diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 93f663641..32e079074 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -566,6 +566,7 @@ es-AR: domain_blocks_rationale: title: Mostrar razonamiento enable_bootstrap_timeline_accounts: + desc_html: Hacer que los nuevos usuarios sigan automáticamente las cuentas configuradas para que su línea temporal principal no comience vacía title: Habilitar seguimientos predeterminados para nuevas cuentas hero: desc_html: Mostrado en la página principal. Se recomienda un tamaño mínimo de 600x100 píxeles. Predeterminadamente se establece a la miniatura del servidor diff --git a/config/locales/es.yml b/config/locales/es.yml index 8d458edc6..0582fd1f1 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -566,6 +566,7 @@ es: domain_blocks_rationale: title: Mostrar la razón de ser enable_bootstrap_timeline_accounts: + desc_html: Hacer que los nuevos usuarios sigan automáticamente las cuentas configuradas para que su línea temporal de inicio no comience vacía title: Habilitar seguimientos predeterminados para usuarios nuevos hero: desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia diff --git a/config/locales/fr.yml b/config/locales/fr.yml index bed43fee1..0c96d462d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -566,6 +566,7 @@ fr: domain_blocks_rationale: title: Montrer la raison enable_bootstrap_timeline_accounts: + desc_html: Faire suivre automatiquement les comptes configurés aux nouveaux·lles utilisateurs·rices afin que leur flux personnel ne démarre pas vide title: Activer les abonnements par défaut pour les nouveaux·elles utilisateur·rice·s hero: desc_html: Affichée sur la page d’accueil. Au moins 600x100px recommandé. Lorsqu’elle n’est pas définie, se rabat sur la vignette du serveur diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 36980f800..48aaff0ad 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -402,6 +402,8 @@ gl: silence: Silenciar suspend: Suspender title: Novo bloqueo de dominio + obfuscate: Ofuscar o nome de dominio + obfuscate_hint: Ofuscar parcialmente o nome do dominio na lista se está activada a publicación da lista de limitacións de dominio private_comment: Comentario privado private_comment_hint: Comentar sobre esta limitación de dominio para uso interno polos moderadores. public_comment: Comentario público @@ -564,6 +566,7 @@ gl: domain_blocks_rationale: title: Amosar motivo enable_bootstrap_timeline_accounts: + desc_html: Facer que as novas usuarias sigan automáticamente certas contas para que así a cronoloxía inicial non esté baleira title: Activar seguimentos por omisión para novas usuarias hero: desc_html: Amosado na páxina principal. Polo menos 600x100px recomendados. Se non está definido, estará por defecto a miniatura do servidor @@ -921,6 +924,8 @@ gl: status: Estado da validación view_proof: Ver proba imports: + errors: + over_rows_processing_limit: contén máis de %{count} filas modes: merge: Fusionar merge_long: Manter os rexistros actuais e engadir novos diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 0fc35c9ac..97596ff0c 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -21,9 +21,9 @@ hu: federation_hint_html: Egy %{instance} fiókkal bármely más Mastodon szerveren vagy a föderációban lévő felhasználót követni tudsz. get_apps: Próbálj ki egy mobil appot hosted_on: "%{domain} Mastodon szerver" - instance_actor_flash: 'Ez a fiók egy virtuális szereplő, mely magát a szervert reprezentálja, nem egy felhasználót. Ez a föderáció támogatására készült, ezért nem szabad blokkolni, hacsak egy teljes szervert nem akarsz kitiltani, amire persze a domain blokkolása jobb megoldás. - -' + instance_actor_flash: | + Ez a fiók virtuális, magát a szervert reprezentálja, nem pedig konkrét + felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni, hacsak nem akarod a teljes szervert kitiltani, mely esetben a domain tiltásának használata javasolt. learn_more: Tudj meg többet privacy_policy: Adatvédelmi szabályzat see_whats_happening: Nézd, mi történik @@ -60,7 +60,9 @@ hu: one: Követő other: Követő following: Követett - instance_actor_flash: Ez a fiók virtuális és magát a kiszolgálót reprezentálja, nem egy konkrét felhasználót. Föderációs célokból használt, és nem szabad felfüggeszteni. + instance_actor_flash: |- + Ez a fiók virtuális, magát a szervert reprezentálja, nem pedig konkrét + felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni. joined: Csatlakozott %{date} last_active: utoljára aktív link_verified_on: A link tulajdonosát %{date} -n ellenőriztük @@ -226,15 +228,15 @@ hu: create_announcement: Közlemény létrehozása create_custom_emoji: Egyéni emodzsi létrehozása create_domain_allow: Domain engedélyezés létrehozása - create_domain_block: Domain blokkolás létrehozása - create_email_domain_block: E-mail domain blokkolás létrehozása + create_domain_block: Domain tiltás létrehozása + create_email_domain_block: E-mail domain tiltás létrehozása create_ip_block: IP szabály létrehozása demote_user: Felhasználó lefokozása destroy_announcement: Közlemény törlése destroy_custom_emoji: Egyéni emodzsi törlése destroy_domain_allow: Domain engedélyezés törlése - destroy_domain_block: Domain blokkolás törlése - destroy_email_domain_block: E-mail domain blokkolás törlése + destroy_domain_block: Domain tiltás törlése + destroy_email_domain_block: E-mail domain tiltás törlése destroy_ip_block: IP szabály törlése destroy_status: Állapot törlése disable_2fa_user: Kétlépcsős hitelesítés letiltása @@ -257,7 +259,7 @@ hu: unsuspend_account: Fiók felfüggesztésének feloldása update_announcement: Közlemény frissítése update_custom_emoji: Egyéni emodzsi frissítése - update_domain_block: Domain blokkolás frissítése + update_domain_block: Domain tiltás frissítése update_status: Állapot frissítése actions: assigned_to_self_report: "%{name} a %{target} bejelentést magához rendelte" @@ -268,14 +270,14 @@ hu: create_custom_emoji: "%{name} új emodzsit töltött fel: %{target}" create_domain_allow: "%{name} engedélyező listára vette %{target} domaint" create_domain_block: "%{name} letiltotta az alábbi domaint: %{target}" - create_email_domain_block: "%{name} feketelistára tette az alábbi e-mail domaint: %{target}" + create_email_domain_block: "%{name} letiltotta az e-mail domaint: %{target}" create_ip_block: "%{name} létrehozott egy szabályt a %{target} IP-vel kapcsolatban" demote_user: "%{name} lefokozta az alábbi felhasználót: %{target}" destroy_announcement: "%{name} törölte a közleményt %{target}" destroy_custom_emoji: "%{name} törölte az emodzsit: %{target}" destroy_domain_allow: "%{name} leszedte %{target} domaint az engedélyező listáról" destroy_domain_block: "%{name} engedélyezte az alábbi domaint: %{target}" - destroy_email_domain_block: "%{name} fehérlistára tette az alábbi e-mail domaint: %{target}" + destroy_email_domain_block: "%{name} engedélyezte az e-mail domaint: %{target}" destroy_ip_block: "%{name} törölt egy szabályt a %{target} IP-vel kapcsolatban" destroy_status: "%{name} eltávolította az alábbi felhasználó tülkjét: %{target}" disable_2fa_user: "%{name} kikapcsolta a kétlépcsős azonosítást %{target} felhasználó fiókján" @@ -298,7 +300,7 @@ hu: unsuspend_account: "%{name} feloldotta %{target} felhasználói fiókjának felfüggesztését" update_announcement: "%{name} frissítette a közleményt %{target}" update_custom_emoji: "%{name} frissítette az alábbi emodzsit: %{target}" - update_domain_block: "%{name} frissítette a(z) %{target} domain blokkolását" + update_domain_block: "%{name} frissítette a %{target} domain tiltását" update_status: "%{name} frissítette %{target} felhasználó tülkjét" deleted_status: "(törölt tülk)" empty: Nem található napló. @@ -430,16 +432,16 @@ hu: view: Domain tiltásának megtekintése email_domain_blocks: add_new: Új hozzáadása - created_msg: E-mail domain sikeresen hozzáadva a feketelistához + created_msg: E-mail domain sikeresen letiltva delete: Törlés - destroyed_msg: E-mail domain sikeresen eltávolítva a feketelistáról + destroyed_msg: E-mail domain sikeresen engedélyezve domain: Domain - empty: Nincs email domain a feketelistán. + empty: Nincs letiltott email domain. from_html: "%{domain}-ról" new: create: Domain hozzáadása - title: Új e-mail feketelista bejegyzés - title: E-mail feketelista + title: Új e-mail domain tiltása + title: Tiltott e-mail domainek instances: by_domain: Domain delivery_available: Kézbesítés elérhető @@ -566,6 +568,7 @@ hu: domain_blocks_rationale: title: Mutasd meg az indokolást enable_bootstrap_timeline_accounts: + desc_html: Az új felhasználók automatikusan követik a beállított fiókokat, így a Saját idővonaluk kezdéskor nem lesz üres title: Alapértelmezett követés engedélyezése új felhasználóknak hero: desc_html: A kezdőoldalon látszik. Legalább 600x100px méret javasolt. Ha nincs beállítva, a szerver bélyegképet használjuk @@ -1004,7 +1007,7 @@ hu: moderation: title: Moderáció move_handler: - carry_blocks_over_text: Ez a fiók elköltözött innen %{acct}, melyet blokkoltatok. + carry_blocks_over_text: Ez a fiók elköltözött innen %{acct}, melyet letiltottatok. carry_mutes_over_text: Ez a fiók elköltözött innen %{acct}, melyet lenémítottatok. copy_account_note_text: 'Ez a fiók elköltözött innen %{acct}, itt vannak a bejegyzéseitek róla:' notification_mailer: @@ -1187,7 +1190,7 @@ hu: preferences: Beállítások profile: Profil relationships: Követések és követők - two_factor_authentication: Kétlépcsős azonosítás + two_factor_authentication: Kétlépcsős hitelesítés webauthn_authentication: Biztonsági kulcsok spam_check: spam_detected: Ez egy automatikus jelentés. Spamet érzékeltünk. diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 1afd4d927..48050d6a2 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -166,10 +166,12 @@ hy: roles: admin: Ադմինիստրատոր moderator: Մոդերատոր + staff: Անձնակազմ user: Oգտատէր search: Որոնել search_same_email_domain: Այլ օգտատէրեր նոյն էլ․ փոստի դոմէյնով search_same_ip: Այլ օգտատէրեր նոյն IP֊ով + sensitive: Զգայուն show: created_reports: Կազմել բողոքներ targeted_reports: Այլոց կողմից բողոքարկուած @@ -194,6 +196,7 @@ hy: confirm_user: Հաստատել օգտատիրոջը create_account_warning: Ստեղծել զգուշացում create_announcement: Ստեղծել յայտարարութիւն + create_custom_emoji: Ստեղծել սեփական էմոջիները create_email_domain_block: Ստեղծել էլ․ հասցէի դոմէյնի արգելափակում create_ip_block: Ստեղծել IP կանոն destroy_announcement: Ջնջել յայտարարութիւնը @@ -278,8 +281,11 @@ hy: image_hint: PNG մինչեւ 50KB list: Ցանկ listed: Ցուցակագրուած + new: + title: Աւելացնել նոր էմոջի overwrite: Վերագրել shortcode: Հապավում + title: Սեփական էմօջիներ uncategorized: Չդասակարգուած unlist: Ապացուցակագրում unlisted: Ծածուկ @@ -290,6 +296,7 @@ hy: feature_invites: Հրաւէրի յղումներ feature_profile_directory: Օգտատիրոջ մատեան feature_registrations: Գրանցումներ + feature_spam_check: Հակա-սպամ feature_timeline_preview: Հոսքի նախադիտում features: Յատկանիշներ open_reports: բաց բողոքներ @@ -346,6 +353,7 @@ hy: title: էլ․ փոստի արգելափակուած տիրոյթներ instances: by_domain: Դոմեն + empty: Դոմեյնները չեն գտնուել known_accounts: one: "%{count} յայտնի հաշիւ" other: "%{count} յայտնի հաշիւներ" @@ -387,6 +395,7 @@ hy: relationships: title: "%{acct}ի յարաբերութիւններ" relays: + add_new: Աւելացնել նոր վերահեռարձակուիչ delete: Ջնջել disable: Անջատել disabled: Անջատված է @@ -424,6 +433,7 @@ hy: updated_at: Թարմացուած settings: contact_information: + email: Գործնական էլփոստ username: Կոնտակտի ծածկանուն custom_css: title: Սեփական CSS @@ -449,6 +459,10 @@ hy: approved: Գրանցման համար անհրաժեշտ է հաստատում none: Ոչ ոք չի կարող գրանցուել open: Բոլորը կարող են գրանցուել + title: Գրանցումային ռեժիմ + show_staff_badge: + desc_html: Ցուցադրել անձնակազմի անդամի նշանը օգտատիրոջ էջում + title: Ցուցադրել անձնակազմի անդամի նշանը site_description: title: Կայքի նկարագրութիւն site_short_description: @@ -468,10 +482,13 @@ hy: back_to_account: Վերադառնալ անձնական էջ batch: delete: Ջնջել + nsfw_on: Նշել որպէս դիւրազգաց deleted: Ջնջված է + failed_to_execute: Կատարումը ձախողուեց media: title: Մեդիա no_media: Մեդիա չկայ + title: Օգտատիրոջ գրառումները with_media: Մեդիայի հետ tags: context: Համատեքստ @@ -509,6 +526,7 @@ hy: view_status: Նայել գրառումը applications: invalid_url: Տրամադրուած URL անվաւեր է + your_token: Քո մուտքի բանալին auth: apply_for_account: Հրաւէրի հարցում change_password: Գաղտնաբառ @@ -519,6 +537,7 @@ hy: login: Մտնել logout: Դուրս գալ migrate_account: Տեղափոխուել այլ հաշիւ + or_log_in_with: Կամ մուտք գործել օգտագործելով՝ providers: cas: CAS saml: SAML @@ -531,6 +550,7 @@ hy: title: Կարգավորում status: account_status: Հաշուի կարգավիճակ + pending: Դիմումը պէտք է քննուի մեր անձնակազմի կողմից, ինչը կարող է մի փոքր ժամանակ խլել։ Դիմումի հաստատուելու դէպքում, կտեղեկացնենք նամակով։ authorize_follow: follow: Հետևել following: Յաջողութի՜ւն։ Դու այժմ հետեւում ես․ @@ -578,7 +598,7 @@ hy: 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. + '404': Էջը, որը փնտրում ես գոյութիւն չունի։ '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': @@ -633,6 +653,7 @@ hy: identity_proofs: active: Ակտիվ authorize: Այո, նոյնականացնել + authorize_connection_prompt: Հաւաստագրէ՞լ այս ծածկագրման կապակցումը i_am_html: Ես %{username}ն եմ %{service}ում։ identity: Ինքնութիւն inactive: Ոչ ակտիւ @@ -650,6 +671,7 @@ hy: blocking: Արգելափակումների ցուցակ bookmarks: Էջանիշեր domain_blocking: Տիրոյթի արգելափակումների ցուցակ + following: Հետեւումների ցանկ upload: Վերբեռնել invites: delete: Ապաակտիւացնել @@ -680,11 +702,14 @@ hy: not_found: չգտնուեց past_migrations: Նախոդ միգրացիաները proceed_with_move: Տեղափոխել հետեւորդներին + redirecting_to: Քո հաշիւը վերահասցեաորում է %{acct}-ին warning: followers: Այս քայլով քո բոլոր հետեւորդներին այս հաշուից կը տեղափոխես դէպի նորը moderation: title: Մոդերացիա notification_mailer: + digest: + title: Երբ բացակայ էիր... favourite: title: Նոր հաւանում follow: @@ -695,6 +720,8 @@ hy: title: Նոր հետեւելու հայցեր mention: action: Պատասխանել + notifications: + other_settings: Ծանուցումների այլ կարգաւորումներ number: human: decimal_units: @@ -714,8 +741,12 @@ hy: older: Ավելի հին prev: Նախորդ truncate: "…" + polls: + errors: + duration_too_short: շատ կարճ է preferences: other: Այլ + posting_defaults: Կանխադիր կարգաւորումներ public_timelines: Հանրային հոսք relationships: activity: Հաշուի ակտիւութիւնը @@ -732,6 +763,8 @@ hy: remove_selected_domains: Հեռացնել բոլոր հետեւորդներին նշուած դոմեյններից remove_selected_followers: Հեռացնել նշուած հետեւորդներին status: Հաշուի կարգավիճակ + scheduled_statuses: + too_soon: Նախադրուած ամսաթիւը պէտք է լինի ապագայում sessions: activity: Վերջին թութը browser: Դիտարկիչ @@ -771,11 +804,14 @@ hy: title: Սեսսիա settings: account: Հաշիվ + account_settings: Հաշուի կարգաւորումներ appearance: Տեսք + back: Ետ գնալ մաստադոն delete: Հաշուի ջնջում development: Ծրագրավորում edit_profile: Խմբագրել պրոֆիլը export: Տվյալների արտահանում + featured_tags: Ընտրուած հէշթեգեր identity_proofs: Անձի նոյնացումներ import: Ներմուծել import_and_export: Ներմուծել և արտահանել @@ -926,12 +962,21 @@ hy: otp: Նոյնականացման հավելված recovery_codes: Վերականգնման կոդեր recovery_codes_regenerated: Վերականգման կոդերը հաջողութեամբ ստեղծուել են + webauthn: Անվտանգութեան բանալիներ user_mailer: + sign_in_token: + title: Մուտքի փորձ warning: + get_in_touch: Կարող էք կապուել %{instance} հանգոյցի անձնակազմի հետ պատասխանելով այս նամակին։ + statuses: Մասնաւորապէս, միայն՝ title: none: Զգուշացում + sensitive: Մեդիաֆայլը պիտակուել է որպէս զգայուն։ + suspend: Հաշիւը արգելափակուած է welcome: + edit_profile_action: Կարգաւորել հաշիւը final_action: Սկսել թթել + review_preferences_action: Փոփոխել կարգաւորումները subject: Բարի գալուստ Մաստոդոն tip_federated_timeline: Դաշնային հոսքում երևում է ամբողջ Մաստոդոնի ցանցը։ Բայց այն ներառում է միայն այն օգտատերերին որոնց բաժանորդագրուած են ձեր հարևաններ, այդ պատճառով այն կարող է լինել ոչ ամբողջական։ tip_following: Դու հետեւում էս քո հանգոյցի ադմին(ներ)ին լռելայն։ Այլ հետաքրքիր անձանց գտնելու համար՝ թերթիր տեղական և դաշնային հոսքերը։ @@ -949,3 +994,4 @@ hy: verification: Ստուգում webauthn_credentials: delete: Ջնջել + registered_on: Գրանցուել է %{date} diff --git a/config/locales/id.yml b/config/locales/id.yml index 8d3291adf..bf63f62a4 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -556,6 +556,7 @@ id: domain_blocks_rationale: title: Tampilkan alasan enable_bootstrap_timeline_accounts: + desc_html: Buat pengguna baru mengikuti akun yang sudah dipilih agar beranda mereka tidak kosong title: Aktifkan opsi ikuti otomatis untuk pengguna baru hero: desc_html: Ditampilkan di halaman depan. Direkomendasikan minimal 600x100px. Jika tidak diatur, kembali ke server gambar kecil diff --git a/config/locales/is.yml b/config/locales/is.yml index 97ac62a4d..2d6102d98 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -566,6 +566,7 @@ is: domain_blocks_rationale: title: Birta röksemdafærslu enable_bootstrap_timeline_accounts: + desc_html: Láta nýja notendur sjálfkrafa fylgjast með uppsettum aðgöngum svo að heimastreymi þeirra byrji ekki autt title: Virkja sjálfgefnar fylgnistillingar fyrir nýja notendur hero: desc_html: Birt á forsíðunni. Mælt með að hún sé a.m.k. 600×100 mynddílar. Þegar þetta er ekki stillt, er notuð smámynd netþjónsins diff --git a/config/locales/it.yml b/config/locales/it.yml index 65e24a4c7..1e0ab42f0 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -566,6 +566,7 @@ it: domain_blocks_rationale: title: Mostra motivazione enable_bootstrap_timeline_accounts: + desc_html: I nuovi utenti seguiranno automaticamente gli account configurati, in modo che il loro home feed all'inizio non sia vuoto title: Abilita seguiti predefiniti per i nuovi utenti hero: desc_html: Mostrata nella pagina iniziale. Almeno 600x100 px consigliati. Se non impostata, sarà usato il thumbnail del server diff --git a/config/locales/ko.yml b/config/locales/ko.yml index c7b63fbf7..cc4ec52cd 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -128,6 +128,7 @@ ko: follows: 팔로잉 수 header: 헤더 inbox_url: 수신함 URL + invite_request_text: 가입 하려는 이유 invited_by: 초대자 ip: IP joined: 가입 @@ -399,6 +400,8 @@ ko: silence: 침묵 suspend: 정지 title: 새로운 도메인 차단 + obfuscate: 도메인 이름 난독화 + obfuscate_hint: 도메인 제한 목록을 공개하는 경우 도메인 이름의 일부를 난독화 합니다 private_comment: 비공개 주석 private_comment_hint: 이 도메인 제한에 대한 주석은 중재자를 위해 내부적으로 사용 됩니다. public_comment: 공개 주석 @@ -557,6 +560,7 @@ ko: domain_blocks_rationale: title: 사유 보여주기 enable_bootstrap_timeline_accounts: + desc_html: 새 사용자들이 자동으로 설정 된 계정들을 팔로우 하도록 해서 그들의 홈 피드가 빈 상태로 시작하지 않도록 합니다 title: 새 유저가 팔로우할 계정을 보여주기 hero: desc_html: 프론트페이지에 표시 됩니다. 최소 600x100픽셀을 권장합니다. 만약 설정되지 않았다면, 서버의 썸네일이 사용 됩니다 diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 603bf157a..2f24ee3ec 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -1,32 +1,52 @@ --- ml: about: + about_this: കുറിച്ച് + api: API + apps: മൊബൈൽ ആപ്പുകൾ + contact: ബന്ധപ്പെടുക contact_missing: സജ്ജമാക്കിയിട്ടില്ല contact_unavailable: ലഭ്യമല്ല discover_users: ഉപയോഗ്‌താക്കളെ കണ്ടെത്തുക + get_apps: മൊബൈൽ ആപ്പ് പരീക്ഷിക്കുക learn_more: കൂടുതൽ പഠിക്കുക privacy_policy: സ്വകാര്യതാ നയം see_whats_happening: എന്തൊക്കെ സംഭവിക്കുന്നു എന്ന് കാണുക + source_code: സോഴ്സ് കോഡ് status_count_before: ആരാൽ എഴുതപ്പെട്ടു tagline: സുഹൃത്തുക്കളെ പിന്തുടരുകയും പുതിയവരെ കണ്ടെത്തുകയും ചെയ്യുക terms: സേവന വ്യവസ്ഥകൾ unavailable_content: ലഭ്യമല്ലാത്ത ഉള്ളടക്കം unavailable_content_description: + domain: സെർവർ reason: കാരണം what_is_mastodon: എന്താണ് മാസ്റ്റഡോൺ? accounts: follow: പിന്തുടരുക - following: നിങ്ങൾ പിന്തുടരുന്നവർ + following: പിന്തുടരുന്നു joined: "%{date} ൽ ചേർന്നു" last_active: അവസാനം സജീവമായിരുന്നത് link_verified_on: സന്ധിയുടെ ഉടമസ്ഥാവസ്‌കാശം %{date} ൽ പരിശോധിക്കപ്പെട്ടു media: മാധ്യമങ്ങൾ moved_html: "%{name}, %{new_profile_link} ലേക്ക് നീങ്ങിയിരിക്കുന്നു:" + network_hidden: ഈ വിവരം ലഭ്യമല്ല + nothing_here: ഇവിടെ ഒന്നുമില്ല! + posts_tab_heading: ടൂട്ടുകൾ + posts_with_replies: ടൂട്ടുകളും മറുപടികളും + roles: + admin: അഡ്‌മിന്‍ + bot: ബോട്ട് + group: ഗ്രൂപ്പ് + unavailable: പ്രൊഫൈൽ ലഭ്യമല്ല admin: account_moderation_notes: delete: മായ്ക്കുക accounts: + add_email_domain_block: ഇ-മെയിൽ ഡൊമെയ്ൻ തടയുക approve: അംഗീകരിക്കുക + approve_all: എല്ലാം അംഗീകരിക്കുക + are_you_sure: നിങ്ങൾക്ക് ഉറപ്പാണോ? + avatar: അവതാർ by_domain: മേഖല change_email: changed_msg: അംഗത്തിന്റെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം വിജയകരമായി മാറ്റിയിരിക്കുന്നു! @@ -37,6 +57,8 @@ ml: title: "%{username} ന്റെ ഇലക്ട്രോണിക് കത്ത് മേൽവിലാസം മാറ്റുക" confirm: നിജപ്പെടുത്തുക confirmed: നിജപ്പെടുത്തി + confirming: സ്ഥിരീകരിക്കുന്നു + delete: ഡാറ്റ ഇല്ലാതാക്കുക deleted: മായിച്ചു demote: തരം താഴ്ത്തുക disable: പ്രവര്‍ത്തന രഹിതമാക്കുക @@ -44,6 +66,56 @@ ml: disabled: പ്രവർത്തന രഹിതമാക്കപ്പെട്ടിരിക്കുന്നു display_name: കാണപ്പെടുന്ന നാമം domain: മേഖല + edit: തിരുത്തുക + email: ഇമെയിൽ + header: തലക്കെട്ട് + location: + all: എല്ലാം + moderation: + active: സജീവമാണ് + all: എല്ലാം + resend_confirmation: + send: സ്ഥിരീകരണ ഇമെയിൽ വീണ്ടും അയയ്ക്കുക + success: സ്ഥിരീകരണ ഇമെയിൽ വിജയകരമായി അയച്ചു! + reset: പുനഃക്രമീകരിക്കുക + reset_password: പാസ്‌വേഡ് പുനഃക്രമീകരിക്കുക + role: അനുമതികൾ + roles: + user: ഉപയോക്താവ് + search: തിരയുക + title: അക്കൗണ്ടുകൾ + unconfirmed_email: സ്ഥിരീകരിക്കാത്ത ഇമെയിൽ + username: ഉപയോക്തൃനാമം + web: വെബ് + action_logs: + action_types: + confirm_user: ഉപയോക്താവിനെ സ്ഥിരീകരിക്കുക + remove_avatar_user: അവതാർ നീക്കംചെയ്യുക + reset_password_user: പാസ്‌വേഡ് പുനഃക്രമീകരിക്കുക + custom_emojis: + copy: പകര്‍ത്തുക + create_new_category: പുതിയ വിഭാഗം സൃഷ്ടിക്കുക + delete: ഇല്ലാതാക്കുക + emoji: ഇമോജി + dashboard: + feature_profile_directory: പ്രൊഫൈൽ ഡയറക്ടറി + features: സവിശേഷതകൾ + title: ഡാഷ്ബോർഡ് + total_users: മൊത്തം ഉപയോക്താക്കൾ + trends: ട്രെൻഡുകൾ + email_domain_blocks: + add_new: പുതിയത് ചേര്‍ക്കുക + delete: ഇല്ലാതാക്കുക + domain: ഡൊമൈന്‍ + new: + create: ഡൊമൈൻ ചേര്‍ക്കുക + invites: + filter: + all: എല്ലാം + authorize_follow: + following: 'വിജയകരം! നിങ്ങൾ ഇപ്പോൾ പിന്തുടരുന്നു:' + directories: + directory: പ്രൊഫൈൽ ഡയറക്ടറി errors: '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. @@ -54,3 +126,18 @@ ml: '429': Too many requests '500': '503': The page could not be served due to a temporary server failure. + filters: + contexts: + notifications: അറിയിപ്പുകൾ + generic: + all: എല്ലാം + notification_mailer: + digest: + action: എല്ലാ അറിയിപ്പുകളും കാണിക്കുക + follow: + body: "%{name} ഇപ്പോൾ നിങ്ങളെ പിന്തുടരുന്നു!" + subject: "%{name} ഇപ്പോൾ നിങ്ങളെ പിന്തുടരുന്നു" + relationships: + following: പിന്തുടരുന്നു + settings: + notifications: അറിയിപ്പുകൾ diff --git a/config/locales/nl.yml b/config/locales/nl.yml index d9c4e20fa..a419e0b47 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -60,6 +60,7 @@ nl: one: Volger other: Volgers following: Volgend + instance_actor_flash: Dit account is een 'virtual actor' waarmee de server zichzelf vertegenwoordigd en is dus geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden opgeschort. joined: Geregistreerd in %{date} last_active: laatst actief link_verified_on: Eigendom van deze link is gecontroleerd op %{date} @@ -131,6 +132,7 @@ nl: follows: Volgt header: Omslagfoto inbox_url: Inbox-URL + invite_request_text: Redenen om te registreren invited_by: Uitgenodigd door ip: IP joined: Geregistreerd in @@ -207,8 +209,11 @@ nl: undo_sensitized: Niet meer als gevoelig markeren undo_silenced: Niet langer negeren undo_suspension: Niet langer opschorten + unsilenced_msg: Het opheffen van de beperkingen van %{username} zijn geslaagd unsubscribe: Opzeggen + unsuspended_msg: Het niet langer opschorten van %{username} is geslaagd username: Gebruikersnaam + view_domain: Samenvatting voor domein bekijken warn: Waarschuwen web: Webapp whitelisted: Goedgekeurd voor federatie @@ -243,13 +248,16 @@ nl: reopen_report: Rapportage heropenen reset_password_user: Wachtwoord opnieuw instellen resolve_report: Rapportage oplossen + sensitive_account: De media in jouw account als gevoelig markeren silence_account: Account negeren suspend_account: Account opschorten unassigned_report: Rapportage niet langer toewijzen + unsensitive_account: De media in jouw account niet langer als gevoelig markeren unsilence_account: Account niet langer negeren unsuspend_account: Account niet langer opschorten update_announcement: Mededeling bijwerken update_custom_emoji: Lokale emoji bijwerken + update_domain_block: Domeinblokkade bijwerken update_status: Toot bijwerken actions: assigned_to_self_report: "%{name} heeft rapportage %{target} aan zichzelf toegewezen" @@ -428,6 +436,7 @@ nl: instances: by_domain: Domein delivery_available: Bezorging is mogelijk + empty: Geen domeinen gevonden. known_accounts: one: "%{count} bekend account" other: "%{count} bekende accounts" @@ -505,6 +514,8 @@ nl: comment: none: Geen created_at: Gerapporteerd op + forwarded: Doorgestuurd + forwarded_to: Doorgestuurd naar %{domain} mark_as_resolved: Markeer als opgelost mark_as_unresolved: Markeer als onopgelost notes: @@ -742,6 +753,7 @@ nl: functional: Jouw account is volledig operationeel. pending: Jouw aanvraag moet nog worden beoordeeld door een van onze medewerkers. Dit kan misschien eventjes duren. Je ontvangt een e-mail wanneer jouw aanvraag is goedgekeurd. redirecting_to: Jouw account is inactief omdat het momenteel wordt doorverwezen naar %{acct}. + too_fast: Formulier is te snel ingediend. Probeer het nogmaals. trouble_logging_in: Problemen met inloggen? use_security_key: Beveiligingssleutel gebruiken authorize_follow: @@ -901,6 +913,8 @@ nl: status: Verificatiestatus view_proof: Bekijk bewijs imports: + errors: + over_rows_processing_limit: bevat meer dan %{count} rijen modes: merge: Samenvoegen merge_long: Bestaande gegevens behouden en nieuwe toevoegen @@ -1350,11 +1364,13 @@ nl: subject: disable: Jouw account %{acct} is bevroren none: Waarschuwing voor %{acct} + sensitive: De door jouw account %{acct} geplaatste media is als gevoelig gemarkeerd silence: Jouw account %{acct} is nu beperkt suspend: Jouw account %{acct} is opgeschort title: disable: Account bevroren none: Waarschuwing + sensitive: Jouw media is als gevoelig gemarkeerd silence: Account beperkt suspend: Account opgeschort welcome: @@ -1392,9 +1408,14 @@ nl: webauthn_credentials: add: Nieuwe beveiligingssleutel toevoegen create: + error: Er deed zich een probleem voor met het toevoegen van jouw beveiligingssleutel. Probeer het nogmaals. success: Het toevoegen van je beveiligingssleutel is geslaagd. delete: Verwijderen delete_confirmation: Weet je zeker dat je deze beveiligingssleutel wilt verwijderen? + description_html: Wanneer je verificatie met beveiligingssleutels inschakelt, moet je tijdens het inloggen een van jouw beveiligingssleutels gebruiken. + destroy: + error: Er deed zich een probleem voor met het verwijderen van jouw beveiligingssleutel. Probeer het nogmaals. + success: Het verwijderen van jouw beveiligingssleutel is geslaagd. invalid_credential: Ongeldige beveiligingssleutel nickname_hint: Voer de bijnaam in van jouw nieuwe beveiligingssleutel not_enabled: Je hebt WebAuthn nog niet ingeschakeld diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 763a59fbb..a53f0cee7 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -132,6 +132,7 @@ oc: login_status: Estat formulari de connexion media_attachments: Mèdias enviats memorialize: Passar en memorial + memorialized: Memorizat moderation: active: Actius all: Totes @@ -773,6 +774,7 @@ oc: request: Demandar vòstre archiu size: Talha blocks: Personas que blocatz + bookmarks: Marcadors csv: CSV domain_blocks: Blocatge de domenis lists: Listas @@ -847,6 +849,7 @@ oc: success: Vòstras donadas son ben estadas mandadas e seràn tractadas tre que possible types: blocking: Lista de blocatge + bookmarks: Marcadors domain_blocking: Lista dels domenis blocats following: Lista de monde que seguètz muting: Lista de monde que volètz pas legir @@ -1083,6 +1086,9 @@ oc: spam_detected: Aquò es un senhalament automatic. D’spam es estat detectat. statuses: attached: + audio: + one: "%{count} àudio" + other: "%{count} àudios" description: 'Ajustat : %{attached}' image: one: "%{count} imatge" @@ -1232,6 +1238,7 @@ oc: recovery_codes: Salvar los còdis de recuperacion recovery_codes_regenerated: Los còdis de recuperacion son ben estats tornats generar recovery_instructions_html: Se vos arriba de perdre vòstre mobil, podètz utilizar un dels còdis de recuperacion cai-jos per poder tornar accedir a vòstre compte. Gardatz los còdis en seguretat, per exemple, imprimissètz los e gardatz los amb vòstres documents importants. + webauthn: Claus de seguretat user_mailer: backup_ready: explanation: Avètz demandat una salvagarda complèta de vòstre compte Mastodon. Es prèsta per telecargament ! @@ -1284,4 +1291,7 @@ oc: explanation_html: 'Podètz verificar vosautres meteisses coma proprietari dels ligams per las metadonadas de vòstre perfil. Per aquò far, lo site Web ligat deu conténer un ligam cap a vòstre perfil Mastodon. Lo ligam deu aver un atribut rel="me". Lo contengut tèxte del ligam impòrta pas. Vaquí un exemple :' verification: Verificacion webauthn_credentials: + add: Apondre una clau de seguretat novèla + delete: Suprimir + invalid_credential: Cau de seguretat invalida registered_on: Inscripcion del %{date} diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 6b0f5ae58..23c67267e 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -582,6 +582,7 @@ pl: domain_blocks_rationale: title: Pokaż uzasadnienia enable_bootstrap_timeline_accounts: + desc_html: Niech nowi użytkownicy automatycznie śledzą ustawione konta, aby ich główna oś czasu nie był początkowo pusta title: Dodawaj domyślne obserwacje nowym użytkownikom hero: desc_html: Wyświetlany na stronie głównej. Zalecany jest rozmiar przynajmniej 600x100 pikseli. Jeżeli nie ustawiony, zostanie użyta miniatura serwera diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 19584201f..f7b47fb10 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -566,6 +566,7 @@ pt-PT: domain_blocks_rationale: title: Mostrar motivo enable_bootstrap_timeline_accounts: + desc_html: Faça com que novos utilizadores sigam automaticamente contas configuradas, para que a cronologia destes não se apresente inicialmente vazia title: Habilitar seguidores predefinidos para novos utilizadores hero: desc_html: Apresentado na primeira página. Pelo menos 600x100px recomendados. Quando não é definido, é apresentada a miniatura da instância diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index cdea55a5d..65cd315ac 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -94,6 +94,7 @@ hy: types: disable: Փակել մուտքը none: Ոչինչ չանել + sensitive: Զգայուն silence: Լուռ suspend: Արգելափակել եւ անվերադարձ ջնջել հաշուի ամբողջ ինֆորմացիան warning_preset_id: Օգտագործել զգուշացնող նախադիր @@ -119,6 +120,7 @@ hy: expires_in: Սպառուում է fields: Հաշուի մետադատա header: Վերնագիր + honeypot: "%{label} (չլրացնել)" inbox_url: Ներմուծման շերտի URL irreversible: Թաքցնելու փոխարէն ջնջել locale: Ինտերֆեյսի լեզու diff --git a/config/locales/simple_form.ml.yml b/config/locales/simple_form.ml.yml index df04a15e8..c60cd9699 100644 --- a/config/locales/simple_form.ml.yml +++ b/config/locales/simple_form.ml.yml @@ -14,3 +14,7 @@ ml: acct: പഴയ അംഗത്വത്തിലേക്കുള്ള പിടി account_migration: acct: പുതിയ അംഗത്വത്തിലേക്കുള്ള പിടി + defaults: + email: ഇ-മെയിൽ വിലാസം + notification_emails: + follow: ആരോ നിങ്ങളെ പിന്തുടർന്നു diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index bdaa1dd5c..8abc9448c 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -121,6 +121,7 @@ nl: expires_in: Vervalt na fields: Metadata profiel header: Omslagfoto + honeypot: "%{label} (niet invullen)" inbox_url: Inbox-URL van de relayserver irreversible: Verwijderen in plaats van verbergen locale: Taal van de gebruikersomgeving @@ -173,7 +174,7 @@ nl: invite: comment: Opmerking invite_request: - text: Waarom wil jij je aanmelden? + text: Waarom wil je je hier registreren? ip_block: comment: Opmerking ip: IP diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 120ddfbe0..79c621ee2 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -126,6 +126,7 @@ oc: expires_in: Expira aprèp fields: Metadonada del perfil header: Bandièra + honeypot: "%{label} (emplenar pas)" inbox_url: URL de la bóstia de recepcion del relai irreversible: Suprimir allòc de rescondre locale: Lenga de l’interfàcia diff --git a/config/locales/sq.yml b/config/locales/sq.yml index a46c3a586..e841ab690 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -566,6 +566,7 @@ sq: domain_blocks_rationale: title: Shfaq arsye enable_bootstrap_timeline_accounts: + desc_html: Bëj që përdoruesit e rinj automatikisht të ndjekin llogaritë e formësuara, që prurja e tyre bazë të mos nisë e zbrazët title: Aktivizo ndjekje parazgjedhje për përdorues të rinj hero: desc_html: E shfaqur në faqen ballore. Këshillohet të paktën 600x100px. Kur nuk caktohet gjë, përdoret miniaturë e shërbyesit diff --git a/config/locales/vi.yml b/config/locales/vi.yml index be681b3a6..48bc6c844 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -558,6 +558,7 @@ vi: domain_blocks_rationale: title: Hiển thị lý do enable_bootstrap_timeline_accounts: + desc_html: Thiết lập người mới đăng ký sẽ tự động theo dõi những tài khoản cho trước nhằm tránh việc bảng tin trống title: Gợi ý theo dõi cho người dùng mới hero: desc_html: Hiển thị trên trang chủ. Kích cỡ tối thiểu 600x100px. Mặc định dùng hình thu nhỏ của máy chủ diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 6c9079834..c44e2ce5b 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -57,6 +57,7 @@ zh-CN: followers: other: 关注者 following: 正在关注 + instance_actor_flash: 这个账户是虚拟账户,用来代表服务器自身,不代表任何实际用户。它用于互通功能,不应该封禁。 joined: 加入于 %{date} last_active: 最近活动 link_verified_on: 此链接的所有权已在 %{date} 检查 @@ -397,6 +398,8 @@ zh-CN: silence: 自动隐藏 suspend: 自动封禁 title: 新增域名屏蔽 + obfuscate: 混淆域名 + obfuscate_hint: 如果启用了域名列表公开限制,就部分混淆列表中的域名 private_comment: 私密评论 private_comment_hint: 给这一域名限制添加备注,供监察员内部使用 public_comment: 公开评论 @@ -555,6 +558,7 @@ zh-CN: domain_blocks_rationale: title: 显示理由 enable_bootstrap_timeline_accounts: + desc_html: 让新用户自动关注指定用户,这样,他们的主页时间线就不会在一开始的时候空空荡荡 title: 开启新用户默认关注功能 hero: desc_html: 将用于在首页展示。推荐使用分辨率 600×100px 以上的图片。如未设置,将默认使用本站缩略图。 @@ -583,7 +587,7 @@ zh-CN: title: 允许发送邀请的用户组 require_invite_text: desc_html: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项 - title: 要求新用户填写注册申请 + title: 要求新用户填写申请注册的原因 registrations_mode: modes: approved: 注册时需要批准 @@ -911,6 +915,8 @@ zh-CN: status: 验证状态 view_proof: 查看证明 imports: + errors: + over_rows_processing_limit: 包含行数超过了 %{count} modes: merge: 合并 merge_long: 保留现有记录并添加新的记录 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index a2ad6fbde..da340a1bc 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -57,6 +57,7 @@ zh-TW: followers: other: 關注者 following: 正在關注 + instance_actor_flash: 這個帳號是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。 joined: 加入於 %{date} last_active: 上次活躍時間 link_verified_on: 此連結的所有權已在 %{date} 檢查過 @@ -127,6 +128,7 @@ zh-TW: follows: 正在關注 header: 開頭 inbox_url: 收件箱 (Inbox) URL + invite_request_text: 加入原因 invited_by: 邀請者 ip: IP 位址 joined: 已加入 @@ -251,6 +253,7 @@ zh-TW: unsuspend_account: 取消用戶的暫停狀態 update_announcement: 更新公告 update_custom_emoji: 更新自訂顏文字 + update_domain_block: 更新封鎖網域 update_status: 更新狀態 actions: assigned_to_self_report: "%{name} 接受了檢舉 %{target}" @@ -291,6 +294,7 @@ zh-TW: unsuspend_account: "%{name} 取消了使用者 %{target} 的停權狀態" update_announcement: "%{name} 更新了公告 %{target}" update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}" + update_domain_block: "%{name} 更新封鎖網域 %{target}" update_status: "%{name} 重整了 %{target} 的嘟文" deleted_status: "(已刪除嘟文)" empty: 找不到 log @@ -394,6 +398,8 @@ zh-TW: silence: 靜音 suspend: 停權 title: 新增封鎖站點 + obfuscate: 混淆網域名稱 + obfuscate_hint: 若啟用網域廣告列表限制,於列表部份混淆網域名稱 private_comment: 私人留言 private_comment_hint: 請提供更多有關此站台限制的資訊以供版主作內部參考。 public_comment: 公開留言 @@ -432,6 +438,7 @@ zh-TW: instances: by_domain: 站台 delivery_available: 可傳送 + empty: 找不到網域 known_accounts: other: "%{count} 已知的帳戶" moderation: @@ -483,19 +490,31 @@ zh-TW: enable_hint: 啟用後,你的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。 enabled: 已啟用 inbox_url: 中繼URL + pending: 等待中繼站審核 save_and_enable: 儲存並啟用 + setup: 設定中繼連結 + signatures_not_enabled: 若啟用安全模式或受限的站點聯盟模式,中繼將不會正常運作 status: 狀態 + title: 中繼 report_notes: created_msg: 檢舉記錄建立成功! destroyed_msg: 檢舉記錄刪除成功! reports: + account: + notes: + other: "%{count} 則備註" + reports: + other: "%{count} 則檢舉" action_taken_by: 操作執行者 are_you_sure: 你確定嗎? assign_to_self: 指派給自己 assigned: 指派負責人 + by_target_domain: 檢舉帳號之網域 comment: none: 無 created_at: 日期 + forwarded: 已轉寄 + forwarded_to: 轉寄到 %{domain} mark_as_resolved: 標記為「已解決」 mark_as_unresolved: 標記為「未解決」 notes: @@ -526,12 +545,20 @@ zh-TW: email: 用於聯絡的公開電子信箱位址 username: 請輸入使用者名稱 custom_css: + desc_html: 透過於每個頁面都載入的 CSS 調整外觀 title: 自訂 CSS + default_noindex: + desc_html: 影響所有沒有變更此設定的使用者 + title: 預設將使用者退出搜尋引擎索引 domain_blocks: all: 給任何人 disabled: 給沒有人 title: 顯示封鎖的網域 + users: 套用至所有登入的本機使用者 + domain_blocks_rationale: + title: 顯示解釋原因 enable_bootstrap_timeline_accounts: + desc_html: 使新使用者自動跟隨設定之帳號,所以他們的首頁動態一開始不會空白 title: 啟用新使用者的預設追蹤 hero: desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會重設回伺服器預覽圖 @@ -543,6 +570,7 @@ zh-TW: desc_html: 本伺服器在聯邦中發現的站點 title: 發布已知伺服器的列表 preview_sensitive_media: + desc_html: 連結來自其他網站的預覽將顯示於縮圖,即使這些媒體被標記為敏感 title: 在 OpenGraph 預覽中顯示敏感媒體 profile_directory: desc_html: 允許能探索使用者 From 814b7775fbb175bf6fb30e7f775b77c334658a8a Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 23 Dec 2020 01:35:02 +0100 Subject: [PATCH 75/83] Improve performances of deleting favourites when deleting accounts (#15412) Co-authored-by: Claire --- app/services/delete_account_service.rb | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index 58f6ef2ab..2bb533cfb 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -9,13 +9,11 @@ class DeleteAccountService < BaseService aliases block_relationships blocked_by_relationships - bookmarks conversation_mutes conversations custom_filters devices domain_blocks - favourites featured_tags follow_requests identity_proofs @@ -147,6 +145,8 @@ class DeleteAccountService < BaseService purge_media_attachments! purge_polls! purge_generated_notifications! + purge_favourites! + purge_bookmarks! purge_feeds! purge_other_associations! @@ -178,6 +178,24 @@ class DeleteAccountService < BaseService Notification.where(from_account: @account).in_batches.delete_all end + def purge_favourites! + @account.favourites.in_batches do |favourites| + ids = favourites.pluck(:status_id) + StatusStat.where(status_id: ids).update_all('favourites_count = GREATEST(0, favourites_count - 1)') + Chewy.strategy.current.update(StatusesIndex, ids) if Chewy.enabled? + # Rails.cache.delete_multi would be better, but we don't have it yet + ids.each { |id| Rails.cache.delete("statuses/#{id}") } + favourites.delete_all + end + end + + def purge_bookmarks! + @account.bookmarks.in_batches do |bookmarks| + Chewy.strategy.current.update(StatusesIndex, bookmarks.pluck(:status_id)) if Chewy.enabled? + bookmarks.delete_all + end + end + def purge_other_associations! associations_for_destruction.each do |association_name| purge_association(association_name) From 444b21b55ff5768e4cbbaf7cfa8285c65a4b54f9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 23 Dec 2020 01:36:13 +0100 Subject: [PATCH 76/83] Bump version to 3.3.0rc3 (#15411) --- CHANGELOG.md | 8 +++++--- lib/mastodon/version.rb | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4396dc96c..12c996641 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,7 +55,7 @@ All notable changes to this project will be documented in this file. - Add indication to admin UI of whether a report has been forwarded ([ThibG](https://github.com/tootsuite/mastodon/pull/13237)) - Add display of reasons for joining of an account in admin UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15265)) - Add option to obfuscate domain name in public list of domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/15355)) -- Add option to make reasons for joining required on sign-up ([ThibG](https://github.com/tootsuite/mastodon/pull/15326), [ThibG](https://github.com/tootsuite/mastodon/pull/15358)) +- Add option to make reasons for joining required on sign-up ([ThibG](https://github.com/tootsuite/mastodon/pull/15326), [ThibG](https://github.com/tootsuite/mastodon/pull/15358), [ThibG](https://github.com/tootsuite/mastodon/pull/15385), [ThibG](https://github.com/tootsuite/mastodon/pull/15405)) - Add ActivityPub follower synchronization mechanism ([ThibG](https://github.com/tootsuite/mastodon/pull/14510), [ThibG](https://github.com/tootsuite/mastodon/pull/15026)) - Add outbox attribute to instance actor ([ThibG](https://github.com/tootsuite/mastodon/pull/14721)) - Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595), [noellabo](https://github.com/tootsuite/mastodon/pull/15277)) @@ -66,7 +66,7 @@ All notable changes to this project will be documented in this file. - Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201), [ThibG](https://github.com/tootsuite/mastodon/pull/15264), [ThibG](https://github.com/tootsuite/mastodon/pull/15256)) - Has someone changed their domain or subdomain thereby creating two accounts where there should be one? - This command will fix it on your end -- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223)) +- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223), [ThibG](https://github.com/tootsuite/mastodon/pull/15373)) - Index corruption in the database? - This command is for you - **Add support for managing multiple stream subscriptions in a single connection** ([Gargron](https://github.com/tootsuite/mastodon/pull/14524), [Gargron](https://github.com/tootsuite/mastodon/pull/14566), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14859), [zunda](https://github.com/tootsuite/mastodon/pull/14608)) @@ -77,6 +77,7 @@ All notable changes to this project will be documented in this file. - Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817), [noellabo](https://github.com/tootsuite/mastodon/pull/15270)) - Add stoplight for object storage failures, return HTTP 503 in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13043)) - Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14396)) +- Add clean error message when `RAILS_ENV` is unset ([ThibG](https://github.com/tootsuite/mastodon/pull/15381)) ### Changed @@ -84,7 +85,7 @@ All notable changes to this project will be documented in this file. - Background of the overlay matches the color of the image - Action bar to interact with or open the toot from the modal - Change order of announcements in admin UI to be newest-first ([ThibG](https://github.com/tootsuite/mastodon/pull/15091)) -- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855)) +- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855), [ThibG](https://github.com/tootsuite/mastodon/pull/15380)) - Suspensions no longer equal deletions - A suspended account can be unsuspended with minimal consequences for 30 days - Immediate deletion of data is still available as an explicit option @@ -162,6 +163,7 @@ All notable changes to this project will be documented in this file. - Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674)) - Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673)) - Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675)) +- Fix inefficieny when deleting accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/15387), [ThibG](https://github.com/tootsuite/mastodon/pull/15409), [ThibG](https://github.com/tootsuite/mastodon/pull/15407), [ThibG](https://github.com/tootsuite/mastodon/pull/15408), [ThibG](https://github.com/tootsuite/mastodon/pull/15402)) - Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534)) - Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287)) - Fix performance on instances list in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15282)) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 7282ea7b5..95ae777f2 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def flags - 'rc2' + 'rc3' end def suffix From 473abc35a19771304839dc57dc41ef309a826658 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 23 Dec 2020 07:47:03 +0100 Subject: [PATCH 77/83] Fix trying to privatize empty media attachments (#15414) --- app/services/suspend_account_service.rb | 2 ++ app/services/unsuspend_account_service.rb | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 19d65280d..22e519708 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -65,6 +65,8 @@ class SuspendAccountService < BaseService attachment = media_attachment.public_send(attachment_name) styles = [:original] | attachment.styles.keys + next if attachment.blank? + styles.each do |style| case Paperclip::Attachment.default_options[:storage] when :s3 diff --git a/app/services/unsuspend_account_service.rb b/app/services/unsuspend_account_service.rb index f07a3f053..be7ad9df3 100644 --- a/app/services/unsuspend_account_service.rb +++ b/app/services/unsuspend_account_service.rb @@ -56,6 +56,8 @@ class UnsuspendAccountService < BaseService attachment = media_attachment.public_send(attachment_name) styles = [:original] | attachment.styles.keys + next if attachment.blank? + styles.each do |style| case Paperclip::Attachment.default_options[:storage] when :s3 From de57efd055c8c6af9e6e2aa450cea790546aabbc Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 23 Dec 2020 16:43:11 +0100 Subject: [PATCH 78/83] Fix mentions not being deleted efficiently (#15416) As a regression from the recent optimizations, mentions were left untouched until `account.destroy`, which would then delete them individually, and executing queries to find and delete associated notifications, resulting in a massive slowdown. Co-authored-by: Claire --- app/services/delete_account_service.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index 2bb533cfb..f8154cc3e 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -142,6 +142,7 @@ class DeleteAccountService < BaseService purge_user! purge_profile! purge_statuses! + purge_mentions! purge_media_attachments! purge_polls! purge_generated_notifications! @@ -159,6 +160,10 @@ class DeleteAccountService < BaseService end end + def purge_mentions! + @account.mentions.reorder(nil).where.not(status_id: reported_status_ids).in_batches.delete_all + end + def purge_media_attachments! @account.media_attachments.reorder(nil).find_each do |media_attachment| next if keep_account_record? && reported_status_ids.include?(media_attachment.status_id) From 4950e59cdcd59a181238d3d504398de188e19319 Mon Sep 17 00:00:00 2001 From: trwnh Date: Wed, 23 Dec 2020 09:43:38 -0600 Subject: [PATCH 79/83] Use existing FeaturedTag serializer and delete AccountFeaturedTag serializer (#15415) * Update featured_tags_controller.rb * Update featured_tag_serializer.rb * Update featured_tag_serializer.rb * Delete account_featured_tag_serializer.rb * please codeclimate * please codeclimate --- .../api/v1/accounts/featured_tags_controller.rb | 2 +- .../rest/account_featured_tag_serializer.rb | 15 --------------- app/serializers/rest/featured_tag_serializer.rb | 8 +++++++- 3 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 app/serializers/rest/account_featured_tag_serializer.rb diff --git a/app/controllers/api/v1/accounts/featured_tags_controller.rb b/app/controllers/api/v1/accounts/featured_tags_controller.rb index dc01b577c..0101fb469 100644 --- a/app/controllers/api/v1/accounts/featured_tags_controller.rb +++ b/app/controllers/api/v1/accounts/featured_tags_controller.rb @@ -7,7 +7,7 @@ class Api::V1::Accounts::FeaturedTagsController < Api::BaseController respond_to :json def index - render json: @featured_tags, each_serializer: REST::AccountFeaturedTagSerializer + render json: @featured_tags, each_serializer: REST::FeaturedTagSerializer end private diff --git a/app/serializers/rest/account_featured_tag_serializer.rb b/app/serializers/rest/account_featured_tag_serializer.rb deleted file mode 100644 index 84bef2e62..000000000 --- a/app/serializers/rest/account_featured_tag_serializer.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -class REST::AccountFeaturedTagSerializer < ActiveModel::Serializer - include RoutingHelper - - attributes :id, :name, :url - - def id - object.tag.id.to_s - end - - def url - short_account_tag_url(object.account, object.tag) - end -end diff --git a/app/serializers/rest/featured_tag_serializer.rb b/app/serializers/rest/featured_tag_serializer.rb index 08121ff16..96adcc7d0 100644 --- a/app/serializers/rest/featured_tag_serializer.rb +++ b/app/serializers/rest/featured_tag_serializer.rb @@ -1,9 +1,15 @@ # frozen_string_literal: true class REST::FeaturedTagSerializer < ActiveModel::Serializer - attributes :id, :name, :statuses_count, :last_status_at + include RoutingHelper + + attributes :id, :name, :url, :statuses_count, :last_status_at def id object.id.to_s end + + def url + short_account_tag_url(object.account, object.tag) + end end From b08d2d4f78e143189c0dc3470a8dc186bf441419 Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 23 Dec 2020 19:55:23 +0100 Subject: [PATCH 80/83] Fix media modal buttons not showing up on mobile (#15417) Fixes #15374 When the pop-out player was introduced, it had tweaks for the mobile view, but it's now disabled in mobile mode and the styling was reused for modals, causing the footer to be hidden on mobile without a good reason. Co-authored-by: Claire --- app/javascript/styles/mastodon/components.scss | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 2163d74fc..c248f681e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -7194,21 +7194,6 @@ noscript { .audio-player { border-radius: 0; } - - @media screen and (max-width: 415px) { - width: 210px; - bottom: 10px; - right: 10px; - - &__footer { - display: none; - } - - .video-player, - .audio-player { - border-radius: 0 0 4px 4px; - } - } } .picture-in-picture-placeholder { From 7e6d3a7d9ad3343c7147032fef50bf1cc308a872 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Thu, 24 Dec 2020 07:47:50 +0900 Subject: [PATCH 81/83] Fix unfollow action button style (#15418) --- app/javascript/mastodon/features/account/components/header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index 2b97af4e6..c8fd85e1d 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -170,7 +170,7 @@ class Header extends ImmutablePureComponent { } else if (account.getIn(['relationship', 'requested'])) { actionBtn =