diff --git a/Gemfile.lock b/Gemfile.lock index 48fd05b1ac..de541edfbd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -458,7 +458,7 @@ GEM nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) - oj (3.16.5) + oj (3.16.6) bigdecimal (>= 3.0) ostruct (>= 0.2) omniauth (2.1.2) diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 7236c9633d..6c32fd245d 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -12,7 +12,6 @@ import { HotKeys } from 'react-hotkeys'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import PushPinIcon from '@/material-icons/400-24px/push_pin.svg?react'; import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; -import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; import { ContentWarning } from 'mastodon/components/content_warning'; import { FilterWarning } from 'mastodon/components/filter_warning'; import { Icon } from 'mastodon/components/icon'; @@ -34,6 +33,7 @@ import { getHashtagBarForStatus } from './hashtag_bar'; import { RelativeTimestamp } from './relative_timestamp'; import StatusActionBar from './status_action_bar'; import StatusContent from './status_content'; +import { StatusThreadLabel } from './status_thread_label'; import { VisibilityIcon } from './visibility_icon'; const domParser = new DOMParser(); @@ -413,7 +413,7 @@ class Status extends ImmutablePureComponent { if (featured) { prepend = (
-
+
); @@ -422,7 +422,7 @@ class Status extends ImmutablePureComponent { prepend = (
-
+
}} />
); @@ -434,18 +434,13 @@ class Status extends ImmutablePureComponent { } else if (status.get('visibility') === 'direct') { prepend = (
-
+
); - } else if (showThread && status.get('in_reply_to_id') && status.get('in_reply_to_account_id') === status.getIn(['account', 'id'])) { - const display_name_html = { __html: status.getIn(['account', 'display_name_html']) }; - + } else if (showThread && status.get('in_reply_to_id')) { prepend = ( -
-
- }} /> -
+ ); } diff --git a/app/javascript/mastodon/components/status_thread_label.tsx b/app/javascript/mastodon/components/status_thread_label.tsx new file mode 100644 index 0000000000..b18aca6dcb --- /dev/null +++ b/app/javascript/mastodon/components/status_thread_label.tsx @@ -0,0 +1,50 @@ +import { FormattedMessage } from 'react-intl'; + +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import { Icon } from 'mastodon/components/icon'; +import { DisplayedName } from 'mastodon/features/notifications_v2/components/displayed_name'; +import { useAppSelector } from 'mastodon/store'; + +export const StatusThreadLabel: React.FC<{ + accountId: string; + inReplyToAccountId: string; +}> = ({ accountId, inReplyToAccountId }) => { + const inReplyToAccount = useAppSelector((state) => + state.accounts.get(inReplyToAccountId), + ); + + let label; + + if (accountId === inReplyToAccountId) { + label = ( + + ); + } else if (inReplyToAccount) { + label = ( + }} + /> + ); + } else { + label = ( + + ); + } + + return ( +
+
+ +
+ {label} +
+ ); +}; diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index d99b5c7375..5981c1df84 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -780,6 +780,7 @@ "status.bookmark": "Marca", "status.cancel_reblog_private": "Desfés l'impuls", "status.cannot_reblog": "No es pot impulsar aquest tut", + "status.continued_thread": "Continuació del fil", "status.copy": "Copia l'enllaç al tut", "status.delete": "Elimina", "status.detailed_status": "Vista detallada de la conversa", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Encara no ha impulsat ningú aquest tut. Quan algú ho faci, apareixerà aquí.", "status.redraft": "Esborra i reescriu", "status.remove_bookmark": "Elimina el marcador", + "status.replied_in_thread": "Respost al fil", "status.replied_to": "En resposta a {name}", "status.reply": "Respon", "status.replyAll": "Respon al fil", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 732e4a100e..4155dc9fc5 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -780,6 +780,7 @@ "status.bookmark": "Bogmærk", "status.cancel_reblog_private": "Fjern boost", "status.cannot_reblog": "Dette indlæg kan ikke fremhæves", + "status.continued_thread": "Fortsat tråd", "status.copy": "Kopiér link til indlæg", "status.delete": "Slet", "status.detailed_status": "Detaljeret samtalevisning", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Ingen har endnu fremhævet dette indlæg. Når nogen gør, vil det fremgå hér.", "status.redraft": "Slet og omformulér", "status.remove_bookmark": "Fjern bogmærke", + "status.replied_in_thread": "Svaret i tråd", "status.replied_to": "Besvarede {name}", "status.reply": "Besvar", "status.replyAll": "Besvar alle", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 3c180f9f5c..e37a595469 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -780,6 +780,7 @@ "status.bookmark": "Beitrag als Lesezeichen setzen", "status.cancel_reblog_private": "Beitrag nicht mehr teilen", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", + "status.continued_thread": "Fortgeführter Thread", "status.copy": "Link zum Beitrag kopieren", "status.delete": "Beitrag löschen", "status.detailed_status": "Detaillierte Ansicht der Unterhaltung", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Diesen Beitrag hat bisher noch niemand geteilt. Sobald es jemand tut, wird das Profil hier erscheinen.", "status.redraft": "Löschen und neu erstellen", "status.remove_bookmark": "Lesezeichen entfernen", + "status.replied_in_thread": "Antwortete im Thread", "status.replied_to": "Antwortete {name}", "status.reply": "Antworten", "status.replyAll": "Allen antworten", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 4321acef4b..7c1d7f126d 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -780,6 +780,7 @@ "status.bookmark": "Bookmark", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.continued_thread": "Continued thread", "status.copy": "Copy link to post", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", @@ -813,6 +814,7 @@ "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.remove_bookmark": "Remove bookmark", + "status.replied_in_thread": "Replied in thread", "status.replied_to": "Replied to {name}", "status.reply": "Reply", "status.replyAll": "Reply to thread", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index c3915c9b74..20d93ed011 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -780,6 +780,7 @@ "status.bookmark": "Marcar", "status.cancel_reblog_private": "Quitar adhesión", "status.cannot_reblog": "No se puede adherir a este mensaje", + "status.continued_thread": "Continuación de hilo", "status.copy": "Copiar enlace al mensaje", "status.delete": "Eliminar", "status.detailed_status": "Vista de conversación detallada", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Todavía nadie adhirió a este mensaje. Cuando alguien lo haga, se mostrará acá.", "status.redraft": "Eliminar mensaje original y editarlo", "status.remove_bookmark": "Quitar marcador", + "status.replied_in_thread": "Respuesta en hilo", "status.replied_to": "Respondió a {name}", "status.reply": "Responder", "status.replyAll": "Responder al hilo", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 79ca95a58c..8f9cc5fe4d 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,6 +1,6 @@ { "about.blocks": "Moderoidut palvelimet", - "about.contact": "Yhteystiedot:", + "about.contact": "Yhteydenotto:", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", "about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", @@ -780,6 +780,7 @@ "status.bookmark": "Lisää kirjanmerkki", "status.cancel_reblog_private": "Peru tehostus", "status.cannot_reblog": "Tätä julkaisua ei voi tehostaa", + "status.continued_thread": "Jatkoi ketjua", "status.copy": "Kopioi linkki julkaisuun", "status.delete": "Poista", "status.detailed_status": "Yksityiskohtainen keskustelunäkymä", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Kukaan ei ole vielä tehostanut tätä julkaisua. Kun joku tekee niin, tulee hän tähän näkyviin.", "status.redraft": "Poista ja palauta muokattavaksi", "status.remove_bookmark": "Poista kirjanmerkki", + "status.replied_in_thread": "Vastasi ketjuun", "status.replied_to": "Vastaus käyttäjälle {name}", "status.reply": "Vastaa", "status.replyAll": "Vastaa ketjuun", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 5a5ac1dd38..df477fe9e2 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -223,7 +223,7 @@ "domain_block_modal.title": "Bloquear dominio?", "domain_block_modal.you_will_lose_followers": "Vanse eliminar todas as túas seguidoras deste servidor.", "domain_block_modal.you_wont_see_posts": "Non verás publicacións ou notificacións das usuarias deste servidor.", - "domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras apps sociais.", + "domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras sociais.", "domain_pill.activitypub_like_language": "ActivityPub é algo así como o idioma que Mastodon fala con outras redes sociais.", "domain_pill.server": "Servidor", "domain_pill.their_handle": "O seu alcume:", @@ -231,8 +231,8 @@ "domain_pill.their_username": "O seu identificador único no seu servidor. É posible atopar usuarias co mesmo nome de usuaria en diferentes servidores.", "domain_pill.username": "Nome de usuaria", "domain_pill.whats_in_a_handle": "As partes do alcume?", - "domain_pill.who_they_are": "O alcume dinos quen é esa persoa e onde está, para que poidas interactuar con ela en toda a web social de .", - "domain_pill.who_you_are": "Como o teu alcume informa de quen es e onde estás, as persoas poden interactuar contigo desde toda a web social de .", + "domain_pill.who_they_are": "O alcume dinos quen é esa persoa e onde está, para que poidas interactuar con ela en toda a web social das .", + "domain_pill.who_you_are": "Como o teu alcume informa de quen es e onde estás, as persoas poden interactuar contigo desde toda a web social das .", "domain_pill.your_handle": "O teu alcume:", "domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.", "domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.", @@ -272,7 +272,7 @@ "empty_column.list": "Aínda non hai nada nesta listaxe. Cando as usuarias incluídas na listaxe publiquen mensaxes, amosaranse aquí.", "empty_column.lists": "Aínda non tes listaxes. Cando crees unha, amosarase aquí.", "empty_column.mutes": "Aínda non silenciaches a ningúnha usuaria.", - "empty_column.notification_requests": "Todo ben! Nada por aquí. Cando recibas novas notificación aparecerán aquí seguindo o criterio dos teus axustes.", + "empty_column.notification_requests": "Todo ben! Nada por aquí. Cando recibas novas notificacións aparecerán aquí seguindo o criterio dos teus axustes.", "empty_column.notifications": "Aínda non tes notificacións. Aparecerán cando outras persoas interactúen contigo.", "empty_column.public": "Nada por aquí! Escribe algo de xeito público, ou segue de xeito manual usuarias doutros servidores para ir enchéndoo", "error.unexpected_crash.explanation": "Debido a un erro no noso código ou a unha compatilidade co teu navegador, esta páxina non pode ser amosada correctamente.", @@ -641,7 +641,7 @@ "onboarding.steps.publish_status.title": "Escribe a túa primeira publicación", "onboarding.steps.setup_profile.body": "Ao engadir información ao teu perfil é máis probable que teñas máis interaccións.", "onboarding.steps.setup_profile.title": "Personaliza o perfil", - "onboarding.steps.share_profile.body": "Dille ás amizades como poden atoparte en Mastodon!", + "onboarding.steps.share_profile.body": "Dille ás amizades como poden atoparte en Mastodon.", "onboarding.steps.share_profile.title": "Comparte o teu perfil en Mastodon", "onboarding.tips.2fa": "Sabes que? Podes protexer a túa conta configurando un segundo factor de autenticación nos axustes. Funciona con calquera app TOTP, non precisas un número de teléfono!", "onboarding.tips.accounts_from_other_servers": "Sabes que? Como Mastodon é descentralizado, algúns perfís que atopes estarán en servidores diferentes ao teu. Pero podes interactuar igualmente con eles! O seu servidor é o que ven despois da @ no seu identificador!", @@ -780,6 +780,7 @@ "status.bookmark": "Marcar", "status.cancel_reblog_private": "Desfacer compartido", "status.cannot_reblog": "Esta publicación non pode ser promovida", + "status.continued_thread": "Continua co fío", "status.copy": "Copiar ligazón á publicación", "status.delete": "Eliminar", "status.detailed_status": "Vista detallada da conversa", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Aínda ninguén promoveu esta publicación. Cando alguén o faga, amosarase aquí.", "status.redraft": "Eliminar e reescribir", "status.remove_bookmark": "Eliminar marcador", + "status.replied_in_thread": "Respondeu nun fío", "status.replied_to": "Respondeu a {name}", "status.reply": "Responder", "status.replyAll": "Responder ao tema", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 44c95d64c6..47fc444e88 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -780,6 +780,7 @@ "status.bookmark": "סימניה", "status.cancel_reblog_private": "הסרת הדהוד", "status.cannot_reblog": "לא ניתן להדהד חצרוץ זה", + "status.continued_thread": "שרשור מתמשך", "status.copy": "העתק/י קישור להודעה זו", "status.delete": "מחיקה", "status.detailed_status": "תצוגת שיחה מפורטת", @@ -813,6 +814,7 @@ "status.reblogs.empty": "עוד לא הידהדו את ההודעה הזו. כאשר זה יקרה, ההדהודים יופיעו כאן.", "status.redraft": "מחיקה ועריכה מחדש", "status.remove_bookmark": "הסרת סימניה", + "status.replied_in_thread": "תגובה לשרשור", "status.replied_to": "בתגובה לחשבון {name}", "status.reply": "תגובה", "status.replyAll": "תגובה לשרשור", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index d55a85ee33..f0f08ca50c 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -780,6 +780,7 @@ "status.bookmark": "Könyvjelzőzés", "status.cancel_reblog_private": "Megtolás visszavonása", "status.cannot_reblog": "Ezt a bejegyzést nem lehet megtolni", + "status.continued_thread": "Folytatott szál", "status.copy": "Link másolása bejegyzésbe", "status.delete": "Törlés", "status.detailed_status": "Részletes beszélgetési nézet", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Senki sem tolta még meg ezt a bejegyzést. Ha valaki megteszi, itt fog megjelenni.", "status.redraft": "Törlés és újraírás", "status.remove_bookmark": "Könyvjelző eltávolítása", + "status.replied_in_thread": "Válaszolva a szálban", "status.replied_to": "Megválaszolva {name} számára", "status.reply": "Válasz", "status.replyAll": "Válasz a beszélgetésre", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index f58c405f28..55ef2afce8 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -770,6 +770,7 @@ "status.bookmark": "Pridėti į žymės", "status.cancel_reblog_private": "Nebepakelti", "status.cannot_reblog": "Šis įrašas negali būti pakeltas.", + "status.continued_thread": "Tęsiama gijoje", "status.copy": "Kopijuoti nuorodą į įrašą", "status.delete": "Ištrinti", "status.detailed_status": "Išsami pokalbio peržiūra", @@ -802,6 +803,7 @@ "status.reblogs.empty": "Šio įrašo dar niekas nepakėlė. Kai kas nors tai padarys, jie bus rodomi čia.", "status.redraft": "Ištrinti ir parengti iš naujo", "status.remove_bookmark": "Pašalinti žymę", + "status.replied_in_thread": "Atsakyta gijoje", "status.replied_to": "Atsakyta į {name}", "status.reply": "Atsakyti", "status.replyAll": "Atsakyti į giją", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 3526568249..7956435361 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -780,6 +780,7 @@ "status.bookmark": "Bladwijzer toevoegen", "status.cancel_reblog_private": "Niet langer boosten", "status.cannot_reblog": "Dit bericht kan niet geboost worden", + "status.continued_thread": "Vervolgt het gesprek", "status.copy": "Link naar bericht kopiëren", "status.delete": "Verwijderen", "status.detailed_status": "Uitgebreide gespreksweergave", @@ -813,6 +814,7 @@ "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.replied_in_thread": "Reageerde in gesprek", "status.replied_to": "Reageerde op {name}", "status.reply": "Reageren", "status.replyAll": "Op iedereen reageren", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 09ac636185..6bf6252d70 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -780,6 +780,7 @@ "status.bookmark": "Dodaj zakładkę", "status.cancel_reblog_private": "Cofnij podbicie", "status.cannot_reblog": "Ten wpis nie może zostać podbity", + "status.continued_thread": "Ciąg dalszy wątku", "status.copy": "Skopiuj odnośnik do wpisu", "status.delete": "Usuń", "status.detailed_status": "Szczegółowy widok konwersacji", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Nikt nie podbił jeszcze tego wpisu. Gdy ktoś to zrobi, pojawi się tutaj.", "status.redraft": "Usuń i przeredaguj", "status.remove_bookmark": "Usuń zakładkę", + "status.replied_in_thread": "Odpowiedź w wątku", "status.replied_to": "Odpowiedź do wpisu użytkownika {name}", "status.reply": "Odpowiedz", "status.replyAll": "Odpowiedz na wątek", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 2d0013d607..fd811d6833 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -278,7 +278,7 @@ "error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a um problema de compatibilidade do navegador, esta página não pôde ser apresentada corretamente.", "error.unexpected_crash.explanation_addons": "Esta página não pôde ser exibida corretamente. Este erro provavelmente é causado por um complemento do navegador ou ferramentas de tradução automática.", "error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, pode usar o Mastodon através de um navegador diferente ou uma aplicação nativa.", - "error.unexpected_crash.next_steps_addons": "Tente desabilitá-los e atualizar a página. Se isso não ajudar, você ainda poderá usar o Mastodon por meio de um navegador diferente ou de um aplicativo nativo.", + "error.unexpected_crash.next_steps_addons": "Tente desativá-los e atualizar a página. Se isso não ajudar, poderá ainda ser possível utilizar o Mastodon através de um navegador diferente ou de uma aplicação nativa.", "errors.unexpected_crash.copy_stacktrace": "Copiar a stacktrace para o clipboard", "errors.unexpected_crash.report_issue": "Reportar problema", "explore.search_results": "Resultados da pesquisa", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 9b94ede76a..4873fa943e 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -780,6 +780,7 @@ "status.bookmark": "Yer işareti ekle", "status.cancel_reblog_private": "Yeniden paylaşımı geri al", "status.cannot_reblog": "Bu gönderi yeniden paylaşılamaz", + "status.continued_thread": "Devam eden akış", "status.copy": "Gönderi bağlantısını kopyala", "status.delete": "Sil", "status.detailed_status": "Ayrıntılı sohbet görünümü", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Henüz hiç kimse bu gönderiyi yeniden paylaşmadı. Herhangi bir kullanıcı yeniden paylaştığında burada görüntülenecek.", "status.redraft": "Sil,Düzenle ve Yeniden paylaş", "status.remove_bookmark": "Yer işaretini kaldır", + "status.replied_in_thread": "Akışta yanıtlandı", "status.replied_to": "{name} kullanıcısına yanıt verdi", "status.reply": "Yanıtla", "status.replyAll": "Konuyu yanıtla", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 714348db25..b63596037b 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -780,6 +780,7 @@ "status.bookmark": "Додати до закладок", "status.cancel_reblog_private": "Скасувати поширення", "status.cannot_reblog": "Цей допис не може бути поширений", + "status.continued_thread": "Continued thread", "status.copy": "Копіювати посилання на допис", "status.delete": "Видалити", "status.detailed_status": "Детальний вигляд бесіди", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index ea4ebcda47..94adc9af2d 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -95,7 +95,7 @@ "block_modal.they_cant_see_posts": "他们看不到你的嘟文,你也看不到他们的嘟文。", "block_modal.they_will_know": "他们将能看到他们被屏蔽。", "block_modal.title": "是否屏蔽该用户?", - "block_modal.you_wont_see_mentions": "你将无法看到提及他们的嘟文。", + "block_modal.you_wont_see_mentions": "你将不会看到提及他们的嘟文。", "boost_modal.combo": "下次按住 {combo} 即可跳过此提示", "boost_modal.reblog": "是否转嘟?", "boost_modal.undo_reblog": "是否取消转嘟?", @@ -780,6 +780,7 @@ "status.bookmark": "添加到书签", "status.cancel_reblog_private": "取消转贴", "status.cannot_reblog": "这条嘟文不允许被转嘟", + "status.continued_thread": "继续线程", "status.copy": "复制嘟文链接", "status.delete": "删除", "status.detailed_status": "详细的对话视图", @@ -813,6 +814,7 @@ "status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。", "status.redraft": "删除并重新编辑", "status.remove_bookmark": "移除书签", + "status.replied_in_thread": "已在线程中回复", "status.replied_to": "回复给 {name}", "status.reply": "回复", "status.replyAll": "回复所有人", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 257bec0163..e671803573 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -780,6 +780,7 @@ "status.bookmark": "書籤", "status.cancel_reblog_private": "取消轉嘟", "status.cannot_reblog": "這則嘟文無法被轉嘟", + "status.continued_thread": "接續討論串", "status.copy": "複製嘟文連結", "status.delete": "刪除", "status.detailed_status": "詳細的對話內容", @@ -813,6 +814,7 @@ "status.reblogs.empty": "還沒有人轉嘟過這則嘟文。當有人轉嘟時,它將於此顯示。", "status.redraft": "刪除並重新編輯", "status.remove_bookmark": "移除書籤", + "status.replied_in_thread": "於討論串中回覆", "status.replied_to": "回覆 {name}", "status.reply": "回覆", "status.replyAll": "回覆討論串", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index a82c41a47c..a69dc56cde 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1607,15 +1607,29 @@ body > [data-popper-placement] { .status__prepend { padding: 16px; padding-bottom: 0; - display: inline-flex; - gap: 10px; + display: flex; + align-items: center; + gap: 8px; font-size: 15px; line-height: 22px; font-weight: 500; color: $dark-text-color; - .status__display-name strong { - color: $dark-text-color; + &__icon { + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + + .icon { + width: 16px; + height: 16px; + } + } + + a { + color: inherit; + text-decoration: none; } > span { diff --git a/app/models/account.rb b/app/models/account.rb index e7a4ef937e..a025792256 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -111,10 +111,12 @@ class Account < ApplicationRecord validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? } validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? } validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? } - validates :uri, absence: true, if: :local?, on: :create - validates :inbox_url, absence: true, if: :local?, on: :create - validates :shared_inbox_url, absence: true, if: :local?, on: :create - validates :followers_url, absence: true, if: :local?, on: :create + with_options on: :create do + validates :uri, absence: true, if: :local? + validates :inbox_url, absence: true, if: :local? + validates :shared_inbox_url, absence: true, if: :local? + validates :followers_url, absence: true, if: :local? + end normalizes :username, with: ->(username) { username.squish } diff --git a/app/models/featured_tag.rb b/app/models/featured_tag.rb index cdd97205eb..a4e7b7cf6f 100644 --- a/app/models/featured_tag.rb +++ b/app/models/featured_tag.rb @@ -45,7 +45,7 @@ class FeaturedTag < ApplicationRecord end def decrement(deleted_status_id) - update(statuses_count: [0, statuses_count - 1].max, last_status_at: visible_tagged_account_statuses.where.not(id: deleted_status_id).select(:created_at).first&.created_at) + update(statuses_count: [0, statuses_count - 1].max, last_status_at: visible_tagged_account_statuses.where.not(id: deleted_status_id).pick(:created_at)) end private @@ -56,7 +56,7 @@ class FeaturedTag < ApplicationRecord def reset_data self.statuses_count = visible_tagged_account_statuses.count - self.last_status_at = visible_tagged_account_statuses.select(:created_at).first&.created_at + self.last_status_at = visible_tagged_account_statuses.pick(:created_at) end def validate_featured_tags_limit diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 8918228f46..121266916f 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -25,7 +25,7 @@ ca: admin: account_actions: action: Realitza l'acció - already_silenced: Aquest compte ja s'ha silenciat. + already_silenced: Aquest compte ja s'ha limitat. already_suspended: Aquest compte ja s'ha suspès. title: Fer l'acció de moderació a %{acct} account_moderation_notes: @@ -61,6 +61,7 @@ ca: demote: Degrada destroyed_msg: Les dades de %{username} son a la cua per a ser esborrades en breu disable: Inhabilita + disable_sign_in_token_auth: Desactivar l'autenticació de token per correu-e disable_two_factor_authentication: Desactiva 2FA disabled: Inhabilitat display_name: Nom visible @@ -69,6 +70,7 @@ ca: email: Adreça electrònica email_status: Estat de l'adreça electrònica enable: Habilita + enable_sign_in_token_auth: Activar l'autenticació de token per correu-e enabled: Habilitat enabled_msg: El compte de %{username} s’ha descongelat amb èxit followers: Seguidors @@ -201,8 +203,10 @@ ca: destroy_user_role: Destrueix Rol disable_2fa_user: Desactiva 2FA disable_custom_emoji: Desactiva l'emoji personalitzat + disable_sign_in_token_auth_user: Desactivar l'autenticació de token per correu-e per a l'usuari disable_user: Deshabilita l'usuari enable_custom_emoji: Activa l'emoji personalitzat + enable_sign_in_token_auth_user: Activar l'autenticació de token per correu-e per a l'usuari enable_user: Activa l'usuari memorialize_account: Memoritza el compte promote_user: Promou l'usuari @@ -237,17 +241,21 @@ ca: confirm_user_html: "%{name} ha confirmat l'adreça del correu electrònic de l'usuari %{target}" create_account_warning_html: "%{name} ha enviat un avís a %{target}" create_announcement_html: "%{name} ha creat un nou anunci %{target}" + create_canonical_email_block_html: "%{name} ha blocat l'adreça de correu electrònic amb el hash %{target}" create_custom_emoji_html: "%{name} ha pujat un emoji nou %{target}" create_domain_allow_html: "%{name} ha permès la federació amb el domini %{target}" create_domain_block_html: "%{name} ha bloquejat el domini %{target}" + create_email_domain_block_html: "%{name} ha blocat el domini de correu electrònic %{target}" create_ip_block_html: "%{name} ha creat una regla per a l'IP %{target}" create_unavailable_domain_html: "%{name} ha aturat el lliurament al domini %{target}" create_user_role_html: "%{name} ha creat el rol %{target}" demote_user_html: "%{name} ha degradat l'usuari %{target}" destroy_announcement_html: "%{name} ha eliminat l'anunci %{target}" + destroy_canonical_email_block_html: "%{name} ha desblocat el correu electrònic amb el hash %{target}" destroy_custom_emoji_html: "%{name} ha esborrat l'emoji %{target}" destroy_domain_allow_html: "%{name} no permet la federació amb el domini %{target}" destroy_domain_block_html: "%{name} ha desbloquejat el domini %{target}" + destroy_email_domain_block_html: "%{name} ha desblocat el domini de correu electrònic %{target}" destroy_instance_html: "%{name} ha purgat el domini %{target}" destroy_ip_block_html: "%{name} ha esborrat la regla per a l'IP %{target}" destroy_status_html: "%{name} ha eliminat el tut de %{target}" @@ -255,8 +263,10 @@ ca: destroy_user_role_html: "%{name} ha esborrat el rol %{target}" disable_2fa_user_html: "%{name} ha desactivat el requisit de dos factors per a l'usuari %{target}" disable_custom_emoji_html: "%{name} ha desactivat l'emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} ha desactivat l'autenticació de token per correu-e per a %{target}" disable_user_html: "%{name} ha desactivat l'accés del usuari %{target}" enable_custom_emoji_html: "%{name} ha activat l'emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} ha activat l'autenticació de token per correu-e per a %{target}" enable_user_html: "%{name} ha activat l'accés del usuari %{target}" memorialize_account_html: "%{name} ha convertit el compte %{target} en una pàgina de memorial" promote_user_html: "%{name} ha promogut l'usuari %{target}" @@ -264,6 +274,7 @@ ca: reject_user_html: "%{name} ha rebutjat el registre de %{target}" remove_avatar_user_html: "%{name} ha eliminat l'avatar de %{target}" reopen_report_html: "%{name} ha reobert l'informe %{target}" + resend_user_html: "%{name} ha reenviat el correu-e de confirmació per %{target}" reset_password_user_html: "%{name} ha restablert la contrasenya de l'usuari %{target}" resolve_report_html: "%{name} ha resolt l'informe %{target}" sensitive_account_html: "%{name} ha marcat els mèdia de %{target} com a sensibles" @@ -432,6 +443,7 @@ ca: new: create: Afegir un domini resolve: Resol domini + title: Blocar el nou domini de correu-e not_permitted: No permés resolved_through_html: Resolt mitjançant %{domain} export_domain_allows: @@ -1402,6 +1414,7 @@ ca: authentication_methods: otp: aplicació d'autenticació de dos factors password: contrasenya + sign_in_token: codi de seguretat per correu electrònic webauthn: claus de seguretat description_html: Si veus activitat que no reconeixes, considera canviar la teva contrasenya i activar l'autenticació de dos factors. empty: Historial d'autenticació no disponible @@ -1412,6 +1425,16 @@ ca: unsubscribe: action: Sí, canceŀla la subscripció complete: Subscripció cancel·lada + confirmation_html: Segur que vols donar-te de baixa de rebre %{type} de Mastodon a %{domain} a %{email}? Sempre pots subscriure't de nou des de la configuració de les notificacions per correu electrònic. + emails: + notification_emails: + favourite: notificacions dels favorits per correu electrònic + follow: notificacions dels seguiments per correu electrònic + follow_request: correus electrònics de peticions de seguiment + mention: correus electrònics de notificacions de mencions + reblog: correus electrònics de notificacions d'impulsos + resubscribe_html: Si ets dones de baixa per error pots donar-te d'alta des de la configuració de les notificacions per correu electrònic. + success_html: Ja no rebràs %{type} de Mastodon a %{domain} a %{email}. title: Cancel·la la subscripció media_attachments: validations: @@ -1493,6 +1516,8 @@ ca: update: subject: "%{name} ha editat una publicació" notifications: + administration_emails: Notificacions per correu-e de l'administrador + email_events: Esdeveniments per a notificacions de correu electrònic email_events_hint: 'Selecciona els esdeveniments per als quals vols rebre notificacions:' number: human: @@ -1651,6 +1676,7 @@ ca: import: Importació import_and_export: Importació i exportació migrate: Migració del compte + notifications: Notificacions per correu electrònic preferences: Preferències profile: Perfil relationships: Seguits i seguidors @@ -1897,6 +1923,7 @@ ca: invalid_otp_token: El codi de dos factors no és correcte otp_lost_help_html: Si has perdut l'accés a tots dos pots contactar per %{email} rate_limited: Excessius intents d'autenticació, torneu-hi més tard. + seamless_external_login: Has iniciat sessió via un servei extern. Així, els ajustos de contrasenya i correu electrònic no estan disponibles. signed_in_as: 'Sessió iniciada com a:' verification: extra_instructions_html: Consell: l'enllaç al vostre lloc web pot ser invisible. La part important és rel="me" que evita que us suplantin la identitat a llocs web amb contingut generat pels usuaris. Fins i tot podeu generar una etiqueta link a la capçalera de la pàgina en comptes d'una a, però el codi HTML ha de ser accessible sense requerir executar JavaScript. diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 4a01967e23..b3886ffeb2 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -33,7 +33,6 @@ cy: admin: account_actions: action: Cyflawni gweithred - already_silenced: Mae'r cyfrif hwn eisoes wedi'i dewi. already_suspended: Mae'r cyfrif hwn eisoes wedi'i atal. title: Cyflawni gweithred cymedroli ar %{acct} account_moderation_notes: diff --git a/config/locales/da.yml b/config/locales/da.yml index e3f8343452..89430e37ed 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -25,7 +25,7 @@ da: admin: account_actions: action: Udfør handling - already_silenced: Denne konto er allerede gjort tavs. + already_silenced: Denne konto er allerede blevet begrænset. already_suspended: Denne konto er allerede suspenderet. title: Udfør moderatorhandling på %{acct} account_moderation_notes: diff --git a/config/locales/de.yml b/config/locales/de.yml index 2952d22d7c..975ec517f7 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -25,7 +25,6 @@ de: admin: account_actions: action: Aktion ausführen - already_silenced: Dieses Konto wurde bereits stummgeschaltet. already_suspended: Dieses Konto wurde bereits gesperrt. title: "@%{acct} moderieren" account_moderation_notes: diff --git a/config/locales/en.yml b/config/locales/en.yml index e8c9010486..980bd481b1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -25,7 +25,7 @@ en: admin: account_actions: action: Perform action - already_silenced: This account has already been silenced. + already_silenced: This account has already been limited. already_suspended: This account has already been suspended. title: Perform moderation action on %{acct} account_moderation_notes: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 520211e2e2..bd15c9862d 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -25,7 +25,7 @@ es-AR: admin: account_actions: action: Ejecutar acción - already_silenced: Esta cuenta ya ha sido limitada. + already_silenced: Esta cuenta ya fue limitada. already_suspended: Esta cuenta ya ha sido suspendida. title: Ejecutar acción de moderación en %{acct} account_moderation_notes: diff --git a/config/locales/et.yml b/config/locales/et.yml index bbd1b4ab20..d2a4bc605e 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -25,7 +25,6 @@ et: admin: account_actions: action: Täida tegevus - already_silenced: See konto on juba vaigistatud. already_suspended: See konto on juba peatatud. title: Rakenda moderaatori tegevus kasutajale %{acct} account_moderation_notes: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 0c5d5ef987..c94f04a9bb 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -981,7 +981,7 @@ fi: used_by_over_week: one: Käyttänyt yksi käyttäjä viimeisen viikon aikana other: Käyttänyt %{count} käyttäjää viimeisen viikon aikana - title: Suositukset ja suuntaukset + title: Suositukset ja trendit trending: Trendaus warning_presets: add_new: Lisää uusi diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 040e312d78..f3d9aee4c2 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -25,7 +25,6 @@ fo: admin: account_actions: action: Frem atgerð - already_silenced: Hendan kontan er longu gjørd kvirr. already_suspended: Hendan kontan er longu ógildað. title: Frem umsjónaratgerð á %{acct} account_moderation_notes: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index dd1f73c459..766ba71d8a 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -25,7 +25,6 @@ fr-CA: admin: account_actions: action: Effectuer l'action - already_silenced: Ce compte est déjà limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7e30b517a6..420a4d314e 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -25,7 +25,6 @@ fr: admin: account_actions: action: Effectuer l'action - already_silenced: Ce compte est déjà limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 4ea9cef73d..d2783a5a6a 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -31,7 +31,6 @@ ga: admin: account_actions: action: Déan gníomh - already_silenced: Tá an cuntas seo ina thost cheana féin. already_suspended: Tá an cuntas seo curtha ar fionraí cheana féin. title: Dean gníomh modhnóireachta ar %{acct} account_moderation_notes: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index f824e30815..c08ba60213 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -29,7 +29,6 @@ gd: admin: account_actions: action: Gabh an gnìomh - already_silenced: Chaidh an cunntas seo a chuingeachadh mu thràth. already_suspended: Chaidh an cunntas seo a chur à rèim mu thràth. title: Gabh gnìomh maorsainneachd air %{acct} account_moderation_notes: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index de4840dda1..657908922d 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -25,7 +25,7 @@ gl: admin: account_actions: action: Executar acción - already_silenced: Esta conta xa está silenciada. + already_silenced: A conta xa está limitada already_suspended: Esta conta xa está suspendida. title: Executar acción de moderación a %{acct} account_moderation_notes: @@ -1854,7 +1854,7 @@ gl: failed_2fa: details: 'Detalles do intento de acceso:' explanation: Alguén intentou acceder á túa conta mais fíxoo cun segundo factor de autenticación non válido. - further_actions_html: Se non foches ti, recomendámosche %{action} inmediatamente xa que a conta podería estar en risco. + further_actions_html: Se non foches ti, recomendámosche %{action} inmediatamente porque a conta podería estar en risco. subject: Fallo co segundo factor de autenticación title: Fallou o segundo factor de autenticación suspicious_sign_in: diff --git a/config/locales/he.yml b/config/locales/he.yml index 47ec5cafbe..a838c69636 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -29,6 +29,7 @@ he: admin: account_actions: action: בצע/י פעולה + already_suspended: חשבון זה הושעה. title: ביצוע פעולות הנהלה על %{acct} account_moderation_notes: create: ליצור @@ -50,6 +51,7 @@ he: title: שינוי כתובת דוא"ל עבור המשתמש.ת %{username} change_role: changed_msg: התפקיד שונה בהצלחה! + edit_roles: נהל תפקידי משתמש label: שינוי תפקיד no_role: ללא תפקיד title: שינוי תפקיד עבור %{username} @@ -626,6 +628,7 @@ he: suspend_description_html: חשבון זה על כל תכניו יחסמו וברבות הימים ימחקו, כל פעילות מולו לא תתאפשר. הפעולה ניתנת לביטול תוך 30 ימים, והיא תסגור כל דיווח התלוי ועומד נגד החשבון. actions_description_html: בחר/י איזו פעולה לבצע על מנת לפתור את הדו"ח. אם תופעל פעולת ענישה כנגד החשבון המדווח, הודעת דוא"ל תשלח אליהם, אלא אם נבחרה קטגוריית הספאם. actions_description_remote_html: בחרו איזו פעולה לבצע כדי לפתור את הדיווח שהוגש. פעולה זו תשפיע רק על התקשורת מול השרת שלך עם החשבון המרוחק ותוכנו. + actions_no_posts: דווח זה לא כולל הודעות למחיקה add_to_report: הוספת פרטים לדיווח already_suspended_badges: local: כבר הודח בשרת זה diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 60fb96a121..71af138305 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -25,7 +25,6 @@ hu: admin: account_actions: action: Művelet végrehajtása - already_silenced: Ezt a fiókot már elnémították. already_suspended: Ezt a fiókot már felfüggesztették. title: 'Moderálási művelet végrehajtása ezen: %{acct}' account_moderation_notes: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 683edbe7cb..8827e084d2 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -25,7 +25,6 @@ ia: admin: account_actions: action: Exequer action - already_silenced: Iste conto jam ha essite silentiate. already_suspended: Iste conto jam ha essite suspendite. title: Exequer action de moderation sur %{acct} account_moderation_notes: diff --git a/config/locales/is.yml b/config/locales/is.yml index 0854d88123..748d931ff8 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -25,7 +25,6 @@ is: admin: account_actions: action: Framkvæma aðgerð - already_silenced: Þessi aðgangur hefur þegar verið þaggaður. already_suspended: Þessi aðgangur hefur þegar verið settur í frysti. title: Framkvæma umsjónaraðgerð á %{acct} account_moderation_notes: diff --git a/config/locales/it.yml b/config/locales/it.yml index 66a462e61f..a1ed71a7a0 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -25,7 +25,7 @@ it: admin: account_actions: action: Esegui azione - already_silenced: Questo account è già stato silenziato. + already_silenced: Questo account è già stato limitato. already_suspended: Questo account è già stato sospeso. title: Esegui l'azione di moderazione su %{acct} account_moderation_notes: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 9bec26c450..962ecdd053 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -23,7 +23,6 @@ ko: admin: account_actions: action: 조치 취하기 - already_silenced: 이 계정은 이미 침묵되었습니다. already_suspended: 이 계정은 이미 정지되었습니다. title: "%{acct} 계정에 중재 취하기" account_moderation_notes: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 0fd71f52ed..c48b8ef93b 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -29,6 +29,7 @@ lt: admin: account_actions: action: Atlikti veiksmą + already_suspended: Ši paskyra jau sustabdyta. title: Atlikti prižiūrėjimo veiksmą %{acct} account_moderation_notes: create: Palikti pastabą @@ -49,6 +50,7 @@ lt: title: Keisti el. paštą %{username} change_role: changed_msg: Vaidmuo sėkmingai pakeistas. + edit_roles: Tvarkyti naudotojų vaidmenis label: Keisti vaidmenį no_role: Jokios vaidmenį title: Keisti vaidmenį %{username} @@ -485,6 +487,7 @@ lt: destroyed_msg: Skundo žinutė sekmingai ištrinta! reports: action_taken_by: Veiksmo ėmėsi + actions_no_posts: Ši ataskaita neturi jokių susijusių įrašų ištrinti already_suspended_badges: local: Jau sustabdytas šiame serveryje remote: Jau sustabdytas jų serveryje diff --git a/config/locales/nn.yml b/config/locales/nn.yml index f301b8ca98..f7c2f74260 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -25,6 +25,7 @@ nn: admin: account_actions: action: Utfør + already_silenced: Denne kontoen har allereie vorte avgrensa. title: Utfør moderatorhandling på %{acct} account_moderation_notes: create: Legg igjen merknad diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 2a1a0c8d75..7a8d208b06 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -29,7 +29,6 @@ pl: admin: account_actions: action: Wykonaj działanie - already_silenced: To konto zostało już wyciszone. already_suspended: To konto zostało już zawieszone. title: Wykonaj działanie moderacyjne na %{acct} account_moderation_notes: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 1bd724595d..96cb92efda 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -4,8 +4,8 @@ pt-PT: about_mastodon_html: 'A rede social do futuro: sem publicidade, e sem vigilância empresarial; desenho ético, e descentralizado! Tome posse dos seus dados com o Mastodon!' contact_missing: Por definir contact_unavailable: n.d. - hosted_on: Mastodon em %{domain} - title: Acerca de + hosted_on: Mastodon alojado em %{domain} + title: Sobre accounts: follow: Seguir followers: @@ -25,15 +25,17 @@ pt-PT: admin: account_actions: action: Executar acção + already_suspended: Esta conta já foi suspensa. title: Executar ação de moderação em %{acct} account_moderation_notes: create: Deixar uma nota created_msg: Nota de moderação criada com sucesso! destroyed_msg: Nota de moderação destruída! accounts: + add_email_domain_block: Bloquear domínio de e-mail approve: Aprovar approved_msg: Inscrição de %{username} aprovada com sucesso - are_you_sure: Tens a certeza? + are_you_sure: Tem a certeza? avatar: Imagem de perfil by_domain: Domínio change_email: @@ -45,18 +47,20 @@ pt-PT: title: Alterar e-mail para %{username} change_role: changed_msg: Função alterada com sucesso! + edit_roles: Gerir funções de utilizador label: Alterar função no_role: Nenhuma função title: Alterar a função de %{username} confirm: Confirmar confirmed: Confirmado confirming: A confirmar - custom: Personalizar + custom: Personalizado delete: Eliminar dados deleted: Eliminada - demote: Despromoveu + demote: Despromovida destroyed_msg: Os dados de %{username} estão agora em fila de espera para serem eliminados de imediato disable: Congelar + disable_sign_in_token_auth: Desativar token de autenticação por e-mail disable_two_factor_authentication: Desativar autenticação por dois fatores (2FA) disabled: Congelada display_name: Nome a mostrar @@ -65,6 +69,7 @@ pt-PT: email: E-mail email_status: Estado do e-mail enable: Descongelar + enable_sign_in_token_auth: Ativar token de autenticação por e-mail enabled: Ativado enabled_msg: Descongelou a conta %{username} followers: Seguidores @@ -100,8 +105,8 @@ pt-PT: no_limits_imposed: Sem limites impostos no_role_assigned: Nenhuma função atribuída not_subscribed: Não inscrito - pending: Pendente de revisão - perform_full_suspension: Fazer suspensão completa + pending: Revisão pendente + perform_full_suspension: Suspender previous_strikes: Reprimendas anteriores previous_strikes_description_html: one: Esta conta tem 1 reprimenda. @@ -109,7 +114,7 @@ pt-PT: promote: Promover protocol: Protocolo public: Público - push_subscription_expires: A Inscrição PuSH expira + push_subscription_expires: A inscrição PuSH expira redownload: Atualizar perfil redownloaded_msg: Perfil de %{username} atualizado a partir da origem com sucesso reject: Rejeitar @@ -122,13 +127,14 @@ pt-PT: removed_header_msg: Imagem de cabeçalho de %{username} removida resend_confirmation: already_confirmed: Este utilizador já está confirmado - send: Reenviar link de confirmação - success: Link de confirmação enviado com sucesso! - reset: Reiniciar + send: Reenviar hiperligação de confirmação + success: Hiperligação de confirmação enviada com sucesso! + reset: Repor reset_password: Criar nova palavra-passe resubscribe: Reinscrever role: Função search: Pesquisar + search_same_email_domain: Outros utilizadores com o mesmo domínio de e-mail search_same_ip: Outros utilizadores com o mesmo IP security: Segurança security_measures: @@ -136,7 +142,7 @@ pt-PT: password_and_2fa: Palavra-passe e 2FA sensitive: Marcar como problemático sensitized: Marcada como problemática - shared_inbox_url: URL da caixa de entrada compartilhada + shared_inbox_url: URL da caixa de entrada partilhada show: created_reports: Denúncias realizadas targeted_reports: Denunciada por outros @@ -151,101 +157,116 @@ pt-PT: suspension_reversible_hint_html: A conta foi suspensa e os dados serão totalmente eliminados em %{date}. Até lá, a conta poderá ser recuperada sem quaisquer efeitos negativos. Se deseja eliminar todos os dados desta conta imediatamente, pode fazê-lo em baixo. title: Contas unblock_email: Desbloquear endereço de e-mail - unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado + unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado com sucesso unconfirmed_email: E-mail por confirmar undo_sensitized: Desmarcar como problemático undo_silenced: Desfazer silenciar undo_suspension: Desfazer supensão - unsilenced_msg: Removeu as limitações da conta %{username} + unsilenced_msg: Limitações da conta %{username} removidas com sucesso unsubscribe: Cancelar inscrição unsuspended_msg: Removeu a suspensão da conta %{username} username: Nome de utilizador view_domain: Ver resumo do domínio warn: Advertir - web: Teia + web: Web whitelisted: Permitido para a federação action_logs: action_types: approve_appeal: Aprovar recurso approve_user: Aprovar utilizador - assigned_to_self_report: Atribuir Denúncia - change_role_user: Alterar Função do Utilizador - confirm_user: Confirmar Utilizador - create_account_warning: Criar Aviso + assigned_to_self_report: Atribuir denúncia + change_email_user: Alterar e-mail do utilizador + change_role_user: Alterar função do utilizador + confirm_user: Confirmar utilizador + create_account_warning: Criar aviso create_announcement: Criar comunicado - create_custom_emoji: Criar Emoji Personalizado - create_domain_allow: Criar Permissão de Domínio - create_domain_block: Criar Bloqueio de Domínio + create_canonical_email_block: Criar bloqueio de e-mail + create_custom_emoji: Criar emoji personalizado + create_domain_allow: Criar permissão de domínio + create_domain_block: Criar bloqueio de domínio + create_email_domain_block: Criar bloqueio de domínio de e-mail create_ip_block: Criar regra de IP - create_unavailable_domain: Criar Domínio Indisponível - create_user_role: Criar Função - demote_user: Despromover Utilizador - destroy_announcement: Apagar comunicado - destroy_custom_emoji: Eliminar Emoji Personalizado - destroy_domain_allow: Eliminar Permissão de Domínio - destroy_domain_block: Eliminar Bloqueio de Domínio - destroy_instance: Purgar Domínio + create_unavailable_domain: Criar domínio indisponível + create_user_role: Criar função + demote_user: Despromover utilizador + destroy_announcement: Eliminar comunicado + destroy_canonical_email_block: Eliminar bloqueio de e-mail + destroy_custom_emoji: Eliminar emoji personalizado + destroy_domain_allow: Eliminar permissão de domínio + destroy_domain_block: Eliminar bloqueio de domínio + destroy_email_domain_block: Eliminar bloqueio de domínio de e-mail + destroy_instance: Purgar domínio destroy_ip_block: Eliminar regra de IP - destroy_status: Eliminar Publicação - destroy_unavailable_domain: Eliminar Domínio Indisponível - destroy_user_role: Eliminar Função + destroy_status: Eliminar publicação + destroy_unavailable_domain: Eliminar domínio indisponível + destroy_user_role: Eliminar função disable_2fa_user: Desativar 2FA - disable_custom_emoji: Desativar Emoji Personalizado - disable_user: Desativar Utilizador - enable_custom_emoji: Ativar Emoji Personalizado - enable_user: Ativar Utilizador - memorialize_account: Tornar conta num memorial - promote_user: Promover Utilizador - reject_appeal: Rejeitar Recurso - reject_user: Rejeitar Utilizador - remove_avatar_user: Remover Imagem de Perfil - reopen_report: Reabrir Denúncia - resend_user: Reenviar E-mail de Confirmação - reset_password_user: Repor Password - resolve_report: Resolver Denúncia + disable_custom_emoji: Desativar emoji personalizado + disable_sign_in_token_auth_user: Desativar token de autenticação por e-mail para o utilizador + disable_user: Desativar utilizador + enable_custom_emoji: Ativar emoji personalizado + enable_sign_in_token_auth_user: Ativar token de autenticação por e-mail para o utilizador + enable_user: Ativar utilizador + memorialize_account: Transformar conta num memorial + promote_user: Promover utilizador + reject_appeal: Rejeitar recurso + reject_user: Rejeitar utilizador + remove_avatar_user: Remover imagem de perfil + reopen_report: Reabrir denúncia + resend_user: Reenviar e-mail de confirmação + reset_password_user: Repor palavra-passe + resolve_report: Resolver denúncia sensitive_account: Marcar a media na sua conta como problemática silence_account: Limitar conta suspend_account: Suspender conta - unassigned_report: Desatribuir Denúncia + unassigned_report: Anular atribuição desta denúncia unblock_email_account: Desbloquear endereço de e-mail unsensitive_account: Desmarcar a conta como problemática - unsilence_account: Deixar de Silenciar Conta - unsuspend_account: Retirar Suspensão à Conta + unsilence_account: Deixar de silenciar conta + unsuspend_account: Retirar suspensão da conta update_announcement: Atualizar comunicado - update_custom_emoji: Atualizar Emoji Personalizado - update_domain_block: Atualizar Bloqueio de Domínio + update_custom_emoji: Atualizar emoji personalizado + update_domain_block: Atualizar bloqueio de domínio update_ip_block: Atualizar regra de IP - update_report: Atualizar Relatório - update_status: Atualizar Estado - update_user_role: Atualizar Função + update_report: Atualizar denúncia + update_status: Atualizar publicação + update_user_role: Atualizar função actions: approve_appeal_html: "%{name} aprovou recurso da decisão de moderação de %{target}" approve_user_html: "%{name} aprovou a inscrição de %{target}" assigned_to_self_report_html: "%{name} atribuiu a denúncia %{target} a si próprio" + change_email_user_html: "%{name} alterou o endereço de e-mail do utilizador %{target}" change_role_user_html: "%{name} alterou a função de %{target}" + confirm_user_html: "%{name} confirmou o endereço de e-mail do utilizador %{target}" create_account_warning_html: "%{name} enviou um aviso para %{target}" create_announcement_html: "%{name} criou o novo anúncio %{target}" - create_custom_emoji_html: "%{name} carregou o novo emoji %{target}" + create_canonical_email_block_html: "%{name} bloqueou o e-mail com a hash %{target}" + create_custom_emoji_html: "%{name} enviou o novo emoji %{target}" create_domain_allow_html: "%{name} permitiu a federação com o domínio %{target}" create_domain_block_html: "%{name} bloqueou o domínio %{target}" - create_ip_block_html: "%{name} criou regra para o IP %{target}" - create_unavailable_domain_html: "%{name} parou a entrega ao domínio %{target}" + create_email_domain_block_html: "%{name} bloqueou o domínio de e-mail %{target}" + create_ip_block_html: "%{name} criou uma regra para o IP %{target}" + create_unavailable_domain_html: "%{name} parou as entregas ao domínio %{target}" create_user_role_html: "%{name} criou a função %{target}" demote_user_html: "%{name} despromoveu o utilizador %{target}" destroy_announcement_html: "%{name} eliminou o anúncio %{target}" + destroy_canonical_email_block_html: "%{name} desbloqueou o e-mail com a hash %{target}" destroy_custom_emoji_html: "%{name} eliminou o emoji %{target}" - destroy_domain_allow_html: "%{name} desabilitou a federação com o domínio %{target}" + destroy_domain_allow_html: "%{name} bloqueou a federação com o domínio %{target}" destroy_domain_block_html: "%{name} desbloqueou o domínio %{target}" + destroy_email_domain_block_html: "%{name} desbloqueou o domínio de e-mail %{target}" destroy_instance_html: "%{name} purgou o domínio %{target}" - destroy_ip_block_html: "%{name} eliminou regra para o IP %{target}" + destroy_ip_block_html: "%{name} eliminou a regra para o IP %{target}" destroy_status_html: "%{name} removeu a publicação de %{target}" - destroy_unavailable_domain_html: "%{name} retomou a entrega ao domínio %{target}" + destroy_unavailable_domain_html: "%{name} retomou as entregas ao domínio %{target}" destroy_user_role_html: "%{name} eliminou a função %{target}" disable_2fa_user_html: "%{name} desativou o requerimento de autenticação em dois passos para o utilizador %{target}" - disable_custom_emoji_html: "%{name} desabilitou o emoji %{target}" - disable_user_html: "%{name} desativou o acesso para o utilizador %{target}" + disable_custom_emoji_html: "%{name} desativou o emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} desativou o token de autenticação por e-mail para %{target}" + disable_user_html: "%{name} desativou o início de sessão para o utilizador %{target}" enable_custom_emoji_html: "%{name} ativou o emoji %{target}" - enable_user_html: "%{name} ativou o acesso para o utilizador %{target}" + enable_sign_in_token_auth_user_html: "%{name} ativou o token de autenticação por e-mail para %{target}" + enable_user_html: "%{name} ativou o início de sessão para o utilizador %{target}" memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial" promote_user_html: "%{name} promoveu o utilizador %{target}" reject_appeal_html: "%{name} rejeitou recurso da decisão de moderação de %{target}" @@ -352,7 +373,7 @@ pt-PT: title: Painel de controlo top_languages: Principais idiomas ativos top_servers: Servidores mais ativos - website: Página na teia + website: Website disputes: appeals: empty: Nenhum recurso encontrado. @@ -669,39 +690,39 @@ pt-PT: privileges: administrator: Administrador administrator_description: Utilizadores com esta permissão irão contornar todas as permissões - delete_user_data: Eliminar Dados de Utilizador + delete_user_data: Eliminar dados de utilizador delete_user_data_description: Permite que os utilizadores eliminem os dados doutros utilizadores sem tempo de espera - invite_users: Convidar Utilizadores + invite_users: Convidar utilizadores invite_users_description: Permite aos utilizadores convidar pessoas novas para o servidor manage_announcements: Gerir comunicados manage_announcements_description: Permite aos utilizadores gerirem os comunicados no servidor manage_appeals: Gerir apelos manage_appeals_description: Permite aos utilizadores rever recursos de moderação - manage_blocks: Gerir Bloqueios - manage_custom_emojis: Gerir Emojis Personalizados + manage_blocks: Gerir bloqueios + manage_custom_emojis: Gerir emojis personalizados manage_custom_emojis_description: Permite aos utilizadores gerirem os emojis personalizados do servidor - manage_federation: Gerir Federação + manage_federation: Gerir federação manage_federation_description: Permite aos utilizadores bloquear ou permitir federação com outros domínios e controlar a entregabilidade - manage_invites: Gerir Convites + manage_invites: Gerir convites manage_invites_description: Permite aos utilizadores pesquisarem e desativarem ligações de convite - manage_reports: Gerir Relatórios - manage_reports_description: Permite aos utilizadores rever relatórios e executar ações de moderação contra eles - manage_roles: Gerir Funções + manage_reports: Gerir denúncias + manage_reports_description: Permite aos utilizadores rever denúncias e executar ações de moderação contra eles + manage_roles: Gerir funções manage_roles_description: Permite aos utilizadores a gestão e atribuição de funções abaixo dos seus - manage_rules: Gerir Regras + manage_rules: Gerir regras manage_rules_description: Permite aos utilizadores alterar as regras do servidor - manage_settings: Gerir Configurações - manage_settings_description: Permite aos utilizadores alterar as configurações do sítio na teia - manage_taxonomies: Gerir Taxonomias + manage_settings: Gerir configurações + manage_settings_description: Permite aos utilizadores alterar as configurações do site + manage_taxonomies: Gerir taxonomias manage_taxonomies_description: Permite aos utilizadores rever o conteúdo em tendência e atualizar as configurações de hashtag - manage_user_access: Gerir Acesso de Utilizador - manage_users: Gerir Utilizadores + manage_user_access: Gerir acesso de utilizador + manage_users: Gerir utilizadores manage_users_description: Permite aos utilizadores ver os detalhes de outros utilizadores e executar ações de moderação contra eles - manage_webhooks: Gerir Webhooks + manage_webhooks: Gerir webhooks manage_webhooks_description: Permite aos utilizadores configurar webhooks para eventos administrativos - view_audit_log: Ver Registo de Auditoria + view_audit_log: Ver registo de auditoria view_audit_log_description: Permite aos utilizadores ver um histórico de ações administrativas no servidor - view_dashboard: Ver Painel de Controlo + view_dashboard: Ver painel de controlo view_dashboard_description: Permite aos utilizadores acederem ao painel de controlo e a várias estatísticas view_devops: DevOps view_devops_description: Permite aos utilizadores aceder aos painéis de controlo do Sidekiq e pgHero @@ -723,14 +744,14 @@ pt-PT: preamble: Personalize a interface web do Mastodon. title: Aspeto branding: - preamble: A marca do seu servidor diferencia-a doutros servidores na rede. Essa informação pode ser exibida em vários contexos, como a interface na teia do Mastodon, aplicações nativas, visualizações de hiperligações noutros sites, em aplicações de mensagens, etc. Por esta razão, é melhor manter esta informação clara, curta e concisa. + preamble: A marca do seu servidor diferencia-a de outros servidores na rede. Essa informação pode ser mostrada em vários ambientes, como a interface web do Mastodon, aplicações nativas, visualizações de hiperligações em outros sites e dentro de aplicações de mensagens, etc. Por esta razão, é melhor manter esta informação clara, curta e concisa. title: Marca captcha_enabled: desc_html: Isto depende de scripts externos da hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, isto pode tornar o processo de registo menos acessível para algumas pessoas (especialmente as com limitações físicas). Por isso, considere medidas alternativas tais como registo mediante aprovação ou sob convite. title: Requerer que novos utilizadores resolvam um CAPTCHA para confirmar a sua conta content_retention: danger_zone: Zona de perigo - preamble: Controle como o conteúdo gerado pelos utilizadores é armazenado no Mastodon. + preamble: Controle a forma como o conteúdo gerado pelo utilizador é armazenado no Mastodon. title: Retenção de conteúdo default_noindex: desc_html: Afeta todos os utilizadores que não alteraram esta configuração @@ -1198,7 +1219,7 @@ pt-PT: content: Desculpe, mas algo correu mal da nossa parte. title: Esta página não está correta '503': A página não pôde ser apresentada devido a uma falha temporária do servidor. - noscript_html: Para usar a aplicação da teia do Mastodon, por favor active o JavaScript. Em alternativa, experimenta uma das aplicações nativas do Mastodon para a sua plataforma. + noscript_html: Para usar a aplicação web do Mastodon, ative o JavaScript. Alternativamente, experimente uma das aplicações nativas para o Mastodon na sua plataforma. existing_username_validator: not_found: não foi possível encontrar um utilizador local com esse nome not_found_multiple: não foi possível encontrar %{usernames} @@ -1236,7 +1257,7 @@ pt-PT: statuses_hint_html: Este filtro aplica-se a publicações individuais selecionadas independentemente de estas corresponderem às palavras-chave abaixo. Reveja ou remova publicações do filtro. title: Editar filtros errors: - deprecated_api_multiple_keywords: Estes parâmetros não podem ser alterados a partir desta aplicação porque se aplicam a mais que um filtro de palavra-chave. Use uma aplicação mais recente ou a interface na teia. + deprecated_api_multiple_keywords: Estes parâmetros não podem ser alterados a partir desta aplicação porque se aplicam a mais de um filtro de palavra-chave. Use uma aplicação mais recente ou a interface web. invalid_context: Inválido ou nenhum contexto fornecido index: contexts: Filtros em %{contexts} @@ -1664,7 +1685,7 @@ pt-PT: edited_at_html: Editado em %{date} errors: in_reply_not_found: A publicação a que está a tentar responder parece não existir. - open_in_web: Abrir na Teia + open_in_web: Abrir na web over_character_limit: limite de caracter excedeu %{max} pin_errors: direct: Publicações visíveis apenas para utilizadores mencionados não podem ser afixadas @@ -1826,7 +1847,7 @@ pt-PT: welcome: apps_android_action: Baixe no Google Play apps_ios_action: Baixar na App Store - apps_step: Baixe nossos aplicativos oficiais. + apps_step: Descarregue as nossas aplicações oficiais. apps_title: Apps Mastodon checklist_subtitle: 'Vamos começar nesta nova fronteira social:' checklist_title: Checklist de Boas-vindas @@ -1835,11 +1856,11 @@ pt-PT: edit_profile_title: Personalize seu perfil explanation: Aqui estão algumas dicas para começar feature_action: Mais informações - feature_audience: Mastodon oferece uma possibilidade única de gerenciar seu público sem intermediários. O Mastodon implantado em sua própria infraestrutura permite que você siga e seja seguido de qualquer outro servidor Mastodon online e não esteja sob o controle de ninguém além do seu. + feature_audience: O Mastodon oferece-lhe uma possibilidade única de gerir a sua audiência sem intermediários. O Mastodon implantado na sua própria infraestrutura permite-lhe seguir e ser seguido a partir de qualquer outro servidor Mastodon online e não está sob o controlo de ninguém a não ser o seu. feature_audience_title: Construa seu público em confiança - feature_control: Você sabe melhor o que deseja ver no feed da sua casa. Sem algoritmos ou anúncios para desperdiçar seu tempo. Siga qualquer pessoa em qualquer servidor Mastodon a partir de uma única conta e receba suas postagens em ordem cronológica, deixando seu canto da internet um pouco mais parecido com você. - feature_control_title: Fique no controle da sua própria linha do tempo - feature_creativity: Mastodon suporta postagens de áudio, vídeo e imagens, descrições de acessibilidade, enquetes, avisos de conteúdo, avatares animados, emojis personalizados, controle de corte de miniaturas e muito mais, para ajudá-lo a se expressar online. Esteja você publicando sua arte, sua música ou seu podcast, o Mastodon está lá para você. + feature_control: Você sabe melhor o que quer ver no seu feed. Não há algoritmos ou anúncios que o façam perder tempo. Siga qualquer pessoa em qualquer servidor Mastodon a partir de uma única conta e receba as suas mensagens por ordem cronológica e torne o seu canto da Internet um pouco mais parecido consigo. + feature_control_title: Mantenha o controlo da sua própria cronologia + feature_creativity: O Mastodon suporta publicações de áudio, vídeo e imagens, descrições de acessibilidade, sondagens, avisos de conteúdo, avatares animados, emojis personalizados, controlo de corte de miniaturas e muito mais, para o ajudar a expressar-se online. Quer esteja a publicar a sua arte, a sua música ou o seu podcast, o Mastodon está lá para si. feature_creativity_title: Criatividade inigualável feature_moderation: Mastodon coloca a tomada de decisões de volta em suas mãos. Cada servidor cria as suas próprias regras e regulamentos, que são aplicados localmente e não de cima para baixo como as redes sociais corporativas, tornando-o mais flexível na resposta às necessidades de diferentes grupos de pessoas. Junte-se a um servidor com as regras com as quais você concorda ou hospede as suas próprias. feature_moderation_title: Moderando como deve ser @@ -1856,7 +1877,7 @@ pt-PT: hashtags_title: Etiquetas em tendência hashtags_view_more: Ver mais etiquetas em tendência post_action: Compor - post_step: Diga olá para o mundo com texto, fotos, vídeos ou enquetes. + post_step: Diga olá para o mundo com texto, fotos, vídeos ou sondagens. post_title: Faça a sua primeira publicação share_action: Compartilhar share_step: Diga aos seus amigos como te encontrar no Mastodon. diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index f595a31997..26edab3b2e 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -130,6 +130,7 @@ he: name: ניתן רק להחליף בין אותיות קטנות וגדולות, למשל כדי לשפר את הקריאות user: chosen_languages: אם פעיל, רק הודעות בשפות הנבחרות יוצגו לפידים הפומביים + role: התפקיד שולט על אילו הרשאות יש למשתמש. user_role: color: צבע לתפקיד בממשק המשתמש, כ RGB בפורמט הקסדצימלי highlighted: מאפשר נראות ציבורית של התפקיד diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index ecbf501389..99cb269e37 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -101,6 +101,7 @@ lt: show_application: Neatsižvelgiant į tai, visada galėsi matyti, kuri programėlė paskelbė tavo įrašą. user: chosen_languages: Kai pažymėta, viešose laiko skalėse bus rodomi tik įrašai pasirinktomis kalbomis. + role: Vaidmuo valdo, kokius leidimus naudotojas turi. labels: account: discoverable: Rekomenduoti profilį ir įrašus į atradimo algoritmus diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 7419169890..b113e0eed5 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -130,6 +130,7 @@ pl: name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne user: chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu + role: Rola kontroluje uprawnienia użytkownika. user_role: color: Kolor używany dla roli w całym interfejsie użytkownika, wyrażony jako RGB w formacie szesnastkowym highlighted: To sprawia, że rola jest widoczna publicznie diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 971773b2dc..3b606df032 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -77,7 +77,7 @@ pt-PT: warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_admin_settings: activity_api_enabled: Contagem, em blocos semanais, de publicações locais, utilizadores ativos e novos registos - app_icon: WEBP, PNG, GIF ou JPG. Substitui o ícone padrão do aplicativo em dispositivos móveis por um ícone personalizado. + app_icon: WEBP, PNG, GIF ou JPG. Substitui o ícone padrão da aplicação em dispositivos móveis por um ícone personalizado. backups_retention_period: Os utilizadores têm a possibilidade de gerar arquivos das suas mensagens para descarregar mais tarde. Quando definido para um valor positivo, estes arquivos serão automaticamente eliminados do seu armazenamento após o número de dias especificado. bootstrap_timeline_accounts: Estas contas serão destacadas no topo das recomendações aos novos utilizadores. closed_registrations_message: Apresentado quando as inscrições estiverem encerradas @@ -130,12 +130,13 @@ pt-PT: name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis user: chosen_languages: Quando selecionado, só serão mostradas nas cronologias públicas as publicações nos idiomas escolhidos + role: A função controla as permissões que o utilizador tem. user_role: color: Cor a ser utilizada para a função em toda a interface de utilizador, como RGB no formato hexadecimal highlighted: Isto torna a função visível publicamente - name: Nome público do cargo, se este estiver definido para ser apresentada com um emblema + name: Nome público da função, se esta estiver definida para ser apresentada com um emblema permissions_as_keys: Utilizadores com esta função terão acesso a... - position: Cargos mais altos decidem a resolução de conflitos em certas situações. Certas ações só podem ser executadas em cargos com uma menor prioridade + position: Funções mais altas decidem a resolução de conflitos em certas situações. Certas ações só podem ser executadas com certas funções com uma menor prioridade webhook: events: Selecione os eventos a enviar template: Componha o seu próprio conteúdo JSON utilizando a interpolação de variáveis. Deixar em branco para o JSON predefinido. @@ -315,7 +316,7 @@ pt-PT: trendable: Permitir que esta etiqueta apareça nas tendências usable: Permitir que as publicações usem esta hashtag localmente user: - role: Cargo + role: Função time_zone: Fuso horário user_role: color: Cor do emblema diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 89fb1675fd..2fcf23b156 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -130,6 +130,7 @@ tr: name: Harflerin, örneğin daha okunabilir yapmak için, sadece büyük/küçük harf durumlarını değiştirebilirsiniz user: chosen_languages: İşaretlendiğinde, yalnızca seçilen dillerdeki gönderiler genel zaman çizelgelerinde görüntülenir + role: Rol, kullanıcıların sahip olduğu izinleri denetler. user_role: color: Arayüz boyunca rol için kullanılacak olan renk, hex biçiminde RGB highlighted: Bu rolü herkese açık hale getirir diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 0f43f43988..6907c1ee3c 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -25,7 +25,6 @@ sq: admin: account_actions: action: Kryeje veprimin - already_silenced: Kjo llogari është heshtuar tashmë. already_suspended: Kjo llogari është pezulluar tashmë. title: Kryeni veprim moderimi te %{acct} account_moderation_notes: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index bcf1e3b816..df403e602a 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -25,6 +25,7 @@ sv: admin: account_actions: action: Utför åtgärd + already_silenced: Detta konto är redan begränsat. title: Utför aktivitet för moderering på %{acct} account_moderation_notes: create: Lämna kommentar diff --git a/config/locales/th.yml b/config/locales/th.yml index f119102112..f409a512d9 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -23,7 +23,6 @@ th: admin: account_actions: action: ทำการกระทำ - already_silenced: มีการทำให้บัญชีนี้เงียบไปแล้ว already_suspended: มีการระงับบัญชีนี้ไปแล้ว title: ทำการกระทำการกลั่นกรองต่อ %{acct} account_moderation_notes: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 4318f4eac4..d2d499077d 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -25,6 +25,8 @@ tr: admin: account_actions: action: Eylemi gerçekleştir + already_silenced: Bu hesap zaten askıya alınmış. + already_suspended: Bu hesap zaten askıya alınmış. title: "%{acct} üzerinde denetleme eylemi gerçekleştir" account_moderation_notes: create: Not bırak @@ -46,6 +48,7 @@ tr: title: "%{username} için e-postayı değiştir" change_role: changed_msg: Rol başarıyla değiştirildi! + edit_roles: Kullanıcı rollerini yönetin label: Rolü değiştir no_role: Rol yok title: "%{username} için rolü değiştir" @@ -602,6 +605,7 @@ tr: suspend_description_html: Bu hesap ve tüm içeriği erişilmez olacak ve nihayetinde silinecek ve bu hesapla etkileşim mümkün olmayacaktır. 30 gün içinde geri alınabilir. Bu hesaba yönelik tüm bildiriimleri kapatır. actions_description_html: Bu bildirimi çözmek için ne yapılması gerektiğine karar verin. Bildirilen hesap için ceza işlemi yaparsanız, İstenmeyen kategorisi seçilmemişse, onlara bir e-posta duyurusu gönderilecektir. actions_description_remote_html: Bu bildirimi çözmek için hangi eylemi yapmak istediğinize karar verin. Bu yalnızca sizin sunucunuzun bu uzak hesapla nasıl etkileşeğini ve içeriğiyle ne yapacağını etkiler. + actions_no_posts: Bu raporun ilişkili olduğu silinecek gönderi yok add_to_report: Bildirime daha fazlasını ekle already_suspended_badges: local: Bu sunucuda zaten askıya alınmış diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 261c87cd75..4e70b192d9 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -628,6 +628,7 @@ uk: suspend_description_html: Обліковий запис і весь його вміст будуть недоступними й врешті-решт видалені, і взаємодіяти з ним буде неможливо. Відновлення можливе протягом 30 днів. Закриває всі скарги на цей обліковий запис. actions_description_html: Визначте, які дії слід вжити для розв'язання цієї скарги. Якщо ви оберете каральні дії проти зареєстрованого облікового запису, про них буде надіслано сповіщення електронним листом, крім випадків, коли вибрано категорію Спам. actions_description_remote_html: Визначте, які дії слід вжити для розв'язання цього звіту. Це вплине тільки на те, як ваш сервер з'єднується з цим віддаленим обліковим записом і обробляє його вміст. + actions_no_posts: Ця скарга не має жодних пов'язаних дописів для видалення add_to_report: Додати ще подробиць до скарги already_suspended_badges: local: Вже призупинено на цьому сервері diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 975df3024b..d211b9e740 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -23,7 +23,6 @@ vi: admin: account_actions: action: Thực hiện hành động - already_silenced: Tài khoản này đã bị hạn chế. already_suspended: Tài khoản này đã bị vô hiệu hóa. title: Áp đặt kiểm duyệt với %{acct} account_moderation_notes: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 6b399d3499..7407d81db9 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -23,7 +23,7 @@ zh-CN: admin: account_actions: action: 执行操作 - already_silenced: 此帐户已受限。 + already_silenced: 此账户已受限。 already_suspended: 此帐户已被封禁。 title: 在 %{acct} 上执行管理操作 account_moderation_notes: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 8288e9bfac..d92d53f391 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -23,7 +23,7 @@ zh-TW: admin: account_actions: action: 執行動作 - already_silenced: 此帳號已被靜音。 + already_silenced: 此帳號已被限制。 already_suspended: 此帳號已被停權。 title: 對 %{acct} 執行站務動作 account_moderation_notes: @@ -1269,7 +1269,7 @@ zh-TW: home: 首頁時間軸 notifications: 通知 public: 公開時間軸 - thread: 對話 + thread: 討論串 edit: add_keyword: 新增關鍵字 keywords: 關鍵字 diff --git a/spec/models/featured_tag_spec.rb b/spec/models/featured_tag_spec.rb index 6056e645e0..0f5ead8f97 100644 --- a/spec/models/featured_tag_spec.rb +++ b/spec/models/featured_tag_spec.rb @@ -8,4 +8,134 @@ RSpec.describe FeaturedTag do it { is_expected.to normalize(:name).from(' #hashtag ').to('hashtag') } end end + + describe 'Validations' do + context 'when account already has a featured tag' do + subject { Fabricate.build :featured_tag, account: account } + + before { Fabricate :featured_tag, account: account, name: 'Test' } + + let(:account) { Fabricate :account } + + it { is_expected.to_not allow_value('Test').for(:name) } + + context 'when account has hit limit' do + before { stub_const 'FeaturedTag::LIMIT', 1 } + + context 'with a local account' do + let(:account) { Fabricate :account, domain: nil } + + it { is_expected.to_not allow_value(account).for(:account).against(:base).with_message(I18n.t('featured_tags.errors.limit')) } + end + + context 'with a remote account' do + let(:account) { Fabricate :account, domain: 'host.example' } + + it { is_expected.to allow_value(account).for(:account) } + end + end + end + end + + describe 'Callback to set the tag' do + context 'with no matching tag' do + it 'creates a new tag' do + expect { Fabricate :featured_tag, name: 'tag' } + .to change(Tag, :count).by(1) + end + end + + context 'with a matching tag' do + it 'creates a new tag' do + tag = Fabricate :tag, name: 'tag' + + expect { Fabricate :featured_tag, name: 'tag' } + .to_not change(Tag, :count) + + expect(described_class.last.tag) + .to eq(tag) + end + end + end + + describe 'Callback to set the stats' do + context 'when no statuses are relevant' do + it 'sets values to nil' do + featured_tag = Fabricate :featured_tag + + expect(featured_tag) + .to have_attributes( + statuses_count: 0, + last_status_at: be_nil + ) + end + end + + context 'when some statuses are relevant' do + it 'sets values to nil' do + tag = Fabricate :tag, name: 'test' + status = Fabricate :status, visibility: :public, created_at: 10.days.ago + status.tags << tag + + featured_tag = Fabricate :featured_tag, name: 'test', account: status.account + + expect(featured_tag) + .to have_attributes( + statuses_count: 1, + last_status_at: be_within(0.1).of(status.created_at) + ) + end + end + end + + describe '#sign?' do + it { is_expected.to be_sign } + end + + describe '#display_name' do + subject { Fabricate.build :featured_tag, name: name, tag: tag } + + context 'with a name value present' do + let(:name) { 'Test' } + let(:tag) { nil } + + it 'uses name value' do + expect(subject.display_name).to eq('Test') + end + end + + context 'with a missing name value but a present tag' do + let(:name) { nil } + let(:tag) { Fabricate.build :tag, name: 'Tester' } + + it 'uses name value' do + expect(subject.display_name).to eq('Tester') + end + end + end + + describe '#increment' do + it 'increases the count and updates the last_status_at timestamp' do + featured_tag = Fabricate :featured_tag + timestamp = 5.days.ago + + expect { featured_tag.increment(timestamp) } + .to change(featured_tag, :statuses_count).from(0).to(1) + .and change(featured_tag, :last_status_at).from(nil).to(be_within(0.1).of(timestamp)) + end + end + + describe '#decrement' do + it 'decreases the count and updates the last_status_at timestamp' do + tag = Fabricate :tag, name: 'test' + status = Fabricate :status, visibility: :public, created_at: 10.days.ago + status.tags << tag + + featured_tag = Fabricate :featured_tag, name: 'test', account: status.account + + expect { featured_tag.decrement(status.id) } + .to change(featured_tag, :statuses_count).from(1).to(0) + .and change(featured_tag, :last_status_at).to(nil) + end + end end