)}
diff --git a/app/javascript/mastodon/features/explore/results.js b/app/javascript/mastodon/features/explore/results.js
index ff900de08..339f883c5 100644
--- a/app/javascript/mastodon/features/explore/results.js
+++ b/app/javascript/mastodon/features/explore/results.js
@@ -24,15 +24,15 @@ const appendLoadMore = (id, list, onLoadMore) => {
}
};
-const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts').map(item => (
+const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts', ImmutableList()).map(item => (
)), onLoadMore);
-const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags').map(item => (
+const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags', ImmutableList()).map(item => (
)), onLoadMore);
-const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses').map(item => (
+const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses', ImmutableList()).map(item => (
)), onLoadMore);
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 0437d0b41..055732cfd 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -9,10 +9,10 @@
"account.browse_more_on_origin_server": "Navega més en el perfil original",
"account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
"account.direct": "Missatge directe @{name}",
- "account.disable_notifications": "Deixa de notificar-me els tuts de @{name}",
- "account.domain_blocked": "Domini ocult",
+ "account.disable_notifications": "Deixa de notificar-me les publicacions de @{name}",
+ "account.domain_blocked": "Domini bloquejat",
"account.edit_profile": "Edita el perfil",
- "account.enable_notifications": "Notifica’m els tuts de @{name}",
+ "account.enable_notifications": "Notifica’m les publicacions de @{name}",
"account.endorse": "Recomana en el teu perfil",
"account.follow": "Segueix",
"account.followers": "Seguidors",
@@ -27,20 +27,20 @@
"account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}",
"account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.",
"account.media": "Mèdia",
- "account.mention": "Esmentar @{name}",
+ "account.mention": "Esmenta @{name}",
"account.moved_to": "{name} s'ha mogut a:",
"account.mute": "Silencia @{name}",
- "account.mute_notifications": "Notificacions desactivades de @{name}",
+ "account.mute_notifications": "Notificacions silenciades de @{name}",
"account.muted": "Silenciat",
- "account.posts": "Tuts",
- "account.posts_with_replies": "Tuts i respostes",
+ "account.posts": "Publicacions",
+ "account.posts_with_replies": "Publicacions i respostes",
"account.report": "Informar sobre @{name}",
"account.requested": "Esperant aprovació. Clic per a cancel·lar la petició de seguiment",
"account.share": "Comparteix el perfil de @{name}",
"account.show_reblogs": "Mostra els impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
"account.unblock": "Desbloqueja @{name}",
- "account.unblock_domain": "Mostra {domain}",
+ "account.unblock_domain": "Desbloqueja el domini {domain}",
"account.unblock_short": "Desbloqueja",
"account.unendorse": "No recomanar en el perfil",
"account.unfollow": "Deixa de seguir",
@@ -53,7 +53,7 @@
"admin.dashboard.retention.average": "Mitjana",
"admin.dashboard.retention.cohort": "Registres mes",
"admin.dashboard.retention.cohort_size": "Nous usuaris",
- "alert.rate_limited.message": "Si us plau torna-ho a provar després de {retry_time, time, medium}.",
+ "alert.rate_limited.message": "Si us plau prova-ho després de {retry_time, time, medium}.",
"alert.rate_limited.title": "Límit de freqüència",
"alert.unexpected.message": "S'ha produït un error inesperat.",
"alert.unexpected.title": "Vaja!",
@@ -72,14 +72,14 @@
"column.community": "Línia de temps local",
"column.direct": "Missatges directes",
"column.directory": "Navega els perfils",
- "column.domain_blocks": "Dominis ocults",
+ "column.domain_blocks": "Dominis bloquejats",
"column.favourites": "Favorits",
- "column.follow_requests": "Peticions per seguir-te",
+ "column.follow_requests": "Peticions per a seguir-te",
"column.home": "Inici",
"column.lists": "Llistes",
"column.mutes": "Usuaris silenciats",
"column.notifications": "Notificacions",
- "column.pins": "Tuts fixats",
+ "column.pins": "Publicacions fixades",
"column.public": "Línia de temps federada",
"column_back_button.label": "Enrere",
"column_header.hide_settings": "Amaga la configuració",
@@ -92,10 +92,10 @@
"community.column_settings.local_only": "Només local",
"community.column_settings.media_only": "Només multimèdia",
"community.column_settings.remote_only": "Només remot",
- "compose_form.direct_message_warning": "Aquest tut només serà enviat als usuaris esmentats.",
+ "compose_form.direct_message_warning": "Aquesta publicació només serà enviat als usuaris esmentats.",
"compose_form.direct_message_warning_learn_more": "Aprèn més",
- "compose_form.hashtag_warning": "Aquesta tut no es mostrarà en cap etiqueta ja que no està llistat. Només els tuts públics poden ser cercats per etiqueta.",
- "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges a seguidors.",
+ "compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta ja que no està llistada. Només les publicacions públiques poden ser cercades per etiqueta.",
+ "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges només a seguidors.",
"compose_form.lock_disclaimer.lock": "bloquejat",
"compose_form.placeholder": "En què penses?",
"compose_form.poll.add_option": "Afegir una opció",
@@ -107,23 +107,23 @@
"compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Desa els canvis",
- "compose_form.sensitive.hide": "Marcar mèdia com a sensible",
- "compose_form.sensitive.marked": "Mèdia marcat com a sensible",
- "compose_form.sensitive.unmarked": "Mèdia no està marcat com a sensible",
- "compose_form.spoiler.marked": "Text es ocult sota l'avís",
- "compose_form.spoiler.unmarked": "Text no ocult",
+ "compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Mèdia està marcat com a sensible} other {Mèdia estan marcats com a sensible}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Mèdia no està marcada com a sensible} other {Mèdia no estan marcats com a sensibles}}",
+ "compose_form.spoiler.marked": "Treu l'avís de contingut",
+ "compose_form.spoiler.unmarked": "Afegeix avís de contingut",
"compose_form.spoiler_placeholder": "Escriu l'avís aquí",
"confirmation_modal.cancel": "Cancel·la",
- "confirmations.block.block_and_report": "Bloquejar i informar",
+ "confirmations.block.block_and_report": "Bloqueja i informa",
"confirmations.block.confirm": "Bloqueja",
"confirmations.block.message": "Estàs segur que vols bloquejar a {name}?",
"confirmations.delete.confirm": "Suprimeix",
- "confirmations.delete.message": "Estàs segur que vols suprimir aquest tut?",
+ "confirmations.delete.message": "Estàs segur que vols suprimir aquesta publicació?",
"confirmations.delete_list.confirm": "Suprimeix",
"confirmations.delete_list.message": "Estàs segur que vols suprimir permanentment aquesta llista?",
"confirmations.discard_edit_media.confirm": "Descarta",
"confirmations.discard_edit_media.message": "Tens canvis no desats de la descripciò de mèdia o previsualització, els vols descartar?",
- "confirmations.domain_block.confirm": "Amaga tot el domini",
+ "confirmations.domain_block.confirm": "Bloqueja el domini sencer",
"confirmations.domain_block.message": "Estàs segur, realment segur que vols bloquejar totalment {domain}? En la majoria dels casos bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs contingut d’aquest domini en cap de les línies de temps ni en les notificacions. Els teus seguidors d’aquest domini seran eliminats.",
"confirmations.logout.confirm": "Tancar sessió",
"confirmations.logout.message": "Segur que vols tancar la sessió?",
@@ -131,7 +131,7 @@
"confirmations.mute.explanation": "Això amagarà les seves publicacions i les que els mencionen però encara els permetrà veure les teves i seguir-te.",
"confirmations.mute.message": "Estàs segur que vols silenciar {name}?",
"confirmations.redraft.confirm": "Esborrar i refer",
- "confirmations.redraft.message": "Estàs segur que vols esborrar aquest tut i tornar a redactar-lo? Perdràs tots els impulsos i favorits, i les respostes al tut original es quedaran orfes.",
+ "confirmations.redraft.message": "Estàs segur que vols esborrar aquesta publicació i tornar a redactar-la? Perdràs tots els impulsos i favorits, i les respostes a la publicació original es quedaran orfes.",
"confirmations.reply.confirm": "Respon",
"confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?",
"confirmations.unfollow.confirm": "Deixa de seguir",
@@ -145,14 +145,14 @@
"directory.new_arrivals": "Arribades noves",
"directory.recently_active": "Recentment actius",
"embed.instructions": "Incrusta aquest tut al lloc web copiant el codi a continuació.",
- "embed.preview": "Aquí tenim quin aspecte tindrà:",
+ "embed.preview": "Aquí està quin aspecte tindrà:",
"emoji_button.activity": "Activitat",
"emoji_button.custom": "Personalitzat",
"emoji_button.flags": "Banderes",
"emoji_button.food": "Menjar i beure",
"emoji_button.label": "Insereix un emoji",
"emoji_button.nature": "Natura",
- "emoji_button.not_found": "Emojis no!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "No s'han trobat emojis coincidents",
"emoji_button.objects": "Objectes",
"emoji_button.people": "Gent",
"emoji_button.recent": "Usats freqüentment",
@@ -161,26 +161,26 @@
"emoji_button.symbols": "Símbols",
"emoji_button.travel": "Viatges i Llocs",
"empty_column.account_suspended": "Compte suspès",
- "empty_column.account_timeline": "No hi ha tuts aquí!",
+ "empty_column.account_timeline": "No hi ha publicacions aquí!",
"empty_column.account_unavailable": "Perfil no disponible",
"empty_column.blocks": "Encara no has bloquejat cap usuari.",
- "empty_column.bookmarked_statuses": "Encara no tens marcat cap tut. Quan marquis un apareixerà aquí.",
+ "empty_column.bookmarked_statuses": "Encara no tens desada a marcadors cap publicació. Quan desis una apareixerà aquí.",
"empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per a fer rodar la pilota!",
"empty_column.direct": "Encara no tens missatges directes. Quan enviïs o rebis un, es mostrarà aquí.",
- "empty_column.domain_blocks": "Encara no hi ha dominis ocults.",
+ "empty_column.domain_blocks": "Encara no hi ha dominis bloquejats.",
"empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Verifica-ho més tard!",
- "empty_column.favourited_statuses": "Encara no has marcat com a favorit cap tut. Quan en facis, apareixerà aquí.",
- "empty_column.favourites": "Ningú no ha marcat aquest tut com a preferit encara. Quan algú ho faci, apareixerà aquí.",
+ "empty_column.favourited_statuses": "Encara no has afavorit cap publicació. Quan ho facis, apareixerà aquí.",
+ "empty_column.favourites": "Ningú no ha afavorit aquesta publicació encara. Quan algú ho faci, apareixerà aquí.",
"empty_column.follow_recommendations": "Sembla que no es poden generar sugerencies per a tu. Pots provar d'emprar la cerca per a trobar gent que voldries conèixer o explorar les etiquetes en tendència.",
- "empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan rebis una, apareixerà aquí.",
+ "empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan en rebis una, apareixerà aquí.",
"empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
- "empty_column.home": "Encara no segueixes ningú. Visita {public} o fes cerca per començar i conèixer altres usuaris.",
+ "empty_column.home": "La teva línia de temps és buida! Segueix més gent per a emplenar-la. {suggestions}",
"empty_column.home.suggestions": "Mira algunes sugerencies",
- "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin nous tuts, apareixeran aquí.",
+ "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin noves publicacions, apareixeran aquí.",
"empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.",
"empty_column.mutes": "Encara no has silenciat cap usuari.",
- "empty_column.notifications": "Encara no tens notificacions. Interactua amb altres per iniciar la conversa.",
- "empty_column.public": "No hi ha res aquí! Escriu públicament alguna cosa o manualment segueix usuaris d'altres servidors per omplir-ho",
+ "empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.",
+ "empty_column.public": "No hi ha res aquí! Escriu públicament alguna cosa o manualment segueix usuaris d'altres servidors per a omplir-ho",
"error.unexpected_crash.explanation": "A causa d'un bug en el nostre codi o un problema de compatibilitat del navegador, aquesta pàgina podria no ser mostrada correctament.",
"error.unexpected_crash.explanation_addons": "Aquesta pàgina podria no mostrar-se correctament. Aquest error és possiblement causat per una extensió del navegador o per eienes automàtiques de traducció.",
"error.unexpected_crash.next_steps": "Prova recarregant la pàgina. Si això no ajuda, encara podries ser capaç d'utilitzar Mastodon a través d'un navegador diferent o amb una aplicació nativa.",
@@ -194,19 +194,19 @@
"explore.trending_statuses": "Publicacions",
"explore.trending_tags": "Etiquetes",
"follow_recommendations.done": "Fet",
- "follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure els seus tuts! Aquí hi ha algunes recomanacions.",
- "follow_recommendations.lead": "Els tuts del usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps Inici. No tinguis por en cometre errors, pots fàcilment deixar de seguir-los en qualsevol moment!",
- "follow_request.authorize": "Autoritzar",
- "follow_request.reject": "Rebutjar",
+ "follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure les seves publicacions! Aquí hi ha algunes recomanacions.",
+ "follow_recommendations.lead": "Les publicacions del usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps Inici. No tinguis por en cometre errors, pots fàcilment deixar de seguir-los en qualsevol moment!",
+ "follow_request.authorize": "Autoritza",
+ "follow_request.reject": "Rebutja",
"follow_requests.unlocked_explanation": "Tot i que el teu compte no està bloquejat, el personal de {domain} ha pensat que és possible que vulguis revisar les sol·licituds de seguiment d’aquests comptes de forma manual.",
- "generic.saved": "Guardat",
+ "generic.saved": "Desat",
"getting_started.developers": "Desenvolupadors",
"getting_started.directory": "Directori de perfils",
"getting_started.documentation": "Documentació",
- "getting_started.heading": "Començant",
+ "getting_started.heading": "Primeres passes",
"getting_started.invite": "Convida gent",
"getting_started.open_source_notice": "Mastodon és un programari de codi obert. Pots contribuir-hi o informar de problemes a GitHub a {github}.",
- "getting_started.security": "Seguretat",
+ "getting_started.security": "Configuració del compte",
"getting_started.terms": "Termes del servei",
"hashtag.column_header.tag_mode.all": "i {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
@@ -225,41 +225,41 @@
"intervals.full.days": "{number, plural, one {# dia} other {# dies}}",
"intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
"intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
- "keyboard_shortcuts.back": "navegar enrere",
- "keyboard_shortcuts.blocked": "per obrir la llista d'usuaris bloquejats",
- "keyboard_shortcuts.boost": "impulsar",
- "keyboard_shortcuts.column": "per a centrar un tut en una de les columnes",
- "keyboard_shortcuts.compose": "per centrar l'àrea de composició de text",
+ "keyboard_shortcuts.back": "Navegar enrere",
+ "keyboard_shortcuts.blocked": "Obre la llista d'usuaris bloquejats",
+ "keyboard_shortcuts.boost": "Impulsa publicació",
+ "keyboard_shortcuts.column": "Centra columna",
+ "keyboard_shortcuts.compose": "Centra l'àrea de composició de text",
"keyboard_shortcuts.description": "Descripció",
- "keyboard_shortcuts.direct": "per obrir la columna de missatges directes",
- "keyboard_shortcuts.down": "per baixar en la llista",
- "keyboard_shortcuts.enter": "per a obrir el tut",
- "keyboard_shortcuts.favourite": "afavorir",
- "keyboard_shortcuts.favourites": "per obrir la llista de favorits",
- "keyboard_shortcuts.federated": "per obrir la línia de temps federada",
+ "keyboard_shortcuts.direct": "Obre la columna de missatges directes",
+ "keyboard_shortcuts.down": "Baixar en la llista",
+ "keyboard_shortcuts.enter": "Obre publicació",
+ "keyboard_shortcuts.favourite": "Afavorir publicació",
+ "keyboard_shortcuts.favourites": "Obre la llista de favorits",
+ "keyboard_shortcuts.federated": "Obre la línia de temps federada",
"keyboard_shortcuts.heading": "Dreceres de teclat",
- "keyboard_shortcuts.home": "per a obrir la línia de temps Inici",
+ "keyboard_shortcuts.home": "Obre la línia de temps Inici",
"keyboard_shortcuts.hotkey": "Tecla d'accés directe",
- "keyboard_shortcuts.legend": "per a mostrar aquesta llegenda",
- "keyboard_shortcuts.local": "per a obrir la línia de temps local",
- "keyboard_shortcuts.mention": "per a esmentar l'autor",
- "keyboard_shortcuts.muted": "per a obrir la llista d'usuaris silenciats",
- "keyboard_shortcuts.my_profile": "per a obrir el teu perfil",
- "keyboard_shortcuts.notifications": "per a obrir la columna de notificacions",
- "keyboard_shortcuts.open_media": "obrir mèdia",
- "keyboard_shortcuts.pinned": "per a obrir la llista de tuts fixats",
- "keyboard_shortcuts.profile": "per a obrir el perfil de l'autor",
- "keyboard_shortcuts.reply": "respondre",
- "keyboard_shortcuts.requests": "per a obrir la llista de sol·licituds de seguiment",
- "keyboard_shortcuts.search": "per a centrar la cerca",
- "keyboard_shortcuts.spoilers": "mostrar/amagar el camp CW",
- "keyboard_shortcuts.start": "per a obrir la columna \"Començar\"",
- "keyboard_shortcuts.toggle_hidden": "Mostrar/ocultar el text marcat com a sensible",
- "keyboard_shortcuts.toggle_sensitivity": "per a mostrar o amagar contingut multimèdia",
+ "keyboard_shortcuts.legend": "Mostra aquesta llegenda",
+ "keyboard_shortcuts.local": "Obre la línia de temps local",
+ "keyboard_shortcuts.mention": "Esmenta l'autor",
+ "keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats",
+ "keyboard_shortcuts.my_profile": "Obre el teu perfil",
+ "keyboard_shortcuts.notifications": "Obre la columna de notificacions",
+ "keyboard_shortcuts.open_media": "Obre mèdia",
+ "keyboard_shortcuts.pinned": "Obre la llista de publicacions fixades",
+ "keyboard_shortcuts.profile": "Obre el perfil de l'autor",
+ "keyboard_shortcuts.reply": "Respon publicació",
+ "keyboard_shortcuts.requests": "Obre la llista de sol·licituds de seguiment",
+ "keyboard_shortcuts.search": "Centra la barra de cerca",
+ "keyboard_shortcuts.spoilers": "Mostra/amaga el camp CW",
+ "keyboard_shortcuts.start": "Obre la columna \"Primeres passes\"",
+ "keyboard_shortcuts.toggle_hidden": "Mostra/oculta el text marcat com a sensible",
+ "keyboard_shortcuts.toggle_sensitivity": "Mostra/amaga contingut multimèdia",
"keyboard_shortcuts.toot": "per a començar un tut nou de trinca",
- "keyboard_shortcuts.unfocus": "descentrar l'àrea de composició de text/cerca",
- "keyboard_shortcuts.up": "moure amunt en la llista",
- "lightbox.close": "Tancar",
+ "keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
+ "keyboard_shortcuts.up": "Moure amunt en la llista",
+ "lightbox.close": "Tanca",
"lightbox.compress": "Quadre de visualització d’imatge comprimida",
"lightbox.expand": "Amplia el quadre de visualització de l’imatge",
"lightbox.next": "Següent",
@@ -270,7 +270,7 @@
"lists.edit": "Editar llista",
"lists.edit.submit": "Canvi de títol",
"lists.new.create": "Afegir llista",
- "lists.new.title_placeholder": "Nova llista",
+ "lists.new.title_placeholder": "Nou títol de llista",
"lists.replies_policy.followed": "Qualsevol usuari seguit",
"lists.replies_policy.list": "Membres de la llista",
"lists.replies_policy.none": "Ningú",
@@ -279,23 +279,23 @@
"lists.subheading": "Les teves llistes",
"load_pending": "{count, plural, one {# element nou} other {# elements nous}}",
"loading_indicator.label": "Carregant...",
- "media_gallery.toggle_visible": "Alternar visibilitat",
+ "media_gallery.toggle_visible": "{number, plural, one {Amaga imatge} other {Amaga imatges}}",
"missing_indicator.label": "No trobat",
"missing_indicator.sublabel": "Aquest recurs no pot ser trobat",
"mute_modal.duration": "Durada",
"mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?",
"mute_modal.indefinite": "Indefinit",
- "navigation_bar.apps": "Apps mòbils",
+ "navigation_bar.apps": "Aplicacions mòbils",
"navigation_bar.blocks": "Usuaris bloquejats",
"navigation_bar.bookmarks": "Marcadors",
"navigation_bar.community_timeline": "Línia de temps Local",
- "navigation_bar.compose": "Redacta un nou tut",
+ "navigation_bar.compose": "Redacta una nova publicació",
"navigation_bar.direct": "Missatges directes",
"navigation_bar.discover": "Descobrir",
- "navigation_bar.domain_blocks": "Dominis ocults",
+ "navigation_bar.domain_blocks": "Dominis bloquejats",
"navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Explora",
- "navigation_bar.favourites": "Preferits",
+ "navigation_bar.favourites": "Favorits",
"navigation_bar.filters": "Paraules silenciades",
"navigation_bar.follow_requests": "Sol·licituds de seguiment",
"navigation_bar.follows_and_followers": "Seguits i seguidors",
@@ -305,12 +305,12 @@
"navigation_bar.logout": "Tancar sessió",
"navigation_bar.mutes": "Usuaris silenciats",
"navigation_bar.personal": "Personal",
- "navigation_bar.pins": "Tuts fixats",
+ "navigation_bar.pins": "Publicacions fixades",
"navigation_bar.preferences": "Preferències",
"navigation_bar.public_timeline": "Línia de temps federada",
"navigation_bar.security": "Seguretat",
"notification.admin.sign_up": "{name} s'ha registrat",
- "notification.favourite": "{name} ha afavorit el teu estat",
+ "notification.favourite": "{name} ha afavorit la teva publicació",
"notification.follow": "{name} et segueix",
"notification.follow_request": "{name} ha sol·licitat seguir-te",
"notification.mention": "{name} t'ha esmentat",
@@ -328,14 +328,14 @@
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
"notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
"notifications.column_settings.follow": "Nous seguidors:",
- "notifications.column_settings.follow_request": "Nova sol·licitud de seguiment:",
+ "notifications.column_settings.follow_request": "Noves sol·licituts de seguiment:",
"notifications.column_settings.mention": "Mencions:",
"notifications.column_settings.poll": "Resultats de l’enquesta:",
"notifications.column_settings.push": "Notificacions push",
"notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Mostra en la columna",
"notifications.column_settings.sound": "Reproduir so",
- "notifications.column_settings.status": "Nous tuts:",
+ "notifications.column_settings.status": "Noves publicacions:",
"notifications.column_settings.unread_notifications.category": "Notificacions no llegides",
"notifications.column_settings.unread_notifications.highlight": "Destaca notificacions no llegides",
"notifications.column_settings.update": "Edicions:",
@@ -349,11 +349,11 @@
"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": "Les notificacions d’escriptori no estan disponibles perquè prèviament s’ha denegat el permís al navegador",
"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": "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.how_to_control": "Per a rebre notificacions quan Mastodon no és 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",
"picture_in_picture.restore": "Retorna’l",
"poll.closed": "Finalitzada",
@@ -365,18 +365,18 @@
"poll.votes": "{votes, plural, one {# vot} other {# vots}}",
"poll_button.add_poll": "Afegir una enquesta",
"poll_button.remove_poll": "Elimina l'enquesta",
- "privacy.change": "Ajustar l'estat de privacitat",
- "privacy.direct.long": "Publicar només per als usuaris esmentats",
+ "privacy.change": "Ajustar la privacitat de la publicació",
+ "privacy.direct.long": "Visible només per als usuaris esmentats",
"privacy.direct.short": "Directe",
- "privacy.private.long": "Publicar només a seguidors",
+ "privacy.private.long": "Visible només pels seguidors",
"privacy.private.short": "Només seguidors",
- "privacy.public.long": "Publicar en línies de temps públiques",
+ "privacy.public.long": "Visible per a tothom, mostrat en línies de temps públiques",
"privacy.public.short": "Públic",
- "privacy.unlisted.long": "No publicar en línies de temps públiques",
+ "privacy.unlisted.long": "Visible per a tothom però no en les línies de temps públiques",
"privacy.unlisted.short": "No llistat",
"refresh": "Actualitza",
"regeneration_indicator.label": "Carregant…",
- "regeneration_indicator.sublabel": "S'està preparant la línia de temps Inici!",
+ "regeneration_indicator.sublabel": "S'està preparant la teva línia de temps Inici!",
"relative_time.days": "fa {number} dies",
"relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}",
"relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}",
@@ -390,11 +390,11 @@
"relative_time.today": "avui",
"reply_indicator.cancel": "Cancel·lar",
"report.block": "Bloqueja",
- "report.block_explanation": "No veuràs les seves publicacions. Ell no podran veure les teves publicacions ni seguir-te. Ell podran dir que estan bloquejats.",
+ "report.block_explanation": "No veuràs les seves publicacions. Ell no podran veure les teves publicacions ni seguir-te. Ells podran dir que estan bloquejats.",
"report.categories.other": "Altres",
"report.categories.spam": "Contingut brossa",
"report.categories.violation": "El contingut viola una o més regles del servidor",
- "report.category.subtitle": "Tria la millor combinació",
+ "report.category.subtitle": "Tria la millor coincidència",
"report.category.title": "Digue'ns què està passant amb aquest {type}",
"report.category.title_account": "perfil",
"report.category.title_status": "publicació",
@@ -410,7 +410,7 @@
"report.reasons.dislike_description": "Això no és quelcom que vulguis veure",
"report.reasons.other": "Això és una altre cosa",
"report.reasons.other_description": "El problema no encaixa en altres categories",
- "report.reasons.spam": "Això és brossa",
+ "report.reasons.spam": "Això és contingut brossa",
"report.reasons.spam_description": "Enllaços maliciosos, compromís falç o respostes repetitives",
"report.reasons.violation": "Viola les regles del servidor",
"report.reasons.violation_description": "Ets conscient que trenca regles especifiques",
@@ -428,32 +428,32 @@
"report.unfollow_explanation": "Estàs seguint aquest compte. Per a no veure més les seves publicacions en la teva línia de temps Inici, deixa de seguir-lo.",
"search.placeholder": "Cercar",
"search_popout.search_format": "Format de cerca avançada",
- "search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a preferides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
+ "search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les afavorides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
"search_popout.tips.hashtag": "etiqueta",
- "search_popout.tips.status": "tut",
+ "search_popout.tips.status": "publicació",
"search_popout.tips.text": "El text simple retorna coincidències amb els noms de visualització, els noms d'usuari i les etiquetes",
"search_popout.tips.user": "usuari",
"search_results.accounts": "Gent",
"search_results.all": "Tots",
"search_results.hashtags": "Etiquetes",
"search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca",
- "search_results.statuses": "Tuts",
- "search_results.statuses_fts_disabled": "La cerca de tuts pel seu contingut no està habilitada en aquest servidor Mastodon.",
+ "search_results.statuses": "Publicacions",
+ "search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
"status.admin_account": "Obre l'interfície de moderació per a @{name}",
- "status.admin_status": "Obre aquest tut a la interfície de moderació",
+ "status.admin_status": "Obre aquesta publicació a la interfície de moderació",
"status.block": "Bloqueja @{name}",
"status.bookmark": "Marcador",
"status.cancel_reblog_private": "Desfer l'impuls",
"status.cannot_reblog": "Aquesta publicació no pot ser impulsada",
"status.copy": "Copia l'enllaç a l'estat",
- "status.delete": "Esborrar",
+ "status.delete": "Esborra",
"status.detailed_status": "Visualització detallada de la conversa",
"status.direct": "Missatge directe @{name}",
"status.edit": "Edita",
"status.edited": "Editat {date}",
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
- "status.embed": "Incrustar",
+ "status.embed": "Incrustat",
"status.favourite": "Favorit",
"status.filtered": "Filtrat",
"status.history.created": "{name} ha creat {date}",
@@ -465,17 +465,17 @@
"status.mute": "Silenciar @{name}",
"status.mute_conversation": "Silenciar conversació",
"status.open": "Ampliar aquest estat",
- "status.pin": "Fixat en el perfil",
- "status.pinned": "Tut fixat",
+ "status.pin": "Fixa en el perfil",
+ "status.pinned": "Publicació fixada",
"status.read_more": "Llegir més",
"status.reblog": "Impuls",
- "status.reblog_private": "Impulsar a l'audiència original",
+ "status.reblog_private": "Impulsar amb la visibilitat original",
"status.reblogged_by": "{name} ha impulsat",
- "status.reblogs.empty": "Encara ningú no ha impulsat aquest tut. Quan algú ho faci, apareixeran aquí.",
+ "status.reblogs.empty": "Encara ningú no ha impulsat aquesta publicació. Quan algú ho faci, apareixeran aquí.",
"status.redraft": "Esborrar i reescriure",
"status.remove_bookmark": "Suprimeix el marcador",
"status.reply": "Respondre",
- "status.replyAll": "Respondre al tema",
+ "status.replyAll": "Respondre al fil",
"status.report": "Informar sobre @{name}",
"status.sensitive_warning": "Contingut sensible",
"status.share": "Compartir",
@@ -510,11 +510,11 @@
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
"upload_area.title": "Arrossega i deixa anar per a carregar",
- "upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+ "upload_button.label": "Afegir mèdia, un vídeo o un fitxer d'audio",
"upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
"upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.",
"upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva",
- "upload_form.description": "Descriure els problemes visuals",
+ "upload_form.description": "Descriure per els que tenen problemes visuals",
"upload_form.edit": "Edita",
"upload_form.thumbnail": "Canvia la miniatura",
"upload_form.undo": "Esborra",
@@ -523,7 +523,7 @@
"upload_modal.apply": "Aplica",
"upload_modal.applying": "Aplicant…",
"upload_modal.choose_image": "Tria imatge",
- "upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons d’hidrogen, coi!",
+ "upload_modal.description_placeholder": "Una ràpida guineu marró salta sobre el gos mandrós",
"upload_modal.detect_text": "Detecta el text de l'imatge",
"upload_modal.edit_media": "Editar multimèdia",
"upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
new file mode 100644
index 000000000..7209633ad
--- /dev/null
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -0,0 +1,543 @@
+{
+ "account.account_note_header": "تێبینی ",
+ "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
+ "account.badges.bot": "بوت",
+ "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": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
+ "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.following": "Following",
+ "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
+ "account.follows_you": "شوێنکەوتووەکانت",
+ "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
+ "account.joined": "Joined {date}",
+ "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
+ "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
+ "account.media": "میدیا",
+ "account.mention": "ئاماژە @{name}",
+ "account.moved_to": "{name} گواسترایەوە بۆ:",
+ "account.mute": "بێدەنگکردن @{name}",
+ "account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
+ "account.muted": "بێ دەنگ",
+ "account.posts": "توتس",
+ "account.posts_with_replies": "توتس و وەڵامەکان",
+ "account.report": "گوزارشت @{name}",
+ "account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
+ "account.share": "پرۆفایلی @{name} هاوبەش بکە",
+ "account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}",
+ "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.unblock": "@{name} لاببە",
+ "account.unblock_domain": "کردنەوەی دۆمەینی {domain}",
+ "account.unblock_short": "Unblock",
+ "account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە",
+ "account.unfollow": "بەدوادانەچو",
+ "account.unmute": "بێدەنگکردنی @{name}",
+ "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
+ "account.unmute_short": "Unmute",
+ "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Average",
+ "admin.dashboard.retention.cohort": "Sign-up month",
+ "admin.dashboard.retention.cohort_size": "New users",
+ "alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.",
+ "alert.rate_limited.title": "ڕێژەی سنووردار",
+ "alert.unexpected.message": "هەڵەیەکی چاوەڕوان نەکراو ڕوویدا.",
+ "alert.unexpected.title": "تەححح!",
+ "announcement.announcement": "بانگەواز",
+ "attachments_list.unprocessed": "(unprocessed)",
+ "autosuggest_hashtag.per_week": "{count} هەرهەفتە",
+ "boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
+ "bundle_column_error.body": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
+ "bundle_column_error.retry": "دووبارە هەوڵبدە",
+ "bundle_column_error.title": "هەڵيی تۆڕ",
+ "bundle_modal_error.close": "داخستن",
+ "bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
+ "bundle_modal_error.retry": "دووبارە تاقی بکەوە",
+ "column.blocks": "بەکارهێنەرە بلۆککراوەکان",
+ "column.bookmarks": "نیشانەکان",
+ "column.community": "هێڵی کاتی ناوخۆیی",
+ "column.direct": "نامە ڕاستەوخۆکان",
+ "column.directory": "گەڕان لە پرۆفایلەکان",
+ "column.domain_blocks": "دۆمەینە داخراوەکان",
+ "column.favourites": "دڵخوازترینەکان",
+ "column.follow_requests": "بەدواداچوی داواکاریەکان بکە",
+ "column.home": "سەرەتا",
+ "column.lists": "پێرست",
+ "column.mutes": "بێدەنگکردنی بەکارهێنەران",
+ "column.notifications": "ئاگادارییەکان",
+ "column.pins": "تووتسی چەسپاو",
+ "column.public": "نووسراوەکانی هەمووشوێنێک",
+ "column_back_button.label": "دواوە",
+ "column_header.hide_settings": "شاردنەوەی ڕێکخستنەکان",
+ "column_header.moveLeft_settings": "ستوون بگوێزەرەوە بۆ لای چەپ",
+ "column_header.moveRight_settings": "جوولاندنی ئەستوون بۆ لای ڕاست",
+ "column_header.pin": "سنجاق",
+ "column_header.show_settings": "نیشاندانی رێکخستنەکان",
+ "column_header.unpin": "سنجاق نەکردن",
+ "column_subheading.settings": "رێکخستنەکان",
+ "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.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.publish": "توت",
+ "compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
+ "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
+ "compose_form.sensitive.marked": "وادەی کۆتایی",
+ "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.delete.confirm": "سڕینەوە",
+ "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
+ "confirmations.delete_list.confirm": "سڕینەوە",
+ "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
+ "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
+ "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
+ "confirmations.logout.confirm": "چوونە دەرەوە",
+ "confirmations.logout.message": "ئایا دڵنیایت لەوەی دەتەوێت بچیتە دەرەوە?",
+ "confirmations.mute.confirm": "بێدەنگ",
+ "confirmations.mute.explanation": "ئەمەش دەبێتە هۆی شاردنەوەی پۆستەکان یان ئەو بابەتانەی کە ئاماژەیان پێ دەکات ، بەڵام هێشتا ڕێگەیان پێ دەدات کە پۆستەکانتان ببینن و شوێنتان بکەون.",
+ "confirmations.mute.message": "ئایا دڵنیایت لەوەی دەتەوێت بیلێیت {name}?",
+ "confirmations.redraft.confirm": "سڕینەوە & دووبارە ڕەشکردنەوە",
+ "confirmations.redraft.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە و دووبارە دایبنووسیتەوە؟ دڵخوازەکان و بەرزکردنەوەکان وون دەبن، و وەڵامەکان بۆ پۆستە ڕەسەنەکە هەتیو دەبن.",
+ "confirmations.reply.confirm": "وەڵام",
+ "confirmations.reply.message": "وەڵامدانەوە ئێستا ئەو نامەیە ی کە تۆ ئێستا دایڕشتووە، دەنووسێتەوە. ئایا دڵنیایت کە دەتەوێت بەردەوام بیت?",
+ "confirmations.unfollow.confirm": "بەدوادانەچو",
+ "confirmations.unfollow.message": "ئایا دڵنیایت لەوەی دەتەوێت پەیڕەوی {name}?",
+ "conversation.delete": "سڕینەوەی گفتوگۆ",
+ "conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
+ "conversation.open": "نیشاندان گفتوگۆ",
+ "conversation.with": "لەگەڵ{names}",
+ "directory.federated": "لە ڕاژەکانی ناسراو",
+ "directory.local": "تەنها لە {domain}",
+ "directory.new_arrivals": "تازە گەیشتنەکان",
+ "directory.recently_active": "بەم دواییانە چالاکە",
+ "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
+ "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
+ "emoji_button.activity": "چالاکی",
+ "emoji_button.custom": "ئاسایی",
+ "emoji_button.flags": "ئاڵاکان",
+ "emoji_button.food": "خواردن& خواردنەوە",
+ "emoji_button.label": "ئیمۆجی بکەنێو",
+ "emoji_button.nature": "سروشت",
+ "emoji_button.not_found": "بێ ئیمۆجی! (╯°□°)╯( ┻━┻",
+ "emoji_button.objects": "ئامانجەکان",
+ "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_timeline": "لێرە هیچ توتەک نییە!",
+ "empty_column.account_unavailable": "پرۆفایل بەردەست نیە",
+ "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
+ "empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
+ "empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
+ "empty_column.direct": "تۆ هیچ نامەی ڕاستەوخۆت نیە تا ئێستا. کاتێک دانەیەک دەنێریت یان وەرت دەگرێت، لێرە پیشان دەدات.",
+ "empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
+ "empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
+ "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.",
+ "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.",
+ "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.",
+ "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.",
+ "empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.",
+ "empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.",
+ "empty_column.notifications": "تۆ هێشتا هیچ ئاگانامێکت نیە. چالاکی لەگەڵ کەسانی دیکە بکە بۆ دەستپێکردنی گفتوگۆکە.",
+ "empty_column.public": "لێرە هیچ نییە! شتێک بە ئاشکرا بنووسە(بەگشتی)، یان بە دەستی شوێن بەکارهێنەران بکەوە لە ڕاژەکانی ترەوە بۆ پڕکردنەوەی",
+ "error.unexpected_crash.explanation": "بەهۆی بوونی کێشە لە کۆدەکەمان یان کێشەی گونجانی وێبگەڕەکە، ئەم لاپەڕەیە بە دروستی پیشان نادرێت.",
+ "error.unexpected_crash.explanation_addons": "ئەم لاپەڕەیە ناتوانرێت بە دروستی پیشان بدرێت. ئەم هەڵەیە لەوانەیە بەهۆی ئامێری وەرگێڕانی خۆکار یان زیادکراوی وێبگەڕەوە بێت.",
+ "error.unexpected_crash.next_steps": "هەوڵدە لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکەیان کاربەرنامەی ڕەسەن.",
+ "error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.",
+ "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
+ "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
+ "follow_recommendations.done": "Done",
+ "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
+ "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_request.authorize": "دهسهڵاتپێدراو",
+ "follow_request.reject": "ڕەتکردنەوە",
+ "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": "ماستۆدۆن نەرمەکالایەکی سەرچاوەی کراوەیە. دەتوانیت بەشداری بکەیت یان گوزارشت بکەیت لەسەر کێشەکانی لە پەڕەی گیتهاب {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_settings.select.no_options_message": "هیچ پێشنیارێک نەدۆزرایەوە",
+ "hashtag.column_settings.select.placeholder": "هاشتاگی تێبنووسە…",
+ "hashtag.column_settings.tag_mode.all": "هەموو ئەمانە",
+ "hashtag.column_settings.tag_mode.any": "هەر کام لەمانە",
+ "hashtag.column_settings.tag_mode.none": "هیچ کام لەمانە",
+ "hashtag.column_settings.tag_toggle": "تاگی زیادە ی ئەم ستوونە لەخۆ بنووسە",
+ "home.column_settings.basic": "بنەڕەتی",
+ "home.column_settings.show_reblogs": "پیشاندانی بەهێزکردن",
+ "home.column_settings.show_replies": "وەڵامدانەوەکان پیشان بدە",
+ "home.hide_announcements": "شاردنەوەی راگەیەنراوەکان",
+ "home.show_announcements": "پیشاندانی راگەیەنراوەکان",
+ "intervals.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژەک}}",
+ "intervals.full.hours": "{number, plural, one {# کات} other {# کات}}",
+ "intervals.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}}",
+ "keyboard_shortcuts.back": "بۆ گەڕانەوە",
+ "keyboard_shortcuts.blocked": "بۆ کردنەوەی لیستی بەکارهێنەرە بلۆککراوەکان",
+ "keyboard_shortcuts.boost": "بۆ بەهێزکردن",
+ "keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان",
+ "keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق",
+ "keyboard_shortcuts.description": "وهسف",
+ "keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی نامە ڕاستەوخۆکان",
+ "keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا",
+ "keyboard_shortcuts.enter": "بۆ کردنەوەی توت",
+ "keyboard_shortcuts.favourite": "بۆ دڵخواز",
+ "keyboard_shortcuts.favourites": "بۆ کردنەوەی لیستی دڵخوازەکان",
+ "keyboard_shortcuts.federated": "بۆ کردنەوەی نووسراوەکانی هەمووشوێن",
+ "keyboard_shortcuts.heading": "قهدبڕەکانی تەختەکلیل",
+ "keyboard_shortcuts.home": "بۆ کردنەوەی هێڵی کاتی ماڵەوە",
+ "keyboard_shortcuts.hotkey": "هۆتکەی",
+ "keyboard_shortcuts.legend": "بۆ نیشاندانی ئەم نیشانە",
+ "keyboard_shortcuts.local": "بۆ کردنەوەی نووسراوەکانی خۆماڵی",
+ "keyboard_shortcuts.mention": "نۆ ناوبردن لە نووسەر",
+ "keyboard_shortcuts.muted": "بۆ کردنەوەی پێرستی بەکارهێنەرانی بێدەنگ",
+ "keyboard_shortcuts.my_profile": "بۆ کردنەوەی پرۆفایڵ",
+ "keyboard_shortcuts.notifications": "بۆ کردنەوەی ستوونی ئاگانامەکان",
+ "keyboard_shortcuts.open_media": "بۆ کردنەوەی میدیا",
+ "keyboard_shortcuts.pinned": "بۆ کردنەوەی لیستی توتەکانی چەسپێنراو",
+ "keyboard_shortcuts.profile": "بۆ کردنەوەی پرۆفایڵی نووسەر",
+ "keyboard_shortcuts.reply": "بۆ وەڵامدانەوە",
+ "keyboard_shortcuts.requests": "بۆ کردنەوەی لیستی داواکاریەکانی بەدوادا",
+ "keyboard_shortcuts.search": "بۆ جەختکردن لەسەر گەڕان",
+ "keyboard_shortcuts.spoilers": "بۆ پیشاندان/شاردنەوەی خانەی CW",
+ "keyboard_shortcuts.start": "بۆ کردنەوەی ستوونی \"دەست پێبکە\"",
+ "keyboard_shortcuts.toggle_hidden": "بۆ پیشاندان/شاردنەوەی دەق لە پشت CW",
+ "keyboard_shortcuts.toggle_sensitivity": "بۆ پیشاندان/شاردنەوەی میدیا",
+ "keyboard_shortcuts.toot": "بۆ دەست کردن بە براندێکی تازە",
+ "keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان",
+ "keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت",
+ "lightbox.close": "دابخە",
+ "lightbox.compress": "سندوقی نیشاندانی وێنە بپەستێنە",
+ "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
+ "lightbox.next": "داهاتوو",
+ "lightbox.previous": "پێشوو",
+ "lists.account.add": "زیادکردن بۆ لیست",
+ "lists.account.remove": "لابردن لە لیست",
+ "lists.delete": "سڕینەوەی لیست",
+ "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": "پیشاندانی وەڵامەکان بۆ:",
+ "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
+ "lists.subheading": "لیستەکانت",
+ "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "loading_indicator.label": "بارکردن...",
+ "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
+ "missing_indicator.label": "نەدۆزرایەوە",
+ "missing_indicator.sublabel": "ئەو سەرچاوەیە نادۆزرێتەوە",
+ "mute_modal.duration": "ماوە",
+ "mute_modal.hide_notifications": "شاردنەوەی ئاگانامەکان لەم بەکارهێنەرە؟ ",
+ "mute_modal.indefinite": "نادیار",
+ "navigation_bar.apps": "بەرنامەی مۆبایل",
+ "navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان",
+ "navigation_bar.bookmarks": "نیشانکراوەکان",
+ "navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
+ "navigation_bar.compose": "نووسینی توتی نوێ",
+ "navigation_bar.direct": "نامە ڕاستەوخۆکان",
+ "navigation_bar.discover": "دۆزینەوە",
+ "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
+ "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
+ "navigation_bar.explore": "Explore",
+ "navigation_bar.favourites": "دڵخوازەکان",
+ "navigation_bar.filters": "وشە کپەکان",
+ "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
+ "navigation_bar.follows_and_followers": "شوێنکەوتوو و شوێنکەوتوان",
+ "navigation_bar.info": "دەربارەی ئەم ڕاژە",
+ "navigation_bar.keyboard_shortcuts": "هۆتکەی",
+ "navigation_bar.lists": "لیستەکان",
+ "navigation_bar.logout": "دەرچوون",
+ "navigation_bar.mutes": "کپکردنی بەکارهێنەران",
+ "navigation_bar.personal": "کەسی",
+ "navigation_bar.pins": "توتی چەسپاو",
+ "navigation_bar.preferences": "پەسەندەکان",
+ "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
+ "navigation_bar.security": "ئاسایش",
+ "notification.admin.sign_up": "{name} signed up",
+ "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
+ "notification.follow": "{name} دوای تۆ کەوت",
+ "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت",
+ "notification.mention": "{name} باسی ئێوەی کرد",
+ "notification.own_poll": "ڕاپرسیەکەت کۆتایی هات",
+ "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
+ "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
+ "notification.status": "{name} تازە بڵاوکرایەوە",
+ "notification.update": "{name} edited a post",
+ "notifications.clear": "ئاگانامەکان بسڕیەوە",
+ "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
+ "notifications.column_settings.favourite": "دڵخوازترین:",
+ "notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە",
+ "notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.follow": "شوێنکەوتوانی نوێ:",
+ "notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:",
+ "notifications.column_settings.mention": "ئاماژەکان:",
+ "notifications.column_settings.poll": "ئەنجامەکانی ڕاپرسی:",
+ "notifications.column_settings.push": "ئاگانامەکان پاڵ بنێ",
+ "notifications.column_settings.reblog": "دووبارەتوتەکان:",
+ "notifications.column_settings.show": "لە ستووندا پیشان بدە",
+ "notifications.column_settings.sound": "لێدانی دەنگ",
+ "notifications.column_settings.status": "توتەکانی نوێ:",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
+ "notifications.filter.all": "هەموو",
+ "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_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": "هەرگیز شتێک لە دەست مەدە",
+ "picture_in_picture.restore": "بیگەڕێنەوە",
+ "poll.closed": "دابخە",
+ "poll.refresh": "نوێکردنەوە",
+ "poll.total_people": "{count, plural, one {# خەڵک} other {# خەڵک}}",
+ "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
+ "poll.vote": "دەنگ",
+ "poll.voted": "تۆ دەنگت بەو وەڵامە دا",
+ "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
+ "poll_button.remove_poll": "دهنگدان بسڕهوه",
+ "privacy.change": "ڕێکخستنی تایبەتمەندی توت",
+ "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
+ "privacy.direct.short": "ڕاستەوخۆ",
+ "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
+ "privacy.private.short": "تەنها بۆ شوێنکەوتوان",
+ "privacy.public.long": "بۆ هەمووان دیاربێت، لە هێڵی کاتی گشتی دا نیشان دەدرێت",
+ "privacy.public.short": "گشتی",
+ "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە هێڵی کاتی گشتیدا نا",
+ "privacy.unlisted.short": "لە لیست نەکراو",
+ "refresh": "نوێکردنەوە",
+ "regeneration_indicator.label": "بارکردن…",
+ "regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
+ "relative_time.days": "{number}ڕۆژ",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.hours": "{number}کات",
+ "relative_time.just_now": "ئێستا",
+ "relative_time.minutes": "{number}کات",
+ "relative_time.seconds": "{number}کات",
+ "relative_time.today": "ئیمڕۆ",
+ "reply_indicator.cancel": "هەڵوەشاندنەوه",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
+ "report.forward": "ناردن بۆ {target}",
+ "report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "سەرنجەکانی زیاتر",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "ناردن",
+ "report.target": "گوزارشتکردنی{target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "search.placeholder": "گەڕان",
+ "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
+ "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.",
+ "search_popout.tips.hashtag": "هەشتاگ",
+ "search_popout.tips.status": "توت",
+ "search_popout.tips.text": "دەقی سادە هەڵدەسێ بە گەڕاندنەوەی هاوتایی ناوی پیشاندان، ناوی بەکارهێنەر و هاشتاگەکان",
+ "search_popout.tips.user": "بەکارهێنەر",
+ "search_results.accounts": "خەڵک",
+ "search_results.all": "All",
+ "search_results.hashtags": "هەشتاگ",
+ "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.statuses": "توتەکان",
+ "search_results.statuses_fts_disabled": "گەڕانی توتەکان بە ناوەڕۆکیان لەسەر ئەم ڕاژەی ماستۆدۆن چالاک نەکراوە.",
+ "search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
+ "status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
+ "status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
+ "status.block": "بلۆکی @{name}",
+ "status.bookmark": "نیشانه",
+ "status.cancel_reblog_private": "بێبەهێزکردن",
+ "status.cannot_reblog": "ئەم بابەتە ناتوانرێت بەرزبکرێتەوە",
+ "status.copy": "ڕوونووسی بەستەر بۆ توت",
+ "status.delete": "سڕینەوە",
+ "status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
+ "status.direct": "پەیامی ڕاستەوخۆ @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.embed": "نیشتەجێ بکە",
+ "status.favourite": "دڵخواز",
+ "status.filtered": "پاڵاوتن",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
+ "status.load_more": "بارکردنی زیاتر",
+ "status.media_hidden": "میدیای شاراوە",
+ "status.mention": "ناوبنێ @{name}",
+ "status.more": "زیاتر",
+ "status.mute": "بێدەنگکردن @{name}",
+ "status.mute_conversation": "گفتوگۆی بێدەنگ",
+ "status.open": "ئەم توتە فراوان بکە",
+ "status.pin": "لکاندن لەسەر پرۆفایل",
+ "status.pinned": "توتی چەسپکراو",
+ "status.read_more": "زیاتر بخوێنەوە",
+ "status.reblog": "بەهێزکردن",
+ "status.reblog_private": "بەهێزکردن بۆ بینەرانی سەرەتایی",
+ "status.reblogged_by": "{name} توتی کردەوە",
+ "status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
+ "status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
+ "status.remove_bookmark": "لابردنی نیشانه",
+ "status.reply": "وەڵام",
+ "status.replyAll": "بە نووسراوە وەڵام بدەوە",
+ "status.report": "گوزارشت @{name}",
+ "status.sensitive_warning": "ناوەڕۆکی هەستیار",
+ "status.share": "هاوبەش کردن",
+ "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.unpin": "لابردن لە پرۆفایل",
+ "suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
+ "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.moments": "ئەو ساتانەی ماونەتەوە",
+ "time_remaining.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
+ "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": "گۆگران",
+ "ui.beforeunload": "ڕەشنووسەکەت لە دەست دەچێت ئەگەر لە ماستۆدۆن بڕۆیت.",
+ "units.short.billion": "{count}ملیار",
+ "units.short.million": "{count}ملیۆن",
+ "units.short.thousand": "{count}هەزار",
+ "upload_area.title": "ڕاکێشان & دانان بۆ بارکردن",
+ "upload_button.label": "زیادکردنی وێنەکان، ڤیدیۆیەک یان فایلێکی دەنگی",
+ "upload_error.limit": "سنووری بارکردنی فایل تێپەڕیوە.",
+ "upload_error.poll": "پەڕگەکە ڕێی پێنەدراوە بە ڕاپرسی باربکرێت.",
+ "upload_form.audio_description": "بۆ ئەو کەسانەی کە گوێ بیستیان هەیە وەسف دەکات",
+ "upload_form.description": "وەسف بکە بۆ کەمبینایان",
+ "upload_form.edit": "دەستکاری",
+ "upload_form.thumbnail": "گۆڕانی وینۆچکە",
+ "upload_form.undo": "سڕینەوە",
+ "upload_form.video_description": "بۆ کەم بینایان و کەم بیستان وەسفی بکە",
+ "upload_modal.analyzing_picture": "شیکردنەوەی وێنە…",
+ "upload_modal.apply": "جێبەجێ کردن",
+ "upload_modal.applying": "Applying…",
+ "upload_modal.choose_image": "وێنە هەڵبژێرە",
+ "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
+ "upload_modal.detect_text": "دەقی وێنەکە بدۆزیەوە",
+ "upload_modal.edit_media": "دەستکاریکردنی میدیا",
+ "upload_modal.hint": "گەر وێنە چکۆلە یان بڕاوەبێت، خاڵی ناوەندی دیار دەکەوێت. خاڵی ناوەندی وێنە بە کرتە یان جێبەجیکردنی رێکبخەن.",
+ "upload_modal.preparing_ocr": "ئامادەکردنی OCR…",
+ "upload_modal.preview_label": "پێشبینی ({ratio})",
+ "upload_progress.label": "بارکردن...",
+ "video.close": "داخستنی ڤیدیۆ",
+ "video.download": "داگرتنی فایل",
+ "video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
+ "video.expand": "ڤیدیۆفراوان بکە",
+ "video.fullscreen": "پڕپیشانگەر",
+ "video.hide": "شاردنەوەی ڤیدیۆ",
+ "video.mute": "دەنگی کپ",
+ "video.pause": "وەستان",
+ "video.play": "پەخشکردن",
+ "video.unmute": "دەنگ لابدە"
+}
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 47a35127f..16e9ec1c7 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -76,7 +76,7 @@
"column.domain_blocks": "Blokované domény",
"column.favourites": "Oblíbené",
"column.follow_requests": "Žádosti o sledování",
- "column.home": "Domů",
+ "column.home": "Domovská časová osa",
"column.lists": "Seznamy",
"column.mutes": "Skrytí uživatelé",
"column.notifications": "Oznámení",
@@ -295,7 +295,7 @@
"navigation_bar.discover": "Objevujte",
"navigation_bar.domain_blocks": "Blokované domény",
"navigation_bar.edit_profile": "Upravit profil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Objevování",
"navigation_bar.favourites": "Oblíbené",
"navigation_bar.filters": "Skrytá slova",
"navigation_bar.follow_requests": "Žádosti o sledování",
@@ -319,7 +319,7 @@
"notification.poll": "Anketa, ve které jste hlasovali, skončila",
"notification.reblog": "Uživatel {name} boostnul váš příspěvek",
"notification.status": "Nový příspěvek od {name}",
- "notification.update": "{name} edited a post",
+ "notification.update": "uživatel {name} upravil příspěvek",
"notifications.clear": "Smazat oznámení",
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
"notifications.column_settings.admin.sign_up": "New sign-ups:",
@@ -339,7 +339,7 @@
"notifications.column_settings.status": "Nové příspěvky:",
"notifications.column_settings.unread_notifications.category": "Nepřečtená oznámení",
"notifications.column_settings.unread_notifications.highlight": "Zvýraznit nepřečtená oznámení",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Úpravy:",
"notifications.filter.all": "Vše",
"notifications.filter.boosts": "Boosty",
"notifications.filter.favourites": "Oblíbení",
@@ -381,7 +381,7 @@
"relative_time.days": "{number} d",
"relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
"relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
+ "relative_time.full.just_now": "právě teď",
"relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
"relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
"relative_time.hours": "{number} h",
@@ -392,11 +392,11 @@
"reply_indicator.cancel": "Zrušit",
"report.block": "Block",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
+ "report.categories.other": "Ostatní",
"report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
+ "report.categories.violation": "Obsah porušuje jedno nebo více pravidel serveru",
+ "report.category.subtitle": "Vyberte nejbližší možnost",
+ "report.category.title": "Povězte nám, proč chcete {type} nahlásit",
"report.category.title_account": "profile",
"report.category.title_status": "post",
"report.close": "Done",
@@ -405,20 +405,20 @@
"report.forward_hint": "Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii hlášení?",
"report.mute": "Mute",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.next": "Dále",
"report.placeholder": "Dodatečné komentáře",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "Nelíbí se mi",
+ "report.reasons.dislike_description": "Není to něco, co chcete vidět",
+ "report.reasons.other": "Jde o něco jiného",
+ "report.reasons.other_description": "Problém neodpovídá ostatním kategoriím",
+ "report.reasons.spam": "Je to spam",
+ "report.reasons.spam_description": "Škodlivé odkazy, falešné interakce nebo opakované odpovědi",
+ "report.reasons.violation": "Porušuje pravidla serveru",
+ "report.reasons.violation_description": "Máte za to, že porušuje konkrétní pravidla",
+ "report.rules.subtitle": "Vyberte všechna relevantní",
+ "report.rules.title": "Která pravidla porušuje?",
+ "report.statuses.subtitle": "Vyberte všechny relevantní",
+ "report.statuses.title": "Existují příspěvky dokládající toto hlášení?",
"report.submit": "Odeslat",
"report.target": "Nahlášení uživatele {target}",
"report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
@@ -491,7 +491,7 @@
"suggestions.dismiss": "Odmítnout návrh",
"suggestions.header": "Mohlo by vás zajímat…",
"tabs_bar.federated_timeline": "Federovaná",
- "tabs_bar.home": "Domů",
+ "tabs_bar.home": "Domovská",
"tabs_bar.local_timeline": "Místní",
"tabs_bar.notifications": "Oznámení",
"tabs_bar.search": "Hledat",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index 273fd5515..ccdca8d9c 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -294,7 +294,7 @@
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios ocultos",
"navigation_bar.edit_profile": "Editar perfil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
"navigation_bar.follow_requests": "Solicitudes para seguirte",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 3fbed32d9..a5cbf5128 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -18,7 +18,7 @@
"account.followers": "Jarraitzaileak",
"account.followers.empty": "Ez du inork erabiltzaile hau jarraitzen oraindik.",
"account.followers_counter": "{count, plural, one {Jarraitzaile {counter}} other {{counter} jarraitzaile}}",
- "account.following": "Following",
+ "account.following": "Jarraitzen",
"account.following_counter": "{count, plural, one {{counter} jarraitzen} other {{counter} jarraitzen}}",
"account.follows.empty": "Erabiltzaile honek ez du inor jarraitzen oraindik.",
"account.follows_you": "Jarraitzen dizu",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {Bidalketa {counter}} other {{counter} bidalketa}}",
"account.unblock": "Desblokeatu @{name}",
"account.unblock_domain": "Berriz erakutsi {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Desblokeatu",
"account.unendorse": "Ez nabarmendu profilean",
"account.unfollow": "Utzi jarraitzeari",
"account.unmute": "Desmututu @{name}",
"account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Desmututu",
"account_note.placeholder": "Click to add a note",
"admin.dashboard.daily_retention": "Erabiltzaile atxikitze-tasa izena eman ondorengo eguneko",
"admin.dashboard.monthly_retention": "Erabiltzaile atxikitze-tasa izena eman ondorengo hilabeteko",
@@ -168,7 +168,7 @@
"empty_column.community": "Denbora-lerro lokala hutsik dago. Idatzi zerbait publikoki pilota biraka jartzeko!",
"empty_column.direct": "Ez duzu mezu zuzenik oraindik. Baten bat bidali edo jasotzen duzunean, hemen agertuko da.",
"empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "Ez dago joerarik une honetan. Begiratu beranduago!",
"empty_column.favourited_statuses": "Ez duzu gogokorik oraindik. Gogokoren bat duzunean hemen agertuko da.",
"empty_column.favourites": "Ez du inork gogokoetara gehitu bidalketa hau oraindik. Inork egiten duenean, hemen agertuko dira.",
"empty_column.follow_recommendations": "Dirudienez ezin izan da zuretzako proposamenik sortu. Bilaketa erabili dezakezu ezagutzen duzun jendea aurkitzeko edo traolen joerak arakatu.",
@@ -187,12 +187,12 @@
"error.unexpected_crash.next_steps_addons": "Saiatu desgaitu eta orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.",
"errors.unexpected_crash.copy_stacktrace": "Kopiatu irteera arbelera",
"errors.unexpected_crash.report_issue": "Eman arazoaren berri",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "Bilaketaren emaitzak",
+ "explore.suggested_follows": "Zuretzat",
+ "explore.title": "Arakatu",
+ "explore.trending_links": "Berriak",
+ "explore.trending_statuses": "Bidalketak",
+ "explore.trending_tags": "Traolak",
"follow_recommendations.done": "Egina",
"follow_recommendations.heading": "Jarraitu jendea beren bidalketak ikusteko! Hemen dituzu iradokizun batzuk.",
"follow_recommendations.lead": "Jarraitzen duzun jendearen bidalketak ordena kronologikoan agertuko dira zure hasierako jarioan. Ez izan akatsak egiteko beldurrik, jendea jarraitzeari uztea erraza da!",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "Aurkitu",
"navigation_bar.domain_blocks": "Ezkutatutako domeinuak",
"navigation_bar.edit_profile": "Aldatu profila",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Arakatu",
"navigation_bar.favourites": "Gogokoak",
"navigation_bar.filters": "Mutututako hitzak",
"navigation_bar.follow_requests": "Jarraitzeko eskariak",
@@ -309,7 +309,7 @@
"navigation_bar.preferences": "Hobespenak",
"navigation_bar.public_timeline": "Federatutako denbora-lerroa",
"navigation_bar.security": "Segurtasuna",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "{name} erabiltzailea erregistratu da",
"notification.favourite": "{name}(e)k zure bidalketa gogoko du",
"notification.follow": "{name}(e)k jarraitzen zaitu",
"notification.follow_request": "{name}(e)k zu jarraitzeko eskaera egin du",
@@ -321,7 +321,7 @@
"notification.update": "{name} erabiltzaileak bidalketa bat editatu du",
"notifications.clear": "Garbitu jakinarazpenak",
"notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Izen-emate berriak:",
"notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
"notifications.column_settings.favourite": "Gogokoak:",
"notifications.column_settings.filter_bar.advanced": "Erakutsi kategoria guztiak",
@@ -389,43 +389,43 @@
"relative_time.seconds": "{number}s",
"relative_time.today": "gaur",
"reply_indicator.cancel": "Utzi",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block": "Blokeatu",
+ "report.block_explanation": "Ez dituzu bere bidalketak ikusiko. Ezingo dituzte zure bidalketak ikusi eta ez jarraitu. Blokeatu dituzula jakin dezakete.",
"report.categories.other": "Bestelakoak",
"report.categories.spam": "Spam",
"report.categories.violation": "Edukiak zerbitzariko arau bat edo gehiago urratzen ditu",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.category.subtitle": "Aukeratu egokiena",
+ "report.category.title": "Kontaiguzu zer gertatzen den {type} honekin",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "bidalketa",
+ "report.close": "Egina",
+ "report.comment.title": "Beste zerbait jakin beharko genuke?",
"report.forward": "Birbidali hona: {target}",
"report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "Mututu",
+ "report.mute_explanation": "Ez dituzu bere bidalketak ikusiko. Zu jarraitu eta zure bidalketak ikusteko aukera izango dute eta ezingo dute jakin mututu dituzula.",
+ "report.next": "Hurrengoa",
"report.placeholder": "Iruzkin gehigarriak",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "Ez dut gustukoa",
+ "report.reasons.dislike_description": "Ikusi nahi ez dudan zerbait da",
+ "report.reasons.other": "Beste zerbait da",
+ "report.reasons.other_description": "Arazoa ezin da beste kategorietan sailkatu",
+ "report.reasons.spam": "Spama da",
+ "report.reasons.spam_description": "Esteka maltzurrak, gezurrezko elkarrekintzak edo erantzun errepikakorrak",
+ "report.reasons.violation": "Zerbitzariaren arauak hausten ditu",
+ "report.reasons.violation_description": "Arau zehatzak urratzen dituela badakizu",
+ "report.rules.subtitle": "Hautatu dagozkion guztiak",
+ "report.rules.title": "Ze arau hautsi ditu?",
+ "report.statuses.subtitle": "Hautatu dagozkion guztiak",
+ "report.statuses.title": "Salaketa hau babesten duen bidalketarik badago?",
"report.submit": "Bidali",
"report.target": "{target} salatzen",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Hemen dituzu Mastodonen ikusiko duzuna kontrolatzeko aukerak:",
+ "report.thanks.take_action_actionable": "Hau berrikusten dugun bitartean, @{name} erabiltzailearen aurkako neurriak hartu ditzakezu:",
+ "report.thanks.title": "Ez duzu hau ikusi nahi?",
+ "report.thanks.title_actionable": "Mila esker salaketagatik, berrikusiko dugu.",
+ "report.unfollow": "@{name} jarraitzeari utzi",
+ "report.unfollow_explanation": "Kontu hau jarraitzen ari zara. Zure denbora-lerro nagusian bere bidalketak ez ikusteko, jarraitzeari utzi.",
"search.placeholder": "Bilatu",
"search_popout.search_format": "Bilaketa aurreratuaren formatua",
"search_popout.tips.full_text": "Testu hutsarekin zuk idatzitako bidalketak, gogokoak, bultzadak edo aipamenak aurkitu ditzakezu, bat datozen erabiltzaile-izenak, pantaila-izenak, eta traolak.",
@@ -434,9 +434,9 @@
"search_popout.tips.text": "Testu hutsak pantaila-izenak, erabiltzaile-izenak eta traolak bilatzen ditu",
"search_popout.tips.user": "erabiltzailea",
"search_results.accounts": "Jendea",
- "search_results.all": "All",
+ "search_results.all": "Guztiak",
"search_results.hashtags": "Traolak",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "Ez da emaitzarik aurkitu bilaketa-termino horientzat",
"search_results.statuses": "Bidalketak",
"search_results.statuses_fts_disabled": "Mastodon zerbitzari honek ez du bidalketen edukiaren bilaketa gaitu.",
"search_results.total": "{count, number} {count, plural, one {emaitza} other {emaitza}}",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 659336393..73a65ed78 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -3,53 +3,53 @@
"account.add_or_remove_from_list": "افزودن یا برداشتن از سیاههها",
"account.badges.bot": "روبات",
"account.badges.group": "گروه",
- "account.block": "مسدود کردن @{name}",
+ "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": "آگاهی به من هنگام فرستادنهای @{name} پایان یابد",
+ "account.direct": "پیام مستقیم به @{name}",
+ "account.disable_notifications": "آگاه کردن من هنگام فرستههای @{name} را متوقّف کن",
"account.domain_blocked": "دامنه مسدود شد",
"account.edit_profile": "ویرایش نمایه",
- "account.enable_notifications": "هنگام فرستههای @{name} مرا آگاه کن",
+ "account.enable_notifications": "هنگام فرستههای @{name} مرا آگاه کن",
"account.endorse": "معرّفی در نمایه",
"account.follow": "پیگیری",
"account.followers": "پیگیرندگان",
"account.followers.empty": "هنوز کسی این کاربر را پیگیری نمیکند.",
"account.followers_counter": "{count, plural, one {{counter} پیگیرنده} other {{counter} پیگیرنده}}",
- "account.following": "Following",
+ "account.following": "پی میگیرید",
"account.following_counter": "{count, plural, one {{counter} پیگرفته} other {{counter} پیگرفته}}",
"account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
"account.follows_you": "پی میگیردتان",
- "account.hide_reblogs": "نهفتن تقویتهای @{name}",
+ "account.hide_reblogs": "نهفتن تقویتهای @{name}",
"account.joined": "پیوسته از {date}",
"account.link_verified_on": "مالکیت این پیوند در {date} بررسی شد",
"account.locked_info": "این حساب خصوصی است. صاحبش تصمیم میگیرد که چه کسی پیگیرش باشد.",
"account.media": "رسانه",
- "account.mention": "نامبردن از @{name}",
+ "account.mention": "نامبردن از @{name}",
"account.moved_to": "{name} منتقل شده به:",
- "account.mute": "خموشاندن @{name}",
- "account.mute_notifications": "خموشاندن آگاهیها از @{name}",
+ "account.mute": "خموشاندن @{name}",
+ "account.mute_notifications": "خموشاندن آگاهیهای @{name}",
"account.muted": "خموش",
"account.posts": "فرسته",
"account.posts_with_replies": "فرستهها و پاسخها",
- "account.report": "گزارش @{name}",
+ "account.report": "گزارش @{name}",
"account.requested": "منتظر پذیرش است. برای لغو درخواست پیگیری کلیک کنید",
- "account.share": "همرسانی نمایهٔ @{name}",
- "account.show_reblogs": "نمایش تقویتهای @{name}",
+ "account.share": "همرسانی نمایهٔ @{name}",
+ "account.show_reblogs": "نمایش تقویتهای @{name}",
"account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}",
- "account.unblock": "رفع مسدودیت @{name}",
+ "account.unblock": "رفع مسدودیت @{name}",
"account.unblock_domain": "رفع مسدودیت دامنهٔ {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "رفع مسدودیت",
"account.unendorse": "معرّفی نکردن در نمایه",
"account.unfollow": "ناپیگیری",
- "account.unmute": "ناخموشی @{name}",
- "account.unmute_notifications": "ناخموشی آگاهیها از @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute": "ناخموشی @{name}",
+ "account.unmute_notifications": "ناخموشی آگاهیهای @{name}",
+ "account.unmute_short": "ناخموشی",
"account_note.placeholder": "برای افزودن یادداشت کلیک کنید",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.daily_retention": "نرخ حفظ کاربر در روز پس از ثبت نام",
+ "admin.dashboard.monthly_retention": "نرخ حفظ کاربر در ماه پس از ثبت نام",
"admin.dashboard.retention.average": "میانگین",
"admin.dashboard.retention.cohort": "ماه ثبتنام",
"admin.dashboard.retention.cohort_size": "کاربران جدید",
@@ -79,13 +79,13 @@
"column.lists": "سیاههها",
"column.mutes": "کاربران خموش",
"column.notifications": "آگاهیها",
- "column.pins": "فرستههای سنجاقشده",
+ "column.pins": "فرستههای سنجاق شده",
"column.public": "خط زمانی همگانی",
"column_back_button.label": "بازگشت",
"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_subheading.settings": "تنظیمات",
@@ -94,7 +94,7 @@
"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": "تازه چه خبر؟",
@@ -106,7 +106,7 @@
"compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تکگزینهای",
"compose_form.publish": "بوق",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "ذخیرهٔ تغییرات",
"compose_form.sensitive.hide": "{count, plural, one {علامتگذاری رسانه به عنوان حساس} other {علامتگذاری رسانهها به عنوان حساس}}",
"compose_form.sensitive.marked": "{count, plural, one {رسانه به عنوان حساس علامتگذاری شد} other {رسانهها به عنوان حساس علامتگذاری شدند}}",
"compose_form.sensitive.unmarked": "{count, plural, one {رسانه به عنوان حساس علامتگذاری نشد} other {رسانهها به عنوان حساس علامتگذاری نشدند}}",
@@ -144,7 +144,7 @@
"directory.local": "تنها از {domain}",
"directory.new_arrivals": "تازهواردان",
"directory.recently_active": "کاربران فعال اخیر",
- "embed.instructions": "برای جاگذاری این فرسته در سایت خودتان، کد زیر را کپی کنید.",
+ "embed.instructions": "برای جاسازی این فرسته در سایت خودتان، کد زیر را رونوشت کنید.",
"embed.preview": "این گونه دیده خواهد شد:",
"emoji_button.activity": "فعالیت",
"emoji_button.custom": "سفارشی",
@@ -164,11 +164,11 @@
"empty_column.account_timeline": "هیچ فرستهای اینجا نیست!",
"empty_column.account_unavailable": "نمایهٔ موجود نیست",
"empty_column.blocks": "هنوز کسی را مسدود نکردهاید.",
- "empty_column.bookmarked_statuses": "هنوز هیچ فرستهٔ نشانشدهای ندارید. هنگامی که فرستهای را نشانکنید، اینجا نشان داده خواهد شد.",
+ "empty_column.bookmarked_statuses": "هنوز هیچ فرستهٔ نشانهگذاری شدهای ندارید. هنگامی که فرستهای را نشانهگذاری کنید، اینجا نشان داده خواهد شد.",
"empty_column.community": "خط زمانی محلّی خالی است. چیزی بنویسید تا چرخش بچرخد!",
"empty_column.direct": "هنوز هیچ پیام مستقیمی ندارید. هنگامی که چنین پیامی بگیرید یا بفرستید اینجا نشان داده خواهد شد.",
"empty_column.domain_blocks": "هنوز هیچ دامنهای مسدود نشده است.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "الآن چیزی پرطرفدار نیست. بعداً دوباره بررسی کنید!",
"empty_column.favourited_statuses": "شما هنوز هیچ فرستهای را نپسندیدهاید. هنگامی که فرستهای را بپسندید، اینجا نشان داده خواهد شد.",
"empty_column.favourites": "هنوز هیچ کسی این فرسته را نپسندیده است. هنگامی که کسی آن را بپسندد، اینجا نشان داده خواهد شد.",
"empty_column.follow_recommendations": "ظاهرا هیچ پیشنهادی برای شما نمیتوانیم تولید کنیم. میتوانید از امکان جستوجو برای یافتن افرادی که ممکن است بشناسید و یا کاوش میان برچسبهای داغ استفاده کنید.",
@@ -187,12 +187,12 @@
"error.unexpected_crash.next_steps_addons": "لطفاً از کارشان انداخته و صفحه را نوسازی کنید. اگر کمکی نکرد، شاید همچنان بتوانید با مرورگری دیگر یا با کارهای بومی از ماستودون استفاده کنید.",
"errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
"errors.unexpected_crash.report_issue": "گزارش مشکل",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "نتایج جستوجو",
+ "explore.suggested_follows": "برای شما",
+ "explore.title": "کاوش",
+ "explore.trending_links": "اخبار",
+ "explore.trending_statuses": "فرستهها",
+ "explore.trending_tags": "هشتگها",
"follow_recommendations.done": "انجام شد",
"follow_recommendations.heading": "افرادی را که میخواهید فرستههایشان را ببینید پیگیری کنید! اینها تعدادی پیشنهاد هستند.",
"follow_recommendations.lead": "فرستههای افرادی که دنبال میکنید به ترتیب زمانی در خوراک خانهتان نشان داده خواهد شد. از اشتباه کردن نترسید. میتوانید به همین سادگی در هر زمانی از دنبال کردن افراد دست بکشید!",
@@ -247,7 +247,7 @@
"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": "گشودن سیاههٔ درخواستهای پیگیری",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "گشت و گذار",
"navigation_bar.domain_blocks": "دامنههای مسدود شده",
"navigation_bar.edit_profile": "ویرایش نمایه",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "کاوش",
"navigation_bar.favourites": "پسندیدهها",
"navigation_bar.filters": "واژههای خموش",
"navigation_bar.follow_requests": "درخواستهای پیگیری",
@@ -305,11 +305,11 @@
"navigation_bar.logout": "خروج",
"navigation_bar.mutes": "کاربران خموشانده",
"navigation_bar.personal": "شخصی",
- "navigation_bar.pins": "فرستههای سنجاقشده",
+ "navigation_bar.pins": "فرستههای سنجاق شده",
"navigation_bar.preferences": "ترجیحات",
"navigation_bar.public_timeline": "خط زمانی همگانی",
"navigation_bar.security": "امنیت",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "{name} ثبت نام کرد",
"notification.favourite": "{name} فرستهتان را پسندید",
"notification.follow": "{name} پیگیرتان شد",
"notification.follow_request": "{name} میخواهد پیگیر شما باشد",
@@ -318,10 +318,10 @@
"notification.poll": "نظرسنجیای که در آن رأی دادید به پایان رسیده است",
"notification.reblog": "{name} فرستهتان را تقویت کرد",
"notification.status": "{name} چیزی فرستاد",
- "notification.update": "{name} edited a post",
+ "notification.update": "{name} فرستهای را ویرایش کرد",
"notifications.clear": "پاکسازی آگاهیها",
"notifications.clear_confirmation": "مطمئنید میخواهید همهٔ آگاهیهایتان را برای همیشه پاک کنید؟",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "ثبت نامهای جدید:",
"notifications.column_settings.alert": "آگاهیهای میزکار",
"notifications.column_settings.favourite": "پسندیدهها:",
"notifications.column_settings.filter_bar.advanced": "نمایش همۀ دستهها",
@@ -338,7 +338,7 @@
"notifications.column_settings.status": "فرستههای جدید:",
"notifications.column_settings.unread_notifications.category": "آگاهیهای خوانده نشده",
"notifications.column_settings.unread_notifications.highlight": "پررنگ کردن آگاهیهای خوانده نشده",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "ویرایشها:",
"notifications.filter.all": "همه",
"notifications.filter.boosts": "تقویتها",
"notifications.filter.favourites": "پسندها",
@@ -378,54 +378,54 @@
"regeneration_indicator.label": "در حال بار شدن…",
"regeneration_indicator.sublabel": "خوراک خانگیان دارد آماده میشود!",
"relative_time.days": "{number} روز",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "{number, plural, one {# روز} other {# روز}} پیش",
+ "relative_time.full.hours": "{number, plural, one {# ساعت} other {# ساعت}} پیش",
+ "relative_time.full.just_now": "همين آلان",
+ "relative_time.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} پیش",
+ "relative_time.full.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} پیش",
"relative_time.hours": "{number} ساعت",
"relative_time.just_now": "حالا",
"relative_time.minutes": "{number} دقیقه",
"relative_time.seconds": "{number} ثانیه",
"relative_time.today": "امروز",
"reply_indicator.cancel": "لغو",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
- "report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.block": "مسدود کردن",
+ "report.block_explanation": "شما فرستههایشان را نخواهید دید. آنها نمیتوانند فرستههایتان را ببینند یا شما را پیبگیرند. آنها میتوانند بگویند که مسدود شدهاند.",
+ "report.categories.other": "غیره",
+ "report.categories.spam": "هرزنامه",
+ "report.categories.violation": "محتوا یک یا چند قانون کارساز را نقض میکند",
+ "report.category.subtitle": "منطبقترین را انتخاب کنید",
+ "report.category.title": "به ما بگویید با این {type} چه مشکلی دارید",
+ "report.category.title_account": "نمایه",
+ "report.category.title_status": "فرسته",
+ "report.close": "انجام شد",
+ "report.comment.title": "آیا چیز دیگری هست که فکر میکنید باید بدانیم؟",
"report.forward": "فرستادن به {target}",
"report.forward_hint": "این حساب در کارساز دیگری ثبت شده. آیا میخواهید رونوشتی ناشناس از این گزارش به آنجا هم فرستاده شود؟",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "خموش",
+ "report.mute_explanation": "شما فرستههای آنها را نخواهید دید. آنها همچنان میتوانند شما را پیبگیرند و فرستههایتان را ببینند و نمیدانند که خموش شدهاند.",
+ "report.next": "بعدی",
"report.placeholder": "توضیحات اضافه",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "من آن را دوست ندارم",
+ "report.reasons.dislike_description": "این چیزی نیست که بخواهید ببینید",
+ "report.reasons.other": "بخواطر چیز دیگری است",
+ "report.reasons.other_description": "این موضوع در دستهبندیهای دیگر نمیگنجد",
+ "report.reasons.spam": "این هرزنامه است",
+ "report.reasons.spam_description": "پیوندهای مخرب، تعامل جعلی یا پاسخهای تکراری",
+ "report.reasons.violation": "قوانین کارساز را نقض میکند",
+ "report.reasons.violation_description": "شما آگاه هستید که قوانین خاصی را زیر پا میگذارد",
+ "report.rules.subtitle": "همهٔ موارد انجام شده را برگزینید",
+ "report.rules.title": "کدام قوانین نقض شدهاند؟",
+ "report.statuses.subtitle": "همهٔ موارد انجام شده را برگزینید",
+ "report.statuses.title": "آیا فرستهای وجود دارد که از این گزارش پشتیبانی کند؟",
"report.submit": "فرستادن",
"report.target": "در حال گزارش {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "در اینجا گزینههایی برای کنترل آنچه در ماستودون میبینید، وجود دارد:",
+ "report.thanks.take_action_actionable": "در حالی که ما این مورد را بررسی میکنیم، میتوانید علیه @{name} اقدام کنید:",
+ "report.thanks.title": "نمیخواهید این را ببینید؟",
+ "report.thanks.title_actionable": "ممنون بابت گزارش، ما آن را بررسی خواهیم کرد.",
+ "report.unfollow": "ناپیگیری @{name}",
+ "report.unfollow_explanation": "شما این حساب را پیگرفتهاید، برای اینکه دیگر فرستههایش را در خوراک خانهتان نبینید؛ آن را پینگیرید.",
"search.placeholder": "جستوجو",
"search_popout.search_format": "راهنمای جستوجوی پیشرفته",
"search_popout.tips.full_text": "جستوجوی متنی ساده فرستههایی که نوشته، پسندیده، تقویتکرده یا در آنها نامبرده شدهاید را به علاوهٔ نامهای کاربری، نامهای نمایشی و برچسبها برمیگرداند.",
@@ -434,39 +434,39 @@
"search_popout.tips.text": "جستوجوی متنی ساده برای نامها، نامهای کاربری، و برچسبها",
"search_popout.tips.user": "کاربر",
"search_results.accounts": "افراد",
- "search_results.all": "All",
+ "search_results.all": "همه",
"search_results.hashtags": "برچسبها",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "چیزی برای این عبارت جستوجو یافت نشد",
"search_results.statuses": "فرستهها",
- "search_results.statuses_fts_disabled": "جستوجوی محتوای فرستهها در این کارساز ماستودون فعال نشده است.",
+ "search_results.statuses_fts_disabled": "جستوجوی محتوای فرستهها در این کارساز ماستودون به کار انداخته نشده است.",
"search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
- "status.admin_account": "گشودن واسط مدیریت برای @{name}",
+ "status.admin_account": "گشودن واسط مدیریت برای @{name}",
"status.admin_status": "گشودن این فرسته در واسط مدیریت",
- "status.block": "مسدود کردن @{name}",
+ "status.block": "مسدود کردن @{name}",
"status.bookmark": "نشانک",
- "status.cancel_reblog_private": "لغو تقویت",
+ "status.cancel_reblog_private": "ناتقویت",
"status.cannot_reblog": "این فرسته قابل تقویت نیست",
- "status.copy": "رونویسی از نشانی فرسته",
+ "status.copy": "رونوشت پیوند فرسته",
"status.delete": "حذف",
"status.detailed_status": "نمایش کامل گفتگو",
- "status.direct": "پیام مستقیم به @{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
- "status.embed": "جاگذاری",
+ "status.direct": "پیام مستقیم به @{name}",
+ "status.edit": "ویرایش",
+ "status.edited": "ویرایش شده در {date}",
+ "status.edited_x_times": "{count, plural, one {{count} مرتبه} other {{count} مرتبه}} ویرایش شد",
+ "status.embed": "جاسازی",
"status.favourite": "پسندیدن",
"status.filtered": "پالوده",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "توسط {name} در {date} ایجاد شد",
+ "status.history.edited": "توسط {name} در {date} ویرایش شد",
"status.load_more": "بار کردن بیشتر",
"status.media_hidden": "رسانهٔ نهفته",
- "status.mention": "نامبردن از @{name}",
+ "status.mention": "نامبردن از @{name}",
"status.more": "بیشتر",
- "status.mute": "خموشاندن @{name}",
+ "status.mute": "خموشاندن @{name}",
"status.mute_conversation": "خموشاندن گفتوگو",
"status.open": "گسترش این فرسته",
- "status.pin": "سنجاقکردن در نمایه",
- "status.pinned": "فرستهٔ سنجاقشده",
+ "status.pin": "سنجاق کردن در نمایه",
+ "status.pinned": "فرستهٔ سنجاق شده",
"status.read_more": "بیشتر بخوانید",
"status.reblog": "تقویت",
"status.reblog_private": "تقویت برای مخاطبان نخستین",
@@ -476,7 +476,7 @@
"status.remove_bookmark": "برداشتن نشانک",
"status.reply": "پاسخ",
"status.replyAll": "پاسخ به رشته",
- "status.report": "گزارش @{name}",
+ "status.report": "گزارش @{name}",
"status.sensitive_warning": "محتوای حساس",
"status.share": "همرسانی",
"status.show_less": "نمایش کمتر",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 65d3c6ea1..13d89502b 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -229,7 +229,7 @@
"keyboard_shortcuts.blocked": "Ouvrir la liste des comptes bloqués",
"keyboard_shortcuts.boost": "Partager le message",
"keyboard_shortcuts.column": "Se placer dans une colonne",
- "keyboard_shortcuts.compose": "se placer dans la zone de rédaction",
+ "keyboard_shortcuts.compose": "Se placer dans la zone de rédaction",
"keyboard_shortcuts.description": "Description",
"keyboard_shortcuts.direct": "Ouvrir la colonne des messages directs",
"keyboard_shortcuts.down": "Descendre dans la liste",
@@ -246,7 +246,7 @@
"keyboard_shortcuts.muted": "Ouvrir la liste des comptes masqués",
"keyboard_shortcuts.my_profile": "Ouvrir votre profil",
"keyboard_shortcuts.notifications": "Ouvrir la colonne de notifications",
- "keyboard_shortcuts.open_media": "ouvrir le média",
+ "keyboard_shortcuts.open_media": "Ouvrir le média",
"keyboard_shortcuts.pinned": "Ouvrir la liste des messages épinglés",
"keyboard_shortcuts.profile": "Ouvrir le profil de l’auteur·rice",
"keyboard_shortcuts.reply": "Répondre au message",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index aae73a23e..9ca41b2f6 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -18,7 +18,7 @@
"account.followers": "Luchd-leantainn",
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} two {{counter} neach-leantainn} few {{counter} luchd-leantainn} other {{counter} luchd-leantainn}}",
- "account.following": "Following",
+ "account.following": "A’ leantainn",
"account.following_counter": "{count, plural, one {A’ leantainn air {counter}} two {A’ leantainn air {counter}} few {A’ leantainn air {counter}} other {A’ leantainn air {counter}}}",
"account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn air neach sam bith fhathast.",
"account.follows_you": "’Gad leantainn",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
"account.unblock": "Dì-bhac @{name}",
"account.unblock_domain": "Dì-bhac an àrainn {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Dì-bhac",
"account.unendorse": "Na brosnaich air a’ phròifil",
"account.unfollow": "Na lean tuilleadh",
"account.unmute": "Dì-mhùch @{name}",
"account.unmute_notifications": "Dì-mhùch na brathan o @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Dì-mhùch",
"account_note.placeholder": "Briog airson nòta a chur ris",
"admin.dashboard.daily_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir latha",
"admin.dashboard.monthly_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir mìos",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "Fidir",
"navigation_bar.domain_blocks": "Àrainnean bacte",
"navigation_bar.edit_profile": "Deasaich a’ phròifil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Rùraich",
"navigation_bar.favourites": "Na h-annsachdan",
"navigation_bar.filters": "Faclan mùchte",
"navigation_bar.follow_requests": "Iarrtasan leantainn",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index a80875c79..56fd5ca7f 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -18,7 +18,7 @@
"account.followers": "Seguidoras",
"account.followers.empty": "Aínda ninguén segue esta usuaria.",
"account.followers_counter": "{count, plural, one {{counter} Seguidora} other {{counter} Seguidoras}}",
- "account.following": "Following",
+ "account.following": "Seguindo",
"account.following_counter": "{count, plural, one {{counter} Seguindo} other {{counter} Seguindo}}",
"account.follows.empty": "Esta usuaria aínda non segue a ninguén.",
"account.follows_you": "Séguete",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicacións}}",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Amosar {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "Non amosar no perfil",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Deixar de silenciar a @{name}",
"account.unmute_notifications": "Deixar de silenciar as notificacións de @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Non silenciar",
"account_note.placeholder": "Preme para engadir nota",
"admin.dashboard.daily_retention": "Ratio de retención de usuarias após rexistrarse",
"admin.dashboard.monthly_retention": "Ratio de retención de usuarias após un mes do rexistro",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios agochados",
"navigation_bar.edit_profile": "Editar perfil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Descubrir",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
"navigation_bar.follow_requests": "Peticións de seguimento",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 4ce017b4c..ee9d58399 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -18,7 +18,7 @@
"account.followers": "フォロワー",
"account.followers.empty": "まだ誰もフォローしていません。",
"account.followers_counter": "{counter} フォロワー",
- "account.following": "Following",
+ "account.following": "フォロー中",
"account.following_counter": "{counter} フォロー",
"account.follows.empty": "まだ誰もフォローしていません。",
"account.follows_you": "フォローされています",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{counter} 投稿",
"account.unblock": "@{name}さんのブロックを解除",
"account.unblock_domain": "{domain}のブロックを解除",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "ブロック解除",
"account.unendorse": "プロフィールから外す",
"account.unfollow": "フォロー解除",
"account.unmute": "@{name}さんのミュートを解除",
"account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "ミュート解除",
"account_note.placeholder": "クリックしてメモを追加",
"admin.dashboard.daily_retention": "サインアップ後の日ごとのユーザー継続率",
"admin.dashboard.monthly_retention": "サインアップ後の月ごとのユーザー継続率",
@@ -192,7 +192,7 @@
"errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
"errors.unexpected_crash.report_issue": "問題を報告",
"explore.search_results": "検索結果",
- "explore.suggested_follows": "For you",
+ "explore.suggested_follows": "おすすめ",
"explore.title": "エクスプローラー",
"explore.trending_links": "ニュース",
"explore.trending_statuses": "投稿",
@@ -340,7 +340,7 @@
"notification.update": "{name} が投稿を編集しました",
"notifications.clear": "通知を消去",
"notifications.clear_confirmation": "本当に通知を消去しますか?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "新規登録:",
"notifications.column_settings.alert": "デスクトップ通知",
"notifications.column_settings.favourite": "お気に入り:",
"notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示",
@@ -411,7 +411,7 @@
"relative_time.today": "今日",
"reply_indicator.cancel": "キャンセル",
"report.block": "ブロック",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block_explanation": "相手の投稿が表示されなくなります。相手はあなたの投稿を見ることやフォローすることができません。相手はブロックされていることがわかります。",
"report.categories.other": "その他",
"report.categories.spam": "スパム",
"report.categories.violation": "サーバーのルールに違反",
@@ -420,11 +420,11 @@
"report.category.title_account": "プロフィール",
"report.category.title_status": "投稿",
"report.close": "完了",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.comment.title": "その他に私たちに伝えておくべき事はありますか?",
"report.forward": "{target} に転送する",
"report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?",
"report.mute": "ミュート",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.mute_explanation": "相手の投稿は表示されなくなります。相手は引き続きあなたをフォローして、あなたの投稿を表示することができますが、ミュートされていることはわかりません。",
"report.next": "次へ",
"report.placeholder": "追加コメント",
"report.reasons.dislike": "興味がありません",
@@ -442,9 +442,9 @@
"report.submit": "通報する",
"report.target": "{target}さんを通報する",
"report.thanks.take_action": "次のような方法はいかがでしょうか?",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.take_action_actionable": "私達が確認している間でも、あなたは @{name} さんに対して対応することが出来ます:",
"report.thanks.title": "見えないようにしたいですか?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.thanks.title_actionable": "ご報告ありがとうございます、追って確認します。",
"report.unfollow": "@{name}のフォローを解除",
"report.unfollow_explanation": "このアカウントをフォローしています。ホームフィードに彼らの投稿を表示しないようにするには、彼らのフォローを外してください。",
"search.placeholder": "検索",
@@ -457,7 +457,7 @@
"search_results.accounts": "人々",
"search_results.all": "すべて",
"search_results.hashtags": "ハッシュタグ",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "この検索条件では何も見つかりませんでした",
"search_results.statuses": "投稿",
"search_results.statuses_fts_disabled": "このサーバーでは投稿本文の検索は利用できません。",
"search_results.total": "{count, number}件の結果",
diff --git a/app/javascript/mastodon/locales/kmr.json b/app/javascript/mastodon/locales/kmr.json
deleted file mode 100644
index 0298c51ec..000000000
--- a/app/javascript/mastodon/locales/kmr.json
+++ /dev/null
@@ -1,543 +0,0 @@
-{
- "account.account_note_header": "Nîşe",
- "account.add_or_remove_from_list": "Tevlî bike an rake ji rêzokê",
- "account.badges.bot": "Bot",
- "account.badges.group": "Kom",
- "account.block": "@{name} asteng bike",
- "account.block_domain": "{domain} navpar asteng bike",
- "account.blocked": "Astengkirî",
- "account.browse_more_on_origin_server": "Li pelên resen bêhtir bigere",
- "account.cancel_follow_request": "Daxwaza şopandinê rake",
- "account.direct": "Peyamekê bişîne @{name}",
- "account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne",
- "account.domain_blocked": "Navper hate astengkirin",
- "account.edit_profile": "Profîl serrast bike",
- "account.enable_notifications": "Min agahdar bike gava @{name} diweşîne",
- "account.endorse": "Taybetiyên li ser profîl",
- "account.follow": "Bişopîne",
- "account.followers": "Şopîner",
- "account.followers.empty": "Kesekî hin ev bikarhêner neşopandiye.",
- "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
- "account.following": "Dişopîne",
- "account.following_counter": "{count, plural, one {{counter} Dişopîne} other {{counter} Dişopîne}}",
- "account.follows.empty": "Ev bikarhêner hin kesekî heya niha neşopandiye.",
- "account.follows_you": "Te dişopîne",
- "account.hide_reblogs": "Bilindkirinên ji @{name} veşêre",
- "account.joined": "Tevlîbû di {date} de",
- "account.link_verified_on": "Xwedaniya li vê girêdanê di {date} de hatiye kontrolkirin",
- "account.locked_info": "Rewşa vê ajimêrê wek kilît kirî hatiye saz kirin. Xwedî yê ajimêrê, kesên vê bişopîne bi dest vekolin dike.",
- "account.media": "Medya",
- "account.mention": "Qal @{name} bike",
- "account.moved_to": "{name} hate livandin bo:",
- "account.mute": "@{name} Bêdeng bike",
- "account.mute_notifications": "Agahdariyan ji @{name} bêdeng bike",
- "account.muted": "Bêdengkirî",
- "account.posts": "Şandî",
- "account.posts_with_replies": "Şandî û bersiv",
- "account.report": "@{name} Ragihîne",
- "account.requested": "Li benda erêkirinê ye. Ji bo betal kirina daxwazê pêl bikin",
- "account.share": "Profîla @{name} parve bike",
- "account.show_reblogs": "Bilindkirinên ji @{name} nîşan bike",
- "account.statuses_counter": "{count, plural,one {{counter} şandî}other {{counter} şandî}}",
- "account.unblock": "Astengê li ser @{name} rake",
- "account.unblock_domain": "Astengê li ser navperê {domain} rake",
- "account.unblock_short": "Astengiyê rake",
- "account.unendorse": "Li ser profîl nîşan neke",
- "account.unfollow": "Neşopîne",
- "account.unmute": "@{name} Bêdeng bike",
- "account.unmute_notifications": "Agahdariyan ji @{name} bêdeng bike",
- "account.unmute_short": "Bêdeng neke",
- "account_note.placeholder": "Bitikîne bo nîşeyekê tevlî bikî",
- "admin.dashboard.daily_retention": "Rêjeya ragirtina bikarhêner bi roj piştî tomarkirinê",
- "admin.dashboard.monthly_retention": "Rêjeya ragirtina bikarhêner bi meh piştî tomarkirinê",
- "admin.dashboard.retention.average": "Navîn",
- "admin.dashboard.retention.cohort": "Meha tomarkirinê",
- "admin.dashboard.retention.cohort_size": "Bikarhênerên nû",
- "alert.rate_limited.message": "Jkx dîsa biceribîne piştî {retry_time, time, medium}.\n \n",
- "alert.rate_limited.title": "Rêje sînorkirî ye",
- "alert.unexpected.message": "Çewtiyeke bêhêvî çê bû.",
- "alert.unexpected.title": "Wey li min!",
- "announcement.announcement": "Daxuyanî",
- "attachments_list.unprocessed": "(bêpêvajo)",
- "autosuggest_hashtag.per_week": "Her hefte {count}",
- "boost_modal.combo": "Ji bo derbas bî carekî din de pêlê {combo} bike",
- "bundle_column_error.body": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
- "bundle_column_error.retry": "Dîsa biceribîne",
- "bundle_column_error.title": "Çewtiya torê",
- "bundle_modal_error.close": "Bigire",
- "bundle_modal_error.message": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
- "bundle_modal_error.retry": "Dîsa bicerbîne",
- "column.blocks": "Bikarhênerên astengkirî",
- "column.bookmarks": "Şûnpel",
- "column.community": "Demnameya herêmî",
- "column.direct": "Peyamên taybet",
- "column.directory": "Li profîlan bigere",
- "column.domain_blocks": "Navperên astengkirî",
- "column.favourites": "Bijarte",
- "column.follow_requests": "Daxwazên şopandinê",
- "column.home": "Serrûpel",
- "column.lists": "Rêzok",
- "column.mutes": "Bikarhênerên bêdengkirî",
- "column.notifications": "Agahdarî",
- "column.pins": "Şandiya derzîkirî",
- "column.public": "Demnameyê federalîkirî",
- "column_back_button.label": "Veger",
- "column_header.hide_settings": "Sazkariyan veşêre",
- "column_header.moveLeft_settings": "Stûnê bilivîne bo çepê",
- "column_header.moveRight_settings": "Stûnê bilivîne bo rastê",
- "column_header.pin": "Bi derzî bike",
- "column_header.show_settings": "Sazkariyan nîşan bide",
- "column_header.unpin": "Bi derzî neke",
- "column_subheading.settings": "Sazkarî",
- "community.column_settings.local_only": "Tenê herêmî",
- "community.column_settings.media_only": "Tenê media",
- "community.column_settings.remote_only": "Tenê ji dûr ve",
- "compose_form.direct_message_warning": "Ev şandî tenê ji bikarhênerên qalkirî re wê were şandin.",
- "compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe",
- "compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.",
- "compose_form.lock_disclaimer": "Ajimêrê te {locked} nîne. Herkes dikare te bişopîne da ku şandiyên te yên tenê şopînerên te ra xûya dibin bibînin.",
- "compose_form.lock_disclaimer.lock": "girtî ye",
- "compose_form.placeholder": "Çi di hişê te derbas dibe?",
- "compose_form.poll.add_option": "Hilbijarekî tevlî bike",
- "compose_form.poll.duration": "Dema rapirsî yê",
- "compose_form.poll.option_placeholder": "{number} Hilbijêre",
- "compose_form.poll.remove_option": "Vê hilbijarê rake",
- "compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
- "compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
- "compose_form.publish": "Toot",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Guhertinan tomar bike",
- "compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medya wekî hestiyar hate nîşan} other {Medya wekî hestiyar nîşan}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medya wekî hestiyar nehatiye nîşan} other {Medya wekî hestiyar nehatiye nîşan}}",
- "compose_form.spoiler.marked": "Hişyariya naverokê rake",
- "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike",
- "compose_form.spoiler_placeholder": "Li vir hişyariya xwe binivîse",
- "confirmation_modal.cancel": "Dev jê berde",
- "confirmations.block.block_and_report": "Asteng bike & ragihîne",
- "confirmations.block.confirm": "Asteng bike",
- "confirmations.block.message": "Ma tu dixwazî ku {name} asteng bikî?",
- "confirmations.delete.confirm": "Jê bibe",
- "confirmations.delete.message": "Ma tu dixwazî vê şandiyê jê bibî?",
- "confirmations.delete_list.confirm": "Jê bibe",
- "confirmations.delete_list.message": "Ma tu dixwazî bi awayekî herdemî vê rêzokê jê bibî?",
- "confirmations.discard_edit_media.confirm": "Biavêje",
- "confirmations.discard_edit_media.message": "Guhertinên neqedandî di danasîna an pêşdîtina medyayê de hene, wan bi her awayî bavêje?",
- "confirmations.domain_block.confirm": "Hemî navperê asteng bike",
- "confirmations.domain_block.message": "Tu ji xwe bawerî, bi rastî tu dixwazî hemû {domain} asteng bikî? Di gelek rewşan de asteng kirin an jî bêdeng kirin têrê dike û tê tercîh kirin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê were jêbirin.",
- "confirmations.logout.confirm": "Derkeve",
- "confirmations.logout.message": "Ma tu dixwazî ku derkevî?",
- "confirmations.mute.confirm": "Bêdeng bike",
- "confirmations.mute.explanation": "Ev ê şandinên ji wan tê û şandinên ku behsa wan dike veşêre, lê hê jî maf dide ku ew şandinên te bibînin û te bişopînin.",
- "confirmations.mute.message": "Bi rastî tu dixwazî {name} bêdeng bikî?",
- "confirmations.redraft.confirm": "Jê bibe & ji nû ve serrast bike",
- "confirmations.redraft.message": "Bi rastî tu dixwazî şandî ye jê bibî û nûve reşnivîsek çê bikî? Bijarte û şandî wê wenda bibin û bersivên ji bo şandiyê resen wê sêwî bimînin.",
- "confirmations.reply.confirm": "Bersivê bide",
- "confirmations.reply.message": "Bersiva niha li ser peyama ku tu niha berhev dikî dê binivsîne. Ma pê bawer î ku tu dixwazî bidomînî?",
- "confirmations.unfollow.confirm": "Neşopîne",
- "confirmations.unfollow.message": "Ma tu dixwazî ku dev ji şopa {name} berdî?",
- "conversation.delete": "Axaftinê jê bibe",
- "conversation.mark_as_read": "Wekî xwendî nîşan bide",
- "conversation.open": "Axaftinê nîşan bide",
- "conversation.with": "Bi {names} re",
- "directory.federated": "Ji fediversên naskirî",
- "directory.local": "Tenê ji {domain}",
- "directory.new_arrivals": "Kesên ku nû hatine",
- "directory.recently_active": "Di demên dawî de çalak",
- "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.",
- "embed.preview": "Wa ye wê wusa xuya bike:",
- "emoji_button.activity": "Çalakî",
- "emoji_button.custom": "Kesanekirî",
- "emoji_button.flags": "Nîşankirî",
- "emoji_button.food": "Xwarin û vexwarin",
- "emoji_button.label": "Emoji têxe",
- "emoji_button.nature": "Sirûştî",
- "emoji_button.not_found": "Hestokên lihevhatî nehate dîtin",
- "emoji_button.objects": "Tişt",
- "emoji_button.people": "Mirov",
- "emoji_button.recent": "Pir caran tê bikaranîn",
- "emoji_button.search": "Bigere...",
- "emoji_button.search_results": "Encamên lêgerînê",
- "emoji_button.symbols": "Sembol",
- "emoji_button.travel": "Geşt û şûn",
- "empty_column.account_suspended": "Ajimêr hatiye rawestandin",
- "empty_column.account_timeline": "Li vir şandî tune!",
- "empty_column.account_unavailable": "Profîl nayê peydakirin",
- "empty_column.blocks": "Te tu bikarhêner asteng nekiriye.",
- "empty_column.bookmarked_statuses": "Hîn tu peyamên şûnpelkirî tuneye. Gava ku hûn yek şûnpel bikin, ew ê li vir xûya bike.",
- "empty_column.community": "Demnameya herêmî vala ye. Tiştek ji raya giştî re binivsînin da ku rûpel biherike!",
- "empty_column.direct": "Hêj peyameke te yê rasterast tuneye. Gava ku tu yekî bişeynî an jî bigirî, ew ê li vir xûya bike.",
- "empty_column.domain_blocks": "Hê jî navperên hatine asteng kirin tune ne.",
- "empty_column.explore_statuses": "Tiştek niha di rojevê de tune. Paşê vegere!",
- "empty_column.favourited_statuses": "Hîn tu peyamên te yên bijare tunene. Gava ku te yekî bijart, ew ê li vir xûya bike.",
- "empty_column.favourites": "Hîn tu kes vê peyamê nebijartiye. Gava ku hin kes bijartin, ew ê li vir xûya bikin.",
- "empty_column.follow_recommendations": "Wusa dixuye ku ji bo we tu pêşniyar nehatine çêkirin. Hûn dikarin lêgerînê bikarbînin da ku li kesên ku hûn nas dikin bigerin an hashtagên trendî bigerin.",
- "empty_column.follow_requests": "Hê jî daxwaza şopandinê tunne ye. Dema daxwazek hat, yê li vir were nîşan kirin.",
- "empty_column.hashtag": "Di vê hashtagê de hêj tiştekî tune.",
- "empty_column.home": "Demnameya mala we vala ye! Ji bona tijîkirinê bêtir mirovan bişopînin. {suggestions}",
- "empty_column.home.suggestions": "Hinek pêşniyaran bibîne",
- "empty_column.list": "Di vê rêzokê de hîn tiştek tune ye. Gava ku endamên vê rêzokê peyamên nû biweşînin, ew ê li vir xuya bibin.",
- "empty_column.lists": "Hêj qet rêzokê te tunne ye. Dema yek peyda bû, yê li vir were nîşan kirin.",
- "empty_column.mutes": "Te tu bikarhêner bêdeng nekiriye.",
- "empty_column.notifications": "Hêj hişyariyên te tunene. Dema ku mirovên din bi we re têkilî danîn, hûn ê wê li vir bibînin.",
- "empty_column.public": "Li vir tiştekî tuneye! Ji raya giştî re tiştekî binivîsîne, an ji bo tijîkirinê ji rajekerên din bikarhêneran bi destan bişopînin",
- "error.unexpected_crash.explanation": "Ji ber xeletîyeke di koda me da an jî ji ber mijara lihevhatina gerokan, ev rûpel rast nehat nîşandan.",
- "error.unexpected_crash.explanation_addons": "Ev rûpel bi awayekî rast nehat nîşandan. Ev çewtî mimkûn e ji ber lêzêdekirina gerokan an jî amûrên wergera xweberî pêk tê.",
- "error.unexpected_crash.next_steps": "Nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
- "error.unexpected_crash.next_steps_addons": "Ne çalak kirin û nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
- "errors.unexpected_crash.copy_stacktrace": "Şopa gemara (stacktrace) tûrikê ra jê bigire",
- "errors.unexpected_crash.report_issue": "Pirsgirêkekê ragihîne",
- "explore.search_results": "Encamên lêgerînê",
- "explore.suggested_follows": "Ji bo te",
- "explore.title": "Vekole",
- "explore.trending_links": "Nûçe",
- "explore.trending_statuses": "Şandî",
- "explore.trending_tags": "Hashtag",
- "follow_recommendations.done": "Qediya",
- "follow_recommendations.heading": "Mirovên ku tu dixwazî ji wan peyaman bibînî bişopîne! Hin pêşnîyar li vir in.",
- "follow_recommendations.lead": "Li gorî rêza kronolojîkî peyamên mirovên ku tu dişopînî dê demnameya te de xûya bike. Ji xeletiyan netirse, bi awayekî hêsan her wextî tu dikarî dev ji şopandinê berdî!",
- "follow_request.authorize": "Mafê bide",
- "follow_request.reject": "Nepejirîne",
- "follow_requests.unlocked_explanation": "Tevlî ku ajimêra te ne kilît kiriye, karmendên {domain} digotin qey tu dixwazî ku pêşdîtina daxwazên şopandinê bi destan bike.",
- "generic.saved": "Tomarkirî",
- "getting_started.developers": "Pêşdebir",
- "getting_started.directory": "Rêgeha profîlê",
- "getting_started.documentation": "Pelbend",
- "getting_started.heading": "Destpêkirin",
- "getting_started.invite": "Mirovan Vexwîne",
- "getting_started.open_source_notice": "Mastodon nermalava çavkaniya vekirî ye. Tu dikarî pirsgirêkan li ser GitHub-ê ragihînî di {github} de an jî dikarî tevkariyê bikî.",
- "getting_started.security": "Sazkariyên ajimêr",
- "getting_started.terms": "Mercên karûberan",
- "hashtag.column_header.tag_mode.all": "û {additional}",
- "hashtag.column_header.tag_mode.any": "an {additional}",
- "hashtag.column_header.tag_mode.none": "bêyî {additional}",
- "hashtag.column_settings.select.no_options_message": "Ti pêşniyar nehatin dîtin",
- "hashtag.column_settings.select.placeholder": "Têkeve hashtagê…",
- "hashtag.column_settings.tag_mode.all": "Van hemûyan",
- "hashtag.column_settings.tag_mode.any": "Yek ji van",
- "hashtag.column_settings.tag_mode.none": "Ne yek ji van",
- "hashtag.column_settings.tag_toggle": "Ji bo vê stûnê hin pêvekan tevlî bike",
- "home.column_settings.basic": "Bingehîn",
- "home.column_settings.show_reblogs": "Bilindkirinan nîşan bike",
- "home.column_settings.show_replies": "Bersivan nîşan bide",
- "home.hide_announcements": "Reklaman veşêre",
- "home.show_announcements": "Reklaman nîşan bide",
- "intervals.full.days": "{number, plural, one {# roj} other {# roj}}",
- "intervals.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}}\n \n",
- "intervals.full.minutes": "{number, plural, one {# xulek} other {# xulek}}",
- "keyboard_shortcuts.back": "Vegere paşê",
- "keyboard_shortcuts.blocked": "Rêzoka bikarhênerên astengkirî veke",
- "keyboard_shortcuts.boost": "Şandiyê bilind bike",
- "keyboard_shortcuts.column": "Stûna balkişandinê",
- "keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea",
- "keyboard_shortcuts.description": "Danasîn",
- "keyboard_shortcuts.direct": "Ji stûnê peyamên rasterast veke",
- "keyboard_shortcuts.down": "Di rêzokê de dakêşe jêr",
- "keyboard_shortcuts.enter": "Şandiyê veke",
- "keyboard_shortcuts.favourite": "Şandiya bijarte",
- "keyboard_shortcuts.favourites": "Rêzokên bijarte veke",
- "keyboard_shortcuts.federated": "Demnameyê federalîkirî veke",
- "keyboard_shortcuts.heading": "Kurterêyên klavyeyê",
- "keyboard_shortcuts.home": "Demnameyê veke",
- "keyboard_shortcuts.hotkey": "Bişkoka kurterê",
- "keyboard_shortcuts.legend": "Vê çîrokê nîşan bike",
- "keyboard_shortcuts.local": "Demnameya herêmî veke",
- "keyboard_shortcuts.mention": "Qala nivîskarî/ê bike",
- "keyboard_shortcuts.muted": "Rêzoka bikarhênerên bêdeng kirî veke",
- "keyboard_shortcuts.my_profile": "Profîla xwe veke",
- "keyboard_shortcuts.notifications": "Stûnê agahdariyan veke",
- "keyboard_shortcuts.open_media": "Medya veke",
- "keyboard_shortcuts.pinned": "Şandiyên derzîkirî veke",
- "keyboard_shortcuts.profile": "Profîla nivîskaran veke",
- "keyboard_shortcuts.reply": "Bersivê bide şandiyê",
- "keyboard_shortcuts.requests": "Rêzoka daxwazên şopandinê veke",
- "keyboard_shortcuts.search": "Bal bide şivika lêgerînê",
- "keyboard_shortcuts.spoilers": "Zeviya hişyariya naverokê nîşan bide/veşêre",
- "keyboard_shortcuts.start": "Stûna \"destpêkê\" veke",
- "keyboard_shortcuts.toggle_hidden": "Nivîsa paş hişyariya naverokê nîşan bide/veşêre",
- "keyboard_shortcuts.toggle_sensitivity": "Medyayê nîşan bide/veşêre",
- "keyboard_shortcuts.toot": "Dest bi şandiyeke nû bike",
- "keyboard_shortcuts.unfocus": "Bal nede cîhê nivîsê /lêgerînê",
- "keyboard_shortcuts.up": "Di rêzokê de rake jor",
- "lightbox.close": "Bigire",
- "lightbox.compress": "Qutîya wêneya nîşan dike bitepisîne",
- "lightbox.expand": "Qutîya wêneya nîşan dike fireh bike",
- "lightbox.next": "Pêş",
- "lightbox.previous": "Paş",
- "lists.account.add": "Tevlî rêzokê bike",
- "lists.account.remove": "Ji rêzokê rake",
- "lists.delete": "Rêzokê jê bibe",
- "lists.edit": "Rêzokê serrast bike",
- "lists.edit.submit": "Sernavê biguherîne",
- "lists.new.create": "Rêzokê tevlî bike",
- "lists.new.title_placeholder": "Sernavê rêzoka nû",
- "lists.replies_policy.followed": "Bikarhênereke şopandî",
- "lists.replies_policy.list": "Endamên rêzokê",
- "lists.replies_policy.none": "Ne yek",
- "lists.replies_policy.title": "Bersivan nîşan bide:",
- "lists.search": "Di navbera kesên ku te dişopînin bigere",
- "lists.subheading": "Rêzokên te",
- "load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}",
- "loading_indicator.label": "Tê barkirin...",
- "media_gallery.toggle_visible": "{number, plural, one {Wêneyê veşêre} other {Wêneyan veşêre}}",
- "missing_indicator.label": "Nehate dîtin",
- "missing_indicator.sublabel": "Ev çavkanî nehat dîtin",
- "mute_modal.duration": "Dem",
- "mute_modal.hide_notifications": "Agahdariyan ji ev bikarhêner veşêre?",
- "mute_modal.indefinite": "Nediyar",
- "navigation_bar.apps": "Sepana mobîl",
- "navigation_bar.blocks": "Bikarhênerên astengkirî",
- "navigation_bar.bookmarks": "Şûnpel",
- "navigation_bar.community_timeline": "Demnameya herêmî",
- "navigation_bar.compose": "Şandiyeke nû binivsîne",
- "navigation_bar.direct": "Peyamên rasterast",
- "navigation_bar.discover": "Vekolê",
- "navigation_bar.domain_blocks": "Navparên astengkirî",
- "navigation_bar.edit_profile": "Profîl serrast bike",
- "navigation_bar.explore": "Vekole",
- "navigation_bar.favourites": "Bijarte",
- "navigation_bar.filters": "Peyvên bêdengkirî",
- "navigation_bar.follow_requests": "Daxwazên şopandinê",
- "navigation_bar.follows_and_followers": "Şopandin û şopîner",
- "navigation_bar.info": "Derbarê vî rajekarî",
- "navigation_bar.keyboard_shortcuts": "Bişkoka kurterê",
- "navigation_bar.lists": "Rêzok",
- "navigation_bar.logout": "Derkeve",
- "navigation_bar.mutes": "Bikarhênerên bêdengkirî",
- "navigation_bar.personal": "Kesanî",
- "navigation_bar.pins": "Şandiya derzîkirî",
- "navigation_bar.preferences": "Sazkarî",
- "navigation_bar.public_timeline": "Demnameyê federalîkirî",
- "navigation_bar.security": "Ewlehî",
- "notification.admin.sign_up": "{name} tomar bû",
- "notification.favourite": "{name} şandiya te hez kir",
- "notification.follow": "{name} te şopand",
- "notification.follow_request": "{name} dixwazê te bişopîne",
- "notification.mention": "{name} qale te kir",
- "notification.own_poll": "Rapirsîya te qediya",
- "notification.poll": "Rapirsiyeke ku te deng daye qediya",
- "notification.reblog": "{name} şandiya te bilind kir",
- "notification.status": "{name} niha şand",
- "notification.update": "{name} şandiyek serrast kir",
- "notifications.clear": "Agahdariyan pak bike",
- "notifications.clear_confirmation": "Bi rastî tu dixwazî bi awayekî dawî hemû agahdariyên xwe pak bikî?",
- "notifications.column_settings.admin.sign_up": "Tomarkirinên nû:",
- "notifications.column_settings.alert": "Agahdariyên sermaseyê",
- "notifications.column_settings.favourite": "Bijarte:",
- "notifications.column_settings.filter_bar.advanced": "Hemû beşan nîşan bide",
- "notifications.column_settings.filter_bar.category": "Şivika parzûna bilêz",
- "notifications.column_settings.filter_bar.show_bar": "Darika parzûnê nîşan bide",
- "notifications.column_settings.follow": "Şopînerên nû:",
- "notifications.column_settings.follow_request": "Daxwazên şopandinê nû:",
- "notifications.column_settings.mention": "Qalkirin:",
- "notifications.column_settings.poll": "Encamên rapirsiyê:",
- "notifications.column_settings.push": "Agahdarîyên yekser",
- "notifications.column_settings.reblog": "Bilindkirî:",
- "notifications.column_settings.show": "Di nav stûnê de nîşan bike",
- "notifications.column_settings.sound": "Deng lêxe",
- "notifications.column_settings.status": "Şandiyên nû:",
- "notifications.column_settings.unread_notifications.category": "Agahdariyên nexwendî",
- "notifications.column_settings.unread_notifications.highlight": "Agahiyên nexwendî nîşan bike",
- "notifications.column_settings.update": "Serrastkirin:",
- "notifications.filter.all": "Hemû",
- "notifications.filter.boosts": "Bilindkirî",
- "notifications.filter.favourites": "Bijarte",
- "notifications.filter.follows": "Şopîner",
- "notifications.filter.mentions": "Qalkirin",
- "notifications.filter.polls": "Encamên rapirsiyê",
- "notifications.filter.statuses": "Ji kesên tu dişopînî re rojanekirin",
- "notifications.grant_permission": "Destûrê bide.",
- "notifications.group": "{count} agahdarî",
- "notifications.mark_as_read": "Hemî agahdarîya wek xwendî nîşan bike",
- "notifications.permission_denied": "Agahdarîyên sermaseyê naxebite ji ber ku berê de daxwazî ya destûr dayîna gerokê hati bû red kirin",
- "notifications.permission_denied_alert": "Agahdarîyên sermaseyê nay çalak kirin, ji ber ku destûr kirina gerokê pêşî de hati bû red kirin",
- "notifications.permission_required": "Agahdarîyên sermaseyê naxebite çunkî mafê pêwîst dike nehatiye dayîn.",
- "notifications_permission_banner.enable": "Agahdarîyên sermaseyê çalak bike",
- "notifications_permission_banner.how_to_control": "Da ku agahdariyên mastodon bistînî gava ne vekirî be. Agahdariyên sermaseyê çalak bike\n Tu dikarî agahdariyên sermaseyê bi rê ve bibî ku bi hemû cureyên çalakiyên ên ku agahdariyan rû didin ku bi riya tikandînê li ser bişkoka {icon} çalak dibe.",
- "notifications_permission_banner.title": "Tu tiştî bîr neke",
- "picture_in_picture.restore": "Vegerîne paş",
- "poll.closed": "Girtî",
- "poll.refresh": "Nû bike",
- "poll.total_people": "{count, plural, one {# kes} other {# kes}}",
- "poll.total_votes": "{count, plural, one {# deng} other {# deng}}",
- "poll.vote": "Deng bide",
- "poll.voted": "Te dengê xwe da vê bersivê",
- "poll.votes": "{votes, plural, one {# deng} other {# deng}}",
- "poll_button.add_poll": "Rapirsîyek zêde bike",
- "poll_button.remove_poll": "Rapirsî yê rake",
- "privacy.change": "Nepênîtiya şandiyan biguherîne",
- "privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin",
- "privacy.direct.short": "Taybet",
- "privacy.private.long": "Tenê bo şopîneran xuyabar e",
- "privacy.private.short": "Tenê şopîneran",
- "privacy.public.long": "Ji bo herkesî li berçav e, di demnameyên gelemperî de dê xûyakirin",
- "privacy.public.short": "Gelemperî",
- "privacy.unlisted.long": "Ji herkesî ra tê xûya, lê demnameyê gelemperî ra nay xûyakirin",
- "privacy.unlisted.short": "Nerêzok",
- "refresh": "Nû bike",
- "regeneration_indicator.label": "Tê barkirin…",
- "regeneration_indicator.sublabel": "Mala te da tê amedekirin!",
- "relative_time.days": "{number}r",
- "relative_time.full.days": "{number, plural, one {# roj} other {# roj}} berê",
- "relative_time.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} berê",
- "relative_time.full.just_now": "hema niha",
- "relative_time.full.minutes": "{number, plural, one {# xulek} other {# xulek}} berê",
- "relative_time.full.seconds": "{number, plural, one {# çirke} other {# çirke}} berê",
- "relative_time.hours": "{number}d",
- "relative_time.just_now": "niha",
- "relative_time.minutes": "{number}x",
- "relative_time.seconds": "{number}ç",
- "relative_time.today": "îro",
- "reply_indicator.cancel": "Dev jê berde",
- "report.block": "Asteng bike",
- "report.block_explanation": "Tu yê şandiyên wan nebînî. Ew ê nikaribin şandiyên te bibînin an jî te bişopînin. Ew ê bizanibin ku ew hatine astengkirin.",
- "report.categories.other": "Yên din",
- "report.categories.spam": "Nexwestî (Spam)",
- "report.categories.violation": "Naverok yek an çend rêbazên rajekar binpê dike",
- "report.category.subtitle": "Baştirîn lihevhatin hilbijêre",
- "report.category.title": "Ji me re bêje ka çi diqewime bi vê {type} re",
- "report.category.title_account": "profîl",
- "report.category.title_status": "şandî",
- "report.close": "Qediya",
- "report.comment.title": "Tiştek din heye ku tu difikirî ku divê em zanibin?",
- "report.forward": "Biçe bo {target}",
- "report.forward_hint": "Ajimêr ji rajekarek din da ne. Tu kopîyeka anonîm ya raporê bişînî li wur?",
- "report.mute": "Bêdeng bike",
- "report.mute_explanation": "Tê yê şandiyên wan nebînî. Ew hin jî dikarin te bişopînin û şandiyên te bibînin û wê nizanibin ku ew hatine bêdengkirin.",
- "report.next": "Pêş",
- "report.placeholder": "Şiroveyên zêde",
- "report.reasons.dislike": "Ez jê hez nakim",
- "report.reasons.dislike_description": "Ew ne tiştek e ku tu dixwazî bibînî",
- "report.reasons.other": "Tiştekî din e",
- "report.reasons.other_description": "Pirsgirêk di kategoriyên din de cih nagire",
- "report.reasons.spam": "Ew spam e",
- "report.reasons.spam_description": "Girêdanên xerab, tevlêbûna sexte, an jî bersivên dubarekirî",
- "report.reasons.violation": "Ew rêzikên rajekar binpê dike",
- "report.reasons.violation_description": "Tu dizanî ku ew rêzikên taybetiyê binpê dike",
- "report.rules.subtitle": "Hemûyên ku têne sepandin hibijêre",
- "report.rules.title": "Kîjan rêzik têne binpêkirin?",
- "report.statuses.subtitle": "Hemûyên ku têne sepandin hibijêre",
- "report.statuses.title": "Tu şandiyên ku vê ragihandinê piştgirî dikin hene?",
- "report.submit": "Bişîne",
- "report.target": "Ragihandin {target}",
- "report.thanks.take_action": "Li vir vebijêrkên te hene ji bo kontrolkirina tiştê ku tu li se Mastodon dibînî:",
- "report.thanks.take_action_actionable": "Dema ku em vê yekê dinirxînin, tu dikarî li dijî @{name} tedbîran bigirî:",
- "report.thanks.title": "Tu naxwazî vê bibînî?",
- "report.thanks.title_actionable": "Spas ji bo ragihandina te, em ê binirxînin.",
- "report.unfollow": "@{name} neşopîne",
- "report.unfollow_explanation": "Tê vê ajimêrê dişopînî. Ji bo ku êdî şandiyên wan di rojeva xwe de nebînî, wan neşopîne.",
- "search.placeholder": "Bigere",
- "search_popout.search_format": "Dirûva lêgerîna pêşketî",
- "search_popout.tips.full_text": "Nivîsên hêsan, şandiyên ku te nivîsandiye, bijare kiriye, bilind kiriye an jî yên behsa te kirine û her wiha navê bikarhêneran, navên xûya dike û hashtagan vedigerîne.",
- "search_popout.tips.hashtag": "hashtag",
- "search_popout.tips.status": "şandî",
- "search_popout.tips.text": "Nivîsên hêsan, navên xûya ên ku li hev hatî, bikarhêner û hashtagan vedigerîne",
- "search_popout.tips.user": "bikarhêner",
- "search_results.accounts": "Mirov",
- "search_results.all": "Hemû",
- "search_results.hashtags": "Hashtag",
- "search_results.nothing_found": "Ji bo van peyvên lêgerînê tiştek nehate dîtin",
- "search_results.statuses": "Şandî",
- "search_results.statuses_fts_disabled": "Di vê rajekara Mastodonê da lêgerîna şandîyên li gorî naveroka wan ne çalak e.",
- "search_results.total": "{count, number} {count, plural, one {encam} other {encam}}",
- "status.admin_account": "Ji bo @{name} navrûya venihêrtinê veke",
- "status.admin_status": "Vê şandîyê di navrûya venihêrtinê de veke",
- "status.block": "@{name} asteng bike",
- "status.bookmark": "Şûnpel",
- "status.cancel_reblog_private": "Bilind neke",
- "status.cannot_reblog": "Ev şandî nayê bilindkirin",
- "status.copy": "Girêdanê jê bigire bo weşankirinê",
- "status.delete": "Jê bibe",
- "status.detailed_status": "Dîtina axaftina berfireh",
- "status.direct": "Peyama rasterast @{name}",
- "status.edit": "Serrast bike",
- "status.edited": "Di {date} de hate serrastkirin",
- "status.edited_x_times": "{count, plural, one {{count} car} other {{count} car}} hate serrastkirin",
- "status.embed": "Hedimandî",
- "status.favourite": "Bijarte",
- "status.filtered": "Parzûnkirî",
- "status.history.created": "{name} {date} afirand",
- "status.history.edited": "{name} {date} serrast kir",
- "status.load_more": "Bêtir bar bike",
- "status.media_hidden": "Medya veşartî ye",
- "status.mention": "Qal @{name} bike",
- "status.more": "Bêtir",
- "status.mute": "@{name} Bêdeng bike",
- "status.mute_conversation": "Axaftinê bêdeng bike",
- "status.open": "Vê şandiyê berferh bike",
- "status.pin": "Li ser profîlê derzî bike",
- "status.pinned": "Şandiya derzîkirî",
- "status.read_more": "Bêtir bixwîne",
- "status.reblog": "Bilind bike",
- "status.reblog_private": "Bi dîtina resen bilind bike",
- "status.reblogged_by": "{name} bilind kir",
- "status.reblogs.empty": "Kesekî hin ev şandî bilind nekiriye. Gava kesek bilind bike, ew ên li vir werin xuyakirin.",
- "status.redraft": "Jê bibe & ji nû ve reşnivîs bike",
- "status.remove_bookmark": "Şûnpêlê jê rake",
- "status.reply": "Bersivê bide",
- "status.replyAll": "Mijarê bibersivîne",
- "status.report": "{name} gilî bike",
- "status.sensitive_warning": "Naveroka hestiyarî",
- "status.share": "Parve bike",
- "status.show_less": "Kêmtir nîşan bide",
- "status.show_less_all": "Ji bo hemîyan kêmtir nîşan bide",
- "status.show_more": "Hêj zehftir nîşan bide",
- "status.show_more_all": "Bêtir nîşan bide bo hemûyan",
- "status.show_thread": "Mijarê nîşan bide",
- "status.uncached_media_warning": "Tune ye",
- "status.unmute_conversation": "Axaftinê bêdeng neke",
- "status.unpin": "Şandiya derzîkirî ji profîlê rake",
- "suggestions.dismiss": "Pêşniyarê paşguh bike",
- "suggestions.header": "Dibe ku bala te bikşîne…",
- "tabs_bar.federated_timeline": "Giştî",
- "tabs_bar.home": "Serrûpel",
- "tabs_bar.local_timeline": "Herêmî",
- "tabs_bar.notifications": "Agahdarî",
- "tabs_bar.search": "Bigere",
- "time_remaining.days": "{number, plural, one {# roj} other {# roj}} maye",
- "time_remaining.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} maye",
- "time_remaining.minutes": "{number, plural, one {# xulek} other {# xulek}} maye",
- "time_remaining.moments": "Demên mayî",
- "time_remaining.seconds": "{number, plural, one {# çirke} other {# çirke}} maye",
- "timeline_hint.remote_resource_not_displayed": "{resource} Ji rajekerên din nayê dîtin.",
- "timeline_hint.resources.followers": "Şopîner",
- "timeline_hint.resources.follows": "Şopîner",
- "timeline_hint.resources.statuses": "Şandiyên kevn",
- "trends.counter_by_accounts": "{count, plural, one {{counter} kes} other {{counter} kes}} diaxivin",
- "trends.trending_now": "Rojev",
- "ui.beforeunload": "Ger ji Mastodonê veketi wê reşnivîsa te jî winda bibe.",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}H",
- "upload_area.title": "Ji bo barkirinê kaş bike û deyne",
- "upload_button.label": "Wêne, vîdeoyek an jî pelê dengî tevlî bike",
- "upload_error.limit": "Sînora barkirina pelan derbas bû.",
- "upload_error.poll": "Di rapirsîyan de mafê barkirina pelan nayê dayîn.",
- "upload_form.audio_description": "Ji bona kesên kêm dibihîsin re pênase bike",
- "upload_form.description": "Ji bona astengdarên dîtinê re vebêje",
- "upload_form.edit": "Serrast bike",
- "upload_form.thumbnail": "Wêneyê biçûk biguherîne",
- "upload_form.undo": "Jê bibe",
- "upload_form.video_description": "Ji bo kesên kerr û lalan pênase bike",
- "upload_modal.analyzing_picture": "Wêne tê analîzkirin…",
- "upload_modal.apply": "Bisepîne",
- "upload_modal.applying": "Tê sepandin…",
- "upload_modal.choose_image": "Wêneyê hilbijêre",
- "upload_modal.description_placeholder": "Rovîyek qehweyî û bilez li ser kûçikê tîral banz dide",
- "upload_modal.detect_text": "Ji nivîsa wêneyê re serwext be",
- "upload_modal.edit_media": "Medyayê sererast bike",
- "upload_modal.hint": "Ji bo hilbijartina xala navendê her tim dîmenê piçûk de pêşdîtina çerxê bitikîne an jî kaş bike.",
- "upload_modal.preparing_ocr": "OCR dihê amadekirin…",
- "upload_modal.preview_label": "Pêşdîtin ({ratio})",
- "upload_progress.label": "Tê barkirin...",
- "video.close": "Vîdyoyê bigire",
- "video.download": "Pelê daxe",
- "video.exit_fullscreen": "Ji dîmendera tijî derkeve",
- "video.expand": "Vîdyoyê berferh bike",
- "video.fullscreen": "Dimendera tijî",
- "video.hide": "Vîdyo veşêre",
- "video.mute": "Dengê qut bike",
- "video.pause": "Rawestîne",
- "video.play": "Vêxe",
- "video.unmute": "Dengê qut neke"
-}
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 31db6acc3..454b3977a 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -121,7 +121,7 @@
"confirmations.delete.message": "정말로 이 게시물을 삭제하시겠습니까?",
"confirmations.delete_list.confirm": "삭제",
"confirmations.delete_list.message": "정말로 이 리스트를 영구적으로 삭제하시겠습니까?",
- "confirmations.discard_edit_media.confirm": "취소",
+ "confirmations.discard_edit_media.confirm": "저장 안함",
"confirmations.discard_edit_media.message": "미디어 설명이나 미리보기에 대한 저장하지 않은 변경사항이 있습니다. 버리시겠습니까?",
"confirmations.domain_block.confirm": "도메인 전체를 차단",
"confirmations.domain_block.message": "정말로 {domain} 전체를 차단하시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 컨텐츠를 보지 못합니다. 해당 도메인에 속한 팔로워와의 관계가 사라집니다.",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "발견하기",
"navigation_bar.domain_blocks": "차단한 도메인",
"navigation_bar.edit_profile": "프로필 편집",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "탐색하기",
"navigation_bar.favourites": "즐겨찾기",
"navigation_bar.filters": "뮤트한 단어",
"navigation_bar.follow_requests": "팔로우 요청",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 7209633ad..2bf8fc520 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -1,543 +1,543 @@
{
- "account.account_note_header": "تێبینی ",
- "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
- "account.badges.bot": "بوت",
- "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": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
- "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.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
- "account.follows_you": "شوێنکەوتووەکانت",
- "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
- "account.joined": "Joined {date}",
- "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
- "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
- "account.media": "میدیا",
- "account.mention": "ئاماژە @{name}",
- "account.moved_to": "{name} گواسترایەوە بۆ:",
- "account.mute": "بێدەنگکردن @{name}",
- "account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
- "account.muted": "بێ دەنگ",
- "account.posts": "توتس",
- "account.posts_with_replies": "توتس و وەڵامەکان",
- "account.report": "گوزارشت @{name}",
- "account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
- "account.share": "پرۆفایلی @{name} هاوبەش بکە",
- "account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.unblock": "@{name} لاببە",
- "account.unblock_domain": "کردنەوەی دۆمەینی {domain}",
- "account.unblock_short": "Unblock",
- "account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە",
- "account.unfollow": "بەدوادانەچو",
- "account.unmute": "بێدەنگکردنی @{name}",
- "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
- "account.unmute_short": "Unmute",
- "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.",
- "alert.rate_limited.title": "ڕێژەی سنووردار",
- "alert.unexpected.message": "هەڵەیەکی چاوەڕوان نەکراو ڕوویدا.",
- "alert.unexpected.title": "تەححح!",
- "announcement.announcement": "بانگەواز",
- "attachments_list.unprocessed": "(unprocessed)",
- "autosuggest_hashtag.per_week": "{count} هەرهەفتە",
- "boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
- "bundle_column_error.body": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
- "bundle_column_error.retry": "دووبارە هەوڵبدە",
- "bundle_column_error.title": "هەڵيی تۆڕ",
- "bundle_modal_error.close": "داخستن",
- "bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
- "bundle_modal_error.retry": "دووبارە تاقی بکەوە",
- "column.blocks": "بەکارهێنەرە بلۆککراوەکان",
- "column.bookmarks": "نیشانەکان",
- "column.community": "هێڵی کاتی ناوخۆیی",
- "column.direct": "نامە ڕاستەوخۆکان",
- "column.directory": "گەڕان لە پرۆفایلەکان",
- "column.domain_blocks": "دۆمەینە داخراوەکان",
- "column.favourites": "دڵخوازترینەکان",
- "column.follow_requests": "بەدواداچوی داواکاریەکان بکە",
- "column.home": "سەرەتا",
- "column.lists": "پێرست",
- "column.mutes": "بێدەنگکردنی بەکارهێنەران",
- "column.notifications": "ئاگادارییەکان",
- "column.pins": "تووتسی چەسپاو",
- "column.public": "نووسراوەکانی هەمووشوێنێک",
- "column_back_button.label": "دواوە",
- "column_header.hide_settings": "شاردنەوەی ڕێکخستنەکان",
- "column_header.moveLeft_settings": "ستوون بگوێزەرەوە بۆ لای چەپ",
- "column_header.moveRight_settings": "جوولاندنی ئەستوون بۆ لای ڕاست",
- "column_header.pin": "سنجاق",
- "column_header.show_settings": "نیشاندانی رێکخستنەکان",
- "column_header.unpin": "سنجاق نەکردن",
- "column_subheading.settings": "رێکخستنەکان",
- "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.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.publish": "توت",
+ "account.account_note_header": "Nîşe",
+ "account.add_or_remove_from_list": "Tevlî bike an rake ji rêzokê",
+ "account.badges.bot": "Bot",
+ "account.badges.group": "Kom",
+ "account.block": "@{name} asteng bike",
+ "account.block_domain": "{domain} navpar asteng bike",
+ "account.blocked": "Astengkirî",
+ "account.browse_more_on_origin_server": "Li pelên resen bêhtir bigere",
+ "account.cancel_follow_request": "Daxwaza şopandinê rake",
+ "account.direct": "Peyamekê bişîne @{name}",
+ "account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne",
+ "account.domain_blocked": "Navper hate astengkirin",
+ "account.edit_profile": "Profîl serrast bike",
+ "account.enable_notifications": "Min agahdar bike gava @{name} diweşîne",
+ "account.endorse": "Taybetiyên li ser profîl",
+ "account.follow": "Bişopîne",
+ "account.followers": "Şopîner",
+ "account.followers.empty": "Kesekî hin ev bikarhêner neşopandiye.",
+ "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Dişopîne",
+ "account.following_counter": "{count, plural, one {{counter} Dişopîne} other {{counter} Dişopîne}}",
+ "account.follows.empty": "Ev bikarhêner hin kesekî heya niha neşopandiye.",
+ "account.follows_you": "Te dişopîne",
+ "account.hide_reblogs": "Bilindkirinên ji @{name} veşêre",
+ "account.joined": "Tevlîbû di {date} de",
+ "account.link_verified_on": "Xwedaniya li vê girêdanê di {date} de hatiye kontrolkirin",
+ "account.locked_info": "Rewşa vê ajimêrê wek kilît kirî hatiye saz kirin. Xwedî yê ajimêrê, kesên vê bişopîne bi dest vekolin dike.",
+ "account.media": "Medya",
+ "account.mention": "Qal @{name} bike",
+ "account.moved_to": "{name} hate livandin bo:",
+ "account.mute": "@{name} Bêdeng bike",
+ "account.mute_notifications": "Agahdariyan ji @{name} bêdeng bike",
+ "account.muted": "Bêdengkirî",
+ "account.posts": "Şandî",
+ "account.posts_with_replies": "Şandî û bersiv",
+ "account.report": "@{name} Ragihîne",
+ "account.requested": "Li benda erêkirinê ye. Ji bo betal kirina daxwazê pêl bikin",
+ "account.share": "Profîla @{name} parve bike",
+ "account.show_reblogs": "Bilindkirinên ji @{name} nîşan bike",
+ "account.statuses_counter": "{count, plural,one {{counter} şandî}other {{counter} şandî}}",
+ "account.unblock": "Astengê li ser @{name} rake",
+ "account.unblock_domain": "Astengê li ser navperê {domain} rake",
+ "account.unblock_short": "Astengiyê rake",
+ "account.unendorse": "Li ser profîl nîşan neke",
+ "account.unfollow": "Neşopîne",
+ "account.unmute": "@{name} Bêdeng bike",
+ "account.unmute_notifications": "Agahdariyan ji @{name} bêdeng bike",
+ "account.unmute_short": "Bêdeng neke",
+ "account_note.placeholder": "Bitikîne bo nîşeyekê tevlî bikî",
+ "admin.dashboard.daily_retention": "Rêjeya ragirtina bikarhêner bi roj piştî tomarkirinê",
+ "admin.dashboard.monthly_retention": "Rêjeya ragirtina bikarhêner bi meh piştî tomarkirinê",
+ "admin.dashboard.retention.average": "Navîn",
+ "admin.dashboard.retention.cohort": "Meha tomarkirinê",
+ "admin.dashboard.retention.cohort_size": "Bikarhênerên nû",
+ "alert.rate_limited.message": "Jkx dîsa biceribîne piştî {retry_time, time, medium}.\n \n",
+ "alert.rate_limited.title": "Rêje sînorkirî ye",
+ "alert.unexpected.message": "Çewtiyeke bêhêvî çê bû.",
+ "alert.unexpected.title": "Wey li min!",
+ "announcement.announcement": "Daxuyanî",
+ "attachments_list.unprocessed": "(bêpêvajo)",
+ "autosuggest_hashtag.per_week": "Her hefte {count}",
+ "boost_modal.combo": "Ji bo derbas bî carekî din de pêlê {combo} bike",
+ "bundle_column_error.body": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
+ "bundle_column_error.retry": "Dîsa biceribîne",
+ "bundle_column_error.title": "Çewtiya torê",
+ "bundle_modal_error.close": "Bigire",
+ "bundle_modal_error.message": "Di dema barkirina vê hêmanê de tiştek çewt çê bû.",
+ "bundle_modal_error.retry": "Dîsa bicerbîne",
+ "column.blocks": "Bikarhênerên astengkirî",
+ "column.bookmarks": "Şûnpel",
+ "column.community": "Demnameya herêmî",
+ "column.direct": "Peyamên taybet",
+ "column.directory": "Li profîlan bigere",
+ "column.domain_blocks": "Navperên astengkirî",
+ "column.favourites": "Bijarte",
+ "column.follow_requests": "Daxwazên şopandinê",
+ "column.home": "Serrûpel",
+ "column.lists": "Rêzok",
+ "column.mutes": "Bikarhênerên bêdengkirî",
+ "column.notifications": "Agahdarî",
+ "column.pins": "Şandiya derzîkirî",
+ "column.public": "Demnameyê federalîkirî",
+ "column_back_button.label": "Veger",
+ "column_header.hide_settings": "Sazkariyan veşêre",
+ "column_header.moveLeft_settings": "Stûnê bilivîne bo çepê",
+ "column_header.moveRight_settings": "Stûnê bilivîne bo rastê",
+ "column_header.pin": "Bi derzî bike",
+ "column_header.show_settings": "Sazkariyan nîşan bide",
+ "column_header.unpin": "Bi derzî neke",
+ "column_subheading.settings": "Sazkarî",
+ "community.column_settings.local_only": "Tenê herêmî",
+ "community.column_settings.media_only": "Tenê media",
+ "community.column_settings.remote_only": "Tenê ji dûr ve",
+ "compose_form.direct_message_warning": "Ev şandî tenê ji bikarhênerên qalkirî re wê were şandin.",
+ "compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe",
+ "compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.",
+ "compose_form.lock_disclaimer": "Ajimêrê te {locked} nîne. Herkes dikare te bişopîne da ku şandiyên te yên tenê şopînerên te ra xûya dibin bibînin.",
+ "compose_form.lock_disclaimer.lock": "girtî ye",
+ "compose_form.placeholder": "Çi di hişê te derbas dibe?",
+ "compose_form.poll.add_option": "Hilbijarekî tevlî bike",
+ "compose_form.poll.duration": "Dema rapirsî yê",
+ "compose_form.poll.option_placeholder": "{number} Hilbijêre",
+ "compose_form.poll.remove_option": "Vê hilbijarê rake",
+ "compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
+ "compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
+ "compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
- "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
- "compose_form.sensitive.marked": "وادەی کۆتایی",
- "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.delete.confirm": "سڕینەوە",
- "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
- "confirmations.delete_list.confirm": "سڕینەوە",
- "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
- "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
- "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
- "confirmations.logout.confirm": "چوونە دەرەوە",
- "confirmations.logout.message": "ئایا دڵنیایت لەوەی دەتەوێت بچیتە دەرەوە?",
- "confirmations.mute.confirm": "بێدەنگ",
- "confirmations.mute.explanation": "ئەمەش دەبێتە هۆی شاردنەوەی پۆستەکان یان ئەو بابەتانەی کە ئاماژەیان پێ دەکات ، بەڵام هێشتا ڕێگەیان پێ دەدات کە پۆستەکانتان ببینن و شوێنتان بکەون.",
- "confirmations.mute.message": "ئایا دڵنیایت لەوەی دەتەوێت بیلێیت {name}?",
- "confirmations.redraft.confirm": "سڕینەوە & دووبارە ڕەشکردنەوە",
- "confirmations.redraft.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە و دووبارە دایبنووسیتەوە؟ دڵخوازەکان و بەرزکردنەوەکان وون دەبن، و وەڵامەکان بۆ پۆستە ڕەسەنەکە هەتیو دەبن.",
- "confirmations.reply.confirm": "وەڵام",
- "confirmations.reply.message": "وەڵامدانەوە ئێستا ئەو نامەیە ی کە تۆ ئێستا دایڕشتووە، دەنووسێتەوە. ئایا دڵنیایت کە دەتەوێت بەردەوام بیت?",
- "confirmations.unfollow.confirm": "بەدوادانەچو",
- "confirmations.unfollow.message": "ئایا دڵنیایت لەوەی دەتەوێت پەیڕەوی {name}?",
- "conversation.delete": "سڕینەوەی گفتوگۆ",
- "conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
- "conversation.open": "نیشاندان گفتوگۆ",
- "conversation.with": "لەگەڵ{names}",
- "directory.federated": "لە ڕاژەکانی ناسراو",
- "directory.local": "تەنها لە {domain}",
- "directory.new_arrivals": "تازە گەیشتنەکان",
- "directory.recently_active": "بەم دواییانە چالاکە",
- "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
- "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
- "emoji_button.activity": "چالاکی",
- "emoji_button.custom": "ئاسایی",
- "emoji_button.flags": "ئاڵاکان",
- "emoji_button.food": "خواردن& خواردنەوە",
- "emoji_button.label": "ئیمۆجی بکەنێو",
- "emoji_button.nature": "سروشت",
- "emoji_button.not_found": "بێ ئیمۆجی! (╯°□°)╯( ┻━┻",
- "emoji_button.objects": "ئامانجەکان",
- "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_timeline": "لێرە هیچ توتەک نییە!",
- "empty_column.account_unavailable": "پرۆفایل بەردەست نیە",
- "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
- "empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
- "empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
- "empty_column.direct": "تۆ هیچ نامەی ڕاستەوخۆت نیە تا ئێستا. کاتێک دانەیەک دەنێریت یان وەرت دەگرێت، لێرە پیشان دەدات.",
- "empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
- "empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
- "empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.",
- "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.",
- "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.",
- "empty_column.home.suggestions": "See some suggestions",
- "empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.",
- "empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.",
- "empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.",
- "empty_column.notifications": "تۆ هێشتا هیچ ئاگانامێکت نیە. چالاکی لەگەڵ کەسانی دیکە بکە بۆ دەستپێکردنی گفتوگۆکە.",
- "empty_column.public": "لێرە هیچ نییە! شتێک بە ئاشکرا بنووسە(بەگشتی)، یان بە دەستی شوێن بەکارهێنەران بکەوە لە ڕاژەکانی ترەوە بۆ پڕکردنەوەی",
- "error.unexpected_crash.explanation": "بەهۆی بوونی کێشە لە کۆدەکەمان یان کێشەی گونجانی وێبگەڕەکە، ئەم لاپەڕەیە بە دروستی پیشان نادرێت.",
- "error.unexpected_crash.explanation_addons": "ئەم لاپەڕەیە ناتوانرێت بە دروستی پیشان بدرێت. ئەم هەڵەیە لەوانەیە بەهۆی ئامێری وەرگێڕانی خۆکار یان زیادکراوی وێبگەڕەوە بێت.",
- "error.unexpected_crash.next_steps": "هەوڵدە لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکەیان کاربەرنامەی ڕەسەن.",
- "error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.",
- "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
- "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
- "follow_recommendations.done": "Done",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
- "follow_request.authorize": "دهسهڵاتپێدراو",
- "follow_request.reject": "ڕەتکردنەوە",
- "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": "ماستۆدۆن نەرمەکالایەکی سەرچاوەی کراوەیە. دەتوانیت بەشداری بکەیت یان گوزارشت بکەیت لەسەر کێشەکانی لە پەڕەی گیتهاب {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_settings.select.no_options_message": "هیچ پێشنیارێک نەدۆزرایەوە",
- "hashtag.column_settings.select.placeholder": "هاشتاگی تێبنووسە…",
- "hashtag.column_settings.tag_mode.all": "هەموو ئەمانە",
- "hashtag.column_settings.tag_mode.any": "هەر کام لەمانە",
- "hashtag.column_settings.tag_mode.none": "هیچ کام لەمانە",
- "hashtag.column_settings.tag_toggle": "تاگی زیادە ی ئەم ستوونە لەخۆ بنووسە",
- "home.column_settings.basic": "بنەڕەتی",
- "home.column_settings.show_reblogs": "پیشاندانی بەهێزکردن",
- "home.column_settings.show_replies": "وەڵامدانەوەکان پیشان بدە",
- "home.hide_announcements": "شاردنەوەی راگەیەنراوەکان",
- "home.show_announcements": "پیشاندانی راگەیەنراوەکان",
- "intervals.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژەک}}",
- "intervals.full.hours": "{number, plural, one {# کات} other {# کات}}",
- "intervals.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}}",
- "keyboard_shortcuts.back": "بۆ گەڕانەوە",
- "keyboard_shortcuts.blocked": "بۆ کردنەوەی لیستی بەکارهێنەرە بلۆککراوەکان",
- "keyboard_shortcuts.boost": "بۆ بەهێزکردن",
- "keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان",
- "keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق",
- "keyboard_shortcuts.description": "وهسف",
- "keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی نامە ڕاستەوخۆکان",
- "keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا",
- "keyboard_shortcuts.enter": "بۆ کردنەوەی توت",
- "keyboard_shortcuts.favourite": "بۆ دڵخواز",
- "keyboard_shortcuts.favourites": "بۆ کردنەوەی لیستی دڵخوازەکان",
- "keyboard_shortcuts.federated": "بۆ کردنەوەی نووسراوەکانی هەمووشوێن",
- "keyboard_shortcuts.heading": "قهدبڕەکانی تەختەکلیل",
- "keyboard_shortcuts.home": "بۆ کردنەوەی هێڵی کاتی ماڵەوە",
- "keyboard_shortcuts.hotkey": "هۆتکەی",
- "keyboard_shortcuts.legend": "بۆ نیشاندانی ئەم نیشانە",
- "keyboard_shortcuts.local": "بۆ کردنەوەی نووسراوەکانی خۆماڵی",
- "keyboard_shortcuts.mention": "نۆ ناوبردن لە نووسەر",
- "keyboard_shortcuts.muted": "بۆ کردنەوەی پێرستی بەکارهێنەرانی بێدەنگ",
- "keyboard_shortcuts.my_profile": "بۆ کردنەوەی پرۆفایڵ",
- "keyboard_shortcuts.notifications": "بۆ کردنەوەی ستوونی ئاگانامەکان",
- "keyboard_shortcuts.open_media": "بۆ کردنەوەی میدیا",
- "keyboard_shortcuts.pinned": "بۆ کردنەوەی لیستی توتەکانی چەسپێنراو",
- "keyboard_shortcuts.profile": "بۆ کردنەوەی پرۆفایڵی نووسەر",
- "keyboard_shortcuts.reply": "بۆ وەڵامدانەوە",
- "keyboard_shortcuts.requests": "بۆ کردنەوەی لیستی داواکاریەکانی بەدوادا",
- "keyboard_shortcuts.search": "بۆ جەختکردن لەسەر گەڕان",
- "keyboard_shortcuts.spoilers": "بۆ پیشاندان/شاردنەوەی خانەی CW",
- "keyboard_shortcuts.start": "بۆ کردنەوەی ستوونی \"دەست پێبکە\"",
- "keyboard_shortcuts.toggle_hidden": "بۆ پیشاندان/شاردنەوەی دەق لە پشت CW",
- "keyboard_shortcuts.toggle_sensitivity": "بۆ پیشاندان/شاردنەوەی میدیا",
- "keyboard_shortcuts.toot": "بۆ دەست کردن بە براندێکی تازە",
- "keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان",
- "keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت",
- "lightbox.close": "دابخە",
- "lightbox.compress": "سندوقی نیشاندانی وێنە بپەستێنە",
- "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
- "lightbox.next": "داهاتوو",
- "lightbox.previous": "پێشوو",
- "lists.account.add": "زیادکردن بۆ لیست",
- "lists.account.remove": "لابردن لە لیست",
- "lists.delete": "سڕینەوەی لیست",
- "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": "پیشاندانی وەڵامەکان بۆ:",
- "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
- "lists.subheading": "لیستەکانت",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
- "loading_indicator.label": "بارکردن...",
- "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
- "missing_indicator.label": "نەدۆزرایەوە",
- "missing_indicator.sublabel": "ئەو سەرچاوەیە نادۆزرێتەوە",
- "mute_modal.duration": "ماوە",
- "mute_modal.hide_notifications": "شاردنەوەی ئاگانامەکان لەم بەکارهێنەرە؟ ",
- "mute_modal.indefinite": "نادیار",
- "navigation_bar.apps": "بەرنامەی مۆبایل",
- "navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان",
- "navigation_bar.bookmarks": "نیشانکراوەکان",
- "navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
- "navigation_bar.compose": "نووسینی توتی نوێ",
- "navigation_bar.direct": "نامە ڕاستەوخۆکان",
- "navigation_bar.discover": "دۆزینەوە",
- "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
- "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
- "navigation_bar.explore": "Explore",
- "navigation_bar.favourites": "دڵخوازەکان",
- "navigation_bar.filters": "وشە کپەکان",
- "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
- "navigation_bar.follows_and_followers": "شوێنکەوتوو و شوێنکەوتوان",
- "navigation_bar.info": "دەربارەی ئەم ڕاژە",
- "navigation_bar.keyboard_shortcuts": "هۆتکەی",
- "navigation_bar.lists": "لیستەکان",
- "navigation_bar.logout": "دەرچوون",
- "navigation_bar.mutes": "کپکردنی بەکارهێنەران",
- "navigation_bar.personal": "کەسی",
- "navigation_bar.pins": "توتی چەسپاو",
- "navigation_bar.preferences": "پەسەندەکان",
- "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
- "navigation_bar.security": "ئاسایش",
- "notification.admin.sign_up": "{name} signed up",
- "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
- "notification.follow": "{name} دوای تۆ کەوت",
- "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت",
- "notification.mention": "{name} باسی ئێوەی کرد",
- "notification.own_poll": "ڕاپرسیەکەت کۆتایی هات",
- "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
- "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
- "notification.status": "{name} تازە بڵاوکرایەوە",
- "notification.update": "{name} edited a post",
- "notifications.clear": "ئاگانامەکان بسڕیەوە",
- "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
- "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
- "notifications.column_settings.favourite": "دڵخوازترین:",
- "notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە",
- "notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا",
- "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
- "notifications.column_settings.follow": "شوێنکەوتوانی نوێ:",
- "notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:",
- "notifications.column_settings.mention": "ئاماژەکان:",
- "notifications.column_settings.poll": "ئەنجامەکانی ڕاپرسی:",
- "notifications.column_settings.push": "ئاگانامەکان پاڵ بنێ",
- "notifications.column_settings.reblog": "دووبارەتوتەکان:",
- "notifications.column_settings.show": "لە ستووندا پیشان بدە",
- "notifications.column_settings.sound": "لێدانی دەنگ",
- "notifications.column_settings.status": "توتەکانی نوێ:",
- "notifications.column_settings.unread_notifications.category": "Unread notifications",
- "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
- "notifications.filter.all": "هەموو",
- "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_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": "هەرگیز شتێک لە دەست مەدە",
- "picture_in_picture.restore": "بیگەڕێنەوە",
- "poll.closed": "دابخە",
- "poll.refresh": "نوێکردنەوە",
- "poll.total_people": "{count, plural, one {# خەڵک} other {# خەڵک}}",
- "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
- "poll.vote": "دەنگ",
- "poll.voted": "تۆ دەنگت بەو وەڵامە دا",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
- "poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
- "poll_button.remove_poll": "دهنگدان بسڕهوه",
- "privacy.change": "ڕێکخستنی تایبەتمەندی توت",
- "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
- "privacy.direct.short": "ڕاستەوخۆ",
- "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
- "privacy.private.short": "تەنها بۆ شوێنکەوتوان",
- "privacy.public.long": "بۆ هەمووان دیاربێت، لە هێڵی کاتی گشتی دا نیشان دەدرێت",
- "privacy.public.short": "گشتی",
- "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە هێڵی کاتی گشتیدا نا",
- "privacy.unlisted.short": "لە لیست نەکراو",
- "refresh": "نوێکردنەوە",
- "regeneration_indicator.label": "بارکردن…",
- "regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
- "relative_time.days": "{number}ڕۆژ",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
- "relative_time.hours": "{number}کات",
- "relative_time.just_now": "ئێستا",
- "relative_time.minutes": "{number}کات",
- "relative_time.seconds": "{number}کات",
- "relative_time.today": "ئیمڕۆ",
- "reply_indicator.cancel": "هەڵوەشاندنەوه",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
- "report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
- "report.forward": "ناردن بۆ {target}",
- "report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
- "report.placeholder": "سەرنجەکانی زیاتر",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
- "report.submit": "ناردن",
- "report.target": "گوزارشتکردنی{target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
- "search.placeholder": "گەڕان",
- "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
- "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.",
- "search_popout.tips.hashtag": "هەشتاگ",
- "search_popout.tips.status": "توت",
- "search_popout.tips.text": "دەقی سادە هەڵدەسێ بە گەڕاندنەوەی هاوتایی ناوی پیشاندان، ناوی بەکارهێنەر و هاشتاگەکان",
- "search_popout.tips.user": "بەکارهێنەر",
- "search_results.accounts": "خەڵک",
- "search_results.all": "All",
- "search_results.hashtags": "هەشتاگ",
- "search_results.nothing_found": "Could not find anything for these search terms",
- "search_results.statuses": "توتەکان",
- "search_results.statuses_fts_disabled": "گەڕانی توتەکان بە ناوەڕۆکیان لەسەر ئەم ڕاژەی ماستۆدۆن چالاک نەکراوە.",
- "search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
- "status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
- "status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
- "status.block": "بلۆکی @{name}",
- "status.bookmark": "نیشانه",
- "status.cancel_reblog_private": "بێبەهێزکردن",
- "status.cannot_reblog": "ئەم بابەتە ناتوانرێت بەرزبکرێتەوە",
- "status.copy": "ڕوونووسی بەستەر بۆ توت",
- "status.delete": "سڕینەوە",
- "status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
- "status.direct": "پەیامی ڕاستەوخۆ @{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
- "status.embed": "نیشتەجێ بکە",
- "status.favourite": "دڵخواز",
- "status.filtered": "پاڵاوتن",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
- "status.load_more": "بارکردنی زیاتر",
- "status.media_hidden": "میدیای شاراوە",
- "status.mention": "ناوبنێ @{name}",
- "status.more": "زیاتر",
- "status.mute": "بێدەنگکردن @{name}",
- "status.mute_conversation": "گفتوگۆی بێدەنگ",
- "status.open": "ئەم توتە فراوان بکە",
- "status.pin": "لکاندن لەسەر پرۆفایل",
- "status.pinned": "توتی چەسپکراو",
- "status.read_more": "زیاتر بخوێنەوە",
- "status.reblog": "بەهێزکردن",
- "status.reblog_private": "بەهێزکردن بۆ بینەرانی سەرەتایی",
- "status.reblogged_by": "{name} توتی کردەوە",
- "status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
- "status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
- "status.remove_bookmark": "لابردنی نیشانه",
- "status.reply": "وەڵام",
- "status.replyAll": "بە نووسراوە وەڵام بدەوە",
- "status.report": "گوزارشت @{name}",
- "status.sensitive_warning": "ناوەڕۆکی هەستیار",
- "status.share": "هاوبەش کردن",
- "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.unpin": "لابردن لە پرۆفایل",
- "suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
- "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.moments": "ئەو ساتانەی ماونەتەوە",
- "time_remaining.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
- "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": "گۆگران",
- "ui.beforeunload": "ڕەشنووسەکەت لە دەست دەچێت ئەگەر لە ماستۆدۆن بڕۆیت.",
- "units.short.billion": "{count}ملیار",
- "units.short.million": "{count}ملیۆن",
- "units.short.thousand": "{count}هەزار",
- "upload_area.title": "ڕاکێشان & دانان بۆ بارکردن",
- "upload_button.label": "زیادکردنی وێنەکان، ڤیدیۆیەک یان فایلێکی دەنگی",
- "upload_error.limit": "سنووری بارکردنی فایل تێپەڕیوە.",
- "upload_error.poll": "پەڕگەکە ڕێی پێنەدراوە بە ڕاپرسی باربکرێت.",
- "upload_form.audio_description": "بۆ ئەو کەسانەی کە گوێ بیستیان هەیە وەسف دەکات",
- "upload_form.description": "وەسف بکە بۆ کەمبینایان",
- "upload_form.edit": "دەستکاری",
- "upload_form.thumbnail": "گۆڕانی وینۆچکە",
- "upload_form.undo": "سڕینەوە",
- "upload_form.video_description": "بۆ کەم بینایان و کەم بیستان وەسفی بکە",
- "upload_modal.analyzing_picture": "شیکردنەوەی وێنە…",
- "upload_modal.apply": "جێبەجێ کردن",
- "upload_modal.applying": "Applying…",
- "upload_modal.choose_image": "وێنە هەڵبژێرە",
- "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
- "upload_modal.detect_text": "دەقی وێنەکە بدۆزیەوە",
- "upload_modal.edit_media": "دەستکاریکردنی میدیا",
- "upload_modal.hint": "گەر وێنە چکۆلە یان بڕاوەبێت، خاڵی ناوەندی دیار دەکەوێت. خاڵی ناوەندی وێنە بە کرتە یان جێبەجیکردنی رێکبخەن.",
- "upload_modal.preparing_ocr": "ئامادەکردنی OCR…",
- "upload_modal.preview_label": "پێشبینی ({ratio})",
- "upload_progress.label": "بارکردن...",
- "video.close": "داخستنی ڤیدیۆ",
- "video.download": "داگرتنی فایل",
- "video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
- "video.expand": "ڤیدیۆفراوان بکە",
- "video.fullscreen": "پڕپیشانگەر",
- "video.hide": "شاردنەوەی ڤیدیۆ",
- "video.mute": "دەنگی کپ",
- "video.pause": "وەستان",
- "video.play": "پەخشکردن",
- "video.unmute": "دەنگ لابدە"
+ "compose_form.save_changes": "Guhertinan tomar bike",
+ "compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Medya wekî hestiyar hate nîşan} other {Medya wekî hestiyar nîşan}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Medya wekî hestiyar nehatiye nîşan} other {Medya wekî hestiyar nehatiye nîşan}}",
+ "compose_form.spoiler.marked": "Hişyariya naverokê rake",
+ "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike",
+ "compose_form.spoiler_placeholder": "Li vir hişyariya xwe binivîse",
+ "confirmation_modal.cancel": "Dev jê berde",
+ "confirmations.block.block_and_report": "Asteng bike & ragihîne",
+ "confirmations.block.confirm": "Asteng bike",
+ "confirmations.block.message": "Ma tu dixwazî ku {name} asteng bikî?",
+ "confirmations.delete.confirm": "Jê bibe",
+ "confirmations.delete.message": "Ma tu dixwazî vê şandiyê jê bibî?",
+ "confirmations.delete_list.confirm": "Jê bibe",
+ "confirmations.delete_list.message": "Ma tu dixwazî bi awayekî herdemî vê rêzokê jê bibî?",
+ "confirmations.discard_edit_media.confirm": "Biavêje",
+ "confirmations.discard_edit_media.message": "Guhertinên neqedandî di danasîna an pêşdîtina medyayê de hene, wan bi her awayî bavêje?",
+ "confirmations.domain_block.confirm": "Hemî navperê asteng bike",
+ "confirmations.domain_block.message": "Tu ji xwe bawerî, bi rastî tu dixwazî hemû {domain} asteng bikî? Di gelek rewşan de asteng kirin an jî bêdeng kirin têrê dike û tê tercîh kirin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê were jêbirin.",
+ "confirmations.logout.confirm": "Derkeve",
+ "confirmations.logout.message": "Ma tu dixwazî ku derkevî?",
+ "confirmations.mute.confirm": "Bêdeng bike",
+ "confirmations.mute.explanation": "Ev ê şandinên ji wan tê û şandinên ku behsa wan dike veşêre, lê hê jî maf dide ku ew şandinên te bibînin û te bişopînin.",
+ "confirmations.mute.message": "Bi rastî tu dixwazî {name} bêdeng bikî?",
+ "confirmations.redraft.confirm": "Jê bibe & ji nû ve serrast bike",
+ "confirmations.redraft.message": "Bi rastî tu dixwazî şandî ye jê bibî û nûve reşnivîsek çê bikî? Bijarte û şandî wê wenda bibin û bersivên ji bo şandiyê resen wê sêwî bimînin.",
+ "confirmations.reply.confirm": "Bersivê bide",
+ "confirmations.reply.message": "Bersiva niha li ser peyama ku tu niha berhev dikî dê binivsîne. Ma pê bawer î ku tu dixwazî bidomînî?",
+ "confirmations.unfollow.confirm": "Neşopîne",
+ "confirmations.unfollow.message": "Ma tu dixwazî ku dev ji şopa {name} berdî?",
+ "conversation.delete": "Axaftinê jê bibe",
+ "conversation.mark_as_read": "Wekî xwendî nîşan bide",
+ "conversation.open": "Axaftinê nîşan bide",
+ "conversation.with": "Bi {names} re",
+ "directory.federated": "Ji fediversên naskirî",
+ "directory.local": "Tenê ji {domain}",
+ "directory.new_arrivals": "Kesên ku nû hatine",
+ "directory.recently_active": "Di demên dawî de çalak",
+ "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.",
+ "embed.preview": "Wa ye wê wusa xuya bike:",
+ "emoji_button.activity": "Çalakî",
+ "emoji_button.custom": "Kesanekirî",
+ "emoji_button.flags": "Nîşankirî",
+ "emoji_button.food": "Xwarin û vexwarin",
+ "emoji_button.label": "Emoji têxe",
+ "emoji_button.nature": "Sirûştî",
+ "emoji_button.not_found": "Hestokên lihevhatî nehate dîtin",
+ "emoji_button.objects": "Tişt",
+ "emoji_button.people": "Mirov",
+ "emoji_button.recent": "Pir caran tê bikaranîn",
+ "emoji_button.search": "Bigere...",
+ "emoji_button.search_results": "Encamên lêgerînê",
+ "emoji_button.symbols": "Sembol",
+ "emoji_button.travel": "Geşt û şûn",
+ "empty_column.account_suspended": "Ajimêr hatiye rawestandin",
+ "empty_column.account_timeline": "Li vir şandî tune!",
+ "empty_column.account_unavailable": "Profîl nayê peydakirin",
+ "empty_column.blocks": "Te tu bikarhêner asteng nekiriye.",
+ "empty_column.bookmarked_statuses": "Hîn tu peyamên şûnpelkirî tuneye. Gava ku hûn yek şûnpel bikin, ew ê li vir xûya bike.",
+ "empty_column.community": "Demnameya herêmî vala ye. Tiştek ji raya giştî re binivsînin da ku rûpel biherike!",
+ "empty_column.direct": "Hêj peyameke te yê rasterast tuneye. Gava ku tu yekî bişeynî an jî bigirî, ew ê li vir xûya bike.",
+ "empty_column.domain_blocks": "Hê jî navperên hatine asteng kirin tune ne.",
+ "empty_column.explore_statuses": "Tiştek niha di rojevê de tune. Paşê vegere!",
+ "empty_column.favourited_statuses": "Hîn tu peyamên te yên bijare tunene. Gava ku te yekî bijart, ew ê li vir xûya bike.",
+ "empty_column.favourites": "Hîn tu kes vê peyamê nebijartiye. Gava ku hin kes bijartin, ew ê li vir xûya bikin.",
+ "empty_column.follow_recommendations": "Wusa dixuye ku ji bo we tu pêşniyar nehatine çêkirin. Hûn dikarin lêgerînê bikarbînin da ku li kesên ku hûn nas dikin bigerin an hashtagên trendî bigerin.",
+ "empty_column.follow_requests": "Hê jî daxwaza şopandinê tunne ye. Dema daxwazek hat, yê li vir were nîşan kirin.",
+ "empty_column.hashtag": "Di vê hashtagê de hêj tiştekî tune.",
+ "empty_column.home": "Demnameya mala we vala ye! Ji bona tijîkirinê bêtir mirovan bişopînin. {suggestions}",
+ "empty_column.home.suggestions": "Hinek pêşniyaran bibîne",
+ "empty_column.list": "Di vê rêzokê de hîn tiştek tune ye. Gava ku endamên vê rêzokê peyamên nû biweşînin, ew ê li vir xuya bibin.",
+ "empty_column.lists": "Hêj qet rêzokê te tunne ye. Dema yek peyda bû, yê li vir were nîşan kirin.",
+ "empty_column.mutes": "Te tu bikarhêner bêdeng nekiriye.",
+ "empty_column.notifications": "Hêj hişyariyên te tunene. Dema ku mirovên din bi we re têkilî danîn, hûn ê wê li vir bibînin.",
+ "empty_column.public": "Li vir tiştekî tuneye! Ji raya giştî re tiştekî binivîsîne, an ji bo tijîkirinê ji rajekerên din bikarhêneran bi destan bişopînin",
+ "error.unexpected_crash.explanation": "Ji ber xeletîyeke di koda me da an jî ji ber mijara lihevhatina gerokan, ev rûpel rast nehat nîşandan.",
+ "error.unexpected_crash.explanation_addons": "Ev rûpel bi awayekî rast nehat nîşandan. Ev çewtî mimkûn e ji ber lêzêdekirina gerokan an jî amûrên wergera xweberî pêk tê.",
+ "error.unexpected_crash.next_steps": "Nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
+ "error.unexpected_crash.next_steps_addons": "Ne çalak kirin û nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi rêya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
+ "errors.unexpected_crash.copy_stacktrace": "Şopa gemara (stacktrace) tûrikê ra jê bigire",
+ "errors.unexpected_crash.report_issue": "Pirsgirêkekê ragihîne",
+ "explore.search_results": "Encamên lêgerînê",
+ "explore.suggested_follows": "Ji bo te",
+ "explore.title": "Vekole",
+ "explore.trending_links": "Nûçe",
+ "explore.trending_statuses": "Şandî",
+ "explore.trending_tags": "Hashtag",
+ "follow_recommendations.done": "Qediya",
+ "follow_recommendations.heading": "Mirovên ku tu dixwazî ji wan peyaman bibînî bişopîne! Hin pêşnîyar li vir in.",
+ "follow_recommendations.lead": "Li gorî rêza kronolojîkî peyamên mirovên ku tu dişopînî dê demnameya te de xûya bike. Ji xeletiyan netirse, bi awayekî hêsan her wextî tu dikarî dev ji şopandinê berdî!",
+ "follow_request.authorize": "Mafê bide",
+ "follow_request.reject": "Nepejirîne",
+ "follow_requests.unlocked_explanation": "Tevlî ku ajimêra te ne kilît kiriye, karmendên {domain} digotin qey tu dixwazî ku pêşdîtina daxwazên şopandinê bi destan bike.",
+ "generic.saved": "Tomarkirî",
+ "getting_started.developers": "Pêşdebir",
+ "getting_started.directory": "Rêgeha profîlê",
+ "getting_started.documentation": "Pelbend",
+ "getting_started.heading": "Destpêkirin",
+ "getting_started.invite": "Mirovan Vexwîne",
+ "getting_started.open_source_notice": "Mastodon nermalava çavkaniya vekirî ye. Tu dikarî pirsgirêkan li ser GitHub-ê ragihînî di {github} de an jî dikarî tevkariyê bikî.",
+ "getting_started.security": "Sazkariyên ajimêr",
+ "getting_started.terms": "Mercên karûberan",
+ "hashtag.column_header.tag_mode.all": "û {additional}",
+ "hashtag.column_header.tag_mode.any": "an {additional}",
+ "hashtag.column_header.tag_mode.none": "bêyî {additional}",
+ "hashtag.column_settings.select.no_options_message": "Ti pêşniyar nehatin dîtin",
+ "hashtag.column_settings.select.placeholder": "Têkeve hashtagê…",
+ "hashtag.column_settings.tag_mode.all": "Van hemûyan",
+ "hashtag.column_settings.tag_mode.any": "Yek ji van",
+ "hashtag.column_settings.tag_mode.none": "Ne yek ji van",
+ "hashtag.column_settings.tag_toggle": "Ji bo vê stûnê hin pêvekan tevlî bike",
+ "home.column_settings.basic": "Bingehîn",
+ "home.column_settings.show_reblogs": "Bilindkirinan nîşan bike",
+ "home.column_settings.show_replies": "Bersivan nîşan bide",
+ "home.hide_announcements": "Reklaman veşêre",
+ "home.show_announcements": "Reklaman nîşan bide",
+ "intervals.full.days": "{number, plural, one {# roj} other {# roj}}",
+ "intervals.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}}\n \n",
+ "intervals.full.minutes": "{number, plural, one {# xulek} other {# xulek}}",
+ "keyboard_shortcuts.back": "Vegere paşê",
+ "keyboard_shortcuts.blocked": "Rêzoka bikarhênerên astengkirî veke",
+ "keyboard_shortcuts.boost": "Şandiyê bilind bike",
+ "keyboard_shortcuts.column": "Stûna balkişandinê",
+ "keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea",
+ "keyboard_shortcuts.description": "Danasîn",
+ "keyboard_shortcuts.direct": "Ji stûnê peyamên rasterast veke",
+ "keyboard_shortcuts.down": "Di rêzokê de dakêşe jêr",
+ "keyboard_shortcuts.enter": "Şandiyê veke",
+ "keyboard_shortcuts.favourite": "Şandiya bijarte",
+ "keyboard_shortcuts.favourites": "Rêzokên bijarte veke",
+ "keyboard_shortcuts.federated": "Demnameyê federalîkirî veke",
+ "keyboard_shortcuts.heading": "Kurterêyên klavyeyê",
+ "keyboard_shortcuts.home": "Demnameyê veke",
+ "keyboard_shortcuts.hotkey": "Bişkoka kurterê",
+ "keyboard_shortcuts.legend": "Vê çîrokê nîşan bike",
+ "keyboard_shortcuts.local": "Demnameya herêmî veke",
+ "keyboard_shortcuts.mention": "Qala nivîskarî/ê bike",
+ "keyboard_shortcuts.muted": "Rêzoka bikarhênerên bêdeng kirî veke",
+ "keyboard_shortcuts.my_profile": "Profîla xwe veke",
+ "keyboard_shortcuts.notifications": "Stûnê agahdariyan veke",
+ "keyboard_shortcuts.open_media": "Medya veke",
+ "keyboard_shortcuts.pinned": "Şandiyên derzîkirî veke",
+ "keyboard_shortcuts.profile": "Profîla nivîskaran veke",
+ "keyboard_shortcuts.reply": "Bersivê bide şandiyê",
+ "keyboard_shortcuts.requests": "Rêzoka daxwazên şopandinê veke",
+ "keyboard_shortcuts.search": "Bal bide şivika lêgerînê",
+ "keyboard_shortcuts.spoilers": "Zeviya hişyariya naverokê nîşan bide/veşêre",
+ "keyboard_shortcuts.start": "Stûna \"destpêkê\" veke",
+ "keyboard_shortcuts.toggle_hidden": "Nivîsa paş hişyariya naverokê nîşan bide/veşêre",
+ "keyboard_shortcuts.toggle_sensitivity": "Medyayê nîşan bide/veşêre",
+ "keyboard_shortcuts.toot": "Dest bi şandiyeke nû bike",
+ "keyboard_shortcuts.unfocus": "Bal nede cîhê nivîsê /lêgerînê",
+ "keyboard_shortcuts.up": "Di rêzokê de rake jor",
+ "lightbox.close": "Bigire",
+ "lightbox.compress": "Qutîya wêneya nîşan dike bitepisîne",
+ "lightbox.expand": "Qutîya wêneya nîşan dike fireh bike",
+ "lightbox.next": "Pêş",
+ "lightbox.previous": "Paş",
+ "lists.account.add": "Tevlî rêzokê bike",
+ "lists.account.remove": "Ji rêzokê rake",
+ "lists.delete": "Rêzokê jê bibe",
+ "lists.edit": "Rêzokê serrast bike",
+ "lists.edit.submit": "Sernavê biguherîne",
+ "lists.new.create": "Rêzokê tevlî bike",
+ "lists.new.title_placeholder": "Sernavê rêzoka nû",
+ "lists.replies_policy.followed": "Bikarhênereke şopandî",
+ "lists.replies_policy.list": "Endamên rêzokê",
+ "lists.replies_policy.none": "Ne yek",
+ "lists.replies_policy.title": "Bersivan nîşan bide:",
+ "lists.search": "Di navbera kesên ku te dişopînin bigere",
+ "lists.subheading": "Rêzokên te",
+ "load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}",
+ "loading_indicator.label": "Tê barkirin...",
+ "media_gallery.toggle_visible": "{number, plural, one {Wêneyê veşêre} other {Wêneyan veşêre}}",
+ "missing_indicator.label": "Nehate dîtin",
+ "missing_indicator.sublabel": "Ev çavkanî nehat dîtin",
+ "mute_modal.duration": "Dem",
+ "mute_modal.hide_notifications": "Agahdariyan ji ev bikarhêner veşêre?",
+ "mute_modal.indefinite": "Nediyar",
+ "navigation_bar.apps": "Sepana mobîl",
+ "navigation_bar.blocks": "Bikarhênerên astengkirî",
+ "navigation_bar.bookmarks": "Şûnpel",
+ "navigation_bar.community_timeline": "Demnameya herêmî",
+ "navigation_bar.compose": "Şandiyeke nû binivsîne",
+ "navigation_bar.direct": "Peyamên rasterast",
+ "navigation_bar.discover": "Vekolê",
+ "navigation_bar.domain_blocks": "Navparên astengkirî",
+ "navigation_bar.edit_profile": "Profîl serrast bike",
+ "navigation_bar.explore": "Vekole",
+ "navigation_bar.favourites": "Bijarte",
+ "navigation_bar.filters": "Peyvên bêdengkirî",
+ "navigation_bar.follow_requests": "Daxwazên şopandinê",
+ "navigation_bar.follows_and_followers": "Şopandin û şopîner",
+ "navigation_bar.info": "Derbarê vî rajekarî",
+ "navigation_bar.keyboard_shortcuts": "Bişkoka kurterê",
+ "navigation_bar.lists": "Rêzok",
+ "navigation_bar.logout": "Derkeve",
+ "navigation_bar.mutes": "Bikarhênerên bêdengkirî",
+ "navigation_bar.personal": "Kesanî",
+ "navigation_bar.pins": "Şandiya derzîkirî",
+ "navigation_bar.preferences": "Sazkarî",
+ "navigation_bar.public_timeline": "Demnameyê federalîkirî",
+ "navigation_bar.security": "Ewlehî",
+ "notification.admin.sign_up": "{name} tomar bû",
+ "notification.favourite": "{name} şandiya te hez kir",
+ "notification.follow": "{name} te şopand",
+ "notification.follow_request": "{name} dixwazê te bişopîne",
+ "notification.mention": "{name} qale te kir",
+ "notification.own_poll": "Rapirsîya te qediya",
+ "notification.poll": "Rapirsiyeke ku te deng daye qediya",
+ "notification.reblog": "{name} şandiya te bilind kir",
+ "notification.status": "{name} niha şand",
+ "notification.update": "{name} şandiyek serrast kir",
+ "notifications.clear": "Agahdariyan pak bike",
+ "notifications.clear_confirmation": "Bi rastî tu dixwazî bi awayekî dawî hemû agahdariyên xwe pak bikî?",
+ "notifications.column_settings.admin.sign_up": "Tomarkirinên nû:",
+ "notifications.column_settings.alert": "Agahdariyên sermaseyê",
+ "notifications.column_settings.favourite": "Bijarte:",
+ "notifications.column_settings.filter_bar.advanced": "Hemû beşan nîşan bide",
+ "notifications.column_settings.filter_bar.category": "Şivika parzûna bilêz",
+ "notifications.column_settings.filter_bar.show_bar": "Darika parzûnê nîşan bide",
+ "notifications.column_settings.follow": "Şopînerên nû:",
+ "notifications.column_settings.follow_request": "Daxwazên şopandinê nû:",
+ "notifications.column_settings.mention": "Qalkirin:",
+ "notifications.column_settings.poll": "Encamên rapirsiyê:",
+ "notifications.column_settings.push": "Agahdarîyên yekser",
+ "notifications.column_settings.reblog": "Bilindkirî:",
+ "notifications.column_settings.show": "Di nav stûnê de nîşan bike",
+ "notifications.column_settings.sound": "Deng lêxe",
+ "notifications.column_settings.status": "Şandiyên nû:",
+ "notifications.column_settings.unread_notifications.category": "Agahdariyên nexwendî",
+ "notifications.column_settings.unread_notifications.highlight": "Agahiyên nexwendî nîşan bike",
+ "notifications.column_settings.update": "Serrastkirin:",
+ "notifications.filter.all": "Hemû",
+ "notifications.filter.boosts": "Bilindkirî",
+ "notifications.filter.favourites": "Bijarte",
+ "notifications.filter.follows": "Dişopîne",
+ "notifications.filter.mentions": "Qalkirin",
+ "notifications.filter.polls": "Encamên rapirsiyê",
+ "notifications.filter.statuses": "Ji kesên tu dişopînî re rojanekirin",
+ "notifications.grant_permission": "Destûrê bide.",
+ "notifications.group": "{count} agahdarî",
+ "notifications.mark_as_read": "Hemî agahdarîya wek xwendî nîşan bike",
+ "notifications.permission_denied": "Agahdarîyên sermaseyê naxebite ji ber ku berê de daxwazî ya destûr dayîna gerokê hati bû red kirin",
+ "notifications.permission_denied_alert": "Agahdarîyên sermaseyê nay çalak kirin, ji ber ku destûr kirina gerokê pêşî de hati bû red kirin",
+ "notifications.permission_required": "Agahdarîyên sermaseyê naxebite çunkî mafê pêwîst dike nehatiye dayîn.",
+ "notifications_permission_banner.enable": "Agahdarîyên sermaseyê çalak bike",
+ "notifications_permission_banner.how_to_control": "Da ku agahdariyên mastodon bistînî gava ne vekirî be. Agahdariyên sermaseyê çalak bike\n Tu dikarî agahdariyên sermaseyê bi rê ve bibî ku bi hemû cureyên çalakiyên ên ku agahdariyan rû didin ku bi riya tikandînê li ser bişkoka {icon} çalak dibe.",
+ "notifications_permission_banner.title": "Tu tiştî bîr neke",
+ "picture_in_picture.restore": "Vegerîne paş",
+ "poll.closed": "Girtî",
+ "poll.refresh": "Nû bike",
+ "poll.total_people": "{count, plural, one {# kes} other {# kes}}",
+ "poll.total_votes": "{count, plural, one {# deng} other {# deng}}",
+ "poll.vote": "Deng bide",
+ "poll.voted": "Te dengê xwe da vê bersivê",
+ "poll.votes": "{votes, plural, one {# deng} other {# deng}}",
+ "poll_button.add_poll": "Rapirsîyek zêde bike",
+ "poll_button.remove_poll": "Rapirsî yê rake",
+ "privacy.change": "Nepênîtiya şandiyan biguherîne",
+ "privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin",
+ "privacy.direct.short": "Taybet",
+ "privacy.private.long": "Tenê bo şopîneran xuyabar e",
+ "privacy.private.short": "Tenê şopîneran",
+ "privacy.public.long": "Ji bo herkesî li berçav e, di demnameyên gelemperî de dê xûyakirin",
+ "privacy.public.short": "Gelemperî",
+ "privacy.unlisted.long": "Ji herkesî ra tê xûya, lê demnameyê gelemperî ra nay xûyakirin",
+ "privacy.unlisted.short": "Nerêzok",
+ "refresh": "Nû bike",
+ "regeneration_indicator.label": "Tê barkirin…",
+ "regeneration_indicator.sublabel": "Mala te da tê amedekirin!",
+ "relative_time.days": "{number}r",
+ "relative_time.full.days": "{number, plural, one {# roj} other {# roj}} berê",
+ "relative_time.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} berê",
+ "relative_time.full.just_now": "hema niha",
+ "relative_time.full.minutes": "{number, plural, one {# xulek} other {# xulek}} berê",
+ "relative_time.full.seconds": "{number, plural, one {# çirke} other {# çirke}} berê",
+ "relative_time.hours": "{number}d",
+ "relative_time.just_now": "niha",
+ "relative_time.minutes": "{number}x",
+ "relative_time.seconds": "{number}ç",
+ "relative_time.today": "îro",
+ "reply_indicator.cancel": "Dev jê berde",
+ "report.block": "Asteng bike",
+ "report.block_explanation": "Tu yê şandiyên wan nebînî. Ew ê nikaribin şandiyên te bibînin an jî te bişopînin. Ew ê bizanibin ku ew hatine astengkirin.",
+ "report.categories.other": "Yên din",
+ "report.categories.spam": "Nexwestî (Spam)",
+ "report.categories.violation": "Naverok yek an çend rêbazên rajekar binpê dike",
+ "report.category.subtitle": "Baştirîn lihevhatin hilbijêre",
+ "report.category.title": "Ji me re bêje ka çi diqewime bi vê {type} re",
+ "report.category.title_account": "profîl",
+ "report.category.title_status": "şandî",
+ "report.close": "Qediya",
+ "report.comment.title": "Tiştek din heye ku tu difikirî ku divê em zanibin?",
+ "report.forward": "Biçe bo {target}",
+ "report.forward_hint": "Ajimêr ji rajekarek din da ne. Tu kopîyeka anonîm ya raporê bişînî li wur?",
+ "report.mute": "Bêdeng bike",
+ "report.mute_explanation": "Tê yê şandiyên wan nebînî. Ew hin jî dikarin te bişopînin û şandiyên te bibînin û wê nizanibin ku ew hatine bêdengkirin.",
+ "report.next": "Pêş",
+ "report.placeholder": "Şiroveyên zêde",
+ "report.reasons.dislike": "Ez jê hez nakim",
+ "report.reasons.dislike_description": "Ew ne tiştek e ku tu dixwazî bibînî",
+ "report.reasons.other": "Tiştekî din e",
+ "report.reasons.other_description": "Pirsgirêk di kategoriyên din de cih nagire",
+ "report.reasons.spam": "Ew spam e",
+ "report.reasons.spam_description": "Girêdanên xerab, tevlêbûna sexte, an jî bersivên dubarekirî",
+ "report.reasons.violation": "Ew rêzikên rajekar binpê dike",
+ "report.reasons.violation_description": "Tu dizanî ku ew rêzikên taybetiyê binpê dike",
+ "report.rules.subtitle": "Hemûyên ku têne sepandin hibijêre",
+ "report.rules.title": "Kîjan rêzik têne binpêkirin?",
+ "report.statuses.subtitle": "Hemûyên ku têne sepandin hibijêre",
+ "report.statuses.title": "Tu şandiyên ku vê ragihandinê piştgirî dikin hene?",
+ "report.submit": "Bişîne",
+ "report.target": "Ragihandin {target}",
+ "report.thanks.take_action": "Li vir vebijêrkên te hene ji bo kontrolkirina tiştê ku tu li se Mastodon dibînî:",
+ "report.thanks.take_action_actionable": "Dema ku em vê yekê dinirxînin, tu dikarî li dijî @{name} tedbîran bigirî:",
+ "report.thanks.title": "Tu naxwazî vê bibînî?",
+ "report.thanks.title_actionable": "Spas ji bo ragihandina te, em ê binirxînin.",
+ "report.unfollow": "@{name} neşopîne",
+ "report.unfollow_explanation": "Tê vê ajimêrê dişopînî. Ji bo ku êdî şandiyên wan di rojeva xwe de nebînî, wan neşopîne.",
+ "search.placeholder": "Bigere",
+ "search_popout.search_format": "Dirûva lêgerîna pêşketî",
+ "search_popout.tips.full_text": "Nivîsên hêsan, şandiyên ku te nivîsandiye, bijare kiriye, bilind kiriye an jî yên behsa te kirine û her wiha navê bikarhêneran, navên xûya dike û hashtagan vedigerîne.",
+ "search_popout.tips.hashtag": "hashtag",
+ "search_popout.tips.status": "şandî",
+ "search_popout.tips.text": "Nivîsên hêsan, navên xûya ên ku li hev hatî, bikarhêner û hashtagan vedigerîne",
+ "search_popout.tips.user": "bikarhêner",
+ "search_results.accounts": "Mirov",
+ "search_results.all": "Hemû",
+ "search_results.hashtags": "Hashtag",
+ "search_results.nothing_found": "Ji bo van peyvên lêgerînê tiştek nehate dîtin",
+ "search_results.statuses": "Şandî",
+ "search_results.statuses_fts_disabled": "Di vê rajekara Mastodonê da lêgerîna şandîyên li gorî naveroka wan ne çalak e.",
+ "search_results.total": "{count, number} {count, plural, one {encam} other {encam}}",
+ "status.admin_account": "Ji bo @{name} navrûya venihêrtinê veke",
+ "status.admin_status": "Vê şandîyê di navrûya venihêrtinê de veke",
+ "status.block": "@{name} asteng bike",
+ "status.bookmark": "Şûnpel",
+ "status.cancel_reblog_private": "Bilind neke",
+ "status.cannot_reblog": "Ev şandî nayê bilindkirin",
+ "status.copy": "Girêdanê jê bigire bo weşankirinê",
+ "status.delete": "Jê bibe",
+ "status.detailed_status": "Dîtina axaftina berfireh",
+ "status.direct": "Peyama rasterast @{name}",
+ "status.edit": "Serrast bike",
+ "status.edited": "Di {date} de hate serrastkirin",
+ "status.edited_x_times": "{count, plural, one {{count} car} other {{count} car}} hate serrastkirin",
+ "status.embed": "Hedimandî",
+ "status.favourite": "Bijarte",
+ "status.filtered": "Parzûnkirî",
+ "status.history.created": "{name} {date} afirand",
+ "status.history.edited": "{name} {date} serrast kir",
+ "status.load_more": "Bêtir bar bike",
+ "status.media_hidden": "Medya veşartî ye",
+ "status.mention": "Qal @{name} bike",
+ "status.more": "Bêtir",
+ "status.mute": "@{name} Bêdeng bike",
+ "status.mute_conversation": "Axaftinê bêdeng bike",
+ "status.open": "Vê şandiyê berferh bike",
+ "status.pin": "Li ser profîlê derzî bike",
+ "status.pinned": "Şandiya derzîkirî",
+ "status.read_more": "Bêtir bixwîne",
+ "status.reblog": "Bilind bike",
+ "status.reblog_private": "Bi dîtina resen bilind bike",
+ "status.reblogged_by": "{name} bilind kir",
+ "status.reblogs.empty": "Kesekî hin ev şandî bilind nekiriye. Gava kesek bilind bike, ew ên li vir werin xuyakirin.",
+ "status.redraft": "Jê bibe & ji nû ve reşnivîs bike",
+ "status.remove_bookmark": "Şûnpêlê jê rake",
+ "status.reply": "Bersivê bide",
+ "status.replyAll": "Mijarê bibersivîne",
+ "status.report": "{name} gilî bike",
+ "status.sensitive_warning": "Naveroka hestiyarî",
+ "status.share": "Parve bike",
+ "status.show_less": "Kêmtir nîşan bide",
+ "status.show_less_all": "Ji bo hemîyan kêmtir nîşan bide",
+ "status.show_more": "Hêj zehftir nîşan bide",
+ "status.show_more_all": "Bêtir nîşan bide bo hemûyan",
+ "status.show_thread": "Mijarê nîşan bide",
+ "status.uncached_media_warning": "Tune ye",
+ "status.unmute_conversation": "Axaftinê bêdeng neke",
+ "status.unpin": "Şandiya derzîkirî ji profîlê rake",
+ "suggestions.dismiss": "Pêşniyarê paşguh bike",
+ "suggestions.header": "Dibe ku bala te bikşîne…",
+ "tabs_bar.federated_timeline": "Giştî",
+ "tabs_bar.home": "Serrûpel",
+ "tabs_bar.local_timeline": "Herêmî",
+ "tabs_bar.notifications": "Agahdarî",
+ "tabs_bar.search": "Bigere",
+ "time_remaining.days": "{number, plural, one {# roj} other {# roj}} maye",
+ "time_remaining.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} maye",
+ "time_remaining.minutes": "{number, plural, one {# xulek} other {# xulek}} maye",
+ "time_remaining.moments": "Demên mayî",
+ "time_remaining.seconds": "{number, plural, one {# çirke} other {# çirke}} maye",
+ "timeline_hint.remote_resource_not_displayed": "{resource} Ji rajekerên din nayê dîtin.",
+ "timeline_hint.resources.followers": "Şopîner",
+ "timeline_hint.resources.follows": "Dişopîne",
+ "timeline_hint.resources.statuses": "Şandiyên kevn",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} kes} other {{counter} kes}} diaxivin",
+ "trends.trending_now": "Rojev",
+ "ui.beforeunload": "Ger ji Mastodonê veketi wê reşnivîsa te jî winda bibe.",
+ "units.short.billion": "{count}B",
+ "units.short.million": "{count}M",
+ "units.short.thousand": "{count}H",
+ "upload_area.title": "Ji bo barkirinê kaş bike û deyne",
+ "upload_button.label": "Wêne, vîdeoyek an jî pelê dengî tevlî bike",
+ "upload_error.limit": "Sînora barkirina pelan derbas bû.",
+ "upload_error.poll": "Di rapirsîyan de mafê barkirina pelan nayê dayîn.",
+ "upload_form.audio_description": "Ji bona kesên kêm dibihîsin re pênase bike",
+ "upload_form.description": "Ji bona astengdarên dîtinê re vebêje",
+ "upload_form.edit": "Serrast bike",
+ "upload_form.thumbnail": "Wêneyê biçûk biguherîne",
+ "upload_form.undo": "Jê bibe",
+ "upload_form.video_description": "Ji bo kesên kerr û lalan pênase bike",
+ "upload_modal.analyzing_picture": "Wêne tê analîzkirin…",
+ "upload_modal.apply": "Bisepîne",
+ "upload_modal.applying": "Tê sepandin…",
+ "upload_modal.choose_image": "Wêneyê hilbijêre",
+ "upload_modal.description_placeholder": "Rovîyek qehweyî û bilez li ser kûçikê tîral banz dide",
+ "upload_modal.detect_text": "Ji nivîsa wêneyê re serwext be",
+ "upload_modal.edit_media": "Medyayê sererast bike",
+ "upload_modal.hint": "Ji bo hilbijartina xala navendê her tim dîmenê piçûk de pêşdîtina çerxê bitikîne an jî kaş bike.",
+ "upload_modal.preparing_ocr": "OCR dihê amadekirin…",
+ "upload_modal.preview_label": "Pêşdîtin ({ratio})",
+ "upload_progress.label": "Tê barkirin...",
+ "video.close": "Vîdyoyê bigire",
+ "video.download": "Pelê daxe",
+ "video.exit_fullscreen": "Ji dîmendera tijî derkeve",
+ "video.expand": "Vîdyoyê berferh bike",
+ "video.fullscreen": "Dimendera tijî",
+ "video.hide": "Vîdyo veşêre",
+ "video.mute": "Dengê qut bike",
+ "video.pause": "Rawestîne",
+ "video.play": "Vêxe",
+ "video.unmute": "Dengê qut neke"
}
diff --git a/app/javascript/mastodon/locales/locale-data/sa.js b/app/javascript/mastodon/locales/locale-data/sa.js
new file mode 100644
index 000000000..946dfde0f
--- /dev/null
+++ b/app/javascript/mastodon/locales/locale-data/sa.js
@@ -0,0 +1,97 @@
+/*eslint eqeqeq: "off"*/
+/*eslint no-nested-ternary: "off"*/
+/*eslint quotes: "off"*/
+/*eslint comma-dangle: "off"*/
+/*eslint semi: "off"*/
+
+export default [
+ {
+ locale: "sa",
+ fields: {
+ year: {
+ displayName: "year",
+ relative: {
+ 0: "this year",
+ 1: "next year",
+ "-1": "last year"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} y"
+ },
+ past: {
+ other: "-{0} y"
+ }
+ }
+ },
+ month: {
+ displayName: "month",
+ relative: {
+ 0: "this month",
+ 1: "next month",
+ "-1": "last month"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} m"
+ },
+ past: {
+ other: "-{0} m"
+ }
+ }
+ },
+ day: {
+ displayName: "day",
+ relative: {
+ 0: "अद्य",
+ 1: "श्वः",
+ "-1": "गतदिनम्"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} d"
+ },
+ past: {
+ other: "-{0} d"
+ }
+ }
+ },
+ hour: {
+ displayName: "hour",
+ relativeTime: {
+ future: {
+ other: "+{0} h"
+ },
+ past: {
+ other: "-{0} h"
+ }
+ }
+ },
+ minute: {
+ displayName: "minute",
+ relativeTime: {
+ future: {
+ other: "+{0} min"
+ },
+ past: {
+ other: "-{0} min"
+ }
+ }
+ },
+ second: {
+ displayName: "second",
+ relative: {
+ 0: "now"
+ },
+ relativeTime: {
+ future: {
+ other: "+{0} s"
+ },
+ past: {
+ other: "-{0} s"
+ }
+ }
+ }
+ }
+ }
+]
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index f30755286..d1cfdd5f4 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -9,44 +9,44 @@
"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": "Geef geen melding meer wanneer @{name} toot",
+ "account.disable_notifications": "Geef geen melding meer wanneer @{name} een bericht plaatst",
"account.domain_blocked": "Domein geblokkeerd",
"account.edit_profile": "Profiel bewerken",
- "account.enable_notifications": "Geef een melding wanneer @{name} toot",
+ "account.enable_notifications": "Geef een melding wanneer @{name} een bericht plaatst",
"account.endorse": "Op profiel weergeven",
"account.follow": "Volgen",
"account.followers": "Volgers",
"account.followers.empty": "Niemand volgt nog deze gebruiker.",
"account.followers_counter": "{count, plural, one {{counter} volger} other {{counter} volgers}}",
- "account.following": "Following",
+ "account.following": "Volgend",
"account.following_counter": "{count, plural, one {{counter} volgend} other {{counter} volgend}}",
"account.follows.empty": "Deze gebruiker volgt nog niemand.",
"account.follows_you": "Volgt jou",
"account.hide_reblogs": "Boosts van @{name} verbergen",
"account.joined": "Geregistreerd in {date}",
"account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}",
- "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.",
+ "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie diegene kan volgen.",
"account.media": "Media",
"account.mention": "@{name} vermelden",
"account.moved_to": "{name} is verhuisd naar:",
"account.mute": "@{name} negeren",
"account.mute_notifications": "Meldingen van @{name} negeren",
"account.muted": "Genegeerd",
- "account.posts": "Toots",
- "account.posts_with_replies": "Toots en reacties",
+ "account.posts": "Berichten",
+ "account.posts_with_replies": "Berichten en reacties",
"account.report": "@{name} rapporteren",
"account.requested": "Wacht op goedkeuring. Klik om het volgverzoek te annuleren",
"account.share": "Profiel van @{name} delen",
"account.show_reblogs": "Boosts van @{name} tonen",
- "account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toots}}",
+ "account.statuses_counter": "{count, plural, one {{counter} bericht} other {{counter} berichten}}",
"account.unblock": "@{name} deblokkeren",
"account.unblock_domain": "{domain} niet langer verbergen",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Deblokkeren",
"account.unendorse": "Niet op profiel weergeven",
"account.unfollow": "Ontvolgen",
"account.unmute": "@{name} niet langer negeren",
"account.unmute_notifications": "Meldingen van @{name} niet langer negeren",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Niet langer negeren",
"account_note.placeholder": "Klik om een opmerking toe te voegen",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
@@ -79,7 +79,7 @@
"column.lists": "Lijsten",
"column.mutes": "Genegeerde gebruikers",
"column.notifications": "Meldingen",
- "column.pins": "Vastgezette toots",
+ "column.pins": "Vastgezette berichten",
"column.public": "Globale tijdlijn",
"column_back_button.label": "Terug",
"column_header.hide_settings": "Instellingen verbergen",
@@ -92,10 +92,10 @@
"community.column_settings.local_only": "Alleen lokaal",
"community.column_settings.media_only": "Alleen media",
"community.column_settings.remote_only": "Alleen andere servers",
- "compose_form.direct_message_warning": "Deze toot wordt alleen naar vermelde gebruikers verstuurd.",
+ "compose_form.direct_message_warning": "Dit bericht wordt alleen naar vermelde gebruikers verstuurd.",
"compose_form.direct_message_warning_learn_more": "Meer leren",
- "compose_form.hashtag_warning": "Deze toot valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare toots kunnen via hashtags gevonden worden.",
- "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de toots zien die je alleen aan jouw volgers hebt gericht.",
+ "compose_form.hashtag_warning": "Dit bericht valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare berichten kunnen via hashtags gevonden worden.",
+ "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de berichten zien die je alleen aan jouw volgers hebt gericht.",
"compose_form.lock_disclaimer.lock": "besloten",
"compose_form.placeholder": "Wat wil je kwijt?",
"compose_form.poll.add_option": "Keuze toevoegen",
@@ -106,7 +106,7 @@
"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.save_changes": "Save changes",
+ "compose_form.save_changes": "Wijzigingen opslaan",
"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}}",
@@ -118,22 +118,22 @@
"confirmations.block.confirm": "Blokkeren",
"confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?",
"confirmations.delete.confirm": "Verwijderen",
- "confirmations.delete.message": "Weet je het zeker dat je deze toot wilt verwijderen?",
+ "confirmations.delete.message": "Weet je het zeker dat je dit bericht wilt verwijderen?",
"confirmations.delete_list.confirm": "Verwijderen",
"confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?",
"confirmations.discard_edit_media.confirm": "Weggooien",
"confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch weggooien?",
"confirmations.domain_block.confirm": "Verberg alles van deze server",
- "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen toots van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.",
+ "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen berichten van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.",
"confirmations.logout.confirm": "Uitloggen",
"confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?",
"confirmations.mute.confirm": "Negeren",
- "confirmations.mute.explanation": "Dit verbergt toots van hen en toots waar hen in wordt vermeld, maar hen kan nog steeds jouw toots bekijken en jou volgen.",
+ "confirmations.mute.explanation": "Dit verbergt diens berichten en berichten waar diegene in wordt vermeld, maar diegene kan nog steeds jouw berichten bekijken en jou volgen.",
"confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?",
"confirmations.redraft.confirm": "Verwijderen en herschrijven",
- "confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op de originele toot zitten niet meer aan de nieuwe toot vast.",
+ "confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.",
"confirmations.reply.confirm": "Reageren",
- "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
+ "confirmations.reply.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
"confirmations.unfollow.confirm": "Ontvolgen",
"confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
"conversation.delete": "Gesprek verwijderen",
@@ -144,7 +144,7 @@
"directory.local": "Alleen {domain}",
"directory.new_arrivals": "Nieuwe accounts",
"directory.recently_active": "Onlangs actief",
- "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.",
+ "embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.",
"embed.preview": "Zo komt het eruit te zien:",
"emoji_button.activity": "Activiteiten",
"emoji_button.custom": "Lokale emoji’s",
@@ -161,41 +161,41 @@
"emoji_button.symbols": "Symbolen",
"emoji_button.travel": "Reizen en locaties",
"empty_column.account_suspended": "Account opgeschort",
- "empty_column.account_timeline": "Hier zijn geen toots!",
+ "empty_column.account_timeline": "Hier zijn geen berichten!",
"empty_column.account_unavailable": "Profiel is niet beschikbaar",
"empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.",
- "empty_column.bookmarked_statuses": "Jij hebt nog geen toots aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.",
- "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de spits af te bijten!",
+ "empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.",
+ "empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!",
"empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.",
"empty_column.domain_blocks": "Er zijn nog geen geblokkeerde domeinen.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
- "empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.",
+ "empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!",
+ "empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
+ "empty_column.favourites": "Niemand heeft dit bericht nog aan diens favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.",
"empty_column.follow_recommendations": "Het lijkt er op dat er geen aanbevelingen voor jou aangemaakt kunnen worden. Je kunt proberen te zoeken naar mensen die je wellicht kent, zoeken op hashtags, de lokale en globale tijdlijnen bekijken of de gebruikersgids doorbladeren.",
"empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.",
"empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.",
"empty_column.home": "Deze tijdlijn is leeg! Volg meer mensen om het te vullen. {suggestions}",
"empty_column.home.suggestions": "Enkele aanbevelingen bekijken",
- "empty_column.list": "Er is nog niks te zien in deze lijst. Wanneer lijstleden nieuwe toots publiceren, zijn deze hier te zien.",
+ "empty_column.list": "Er is nog niks te zien in deze lijst. Wanneer lijstleden nieuwe berichten plaatsen, zijn deze hier te zien.",
"empty_column.lists": "Jij hebt nog geen enkele lijst. Wanneer je er eentje hebt aangemaakt, valt deze hier te zien.",
"empty_column.mutes": "Jij hebt nog geen gebruikers genegeerd.",
"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",
+ "empty_column.public": "Er is hier helemaal niks! Plaatst een openbaar bericht 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": "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": "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",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
+ "explore.search_results": "Zoekresultaten",
+ "explore.suggested_follows": "Voor jou",
+ "explore.title": "Verkennen",
+ "explore.trending_links": "Nieuws",
+ "explore.trending_statuses": "Berichten",
"explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Klaar",
- "follow_recommendations.heading": "Volg mensen waarvan je graag toots wil zien! Hier zijn enkele aanbevelingen.",
- "follow_recommendations.lead": "Toots van mensen die je volgt zullen in chronologische volgorde onder start verschijnen. Wees niet bang om hierin fouten te maken, want je kunt mensen op elk moment net zo eenvoudig ontvolgen!",
+ "follow_recommendations.heading": "Volg mensen waarvan je graag berichten wil zien! Hier zijn enkele aanbevelingen.",
+ "follow_recommendations.lead": "Berichten van mensen die je volgt zullen in chronologische volgorde onder start verschijnen. Wees niet bang om hierin fouten te maken, want je kunt mensen op elk moment net zo eenvoudig ontvolgen!",
"follow_request.authorize": "Goedkeuren",
"follow_request.reject": "Afkeuren",
"follow_requests.unlocked_explanation": "Ook al is jouw account niet besloten, de medewerkers van {domain} denken dat jij misschien de volgende volgverzoeken handmatig wil controleren.",
@@ -227,13 +227,13 @@
"intervals.full.minutes": "{number, plural, one {# minuut} other {# minuten}}",
"keyboard_shortcuts.back": "Ga terug",
"keyboard_shortcuts.blocked": "Geblokkeerde gebruikers tonen",
- "keyboard_shortcuts.boost": "Toot boosten",
+ "keyboard_shortcuts.boost": "Bericht boosten",
"keyboard_shortcuts.column": "Op één van de kolommen focussen",
- "keyboard_shortcuts.compose": "Tekstveld voor toots focussen",
+ "keyboard_shortcuts.compose": "Tekstveld om een bericht te schrijven focussen",
"keyboard_shortcuts.description": "Omschrijving",
"keyboard_shortcuts.direct": "Jouw directe berichten tonen",
"keyboard_shortcuts.down": "Naar beneden in de lijst bewegen",
- "keyboard_shortcuts.enter": "Toot volledig tonen",
+ "keyboard_shortcuts.enter": "Volledig bericht tonen",
"keyboard_shortcuts.favourite": "Aan jouw favorieten toevoegen",
"keyboard_shortcuts.favourites": "Favorieten tonen",
"keyboard_shortcuts.federated": "Globale tijdlijn tonen",
@@ -247,7 +247,7 @@
"keyboard_shortcuts.my_profile": "Jouw profiel tonen",
"keyboard_shortcuts.notifications": "Meldingen tonen",
"keyboard_shortcuts.open_media": "Media openen",
- "keyboard_shortcuts.pinned": "Jouw vastgezette toots tonen",
+ "keyboard_shortcuts.pinned": "Jouw vastgemaakte berichten tonen",
"keyboard_shortcuts.profile": "Gebruikersprofiel auteur openen",
"keyboard_shortcuts.reply": "Reageren",
"keyboard_shortcuts.requests": "Jouw volgverzoeken tonen",
@@ -256,7 +256,7 @@
"keyboard_shortcuts.start": "\"Aan de slag\" tonen",
"keyboard_shortcuts.toggle_hidden": "Inhoudswaarschuwing tonen/verbergen",
"keyboard_shortcuts.toggle_sensitivity": "Media tonen/verbergen",
- "keyboard_shortcuts.toot": "Nieuwe toot schrijven",
+ "keyboard_shortcuts.toot": "Nieuw bericht schrijven",
"keyboard_shortcuts.unfocus": "Tekst- en zoekveld ontfocussen",
"keyboard_shortcuts.up": "Naar boven in de lijst bewegen",
"lightbox.close": "Sluiten",
@@ -289,12 +289,12 @@
"navigation_bar.blocks": "Geblokkeerde gebruikers",
"navigation_bar.bookmarks": "Bladwijzers",
"navigation_bar.community_timeline": "Lokale tijdlijn",
- "navigation_bar.compose": "Nieuw toot schrijven",
+ "navigation_bar.compose": "Nieuw bericht schrijven",
"navigation_bar.direct": "Directe berichten",
"navigation_bar.discover": "Ontdekken",
"navigation_bar.domain_blocks": "Geblokkeerde domeinen",
"navigation_bar.edit_profile": "Profiel bewerken",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Verkennen",
"navigation_bar.favourites": "Favorieten",
"navigation_bar.filters": "Filters",
"navigation_bar.follow_requests": "Volgverzoeken",
@@ -305,23 +305,23 @@
"navigation_bar.logout": "Uitloggen",
"navigation_bar.mutes": "Genegeerde gebruikers",
"navigation_bar.personal": "Persoonlijk",
- "navigation_bar.pins": "Vastgezette toots",
+ "navigation_bar.pins": "Vastgemaakte berichten",
"navigation_bar.preferences": "Instellingen",
"navigation_bar.public_timeline": "Globale tijdlijn",
"navigation_bar.security": "Beveiliging",
- "notification.admin.sign_up": "{name} signed up",
- "notification.favourite": "{name} voegde jouw toot als favoriet toe",
+ "notification.admin.sign_up": "{name} heeft zich aangemeld",
+ "notification.favourite": "{name} voegde jouw bericht als favoriet toe",
"notification.follow": "{name} volgt jou nu",
"notification.follow_request": "{name} wil jou graag volgen",
"notification.mention": "{name} vermeldde jou",
"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} heeft zojuist een toot geplaatst",
- "notification.update": "{name} edited a post",
+ "notification.reblog": "{name} boostte jouw bericht",
+ "notification.status": "{name} heeft zojuist een bericht geplaatst",
+ "notification.update": "{name} heeft een bericht bewerkt",
"notifications.clear": "Meldingen verwijderen",
"notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Nieuwe aanmeldingen:",
"notifications.column_settings.alert": "Desktopmeldingen",
"notifications.column_settings.favourite": "Favorieten:",
"notifications.column_settings.filter_bar.advanced": "Alle categorieën tonen",
@@ -335,10 +335,10 @@
"notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "In kolom tonen",
"notifications.column_settings.sound": "Geluid afspelen",
- "notifications.column_settings.status": "Nieuwe toots:",
+ "notifications.column_settings.status": "Nieuwe berichten:",
"notifications.column_settings.unread_notifications.category": "Ongelezen meldingen",
"notifications.column_settings.unread_notifications.highlight": "Ongelezen meldingen markeren",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Bewerkingen:",
"notifications.filter.all": "Alles",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favorieten",
@@ -365,7 +365,7 @@
"poll.votes": "{votes, plural, one {# stem} other {# stemmen}}",
"poll_button.add_poll": "Poll toevoegen",
"poll_button.remove_poll": "Poll verwijderen",
- "privacy.change": "Zichtbaarheid van toot aanpassen",
+ "privacy.change": "Zichtbaarheid van bericht aanpassen",
"privacy.direct.long": "Alleen aan vermelde gebruikers tonen",
"privacy.direct.short": "Direct",
"privacy.private.long": "Alleen aan volgers tonen",
@@ -378,100 +378,100 @@
"regeneration_indicator.label": "Aan het laden…",
"regeneration_indicator.sublabel": "Jouw tijdlijn wordt aangemaakt!",
"relative_time.days": "{number}d",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "{number, plural, one {# dag} other {# dagen}} geleden",
+ "relative_time.full.hours": "{number, plural, one {# uur} other {# uur}} geleden",
+ "relative_time.full.just_now": "zojuist",
+ "relative_time.full.minutes": "{number, plural, one {# minuut} other {# minuten}} geleden",
+ "relative_time.full.seconds": "{number, plural, one {# seconde} other {# seconden}} geleden",
"relative_time.hours": "{number}u",
"relative_time.just_now": "nu",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "vandaag",
"reply_indicator.cancel": "Annuleren",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
+ "report.block": "Blokkeren",
+ "report.block_explanation": "Je kunt diens berichten niet zien. Je kunt door diegene niet gevolgd worden en jouw berichten zijn onzichtbaar. Diegene kan zien dat die door jou is geblokkeerd.",
+ "report.categories.other": "Overig",
"report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.categories.violation": "De inhoud overtreedt een of meerdere serverregels",
+ "report.category.subtitle": "Kies wat het meeste overeenkomt",
+ "report.category.title": "Vertel ons wat er met dit {type} aan de hand is",
+ "report.category.title_account": "profiel",
+ "report.category.title_status": "bericht",
+ "report.close": "Klaar",
+ "report.comment.title": "Zijn er nog andere dingen waarvan je denkt dat wij dat moeten weten?",
"report.forward": "Naar {target} doorsturen",
"report.forward_hint": "Het account bevindt zich op een andere server. Wil je daar eveneens een geanonimiseerde kopie van deze rapportage naar toe sturen?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "Negeren",
+ "report.mute_explanation": "Je kunt diens berichten niet zien. Je kunt nog wel gevolgd worden en jouw berichten zijn nog zichtbaar, maar diegene kan niet zien dat die wordt genegeerd.",
+ "report.next": "Volgende",
"report.placeholder": "Extra opmerkingen",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "Ik vind het niet leuk",
+ "report.reasons.dislike_description": "Het is iets wat je niet wilt zien",
+ "report.reasons.other": "Het is iets anders",
+ "report.reasons.other_description": "Het probleem past niet in een andere categorie",
+ "report.reasons.spam": "Het is spam",
+ "report.reasons.spam_description": "Schadelijke links, reclame, misleiding of herhalende antwoorden",
+ "report.reasons.violation": "Het schendt de serverregels",
+ "report.reasons.violation_description": "Je weet dat het specifieke regels schendt",
+ "report.rules.subtitle": "Selecteer wat van toepassing is",
+ "report.rules.title": "Welke regels worden geschonden?",
+ "report.statuses.subtitle": "Selecteer wat van toepassing is",
+ "report.statuses.title": "Zijn er berichten die deze rapportage ondersteunen?",
"report.submit": "Verzenden",
"report.target": "{target} rapporteren",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Hier zijn jouw opties waarmee je kunt bepalen wat je in Mastodon wilt zien:",
+ "report.thanks.take_action_actionable": "Terwijl wij jouw rapportage beroordelen, kun je deze acties ondernemen tegen @{name}:",
+ "report.thanks.title": "Wil je dit niet zien?",
+ "report.thanks.title_actionable": "Dank je voor het rapporteren. Wij gaan er naar kijken.",
+ "report.unfollow": "@{name} ontvolgen",
+ "report.unfollow_explanation": "Je volgt dit account. Om diens berichten niet meer op jouw starttijdlijn te zien, kun je diegene ontvolgen.",
"search.placeholder": "Zoeken",
"search_popout.search_format": "Geavanceerd zoeken",
- "search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken in jouw toots, gebooste toots, favorieten en in toots waarin je bent vermeldt, en tevens naar gebruikersnamen, weergavenamen en hashtags.",
+ "search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken in jouw berichten, gebooste berichten, favorieten en in berichten waarin je bent vermeldt, en tevens naar gebruikersnamen, weergavenamen en hashtags.",
"search_popout.tips.hashtag": "hashtag",
- "search_popout.tips.status": "toot",
+ "search_popout.tips.status": "bericht",
"search_popout.tips.text": "Gebruik gewone tekst om te zoeken op weergavenamen, gebruikersnamen en hashtags",
"search_popout.tips.user": "gebruiker",
"search_results.accounts": "Gebruikers",
- "search_results.all": "All",
+ "search_results.all": "Alles",
"search_results.hashtags": "Hashtags",
- "search_results.nothing_found": "Could not find anything for these search terms",
- "search_results.statuses": "Toots",
- "search_results.statuses_fts_disabled": "Het zoeken in toots is op deze Mastodon-server niet ingeschakeld.",
+ "search_results.nothing_found": "Deze zoektermen leveren geen resultaat op",
+ "search_results.statuses": "Berichten",
+ "search_results.statuses_fts_disabled": "Het zoeken in berichten is op deze Mastodon-server niet ingeschakeld.",
"search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
"status.admin_account": "Moderatie-omgeving van @{name} openen",
- "status.admin_status": "Deze toot in de moderatie-omgeving openen",
+ "status.admin_status": "Dit bericht in de moderatie-omgeving openen",
"status.block": "@{name} blokkeren",
"status.bookmark": "Bladwijzer toevoegen",
"status.cancel_reblog_private": "Niet langer boosten",
- "status.cannot_reblog": "Deze toot kan niet geboost worden",
- "status.copy": "Link naar toot kopiëren",
+ "status.cannot_reblog": "Dit bericht kan niet geboost worden",
+ "status.copy": "Link naar bericht kopiëren",
"status.delete": "Verwijderen",
"status.detailed_status": "Uitgebreide gespreksweergave",
"status.direct": "@{name} een direct bericht sturen",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edit": "Bewerken",
+ "status.edited": "Bewerkt op {date}",
+ "status.edited_x_times": "{count, plural, one {{count} keer} other {{count} keer}} bewerkt",
"status.embed": "Insluiten",
"status.favourite": "Favoriet",
"status.filtered": "Gefilterd",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "{name} plaatste dit {date}",
+ "status.history.edited": "{name} bewerkte dit {date}",
"status.load_more": "Meer laden",
"status.media_hidden": "Media verborgen",
"status.mention": "@{name} vermelden",
"status.more": "Meer",
"status.mute": "@{name} negeren",
"status.mute_conversation": "Negeer gesprek",
- "status.open": "Volledige toot tonen",
+ "status.open": "Volledig bericht tonen",
"status.pin": "Aan profielpagina vastmaken",
- "status.pinned": "Vastgemaakte toot",
+ "status.pinned": "Vastgemaakt bericht",
"status.read_more": "Meer lezen",
"status.reblog": "Boosten",
"status.reblog_private": "Boost naar oorspronkelijke ontvangers",
"status.reblogged_by": "{name} boostte",
- "status.reblogs.empty": "Niemand heeft deze toot nog geboost. Wanneer iemand dit doet, valt dat hier te zien.",
+ "status.reblogs.empty": "Niemand heeft dit bericht nog geboost. Wanneer iemand dit doet, valt dat hier te zien.",
"status.redraft": "Verwijderen en herschrijven",
"status.remove_bookmark": "Bladwijzer verwijderen",
"status.reply": "Reageren",
@@ -502,7 +502,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource} van andere servers worden niet getoond.",
"timeline_hint.resources.followers": "Volgers",
"timeline_hint.resources.follows": "Volgend",
- "timeline_hint.resources.statuses": "Oudere toots",
+ "timeline_hint.resources.statuses": "Oudere berichten",
"trends.counter_by_accounts": "{count, plural, one {{counter} persoon} other {{counter} personen}} zijn aan het praten",
"trends.trending_now": "Huidige trends",
"ui.beforeunload": "Je concept gaat verloren wanneer je Mastodon verlaat.",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index c597aa20d..2b9755c06 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -18,7 +18,7 @@
"account.followers": "Seguidores",
"account.followers.empty": "Nada aqui.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
- "account.following": "Following",
+ "account.following": "Seguindo",
"account.following_counter": "{count, plural, one {segue {counter}} other {segue {counter}}}",
"account.follows.empty": "Nada aqui.",
"account.follows_you": "te segue",
@@ -41,14 +41,14 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Desbloquear domínio {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "Remover",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Dessilenciar @{name}",
"account.unmute_notifications": "Mostrar notificações de @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Reativar",
"account_note.placeholder": "Nota pessoal sobre este perfil aqui",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.daily_retention": "Taxa de retenção de usuários por dia, após a inscrição",
"admin.dashboard.monthly_retention": "Taxa de retenção de usuários por mês, após a inscrição",
"admin.dashboard.retention.average": "Média",
"admin.dashboard.retention.cohort": "Mês de inscrição",
@@ -168,7 +168,7 @@
"empty_column.community": "A linha local está vazia. Publique algo para começar!",
"empty_column.direct": "Nada aqui. Quando você enviar ou receber toots diretos, eles aparecerão aqui.",
"empty_column.domain_blocks": "Nada aqui.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!",
"empty_column.favourited_statuses": "Nada aqui. Quando você favoritar um toot, ele aparecerá aqui.",
"empty_column.favourites": "Nada aqui. Quando alguém favoritar, o autor aparecerá aqui.",
"empty_column.follow_recommendations": "Parece que não há sugestões para você. Tente usar a pesquisa para encontrar pessoas que você possa conhecer ou explorar hashtags.",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "Descobrir",
"navigation_bar.domain_blocks": "Domínios bloqueados",
"navigation_bar.edit_profile": "Editar perfil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palavras filtradas",
"navigation_bar.follow_requests": "Seguidores pendentes",
@@ -390,42 +390,42 @@
"relative_time.today": "hoje",
"reply_indicator.cancel": "Cancelar",
"report.block": "Bloquear",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block_explanation": "Você não verá suas postagens. Eles não poderão ver suas postagens ou segui-lo. Eles serão capazes de perceber que estão bloqueados.",
"report.categories.other": "Outro",
"report.categories.spam": "Spam",
"report.categories.violation": "O conteúdo viola uma ou mais regras do servidor",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.subtitle": "Escolha a alternativa de melhor correspondência",
+ "report.category.title": "Conte-nos o que está acontecendo com esse {type}",
"report.category.title_account": "perfil",
"report.category.title_status": "publicação",
"report.close": "Concluído",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.comment.title": "Há algo mais que você acredita que devemos saber?",
"report.forward": "Encaminhar para {target}",
"report.forward_hint": "A conta está em outra instância. Enviar uma cópia anônima da denúncia para lá?",
"report.mute": "Silenciar",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.mute_explanation": "Você não verá suas postagens. Eles ainda podem seguir você e ver suas postagens e não saberão que estão silenciados.",
"report.next": "Próximo",
"report.placeholder": "Comentários adicionais aqui",
"report.reasons.dislike": "Eu não gosto disso",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
+ "report.reasons.dislike_description": "Não é algo que você quer ver",
+ "report.reasons.other": "É outra coisa",
"report.reasons.other_description": "O problema não se encaixa em outras categorias",
"report.reasons.spam": "É spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
+ "report.reasons.spam_description": "Links maliciosos, envolvimento falso ou respostas repetitivas",
+ "report.reasons.violation": "Viola as regras do servidor",
"report.reasons.violation_description": "Você está ciente de que isso quebra regras específicas",
"report.rules.subtitle": "Selecione tudo que se aplica",
- "report.rules.title": "Which rules are being violated?",
+ "report.rules.title": "Que regras estão sendo violadas?",
"report.statuses.subtitle": "Selecione tudo que se aplica",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.statuses.title": "Existem postagens que respaldam esse relatório?",
"report.submit": "Enviar",
"report.target": "Denunciando {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action": "Aqui estão suas opções para controlar o que você vê no Mastodon:",
"report.thanks.take_action_actionable": "Enquanto revisamos isso, você pode tomar medidas contra @{name}:",
"report.thanks.title": "Não quer ver isto?",
"report.thanks.title_actionable": "Obrigado por reportar. Vamos analisar.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.unfollow": "Deixar de seguir @{name}",
+ "report.unfollow_explanation": "Você está seguindo esta conta. Para não mais ver os posts dele em sua página inicial, deixe de segui-lo.",
"search.placeholder": "Pesquisar",
"search_popout.search_format": "Formato de pesquisa avançada",
"search_popout.tips.full_text": "Texto simples retorna toots que você escreveu, favoritou, deu boost, ou em que foi mencionado, assim como nomes de usuário e de exibição, e hashtags correspondentes.",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 1bbc2918c..79fac6eb5 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -18,7 +18,7 @@
"account.followers": "Подписчики",
"account.followers.empty": "На этого пользователя пока никто не подписан.",
"account.followers_counter": "{count, plural, one {{counter} подписчик} many {{counter} подписчиков} other {{counter} подписчика}}",
- "account.following": "Following",
+ "account.following": "Подписки",
"account.following_counter": "{count, plural, one {{counter} подписка} many {{counter} подписок} other {{counter} подписки}}",
"account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
"account.follows_you": "Подписан(а) на вас",
@@ -95,7 +95,7 @@
"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": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
"compose_form.lock_disclaimer.lock": "не закрыта",
"compose_form.placeholder": "О чём думаете?",
"compose_form.poll.add_option": "Добавить вариант",
@@ -390,42 +390,42 @@
"relative_time.today": "сегодня",
"reply_indicator.cancel": "Отмена",
"report.block": "Заблокировать",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block_explanation": "В перестаните видеть посты этого пользователя, а он(а) больше не сможет подписаться на вас и читать ваши посты. Он(а) сможет понять что вы заблокировали его/её.",
"report.categories.other": "Другое",
"report.categories.spam": "Спам",
"report.categories.violation": "Содержимое нарушает одно или несколько правил узла",
"report.category.subtitle": "Выберите наиболее подходящее",
- "report.category.title": "Расскажите нам, что происходит с {type}",
- "report.category.title_account": "профиль",
- "report.category.title_status": "пост",
+ "report.category.title": "Расскажите нам, что не так с {type}",
+ "report.category.title_account": "этим профилем",
+ "report.category.title_status": "этим постом",
"report.close": "Готово",
- "report.comment.title": "Есть что-нибудь еще, что мы должны знать?",
- "report.forward": "Переслать в {target}",
+ "report.comment.title": "Есть ли что-нибудь ещё, что нам стоит знать?",
+ "report.forward": "Переслать на {target}",
"report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?",
- "report.mute": "Mute",
+ "report.mute": "Игнорировать",
"report.mute_explanation": "Вы не будете видеть их посты. Они по-прежнему могут подписываться на вас и видеть ваши посты, но не будут знать, что они в списке игнорируемых.",
"report.next": "Далее",
- "report.placeholder": "Комментарий",
+ "report.placeholder": "Дополнительные комментарии",
"report.reasons.dislike": "Мне не нравится",
"report.reasons.dislike_description": "Не хотел(а) бы видеть такой контент",
"report.reasons.other": "Другое",
- "report.reasons.other_description": "Проблема не подпадает под другие категории",
+ "report.reasons.other_description": "Проблема не попадает ни под одну из категорий",
"report.reasons.spam": "Это спам",
- "report.reasons.spam_description": "Вредоносные ссылки, поддельные действия или повторяющиеся ответы",
+ "report.reasons.spam_description": "Вредоносные ссылки, фальшивое взаимодействие или повторяющиеся ответы",
"report.reasons.violation": "Нарушаются правила сервера",
"report.reasons.violation_description": "Вы знаете, что подобное нарушает определенные правила",
"report.rules.subtitle": "Выберите все подходящие варианты",
"report.rules.title": "Какие правила нарушены?",
"report.statuses.subtitle": "Выберите все подходящие варианты",
- "report.statuses.title": "Есть ли сообщения, подтверждающие основания этой жалобы?",
+ "report.statuses.title": "Выберите посты, которые относятся к вашей жалобе.",
"report.submit": "Отправить",
"report.target": "Жалоба на {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.take_action": "Вот несколько опций управления тем, что вы видите в Mastodon:",
+ "report.thanks.take_action_actionable": "Пока мы рассматриваем его, вот действия, которые вы можете предпринять лично против @{name}:",
"report.thanks.title": "Не хотите видеть это?",
"report.thanks.title_actionable": "Спасибо за обращение, мы его рассмотрим.",
"report.unfollow": "Отписаться от @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.",
"search.placeholder": "Поиск",
"search_popout.search_format": "Продвинутый формат поиска",
"search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 60b513aa1..860e65413 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -389,7 +389,7 @@
"relative_time.seconds": "{number}sek",
"relative_time.today": "dnes",
"reply_indicator.cancel": "Zrušiť",
- "report.block": "Block",
+ "report.block": "Blokuj",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Other",
"report.categories.spam": "Spam",
@@ -424,7 +424,7 @@
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
"report.thanks.title": "Nechceš to vidieť?",
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
+ "report.unfollow": "Nesleduj @{name}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Hľadaj",
"search_popout.search_format": "Pokročilé vyhľadávanie",
@@ -434,7 +434,7 @@
"search_popout.tips.text": "Vráti jednoduchý textový výpis zhodujúcich sa mien, prezývok a haštagov",
"search_popout.tips.user": "užívateľ",
"search_results.accounts": "Ľudia",
- "search_results.all": "All",
+ "search_results.all": "Všetky",
"search_results.hashtags": "Haštagy",
"search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Príspevky",
@@ -451,7 +451,7 @@
"status.detailed_status": "Podrobný náhľad celej konverzácie",
"status.direct": "Priama správa pre @{name}",
"status.edit": "Uprav",
- "status.edited": "Edited {date}",
+ "status.edited": "Upravené {date}",
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Vložiť",
"status.favourite": "Páči sa mi",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index d1047f5da..ce3cdabd0 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -18,7 +18,7 @@
"account.followers": "Ndjekës",
"account.followers.empty": "Këtë përdorues ende s’e ndjek kush.",
"account.followers_counter": "{count, plural, one {{counter} Ndjekës} other {{counter} Ndjekës}}",
- "account.following": "Following",
+ "account.following": "Ndjekje",
"account.following_counter": "{count, plural, one {{counter} i Ndjekur} other {{counter} të Ndjekur}}",
"account.follows.empty": "Ky përdorues ende s’ndjek kënd.",
"account.follows_you": "Ju ndjek",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {{counter} Mesazh} other {{counter} Mesazhe}}",
"account.unblock": "Zhbllokoje @{name}",
"account.unblock_domain": "Zhblloko përkatësinë {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Zhbllokoje",
"account.unendorse": "Mos e përfshi në profil",
"account.unfollow": "Resht së ndjekuri",
"account.unmute": "Ktheji zërin @{name}",
"account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Çheshtoje",
"account_note.placeholder": "Klikoni për të shtuar shënim",
"admin.dashboard.daily_retention": "Shkallë mbajtjeje përdoruesi, në ditë, pas regjistrimit",
"admin.dashboard.monthly_retention": "Shkallë mbajtjeje përdoruesi, në muaj, pas regjistrimit",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "Zbuloni",
"navigation_bar.domain_blocks": "Përkatësi të bllokuara",
"navigation_bar.edit_profile": "Përpunoni profilin",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Eksploroni",
"navigation_bar.favourites": "Të parapëlqyer",
"navigation_bar.filters": "Fjalë të heshtuara",
"navigation_bar.follow_requests": "Kërkesa për ndjekje",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 22ecf7dfe..f8477e8fd 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -128,7 +128,7 @@
"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": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน",
@@ -171,7 +171,7 @@
"empty_column.explore_statuses": "ไม่มีสิ่งใดที่กำลังนิยมในตอนนี้ กลับมาตรวจสอบในภายหลัง!",
"empty_column.favourited_statuses": "คุณยังไม่มีโพสต์ที่ชื่นชอบใด ๆ เมื่อคุณชื่นชอบโพสต์ โพสต์จะปรากฏที่นี่",
"empty_column.favourites": "ยังไม่มีใครชื่นชอบโพสต์นี้ เมื่อใครสักคนชื่นชอบ เขาจะปรากฏที่นี่",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_recommendations": "ดูเหมือนว่าจะไม่สามารถสร้างข้อเสนอแนะสำหรับคุณ คุณสามารถลองใช้การค้นหาเพื่อมองหาผู้คนที่คุณอาจรู้จักหรือสำรวจแฮชแท็กที่กำลังนิยม",
"empty_column.follow_requests": "คุณยังไม่มีคำขอติดตามใด ๆ เมื่อคุณได้รับคำขอ คำขอจะปรากฏที่นี่",
"empty_column.hashtag": "ยังไม่มีสิ่งใดในแฮชแท็กนี้",
"empty_column.home": "เส้นเวลาหน้าแรกของคุณว่างเปล่า! ติดตามผู้คนเพิ่มเติมเพื่อเติมเส้นเวลาให้เต็ม {suggestions}",
@@ -180,7 +180,7 @@
"empty_column.lists": "คุณยังไม่มีรายการใด ๆ เมื่อคุณสร้างรายการ รายการจะปรากฏที่นี่",
"empty_column.mutes": "คุณยังไม่ได้ซ่อนผู้ใช้ใด ๆ",
"empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ เมื่อผู้คนอื่น ๆ โต้ตอบกับคุณ คุณจะเห็นการแจ้งเตือนที่นี่",
- "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมให้เต็ม",
+ "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมเส้นเวลาให้เต็ม",
"error.unexpected_crash.explanation": "เนื่องจากข้อบกพร่องในโค้ดของเราหรือปัญหาความเข้ากันได้ของเบราว์เซอร์ จึงไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง",
"error.unexpected_crash.explanation_addons": "ไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง ข้อผิดพลาดนี้เป็นไปได้ว่าเกิดจากส่วนเสริมของเบราว์เซอร์หรือเครื่องมือการแปลอัตโนมัติ",
"error.unexpected_crash.next_steps": "ลองรีเฟรชหน้า หากนั่นไม่ช่วย คุณอาจยังสามารถใช้ Mastodon ได้ผ่านเบราว์เซอร์อื่นหรือแอป",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "ค้นพบ",
"navigation_bar.domain_blocks": "โดเมนที่ปิดกั้นอยู่",
"navigation_bar.edit_profile": "แก้ไขโปรไฟล์",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "สำรวจ",
"navigation_bar.favourites": "รายการโปรด",
"navigation_bar.filters": "คำที่ซ่อนอยู่",
"navigation_bar.follow_requests": "คำขอติดตาม",
@@ -403,7 +403,7 @@
"report.forward": "ส่งต่อไปยัง {target}",
"report.forward_hint": "บัญชีมาจากเซิร์ฟเวอร์อื่น ส่งสำเนาของรายงานที่ไม่ระบุตัวตนไปที่นั่นด้วย?",
"report.mute": "ซ่อน",
- "report.mute_explanation": "คุณจะไม่เห็นโพสต์ของเขา เขายังสามารถติดตามคุณและเห็นโพสต์ของคุณและจะไม่ทราบว่ามีการซ่อนเขา",
+ "report.mute_explanation": "คุณจะไม่เห็นโพสต์ของเขา เขายังคงสามารถติดตามคุณและเห็นโพสต์ของคุณและจะไม่ทราบว่ามีการซ่อนเขา",
"report.next": "ถัดไป",
"report.placeholder": "ความคิดเห็นเพิ่มเติม",
"report.reasons.dislike": "ฉันไม่ชอบโพสต์",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 41f44fd12..e2e1386e6 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -18,7 +18,7 @@
"account.followers": "Підписники",
"account.followers.empty": "Ніхто ще не підписався на цього користувача.",
"account.followers_counter": "{count, plural, one {{counter} Підписник} few {{counter} Підписники} many {{counter} Підписників} other {{counter} Підписники}}",
- "account.following": "Following",
+ "account.following": "Стежите",
"account.following_counter": "{count, plural, one {{counter} Підписка} few {{counter} Підписки} many {{counter} Підписок} other {{counter} Підписки}}",
"account.follows.empty": "Цей користувач ще ні на кого не підписався.",
"account.follows_you": "Підписаний(-а) на вас",
@@ -41,7 +41,7 @@
"account.statuses_counter": "{count, plural, one {{counter} Пост} few {{counter} Пости} many {{counter} Постів} other {{counter} Пости}}",
"account.unblock": "Розблокувати @{name}",
"account.unblock_domain": "Розблокувати {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Розблокувати",
"account.unendorse": "Не публікувати у профілі",
"account.unfollow": "Відписатися",
"account.unmute": "Зняти глушення з @{name}",
@@ -187,7 +187,7 @@
"error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.",
"errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
"errors.unexpected_crash.report_issue": "Повідомити про проблему",
- "explore.search_results": "Search results",
+ "explore.search_results": "Результати пошуку",
"explore.suggested_follows": "Для вас",
"explore.title": "Огляд",
"explore.trending_links": "Новини",
@@ -309,7 +309,7 @@
"navigation_bar.preferences": "Налаштування",
"navigation_bar.public_timeline": "Глобальна стрічка",
"navigation_bar.security": "Безпека",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "{name} приєднується",
"notification.favourite": "{name} вподобав(-ла) ваш допис",
"notification.follow": "{name} підписався(-лась) на вас",
"notification.follow_request": "{name} відправив(-ла) запит на підписку",
@@ -321,7 +321,7 @@
"notification.update": "{name} змінює допис",
"notifications.clear": "Очистити сповіщення",
"notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Нові реєстрації:",
"notifications.column_settings.alert": "Сповіщення на комп'ютері",
"notifications.column_settings.favourite": "Вподобане:",
"notifications.column_settings.filter_bar.advanced": "Показати всі категорії",
@@ -389,7 +389,7 @@
"relative_time.seconds": "{number}с",
"relative_time.today": "сьогодні",
"reply_indicator.cancel": "Відмінити",
- "report.block": "Block",
+ "report.block": "Заблокувати",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Інше",
"report.categories.spam": "Спам",
@@ -402,21 +402,21 @@
"report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Надіслати до {target}",
"report.forward_hint": "Це акаунт з іншого серверу. Відправити анонімізовану копію скарги і туди?",
- "report.mute": "Mute",
+ "report.mute": "Заглушити",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
"report.next": "Далі",
"report.placeholder": "Додаткові коментарі",
"report.reasons.dislike": "Мені це не подобається",
"report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
+ "report.reasons.other": "Це щось інше",
"report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
+ "report.reasons.spam": "Це спам",
"report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
"report.reasons.violation": "It violates server rules",
"report.reasons.violation_description": "You are aware that it breaks specific rules",
"report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
+ "report.rules.title": "Які правила порушено?",
+ "report.statuses.subtitle": "Виберіть усі варіанти, що підходять",
"report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Відправити",
"report.target": "Скаржимося на {target}",
@@ -424,7 +424,7 @@
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
"report.thanks.title": "Don't want to see this?",
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
+ "report.unfollow": "Відписатися від @{name}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Пошук",
"search_popout.search_format": "Розширений формат пошуку",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index a997a1747..4e4100305 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -8,7 +8,7 @@
"account.blocked": "Đã chặn",
"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.direct": "Nhắn riêng @{name}",
"account.disable_notifications": "Không thông báo khi @{name} đăng tút",
"account.domain_blocked": "Người đã chặn",
"account.edit_profile": "Chỉnh sửa trang cá nhân",
@@ -49,9 +49,9 @@
"account.unmute_short": "Bỏ ẩn",
"account_note.placeholder": "Nhấn để thêm",
"admin.dashboard.daily_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo ngày",
- "admin.dashboard.monthly_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo tháng",
+ "admin.dashboard.monthly_retention": "Tỉ lệ người dùng ở lại sau khi đăng ký",
"admin.dashboard.retention.average": "Trung bình",
- "admin.dashboard.retention.cohort": "Đăng ký tháng",
+ "admin.dashboard.retention.cohort": "Tháng đăng ký",
"admin.dashboard.retention.cohort_size": "Người dùng mới",
"alert.rate_limited.message": "Vui lòng thử lại sau {retry_time, time, medium}.",
"alert.rate_limited.title": "Vượt giới hạn",
@@ -179,7 +179,7 @@
"empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.",
"empty_column.lists": "Bạn chưa tạo danh sách nào.",
"empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.",
- "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn tin cho một ai đó.",
+ "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho 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 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ữ.",
@@ -188,7 +188,7 @@
"errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard",
"errors.unexpected_crash.report_issue": "Báo cáo lỗi",
"explore.search_results": "Kết quả tìm kiếm",
- "explore.suggested_follows": "Đề xuất cho bạn",
+ "explore.suggested_follows": "Dành cho bạn",
"explore.title": "Khám phá",
"explore.trending_links": "Tin tức",
"explore.trending_statuses": "Tút",
@@ -294,7 +294,7 @@
"navigation_bar.discover": "Khám phá",
"navigation_bar.domain_blocks": "Máy chủ đã ẩn",
"navigation_bar.edit_profile": "Trang cá nhân",
- "navigation_bar.explore": "Khám phá",
+ "navigation_bar.explore": "Xu hướng",
"navigation_bar.favourites": "Thích",
"navigation_bar.filters": "Bộ lọc từ ngữ",
"navigation_bar.follow_requests": "Yêu cầu theo dõi",
@@ -309,7 +309,7 @@
"navigation_bar.preferences": "Cài đặt",
"navigation_bar.public_timeline": "Thế giới",
"navigation_bar.security": "Bảo mật",
- "notification.admin.sign_up": "{name} vừa đăng ký",
+ "notification.admin.sign_up": "{name} đăng ký máy chủ của bạn",
"notification.favourite": "{name} thích tút của bạn",
"notification.follow": "{name} theo dõi bạn",
"notification.follow_request": "{name} yêu cầu theo dõi bạn",
@@ -367,7 +367,7 @@
"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.direct.short": "Nhắn riêng",
"privacy.private.long": "Dành riêng cho người theo dõi",
"privacy.private.short": "Riêng tư",
"privacy.public.long": "Hiện trên bảng tin máy chủ",
@@ -449,7 +449,7 @@
"status.copy": "Sao chép URL",
"status.delete": "Xóa",
"status.detailed_status": "Xem chi tiết thêm",
- "status.direct": "Nhắn tin @{name}",
+ "status.direct": "Nhắn riêng @{name}",
"status.edit": "Sửa",
"status.edited": "Đã sửa {date}",
"status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}",
@@ -483,7 +483,7 @@
"status.show_less_all": "Thu gọn toàn bộ",
"status.show_more": "Xem thêm",
"status.show_more_all": "Hiển thị tất cả",
- "status.show_thread": "Toàn chủ đề",
+ "status.show_thread": "Xem chuỗi tút này",
"status.uncached_media_warning": "Uncached",
"status.unmute_conversation": "Quan tâm",
"status.unpin": "Bỏ ghim trên trang cá nhân",
diff --git a/app/javascript/mastodon/locales/whitelist_kmr.json b/app/javascript/mastodon/locales/whitelist_ckb.json
similarity index 100%
rename from app/javascript/mastodon/locales/whitelist_kmr.json
rename to app/javascript/mastodon/locales/whitelist_ckb.json
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index ae0c5e3d4..9e306688e 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -294,7 +294,7 @@
"navigation_bar.discover": "发现",
"navigation_bar.domain_blocks": "已屏蔽的网站",
"navigation_bar.edit_profile": "修改个人资料",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "探索",
"navigation_bar.favourites": "喜欢",
"navigation_bar.filters": "隐藏关键词",
"navigation_bar.follow_requests": "关注请求",
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index dc4d65edd..68e6d2482 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -1306,7 +1306,7 @@ a.sparkline {
width: 50px;
height: 21px;
position: absolute;
- bottom: 8px;
+ bottom: 0;
right: 15px;
background: linear-gradient(to left, $ui-base-color, transparent);
pointer-events: none;
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 7fddbbf51..a8c38a68b 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -596,30 +596,24 @@
display: flex;
align-items: flex-start;
justify-content: space-between;
- opacity: 0;
- transition: opacity .1s ease;
+ }
- .icon-button {
- flex: 0 1 auto;
- color: $secondary-text-color;
- font-size: 14px;
- font-weight: 500;
- padding: 10px;
- font-family: inherit;
+ .icon-button {
+ flex: 0 1 auto;
+ color: $secondary-text-color;
+ font-size: 14px;
+ font-weight: 500;
+ padding: 10px;
+ font-family: inherit;
- &:hover,
- &:focus,
- &:active {
- color: lighten($secondary-text-color, 7%);
- }
- }
-
- &.active {
- opacity: 1;
+ &:hover,
+ &:focus,
+ &:active {
+ color: lighten($secondary-text-color, 7%);
}
}
- &-description {
+ &__warning {
position: absolute;
z-index: 2;
bottom: 0;
@@ -627,34 +621,6 @@
right: 0;
box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
- padding: 10px;
- opacity: 0;
- transition: opacity .1s ease;
-
- textarea {
- background: transparent;
- color: $secondary-text-color;
- border: 0;
- padding: 0;
- margin: 0;
- width: 100%;
- font-family: inherit;
- font-size: 14px;
- font-weight: 500;
-
- &:focus {
- color: $white;
- }
-
- &::placeholder {
- opacity: 0.75;
- color: $secondary-text-color;
- }
- }
-
- &.active {
- opacity: 1;
- }
}
}
@@ -902,7 +868,8 @@
.status__content__spoiler-link {
background: $action-button-color;
- &:hover {
+ &:hover,
+ &:focus {
background: lighten($action-button-color, 7%);
text-decoration: none;
}
@@ -1014,7 +981,7 @@
text-transform: uppercase;
line-height: 20px;
cursor: pointer;
- vertical-align: middle;
+ vertical-align: top;
}
.status__wrapper--filtered {
@@ -1174,7 +1141,8 @@
color: $primary-text-color;
background: $ui-primary-color;
- &:hover {
+ &:hover,
+ &:focus {
background: lighten($ui-primary-color, 8%);
}
}
@@ -1687,7 +1655,8 @@ a.account__display-name {
background: $ui-base-lighter-color;
color: $inverted-text-color;
- &:hover {
+ &:hover,
+ &:focus {
background: lighten($ui-base-lighter-color, 7%);
text-decoration: none;
}
@@ -5328,6 +5297,15 @@ a.status-card.compact:hover {
color: $inverted-text-color;
}
+ .status__content__spoiler-link {
+ color: $primary-text-color;
+ background: $ui-primary-color;
+
+ &:hover {
+ background: lighten($ui-primary-color, 8%);
+ }
+ }
+
.dialog-option .poll__input {
border-color: $inverted-text-color;
color: $ui-secondary-color;
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 11cd58119..44cd11cfd 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class ActivityPub::Activity::Create < ActivityPub::Activity
+ include FormattingHelper
+
def perform
dereference_object!
@@ -433,7 +435,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def converted_text
- Formatter.instance.linkify([@status_parser.title.presence, @status_parser.spoiler_text.presence, @status_parser.url || @status_parser.uri].compact.join("\n\n"))
+ linkify([@status_parser.title.presence, @status_parser.spoiler_text.presence, @status_parser.url || @status_parser.uri].compact.join("\n\n"))
end
def unsupported_media_type?(mime_type)
diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb
index 5802ead5d..5b3238ece 100644
--- a/app/lib/activitypub/activity/update.rb
+++ b/app/lib/activitypub/activity/update.rb
@@ -8,6 +8,8 @@ class ActivityPub::Activity::Update < ActivityPub::Activity
update_account
elsif equals_or_includes_any?(@object['type'], %w(Note Question))
update_status
+ elsif converted_object_type?
+ Status.find_by(uri: object_uri, account_id: @account.id)
end
end
diff --git a/app/lib/activitypub/parser/media_attachment_parser.rb b/app/lib/activitypub/parser/media_attachment_parser.rb
index 1798e58a4..30bea1f0e 100644
--- a/app/lib/activitypub/parser/media_attachment_parser.rb
+++ b/app/lib/activitypub/parser/media_attachment_parser.rb
@@ -27,7 +27,9 @@ class ActivityPub::Parser::MediaAttachmentParser
end
def description
- @json['summary'].presence || @json['name'].presence
+ str = @json['summary'].presence || @json['name'].presence
+ str = str.strip[0...MediaAttachment::MAX_DESCRIPTION_LENGTH] if str.present?
+ str
end
def focus
diff --git a/app/lib/admin/system_check.rb b/app/lib/admin/system_check.rb
index afb20cb47..877a42ef6 100644
--- a/app/lib/admin/system_check.rb
+++ b/app/lib/admin/system_check.rb
@@ -5,6 +5,7 @@ class Admin::SystemCheck
Admin::SystemCheck::DatabaseSchemaCheck,
Admin::SystemCheck::SidekiqProcessCheck,
Admin::SystemCheck::RulesCheck,
+ Admin::SystemCheck::ElasticsearchCheck,
].freeze
def self.perform
diff --git a/app/lib/admin/system_check/elasticsearch_check.rb b/app/lib/admin/system_check/elasticsearch_check.rb
new file mode 100644
index 000000000..1b48a5415
--- /dev/null
+++ b/app/lib/admin/system_check/elasticsearch_check.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
+ def pass?
+ return true unless Chewy.enabled?
+
+ running_version.present? && compatible_version?
+ end
+
+ def message
+ if running_version.present?
+ Admin::SystemCheck::Message.new(:elasticsearch_version_check, I18n.t('admin.system_checks.elasticsearch_version_check.version_comparison', running_version: running_version, required_version: required_version))
+ else
+ Admin::SystemCheck::Message.new(:elasticsearch_running_check)
+ end
+ end
+
+ private
+
+ def running_version
+ @running_version ||= begin
+ Chewy.client.info['version']['number']
+ rescue Faraday::ConnectionFailed
+ nil
+ end
+ end
+
+ def required_version
+ '7.x'
+ end
+
+ def compatible_version?
+ Gem::Version.new(running_version) >= Gem::Version.new(required_version)
+ end
+
+ def missing_queues
+ @missing_queues ||= Sidekiq::ProcessSet.new.reduce(SIDEKIQ_QUEUES) { |queues, process| queues - process['queues'] }
+ end
+end
diff --git a/app/lib/emoji_formatter.rb b/app/lib/emoji_formatter.rb
new file mode 100644
index 000000000..f808f3a22
--- /dev/null
+++ b/app/lib/emoji_formatter.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+class EmojiFormatter
+ include RoutingHelper
+
+ DISALLOWED_BOUNDING_REGEX = /[[:alnum:]:]/.freeze
+
+ attr_reader :html, :custom_emojis, :options
+
+ # @param [ActiveSupport::SafeBuffer] html
+ # @param [Array] custom_emojis
+ # @param [Hash] options
+ # @option options [Boolean] :animate
+ def initialize(html, custom_emojis, options = {})
+ raise ArgumentError unless html.html_safe?
+
+ @html = html
+ @custom_emojis = custom_emojis
+ @options = options
+ end
+
+ def to_s
+ return html if custom_emojis.empty? || html.blank?
+
+ i = -1
+ tag_open_index = nil
+ inside_shortname = false
+ shortname_start_index = -1
+ invisible_depth = 0
+ last_index = 0
+ result = ''.dup
+
+ while i + 1 < html.size
+ i += 1
+
+ if invisible_depth.zero? && inside_shortname && html[i] == ':'
+ inside_shortname = false
+ shortcode = html[shortname_start_index + 1..i - 1]
+ char_after = html[i + 1]
+
+ next unless (char_after.nil? || !DISALLOWED_BOUNDING_REGEX.match?(char_after)) && (emoji = emoji_map[shortcode])
+
+ result << html[last_index..shortname_start_index - 1] if shortname_start_index.positive?
+ result << image_for_emoji(shortcode, emoji)
+ last_index = i + 1
+ elsif tag_open_index && html[i] == '>'
+ tag = html[tag_open_index..i]
+ tag_open_index = nil
+
+ if invisible_depth.positive?
+ invisible_depth += count_tag_nesting(tag)
+ elsif tag == ''
+ invisible_depth = 1
+ end
+ elsif html[i] == '<'
+ tag_open_index = i
+ inside_shortname = false
+ elsif !tag_open_index && html[i] == ':' && (i.zero? || !DISALLOWED_BOUNDING_REGEX.match?(html[i - 1]))
+ inside_shortname = true
+ shortname_start_index = i
+ end
+ end
+
+ result << html[last_index..-1]
+
+ result.html_safe # rubocop:disable Rails/OutputSafety
+ end
+
+ private
+
+ def emoji_map
+ @emoji_map ||= custom_emojis.each_with_object({}) { |e, h| h[e.shortcode] = [full_asset_url(e.image.url), full_asset_url(e.image.url(:static))] }
+ end
+
+ def count_tag_nesting(tag)
+ if tag[1] == '/'
+ -1
+ elsif tag[-2] == '/'
+ 0
+ else
+ 1
+ end
+ end
+
+ def image_for_emoji(shortcode, emoji)
+ original_url, static_url = emoji
+
+ if animate?
+ image_tag(original_url, draggable: false, class: 'emojione', alt: ":#{shortcode}:", title: ":#{shortcode}:")
+ else
+ image_tag(original_url, draggable: false, class: 'emojione custom-emoji', alt: ":#{shortcode}:", title: ":#{shortcode}:", data: { original: original_url, static: static_url })
+ end
+ end
+
+ def animate?
+ @options[:animate]
+ end
+end
diff --git a/app/lib/extractor.rb b/app/lib/extractor.rb
index 8020aa916..aea60dae5 100644
--- a/app/lib/extractor.rb
+++ b/app/lib/extractor.rb
@@ -1,22 +1,44 @@
# frozen_string_literal: true
module Extractor
+ MAX_DOMAIN_LENGTH = 253
+
extend Twitter::TwitterText::Extractor
module_function
- # :yields: username, list_slug, start, end
+ def extract_entities_with_indices(text, options = {}, &block)
+ entities = begin
+ extract_urls_with_indices(text, options) +
+ extract_hashtags_with_indices(text, check_url_overlap: false) +
+ extract_mentions_or_lists_with_indices(text) +
+ extract_extra_uris_with_indices(text)
+ end
+
+ return [] if entities.empty?
+
+ entities = remove_overlapping_entities(entities)
+ entities.each(&block) if block_given?
+ entities
+ end
+
def extract_mentions_or_lists_with_indices(text)
- return [] unless Twitter::TwitterText::Regex[:at_signs].match?(text)
+ return [] unless text && Twitter::TwitterText::Regex[:at_signs].match?(text)
possible_entries = []
- text.to_s.scan(Account::MENTION_RE) do |screen_name, _|
+ text.scan(Account::MENTION_RE) do |screen_name, _|
match_data = $LAST_MATCH_INFO
- after = $'
+ after = $'
+
unless Twitter::TwitterText::Regex[:end_mention_match].match?(after)
+ _, domain = screen_name.split('@')
+
+ next if domain.present? && domain.length > MAX_DOMAIN_LENGTH
+
start_position = match_data.char_begin(1) - 1
- end_position = match_data.char_end(1)
+ end_position = match_data.char_end(1)
+
possible_entries << {
screen_name: screen_name,
indices: [start_position, end_position],
@@ -29,36 +51,70 @@ module Extractor
yield mention[:screen_name], mention[:indices].first, mention[:indices].last
end
end
+
possible_entries
end
- def extract_hashtags_with_indices(text, **)
- return [] unless /#/.match?(text)
+ def extract_hashtags_with_indices(text, _options = {})
+ return [] unless text&.index('#')
+
+ possible_entries = []
- tags = []
text.scan(Tag::HASHTAG_RE) do |hash_text, _|
- match_data = $LAST_MATCH_INFO
+ match_data = $LAST_MATCH_INFO
start_position = match_data.char_begin(1) - 1
- end_position = match_data.char_end(1)
- after = $'
+ end_position = match_data.char_end(1)
+ after = $'
+
if %r{\A://}.match?(after)
hash_text.match(/(.+)(https?\Z)/) do |matched|
- hash_text = matched[1]
+ hash_text = matched[1]
end_position -= matched[2].codepoint_length
end
end
- tags << {
+ possible_entries << {
hashtag: hash_text,
indices: [start_position, end_position],
}
end
- tags.each { |tag| yield tag[:hashtag], tag[:indices].first, tag[:indices].last } if block_given?
- tags
+ if block_given?
+ possible_entries.each do |tag|
+ yield tag[:hashtag], tag[:indices].first, tag[:indices].last
+ end
+ end
+
+ possible_entries
end
def extract_cashtags_with_indices(_text)
- [] # always returns empty array
+ []
+ end
+
+ def extract_extra_uris_with_indices(text)
+ return [] unless text&.index(':')
+
+ possible_entries = []
+
+ text.scan(Twitter::TwitterText::Regex[:valid_extended_uri]) do
+ valid_uri_match_data = $LAST_MATCH_INFO
+
+ start_position = valid_uri_match_data.char_begin(3)
+ end_position = valid_uri_match_data.char_end(3)
+
+ possible_entries << {
+ url: valid_uri_match_data[3],
+ indices: [start_position, end_position],
+ }
+ end
+
+ if block_given?
+ possible_entries.each do |url|
+ yield url[:url], url[:indices].first, url[:indices].last
+ end
+ end
+
+ possible_entries
end
end
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 46a55c7a4..709450080 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -5,6 +5,7 @@ require 'singleton'
class FeedManager
include Singleton
include Redisable
+ include FormattingHelper
# Maximum number of items stored in a single feed
MAX_ITEMS = 400
@@ -445,7 +446,7 @@ class FeedManager
status = status.reblog if status.reblog?
combined_text = [
- Formatter.instance.plaintext(status),
+ extract_status_plain_text(status),
status.spoiler_text,
status.preloadable_poll ? status.preloadable_poll.options.join("\n\n") : nil,
status.ordered_media_attachments.map(&:description).join("\n\n"),
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 5eb22c8bc..d26e108d5 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -1,15 +1,24 @@
# frozen_string_literal: true
require 'singleton'
+#Singleton パターンを提供するモジュールです。Mix-in により singleton パターンを提供します。
require_relative './formatter_markdown'
+#Markdownの呼び出し
class Formatter
+# Rubyなどのオブジェクト指向型の言語では、この入れ物であるクラスの中に処理を書くことが基本となってきます。 クラスを定義するということは、具体的にはクラスの定義よりRuby言語に新しい「型」を加えることです。 その型をnewすると、変数に新しい型の「値」を代入できるようになります。
+# instanceメソッドが定義され、newメソッドがprivateに設定される
include Singleton
include RoutingHelper
include ActionView::Helpers::TextHelper
+#TextHelper モジュールは、文字列のフィルタリング、フォーマット、変換を行うためのメソッド群を提供し、ビュー内のインライン Ruby コードの量を減らすことができます。これらのヘルパーメソッドは Action View を拡張し、テンプレートファイル内で呼び出すことができます。
def format(status, **options)
+ # defとは、メソッドを定義するための記述です。メソッドは、何度も使うような処理をまとめるための仕組みです。その定義の最初に使う記述がdefです。
+ # def メソッド名(引数1, 引数2, ...)
+ # formatメソッドを定義し、引数1にstatus,2に**optionsを定義
+ # オプション引数を利用するにはメソッドを定義する際に引数を受ける変数名に「**」を付けます。そして、この方法で指定された引数は、「**」の付いた変数名のハッシュとしてメソッドの中で利用できます
if status.respond_to?(:reblog?) && status.reblog?
prepend_reblog = status.reblog.account.acct
status = status.proper
@@ -55,6 +64,7 @@ class Formatter
end
def format_in_quote(status, **options)
+ # format_in_quoteを定義、引数statusと**options
html = format(status)
return '' if html.empty?
doc = Nokogiri::HTML.parse(html, nil, 'utf-8')
diff --git a/app/lib/html_aware_formatter.rb b/app/lib/html_aware_formatter.rb
new file mode 100644
index 000000000..64edba09b
--- /dev/null
+++ b/app/lib/html_aware_formatter.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+class HtmlAwareFormatter
+ attr_reader :text, :local, :options
+
+ alias local? local
+
+ # @param [String] text
+ # @param [Boolean] local
+ # @param [Hash] options
+ def initialize(text, local, options = {})
+ @text = text
+ @local = local
+ @options = options
+ end
+
+ def to_s
+ return ''.html_safe if text.blank?
+
+ if local?
+ linkify
+ else
+ reformat.html_safe # rubocop:disable Rails/OutputSafety
+ end
+ rescue ArgumentError
+ ''.html_safe
+ end
+
+ private
+
+ def reformat
+ Sanitize.fragment(text, Sanitize::Config::MASTODON_STRICT)
+ end
+
+ def linkify
+ TextFormatter.new(text, options).to_s
+ end
+end
diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb
index fabbd244d..b0c4e4f42 100644
--- a/app/lib/link_details_extractor.rb
+++ b/app/lib/link_details_extractor.rb
@@ -208,7 +208,7 @@ class LinkDetailsExtractor
end
def valid_url_or_nil(str, same_origin_only: false)
- return if str.blank?
+ return if str.blank? || str == 'null'
url = @original_url + Addressable::URI.parse(str)
diff --git a/app/lib/plain_text_formatter.rb b/app/lib/plain_text_formatter.rb
new file mode 100644
index 000000000..08aa29696
--- /dev/null
+++ b/app/lib/plain_text_formatter.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class PlainTextFormatter
+ include ActionView::Helpers::TextHelper
+
+ NEWLINE_TAGS_RE = /( | |<\/p>)+/.freeze
+
+ attr_reader :text, :local
+
+ alias local? local
+
+ def initialize(text, local)
+ @text = text
+ @local = local
+ end
+
+ def to_s
+ if local?
+ text
+ else
+ strip_tags(insert_newlines).chomp
+ end
+ end
+
+ private
+
+ def insert_newlines
+ text.gsub(NEWLINE_TAGS_RE) { |match| "#{match}\n" }
+ end
+end
diff --git a/app/lib/quote_formatter.rb b/app/lib/quote_formatter.rb
new file mode 100644
index 000000000..69c5b7456
--- /dev/null
+++ b/app/lib/quote_formatter.rb
@@ -0,0 +1,19 @@
+class QuoteFormatter
+ include ActionView::Helpers::TextHelper
+ include ERB::Util
+ include RoutingHelper
+
+ def initialize(html, quote, options = {})
+ @html = html
+ @quote = quote
+ @options = options
+ end
+
+ def to_s
+ return html if status.quote? && !options[:escape_quotify]
+
+ url = ActivityPub::TagManager.instance.url_for(status.quote)
+ link = encode_and_link_urls(url)
+ html.sub(/(<[^>]+>)\z/, " QT: #{link}\\1")
+ end
+end
diff --git a/app/lib/rss/serializer.rb b/app/lib/rss/serializer.rb
index 7e3ed1f17..d44e94221 100644
--- a/app/lib/rss/serializer.rb
+++ b/app/lib/rss/serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class RSS::Serializer
+ include FormattingHelper
+
private
def render_statuses(builder, statuses)
@@ -9,7 +11,7 @@ class RSS::Serializer
item.title(status_title(status))
.link(ActivityPub::TagManager.instance.url_for(status))
.pub_date(status.created_at)
- .description(status.spoiler_text.presence || Formatter.instance.format(status, inline_poll_options: true).to_str)
+ .description(status_description(status))
status.ordered_media_attachments.each do |media|
item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size)
@@ -19,9 +21,8 @@ class RSS::Serializer
end
def status_title(status)
- return "#{status.account.acct} deleted status" if status.destroyed?
-
preview = status.proper.spoiler_text.presence || status.proper.text
+
if preview.length > 30 || preview[0, 30].include?("\n")
preview = preview[0, 30]
preview = preview[0, preview.index("\n").presence || 30] + '…'
@@ -35,4 +36,20 @@ class RSS::Serializer
"#{status.account.acct}: #{preview}"
end
end
+
+ def status_description(status)
+ if status.proper.spoiler_text?
+ status.proper.spoiler_text
+ else
+ html = status_content_format(status.proper).to_str
+ after_html = ''
+
+ if status.proper.preloadable_poll
+ poll_options_html = status.proper.preloadable_poll.options.map { |o| "[ ] #{o}" }.join(' ')
+ after_html = "
#{poll_options_html}
"
+ end
+
+ "#{html}#{after_html}"
+ end
+ end
end
diff --git a/app/lib/text_formatter.rb b/app/lib/text_formatter.rb
new file mode 100644
index 000000000..48e2fc233
--- /dev/null
+++ b/app/lib/text_formatter.rb
@@ -0,0 +1,158 @@
+# frozen_string_literal: true
+
+class TextFormatter
+ include ActionView::Helpers::TextHelper
+ include ERB::Util
+ include RoutingHelper
+
+ URL_PREFIX_REGEX = /\A(https?:\/\/(www\.)?|xmpp:)/.freeze
+
+ DEFAULT_REL = %w(nofollow noopener noreferrer).freeze
+
+ DEFAULT_OPTIONS = {
+ multiline: true,
+ }.freeze
+
+ attr_reader :text, :options
+
+ # @param [String] text
+ # @param [Hash] options
+ # @option options [Boolean] :multiline
+ # @option options [Boolean] :with_domains
+ # @option options [Boolean] :with_rel_me
+ # @option options [Array] :preloaded_accounts
+ def initialize(text, options = {})
+ @text = text
+ @options = DEFAULT_OPTIONS.merge(options)
+ end
+
+ def entities
+ @entities ||= Extractor.extract_entities_with_indices(text, extract_url_without_protocol: false)
+ end
+
+ def to_s
+ return ''.html_safe if text.blank?
+
+ html = rewrite do |entity|
+ if entity[:url]
+ link_to_url(entity)
+ elsif entity[:hashtag]
+ link_to_hashtag(entity)
+ elsif entity[:screen_name]
+ link_to_mention(entity)
+ end
+ end
+
+ html = simple_format(html, {}, sanitize: false).delete("\n") if multiline?
+
+ html.html_safe # rubocop:disable Rails/OutputSafety
+ end
+
+ private
+
+ def rewrite
+ entities.sort_by! do |entity|
+ entity[:indices].first
+ end
+
+ result = ''.dup
+
+ last_index = entities.reduce(0) do |index, entity|
+ indices = entity[:indices]
+ result << h(text[index...indices.first])
+ result << yield(entity)
+ indices.last
+ end
+
+ result << h(text[last_index..-1])
+
+ result
+ end
+
+ def link_to_url(entity)
+ url = Addressable::URI.parse(entity[:url]).to_s
+ rel = with_rel_me? ? (DEFAULT_REL + %w(me)) : DEFAULT_REL
+
+ prefix = url.match(URL_PREFIX_REGEX).to_s
+ display_url = url[prefix.length, 30]
+ suffix = url[prefix.length + 30..-1]
+ cutoff = url[prefix.length..-1].length > 30
+
+ <<~HTML.squish
+ #{h(prefix)}#{h(display_url)}#{h(suffix)}
+ HTML
+ rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
+ h(entity[:url])
+ end
+
+ def link_to_hashtag(entity)
+ hashtag = entity[:hashtag]
+ url = tag_url(hashtag)
+
+ <<~HTML.squish
+ ##{h(hashtag)}
+ HTML
+ end
+
+ def link_to_mention(entity)
+ username, domain = entity[:screen_name].split('@')
+ domain = nil if local_domain?(domain)
+ account = nil
+
+ if preloaded_accounts?
+ same_username_hits = 0
+
+ preloaded_accounts.each do |other_account|
+ same_username = other_account.username.casecmp(username).zero?
+ same_domain = other_account.domain.nil? ? domain.nil? : other_account.domain.casecmp(domain)&.zero?
+
+ if same_username && !same_domain
+ same_username_hits += 1
+ elsif same_username && same_domain
+ account = other_account
+ end
+ end
+ else
+ account = entity_cache.mention(username, domain)
+ end
+
+ return "@#{h(entity[:screen_name])}" if account.nil?
+
+ url = ActivityPub::TagManager.instance.url_for(account)
+ display_username = same_username_hits&.positive? || with_domains? ? account.pretty_acct : account.username
+
+ <<~HTML.squish
+ @#{h(display_username)}
+ HTML
+ end
+
+ def entity_cache
+ @entity_cache ||= EntityCache.instance
+ end
+
+ def tag_manager
+ @tag_manager ||= TagManager.instance
+ end
+
+ delegate :local_domain?, to: :tag_manager
+
+ def multiline?
+ options[:multiline]
+ end
+
+ def with_domains?
+ options[:with_domains]
+ end
+
+ def with_rel_me?
+ options[:with_rel_me]
+ end
+
+ def preloaded_accounts
+ options[:preloaded_accounts]
+ end
+
+ def preloaded_accounts?
+ preloaded_accounts.present?
+ end
+end
diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb
index cc585c3b7..a37682eca 100644
--- a/app/mailers/application_mailer.rb
+++ b/app/mailers/application_mailer.rb
@@ -5,6 +5,7 @@ class ApplicationMailer < ActionMailer::Base
helper :application
helper :instance
+ helper :formatting
protected
diff --git a/app/models/account.rb b/app/models/account.rb
index 1717f1605..a8c5df208 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -128,13 +128,13 @@ class Account < ApplicationRecord
:approved?,
:pending?,
:disabled?,
+ :unconfirmed?,
:unconfirmed_or_pending?,
:role,
:admin?,
:moderator?,
:staff?,
:locale,
- :hides_network?,
:shows_application?,
to: :user,
prefix: true,
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index 9da1522dd..ec309ce09 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -80,6 +80,10 @@ class AccountFilter
accounts_with_users.merge(User.pending)
when 'suspended'
Account.suspended
+ when 'disabled'
+ accounts_with_users.merge(User.disabled)
+ when 'silenced'
+ Account.silenced
else
raise "Unknown status: #{value}"
end
diff --git a/app/models/concerns/status_snapshot_concern.rb b/app/models/concerns/status_snapshot_concern.rb
new file mode 100644
index 000000000..9741b9aeb
--- /dev/null
+++ b/app/models/concerns/status_snapshot_concern.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module StatusSnapshotConcern
+ extend ActiveSupport::Concern
+
+ included do
+ has_many :edits, class_name: 'StatusEdit', inverse_of: :status, dependent: :destroy
+ end
+
+ def edited?
+ edited_at.present?
+ end
+
+ def build_snapshot(account_id: nil, at_time: nil, rate_limit: true)
+ # We don't use `edits#new` here to avoid it having saved when the
+ # status is saved, since we want to control that manually
+
+ StatusEdit.new(
+ status_id: id,
+ text: text,
+ spoiler_text: spoiler_text,
+ sensitive: sensitive,
+ ordered_media_attachment_ids: ordered_media_attachment_ids&.dup || media_attachments.pluck(:id),
+ media_descriptions: ordered_media_attachments.map(&:description),
+ poll_options: preloadable_poll&.options&.dup,
+ account_id: account_id || self.account_id,
+ created_at: at_time || edited_at,
+ rate_limit: rate_limit
+ )
+ end
+
+ def snapshot!(**options)
+ build_snapshot(**options).save!
+ end
+end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index a3115637e..21c663e47 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -185,7 +185,7 @@ class MediaAttachment < ApplicationRecord
remotable_attachment :thumbnail, IMAGE_LIMIT, suppress_errors: true, download_on_assign: false
validates :account, presence: true
- validates :description, length: { maximum: MAX_DESCRIPTION_LENGTH }, if: :local?
+ validates :description, length: { maximum: MAX_DESCRIPTION_LENGTH }
validates :file, presence: true, if: :local?
validates :thumbnail, absence: true, if: -> { local? && !audio_or_video? }
@@ -258,7 +258,6 @@ class MediaAttachment < ApplicationRecord
after_commit :enqueue_processing, on: :create
after_commit :reset_parent_cache, on: :update
- before_create :prepare_description, unless: :local?
before_create :set_unknown_type
before_create :set_processing
@@ -306,10 +305,6 @@ class MediaAttachment < ApplicationRecord
self.type = :unknown if file.blank? && !type_changed?
end
- def prepare_description
- self.description = description.strip[0...MAX_DESCRIPTION_LENGTH] unless description.nil?
- end
-
def set_type_and_extension
self.type = begin
if VIDEO_MIME_TYPES.include?(file_content_type)
diff --git a/app/models/status.rb b/app/models/status.rb
index 36d984ac8..16d24a5e7 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -36,6 +36,7 @@ class Status < ApplicationRecord
include Paginable
include Cacheable
include StatusThreadingConcern
+ include StatusSnapshotConcern
include RateLimitable
rate_limit by: :account, family: :statuses
@@ -61,8 +62,6 @@ class Status < ApplicationRecord
belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true
belongs_to :quote, foreign_key: 'quote_id', class_name: 'Status', inverse_of: :quoted, optional: true
- has_many :edits, class_name: 'StatusEdit', inverse_of: :status, dependent: :destroy
-
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
@@ -224,24 +223,6 @@ class Status < ApplicationRecord
public_visibility? || unlisted_visibility?
end
- def snapshot!(account_id: nil, at_time: nil, rate_limit: true)
- edits.create!(
- text: text,
- spoiler_text: spoiler_text,
- sensitive: sensitive,
- ordered_media_attachment_ids: ordered_media_attachment_ids || media_attachments.pluck(:id),
- media_descriptions: ordered_media_attachments.map(&:description),
- poll_options: preloadable_poll&.options,
- account_id: account_id || self.account_id,
- created_at: at_time || edited_at,
- rate_limit: rate_limit
- )
- end
-
- def edited?
- edited_at.present?
- end
-
alias sign? distributable?
def with_media?
diff --git a/app/models/trends/query.rb b/app/models/trends/query.rb
index 64a4c0c1f..231b65228 100644
--- a/app/models/trends/query.rb
+++ b/app/models/trends/query.rb
@@ -37,7 +37,7 @@ class Trends::Query
end
def offset!(value)
- @offset = value
+ @offset = value.to_i
self
end
@@ -46,7 +46,7 @@ class Trends::Query
end
def limit!(value)
- @limit = value
+ @limit = value.to_i
self
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 377db43f3..262528a10 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -91,11 +91,11 @@ class User < ApplicationRecord
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
+ validates_with BlacklistedEmailValidator, if: -> { !confirmed? }
validates_with EmailMxValidator, if: :validate_email_dns?
validates :agreement, acceptance: { allow_nil: false, accept: [true, 'true', '1'] }, on: :create
- # Those are honeypot/antispam fields
+ # Honeypot/anti-spam fields
attr_accessor :registration_form_time, :website, :confirm_password
validates_with RegistrationFormTimeValidator, on: :create
@@ -210,8 +210,12 @@ class User < ApplicationRecord
confirmed? && approved? && !disabled? && !account.suspended? && !account.memorial? && account.moved_to_account_id.nil?
end
+ def unconfirmed?
+ !confirmed?
+ end
+
def unconfirmed_or_pending?
- !(confirmed? && approved?)
+ unconfirmed? || pending?
end
def inactive_message
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index 48707aa16..e6dd8040e 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -2,6 +2,7 @@
class ActivityPub::ActorSerializer < ActivityPub::Serializer
include RoutingHelper
+ include FormattingHelper
context :security
@@ -102,7 +103,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end
def summary
- object.suspended? ? '' : Formatter.instance.simplified_format(object)
+ object.suspended? ? '' : account_bio_format(object)
end
def icon
@@ -185,6 +186,8 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end
class Account::FieldSerializer < ActivityPub::Serializer
+ include FormattingHelper
+
attributes :type, :name, :value
def type
@@ -192,7 +195,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end
def value
- Formatter.instance.format_field(object.account, object.value)
+ account_field_value_format(object)
end
end
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index 49125b55a..6b98211b7 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class ActivityPub::NoteSerializer < ActivityPub::Serializer
+ include FormattingHelper
+
context_extensions :atom_uri, :conversation, :sensitive, :voters_count
attributes :id, :type, :summary,
@@ -42,11 +44,11 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
end
def content
- Formatter.instance.format(object)
+ status_content_format(object)
end
def content_map
- { object.language => Formatter.instance.format(object) }
+ { object.language => content }
end
def replies
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index a78ec4507..4cf7b253f 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -2,6 +2,7 @@
class REST::AccountSerializer < ActiveModel::Serializer
include RoutingHelper
+ include FormattingHelper
attributes :id, :username, :acct, :display_name, :locked, :bot, :discoverable, :group, :created_at,
:note, :url, :avatar, :avatar_static, :header, :header_static,
@@ -14,10 +15,12 @@ class REST::AccountSerializer < ActiveModel::Serializer
attribute :suspended, if: :suspended?
class FieldSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
attributes :name, :value, :verified_at
def value
- Formatter.instance.format_field(object.account, object.value)
+ account_field_value_format(object)
end
end
@@ -32,7 +35,7 @@ class REST::AccountSerializer < ActiveModel::Serializer
end
def note
- object.suspended? ? '' : Formatter.instance.simplified_format(object)
+ object.suspended? ? '' : account_bio_format(object)
end
def url
diff --git a/app/serializers/rest/announcement_serializer.rb b/app/serializers/rest/announcement_serializer.rb
index 9343b97d2..23b2fa514 100644
--- a/app/serializers/rest/announcement_serializer.rb
+++ b/app/serializers/rest/announcement_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class REST::AnnouncementSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
attributes :id, :content, :starts_at, :ends_at, :all_day,
:published_at, :updated_at
@@ -25,7 +27,7 @@ class REST::AnnouncementSerializer < ActiveModel::Serializer
end
def content
- Formatter.instance.linkify(object.text)
+ linkify(object.text)
end
def reactions
diff --git a/app/serializers/rest/status_edit_serializer.rb b/app/serializers/rest/status_edit_serializer.rb
index 05ccd5e94..f7a48797d 100644
--- a/app/serializers/rest/status_edit_serializer.rb
+++ b/app/serializers/rest/status_edit_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class REST::StatusEditSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
has_one :account, serializer: REST::AccountSerializer
attributes :content, :spoiler_text, :sensitive, :created_at
@@ -11,7 +13,7 @@ class REST::StatusEditSerializer < ActiveModel::Serializer
attribute :poll, if: -> { object.poll_options.present? }
def content
- Formatter.instance.format(object)
+ status_content_format(object)
end
def poll
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index b6743c811..18a3b1cfe 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class REST::StatusSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
:sensitive, :spoiler_text, :visibility, :language,
:uri, :url, :replies_count, :reblogs_count,
@@ -77,7 +79,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
end
def content
- Formatter.instance.format(object)
+ status_content_format(object)
end
def url
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index 47a788c30..6dc14d8c2 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -4,6 +4,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
include JsonLdHelper
def call(status, json)
+ raise ArgumentError, 'Status has unsaved changes' if status.changed?
+
@json = json
@status_parser = ActivityPub::Parser::StatusParser.new(@json)
@uri = @status_parser.uri
@@ -17,16 +19,19 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
last_edit_date = status.edited_at.presence || status.created_at
+ # Since we rely on tracking of previous changes, ensure clean slate
+ status.clear_changes_information
+
# Only allow processing one create/update per status at a time
RedisLock.acquire(lock_options) do |lock|
if lock.acquired?
Status.transaction do
- create_previous_edit!
+ record_previous_edit!
update_media_attachments!
update_poll!
update_immediate_attributes!
update_metadata!
- create_edit!
+ create_edits!
end
queue_poll_notifications!
@@ -216,19 +221,14 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
{ redis: Redis.current, key: "create:#{@uri}", autorelease: 15.minutes.seconds }
end
- def create_previous_edit!
- # We only need to create a previous edit when no previous edits exist, e.g.
- # when the status has never been edited. For other cases, we always create
- # an edit, so the step can be skipped
-
- return if @status.edits.any?
-
- @status.snapshot!(at_time: @status.created_at, rate_limit: false)
+ def record_previous_edit!
+ @previous_edit = @status.build_snapshot(at_time: @status.created_at, rate_limit: false) if @status.edits.empty?
end
- def create_edit!
+ def create_edits!
return unless significant_changes?
+ @previous_edit&.save!
@status.snapshot!(account_id: @account.id, rate_limit: false)
end
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 239ab9b93..9c8b5ea20 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -134,7 +134,7 @@ class FetchLinkCardService < BaseService
when 'video'
@card.width = embed[:width].presence || 0
@card.height = embed[:height].presence || 0
- @card.html = Formatter.instance.sanitize(embed[:html], Sanitize::Config::MASTODON_OEMBED)
+ @card.html = Sanitize.fragment(embed[:html], Sanitize::Config::MASTODON_OEMBED)
@card.image_remote_url = (url + embed[:thumbnail_url]).to_s if embed[:thumbnail_url].present?
when 'rich'
# Most providers rely on } }
-
- it 'does not include the HTML in the URL' do
- is_expected.to include '"http://example.com/blahblahblahblah/a"'
- end
-
- it 'escapes the HTML' do
- is_expected.to include '<script>alert("Hello")</script>'
- end
- end
-
- context 'given text containing HTML code (script tag)' do
- let(:text) { '' }
-
- it 'escapes the HTML' do
- is_expected.to include '
<script>alert("Hello")</script>
'
- end
- end
-
- context 'given text containing HTML (XSS attack)' do
- let(:text) { %q{} }
-
- it 'escapes the HTML' do
- is_expected.to include '
<img src="javascript:alert('XSS');">
'
- end
- end
-
- context 'given an invalid URL' do
- let(:text) { 'http://www\.google\.com' }
-
- it 'outputs the raw URL' do
- is_expected.to eq '
http://www\.google\.com
'
- end
- end
-
- context 'given text containing a hashtag' do
- let(:text) { '#hashtag' }
-
- it 'creates a hashtag link' do
- is_expected.to include '/tags/hashtag" class="mention hashtag" rel="tag">#hashtag'
- end
- end
-
- context 'given text containing a hashtag with Unicode chars' do
- let(:text) { '#hashtagタグ' }
-
- it 'creates a hashtag link' do
- is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#hashtagタグ'
- end
- end
-
- context 'given a stand-alone xmpp: URI' do
- let(:text) { 'xmpp:user@instance.com' }
-
- it 'matches the full URI' do
- is_expected.to include 'href="xmpp:user@instance.com"'
- end
- end
-
- context 'given a an xmpp: URI with a query-string' do
- let(:text) { 'please join xmpp:muc@instance.com?join right now' }
-
- it 'matches the full URI' do
- is_expected.to include 'href="xmpp:muc@instance.com?join"'
- end
- end
-
- context 'given text containing a magnet: URI' do
- let(:text) { 'wikipedia gives this example of a magnet uri: magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a' }
-
- it 'matches the full URI' do
- is_expected.to include 'href="magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a"'
- end
- end
- end
-
- describe '#format_spoiler' do
- subject { Formatter.instance.format_spoiler(status) }
-
- context 'given a post containing plain text' do
- let(:status) { Fabricate(:status, text: 'text', spoiler_text: 'Secret!', uri: nil) }
-
- it 'Returns the spoiler text' do
- is_expected.to eq 'Secret!'
- end
- end
-
- context 'given a post with an emoji shortcode at the start' do
- let!(:emoji) { Fabricate(:custom_emoji) }
- let(:status) { Fabricate(:status, text: 'text', spoiler_text: ':coolcat: Secret!', uri: nil) }
- let(:text) { ':coolcat: Beep boop' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/@alice Hello world'
- end
- end
-
- context 'given a post containing plain text' do
- let(:status) { Fabricate(:status, text: 'text', uri: nil) }
-
- it 'paragraphizes the text' do
- is_expected.to eq '
text
'
- end
- end
-
- context 'given a post containing line feeds' do
- let(:status) { Fabricate(:status, text: "line\nfeed", uri: nil) }
-
- it 'removes line feeds' do
- is_expected.not_to include "\n"
- end
- end
-
- context 'given a post containing linkable mentions' do
- let(:status) { Fabricate(:status, mentions: [ Fabricate(:mention, account: local_account) ], text: '@alice') }
-
- it 'creates a mention link' do
- is_expected.to include '@alice'
- end
- end
-
- context 'given a post containing unlinkable mentions' do
- let(:status) { Fabricate(:status, text: '@alice', uri: nil) }
-
- it 'does not create a mention link' do
- is_expected.to include '@alice'
- end
- end
-
- context do
- subject do
- status = Fabricate(:status, text: text, uri: nil)
- Formatter.instance.format(status)
- end
-
- include_examples 'encode and link URLs'
- end
-
- context 'given a post with custom_emojify option' do
- let!(:emoji) { Fabricate(:custom_emoji) }
- let(:status) { Fabricate(:status, account: local_account, text: text) }
-
- subject { Formatter.instance.format(status, custom_emojify: true) }
-
- context 'given a post with an emoji shortcode at the start' do
- let(:text) { ':coolcat: Beep boop' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/
:coolcat: Beep boop ' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/
Beep :coolcat: boop
' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/Beep :coolcat::coolcat:' }
-
- it 'does not touch the shortcodes' do
- is_expected.to match(/
:coolcat::coolcat:<\/p>/)
- end
- end
-
- context 'given a post with an emoji shortcode at the end' do
- let(:text) { '
Beep boop :coolcat:
' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/ alert("Hello")' }
-
- it 'strips the scripts' do
- is_expected.to_not include ''
- end
- end
-
- context 'given a post containing malicious classes' do
- let(:text) { 'Show more' }
-
- it 'strips the malicious classes' do
- is_expected.to_not include 'status__content__spoiler-link'
- end
- end
- end
-
- describe '#plaintext' do
- subject { Formatter.instance.plaintext(status) }
-
- context 'given a post with local status' do
- let(:status) { Fabricate(:status, text: '
a text by a nerd who uses an HTML tag in text
', uri: nil) }
-
- it 'returns the raw text' do
- is_expected.to eq '
a text by a nerd who uses an HTML tag in text
'
- end
- end
-
- context 'given a post with remote status' do
- let(:status) { Fabricate(:status, account: remote_account, text: '') }
-
- it 'returns tag-stripped text' do
- is_expected.to eq ''
- end
- end
- end
-
- describe '#simplified_format' do
- subject { Formatter.instance.simplified_format(account) }
-
- context 'given a post with local status' do
- let(:account) { Fabricate(:account, domain: nil, note: text) }
-
- context 'given a post containing linkable mentions for local accounts' do
- let(:text) { '@alice' }
-
- before { local_account }
-
- it 'creates a mention link' do
- is_expected.to eq '
'
- end
- end
-
- context 'given a post containing linkable mentions for remote accounts' do
- let(:text) { '@bob@remote.test' }
-
- before { remote_account }
-
- it 'creates a mention link' do
- is_expected.to eq '
'
- end
- end
-
- context 'given a post containing unlinkable mentions' do
- let(:text) { '@alice' }
-
- it 'does not create a mention link' do
- is_expected.to eq '
@alice
'
- end
- end
-
- context 'given a post with custom_emojify option' do
- let!(:emoji) { Fabricate(:custom_emoji) }
-
- before { account.note = text }
- subject { Formatter.instance.simplified_format(account, custom_emojify: true) }
-
- context 'given a post with an emoji shortcode at the start' do
- let(:text) { ':coolcat: Beep boop' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/
alert("Hello")' }
- let(:account) { Fabricate(:account, domain: 'remote', note: text) }
-
- it 'reformats' do
- is_expected.to_not include ''
- end
-
- context 'with custom_emojify option' do
- let!(:emoji) { Fabricate(:custom_emoji, domain: remote_account.domain) }
-
- before { remote_account.note = text }
-
- subject { Formatter.instance.simplified_format(remote_account, custom_emojify: true) }
-
- context 'given a post with an emoji shortcode at the start' do
- let(:text) { '
:coolcat: Beep boop ' }
-
- it 'converts shortcode to image tag' do
- is_expected.to match(/
Beep :coolcat: boop
' }
-
- it 'converts shortcode to image tag' do
- is_expected.to match(/Beep :coolcat::coolcat:' }
-
- it 'does not touch the shortcodes' do
- is_expected.to match(/
:coolcat::coolcat:<\/p>/)
- end
- end
-
- context 'given a post with an emoji shortcode at the end' do
- let(:text) { '
Beep boop :coolcat:
' }
-
- it 'converts shortcode to image tag' do
- is_expected.to match(/ alert("Hello")' }
-
- subject { Formatter.instance.sanitize(html, Sanitize::Config::MASTODON_STRICT) }
-
- it 'sanitizes' do
- is_expected.to eq ''
- end
- end
-end
diff --git a/spec/lib/html_aware_formatter_spec.rb b/spec/lib/html_aware_formatter_spec.rb
new file mode 100644
index 000000000..18d23abf5
--- /dev/null
+++ b/spec/lib/html_aware_formatter_spec.rb
@@ -0,0 +1,44 @@
+require 'rails_helper'
+
+RSpec.describe HtmlAwareFormatter do
+ describe '#to_s' do
+ subject { described_class.new(text, local).to_s }
+
+ context 'when local' do
+ let(:local) { true }
+ let(:text) { 'Foo bar' }
+
+ it 'returns formatted text' do
+ is_expected.to eq '
Foo bar
'
+ end
+ end
+
+ context 'when remote' do
+ let(:local) { false }
+
+ context 'given plain text' do
+ let(:text) { 'Beep boop' }
+
+ it 'keeps the plain text' do
+ is_expected.to include 'Beep boop'
+ end
+ end
+
+ context 'given text containing script tags' do
+ let(:text) { '' }
+
+ it 'strips the scripts' do
+ is_expected.to_not include ''
+ end
+ end
+
+ context 'given text containing malicious classes' do
+ let(:text) { 'Show more' }
+
+ it 'strips the malicious classes' do
+ is_expected.to_not include 'status__content__spoiler-link'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb
index 84bb4579c..7ea867c61 100644
--- a/spec/lib/link_details_extractor_spec.rb
+++ b/spec/lib/link_details_extractor_spec.rb
@@ -25,6 +25,14 @@ RSpec.describe LinkDetailsExtractor do
expect(subject.canonical_url).to eq 'https://foo.com/article'
end
end
+
+ context 'when canonical URL is set to "null"' do
+ let(:html) { '' }
+
+ it 'ignores the canonical URLs' do
+ expect(subject.canonical_url).to eq original_url
+ end
+ end
end
context 'when structured data is present' do
diff --git a/spec/lib/plain_text_formatter_spec.rb b/spec/lib/plain_text_formatter_spec.rb
new file mode 100644
index 000000000..c3d0ee630
--- /dev/null
+++ b/spec/lib/plain_text_formatter_spec.rb
@@ -0,0 +1,24 @@
+require 'rails_helper'
+
+RSpec.describe PlainTextFormatter do
+ describe '#to_s' do
+ subject { described_class.new(status.text, status.local?).to_s }
+
+ context 'given a post with local status' do
+ let(:status) { Fabricate(:status, text: '
a text by a nerd who uses an HTML tag in text
', uri: nil) }
+
+ it 'returns the raw text' do
+ is_expected.to eq '
a text by a nerd who uses an HTML tag in text
'
+ end
+ end
+
+ context 'given a post with remote status' do
+ let(:remote_account) { Fabricate(:account, domain: 'remote.test', username: 'bob', url: 'https://remote.test/') }
+ let(:status) { Fabricate(:status, account: remote_account, text: '
Hello
') }
+
+ it 'returns tag-stripped text' do
+ is_expected.to eq 'Hello'
+ end
+ end
+ end
+end
diff --git a/spec/lib/rss/serializer_spec.rb b/spec/lib/rss/serializer_spec.rb
index 0364d13de..1da45d302 100644
--- a/spec/lib/rss/serializer_spec.rb
+++ b/spec/lib/rss/serializer_spec.rb
@@ -13,13 +13,6 @@ describe RSS::Serializer do
subject { RSS::Serializer.new.send(:status_title, status) }
- context 'if destroyed?' do
- it 'returns "#{account.acct} deleted status"' do
- status.destroy!
- expect(subject).to eq "#{account.acct} deleted status"
- end
- end
-
context 'on a toot with long text' do
let(:text) { "This toot's text is longer than the allowed number of characters" }
diff --git a/spec/lib/text_formatter_spec.rb b/spec/lib/text_formatter_spec.rb
new file mode 100644
index 000000000..52a9d2498
--- /dev/null
+++ b/spec/lib/text_formatter_spec.rb
@@ -0,0 +1,313 @@
+require 'rails_helper'
+
+RSpec.describe TextFormatter do
+ describe '#to_s' do
+ let(:preloaded_accounts) { nil }
+
+ subject { described_class.new(text, preloaded_accounts: preloaded_accounts).to_s }
+
+ context 'given text containing plain text' do
+ let(:text) { 'text' }
+
+ it 'paragraphizes the text' do
+ is_expected.to eq '
text
'
+ end
+ end
+
+ context 'given text containing line feeds' do
+ let(:text) { "line\nfeed" }
+
+ it 'removes line feeds' do
+ is_expected.not_to include "\n"
+ end
+ end
+
+ context 'given text containing linkable mentions' do
+ let(:preloaded_accounts) { [Fabricate(:account, username: 'alice')] }
+ let(:text) { '@alice' }
+
+ it 'creates a mention link' do
+ is_expected.to include '@alice'
+ end
+ end
+
+ context 'given text containing unlinkable mentions' do
+ let(:preloaded_accounts) { [] }
+ let(:text) { '@alice' }
+
+ it 'does not create a mention link' do
+ is_expected.to include '@alice'
+ end
+ end
+
+ context 'given a stand-alone medium URL' do
+ let(:text) { 'https://hackernoon.com/the-power-to-build-communities-a-response-to-mark-zuckerberg-3f2cac9148a4' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://hackernoon.com/the-power-to-build-communities-a-response-to-mark-zuckerberg-3f2cac9148a4"'
+ end
+ end
+
+ context 'given a stand-alone google URL' do
+ let(:text) { 'http://google.com' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="http://google.com"'
+ end
+ end
+
+ context 'given a stand-alone URL with a newer TLD' do
+ let(:text) { 'http://example.gay' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="http://example.gay"'
+ end
+ end
+
+ context 'given a stand-alone IDN URL' do
+ let(:text) { 'https://nic.みんな/' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://nic.みんな/"'
+ end
+
+ it 'has display URL' do
+ is_expected.to include 'nic.みんな/'
+ end
+ end
+
+ context 'given a URL with a trailing period' do
+ let(:text) { 'http://www.mcmansionhell.com/post/156408871451/50-states-of-mcmansion-hell-scottsdale-arizona. ' }
+
+ it 'matches the full URL but not the period' do
+ is_expected.to include 'href="http://www.mcmansionhell.com/post/156408871451/50-states-of-mcmansion-hell-scottsdale-arizona"'
+ end
+ end
+
+ context 'given a URL enclosed with parentheses' do
+ let(:text) { '(http://google.com/)' }
+
+ it 'matches the full URL but not the parentheses' do
+ is_expected.to include 'href="http://google.com/"'
+ end
+ end
+
+ context 'given a URL with a trailing exclamation point' do
+ let(:text) { 'http://www.google.com!' }
+
+ it 'matches the full URL but not the exclamation point' do
+ is_expected.to include 'href="http://www.google.com"'
+ end
+ end
+
+ context 'given a URL with a trailing single quote' do
+ let(:text) { "http://www.google.com'" }
+
+ it 'matches the full URL but not the single quote' do
+ is_expected.to include 'href="http://www.google.com"'
+ end
+ end
+
+ context 'given a URL with a trailing angle bracket' do
+ let(:text) { 'http://www.google.com>' }
+
+ it 'matches the full URL but not the angle bracket' do
+ is_expected.to include 'href="http://www.google.com"'
+ end
+ end
+
+ context 'given a URL with a query string' do
+ context 'with escaped unicode character' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink"'
+ end
+ end
+
+ context 'with unicode character' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓&q=autolink' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓&q=autolink"'
+ end
+ end
+
+ context 'with unicode character at the end' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓"'
+ end
+ end
+
+ context 'with escaped and not escaped unicode characters' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink' }
+
+ it 'preserves escaped unicode characters' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink"'
+ end
+ end
+ end
+
+ context 'given a URL with parentheses in it' do
+ let(:text) { 'https://en.wikipedia.org/wiki/Diaspora_(software)' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://en.wikipedia.org/wiki/Diaspora_(software)"'
+ end
+ end
+
+ context 'given a URL in quotation marks' do
+ let(:text) { '"https://example.com/"' }
+
+ it 'does not match the quotation marks' do
+ is_expected.to include 'href="https://example.com/"'
+ end
+ end
+
+ context 'given a URL in angle brackets' do
+ let(:text) { '' }
+
+ it 'does not match the angle brackets' do
+ is_expected.to include 'href="https://example.com/"'
+ end
+ end
+
+ context 'given a URL with Japanese path string' do
+ let(:text) { 'https://ja.wikipedia.org/wiki/日本' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://ja.wikipedia.org/wiki/日本"'
+ end
+ end
+
+ context 'given a URL with Korean path string' do
+ let(:text) { 'https://ko.wikipedia.org/wiki/대한민국' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://ko.wikipedia.org/wiki/대한민국"'
+ end
+ end
+
+ context 'given a URL with a full-width space' do
+ let(:text) { 'https://example.com/ abc123' }
+
+ it 'does not match the full-width space' do
+ is_expected.to include 'href="https://example.com/"'
+ end
+ end
+
+ context 'given a URL in Japanese quotation marks' do
+ let(:text) { '「[https://example.org/」' }
+
+ it 'does not match the quotation marks' do
+ is_expected.to include 'href="https://example.org/"'
+ end
+ end
+
+ context 'given a URL with Simplified Chinese path string' do
+ let(:text) { 'https://baike.baidu.com/item/中华人民共和国' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://baike.baidu.com/item/中华人民共和国"'
+ end
+ end
+
+ context 'given a URL with Traditional Chinese path string' do
+ let(:text) { 'https://zh.wikipedia.org/wiki/臺灣' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://zh.wikipedia.org/wiki/臺灣"'
+ end
+ end
+
+ context 'given a URL containing unsafe code (XSS attack, visible part)' do
+ let(:text) { %q{http://example.com/bb} }
+
+ it 'does not include the HTML in the URL' do
+ is_expected.to include '"http://example.com/b"'
+ end
+
+ it 'escapes the HTML' do
+ is_expected.to include '<del>b</del>'
+ end
+ end
+
+ context 'given a URL containing unsafe code (XSS attack, invisible part)' do
+ let(:text) { %q{http://example.com/blahblahblahblah/a} }
+
+ it 'does not include the HTML in the URL' do
+ is_expected.to include '"http://example.com/blahblahblahblah/a"'
+ end
+
+ it 'escapes the HTML' do
+ is_expected.to include '<script>alert("Hello")</script>'
+ end
+ end
+
+ context 'given text containing HTML code (script tag)' do
+ let(:text) { '' }
+
+ it 'escapes the HTML' do
+ is_expected.to include '
<script>alert("Hello")</script>
'
+ end
+ end
+
+ context 'given text containing HTML (XSS attack)' do
+ let(:text) { %q{} }
+
+ it 'escapes the HTML' do
+ is_expected.to include '
<img src="javascript:alert('XSS');">
'
+ end
+ end
+
+ context 'given an invalid URL' do
+ let(:text) { 'http://www\.google\.com' }
+
+ it 'outputs the raw URL' do
+ is_expected.to eq '
http://www\.google\.com
'
+ end
+ end
+
+ context 'given text containing a hashtag' do
+ let(:text) { '#hashtag' }
+
+ it 'creates a hashtag link' do
+ is_expected.to include '/tags/hashtag" class="mention hashtag" rel="tag">#hashtag'
+ end
+ end
+
+ context 'given text containing a hashtag with Unicode chars' do
+ let(:text) { '#hashtagタグ' }
+
+ it 'creates a hashtag link' do
+ is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#hashtagタグ'
+ end
+ end
+
+ context 'given text with a stand-alone xmpp: URI' do
+ let(:text) { 'xmpp:user@instance.com' }
+
+ it 'matches the full URI' do
+ is_expected.to include 'href="xmpp:user@instance.com"'
+ end
+ end
+
+ context 'given text with an xmpp: URI with a query-string' do
+ let(:text) { 'please join xmpp:muc@instance.com?join right now' }
+
+ it 'matches the full URI' do
+ is_expected.to include 'href="xmpp:muc@instance.com?join"'
+ end
+ end
+
+ context 'given text containing a magnet: URI' do
+ let(:text) { 'wikipedia gives this example of a magnet uri: magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a' }
+
+ it 'matches the full URI' do
+ is_expected.to include 'href="magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a"'
+ end
+ end
+ end
+end
diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb
index 7360b23cf..cbd9a09c5 100644
--- a/spec/models/media_attachment_spec.rb
+++ b/spec/models/media_attachment_spec.rb
@@ -186,14 +186,6 @@ RSpec.describe MediaAttachment, type: :model do
expect(media.valid?).to be false
end
- describe 'descriptions for remote attachments' do
- it 'are cut off at 1500 characters' do
- media = Fabricate(:media_attachment, description: 'foo' * 1000, remote_url: 'http://example.com/blah.jpg')
-
- expect(media.description.size).to be <= 1_500
- end
- end
-
describe 'size limit validation' do
it 'rejects video files that are too large' do
stub_const 'MediaAttachment::IMAGE_LIMIT', 100.megabytes
diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb
index 788c7c9d9..f87adcae1 100644
--- a/spec/services/activitypub/process_status_update_service_spec.rb
+++ b/spec/services/activitypub/process_status_update_service_spec.rb
@@ -46,6 +46,29 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
expect(status.reload.spoiler_text).to eq 'Show more'
end
+ context 'with no changes at all' do
+ let(:payload) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ id: 'foo',
+ type: 'Note',
+ content: 'Hello world',
+ }
+ end
+
+ before do
+ subject.call(status, json)
+ end
+
+ it 'does not create any edits' do
+ expect(status.reload.edits).to be_empty
+ end
+
+ it 'does not mark status as edited' do
+ expect(status.edited?).to be false
+ end
+ end
+
context 'with no changes and originally with no ordered_media_attachment_ids' do
let(:payload) do
{
@@ -61,8 +84,12 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
subject.call(status, json)
end
- it 'does not record an update' do
- expect(status.reload.edited?).to be false
+ it 'does not create any edits' do
+ expect(status.reload.edits).to be_empty
+ end
+
+ it 'does not mark status as edited' do
+ expect(status.edited?).to be false
end
end
diff --git a/spec/services/after_block_service_spec.rb b/spec/services/after_block_service_spec.rb
index fe5b26b2b..c09425d7c 100644
--- a/spec/services/after_block_service_spec.rb
+++ b/spec/services/after_block_service_spec.rb
@@ -1,9 +1,7 @@
require 'rails_helper'
RSpec.describe AfterBlockService, type: :service do
- subject do
- -> { described_class.new.call(account, target_account) }
- end
+ subject { described_class.new.call(account, target_account) }
let(:account) { Fabricate(:account) }
let(:target_account) { Fabricate(:account) }
@@ -24,7 +22,7 @@ RSpec.describe AfterBlockService, type: :service do
FeedManager.instance.push_to_home(account, other_account_status)
FeedManager.instance.push_to_home(account, other_account_reblog)
- is_expected.to change {
+ expect { subject }.to change {
Redis.current.zrange(home_timeline_key, 0, -1)
}.from([status.id.to_s, other_account_status.id.to_s, other_account_reblog.id.to_s]).to([other_account_status.id.to_s])
end
@@ -43,7 +41,7 @@ RSpec.describe AfterBlockService, type: :service do
FeedManager.instance.push_to_list(list, other_account_status)
FeedManager.instance.push_to_list(list, other_account_reblog)
- is_expected.to change {
+ expect { subject }.to change {
Redis.current.zrange(list_timeline_key, 0, -1)
}.from([status.id.to_s, other_account_status.id.to_s, other_account_reblog.id.to_s]).to([other_account_status.id.to_s])
end
diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb
index 9c785fc17..1fbe4d07c 100644
--- a/spec/services/delete_account_service_spec.rb
+++ b/spec/services/delete_account_service_spec.rb
@@ -23,12 +23,10 @@ RSpec.describe DeleteAccountService, type: :service do
let!(:account_note) { Fabricate(:account_note, account: account) }
- subject do
- -> { described_class.new.call(account) }
- end
+ subject { described_class.new.call(account) }
it 'deletes associated owned records' do
- is_expected.to change {
+ expect { subject }.to change {
[
account.statuses,
account.media_attachments,
@@ -43,7 +41,7 @@ RSpec.describe DeleteAccountService, type: :service do
end
it 'deletes associated target records' do
- is_expected.to change {
+ expect { subject }.to change {
[
AccountPin.where(target_account: account),
].map(&:count)
@@ -51,7 +49,7 @@ RSpec.describe DeleteAccountService, type: :service do
end
it 'deletes associated target notifications' do
- is_expected.to change {
+ expect { subject }.to change {
[
'poll', 'favourite', 'status', 'mention', 'follow'
].map { |type| Notification.where(type: type).count }
@@ -73,7 +71,7 @@ RSpec.describe DeleteAccountService, type: :service do
let!(:local_follower) { Fabricate(:account) }
it 'sends a delete actor activity to all known inboxes' do
- subject.call
+ subject
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
@@ -91,7 +89,7 @@ RSpec.describe DeleteAccountService, type: :service do
let!(:local_follower) { Fabricate(:account) }
it 'sends a reject follow to follower inboxes' do
- subject.call
+ subject
expect(a_request(:post, account.inbox_url)).to have_been_made.once
end
end
diff --git a/spec/services/mute_service_spec.rb b/spec/services/mute_service_spec.rb
index 4bb839b8d..bdec1c67b 100644
--- a/spec/services/mute_service_spec.rb
+++ b/spec/services/mute_service_spec.rb
@@ -1,9 +1,7 @@
require 'rails_helper'
RSpec.describe MuteService, type: :service do
- subject do
- -> { described_class.new.call(account, target_account) }
- end
+ subject { described_class.new.call(account, target_account) }
let(:account) { Fabricate(:account) }
let(:target_account) { Fabricate(:account) }
@@ -21,45 +19,41 @@ RSpec.describe MuteService, type: :service do
FeedManager.instance.push_to_home(account, status)
FeedManager.instance.push_to_home(account, other_account_status)
- is_expected.to change {
+ expect { subject }.to change {
Redis.current.zrange(home_timeline_key, 0, -1)
}.from([status.id.to_s, other_account_status.id.to_s]).to([other_account_status.id.to_s])
end
end
it 'mutes account' do
- is_expected.to change {
+ expect { subject }.to change {
account.muting?(target_account)
}.from(false).to(true)
end
context 'without specifying a notifications parameter' do
it 'mutes notifications from the account' do
- is_expected.to change {
+ expect { subject }.to change {
account.muting_notifications?(target_account)
}.from(false).to(true)
end
end
context 'with a true notifications parameter' do
- subject do
- -> { described_class.new.call(account, target_account, notifications: true) }
- end
+ subject { described_class.new.call(account, target_account, notifications: true) }
it 'mutes notifications from the account' do
- is_expected.to change {
+ expect { subject }.to change {
account.muting_notifications?(target_account)
}.from(false).to(true)
end
end
context 'with a false notifications parameter' do
- subject do
- -> { described_class.new.call(account, target_account, notifications: false) }
- end
+ subject { described_class.new.call(account, target_account, notifications: false) }
it 'does not mute notifications from the account' do
- is_expected.to_not change {
+ expect { subject }.to_not change {
account.muting_notifications?(target_account)
}.from(false)
end
diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb
index 7433866b7..294c31b04 100644
--- a/spec/services/notify_service_spec.rb
+++ b/spec/services/notify_service_spec.rb
@@ -1,9 +1,7 @@
require 'rails_helper'
RSpec.describe NotifyService, type: :service do
- subject do
- -> { described_class.new.call(recipient, type, activity) }
- end
+ subject { described_class.new.call(recipient, type, activity) }
let(:user) { Fabricate(:user) }
let(:recipient) { user.account }
@@ -11,42 +9,42 @@ RSpec.describe NotifyService, type: :service do
let(:activity) { Fabricate(:follow, account: sender, target_account: recipient) }
let(:type) { :follow }
- it { is_expected.to change(Notification, :count).by(1) }
+ it { expect { subject }.to change(Notification, :count).by(1) }
it 'does not notify when sender is blocked' do
recipient.block!(sender)
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
it 'does not notify when sender is muted with hide_notifications' do
recipient.mute!(sender, notifications: true)
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
it 'does notify when sender is muted without hide_notifications' do
recipient.mute!(sender, notifications: false)
- is_expected.to change(Notification, :count)
+ expect { subject }.to change(Notification, :count)
end
it 'does not notify when sender\'s domain is blocked' do
recipient.block_domain!(sender.domain)
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
it 'does still notify when sender\'s domain is blocked but sender is followed' do
recipient.block_domain!(sender.domain)
recipient.follow!(sender)
- is_expected.to change(Notification, :count)
+ expect { subject }.to change(Notification, :count)
end
it 'does not notify when sender is silenced and not followed' do
sender.silence!
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
it 'does not notify when recipient is suspended' do
recipient.suspend!
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
context 'for direct messages' do
@@ -61,7 +59,7 @@ RSpec.describe NotifyService, type: :service do
let(:enabled) { true }
it 'does not notify' do
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
context 'if the message chain is initiated by recipient, but is not direct message' do
@@ -70,7 +68,7 @@ RSpec.describe NotifyService, type: :service do
let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) }
it 'does not notify' do
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
end
@@ -81,7 +79,7 @@ RSpec.describe NotifyService, type: :service do
let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: dummy_reply)) }
it 'does not notify' do
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
end
@@ -91,7 +89,7 @@ RSpec.describe NotifyService, type: :service do
let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) }
it 'does notify' do
- is_expected.to change(Notification, :count)
+ expect { subject }.to change(Notification, :count)
end
end
end
@@ -100,7 +98,7 @@ RSpec.describe NotifyService, type: :service do
let(:enabled) { false }
it 'does notify' do
- is_expected.to change(Notification, :count)
+ expect { subject }.to change(Notification, :count)
end
end
end
@@ -112,17 +110,17 @@ RSpec.describe NotifyService, type: :service do
it 'shows reblogs by default' do
recipient.follow!(sender)
- is_expected.to change(Notification, :count)
+ expect { subject }.to change(Notification, :count)
end
it 'shows reblogs when explicitly enabled' do
recipient.follow!(sender, reblogs: true)
- is_expected.to change(Notification, :count)
+ expect { subject }.to change(Notification, :count)
end
it 'shows reblogs when disabled' do
recipient.follow!(sender, reblogs: false)
- is_expected.to change(Notification, :count)
+ expect { subject }.to change(Notification, :count)
end
end
@@ -134,12 +132,12 @@ RSpec.describe NotifyService, type: :service do
it 'does not notify when conversation is muted' do
recipient.mute_conversation!(activity.status.conversation)
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
it 'does not notify when it is a reply to a blocked user' do
recipient.block!(asshole)
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
end
@@ -147,7 +145,7 @@ RSpec.describe NotifyService, type: :service do
let(:sender) { recipient }
it 'does not notify when recipient is the sender' do
- is_expected.to_not change(Notification, :count)
+ expect { subject }.to_not change(Notification, :count)
end
end
@@ -163,7 +161,7 @@ RSpec.describe NotifyService, type: :service do
let(:enabled) { true }
it 'sends email' do
- is_expected.to change(ActionMailer::Base.deliveries, :count).by(1)
+ expect { subject }.to change(ActionMailer::Base.deliveries, :count).by(1)
end
end
@@ -171,7 +169,7 @@ RSpec.describe NotifyService, type: :service do
let(:enabled) { false }
it "doesn't send email" do
- is_expected.to_not change(ActionMailer::Base.deliveries, :count).from(0)
+ expect { subject }.to_not change(ActionMailer::Base.deliveries, :count).from(0)
end
end
end
diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb
index cf7eb257a..5d45e4ffd 100644
--- a/spec/services/suspend_account_service_spec.rb
+++ b/spec/services/suspend_account_service_spec.rb
@@ -5,9 +5,7 @@ RSpec.describe SuspendAccountService, type: :service do
let!(:local_follower) { Fabricate(:user, current_sign_in_at: 1.hour.ago).account }
let!(:list) { Fabricate(:list, account: local_follower) }
- subject do
- -> { described_class.new.call(account) }
- end
+ subject { described_class.new.call(account) }
before do
allow(FeedManager.instance).to receive(:unmerge_from_home).and_return(nil)
@@ -18,13 +16,13 @@ RSpec.describe SuspendAccountService, type: :service do
end
it "unmerges from local followers' feeds" do
- subject.call
+ subject
expect(FeedManager.instance).to have_received(:unmerge_from_home).with(account, local_follower)
expect(FeedManager.instance).to have_received(:unmerge_from_list).with(account, list)
end
it 'marks account as suspended' do
- is_expected.to change { account.suspended? }.from(false).to(true)
+ expect { subject }.to change { account.suspended? }.from(false).to(true)
end
end
@@ -51,7 +49,7 @@ RSpec.describe SuspendAccountService, type: :service do
end
it 'sends an update actor to followers and reporters' do
- subject.call
+ subject
expect(a_request(:post, remote_follower.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once
expect(a_request(:post, remote_reporter.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once
end
@@ -77,7 +75,7 @@ RSpec.describe SuspendAccountService, type: :service do
end
it 'sends a reject follow' do
- subject.call
+ subject
expect(a_request(:post, account.inbox_url).with { |req| match_reject_follow_request(req, account, local_followee) }).to have_been_made.once
end
end
diff --git a/spec/services/unsuspend_account_service_spec.rb b/spec/services/unsuspend_account_service_spec.rb
index 0593beb6f..3ac4cc085 100644
--- a/spec/services/unsuspend_account_service_spec.rb
+++ b/spec/services/unsuspend_account_service_spec.rb
@@ -5,9 +5,7 @@ RSpec.describe UnsuspendAccountService, type: :service do
let!(:local_follower) { Fabricate(:user, current_sign_in_at: 1.hour.ago).account }
let!(:list) { Fabricate(:list, account: local_follower) }
- subject do
- -> { described_class.new.call(account) }
- end
+ subject { described_class.new.call(account) }
before do
allow(FeedManager.instance).to receive(:merge_into_home).and_return(nil)
@@ -33,7 +31,7 @@ RSpec.describe UnsuspendAccountService, type: :service do
end
it 'marks account as unsuspended' do
- is_expected.to change { account.suspended? }.from(true).to(false)
+ expect { subject }.to change { account.suspended? }.from(true).to(false)
end
include_examples 'common behavior' do
@@ -47,13 +45,13 @@ RSpec.describe UnsuspendAccountService, type: :service do
end
it "merges back into local followers' feeds" do
- subject.call
+ subject
expect(FeedManager.instance).to have_received(:merge_into_home).with(account, local_follower)
expect(FeedManager.instance).to have_received(:merge_into_list).with(account, list)
end
it 'sends an update actor to followers and reporters' do
- subject.call
+ subject
expect(a_request(:post, remote_follower.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once
expect(a_request(:post, remote_reporter.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once
end
@@ -75,18 +73,18 @@ RSpec.describe UnsuspendAccountService, type: :service do
end
it 're-fetches the account' do
- subject.call
+ subject
expect(resolve_account_service).to have_received(:call).with(account)
end
it "merges back into local followers' feeds" do
- subject.call
+ subject
expect(FeedManager.instance).to have_received(:merge_into_home).with(account, local_follower)
expect(FeedManager.instance).to have_received(:merge_into_list).with(account, list)
end
it 'marks account as unsuspended' do
- is_expected.to change { account.suspended? }.from(true).to(false)
+ expect { subject }.to change { account.suspended? }.from(true).to(false)
end
end
@@ -99,18 +97,18 @@ RSpec.describe UnsuspendAccountService, type: :service do
end
it 're-fetches the account' do
- subject.call
+ subject
expect(resolve_account_service).to have_received(:call).with(account)
end
it "does not merge back into local followers' feeds" do
- subject.call
+ subject
expect(FeedManager.instance).to_not have_received(:merge_into_home).with(account, local_follower)
expect(FeedManager.instance).to_not have_received(:merge_into_list).with(account, list)
end
it 'does not mark the account as unsuspended' do
- is_expected.not_to change { account.suspended? }
+ expect { subject }.not_to change { account.suspended? }
end
end
@@ -120,12 +118,12 @@ RSpec.describe UnsuspendAccountService, type: :service do
end
it 're-fetches the account' do
- subject.call
+ subject
expect(resolve_account_service).to have_received(:call).with(account)
end
it "does not merge back into local followers' feeds" do
- subject.call
+ subject
expect(FeedManager.instance).to_not have_received(:merge_into_home).with(account, local_follower)
expect(FeedManager.instance).to_not have_received(:merge_into_list).with(account, list)
end
diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb
index 78cc89cd4..71a73be5b 100644
--- a/spec/services/update_status_service_spec.rb
+++ b/spec/services/update_status_service_spec.rb
@@ -3,6 +3,23 @@ require 'rails_helper'
RSpec.describe UpdateStatusService, type: :service do
subject { described_class.new }
+ context 'when nothing changes' do
+ let!(:status) { Fabricate(:status, text: 'Foo', language: 'en') }
+
+ before do
+ allow(ActivityPub::DistributionWorker).to receive(:perform_async)
+ subject.call(status, status.account_id, text: 'Foo')
+ end
+
+ it 'does not create an edit' do
+ expect(status.reload.edits).to be_empty
+ end
+
+ it 'does not notify anyone' do
+ expect(ActivityPub::DistributionWorker).to_not have_received(:perform_async)
+ end
+ end
+
context 'when text changes' do
let!(:status) { Fabricate(:status, text: 'Foo') }
let(:preview_card) { Fabricate(:preview_card) }
diff --git a/spec/validators/status_length_validator_spec.rb b/spec/validators/status_length_validator_spec.rb
index bef3f29f5..db9c728a8 100644
--- a/spec/validators/status_length_validator_spec.rb
+++ b/spec/validators/status_length_validator_spec.rb
@@ -50,6 +50,13 @@ describe StatusLengthValidator do
expect(status.errors).to have_received(:add)
end
+ it 'does not count overly long URLs as 23 characters flat' do
+ text = "http://example.com/valid?#{'#foo?' * 1000}"
+ status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false)
+ subject.validate(status)
+ expect(status.errors).to have_received(:add)
+ end
+
it 'counts only the front part of remote usernames' do
text = ('a' * 475) + " @alice@#{'b' * 30}.com"
status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false)
@@ -57,5 +64,13 @@ describe StatusLengthValidator do
subject.validate(status)
expect(status.errors).to_not have_received(:add)
end
+
+ it 'does count both parts of remote usernames for overly long domains' do
+ text = "@alice@#{'b' * 500}.com"
+ status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false)
+
+ subject.validate(status)
+ expect(status.errors).to have_received(:add)
+ end
end
end
diff --git a/streaming/index.js b/streaming/index.js
index 3db94b160..d6b445a91 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -167,6 +167,11 @@ const startWorker = async (workerId) => {
const redisPrefix = redisNamespace ? `${redisNamespace}:` : '';
+ /**
+ * @type {Object.>}
+ */
+ const subs = {};
+
const redisSubscribeClient = await redisUrlToClient(redisParams, process.env.REDIS_URL);
const redisClient = await redisUrlToClient(redisParams, process.env.REDIS_URL);
@@ -191,23 +196,55 @@ const startWorker = async (workerId) => {
};
/**
+ * @param {string} message
* @param {string} channel
- * @param {function(string): void} callback
*/
- const subscribe = (channel, callback) => {
- log.silly(`Adding listener for ${channel}`);
+ const onRedisMessage = (message, channel) => {
+ const callbacks = subs[channel];
- redisSubscribeClient.subscribe(channel, callback);
+ log.silly(`New message on channel ${channel}`);
+
+ if (!callbacks) {
+ return;
+ }
+
+ callbacks.forEach(callback => callback(message));
};
/**
* @param {string} channel
* @param {function(string): void} callback
*/
+ const subscribe = (channel, callback) => {
+ log.silly(`Adding listener for ${channel}`);
+
+ subs[channel] = subs[channel] || [];
+
+ if (subs[channel].length === 0) {
+ log.verbose(`Subscribe ${channel}`);
+ redisSubscribeClient.subscribe(channel, onRedisMessage);
+ }
+
+ subs[channel].push(callback);
+ };
+
+ /**
+ * @param {string} channel
+ */
const unsubscribe = (channel, callback) => {
log.silly(`Removing listener for ${channel}`);
- redisSubscribeClient.unsubscribe(channel, callback);
+ if (!subs[channel]) {
+ return;
+ }
+
+ subs[channel] = subs[channel].filter(item => item !== callback);
+
+ if (subs[channel].length === 0) {
+ log.verbose(`Unsubscribe ${channel}`);
+ redisSubscribeClient.unsubscribe(channel);
+ delete subs[channel];
+ }
};
const FALSE_VALUES = [
diff --git a/yarn.lock b/yarn.lock
index 5f709a419..96590f538 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -33,18 +33,18 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2"
integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==
-"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.7", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
- version "7.17.7"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.7.tgz#f7c28228c83cdf2dbd1b9baa06eaf9df07f0c2f9"
- integrity sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==
+"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.8", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a"
+ integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==
dependencies:
"@ampproject/remapping" "^2.1.0"
"@babel/code-frame" "^7.16.7"
"@babel/generator" "^7.17.7"
"@babel/helper-compilation-targets" "^7.17.7"
"@babel/helper-module-transforms" "^7.17.7"
- "@babel/helpers" "^7.17.7"
- "@babel/parser" "^7.17.7"
+ "@babel/helpers" "^7.17.8"
+ "@babel/parser" "^7.17.8"
"@babel/template" "^7.16.7"
"@babel/traverse" "^7.17.3"
"@babel/types" "^7.17.0"
@@ -96,10 +96,10 @@
browserslist "^4.17.5"
semver "^6.3.0"
-"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1":
- version "7.17.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz#9699f14a88833a7e055ce57dcd3ffdcd25186b21"
- integrity sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==
+"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6":
+ version "7.17.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9"
+ integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.16.7"
"@babel/helper-environment-visitor" "^7.16.7"
@@ -295,10 +295,10 @@
"@babel/traverse" "^7.16.8"
"@babel/types" "^7.16.8"
-"@babel/helpers@^7.17.7":
- version "7.17.7"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.7.tgz#6fc0a24280fd00026e85424bbfed4650e76d7127"
- integrity sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==
+"@babel/helpers@^7.17.8":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.8.tgz#288450be8c6ac7e4e44df37bcc53d345e07bc106"
+ integrity sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==
dependencies:
"@babel/template" "^7.16.7"
"@babel/traverse" "^7.17.3"
@@ -322,10 +322,10 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.7", "@babel/parser@^7.7.0":
- version "7.17.7"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.7.tgz#fc19b645a5456c8d6fdb6cecd3c66c0173902800"
- integrity sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8", "@babel/parser@^7.7.0":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240"
+ integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
version "7.16.7"
@@ -369,12 +369,12 @@
"@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
-"@babel/plugin-proposal-decorators@^7.17.2":
- version "7.17.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493"
- integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==
+"@babel/plugin-proposal-decorators@^7.17.8":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz#4f0444e896bee85d35cf714a006fc5418f87ff00"
+ integrity sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.17.1"
+ "@babel/helper-create-class-features-plugin" "^7.17.6"
"@babel/helper-plugin-utils" "^7.16.7"
"@babel/helper-replace-supers" "^7.16.7"
"@babel/plugin-syntax-decorators" "^7.17.0"
@@ -1036,10 +1036,10 @@
dependencies:
regenerator-runtime "^0.12.0"
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.7", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
- version "7.17.7"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825"
- integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2"
+ integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==
dependencies:
regenerator-runtime "^0.13.4"
@@ -1498,10 +1498,10 @@
lz-string "^1.4.4"
pretty-format "^27.0.2"
-"@testing-library/jest-dom@^5.16.2":
- version "5.16.2"
- resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz#f329b36b44aa6149cd6ced9adf567f8b6aa1c959"
- integrity sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug==
+"@testing-library/jest-dom@^5.16.3":
+ version "5.16.3"
+ resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.3.tgz#b76851a909586113c20486f1679ffb4d8ec27bfa"
+ integrity sha512-u5DfKj4wfSt6akfndfu1eG06jsdyA/IUrlX2n3pyq5UXgXMhXY+NJb8eNK/7pqPWAhCKsCGWDdDO0zKMKAYkEA==
dependencies:
"@babel/runtime" "^7.9.2"
"@types/testing-library__jest-dom" "^5.9.1"
@@ -2369,13 +2369,13 @@ babel-jest@^27.5.1:
graceful-fs "^4.2.9"
slash "^3.0.0"
-babel-loader@^8.2.3:
- version "8.2.3"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d"
- integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==
+babel-loader@^8.2.4:
+ version "8.2.4"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.4.tgz#95f5023c791b2e9e2ca6f67b0984f39c82ff384b"
+ integrity sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==
dependencies:
find-cache-dir "^3.3.1"
- loader-utils "^1.4.0"
+ loader-utils "^2.0.0"
make-dir "^3.1.0"
schema-utils "^2.6.5"
@@ -2951,7 +2951,7 @@ caniuse-api@^3.0.0:
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001271, caniuse-lite@^1.0.30001286:
version "1.0.30001310"
- resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001310.tgz"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001310.tgz#da02cd07432c9eece6992689d1b84ca18139eea8"
integrity sha512-cb9xTV8k9HTIUA3GnPUJCk0meUnrHL5gy5QePfDjxHyNBcnzPzrHFv5GqfP7ue5b1ZyzZL0RJboD6hQlPXjhjg==
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
@@ -4395,10 +4395,10 @@ eslint-plugin-promise@~6.0.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18"
integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==
-eslint-plugin-react@~7.29.3:
- version "7.29.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz#f4eab757f2756d25d6d4c2a58a9e20b004791f05"
- integrity sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg==
+eslint-plugin-react@~7.29.4:
+ version "7.29.4"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2"
+ integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==
dependencies:
array-includes "^3.1.4"
array.prototype.flatmap "^1.2.5"
@@ -8659,6 +8659,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+prettier@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17"
+ integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==
+
pretty-format@^25.2.1, pretty-format@^25.5.0:
version "25.5.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a"
@@ -11539,10 +11544,10 @@ yargs@^16.2.0:
y18n "^5.0.5"
yargs-parser "^20.2.2"
-yargs@^17.3.1:
- version "17.3.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9"
- integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==
+yargs@^17.4.0:
+ version "17.4.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.0.tgz#9fc9efc96bd3aa2c1240446af28499f0e7593d00"
+ integrity sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==
dependencies:
cliui "^7.0.2"
escalade "^3.1.1"