Merge remote-tracking branch 'parent/main' into upstream-20241015

This commit is contained in:
KMY 2024-02-15 08:37:59 +09:00
commit 9ef5c05ea0
43 changed files with 621 additions and 169 deletions

View file

@ -709,7 +709,7 @@ GEM
rufus-scheduler (~> 3.2) rufus-scheduler (~> 3.2)
sidekiq (>= 6, < 8) sidekiq (>= 6, < 8)
tilt (>= 1.4.0) tilt (>= 1.4.0)
sidekiq-unique-jobs (7.1.31) sidekiq-unique-jobs (7.1.33)
brpoplpush-redis_script (> 0.1.1, <= 2.0.0) brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
concurrent-ruby (~> 1.0, >= 1.0.5) concurrent-ruby (~> 1.0, >= 1.0.5)
redis (< 5.0) redis (< 5.0)

View file

@ -7,7 +7,7 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def self.provides_callback_for(provider) def self.provides_callback_for(provider)
define_method provider do define_method provider do
@provider = provider @provider = provider
@user = User.find_for_oauth(request.env['omniauth.auth'], current_user) @user = User.find_for_omniauth(request.env['omniauth.auth'], current_user)
if @user.persisted? if @user.persisted?
record_login_activity record_login_activity
@ -17,6 +17,9 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
session["devise.#{provider}_data"] = request.env['omniauth.auth'] session["devise.#{provider}_data"] = request.env['omniauth.auth']
redirect_to new_user_registration_url redirect_to new_user_registration_url
end end
rescue ActiveRecord::RecordInvalid
flash[:alert] = I18n.t('devise.failure.omniauth_user_creation_failure') if is_navigational_format?
redirect_to new_user_session_url
end end
end end

View file

@ -152,8 +152,8 @@
"compose_form.poll.switch_to_multiple": "Змяніце апытанне, каб дазволіць некалькі варыянтаў адказу", "compose_form.poll.switch_to_multiple": "Змяніце апытанне, каб дазволіць некалькі варыянтаў адказу",
"compose_form.poll.switch_to_single": "Змяніце апытанне, каб дазволіць адзіны варыянт адказу", "compose_form.poll.switch_to_single": "Змяніце апытанне, каб дазволіць адзіны варыянт адказу",
"compose_form.poll.type": "Стыль", "compose_form.poll.type": "Стыль",
"compose_form.publish": опіс", "compose_form.publish": аслаць",
"compose_form.publish_form": "Апублікаваць", "compose_form.publish_form": "Новы допіс",
"compose_form.reply": "Адказаць", "compose_form.reply": "Адказаць",
"compose_form.save_changes": "Абнавіць", "compose_form.save_changes": "Абнавіць",
"compose_form.spoiler.marked": "Выдаліць папярэджанне аб змесціве", "compose_form.spoiler.marked": "Выдаліць папярэджанне аб змесціве",

View file

@ -3,7 +3,7 @@
"about.contact": "За контакти:", "about.contact": "За контакти:",
"about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.", "about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Няма налична причина", "about.domain_blocks.no_reason_available": "Няма налична причина",
"about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивърс. Има изключения, направени конкретно за този сървър.", "about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.",
"about.domain_blocks.silenced.explanation": "Обикновено няма да виждате профили и съдържание, освен ако изрично не го потърсите или се включете в него, следвайки го.", "about.domain_blocks.silenced.explanation": "Обикновено няма да виждате профили и съдържание, освен ако изрично не го потърсите или се включете в него, следвайки го.",
"about.domain_blocks.silenced.title": "Ограничено", "about.domain_blocks.silenced.title": "Ограничено",
"about.domain_blocks.suspended.explanation": "Никакви данни от този сървър няма да се обработват, съхраняват или обменят, правещи невъзможно всяко взаимодействие или комуникация с потребители от тези сървъри.", "about.domain_blocks.suspended.explanation": "Никакви данни от този сървър няма да се обработват, съхраняват или обменят, правещи невъзможно всяко взаимодействие или комуникация с потребители от тези сървъри.",
@ -110,7 +110,7 @@
"column.about": "Относно", "column.about": "Относно",
"column.blocks": "Блокирани потребители", "column.blocks": "Блокирани потребители",
"column.bookmarks": "Отметки", "column.bookmarks": "Отметки",
"column.community": "Локална часова ос", "column.community": "Локален инфопоток",
"column.direct": "Частни споменавания", "column.direct": "Частни споменавания",
"column.directory": "Разглеждане на профили", "column.directory": "Разглеждане на профили",
"column.domain_blocks": "Блокирани домейни", "column.domain_blocks": "Блокирани домейни",
@ -228,7 +228,7 @@
"empty_column.account_unavailable": "Профилът не е наличен", "empty_column.account_unavailable": "Профилът не е наличен",
"empty_column.blocks": "Още не сте блокирали никакви потребители.", "empty_column.blocks": "Още не сте блокирали никакви потребители.",
"empty_column.bookmarked_statuses": "Още не сте отметнали публикации. Отметвайки някоя, то тя ще се покаже тук.", "empty_column.bookmarked_statuses": "Още не сте отметнали публикации. Отметвайки някоя, то тя ще се покаже тук.",
"empty_column.community": "Местната часова ос е празна. Напишете нещо обществено, за да завъртите нещата!", "empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!",
"empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.", "empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.",
"empty_column.domain_blocks": "Още няма блокирани домейни.", "empty_column.domain_blocks": "Още няма блокирани домейни.",
"empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!", "empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!",
@ -348,10 +348,10 @@
"keyboard_shortcuts.favourites": "Отваряне на списъка с любими", "keyboard_shortcuts.favourites": "Отваряне на списъка с любими",
"keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток", "keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток",
"keyboard_shortcuts.heading": "Клавишни съчетания", "keyboard_shortcuts.heading": "Клавишни съчетания",
"keyboard_shortcuts.home": "Отваряне на началната часова ос", "keyboard_shortcuts.home": "Отваряне на личния инфопоток",
"keyboard_shortcuts.hotkey": "Бърз клавиш", "keyboard_shortcuts.hotkey": "Бърз клавиш",
"keyboard_shortcuts.legend": "Показване на тази легенда", "keyboard_shortcuts.legend": "Показване на тази легенда",
"keyboard_shortcuts.local": "Отваряне на местна часова ос", "keyboard_shortcuts.local": "Отваряне на локалния инфопоток",
"keyboard_shortcuts.mention": "Споменаване на автора", "keyboard_shortcuts.mention": "Споменаване на автора",
"keyboard_shortcuts.muted": "Отваряне на списъка със заглушени потребители", "keyboard_shortcuts.muted": "Отваряне на списъка със заглушени потребители",
"keyboard_shortcuts.my_profile": "Отваряне на профила ви", "keyboard_shortcuts.my_profile": "Отваряне на профила ви",
@ -402,7 +402,7 @@
"navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс", "navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс",
"navigation_bar.blocks": "Блокирани потребители", "navigation_bar.blocks": "Блокирани потребители",
"navigation_bar.bookmarks": "Отметки", "navigation_bar.bookmarks": "Отметки",
"navigation_bar.community_timeline": "Локална часова ос", "navigation_bar.community_timeline": "Локален инфопоток",
"navigation_bar.compose": "Съставяне на нова публикация", "navigation_bar.compose": "Съставяне на нова публикация",
"navigation_bar.direct": "Частни споменавания", "navigation_bar.direct": "Частни споменавания",
"navigation_bar.discover": "Откриване", "navigation_bar.discover": "Откриване",
@ -524,7 +524,7 @@
"poll_button.add_poll": "Анкетиране", "poll_button.add_poll": "Анкетиране",
"poll_button.remove_poll": "Премахване на анкета", "poll_button.remove_poll": "Премахване на анкета",
"privacy.change": "Промяна на поверителността на публикация", "privacy.change": "Промяна на поверителността на публикация",
"privacy.direct.long": "Всеки споменат в публикацията", "privacy.direct.long": "Споменатите в публикацията",
"privacy.direct.short": "Определени хора", "privacy.direct.short": "Определени хора",
"privacy.private.long": "Само последователите ви", "privacy.private.long": "Само последователите ви",
"privacy.private.short": "Последователи", "privacy.private.short": "Последователи",

View file

@ -532,7 +532,7 @@
"privacy.public.short": "Públic", "privacy.public.short": "Públic",
"privacy.unlisted.additional": "Es comporta igual que públic, excepte que la publicació no apareixerà als canals en directe o etiquetes, l'explora o a la cerca de Mastodon, fins i tot si ho heu activat a nivell de compte.", "privacy.unlisted.additional": "Es comporta igual que públic, excepte que la publicació no apareixerà als canals en directe o etiquetes, l'explora o a la cerca de Mastodon, fins i tot si ho heu activat a nivell de compte.",
"privacy.unlisted.long": "Menys fanfàrries algorísmiques", "privacy.unlisted.long": "Menys fanfàrries algorísmiques",
"privacy.unlisted.short": "Públic tranquil", "privacy.unlisted.short": "Públic silenciós",
"privacy_policy.last_updated": "Darrera actualització {date}", "privacy_policy.last_updated": "Darrera actualització {date}",
"privacy_policy.title": "Política de Privacitat", "privacy_policy.title": "Política de Privacitat",
"recommended": "Recomanat", "recommended": "Recomanat",

View file

@ -146,12 +146,12 @@
"compose_form.lock_disclaimer.lock": "geschützt", "compose_form.lock_disclaimer.lock": "geschützt",
"compose_form.placeholder": "Was gibts Neues?", "compose_form.placeholder": "Was gibts Neues?",
"compose_form.poll.duration": "Umfragedauer", "compose_form.poll.duration": "Umfragedauer",
"compose_form.poll.multiple": "Mehrfachauswahl", "compose_form.poll.multiple": "Mul­ti­ple-Choice",
"compose_form.poll.option_placeholder": "{number}. Auswahlmöglichkeit", "compose_form.poll.option_placeholder": "Option {number}",
"compose_form.poll.single": "Einfachauswahl", "compose_form.poll.single": "Einfachauswahl",
"compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben", "compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben",
"compose_form.poll.switch_to_single": "Nur Einfachauswahl erlauben", "compose_form.poll.switch_to_single": "Nur Einfachauswahl erlauben",
"compose_form.poll.type": "Art", "compose_form.poll.type": "Stil",
"compose_form.publish": "Veröffentlichen", "compose_form.publish": "Veröffentlichen",
"compose_form.publish_form": "Neuer Beitrag", "compose_form.publish_form": "Neuer Beitrag",
"compose_form.reply": "Antworten", "compose_form.reply": "Antworten",
@ -277,9 +277,9 @@
"follow_request.authorize": "Genehmigen", "follow_request.authorize": "Genehmigen",
"follow_request.reject": "Ablehnen", "follow_request.reject": "Ablehnen",
"follow_requests.unlocked_explanation": "Auch wenn dein Konto öffentlich bzw. nicht geschützt ist, haben die Moderator*innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.", "follow_requests.unlocked_explanation": "Auch wenn dein Konto öffentlich bzw. nicht geschützt ist, haben die Moderator*innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.",
"follow_suggestions.curated_suggestion": "Vom Server empfohlen", "follow_suggestions.curated_suggestion": "Auswahl des Herausgebers",
"follow_suggestions.dismiss": "Nicht mehr anzeigen", "follow_suggestions.dismiss": "Nicht mehr anzeigen",
"follow_suggestions.personalized_suggestion": "Personalisierte Empfehlung", "follow_suggestions.personalized_suggestion": "Persönliche Empfehlung",
"follow_suggestions.popular_suggestion": "Beliebte Empfehlung", "follow_suggestions.popular_suggestion": "Beliebte Empfehlung",
"follow_suggestions.view_all": "Alle anzeigen", "follow_suggestions.view_all": "Alle anzeigen",
"follow_suggestions.who_to_follow": "Empfohlene Profile", "follow_suggestions.who_to_follow": "Empfohlene Profile",
@ -528,7 +528,7 @@
"privacy.direct.short": "Bestimmte Profile", "privacy.direct.short": "Bestimmte Profile",
"privacy.private.long": "Nur deine Follower", "privacy.private.long": "Nur deine Follower",
"privacy.private.short": "Follower", "privacy.private.short": "Follower",
"privacy.public.long": "Alle auf und außerhalb von Mastodon", "privacy.public.long": "Alle in und außerhalb von Mastodon",
"privacy.public.short": "Öffentlich", "privacy.public.short": "Öffentlich",
"privacy.unlisted.additional": "Das Verhalten ist wie bei „Öffentlich“, jedoch erscheint dieser Beitrag nicht in „Live-Feeds“, „Erkunden“, Hashtags oder über die Mastodon-Suchfunktion selbst wenn du das in den Einstellungen aktiviert hast.", "privacy.unlisted.additional": "Das Verhalten ist wie bei „Öffentlich“, jedoch erscheint dieser Beitrag nicht in „Live-Feeds“, „Erkunden“, Hashtags oder über die Mastodon-Suchfunktion selbst wenn du das in den Einstellungen aktiviert hast.",
"privacy.unlisted.long": "Weniger im Algorithmus berücksichtigt", "privacy.unlisted.long": "Weniger im Algorithmus berücksichtigt",

View file

@ -530,6 +530,8 @@
"privacy.private.short": "Seguidores", "privacy.private.short": "Seguidores",
"privacy.public.long": "Cualquiera dentro y fuera de Mastodon", "privacy.public.long": "Cualquiera dentro y fuera de Mastodon",
"privacy.public.short": "Público", "privacy.public.short": "Público",
"privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que la publicación no aparecerá en la cronología en directo o en las etiquetas, la exploración o búsqueda de Mastodon, incluso si está optado por activar la cuenta de usuario.",
"privacy.unlisted.long": "Menos fanfares algorítmicos",
"privacy.unlisted.short": "Público tranquilo", "privacy.unlisted.short": "Público tranquilo",
"privacy_policy.last_updated": "Actualizado por última vez {date}", "privacy_policy.last_updated": "Actualizado por última vez {date}",
"privacy_policy.title": "Política de Privacidad", "privacy_policy.title": "Política de Privacidad",

View file

@ -2,6 +2,10 @@
"about.blocks": "Servitores moderate", "about.blocks": "Servitores moderate",
"about.contact": "Contacto:", "about.contact": "Contacto:",
"about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.", "about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Ration non disponibile",
"about.domain_blocks.silenced.title": "Limitate",
"about.domain_blocks.suspended.title": "Suspendite",
"about.not_available": "Iste information non faceva disponibile in iste servitor.",
"about.rules": "Regulas del servitor", "about.rules": "Regulas del servitor",
"account.account_note_header": "Nota", "account.account_note_header": "Nota",
"account.add_or_remove_from_list": "Adder o remover ab listas", "account.add_or_remove_from_list": "Adder o remover ab listas",
@ -12,6 +16,7 @@
"account.blocked": "Blocate", "account.blocked": "Blocate",
"account.browse_more_on_origin_server": "Navigar plus sur le profilo original", "account.browse_more_on_origin_server": "Navigar plus sur le profilo original",
"account.copy": "Copiar ligamine a profilo", "account.copy": "Copiar ligamine a profilo",
"account.direct": "Mentionar privatemente a @{name}",
"account.disable_notifications": "Stoppar le notificationes quando @{name} publica", "account.disable_notifications": "Stoppar le notificationes quando @{name} publica",
"account.domain_blocked": "Dominio blocate", "account.domain_blocked": "Dominio blocate",
"account.edit_profile": "Modificar profilo", "account.edit_profile": "Modificar profilo",
@ -33,6 +38,7 @@
"account.languages": "Cambiar le linguas subscribite", "account.languages": "Cambiar le linguas subscribite",
"account.link_verified_on": "Le proprietate de iste ligamine esseva verificate le {date}", "account.link_verified_on": "Le proprietate de iste ligamine esseva verificate le {date}",
"account.locked_info": "Le stato de confidentialitate de iste conto es definite a blocate. Le proprietario revisa manualmente qui pote sequer lo.", "account.locked_info": "Le stato de confidentialitate de iste conto es definite a blocate. Le proprietario revisa manualmente qui pote sequer lo.",
"account.media": "Multimedia",
"account.mention": "Mentionar @{name}", "account.mention": "Mentionar @{name}",
"account.moved_to": "{name} indicava que lor nove conto ora es:", "account.moved_to": "{name} indicava que lor nove conto ora es:",
"account.mute": "Silentiar @{name}", "account.mute": "Silentiar @{name}",
@ -57,6 +63,7 @@
"account.unmute_notifications_short": "Non plus silentiar le notificationes", "account.unmute_notifications_short": "Non plus silentiar le notificationes",
"account.unmute_short": "Non plus silentiar", "account.unmute_short": "Non plus silentiar",
"account_note.placeholder": "Clicca pro adder un nota", "account_note.placeholder": "Clicca pro adder un nota",
"admin.dashboard.retention.average": "Median",
"admin.dashboard.retention.cohort_size": "Nove usatores", "admin.dashboard.retention.cohort_size": "Nove usatores",
"admin.impact_report.instance_followers": "Sequitores que nostre usatores poterea perder", "admin.impact_report.instance_followers": "Sequitores que nostre usatores poterea perder",
"admin.impact_report.instance_follows": "Sequitores que lor usatores poterea perder", "admin.impact_report.instance_follows": "Sequitores que lor usatores poterea perder",
@ -69,6 +76,7 @@
"bundle_column_error.return": "Retornar al initio", "bundle_column_error.return": "Retornar al initio",
"bundle_modal_error.close": "Clauder", "bundle_modal_error.close": "Clauder",
"bundle_modal_error.retry": "Tentar novemente", "bundle_modal_error.retry": "Tentar novemente",
"closed_registrations_modal.description": "Crear un conto in {domain} actualmente non es possibile, ma considera que tu non besonia un conto specific in {domain} pro usar Mastodon.",
"closed_registrations_modal.find_another_server": "Trovar altere servitor", "closed_registrations_modal.find_another_server": "Trovar altere servitor",
"column.about": "A proposito de", "column.about": "A proposito de",
"column.blocks": "Usatores blocate", "column.blocks": "Usatores blocate",
@ -105,6 +113,7 @@
"compose_form.poll.option_placeholder": "Option {number}", "compose_form.poll.option_placeholder": "Option {number}",
"compose_form.poll.single": "Seliger un", "compose_form.poll.single": "Seliger un",
"compose_form.poll.switch_to_multiple": "Cambiar inquesta pro permitter selectiones multiple", "compose_form.poll.switch_to_multiple": "Cambiar inquesta pro permitter selectiones multiple",
"compose_form.poll.switch_to_single": "Cambiar inquesta pro permitter selection singule",
"compose_form.poll.type": "Stylo", "compose_form.poll.type": "Stylo",
"compose_form.publish": "Publicar", "compose_form.publish": "Publicar",
"compose_form.publish_form": "Nove message", "compose_form.publish_form": "Nove message",
@ -117,6 +126,8 @@
"confirmations.block.block_and_report": "Blocar e signalar", "confirmations.block.block_and_report": "Blocar e signalar",
"confirmations.block.confirm": "Blocar", "confirmations.block.confirm": "Blocar",
"confirmations.block.message": "Es tu secur que tu vole blocar {name}?", "confirmations.block.message": "Es tu secur que tu vole blocar {name}?",
"confirmations.cancel_follow_request.confirm": "Retirar requesta",
"confirmations.cancel_follow_request.message": "Es tu secur que tu vole retirar tu requesta a sequer a {name}?",
"confirmations.delete.confirm": "Deler", "confirmations.delete.confirm": "Deler",
"confirmations.delete.message": "Es tu secur que tu vole deler iste message?", "confirmations.delete.message": "Es tu secur que tu vole deler iste message?",
"confirmations.delete_list.confirm": "Deler", "confirmations.delete_list.confirm": "Deler",
@ -144,6 +155,7 @@
"disabled_account_banner.account_settings": "Parametros de conto", "disabled_account_banner.account_settings": "Parametros de conto",
"disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.", "disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.",
"dismissable_banner.dismiss": "Dimitter", "dismissable_banner.dismiss": "Dimitter",
"embed.preview": "Hic es como il parera:",
"emoji_button.activity": "Activitate", "emoji_button.activity": "Activitate",
"emoji_button.clear": "Rader", "emoji_button.clear": "Rader",
"emoji_button.custom": "Personalisate", "emoji_button.custom": "Personalisate",
@ -162,6 +174,11 @@
"empty_column.account_timeline": "Nulle messages hic!", "empty_column.account_timeline": "Nulle messages hic!",
"empty_column.account_unavailable": "Profilo non disponibile", "empty_column.account_unavailable": "Profilo non disponibile",
"empty_column.blocks": "Tu non ha blocate alcun usator ancora.", "empty_column.blocks": "Tu non ha blocate alcun usator ancora.",
"empty_column.domain_blocks": "Il non ha dominios blocate ancora.",
"empty_column.explore_statuses": "Nihil es in tendentias ora mesme. Retorna postea!",
"empty_column.favourited_statuses": "Tu non ha necun messages favorite ancora. Quando tu marca un como favorito, ille essera monstrate hic.",
"empty_column.followed_tags": "Tu ancora non ha sequite necun hashtags. Quando tu lo face, illes essera monstrate hic.",
"empty_column.hashtag": "Ancora non il ha nihil in iste hashtag.",
"errors.unexpected_crash.report_issue": "Signalar un defecto", "errors.unexpected_crash.report_issue": "Signalar un defecto",
"explore.search_results": "Resultatos de recerca", "explore.search_results": "Resultatos de recerca",
"explore.suggested_follows": "Personas", "explore.suggested_follows": "Personas",
@ -320,6 +337,8 @@
"report.placeholder": "Commentos additional", "report.placeholder": "Commentos additional",
"report.reasons.dislike": "Non me place", "report.reasons.dislike": "Non me place",
"report_notification.categories.other": "Alteres", "report_notification.categories.other": "Alteres",
"report_notification.open": "Aperir reporto",
"search.no_recent_searches": "Nulle recercas recente",
"search.quick_action.go_to_account": "Vader al profilo {x}", "search.quick_action.go_to_account": "Vader al profilo {x}",
"search.quick_action.go_to_hashtag": "Vader al hashtag {x}", "search.quick_action.go_to_hashtag": "Vader al hashtag {x}",
"search.quick_action.open_url": "Aperir URL in Mastodon", "search.quick_action.open_url": "Aperir URL in Mastodon",
@ -333,14 +352,20 @@
"search_results.hashtags": "Hashtags", "search_results.hashtags": "Hashtags",
"search_results.see_all": "Vider toto", "search_results.see_all": "Vider toto",
"search_results.statuses": "Messages", "search_results.statuses": "Messages",
"server_banner.active_users": "usatores active",
"server_banner.learn_more": "Apprender plus", "server_banner.learn_more": "Apprender plus",
"server_banner.server_stats": "Statos del servitor:",
"sign_in_banner.create_account": "Crear un conto", "sign_in_banner.create_account": "Crear un conto",
"sign_in_banner.sign_in": "Initiar le session", "sign_in_banner.sign_in": "Initiar le session",
"status.block": "Blocar @{name}", "status.block": "Blocar @{name}",
"status.copy": "Copiar ligamine a message", "status.copy": "Copiar ligamine a message",
"status.delete": "Deler", "status.delete": "Deler",
"status.direct": "Mentionar privatemente a @{name}",
"status.direct_indicator": "Mention private", "status.direct_indicator": "Mention private",
"status.edit": "Modificar", "status.edit": "Modificar",
"status.edited": "Modificate le {date}",
"status.edited_x_times": "Modificate {count, plural, one {{count} tempore} other {{count} tempores}}",
"status.favourite": "Adder al favoritos",
"status.filter": "Filtrar iste message", "status.filter": "Filtrar iste message",
"status.hide": "Celar le message", "status.hide": "Celar le message",
"status.history.created": "create per {name} le {date}", "status.history.created": "create per {name} le {date}",
@ -351,12 +376,17 @@
"status.mute_conversation": "Silentiar conversation", "status.mute_conversation": "Silentiar conversation",
"status.read_more": "Leger plus", "status.read_more": "Leger plus",
"status.share": "Compartir", "status.share": "Compartir",
"status.show_less": "Monstrar minus",
"status.show_more": "Monstrar plus",
"status.translate": "Traducer", "status.translate": "Traducer",
"status.translated_from_with": "Traducite ab {lang} usante {provider}", "status.translated_from_with": "Traducite ab {lang} usante {provider}",
"status.uncached_media_warning": "Previsualisation non disponibile",
"subscribed_languages.save": "Salveguardar le cambiamentos",
"tabs_bar.home": "Initio", "tabs_bar.home": "Initio",
"tabs_bar.notifications": "Notificationes", "tabs_bar.notifications": "Notificationes",
"timeline_hint.resources.statuses": "Messages ancian", "timeline_hint.resources.statuses": "Messages ancian",
"trends.trending_now": "Ora in tendentias", "trends.trending_now": "Ora in tendentias",
"upload_button.label": "Adde imagines, un video o un file de audio",
"upload_modal.choose_image": "Seliger un imagine", "upload_modal.choose_image": "Seliger un imagine",
"upload_modal.detect_text": "Deteger texto ab un pictura", "upload_modal.detect_text": "Deteger texto ab un pictura",
"video.close": "Clauder le video", "video.close": "Clauder le video",

View file

@ -21,6 +21,8 @@
"account.blocked": "Blocat", "account.blocked": "Blocat",
"account.browse_more_on_origin_server": "Vezi mai multe pe profilul original", "account.browse_more_on_origin_server": "Vezi mai multe pe profilul original",
"account.cancel_follow_request": "Retrage cererea de urmărire", "account.cancel_follow_request": "Retrage cererea de urmărire",
"account.copy": "Copiază link-ul profilului",
"account.direct": "Menționează pe @{name} în privat",
"account.disable_notifications": "Nu îmi mai trimite notificări când postează @{name}", "account.disable_notifications": "Nu îmi mai trimite notificări când postează @{name}",
"account.domain_blocked": "Domeniu blocat", "account.domain_blocked": "Domeniu blocat",
"account.edit_profile": "Modifică profilul", "account.edit_profile": "Modifică profilul",
@ -30,6 +32,7 @@
"account.featured_tags.last_status_never": "Fără postări", "account.featured_tags.last_status_never": "Fără postări",
"account.featured_tags.title": "Haștagurile recomandate de {name}", "account.featured_tags.title": "Haștagurile recomandate de {name}",
"account.follow": "Abonează-te", "account.follow": "Abonează-te",
"account.follow_back": "Urmăreşte înapoi",
"account.followers": "Urmăritori", "account.followers": "Urmăritori",
"account.followers.empty": "Acest utilizator nu are încă urmăritori.", "account.followers.empty": "Acest utilizator nu are încă urmăritori.",
"account.followers_counter": "{count, plural, one {Un abonat} few {{counter} abonați} other {{counter} de abonați}}", "account.followers_counter": "{count, plural, one {Un abonat} few {{counter} abonați} other {{counter} de abonați}}",
@ -38,6 +41,7 @@
"account.follows.empty": "Momentan acest utilizator nu are niciun abonament.", "account.follows.empty": "Momentan acest utilizator nu are niciun abonament.",
"account.go_to_profile": "Mergi la profil", "account.go_to_profile": "Mergi la profil",
"account.hide_reblogs": "Ascunde distribuirile de la @{name}", "account.hide_reblogs": "Ascunde distribuirile de la @{name}",
"account.in_memoriam": "În Memoriam.",
"account.joined_short": "Înscris", "account.joined_short": "Înscris",
"account.languages": "Schimbă limbile abonate", "account.languages": "Schimbă limbile abonate",
"account.link_verified_on": "Proprietatea acestui link a fost verificată pe {date}", "account.link_verified_on": "Proprietatea acestui link a fost verificată pe {date}",
@ -46,7 +50,10 @@
"account.mention": "Menționează pe @{name}", "account.mention": "Menționează pe @{name}",
"account.moved_to": "{name} a indicat că noul său cont este acum:", "account.moved_to": "{name} a indicat că noul său cont este acum:",
"account.mute": "Pune pe @{name} pe silențios", "account.mute": "Pune pe @{name} pe silențios",
"account.mute_notifications_short": "Amuțește notificările",
"account.mute_short": "Ignoră",
"account.muted": "Pus pe silențios", "account.muted": "Pus pe silențios",
"account.no_bio": "Nicio descriere furnizată.",
"account.open_original_page": "Deschide pagina originală", "account.open_original_page": "Deschide pagina originală",
"account.posts": "Postări", "account.posts": "Postări",
"account.posts_with_replies": "Postări și răspunsuri", "account.posts_with_replies": "Postări și răspunsuri",
@ -69,6 +76,7 @@
"admin.dashboard.retention.average": "În medie", "admin.dashboard.retention.average": "În medie",
"admin.dashboard.retention.cohort": "Înregistrări lunar", "admin.dashboard.retention.cohort": "Înregistrări lunar",
"admin.dashboard.retention.cohort_size": "Utilizatori noi", "admin.dashboard.retention.cohort_size": "Utilizatori noi",
"admin.impact_report.title": "Rezumatul impactului",
"alert.rate_limited.message": "Vă rugăm să reîncercați după {retry_time, time, medium}.", "alert.rate_limited.message": "Vă rugăm să reîncercați după {retry_time, time, medium}.",
"alert.rate_limited.title": "Debit limitat", "alert.rate_limited.title": "Debit limitat",
"alert.unexpected.message": "A apărut o eroare neașteptată.", "alert.unexpected.message": "A apărut o eroare neașteptată.",
@ -98,9 +106,11 @@
"column.blocks": "Utilizatori blocați", "column.blocks": "Utilizatori blocați",
"column.bookmarks": "Marcaje", "column.bookmarks": "Marcaje",
"column.community": "Cronologie locală", "column.community": "Cronologie locală",
"column.direct": "Mențiuni private",
"column.directory": "Explorează profiluri", "column.directory": "Explorează profiluri",
"column.domain_blocks": "Domenii blocate", "column.domain_blocks": "Domenii blocate",
"column.favourites": "Favorite", "column.favourites": "Favorite",
"column.firehose": "Fluxuri live",
"column.follow_requests": "Cereri de abonare", "column.follow_requests": "Cereri de abonare",
"column.home": "Acasă", "column.home": "Acasă",
"column.lists": "Liste", "column.lists": "Liste",
@ -131,11 +141,19 @@
"compose_form.lock_disclaimer.lock": "privat", "compose_form.lock_disclaimer.lock": "privat",
"compose_form.placeholder": "La ce te gândești?", "compose_form.placeholder": "La ce te gândești?",
"compose_form.poll.duration": "Durata sondajului", "compose_form.poll.duration": "Durata sondajului",
"compose_form.poll.multiple": "Alegeri multiple",
"compose_form.poll.option_placeholder": "Opțiune {number}",
"compose_form.poll.single": "Alegeți unul",
"compose_form.poll.switch_to_multiple": "Modifică sondajul pentru a permite mai multe opțiuni", "compose_form.poll.switch_to_multiple": "Modifică sondajul pentru a permite mai multe opțiuni",
"compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune", "compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune",
"compose_form.poll.type": "Stil",
"compose_form.publish": "Postare",
"compose_form.publish_form": "Publică", "compose_form.publish_form": "Publică",
"compose_form.reply": "Răspundeți",
"compose_form.save_changes": "Actualizare",
"compose_form.spoiler.marked": "Elimină avertismentul privind conținutul", "compose_form.spoiler.marked": "Elimină avertismentul privind conținutul",
"compose_form.spoiler.unmarked": "Adaugă un avertisment privind conținutul", "compose_form.spoiler.unmarked": "Adaugă un avertisment privind conținutul",
"compose_form.spoiler_placeholder": "Atenționare de conținut (opțional)",
"confirmation_modal.cancel": "Anulează", "confirmation_modal.cancel": "Anulează",
"confirmations.block.block_and_report": "Blochează și raportează", "confirmations.block.block_and_report": "Blochează și raportează",
"confirmations.block.confirm": "Blochează", "confirmations.block.confirm": "Blochează",
@ -151,6 +169,7 @@
"confirmations.domain_block.confirm": "Blochează întregul domeniu", "confirmations.domain_block.confirm": "Blochează întregul domeniu",
"confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi tot domeniul {domain}? În cele mai multe cazuri, raportarea sau blocarea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea niciun conținut din acest domeniu în vreun flux public sau în vreo notificare. Abonații tăi din acest domeniu vor fi eliminați.", "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi tot domeniul {domain}? În cele mai multe cazuri, raportarea sau blocarea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea niciun conținut din acest domeniu în vreun flux public sau în vreo notificare. Abonații tăi din acest domeniu vor fi eliminați.",
"confirmations.edit.confirm": "Modifică", "confirmations.edit.confirm": "Modifică",
"confirmations.edit.message": "Editarea acum va suprascrie mesajul pe care îl compuneți în prezent. Sunteți sigur că vreți să continuați?",
"confirmations.logout.confirm": "Deconectare", "confirmations.logout.confirm": "Deconectare",
"confirmations.logout.message": "Ești sigur că vrei să te deconectezi?", "confirmations.logout.message": "Ești sigur că vrei să te deconectezi?",
"confirmations.mute.confirm": "Ignoră", "confirmations.mute.confirm": "Ignoră",
@ -165,6 +184,7 @@
"conversation.mark_as_read": "Marchează ca citit", "conversation.mark_as_read": "Marchează ca citit",
"conversation.open": "Vizualizează conversația", "conversation.open": "Vizualizează conversația",
"conversation.with": "Cu {names}", "conversation.with": "Cu {names}",
"copy_icon_button.copied": "Copiat în clipboard",
"copypaste.copied": "Copiat", "copypaste.copied": "Copiat",
"copypaste.copy_to_clipboard": "Copiază în clipboard", "copypaste.copy_to_clipboard": "Copiază în clipboard",
"directory.federated": "Din fediversul cunoscut", "directory.federated": "Din fediversul cunoscut",
@ -240,10 +260,17 @@
"filter_modal.select_filter.title": "Filtrează această postare", "filter_modal.select_filter.title": "Filtrează această postare",
"filter_modal.title.status": "Filtrează o postare", "filter_modal.title.status": "Filtrează o postare",
"firehose.all": "Toate", "firehose.all": "Toate",
"firehose.local": "Acest Server",
"firehose.remote": "Alte servere", "firehose.remote": "Alte servere",
"follow_request.authorize": "Acceptă", "follow_request.authorize": "Acceptă",
"follow_request.reject": "Respinge", "follow_request.reject": "Respinge",
"follow_requests.unlocked_explanation": "Chiar dacă contul tău nu este blocat, personalul {domain} a considerat că ai putea prefera să consulți manual cererile de abonare de la aceste conturi.", "follow_requests.unlocked_explanation": "Chiar dacă contul tău nu este blocat, personalul {domain} a considerat că ai putea prefera să consulți manual cererile de abonare de la aceste conturi.",
"follow_suggestions.curated_suggestion": "Alegerile Editorilor",
"follow_suggestions.dismiss": "Nu mai afișa din nou",
"follow_suggestions.personalized_suggestion": "Sugestie personalizată",
"follow_suggestions.popular_suggestion": "Sugestie populară",
"follow_suggestions.view_all": "Vizualizați tot",
"follow_suggestions.who_to_follow": "Pe cine să urmăriți",
"followed_tags": "Hastaguri urmărite", "followed_tags": "Hastaguri urmărite",
"footer.about": "Despre", "footer.about": "Despre",
"footer.directory": "Catalogul de profiluri", "footer.directory": "Catalogul de profiluri",
@ -272,12 +299,15 @@
"home.hide_announcements": "Ascunde anunțurile", "home.hide_announcements": "Ascunde anunțurile",
"home.pending_critical_update.body": "Te rugăm să-ți actualizezi serverul de Mastodon cat mai curând posibil!", "home.pending_critical_update.body": "Te rugăm să-ți actualizezi serverul de Mastodon cat mai curând posibil!",
"home.pending_critical_update.link": "Vezi noutăți", "home.pending_critical_update.link": "Vezi noutăți",
"home.pending_critical_update.title": "Actualizare critică de securitate disponibilă!",
"home.show_announcements": "Afișează anunțurile", "home.show_announcements": "Afișează anunțurile",
"interaction_modal.description.favourite": "Cu un cont pe Mastodon, poți adăuga această postare la favorite pentru a-l informa pe autorul ei că o apreciezi și pentru a o salva pentru mai târziu.",
"interaction_modal.description.follow": "Cu un cont Mastodon, poți urmări pe {name} pentru a vedea postările sale în cronologia ta principală.", "interaction_modal.description.follow": "Cu un cont Mastodon, poți urmări pe {name} pentru a vedea postările sale în cronologia ta principală.",
"interaction_modal.description.reblog": "Cu un cont pe Mastodon, poți distribui această postare pentru a le-o arăta și celor abonați ție.", "interaction_modal.description.reblog": "Cu un cont pe Mastodon, poți distribui această postare pentru a le-o arăta și celor abonați ție.",
"interaction_modal.description.reply": "Cu un cont pe Mastodon, poți răspunde acestei postări.", "interaction_modal.description.reply": "Cu un cont pe Mastodon, poți răspunde acestei postări.",
"interaction_modal.login.action": "Du-mă acasă", "interaction_modal.login.action": "Du-mă acasă",
"interaction_modal.login.prompt": "Adresa serverului tău acasă, de ex. mastodon.social", "interaction_modal.login.prompt": "Adresa serverului tău acasă, de ex. mastodon.social",
"interaction_modal.no_account_yet": "Nu ești încă pe Mastodon?",
"interaction_modal.on_another_server": "Pe un alt server", "interaction_modal.on_another_server": "Pe un alt server",
"interaction_modal.on_this_server": "Pe acest server", "interaction_modal.on_this_server": "Pe acest server",
"interaction_modal.title.follow": "Urmărește pe {name}", "interaction_modal.title.follow": "Urmărește pe {name}",

View file

@ -280,6 +280,7 @@
"follow_suggestions.curated_suggestion": "Výber zo servera", "follow_suggestions.curated_suggestion": "Výber zo servera",
"follow_suggestions.dismiss": "Znovu nezobrazuj", "follow_suggestions.dismiss": "Znovu nezobrazuj",
"follow_suggestions.personalized_suggestion": "Prispôsobené odporúčania", "follow_suggestions.personalized_suggestion": "Prispôsobené odporúčania",
"follow_suggestions.popular_suggestion": "Populárne návrhy",
"follow_suggestions.view_all": "Zobraz všetky", "follow_suggestions.view_all": "Zobraz všetky",
"follow_suggestions.who_to_follow": "Koho nasledovať", "follow_suggestions.who_to_follow": "Koho nasledovať",
"followed_tags": "Nasledované haštagy", "followed_tags": "Nasledované haštagy",
@ -355,7 +356,7 @@
"keyboard_shortcuts.muted": "otvor zoznam stíšených užívateľov", "keyboard_shortcuts.muted": "otvor zoznam stíšených užívateľov",
"keyboard_shortcuts.my_profile": "otvor svoj profil", "keyboard_shortcuts.my_profile": "otvor svoj profil",
"keyboard_shortcuts.notifications": "Otvor panel oznámení", "keyboard_shortcuts.notifications": "Otvor panel oznámení",
"keyboard_shortcuts.open_media": "na otvorenie médií", "keyboard_shortcuts.open_media": "Otvorenie médií",
"keyboard_shortcuts.pinned": "otvor zoznam pripnutých príspevkov", "keyboard_shortcuts.pinned": "otvor zoznam pripnutých príspevkov",
"keyboard_shortcuts.profile": "otvor autorov profil", "keyboard_shortcuts.profile": "otvor autorov profil",
"keyboard_shortcuts.reply": "odpovedať", "keyboard_shortcuts.reply": "odpovedať",
@ -364,7 +365,7 @@
"keyboard_shortcuts.spoilers": "to show/hide CW field", "keyboard_shortcuts.spoilers": "to show/hide CW field",
"keyboard_shortcuts.start": "otvor panel ''začíname''", "keyboard_shortcuts.start": "otvor panel ''začíname''",
"keyboard_shortcuts.toggle_hidden": "ukáž/skry text za CW", "keyboard_shortcuts.toggle_hidden": "ukáž/skry text za CW",
"keyboard_shortcuts.toggle_sensitivity": "pre zobrazenie/skrytie médií", "keyboard_shortcuts.toggle_sensitivity": "Ukáž/skry médiá",
"keyboard_shortcuts.toot": "začni úplne nový príspevok", "keyboard_shortcuts.toot": "začni úplne nový príspevok",
"keyboard_shortcuts.unfocus": "nesústreď sa na písaciu plochu, alebo hľadanie", "keyboard_shortcuts.unfocus": "nesústreď sa na písaciu plochu, alebo hľadanie",
"keyboard_shortcuts.up": "posuň sa vyššie v zozname", "keyboard_shortcuts.up": "posuň sa vyššie v zozname",
@ -493,7 +494,7 @@
"onboarding.share.message": "Na Mastodone som {username}. Príď ma nasledovať na {url}", "onboarding.share.message": "Na Mastodone som {username}. Príď ma nasledovať na {url}",
"onboarding.share.next_steps": "Ďalšie možné kroky:", "onboarding.share.next_steps": "Ďalšie možné kroky:",
"onboarding.share.title": "Zdieľaj svoj profil", "onboarding.share.title": "Zdieľaj svoj profil",
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", "onboarding.start.lead": "Teraz si súčasťou Mastodonu, unikátnej, decentralizovanej sociálnej platformy, kde ty, nie algoritmus, spravuješ svoj vlastný zážitok. Poďme ťa naštartovať na tomto novom sociálnom pomedzí:",
"onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.skip": "Want to skip right ahead?",
"onboarding.start.title": "Zvládli ste to!", "onboarding.start.title": "Zvládli ste to!",
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
@ -705,7 +706,7 @@
"units.short.million": "{count}mil.", "units.short.million": "{count}mil.",
"units.short.thousand": "{count}tis.", "units.short.thousand": "{count}tis.",
"upload_area.title": "Pretiahni a pusť pre nahratie", "upload_area.title": "Pretiahni a pusť pre nahratie",
"upload_button.label": "Pridaj médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_button.label": "Pridaj obrázky, video, alebo zvukový súbor",
"upload_error.limit": "Limit pre nahrávanie súborov bol prekročený.", "upload_error.limit": "Limit pre nahrávanie súborov bol prekročený.",
"upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.", "upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.",
"upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu", "upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu",

View file

@ -148,6 +148,7 @@
"compose_form.poll.duration": "Varaktighet för omröstning", "compose_form.poll.duration": "Varaktighet för omröstning",
"compose_form.poll.multiple": "Flera val", "compose_form.poll.multiple": "Flera val",
"compose_form.poll.option_placeholder": "Alternativ {number}", "compose_form.poll.option_placeholder": "Alternativ {number}",
"compose_form.poll.single": "Välj en",
"compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val", "compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val",
"compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val", "compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val",
"compose_form.poll.type": "Stil", "compose_form.poll.type": "Stil",

View file

@ -2,19 +2,22 @@
"about.blocks": "ma lawa", "about.blocks": "ma lawa",
"about.contact": "toki:", "about.contact": "toki:",
"about.domain_blocks.no_reason_available": "mi sona ala e tan", "about.domain_blocks.no_reason_available": "mi sona ala e tan",
"about.domain_blocks.suspended.title": "weka",
"about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.", "about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.",
"about.rules": "lawa kulupu", "about.rules": "lawa kulupu",
"account.account_note_header": "sona awen", "account.account_note_header": "sona awen",
"account.add_or_remove_from_list": "o ante e lipu jan",
"account.badges.bot": "ilo nanpa li lawa e ni",
"account.badges.group": "kulupu", "account.badges.group": "kulupu",
"account.block": "o weka e @{name}", "account.block": "o weka e @{name}",
"account.block_domain": "o weka e ma {domain}", "account.block_domain": "o weka e ma {domain}",
"account.block_short": "o weka e jan", "account.block_short": "o weka e jan tawa mi",
"account.blocked": "jan ni li weka", "account.blocked": "jan li weka tawa mi",
"account.browse_more_on_origin_server": "sina tawa ma tan pi jan ni la sina ken lukin e mute", "account.browse_more_on_origin_server": "sina tawa ma tan pi jan ni la sina ken lukin e mute",
"account.cancel_follow_request": "o pini wile kute", "account.cancel_follow_request": "o pini kute",
"account.copy": "o pali same e linja pi lipu jan", "account.copy": "o pali same e linja pi lipu jan",
"account.direct": "len la o mu e @{name}", "account.direct": "len la o mu e @{name}",
"account.disable_notifications": "@{name} li toki la o toki ala e toki ona tawa mi", "account.disable_notifications": "@{name} li toki la o mu ala e mi",
"account.domain_blocked": "ma ni li weka tawa sina", "account.domain_blocked": "ma ni li weka tawa sina",
"account.edit_profile": "o ante e lipu mi", "account.edit_profile": "o ante e lipu mi",
"account.enable_notifications": "@{name} li toki la o toki e toki ona tawa mi", "account.enable_notifications": "@{name} li toki la o toki e toki ona tawa mi",
@ -34,15 +37,15 @@
"account.media": "sitelen", "account.media": "sitelen",
"account.mention": "o toki e jan @{name}", "account.mention": "o toki e jan @{name}",
"account.moved_to": "lipu jan sin pi jan {name} li ni:", "account.moved_to": "lipu jan sin pi jan {name} li ni:",
"account.mute": "o kute ala e @{name}", "account.mute": "o len e @{name}",
"account.mute_notifications_short": "o kute ala e mu tan jan ni", "account.mute_notifications_short": "o kute ala e mu tan jan ni",
"account.mute_short": "o kute ala", "account.mute_short": "o kute ala",
"account.muted": "sina kute ala e jan ni", "account.muted": "sina len e jan ni",
"account.no_bio": "lipu li weka", "account.no_bio": "lipu li weka",
"account.open_original_page": "o open e lipu open", "account.open_original_page": "o open e lipu open",
"account.posts": "toki suli", "account.posts": "toki suli",
"account.posts_with_replies": "toki ale", "account.posts_with_replies": "toki ale",
"account.report": "jan @{name} la o toki e lawa", "account.report": "jan @{name} la o toki tawa lawa",
"account.requested": "jan ni o ken e kute sina. sina pini wile kute la o luka e ni", "account.requested": "jan ni o ken e kute sina. sina pini wile kute la o luka e ni",
"account.requested_follow": "{name} li wile kute e sina", "account.requested_follow": "{name} li wile kute e sina",
"account.share": "o pana e lipu jan @{name}", "account.share": "o pana e lipu jan @{name}",
@ -51,20 +54,21 @@
"account.unblock_domain": "o weka ala e ma {domain}", "account.unblock_domain": "o weka ala e ma {domain}",
"account.unblock_short": "o pini weka", "account.unblock_short": "o pini weka",
"account.unfollow": "o pini kute", "account.unfollow": "o pini kute",
"account.unmute": "o kute e @{name}", "account.unmute": "o len ala e @{name}",
"account.unmute_notifications_short": "o kute e mu tan jan ni", "account.unmute_notifications_short": "o kute e mu tan jan ni",
"account.unmute_short": "o ken kute e jan ni", "account.unmute_short": "o len ala",
"admin.dashboard.retention.average": "sama", "admin.dashboard.retention.average": "sama",
"admin.dashboard.retention.cohort": "tenpo mun open", "admin.dashboard.retention.cohort": "tenpo mun open",
"admin.dashboard.retention.cohort_size": "jan sin", "admin.dashboard.retention.cohort_size": "jan sin",
"alert.rate_limited.message": "tenpo {retry_time, time, medium} la o pali awen", "alert.rate_limited.message": "tenpo {retry_time, time, medium} la o pali awen",
"alert.unexpected.message": "pakala li lon", "alert.unexpected.message": "pakala li lon",
"alert.unexpected.title": "pakala", "alert.unexpected.title": "pakala a!",
"announcement.announcement": "toki suli", "announcement.announcement": "toki suli",
"audio.hide": "o len e kalama", "audio.hide": "o len e kalama",
"bundle_column_error.error.title": "pakala!", "bundle_column_error.error.title": "ike a!",
"bundle_column_error.network.title": "pakala la ilo sina li toki ala tawa ilo ante", "bundle_column_error.network.title": "pakala la ilo sina li toki ala tawa ilo ante",
"bundle_column_error.retry": "o ni sin", "bundle_column_error.retry": "o ni sin",
"bundle_column_error.return": "o tawa tomo",
"bundle_column_error.routing.body": "ilo li sona ala e lipu wile. sina pana ala pana e nasin pona tawa lipu?", "bundle_column_error.routing.body": "ilo li sona ala e lipu wile. sina pana ala pana e nasin pona tawa lipu?",
"bundle_column_error.routing.title": "pakala nanpa 404", "bundle_column_error.routing.title": "pakala nanpa 404",
"bundle_modal_error.close": "o pini", "bundle_modal_error.close": "o pini",
@ -72,64 +76,95 @@
"bundle_modal_error.retry": "o ni sin", "bundle_modal_error.retry": "o ni sin",
"closed_registrations_modal.find_another_server": "o alasa e ma ante", "closed_registrations_modal.find_another_server": "o alasa e ma ante",
"column.blocks": "kulupu pi jan weka", "column.blocks": "kulupu pi jan weka",
"column.lists": "lipu pi lipu mute", "column.home": "lipu open",
"column.mutes": "sina wile ala kute e jan ni", "column.lists": "kulupu lipu",
"community.column_settings.local_only": "toki lon ni taso", "column.mutes": "jan len",
"column.pins": "toki sewi",
"column_header.hide_settings": "o len e lawa",
"column_header.pin": "o sewi",
"column_header.show_settings": "o lukin e lawa",
"column_header.unpin": "o sewi ala",
"column_subheading.settings": "ken ilo",
"community.column_settings.local_only": "toki tan ni taso",
"community.column_settings.media_only": "sitelen taso", "community.column_settings.media_only": "sitelen taso",
"community.column_settings.remote_only": "toki tan ante taso",
"compose.language.change": "o ante e nasin toki", "compose.language.change": "o ante e nasin toki",
"compose.language.search": "o alasa e nasin toki...", "compose.language.search": "o alasa e nasin toki...",
"compose.published.body": "toki li pana.",
"compose.published.open": "o lukin", "compose.published.open": "o lukin",
"compose.saved.body": "ilo li awen e ijo pana sina.", "compose.saved.body": "ilo li awen e ijo pana sina.",
"compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante", "compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante",
"compose_form.placeholder": "sina toki insa e seme", "compose_form.encryption_warning": "toki li len ala lon ilo Masoton ꞏ o pana ala e sona suli len lon ilo Masoton",
"compose_form.placeholder": "sina wile toki e seme?",
"compose_form.poll.duration": "tenpo pana",
"compose_form.poll.multiple": "pana mute",
"compose_form.poll.option_placeholder": "ken nanpa {number}", "compose_form.poll.option_placeholder": "ken nanpa {number}",
"compose_form.poll.single": "pana pi wan taso",
"compose_form.poll.switch_to_multiple": "o ante e nasin pana. pana mute o ken", "compose_form.poll.switch_to_multiple": "o ante e nasin pana. pana mute o ken",
"compose_form.poll.switch_to_single": "o ante e nasin pana. pana wan taso o lon", "compose_form.poll.switch_to_single": "o ante e nasin pana. pana wan taso o lon",
"compose_form.poll.type": "nasin",
"compose_form.publish": "o toki", "compose_form.publish": "o toki",
"compose_form.publish_form": "o open toki sin", "compose_form.publish_form": "o open toki sin",
"compose_form.reply": "o toki lon ijo ni", "compose_form.reply": "o toki lon ijo ni",
"compose_form.save_changes": "o sin e ni", "compose_form.save_changes": "o sin e ni",
"compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken",
"confirmations.block.confirm": "o weka.", "confirmation_modal.cancel": "o pini",
"confirmations.block.confirm": "o weka",
"confirmations.block.message": "sina o wile ala wile weka e jan {name}?", "confirmations.block.message": "sina o wile ala wile weka e jan {name}?",
"confirmations.cancel_follow_request.confirm": "o weka e wile sina", "confirmations.cancel_follow_request.confirm": "o weka e wile sina",
"confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?", "confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?",
"confirmations.delete.confirm": "o pakala", "confirmations.delete.confirm": "o weka",
"confirmations.delete.message": "sina wile ala wile pakala e toki ni", "confirmations.delete.message": "sina wile ala wile weka e toki ni?",
"confirmations.delete_list.confirm": "o pakala", "confirmations.delete_list.confirm": "o weka",
"confirmations.delete_list.message": "sina wile ala wile pakala e lipu ni", "confirmations.delete_list.message": "sina wile ala wile weka e lipu ni?",
"confirmations.discard_edit_media.confirm": "o weka", "confirmations.discard_edit_media.confirm": "o weka",
"confirmations.discard_edit_media.message": "toki sitelen anu lukin lili sitelen la ante pi awen ala li lon. sina wile weka e ante ni?",
"confirmations.domain_block.confirm": "o weka.", "confirmations.domain_block.confirm": "o weka.",
"confirmations.domain_block.message": "sina wile ala a wile a len e ma {domain} ꞏ ken suli la len jan taso li pona ꞏ len pi ma ni la sina ken ala lukin e ijo pi ma ni lon lipu toki ale anu lukin toki ꞏ len ni la jan kute sina pi ma ni li weka",
"confirmations.edit.confirm": "o ante", "confirmations.edit.confirm": "o ante",
"confirmations.logout.confirm": "o weka", "confirmations.logout.confirm": "o weka",
"confirmations.logout.message": "sina wile ala wile weka", "confirmations.logout.message": "sina wile ala wile weka",
"confirmations.mute.confirm": "sina wile ala kute e jan ni", "confirmations.mute.confirm": "o len",
"confirmations.mute.message": "sina awen ala awen wile kute ala e {name}?", "confirmations.mute.message": "sina awen ala awen wile kute ala e {name}?",
"confirmations.redraft.confirm": "o pakala o pali sin e toki", "confirmations.redraft.confirm": "o weka o pali sin e toki",
"confirmations.redraft.message": "pali sin e toki ni la sina wile ala wile weka e ona? sina ni la suli pi toki ni en wawa pi toki ni li weka. kin la toki lon toki ni li jo e mama ala.",
"confirmations.reply.confirm": "toki lon toki ni",
"confirmations.reply.message": "toki tawa ona li weka e toki pali sina ꞏ sina wile ala wile ni",
"confirmations.unfollow.confirm": "o pini kute", "confirmations.unfollow.confirm": "o pini kute",
"confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?", "confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?",
"conversation.delete": "o weka e toki ni", "conversation.delete": "o weka e toki ni",
"conversation.mark_as_read": "ni o sin ala", "conversation.mark_as_read": "ni o sin ala",
"conversation.open": "o lukin e toki", "conversation.open": "o lukin e toki",
"conversation.with": "lon {names}", "conversation.with": "lon {names}",
"directory.local": "tan {domain} taso",
"directory.new_arrivals": "jan pi kama sin", "directory.new_arrivals": "jan pi kama sin",
"directory.recently_active": "jan lon tenpo poka",
"disabled_account_banner.account_settings": "wile pi lipu jan",
"disabled_account_banner.text": "sina ken ala kepeken e lipu jan sina pi nimi {disabledAccount}.",
"dismissable_banner.community_timeline": "ni li toki pi tenpo poka tawa ale tan jan lon ma lawa pi nimi {domain}.",
"dismissable_banner.dismiss": "o weka", "dismissable_banner.dismiss": "o weka",
"dismissable_banner.explore_links": "ni li toki pi ijo sin ꞏ jan mute li pana e ni lon tenpo suno ni ꞏ sin la jan mute li pana la ni li kama suli",
"embed.preview": "ni li jo e sitelen ni:",
"emoji_button.activity": "musi",
"emoji_button.flags": "len ma", "emoji_button.flags": "len ma",
"emoji_button.food": "moku", "emoji_button.food": "moku",
"emoji_button.label": "o pana e Emosi", "emoji_button.label": "o pana e sitelen pilin",
"emoji_button.nature": "soweli en kasi", "emoji_button.nature": "soweli en kasi",
"emoji_button.not_found": "sitelen Emosi ala li lon", "emoji_button.not_found": "sitelen pilin ala li lon",
"emoji_button.objects": "ijo", "emoji_button.objects": "ijo",
"emoji_button.people": "jan", "emoji_button.people": "jan",
"emoji_button.search": "o alasa", "emoji_button.search": "o alasa...",
"emoji_button.search_results": "ijo pi alasa ni", "emoji_button.search_results": "ijo pi alasa ni",
"emoji_button.symbols": "sitelen", "emoji_button.symbols": "sitelen",
"emoji_button.travel": "ma en tawa", "emoji_button.travel": "ma en tawa",
"empty_column.account_hides_collections": "jan ni li wile len e sona ni",
"empty_column.account_timeline": "toki ala li lon!", "empty_column.account_timeline": "toki ala li lon!",
"empty_column.account_unavailable": "ken ala lukin e lipu jan", "empty_column.account_unavailable": "ken ala lukin e lipu jan",
"empty_column.blocks": "jan ala li weka tawa sina.",
"empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni", "empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni",
"empty_column.hashtag": "ala li lon toki ni", "empty_column.hashtag": "ala li lon toki ni",
"empty_column.mutes": "jan ala la sina wile ala kute.", "empty_column.mutes": "jan ala li len tawa sina.",
"errors.unexpected_crash.report_issue": "o toki e pakala tawa lawa",
"explore.search_results": "ijo pi alasa ni", "explore.search_results": "ijo pi alasa ni",
"explore.suggested_follows": "jan", "explore.suggested_follows": "jan",
"explore.title": "o alasa", "explore.title": "o alasa",
@ -138,52 +173,109 @@
"filter_modal.select_filter.expired": "tenpo pini", "filter_modal.select_filter.expired": "tenpo pini",
"filter_modal.select_filter.search": "o alasa anu pali", "filter_modal.select_filter.search": "o alasa anu pali",
"firehose.all": "ale", "firehose.all": "ale",
"firehose.local": "ilo ni", "firehose.local": "kulupu ni",
"firehose.remote": "ilo ante", "firehose.remote": "kulupu ante",
"follow_request.authorize": "o sina kama", "follow_request.authorize": "o ken",
"follow_request.reject": "o weka", "follow_request.reject": "o ala",
"follow_suggestions.view_all": "o lukin e ale", "follow_suggestions.view_all": "o lukin e ale",
"follow_suggestions.who_to_follow": "sina o kute e ni",
"footer.about": "sona",
"footer.directory": "lipu jan",
"footer.get_app": "o jo e ilo",
"footer.privacy_policy": "lawa len", "footer.privacy_policy": "lawa len",
"footer.source_code": "o lukin e toki ilo", "footer.source_code": "o lukin e toki ilo",
"footer.status": "lon", "footer.status": "lon",
"generic.saved": "ni li awen",
"hashtag.column_header.tag_mode.all": "en {additional}", "hashtag.column_header.tag_mode.all": "en {additional}",
"hashtag.column_header.tag_mode.any": "anu {additional}", "hashtag.column_header.tag_mode.any": "anu {additional}",
"hashtag.column_header.tag_mode.none": "en {additional} ala",
"hashtag.column_settings.tag_mode.all": "ale ni", "hashtag.column_settings.tag_mode.all": "ale ni",
"hashtag.column_settings.tag_mode.any": "wan ni", "hashtag.column_settings.tag_mode.any": "wan ni",
"hashtag.column_settings.tag_mode.none": "ala ni", "hashtag.column_settings.tag_mode.none": "ala ni",
"home.pending_critical_update.link": "o lukin e ijo ilo sin", "home.pending_critical_update.link": "o lukin e ijo ilo sin",
"interaction_modal.on_another_server": "lon ma ante", "interaction_modal.on_another_server": "lon ma ante",
"interaction_modal.on_this_server": "lon ma ni", "interaction_modal.on_this_server": "lon ma ni",
"interaction_modal.title.favourite": "o suli e toki {name}",
"interaction_modal.title.follow": "o kute e {name}", "interaction_modal.title.follow": "o kute e {name}",
"keyboard_shortcuts.muted": "sina wile ala kute e jan la o lukin e ona ale", "interaction_modal.title.reblog": "o wawa e toki {name}",
"keyboard_shortcuts.open_media": "o open e sitelen", "keyboard_shortcuts.blocked": "o lukin e lipu sina pi jan weka",
"keyboard_shortcuts.toggle_sensitivity": "sitelen la o len anu lukin", "keyboard_shortcuts.boost": "o pana sin e toki",
"keyboard_shortcuts.down": "o tawa anpa lon lipu",
"keyboard_shortcuts.enter": "o lukin e toki",
"keyboard_shortcuts.favourite": "o suli e toki",
"keyboard_shortcuts.favourites": "o lukin e lipu sina pi toki suli",
"keyboard_shortcuts.muted": "o lukin e lipu sina pi jan len",
"keyboard_shortcuts.my_profile": "o lukin e lipu sina",
"keyboard_shortcuts.open_media": "o lukin e sitelen",
"keyboard_shortcuts.pinned": "o lukin pi lipu sina pi toki sewi",
"keyboard_shortcuts.toggle_sensitivity": "o ante e ken lukin",
"keyboard_shortcuts.toot": "o toki",
"keyboard_shortcuts.up": "o tawa sewi lon lipu",
"lightbox.close": "o pini", "lightbox.close": "o pini",
"link_preview.author": "{name} li pali e ni", "lightbox.compress": "o lili e sitelen",
"lightbox.expand": "o suli e sitelen",
"lightbox.next": "sinpin",
"lightbox.previous": "monsi",
"link_preview.author": "tan {name}",
"lists.account.add": "o pana tawa kulupu lipu",
"lists.account.remove": "o weka tan kulupu lipu",
"lists.delete": "o weka e kulupu lipu",
"lists.edit": "o ante e kulupu lipu",
"lists.edit.submit": "o ante e nimi", "lists.edit.submit": "o ante e nimi",
"lists.exclusive": "o len e toki lon lipu open",
"lists.new.create": "o sin e kulupu lipu",
"lists.replies_policy.followed": "jan kute ale",
"lists.replies_policy.list": "jan pi kulupu ni taso",
"lists.replies_policy.none": "jan ala", "lists.replies_policy.none": "jan ala",
"lists.subheading": "kulupu lipu sina",
"load_pending": "{count, plural, other {ijo sin #}}",
"loading_indicator.label": "ni li kama…",
"media_gallery.toggle_visible": "{number, plural, other {o len e sitelen}}",
"mute_modal.duration": "tenpo", "mute_modal.duration": "tenpo",
"mute_modal.indefinite": "tenpo ale", "mute_modal.indefinite": "tenpo ale",
"navigation_bar.filters": "sina wile ala kute e nimi ni", "navigation_bar.about": "sona",
"navigation_bar.blocks": "jan weka",
"navigation_bar.compose": "o pali e toki sin",
"navigation_bar.favourites": "toki suli",
"navigation_bar.filters": "nimi len",
"navigation_bar.lists": "kulupu lipu",
"navigation_bar.mutes": "sina wile ala kute e jan ni", "navigation_bar.mutes": "sina wile ala kute e jan ni",
"notification.follow": "jan {name} li kama kute e sina", "navigation_bar.pins": "toki sewi",
"navigation_bar.preferences": "wile sina",
"navigation_bar.search": "o alasa",
"notification.admin.sign_up": "{name} li kama",
"notification.favourite": "{name} li suli e toki sina",
"notification.follow": " {name} li kute e sina",
"notification.follow_request": "{name} li wile kute e sina", "notification.follow_request": "{name} li wile kute e sina",
"notification.mention": "jan {name} li toki e sina", "notification.mention": "jan {name} li toki e sina",
"notification.reblog": "{name} li wawa e toki sina",
"notification.status": "{name} li toki",
"notification.update": "{name} li ante e toki",
"notifications.column_settings.follow": "jan kute sin", "notifications.column_settings.follow": "jan kute sin",
"notifications.filter.all": "ale", "notifications.filter.all": "ale",
"onboarding.compose.template": "toki a, #Mastodon o!",
"onboarding.start.title": "sina o kama pona a!", "onboarding.start.title": "sina o kama pona a!",
"privacy.public.short": "jan ale", "poll.total_people": "{count, plural, other {jan #}}",
"privacy.public.short": "tawa ale",
"relative_time.full.just_now": "tenpo ni", "relative_time.full.just_now": "tenpo ni",
"relative_time.just_now": "tenpo ni", "relative_time.just_now": "tenpo ni",
"relative_time.today": "tenpo suno ni", "relative_time.today": "tenpo suno ni",
"report.block": "o weka e jan", "report.block": "o weka e jan",
"report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.", "report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.",
"report.category.title": "ike seme li lon {type} ni", "report.category.title": "ike seme li lon {type} ni",
"report.category.title_account": "lipu",
"report.category.title_status": "toki",
"report.close": "o pini", "report.close": "o pini",
"report.mute": "o kute ala e ona", "report.mute": "o kute ala e ona",
"report.mute_explanation": "sina kama ala lukin e ijo pana ona. ona li awen ken kute e sina li awen ken lukin e sina li sona ala e weka kute sina e weka lukin sina.", "report.mute_explanation": "sina kama ala lukin e ijo pana ona. ona li awen ken kute e sina li awen ken lukin e sina li sona ala e weka kute sina e weka lukin sina.",
"report.next": "awen",
"report.reasons.dislike": "ni li ike tawa mi", "report.reasons.dislike": "ni li ike tawa mi",
"report.reasons.legal": "ni li ike tawa lawa",
"report.reasons.other": "ni li ike tan ante",
"report.reasons.spam": "ni li ike tan toki mute",
"report.thanks.title": "sina wile ala lukin e ni anu seme?", "report.thanks.title": "sina wile ala lukin e ni anu seme?",
"report.unfollow": "o pini kute e {name}",
"report_notification.categories.legal": "ike tawa nasin lawa",
"search.placeholder": "o alasa", "search.placeholder": "o alasa",
"search.quick_action.go_to_account": "o tawa lipu jan {x}", "search.quick_action.go_to_account": "o tawa lipu jan {x}",
"search_popout.language_code": "nimi toki kepeken nasin ISO", "search_popout.language_code": "nimi toki kepeken nasin ISO",
@ -192,31 +284,48 @@
"search_results.statuses": "toki", "search_results.statuses": "toki",
"search_results.title": "o alasa e {q}", "search_results.title": "o alasa e {q}",
"status.block": "o weka e @{name}", "status.block": "o weka e @{name}",
"status.cancel_reblog_private": "o pini e pana",
"status.delete": "o weka", "status.delete": "o weka",
"status.edit": "o ante", "status.edit": "o ante",
"status.edited": "ni li ante lon {date}", "status.edited": "ni li ante lon {date}",
"status.embed": "ni o lon insa pi lipu ante", "status.embed": "ni o lon insa pi lipu ante",
"status.favourite": "o suli",
"status.hide": "o len",
"status.history.created": "{name} li pali e ni lon {date}", "status.history.created": "{name} li pali e ni lon {date}",
"status.history.edited": "{name} li ante lon {date}", "status.history.edited": "{name} li ante lon {date}",
"status.load_more": "o kama e ijo ante", "status.load_more": "o kama e ijo ante",
"status.media.open": "o open", "status.media.open": "o open",
"status.media.show": "o lukin", "status.media.show": "o lukin",
"status.media_hidden": "sitelen li len", "status.media_hidden": "sitelen li len",
"status.mute": "o kute ala e @{name}", "status.mute": "o len e @{name}",
"status.mute_conversation": "o kute ala e ijo pi toki ni", "status.mute_conversation": "o kute ala e ijo pi toki ni",
"status.pin": "o sewi lon lipu sina",
"status.pinned": "toki sewi",
"status.reblog": "o wawa",
"status.share": "o pana tawa ante",
"status.show_less": "o lili e ni", "status.show_less": "o lili e ni",
"status.show_less_all": "o lili e ale", "status.show_less_all": "o lili e ale",
"status.show_more": "o suli e ni", "status.show_more": "o suli e ni",
"status.show_more_all": "o suli e ale", "status.show_more_all": "o suli e ale",
"status.show_original": "ijo mama pi ijo ni li seme", "status.show_original": "o lukin e mama",
"status.translate": "o ante pi nasin toki",
"status.translated_from_with": "toki li ante tan {lang} kepeken {provider}",
"status.uncached_media_warning": "lukin lili li weka", "status.uncached_media_warning": "lukin lili li weka",
"status.unmute_conversation": "o ken kute e ijo pi toki ni", "status.unmute_conversation": "o ken kute e ijo pi toki ni",
"status.unpin": "o sewi ala lon lipu sina",
"subscribed_languages.save": "o awen e ante",
"tabs_bar.home": "lipu open",
"timeline_hint.resources.followers": "jan kute",
"timeline_hint.resources.follows": "jan lukin",
"timeline_hint.resources.statuses": "ijo pi tenpo suli", "timeline_hint.resources.statuses": "ijo pi tenpo suli",
"trends.trending_now": "jan mute li toki",
"units.short.million": "{count}AAA", "units.short.million": "{count}AAA",
"upload_button.label": "o pana e sitelen anu kalama",
"upload_error.limit": "ilo li ken ala e suli pi ijo ni.", "upload_error.limit": "ilo li ken ala e suli pi ijo ni.",
"upload_form.audio_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili", "upload_form.audio_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili",
"upload_form.description": "o toki e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", "upload_form.description": "o toki e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili",
"upload_form.edit": "o ante", "upload_form.edit": "o ante",
"upload_form.thumbnail": "o ante e sitelen lili",
"upload_form.video_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili, e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", "upload_form.video_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili, e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili",
"upload_modal.choose_image": "o wile e sitelen", "upload_modal.choose_image": "o wile e sitelen",
"upload_modal.description_placeholder": "mi pu jaki tan soweli", "upload_modal.description_placeholder": "mi pu jaki tan soweli",
@ -225,7 +334,12 @@
"upload_modal.preparing_ocr": "ilo li open e alasa nimi lon sitelen…", "upload_modal.preparing_ocr": "ilo li open e alasa nimi lon sitelen…",
"upload_progress.label": "ilo li kama jo e ijo sina...", "upload_progress.label": "ilo li kama jo e ijo sina...",
"upload_progress.processing": "ilo li pali…", "upload_progress.processing": "ilo li pali…",
"username.taken": "jan ante li jo e nimi ni. sina o pali e nimi sin.", "username.taken": "jan ante li kepeken e nimi ni. sina o kepeken e nimi sin",
"video.close": "o weka e ni",
"video.download": "o jo e ni",
"video.exit_fullscreen": "o weka tan sitelen suli",
"video.expand": "o suli e ni",
"video.hide": "o len e sitelen",
"video.mute": "o kalama ala", "video.mute": "o kalama ala",
"video.pause": "o lape e ni", "video.pause": "o lape e ni",
"video.unmute": "o kalama" "video.unmute": "o kalama"

View file

@ -5628,6 +5628,8 @@ a.status-card {
inset-inline-start: 0; inset-inline-start: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
max-width: 100vw;
max-height: 100vh;
box-sizing: border-box; box-sizing: border-box;
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View file

@ -4,14 +4,34 @@ module ApplicationExtension
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
include Redisable
has_many :created_users, class_name: 'User', foreign_key: 'created_by_application_id', inverse_of: :created_by_application has_many :created_users, class_name: 'User', foreign_key: 'created_by_application_id', inverse_of: :created_by_application
validates :name, length: { maximum: 60 } validates :name, length: { maximum: 60 }
validates :website, url: true, length: { maximum: 2_000 }, if: :website? validates :website, url: true, length: { maximum: 2_000 }, if: :website?
validates :redirect_uri, length: { maximum: 2_000 } validates :redirect_uri, length: { maximum: 2_000 }
# The relationship used between Applications and AccessTokens is using
# dependent: delete_all, which means the ActiveRecord callback in
# AccessTokenExtension is not run, so instead we manually announce to
# streaming that these tokens are being deleted.
before_destroy :push_to_streaming_api, prepend: true
end end
def confirmation_redirect_uri def confirmation_redirect_uri
redirect_uri.lines.first.strip redirect_uri.lines.first.strip
end end
def push_to_streaming_api
# TODO: #28793 Combine into a single topic
payload = Oj.dump(event: :kill)
access_tokens.in_batches do |tokens|
redis.pipelined do |pipeline|
tokens.ids.each do |id|
pipeline.publish("timeline:access_token:#{id}", payload)
end
end
end
end
end end

View file

@ -25,7 +25,15 @@ module User::LdapAuthenticable
resource = joins(:account).find_by(accounts: { username: safe_username }) resource = joins(:account).find_by(accounts: { username: safe_username })
if resource.blank? if resource.blank?
resource = new(email: attributes[Devise.ldap_mail.to_sym].first, agreement: true, account_attributes: { username: safe_username }, admin: false, external: true, confirmed_at: Time.now.utc) resource = new(
email: attributes[Devise.ldap_mail.to_sym].first,
agreement: true,
account_attributes: {
username: safe_username,
},
external: true,
confirmed_at: Time.now.utc
)
resource.save! resource.save!
end end

View file

@ -19,17 +19,18 @@ module User::Omniauthable
end end
class_methods do class_methods do
def find_for_oauth(auth, signed_in_resource = nil) def find_for_omniauth(auth, signed_in_resource = nil)
# EOLE-SSO Patch # EOLE-SSO Patch
auth.uid = (auth.uid[0][:uid] || auth.uid[0][:user]) if auth.uid.is_a? Hashie::Array auth.uid = (auth.uid[0][:uid] || auth.uid[0][:user]) if auth.uid.is_a? Hashie::Array
identity = Identity.find_for_oauth(auth) identity = Identity.find_for_omniauth(auth)
# If a signed_in_resource is provided it always overrides the existing user # If a signed_in_resource is provided it always overrides the existing user
# to prevent the identity being locked with accidentally created accounts. # to prevent the identity being locked with accidentally created accounts.
# Note that this may leave zombie accounts (with no associated identity) which # Note that this may leave zombie accounts (with no associated identity) which
# can be cleaned up at a later date. # can be cleaned up at a later date.
user = signed_in_resource || identity.user user = signed_in_resource || identity.user
user ||= create_for_oauth(auth) user ||= reattach_for_auth(auth)
user ||= create_for_auth(auth)
if identity.user.nil? if identity.user.nil?
identity.user = user identity.user = user
@ -39,19 +40,35 @@ module User::Omniauthable
user user
end end
def create_for_oauth(auth) private
# Check if the user exists with provided email. If no email was provided,
def reattach_for_auth(auth)
# If allowed, check if a user exists with the provided email address,
# and return it if they does not have an associated identity with the
# current authentication provider.
# This can be used to provide a choice of alternative auth providers
# or provide smooth gradual transition between multiple auth providers,
# but this is discouraged because any insecure provider will put *all*
# local users at risk, regardless of which provider they registered with.
return unless ENV['ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH'] == 'true'
email, email_is_verified = email_from_auth(auth)
return unless email_is_verified
user = User.find_by(email: email)
return if user.nil? || Identity.exists?(provider: auth.provider, user_id: user.id)
user
end
def create_for_auth(auth)
# Create a user for the given auth params. If no email was provided,
# we assign a temporary email and ask the user to verify it on # we assign a temporary email and ask the user to verify it on
# the next step via Auth::SetupController.show # the next step via Auth::SetupController.show
strategy = Devise.omniauth_configs[auth.provider.to_sym].strategy email, email_is_verified = email_from_auth(auth)
assume_verified = strategy&.security&.assume_email_is_verified
email_is_verified = auth.info.verified || auth.info.verified_email || auth.info.email_verified || assume_verified
email = auth.info.verified_email || auth.info.email
user = User.find_by(email: email) if email_is_verified
return user unless user.nil?
user = User.new(user_params_from_auth(email, auth)) user = User.new(user_params_from_auth(email, auth))
@ -66,7 +83,14 @@ module User::Omniauthable
user user
end end
private def email_from_auth(auth)
strategy = Devise.omniauth_configs[auth.provider.to_sym].strategy
assume_verified = strategy&.security&.assume_email_is_verified
email_is_verified = auth.info.verified || auth.info.verified_email || auth.info.email_verified || assume_verified
email = auth.info.verified_email || auth.info.email
[email, email_is_verified]
end
def user_params_from_auth(email, auth) def user_params_from_auth(email, auth)
{ {

View file

@ -32,7 +32,6 @@ module User::PamAuthenticable
self.email = "#{account.username}@#{find_pam_suffix}" if email.nil? && find_pam_suffix self.email = "#{account.username}@#{find_pam_suffix}" if email.nil? && find_pam_suffix
self.confirmed_at = Time.now.utc self.confirmed_at = Time.now.utc
self.admin = false
self.account = account self.account = account
self.external = true self.external = true

View file

@ -17,7 +17,7 @@ class Identity < ApplicationRecord
validates :uid, presence: true, uniqueness: { scope: :provider } validates :uid, presence: true, uniqueness: { scope: :provider }
validates :provider, presence: true validates :provider, presence: true
def self.find_for_oauth(auth) def self.find_for_omniauth(auth)
find_or_create_by(uid: auth.uid, provider: auth.provider) find_or_create_by(uid: auth.uid, provider: auth.provider)
end end
end end

View file

@ -51,6 +51,8 @@ class User < ApplicationRecord
last_sign_in_ip last_sign_in_ip
skip_sign_in_token skip_sign_in_token
filtered_languages filtered_languages
admin
moderator
) )
include LanguagesHelper include LanguagesHelper
@ -347,6 +349,16 @@ class User < ApplicationRecord
Doorkeeper::AccessToken.by_resource_owner(self).in_batches do |batch| Doorkeeper::AccessToken.by_resource_owner(self).in_batches do |batch|
batch.update_all(revoked_at: Time.now.utc) batch.update_all(revoked_at: Time.now.utc)
Web::PushSubscription.where(access_token_id: batch).delete_all Web::PushSubscription.where(access_token_id: batch).delete_all
# Revoke each access token for the Streaming API, since `update_all``
# doesn't trigger ActiveRecord Callbacks:
# TODO: #28793 Combine into a single topic
payload = Oj.dump(event: :kill)
redis.pipelined do |pipeline|
batch.ids.each do |id|
pipeline.publish("timeline:access_token:#{id}", payload)
end
end
end end
end end

View file

@ -7,7 +7,7 @@ user = ENV.fetch('ES_USER', nil).presence
password = ENV.fetch('ES_PASS', nil).presence password = ENV.fetch('ES_PASS', nil).presence
fallback_prefix = ENV.fetch('REDIS_NAMESPACE', nil).presence fallback_prefix = ENV.fetch('REDIS_NAMESPACE', nil).presence
prefix = ENV.fetch('ES_PREFIX') { fallback_prefix } prefix = ENV.fetch('ES_PREFIX') { fallback_prefix }
ca_file = ENV.fetch('ES_CA_CERT', nil).presence ca_file = ENV.fetch('ES_CA_FILE', nil).presence
transport_options = { ssl: { ca_file: ca_file } } if ca_file.present? transport_options = { ssl: { ca_file: ca_file } } if ca_file.present?

View file

@ -21,9 +21,14 @@ Doorkeeper.configure do
user unless user&.otp_required_for_login? user unless user&.otp_required_for_login?
end end
# If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below. # Doorkeeper provides some administrative interfaces for managing OAuth
# Applications, allowing creation, edit, and deletion of applications from the
# server. At present, these administrative routes are not integrated into
# Mastodon, and as such, we've disabled them by always return a 403 forbidden
# response for them. This does not affect the ability for users to manage
# their own OAuth Applications.
admin_authenticator do admin_authenticator do
current_user&.admin? || redirect_to(new_user_session_url) head 403
end end
# Authorization Code expiration time (default 10 minutes). # Authorization Code expiration time (default 10 minutes).

View file

@ -4,3 +4,11 @@ tok:
attributes: attributes:
poll: poll:
expires_at: pini tenpo expires_at: pini tenpo
user/account:
username: nimi jan
errors:
models:
account:
attributes:
username:
reserved: jan ante li jo e nimi ni

View file

@ -1548,7 +1548,7 @@ ca:
unrecognized_emoji: no és un emoji reconegut unrecognized_emoji: no és un emoji reconegut
redirects: redirects:
prompt: Si confieu en aquest enllaç, feu-hi clic per a continuar. prompt: Si confieu en aquest enllaç, feu-hi clic per a continuar.
title: Esteu sortint de %{instance}. title: Deixeu %{instance}.
relationships: relationships:
activity: Activitat del compte activity: Activitat del compte
confirm_follow_selected_followers: Segur que vols seguir els seguidors seleccionats? confirm_follow_selected_followers: Segur que vols seguir els seguidors seleccionats?

View file

@ -12,6 +12,7 @@ en:
last_attempt: You have one more attempt before your account is locked. last_attempt: You have one more attempt before your account is locked.
locked: Your account is locked. locked: Your account is locked.
not_found_in_database: Invalid %{authentication_keys} or password. not_found_in_database: Invalid %{authentication_keys} or password.
omniauth_user_creation_failure: Error creating an account for this identity.
pending: Your account is still under review. pending: Your account is still under review.
timeout: Your session expired. Please login again to continue. timeout: Your session expired. Please login again to continue.
unauthenticated: You need to login or sign up before continuing. unauthenticated: You need to login or sign up before continuing.

View file

@ -39,6 +39,8 @@ ia:
webauthn_enabled: webauthn_enabled:
title: Claves de securitate activate title: Claves de securitate activate
registrations: registrations:
destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto.
signed_up_but_pending: Un message con un ligamine de confirmation esseva inviate a tu conto de email. Post que tu clicca le ligamine, nos revidera tu application. Tu essera notificate si illo es approbate.
updated: Tu conto ha essite actualisate con successo. updated: Tu conto ha essite actualisate con successo.
unlocks: unlocks:
unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar. unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar.

View file

@ -47,14 +47,19 @@ ro:
subject: Instrucțiuni pentru resetarea parolei subject: Instrucțiuni pentru resetarea parolei
title: Resetare parolă title: Resetare parolă
two_factor_disabled: two_factor_disabled:
explanation: Conectarea este acum posibilă folosind doar adresa de e-mail și parola.
subject: Autentificare cu doi factori dezactivată subject: Autentificare cu doi factori dezactivată
subtitle: Autentificarea cu doi factori pentru contul dvs. a fost dezactivată.
title: 2FA dezactivat title: 2FA dezactivat
two_factor_enabled: two_factor_enabled:
explanation: Pentru autentificare va fi necesar un token generat de aplicația TOTP asociată.
subject: Autentificare în doi pași activată subject: Autentificare în doi pași activată
subtitle: Autentificarea cu doi factori a fost activată pentru contul dvs.
title: 2FA activat title: 2FA activat
two_factor_recovery_codes_changed: two_factor_recovery_codes_changed:
explanation: Codurile anterioare de recuperare au fost invalidate și unele noi generate. explanation: Codurile anterioare de recuperare au fost invalidate și unele noi generate.
subject: Recuperare în doi factori subject: Recuperare în doi factori
subtitle: Codurile de recuperare anterioare au fost invalidate și s-au generat altele noi.
title: Coduri de recuperare 2FA modificate title: Coduri de recuperare 2FA modificate
unlock_instructions: unlock_instructions:
subject: Instrucțiuni de deblocare subject: Instrucțiuni de deblocare
@ -68,9 +73,13 @@ ro:
subject: 'Mastodon: Cheie de securitate ștearsă' subject: 'Mastodon: Cheie de securitate ștearsă'
title: Una dintre cheile tale de securitate a fost ștearsă title: Una dintre cheile tale de securitate a fost ștearsă
webauthn_disabled: webauthn_disabled:
explanation: Autentificarea cu chei de securitate a fost dezactivată pentru contul dvs.
extra: Conectarea este acum posibilă folosind doar token-ul generat de aplicația TOTP asociată.
subject: 'Mastodon: Autentificarea cu chei de securitate dezactivată' subject: 'Mastodon: Autentificarea cu chei de securitate dezactivată'
title: Chei de securitate dezactivate title: Chei de securitate dezactivate
webauthn_enabled: webauthn_enabled:
explanation: Autentificarea cu cheie de securitate a fost activată pentru contul dvs.
extra: Cheia ta de securitate poate fi acum folosită pentru conectare.
subject: 'Mastodon: Autentificarea cheii de securitate activată' subject: 'Mastodon: Autentificarea cheii de securitate activată'
title: Chei de securitate activate title: Chei de securitate activate
omniauth_callbacks: omniauth_callbacks:

View file

@ -34,6 +34,7 @@ ia:
confirmations: confirmations:
revoke: Es tu secur? revoke: Es tu secur?
index: index:
last_used_at: Ultime uso in %{date}
never_used: Nunquam usate never_used: Nunquam usate
scopes: Permissiones scopes: Permissiones
title: Tu applicationes autorisate title: Tu applicationes autorisate

View file

@ -1 +1,51 @@
---
tok: tok:
doorkeeper:
applications:
buttons:
cancel: o pini
destroy: o weka
edit: o ante
submit: o awen
confirmations:
destroy: ni li pona ala pona?
edit:
title: o ante e ilo nanpa
form:
error: 'pakala a! o lukin e ni: lipu sina li jo ala jo e pakala.'
index:
delete: o weka
empty: sina li jo e ilo nanpa ala.
name: nimi
new: o pali e ilo nanpa sin
title: ilo nanpa sina
new:
title: o pali e ilo nanpa sin
show:
title: ilo nanpa pi nimi %{name}
authorizations:
error:
title: pakala li lon.
authorized_applications:
confirmations:
revoke: ni li pona ala pona?
index:
scopes: ken
errors:
messages:
invalid_request:
missing_param: o pana e sona "%{value}".
flash:
applications:
create:
notice: sina pali e ilo nanpa.
destroy:
notice: sina weka e ilo nanpa.
update:
notice: sina ante e ilo nanpa.
authorized_applications:
destroy:
notice: sina weka e ilo nanpa tawa sina.
grouped_scopes:
access:
read: lukin taso

View file

@ -236,6 +236,8 @@ ia:
migrations: migrations:
errors: errors:
not_found: non poterea esser trovate not_found: non poterea esser trovate
preferences:
public_timelines: Chronologias public
statuses_cleanup: statuses_cleanup:
min_age: min_age:
'1209600': 2 septimanas '1209600': 2 septimanas
@ -254,6 +256,7 @@ ia:
disable: Disactivar 2FA disable: Disactivar 2FA
user_mailer: user_mailer:
welcome: welcome:
final_step: 'Comencia a publicar! Mesmo sin sequitores, tu messages public poterea esser reguardate per alteres, per exemplo in le chronologia local o in hashtags. Tu poterea voler introducer te con le hashtag #introductiones.'
subject: Benvenite in Mastodon subject: Benvenite in Mastodon
webauthn_credentials: webauthn_credentials:
delete: Deler delete: Deler

View file

@ -261,7 +261,7 @@ bg:
status_page_url: URL адрес на страница със състоянието status_page_url: URL адрес на страница със състоянието
theme: Стандартна тема theme: Стандартна тема
thumbnail: Образче на сървъра thumbnail: Образче на сървъра
timeline_preview: Позволяване на неупълномощен достъп до публични часови оси timeline_preview: Позволяване на неудостоверен достъп до публични инфопотоци
trendable_by_default: Без преглед на налагащото се trendable_by_default: Без преглед на налагащото се
trends: Включване на налагащи се trends: Включване на налагащи се
trends_as_landing_page: Употреба на налагащото се като целева страница trends_as_landing_page: Употреба на налагащото се като целева страница

View file

@ -26,6 +26,7 @@ ia:
username: Nomine de usator username: Nomine de usator
username_or_email: Nomine de usator o e-mail username_or_email: Nomine de usator o e-mail
form_admin_settings: form_admin_settings:
bootstrap_timeline_accounts: Recommenda sempre iste contos a nove usatores
custom_css: CSS personalisate custom_css: CSS personalisate
profile_directory: Activar directorio de profilos profile_directory: Activar directorio de profilos
site_contact_email: Adresse de e-mail de contacto site_contact_email: Adresse de e-mail de contacto

View file

@ -5,8 +5,8 @@ tok:
account: account:
display_name: nimi sina ale anu nimi sina musi. display_name: nimi sina ale anu nimi sina musi.
defaults: defaults:
setting_display_media_hide_all: tenpo ale la, o weka e sitelen setting_display_media_hide_all: sitelen ale li len
setting_display_media_show_all: tenpo ale la, o awen e sitelen setting_display_media_show_all: sitelen ale li len ala
labels: labels:
defaults: defaults:
expires_in: ona o moli lon expires_in: ona o moli lon

View file

@ -200,12 +200,12 @@ zh-TW:
password: 密碼 password: 密碼
phrase: 關鍵字或片語 phrase: 關鍵字或片語
setting_advanced_layout: 啟用進階網頁介面 setting_advanced_layout: 啟用進階網頁介面
setting_aggregate_reblogs: 時間軸中的群組轉嘟 setting_aggregate_reblogs: 於時間軸中不重複顯示轉嘟
setting_always_send_emails: 總是發送電子郵件通知 setting_always_send_emails: 總是發送電子郵件通知
setting_auto_play_gif: 自動播放 GIF 動畫 setting_auto_play_gif: 自動播放 GIF 動畫
setting_boost_modal: 轉嘟前先詢問我 setting_boost_modal: 轉嘟前先詢問我
setting_default_language: 嘟文語言 setting_default_language: 嘟文語言
setting_default_privacy: 嘟文可見範圍 setting_default_privacy: 嘟文隱私設定
setting_default_sensitive: 總是將媒體標記為敏感內容 setting_default_sensitive: 總是將媒體標記為敏感內容
setting_delete_modal: 刪除嘟文前先詢問我 setting_delete_modal: 刪除嘟文前先詢問我
setting_disable_swiping: 停用滑動手勢 setting_disable_swiping: 停用滑動手勢

View file

@ -88,7 +88,7 @@ sk:
remote: Federované remote: Federované
title: Umiestnenie title: Umiestnenie
login_status: Stav prihlásenia login_status: Stav prihlásenia
media_attachments: Prílohy media_attachments: Mediálne prílohy
memorialize: Zmeň na "Navždy budeme spomínať" memorialize: Zmeň na "Navždy budeme spomínať"
memorialized: Spomienka na memorialized: Spomienka na
memorialized_msg: Úspešne zmenené %{username} na spomienkové konto memorialized_msg: Úspešne zmenené %{username} na spomienkové konto
@ -251,14 +251,16 @@ sk:
enable_user_html: "%{name} povolil/a prihlásenie pre používateľa %{target}" enable_user_html: "%{name} povolil/a prihlásenie pre používateľa %{target}"
memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku" memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku"
reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}" reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}"
remove_avatar_user_html: "%{name} vymazal/a %{target}/ov/in avatar"
reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}" reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}"
resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}" resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}"
reset_password_user_html: "%{name} resetoval/a heslo používateľa %{target}" reset_password_user_html: "%{name} resetoval/a heslo používateľa %{target}"
resolve_report_html: "%{name} vyriešil/a nahlásenie %{target}" resolve_report_html: "%{name} vyriešil/a nahlásenie %{target}"
sensitive_account_html: "%{name} označil médium od %{target} za chúlostivé" sensitive_account_html: "%{name} označil/a médium od %{target} za chúlostivé"
silence_account_html: "%{name} obmedzil/a účet %{target}" silence_account_html: "%{name} obmedzil/a účet %{target}"
suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}" suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}"
unassigned_report_html: "%{name} odobral/a report od %{target}" unassigned_report_html: "%{name} odobral/a report od %{target}"
unsensitive_account_html: "%{name} odznačil/a médium od %{target} ako chúlostivé"
unsuspend_account_html: "%{name} spojazdnil/a účet %{target}" unsuspend_account_html: "%{name} spojazdnil/a účet %{target}"
update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}" update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}"
update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}" update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}"

View file

@ -1 +1,5 @@
---
tok: tok:
admin:
accounts:
are_you_sure: ni li pona ala pona?

View file

@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'sidekiq_unique_jobs/web' require 'sidekiq_unique_jobs/web' if ENV['ENABLE_SIDEKIQ_UNIQUE_JOBS_UI'] == true
require 'sidekiq-scheduler/web' require 'sidekiq-scheduler/web'
class RedirectWithVary < ActionDispatch::Routing::PathRedirect class RedirectWithVary < ActionDispatch::Routing::PathRedirect

View file

@ -31,7 +31,7 @@ module Mastodon
end end
def default_prerelease def default_prerelease
'alpha.1' 'alpha.2'
end end
def prerelease def prerelease

View file

@ -0,0 +1,11 @@
# frozen_string_literal: true
namespace :sidekiq_unique_jobs do
task delete_all_locks: :environment do
digests = SidekiqUniqueJobs::Digests.new
digests.delete_by_pattern('*', count: digests.count)
expiring_digests = SidekiqUniqueJobs::ExpiringDigests.new
expiring_digests.delete_by_pattern('*', count: expiring_digests.count)
end
end

View file

@ -3,19 +3,19 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe Identity do RSpec.describe Identity do
describe '.find_for_oauth' do describe '.find_for_omniauth' do
let(:auth) { Fabricate(:identity, user: Fabricate(:user)) } let(:auth) { Fabricate(:identity, user: Fabricate(:user)) }
it 'calls .find_or_create_by' do it 'calls .find_or_create_by' do
allow(described_class).to receive(:find_or_create_by) allow(described_class).to receive(:find_or_create_by)
described_class.find_for_oauth(auth) described_class.find_for_omniauth(auth)
expect(described_class).to have_received(:find_or_create_by).with(uid: auth.uid, provider: auth.provider) expect(described_class).to have_received(:find_or_create_by).with(uid: auth.uid, provider: auth.provider)
end end
it 'returns an instance of Identity' do it 'returns an instance of Identity' do
expect(described_class.find_for_oauth(auth)).to be_instance_of described_class expect(described_class.find_for_omniauth(auth)).to be_instance_of described_class
end end
end end
end end

View file

@ -452,7 +452,10 @@ RSpec.describe User do
let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) } let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) }
let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) } let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) }
let(:redis_pipeline_stub) { instance_double(Redis::Namespace, publish: nil) }
before do before do
allow(redis).to receive(:pipelined).and_yield(redis_pipeline_stub)
user.reset_password! user.reset_password!
end end
@ -469,6 +472,10 @@ RSpec.describe User do
expect(Doorkeeper::AccessToken.active_for(user).count).to eq 0 expect(Doorkeeper::AccessToken.active_for(user).count).to eq 0
end end
it 'revokes streaming access for all access tokens' do
expect(redis_pipeline_stub).to have_received(:publish).with("timeline:access_token:#{access_token.id}", Oj.dump(event: :kill)).once
end
it 'removes push subscriptions' do it 'removes push subscriptions' do
expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count).to eq 0 expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count).to eq 0
expect { web_push_subscription.reload }.to raise_error(ActiveRecord::RecordNotFound) expect { web_push_subscription.reload }.to raise_error(ActiveRecord::RecordNotFound)

View file

@ -0,0 +1,83 @@
# frozen_string_literal: true
require 'rails_helper'
describe 'Disabled OAuth routes' do
# These routes are disabled via the doorkeeper configuration for
# `admin_authenticator`, as these routes should only be accessible by server
# administrators. For now, these routes are not properly designed and
# integrated into Mastodon, so we're disabling them completely
describe 'GET /oauth/applications' do
it 'returns 403 forbidden' do
get oauth_applications_path
expect(response).to have_http_status(403)
end
end
describe 'POST /oauth/applications' do
it 'returns 403 forbidden' do
post oauth_applications_path
expect(response).to have_http_status(403)
end
end
describe 'GET /oauth/applications/new' do
it 'returns 403 forbidden' do
get new_oauth_application_path
expect(response).to have_http_status(403)
end
end
describe 'GET /oauth/applications/:id' do
let(:application) { Fabricate(:application, scopes: 'read') }
it 'returns 403 forbidden' do
get oauth_application_path(application)
expect(response).to have_http_status(403)
end
end
describe 'PATCH /oauth/applications/:id' do
let(:application) { Fabricate(:application, scopes: 'read') }
it 'returns 403 forbidden' do
patch oauth_application_path(application)
expect(response).to have_http_status(403)
end
end
describe 'PUT /oauth/applications/:id' do
let(:application) { Fabricate(:application, scopes: 'read') }
it 'returns 403 forbidden' do
put oauth_application_path(application)
expect(response).to have_http_status(403)
end
end
describe 'DELETE /oauth/applications/:id' do
let(:application) { Fabricate(:application, scopes: 'read') }
it 'returns 403 forbidden' do
delete oauth_application_path(application)
expect(response).to have_http_status(403)
end
end
describe 'GET /oauth/applications/:id/edit' do
let(:application) { Fabricate(:application, scopes: 'read') }
it 'returns 403 forbidden' do
get edit_oauth_application_path(application)
expect(response).to have_http_status(403)
end
end
end

View file

@ -39,16 +39,35 @@ describe 'OmniAuth callbacks' do
Fabricate(:user, email: 'user@host.example') Fabricate(:user, email: 'user@host.example')
end end
it 'matches the existing user, creates an identity, and redirects to root path' do context 'when ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH is set to true' do
expect { subject } around do |example|
.to not_change(User, :count) ClimateControl.modify ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH: 'true' do
.and change(Identity, :count) example.run
.by(1) end
.and change(LoginActivity, :count) end
.by(1)
expect(Identity.find_by(user: User.last).uid).to eq('123') it 'matches the existing user, creates an identity, and redirects to root path' do
expect(response).to redirect_to(root_path) expect { subject }
.to not_change(User, :count)
.and change(Identity, :count)
.by(1)
.and change(LoginActivity, :count)
.by(1)
expect(Identity.find_by(user: User.last).uid).to eq('123')
expect(response).to redirect_to(root_path)
end
end
context 'when ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH is not set to true' do
it 'does not match the existing user or create an identity, and redirects to login page' do
expect { subject }
.to not_change(User, :count)
.and not_change(Identity, :count)
.and not_change(LoginActivity, :count)
expect(response).to redirect_to(new_user_session_url)
end
end end
end end
@ -96,7 +115,7 @@ describe 'OmniAuth callbacks' do
context 'when a user cannot be built' do context 'when a user cannot be built' do
before do before do
allow(User).to receive(:find_for_oauth).and_return(User.new) allow(User).to receive(:find_for_omniauth).and_return(User.new)
end end
it 'redirects to the new user signup page' do it 'redirects to the new user signup page' do

128
yarn.lock
View file

@ -1697,14 +1697,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@es-joy/jsdoccomment@npm:~0.41.0": "@es-joy/jsdoccomment@npm:~0.42.0":
version: 0.41.0 version: 0.42.0
resolution: "@es-joy/jsdoccomment@npm:0.41.0" resolution: "@es-joy/jsdoccomment@npm:0.42.0"
dependencies: dependencies:
comment-parser: "npm:1.4.1" comment-parser: "npm:1.4.1"
esquery: "npm:^1.5.0" esquery: "npm:^1.5.0"
jsdoc-type-pratt-parser: "npm:~4.0.0" jsdoc-type-pratt-parser: "npm:~4.0.0"
checksum: 1fa27531eba32e4699664da53a0865aeeda1f7e83ac156fe53b7a6b09d2f3816baa94a34845ff019c10289b09572bda5519ec917e3e241088975477fa880f72d checksum: a8122762d2df3c6501a9c459e2822315a23c0078c4aeb0b40fb3c84b99e21a78e85e67f962d6b5dde5eb751792a1c67c6a170b619573db7151098a19950abe35
languageName: node languageName: node
linkType: hard linkType: hard
@ -3675,14 +3675,14 @@ __metadata:
linkType: hard linkType: hard
"@typescript-eslint/eslint-plugin@npm:^6.0.0": "@typescript-eslint/eslint-plugin@npm:^6.0.0":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/eslint-plugin@npm:6.20.0" resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0"
dependencies: dependencies:
"@eslint-community/regexpp": "npm:^4.5.1" "@eslint-community/regexpp": "npm:^4.5.1"
"@typescript-eslint/scope-manager": "npm:6.20.0" "@typescript-eslint/scope-manager": "npm:6.21.0"
"@typescript-eslint/type-utils": "npm:6.20.0" "@typescript-eslint/type-utils": "npm:6.21.0"
"@typescript-eslint/utils": "npm:6.20.0" "@typescript-eslint/utils": "npm:6.21.0"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:6.21.0"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
graphemer: "npm:^1.4.0" graphemer: "npm:^1.4.0"
ignore: "npm:^5.2.4" ignore: "npm:^5.2.4"
@ -3695,44 +3695,44 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 5020faac39be476de056342f58f2bf68bb788f230e2fa4a2e27ceab8a5187dc450beba7333b0aa741a43aeaff45a117558132953f9390b5eca4c2cc004fde716 checksum: f911a79ee64d642f814a3b6cdb0d324b5f45d9ef955c5033e78903f626b7239b4aa773e464a38c3e667519066169d983538f2bf8e5d00228af587c9d438fb344
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/parser@npm:^6.17.0": "@typescript-eslint/parser@npm:^6.17.0":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/parser@npm:6.20.0" resolution: "@typescript-eslint/parser@npm:6.21.0"
dependencies: dependencies:
"@typescript-eslint/scope-manager": "npm:6.20.0" "@typescript-eslint/scope-manager": "npm:6.21.0"
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:6.21.0"
"@typescript-eslint/typescript-estree": "npm:6.20.0" "@typescript-eslint/typescript-estree": "npm:6.21.0"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:6.21.0"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: d84ad5e2282b1096c80dedb903c83ecc31eaf7be1aafcb14c18d9ec2d4a319f2fd1e5a9038b944d9f42c36c1c57add5e4292d4026ca7d3d5441d41286700d402 checksum: a8f99820679decd0d115c0af61903fb1de3b1b5bec412dc72b67670bf636de77ab07f2a68ee65d6da7976039bbf636907f9d5ca546db3f0b98a31ffbc225bc7d
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/scope-manager@npm:6.20.0": "@typescript-eslint/scope-manager@npm:6.21.0":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/scope-manager@npm:6.20.0" resolution: "@typescript-eslint/scope-manager@npm:6.21.0"
dependencies: dependencies:
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:6.21.0"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:6.21.0"
checksum: f6768ed2dcd2d1771d55ed567ff392a6569ffd683a26500067509dd41769f8838c43686460fe7337144f324fd063df33f5d5646d44e5df4998ceffb3ad1fb790 checksum: eaf868938d811cbbea33e97e44ba7050d2b6892202cea6a9622c486b85ab1cf801979edf78036179a8ba4ac26f1dfdf7fcc83a68c1ff66be0b3a8e9a9989b526
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/type-utils@npm:6.20.0": "@typescript-eslint/type-utils@npm:6.21.0":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/type-utils@npm:6.20.0" resolution: "@typescript-eslint/type-utils@npm:6.21.0"
dependencies: dependencies:
"@typescript-eslint/typescript-estree": "npm:6.20.0" "@typescript-eslint/typescript-estree": "npm:6.21.0"
"@typescript-eslint/utils": "npm:6.20.0" "@typescript-eslint/utils": "npm:6.21.0"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
ts-api-utils: "npm:^1.0.1" ts-api-utils: "npm:^1.0.1"
peerDependencies: peerDependencies:
@ -3740,23 +3740,23 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 8f622fbb14268f1d00b2948f995b570f0ef82be02c12be41d90385290a56ea0dbd34d855d6a5aff100b57f3bdd300ff0c300f16c78f12d6064f7ae6e34fd71bf checksum: 7409c97d1c4a4386b488962739c4f1b5b04dc60cf51f8cd88e6b12541f84d84c6b8b67e491a147a2c95f9ec486539bf4519fb9d418411aef6537b9c156468117
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/types@npm:6.20.0": "@typescript-eslint/types@npm:6.21.0":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/types@npm:6.20.0" resolution: "@typescript-eslint/types@npm:6.21.0"
checksum: 37589003b0e06f83c1945e3748e91af85918cfd997766894642a08e6f355f611cfe11df4e7632dda96e3a9b3441406283fe834ab0906cf81ea97fd43ca2aebe3 checksum: 020631d3223bbcff8a0da3efbdf058220a8f48a3de221563996ad1dcc30d6c08dadc3f7608cc08830d21c0d565efd2db19b557b9528921c78aabb605eef2d74d
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/typescript-estree@npm:6.20.0": "@typescript-eslint/typescript-estree@npm:6.21.0":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/typescript-estree@npm:6.20.0" resolution: "@typescript-eslint/typescript-estree@npm:6.21.0"
dependencies: dependencies:
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:6.21.0"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:6.21.0"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
globby: "npm:^11.1.0" globby: "npm:^11.1.0"
is-glob: "npm:^4.0.3" is-glob: "npm:^4.0.3"
@ -3766,34 +3766,34 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 551f13445a303882d9fc0fbe14ef8507eb8414253fd87a5f13d2e324b5280b626421a238b8ec038e628bc80128dc06c057757f668738e82e64d5b39a9083c27d checksum: af1438c60f080045ebb330155a8c9bb90db345d5069cdd5d01b67de502abb7449d6c75500519df829f913a6b3f490ade3e8215279b6bdc63d0fb0ae61034df5f
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/utils@npm:6.20.0, @typescript-eslint/utils@npm:^6.18.1": "@typescript-eslint/utils@npm:6.21.0, @typescript-eslint/utils@npm:^6.18.1":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/utils@npm:6.20.0" resolution: "@typescript-eslint/utils@npm:6.21.0"
dependencies: dependencies:
"@eslint-community/eslint-utils": "npm:^4.4.0" "@eslint-community/eslint-utils": "npm:^4.4.0"
"@types/json-schema": "npm:^7.0.12" "@types/json-schema": "npm:^7.0.12"
"@types/semver": "npm:^7.5.0" "@types/semver": "npm:^7.5.0"
"@typescript-eslint/scope-manager": "npm:6.20.0" "@typescript-eslint/scope-manager": "npm:6.21.0"
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:6.21.0"
"@typescript-eslint/typescript-estree": "npm:6.20.0" "@typescript-eslint/typescript-estree": "npm:6.21.0"
semver: "npm:^7.5.4" semver: "npm:^7.5.4"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
checksum: 0a8ede3d80a365b52ae96d88e4a9f6e6abf3569c6b60ff9f42ff900cd843ae7c5493cd95f8f2029d90bb0acbf31030980206af98e581d760d6d41e0f80e9fb86 checksum: ab2df3833b2582d4e5467a484d08942b4f2f7208f8e09d67de510008eb8001a9b7460f2f9ba11c12086fd3cdcac0c626761c7995c2c6b5657d5fa6b82030a32d
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/visitor-keys@npm:6.20.0": "@typescript-eslint/visitor-keys@npm:6.21.0":
version: 6.20.0 version: 6.21.0
resolution: "@typescript-eslint/visitor-keys@npm:6.20.0" resolution: "@typescript-eslint/visitor-keys@npm:6.21.0"
dependencies: dependencies:
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:6.21.0"
eslint-visitor-keys: "npm:^3.4.1" eslint-visitor-keys: "npm:^3.4.1"
checksum: 852d938f2e5d57200cf62733b42e73a369f797b097d17e8fd3fffd0f7315c3b9e1863eed60bb8d57d6535a3b7f1980f645f96ec6d513950f182bfa8107b33fab checksum: 7395f69739cfa1cb83c1fb2fad30afa2a814756367302fb4facd5893eff66abc807e8d8f63eba94ed3b0fe0c1c996ac9a1680bcbf0f83717acedc3f2bb724fbf
languageName: node languageName: node
linkType: hard linkType: hard
@ -6811,9 +6811,9 @@ __metadata:
linkType: hard linkType: hard
"dotenv@npm:^16.0.3": "dotenv@npm:^16.0.3":
version: 16.4.1 version: 16.4.3
resolution: "dotenv@npm:16.4.1" resolution: "dotenv@npm:16.4.3"
checksum: ef3d95f48f38146df0881a4b58447ae437d2da3f6d645074b84de4e64ef64ba75fc357c5ed66b3c2b813b5369fdeb6a4777d6ade2d50e54eed6aa06dddc98bc4 checksum: c6a572b2dab5d71accb7064c90b38dfd4068c2487be859a0f053460fcaa685a7718e78db51d643b32e0736b318988c31f8c45cb4ab99cd620278f537177cb0ab
languageName: node languageName: node
linkType: hard linkType: hard
@ -7314,21 +7314,21 @@ __metadata:
linkType: hard linkType: hard
"eslint-plugin-jsdoc@npm:^48.0.0": "eslint-plugin-jsdoc@npm:^48.0.0":
version: 48.0.4 version: 48.0.6
resolution: "eslint-plugin-jsdoc@npm:48.0.4" resolution: "eslint-plugin-jsdoc@npm:48.0.6"
dependencies: dependencies:
"@es-joy/jsdoccomment": "npm:~0.41.0" "@es-joy/jsdoccomment": "npm:~0.42.0"
are-docs-informative: "npm:^0.0.2" are-docs-informative: "npm:^0.0.2"
comment-parser: "npm:1.4.1" comment-parser: "npm:1.4.1"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
escape-string-regexp: "npm:^4.0.0" escape-string-regexp: "npm:^4.0.0"
esquery: "npm:^1.5.0" esquery: "npm:^1.5.0"
is-builtin-module: "npm:^3.2.1" is-builtin-module: "npm:^3.2.1"
semver: "npm:^7.5.4" semver: "npm:^7.6.0"
spdx-expression-parse: "npm:^4.0.0" spdx-expression-parse: "npm:^4.0.0"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
checksum: c73063d26ca70d37ea00eea9750d1f889e5bfda64ca46dbfc6bf4842b892551c320368220cb46acc9d3d96a89fd5391486650284b82dc722f700e3b5df5c78db checksum: 7762793fb2a738d248144346e85b8c7ec2f975be1a24d45984a5d24da03723b76c66ead1b8064d60b18be09a9a9835320036a39fef917a1b6c83b916729d70dd
languageName: node languageName: node
linkType: hard linkType: hard
@ -14622,14 +14622,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": "semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0":
version: 7.5.4 version: 7.6.0
resolution: "semver@npm:7.5.4" resolution: "semver@npm:7.6.0"
dependencies: dependencies:
lru-cache: "npm:^6.0.0" lru-cache: "npm:^6.0.0"
bin: bin:
semver: bin/semver.js semver: bin/semver.js
checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e checksum: fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53
languageName: node languageName: node
linkType: hard linkType: hard