{provider}
{card.get('published_at') && <> · >}
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 323890ba2efe8a..98e84c45d75351 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -35,7 +35,9 @@
"account.follow_back": "Последване взаимно",
"account.followers": "Последователи",
"account.followers.empty": "Още никой не следва потребителя.",
+ "account.followers_counter": "{count, plural, one {{counter} последовател} other {{counter} последователи}}",
"account.following": "Последвано",
+ "account.following_counter": "{count, plural, one {{counter} последван} other {{counter} последвани}}",
"account.follows.empty": "Потребителят още никого не следва.",
"account.go_to_profile": "Към профила",
"account.hide_reblogs": "Скриване на подсилвания от @{name}",
@@ -61,6 +63,7 @@
"account.requested_follow": "{name} поиска да ви последва",
"account.share": "Споделяне на профила на @{name}",
"account.show_reblogs": "Показване на подсилвания от @{name}",
+ "account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
"account.unblock": "Отблокиране на @{name}",
"account.unblock_domain": "Отблокиране на домейн {domain}",
"account.unblock_short": "Отблокиране",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index e96e283970f0ae..12de5d5ecd4794 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -197,7 +197,7 @@
"copy_icon_button.copied": "Zkopírováno do schránky",
"copypaste.copied": "Zkopírováno",
"copypaste.copy_to_clipboard": "Zkopírovat do schránky",
- "directory.federated": "Ze známého fedivesmíru",
+ "directory.federated": "Ze známého fediversu",
"directory.local": "Pouze z {domain}",
"directory.new_arrivals": "Nově příchozí",
"directory.recently_active": "Nedávno aktivní",
@@ -213,7 +213,7 @@
"domain_block_modal.block_account_instead": "Raději blokovat @{name}",
"domain_block_modal.they_can_interact_with_old_posts": "Lidé z tohoto serveru mohou interagovat s vašimi starými příspěvky.",
"domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.",
- "domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován.",
+ "domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován*a.",
"domain_block_modal.title": "Blokovat doménu?",
"domain_block_modal.you_will_lose_followers": "Všichni vaši sledující z tohoto serveru budou odstraněni.",
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
@@ -341,7 +341,7 @@
"hashtag.column_settings.tag_mode.any": "Jakýkoliv z těchto",
"hashtag.column_settings.tag_mode.none": "Žádný z těchto",
"hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci další štítky",
- "hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník} few {{counter} účastníci} other {{counter} účastníků}}",
+ "hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník*ice} few {{counter} účastníci} other {{counter} účastníků}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
"hashtag.counter_by_uses_today": "Dnes {count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
"hashtag.follow": "Sledovat hashtag",
@@ -440,7 +440,7 @@
"mute_modal.show_options": "Zobrazit možnosti",
"mute_modal.they_can_mention_and_follow": "Mohou vás zmínit a sledovat, ale neuvidíte je.",
"mute_modal.they_wont_know": "Nebudou vědět, že byli skryti.",
- "mute_modal.title": "Ztlumit uživatele?",
+ "mute_modal.title": "Ztlumit uživatele*ku?",
"mute_modal.you_wont_see_mentions": "Neuvidíte příspěvky, které je zmiňují.",
"mute_modal.you_wont_see_posts": "Stále budou moci vidět vaše příspěvky, ale vy jejich neuvidíte.",
"navigation_bar.about": "O aplikaci",
@@ -566,8 +566,8 @@
"onboarding.share.message": "Jsem {username} na #Mastodonu! Pojď mě sledovat na {url}",
"onboarding.share.next_steps": "Možné další kroky:",
"onboarding.share.title": "Sdílejte svůj profil",
- "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:",
- "onboarding.start.skip": "Want to skip right ahead?",
+ "onboarding.start.lead": "Nyní jste součástí Mastodonu, unikátní sociální sítě, kde vy - ne algoritmus - vytváří vaše vlastní prožitky. Začněte na této nové sociální platformě:",
+ "onboarding.start.skip": "Nepotřebujete pomoci začít?",
"onboarding.start.title": "Dokázali jste to!",
"onboarding.steps.follow_people.body": "Mastodon je o sledování zajimavých lidí.",
"onboarding.steps.follow_people.title": "Přispůsobit vlastní domovský kanál",
@@ -581,7 +581,7 @@
"onboarding.tips.accounts_from_other_servers": "Víte, že? Protože je Mastodon decentralizovaný, některé profily, na které narazíte, budou hostovány na jiných serverech, než je ten váš. A přesto s nimi můžete bezproblémově komunikovat! Jejich server se nachází v druhé polovině uživatelského jména!",
"onboarding.tips.migration": "Víte, že? Pokud máte pocit, že {domain} pro vás v budoucnu není vhodnou volbou, můžete se přesunout na jiný Mastodon server, aniž byste přišli o své sledující. Můžete dokonce hostovat svůj vlastní server!",
"onboarding.tips.verification": "Víte, že? Svůj účet můžete ověřit tak, že na své webové stránky umístíte odkaz na váš Mastodon profil a odkaz na stránku přidáte do svého profilu. Nejsou k tomu potřeba žádné poplatky ani dokumenty!",
- "password_confirmation.exceeds_maxlength": "Potvrzení hesla překračuje maximální délku hesla",
+ "password_confirmation.exceeds_maxlength": "Potvrzení hesla překračuje maximální povolenou délku hesla",
"password_confirmation.mismatching": "Zadaná hesla se neshodují",
"picture_in_picture.restore": "Vrátit zpět",
"poll.closed": "Uzavřeno",
@@ -665,7 +665,7 @@
"report.unfollow": "Přestat sledovat @{name}",
"report.unfollow_explanation": "Tento účet sledujete. Abyste už neviděli jeho příspěvky ve své domovské časové ose, přestaňte jej sledovat.",
"report_notification.attached_statuses": "{count, plural, one {{count} připojený příspěvek} few {{count} připojené příspěvky} many {{count} připojených příspěvků} other {{count} připojených příspěvků}}",
- "report_notification.categories.legal": "Zákonné",
+ "report_notification.categories.legal": "Právní ustanovení",
"report_notification.categories.other": "Ostatní",
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Porušení pravidla",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 575c68de038955..f3ba028eabde00 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -411,6 +411,7 @@
"limited_account_hint.action": "構わず表示する",
"limited_account_hint.title": "このプロフィールは{domain}のモデレーターによって非表示にされています。",
"link_preview.author": "{name}",
+ "link_preview.more_from_author": "{name}さんの投稿をもっと読む",
"lists.account.add": "リストに追加",
"lists.account.remove": "リストから外す",
"lists.delete": "リストを削除",
@@ -691,8 +692,11 @@
"server_banner.about_active_users": "過去30日間にこのサーバーを使用している人 (月間アクティブユーザー)",
"server_banner.active_users": "人のアクティブユーザー",
"server_banner.administered_by": "管理者",
+ "server_banner.is_one_of_many": "{domain} は、数々の独立したMastodonサーバーのうちのひとつです。サーバーに登録してFediverseのコミュニティに加わってみませんか。",
"server_banner.server_stats": "サーバーの情報",
"sign_in_banner.create_account": "アカウント作成",
+ "sign_in_banner.follow_anyone": "連合内の誰でもフォローして投稿を時系列で見ることができます。アルゴリズム、広告、クリックベイトはありません。",
+ "sign_in_banner.mastodon_is": "Mastodonに参加して、世界で起きていることを見つけよう。",
"sign_in_banner.sign_in": "ログイン",
"sign_in_banner.sso_redirect": "ログインまたは登録",
"status.admin_account": "@{name}さんのモデレーション画面を開く",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index de866cc1bc4c33..fcaa8f143ed445 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -1,6 +1,10 @@
{
+ "about.blocks": "Ulac agbur",
"about.contact": "Anermis:",
"about.disclaimer": "Mastodon d aseɣẓan ilelli, d aseɣẓan n uɣbalu yeldin, d tnezzut n Mastodon gGmbH.",
+ "about.domain_blocks.preamble": "Maṣṭudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an ɣur-k tsuraf i yellan deg uqeddac-agi.",
+ "about.domain_blocks.silenced.title": "Ɣur-s talast",
+ "about.domain_blocks.suspended.title": "Yeḥbes",
"about.not_available": "Talɣut-a ur tettwabder ara deg uqeddac-a.",
"about.powered_by": "Azeṭṭa inmetti yettwasɣelsen sɣur {mastodon}",
"about.rules": "Ilugan n uqeddac",
@@ -166,6 +170,7 @@
"dismissable_banner.explore_tags": "D wiyi i d ihacṭagen i d-yettawin tamyigawt deg web anmetti ass-a. Ihacṭagen i sseqdacen ugar n medden, εlayit d imezwura.",
"domain_block_modal.block": "Sewḥel aqeddac",
"domain_block_modal.they_cant_follow": "Yiwen ur yezmir ad k·m-id-yeḍfer seg uqeddac-a.",
+ "domain_block_modal.title": "Sewḥel taɣult?",
"domain_pill.activitypub_like_language": "ActivityPub am tutlayt yettmeslay Mastodon d izeḍwan inmettiyen nniḍen.",
"domain_pill.server": "Aqeddac",
"domain_pill.username": "Isem n useqdac",
@@ -214,6 +219,7 @@
"filter_modal.added.review_and_configure_title": "Iɣewwaṛen n imzizdig",
"filter_modal.added.settings_link": "asebter n yiɣewwaṛen",
"filter_modal.added.short_explanation": "Tasuffeɣt-a tettwarna ɣer taggayt-a n yimsizdegen: {title}.",
+ "filter_modal.added.title": "Yettwarna umsizdeg!",
"filter_modal.select_filter.expired": "yemmut",
"filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}",
"filter_modal.select_filter.search": "Nadi neɣ snulfu-d",
@@ -224,9 +230,9 @@
"firehose.remote": "Iqeddacen nniḍen",
"follow_request.authorize": "Ssireg",
"follow_request.reject": "Agi",
- "follow_suggestions.dismiss": "Ur ttɛawad ara ad t-id-sekneṭ",
+ "follow_suggestions.dismiss": "Dayen ur t-id-skan ara",
"follow_suggestions.view_all": "Wali-ten akk",
- "follow_suggestions.who_to_follow": "Menhu ara ḍefṛeḍ",
+ "follow_suggestions.who_to_follow": "Ad tḍefreḍ?",
"followed_tags": "Ihacṭagen yettwaḍfaren",
"footer.about": "Ɣef",
"footer.directory": "Akaram n imeɣna",
@@ -235,6 +241,7 @@
"footer.keyboard_shortcuts": "Inegzumen n unasiw",
"footer.privacy_policy": "Tasertit tabaḍnit",
"footer.source_code": "Wali tangalt taɣbalut",
+ "footer.status": "N tsuffeɣt",
"generic.saved": "Yettwasekles",
"getting_started.heading": "Bdu",
"hashtag.column_header.tag_mode.all": "d {additional}",
@@ -313,11 +320,14 @@
"lightbox.previous": "Ɣer deffir",
"limited_account_hint.action": "Wali amaɣnu akken yebɣu yili",
"link_preview.author": "S-ɣur {name}",
+ "link_preview.more_from_author": "Ugar sɣur {name}",
+ "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} posts}}",
"lists.account.add": "Rnu ɣer tebdart",
"lists.account.remove": "Kkes seg tebdart",
"lists.delete": "Kkes tabdart",
"lists.edit": "Ẓreg tabdart",
"lists.edit.submit": "Beddel azwel",
+ "lists.exclusive": "Ffer tisuffaɣ-a seg ugejdan",
"lists.new.create": "Rnu tabdart",
"lists.new.title_placeholder": "Azwel amaynut n tebdart",
"lists.replies_policy.followed": "Kra n useqdac i yettwaḍefren",
@@ -338,6 +348,7 @@
"navigation_bar.bookmarks": "Ticraḍ",
"navigation_bar.community_timeline": "Tasuddemt tadigant",
"navigation_bar.compose": "Aru tajewwiqt tamaynut",
+ "navigation_bar.direct": "Tibdarin tusligin",
"navigation_bar.discover": "Ẓer",
"navigation_bar.domain_blocks": "Tiɣula yeffren",
"navigation_bar.explore": "Snirem",
@@ -357,9 +368,14 @@
"navigation_bar.search": "Nadi",
"navigation_bar.security": "Taɣellist",
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
+ "notification.admin.report": "Yemla-t-id {name} {target}",
+ "notification.admin.sign_up": "Ijerred {name}",
+ "notification.favourite": "{name} yesmenyaf addad-ik·im",
"notification.follow": "iṭṭafar-ik·em-id {name}",
"notification.follow_request": "{name} yessuter-d ad k·m-yeḍfeṛ",
"notification.mention": "{name} yebder-ik-id",
+ "notification.moderation-warning.learn_more": "Issin ugar",
+ "notification.moderation_warning.action_suspend": "Yettwaseḥbes umiḍan-ik.",
"notification.own_poll": "Tafrant-ik·im tfuk",
"notification.poll": "Tfukk tefrant ideg tettekkaḍ",
"notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
@@ -370,6 +386,7 @@
"notification_requests.notifications_from": "Ilɣa sɣur {name}",
"notifications.clear": "Sfeḍ tilɣa",
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
+ "notifications.column_settings.admin.report": "Ineqqisen imaynuten:",
"notifications.column_settings.alert": "Tilɣa n tnarit",
"notifications.column_settings.favourite": "Imenyafen:",
"notifications.column_settings.filter_bar.advanced": "Sken-d akk taggayin",
@@ -384,6 +401,7 @@
"notifications.column_settings.sound": "Rmed imesli",
"notifications.column_settings.status": "Tisuffaɣ timaynutin :",
"notifications.column_settings.unread_notifications.category": "Ilɣa ur nettwaɣra",
+ "notifications.column_settings.update": "Iẓreg:",
"notifications.filter.all": "Akk",
"notifications.filter.boosts": "Seǧhed",
"notifications.filter.favourites": "Imenyafen",
@@ -413,6 +431,7 @@
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
"onboarding.follows.title": "Ttwassnen deg Mastodon",
"onboarding.profile.display_name": "Isem ara d-yettwaskanen",
+ "onboarding.profile.display_name_hint": "Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer…",
"onboarding.profile.note": "Tameddurt",
"onboarding.profile.note_hint": "Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen …",
"onboarding.profile.save_and_continue": "Sekles, tkemmleḍ",
@@ -441,6 +460,7 @@
"poll.total_votes": "{count, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}",
"poll.vote": "Dɣeṛ",
"poll.voted": "Tdeɣṛeḍ ɣef tririt-ayi",
+ "poll.votes": "{votes, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}",
"poll_button.add_poll": "Rnu asenqed",
"poll_button.remove_poll": "Kkes asenqed",
"privacy.change": "Seggem tabaḍnit n yizen",
@@ -465,9 +485,12 @@
"relative_time.seconds": "{number}tas",
"relative_time.today": "assa",
"reply_indicator.cancel": "Sefsex",
+ "reply_indicator.poll": "Afmiḍi",
"report.block": "Sewḥel",
+ "report.categories.legal": "Azerfan",
"report.categories.other": "Tiyyaḍ",
"report.categories.spam": "Aspam",
+ "report.category.subtitle": "Fren amṣada akk ufrin",
"report.category.title_account": "ameɣnu",
"report.category.title_status": "tasuffeɣt",
"report.close": "Immed",
@@ -476,13 +499,25 @@
"report.next": "Uḍfiṛ",
"report.placeholder": "Iwenniten-nniḍen",
"report.reasons.dislike": "Ur t-ḥemmleɣ ara",
+ "report.reasons.dislike_description": "D ayen akk ur bɣiɣ ara ad waliɣ",
"report.reasons.other": "D ayen nniḍen",
+ "report.reasons.other_description": "Ugur ur yemṣada ara akk d taggayin-nniḍen",
"report.reasons.spam": "D aspam",
+ "report.reasons.spam_description": "Yir iseɣwan, yir agman d tririyin i d-yettuɣalen",
+ "report.reasons.violation": "Truẓi n yilugan n uqeddac",
+ "report.reasons.violation_description": "Teẓriḍ y·tettruẓu kra n yilugan",
+ "report.rules.subtitle": "Fren ayen akk yemṣadan",
+ "report.rules.title": "Acu n yilugan i yettwarẓan?",
+ "report.statuses.subtitle": "Fren ayen akk yemṣadan",
+ "report.statuses.title": "Llant tsuffaɣ ara isdemren aneqqis-a?",
"report.submit": "Azen",
"report.target": "Mmel {target}",
+ "report.thanks.take_action_actionable": "Ideg nekkni nessenqad tuttra-inek•inem, tzemreḍ ad tḥadreḍ mgal @{name}:",
"report.thanks.title": "Ur tebɣiḍ ara ad twaliḍ aya?",
+ "report.thanks.title_actionable": "Tanemmirt ɣef uneqqis, ad nwali deg waya.",
"report.unfollow": "Seḥbes aḍfar n @{name}",
"report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached",
+ "report_notification.categories.legal": "Azerfan",
"report_notification.categories.other": "Ayen nniḍen",
"report_notification.categories.spam": "Aspam",
"report_notification.open": "Ldi aneqqis",
@@ -497,6 +532,7 @@
"search_popout.full_text_search_disabled_message": "Ur yelli ara deg {domain}.",
"search_popout.language_code": "Tangalt ISO n tutlayt",
"search_popout.options": "Iwellihen n unadi",
+ "search_popout.quick_actions": "Tigawin tiruradin",
"search_popout.recent": "Inadiyen ineggura",
"search_popout.user": "amseqdac",
"search_results.accounts": "Imeɣna",
@@ -505,7 +541,9 @@
"search_results.see_all": "Wali-ten akk",
"search_results.statuses": "Tisuffaɣ",
"search_results.title": "Anadi ɣef {q}",
+ "server_banner.active_users": "iseqdacen urmiden",
"server_banner.administered_by": "Yettwadbel sɣur :",
+ "server_banner.server_stats": "Tidaddanin n uqeddac:",
"sign_in_banner.create_account": "Snulfu-d amiḍan",
"sign_in_banner.sign_in": "Qqen",
"sign_in_banner.sso_redirect": "Qqen neɣ jerred",
@@ -516,13 +554,20 @@
"status.cannot_reblog": "Tasuffeɣt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen",
"status.copy": "Nɣel assaɣ ɣer tasuffeɣt",
"status.delete": "Kkes",
+ "status.direct": "Bder-d @{name} weḥd-s",
+ "status.direct_indicator": "Abdar uslig",
"status.edit": "Ẓreg",
"status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}",
"status.embed": "Seddu",
+ "status.favourite": "Amenyaf",
"status.filter": "Sizdeg tassufeɣt-a",
"status.filtered": "Yettwasizdeg",
"status.hide": "Ffer tasuffeɣt",
+ "status.history.created": "Yerna-t {name} {date}",
+ "status.history.edited": "Ibeddel-it {name} {date}",
"status.load_more": "Sali ugar",
+ "status.media.open": "Sit i ulday",
+ "status.media.show": "Sit i uskan",
"status.media_hidden": "Amidya yettwaffer",
"status.mention": "Bder-d @{name}",
"status.more": "Ugar",
@@ -548,6 +593,7 @@
"status.show_less_all": "Semẓi akk tisuffɣin",
"status.show_more": "Ssken-d ugar",
"status.show_more_all": "Ẓerr ugar lebda",
+ "status.show_original": "Sken aɣbalu",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"status.translate": "Suqel",
"status.translated_from_with": "Yettwasuqel seg {lang} s {provider}",
@@ -582,6 +628,7 @@
"upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neɣ deg yiẓri",
"upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…",
"upload_modal.apply": "Snes",
+ "upload_modal.applying": "Asnas…",
"upload_modal.choose_image": "Fren tugna",
"upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis",
"upload_modal.detect_text": "Sefru-d aḍris seg tugna",
@@ -589,6 +636,7 @@
"upload_modal.preparing_ocr": "Aheyyi n OCR…",
"upload_modal.preview_label": "Taskant ({ratio})",
"upload_progress.label": "Asali iteddu...",
+ "upload_progress.processing": "Asesfer…",
"username.taken": "Yettwaṭṭef yisem-a n useqdac. Ɛreḍ wayeḍ",
"video.close": "Mdel tabidyutt",
"video.download": "Sidered afaylu",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 041072c6adecef..701569fa05ce1c 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -35,6 +35,7 @@
"account.follow_back": "Sekot atpakaļ",
"account.followers": "Sekotāji",
"account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
+ "account.followers_counter": "{count, plural, zero {{count} sekotāju} one {{count} sekotājs} other {{count} sekotāji}}",
"account.following": "Seko",
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
"account.go_to_profile": "Doties uz profilu",
@@ -312,9 +313,9 @@
"home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
"home.column_settings.show_replies": "Rādīt atbildes",
"home.hide_announcements": "Slēpt paziņojumus",
- "home.pending_critical_update.body": "Lūdzu, pēc iespējas ātrāk atjaunini savu Mastodon serveri!",
+ "home.pending_critical_update.body": "Lūgums pēc iespējas drīzāk atjaunināt savu Mastodon serveri.",
"home.pending_critical_update.link": "Skatīt jauninājumus",
- "home.pending_critical_update.title": "Pieejams kritisks drošības jauninājums!",
+ "home.pending_critical_update.title": "Ir pieejams būtisks drošības atjauninājums.",
"home.show_announcements": "Rādīt paziņojumus",
"interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.",
"interaction_modal.description.follow": "Ar Mastodon kontu Tu vari sekot {name}, lai saņemtu lietotāja ierakstus savā mājas plūsmā.",
diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json
index 67aad910054010..4f2e2410eff4a2 100644
--- a/app/javascript/mastodon/locales/ry.json
+++ b/app/javascript/mastodon/locales/ry.json
@@ -3,6 +3,8 @@
"about.contact": "Контакт:",
"about.disclaimer": "Mastodon є задарьнов проґрамов из удпертым кодом тай торговов значков Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Причины не ясні",
+ "about.domain_blocks.preamble": "Майбульш Mastodon поволят вам позирати контент тай комуніковати из хосновачами из другых федерованых серверув. Туй лиш уняткы учинені про сись конкретный сервер.",
+ "about.domain_blocks.silenced.explanation": "Вы майбульш не будете видіти профілі тай контент из сього сервера, кидь не будете го самі глядати авадь пудпишете ся на нього.",
"about.domain_blocks.silenced.title": "Обмежено",
"about.domain_blocks.suspended.explanation": "Ниякі податкы из сього сервера не будут уброблені, усокочені ци поміняні, што чинит невозможнов хоть-яку інтеракцію ци зязок из хосновачами из сього сервера.",
"about.domain_blocks.suspended.title": "Заблоковано",
@@ -20,6 +22,7 @@
"account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю",
"account.cancel_follow_request": "Удмінити пудписку",
"account.copy": "Зкопіровати удкликованя на профіл",
+ "account.direct": "Пошептати @{name}",
"account.disable_notifications": "Бульше не сповіщати ми коли {name} пише",
"account.domain_blocked": "Домен заблокованый",
"account.edit_profile": "Управити профіл",
@@ -39,8 +42,10 @@
"account.joined_short": "Датум прикапчованя",
"account.languages": "Поміняти убрані языкы",
"account.link_verified_on": "Властность сього удкликованя было звірено {date}",
+ "account.locked_info": "Сись профіл є замкнутый. Ґазда акаунта буде ручно провіряти тко го може зафоловити.",
"account.media": "Медіа",
- "account.moved_to": "Хосновач {name} указав, ож новый профіл йим є:",
+ "account.mention": "Спомянути @{name}",
+ "account.moved_to": "Хосновач {name} указав, ож новый профіл му є:",
"account.mute": "Стишити {name}",
"account.mute_notifications_short": "Стишити голошіня",
"account.mute_short": "Стишити",
@@ -60,9 +65,12 @@
"account.unblock_short": "Розблоковати",
"account.unendorse": "Не указовати на профілови",
"account.unfollow": "Удписати ся",
+ "account.unmute": "Указовати {name}",
"account.unmute_notifications_short": "Указовати голошіня",
"account.unmute_short": "Указовати",
"account_note.placeholder": "Клопкніт обы додати примітку",
+ "admin.dashboard.retention.average": "Середньоє",
+ "admin.dashboard.retention.cohort": "Місяць прикапчованя",
"admin.dashboard.retention.cohort_size": "Нові хосновачі",
"admin.impact_report.instance_accounts": "Профілі из акаунтув, котрі ся удалят",
"admin.impact_report.instance_followers": "Пудписникы, котрых стратят наші хосновачі",
@@ -70,11 +78,77 @@
"admin.impact_report.title": "Вплыв цілком",
"alert.rate_limited.message": "Попробуйте зась по {retry_time, time, medium}.",
"alert.rate_limited.title": "Частота обмежена",
+ "alert.unexpected.message": "Стала ся нечекана хыба.",
+ "alert.unexpected.title": "Ийой!",
+ "announcement.announcement": "Голошіня",
+ "audio.hide": "Зпрятати звук",
+ "block_modal.remote_users_caveat": "Попросиме ґазду сервера {domain} честовати вашоє рішеня. Айбо не ґарантуєме повный соглас, бо даякі серверы можут брати блокованя по-инчакому. Публичні дописы годно быти видко незалоґованым хосновачам.",
+ "block_modal.show_less": "Указати менше",
+ "block_modal.show_more": "Указати бульше",
+ "block_modal.they_cant_mention": "Они не можут вас споминати авадь слідовати.",
+ "block_modal.they_cant_see_posts": "Они не можут видіти ваші публикації, тай наспак — вы йихні.",
+ "block_modal.they_will_know": "Они видят, ож сут заблоковані.",
+ "block_modal.title": "Заблоковати хосновача?",
+ "block_modal.you_wont_see_mentions": "Не будете видіти публикації тай споминкы сього хосновача.",
+ "boost_modal.combo": "Можете клынцнути {combo} другый раз обы сесе пропустити",
+ "bundle_column_error.copy_stacktrace": "Укопіровати звіт за хыбу",
+ "bundle_column_error.error.body": "Не годни сьме указати зажадану сторунку. Годно быти спозад хыбы у нашум сістемі, авадь проблемы зумісности бравзера.",
+ "bundle_column_error.error.title": "Ийой!",
+ "bundle_column_error.network.body": "Стала ся хыба як сьме пробовали напаровати сторунку. Годно ся йсе было стати спозад слабого споєня вашого інтернета, авадь сервера.",
+ "bundle_column_error.network.title": "Хыба споєня",
+ "bundle_column_error.retry": "Попробуйте зась",
"bundle_column_error.return": "Вернути ся на головну",
"bundle_column_error.routing.body": "Не можеме найти сяку сторунку. Бизувні сьте, ож URL у адресному шорикови є добрый?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "Заперти",
"bundle_modal_error.message": "Штось ся показило, закидь сьме ладовали сись компонент.",
"bundle_modal_error.retry": "Попробовати зась",
- "closed_registrations.other_server_instructions": "Mastodon є децентралізованов платформов, можете си учинити профіл и на другому серверови тай комуніковати из сим."
+ "closed_registrations.other_server_instructions": "Mastodon є децентралізованов платформов, можете си учинити профіл и на другому серверови тай комуніковати из сим.",
+ "closed_registrations_modal.description": "Раз не мож учинити профіл на {domain}, айбо не мусите мати профіл ипен на серверови {domain} обы хосновати Mastodon.",
+ "closed_registrations_modal.find_another_server": "Найти другый сервер",
+ "column.about": "За сайт",
+ "column.blocks": "Заблоковані хосновачі",
+ "column.bookmarks": "Усокоченоє",
+ "column.direct": "Шептаня",
+ "column.directory": "Никати профілі",
+ "column.domain_blocks": "Заблоковані домены",
+ "column.favourites": "Убраноє",
+ "column.follow_requests": "Запросы на пудписку",
+ "column.lists": "Исписы",
+ "column.mutes": "Стишені хосновачі",
+ "column.notifications": "Убвіщеня",
+ "column.pins": "Закріплені публикації",
+ "column_back_button.label": "Назад",
+ "column_header.hide_settings": "Спрятати штімованя",
+ "column_header.moveLeft_settings": "Посунути колонку до ліва",
+ "column_header.moveRight_settings": "Посунути колонку до права",
+ "column_header.pin": "Закріпити",
+ "column_header.show_settings": "Указати штімованя",
+ "column_header.unpin": "Удкріпити",
+ "column_subheading.settings": "Штімованя",
+ "compose.language.change": "Поміняти язык",
+ "compose.language.search": "Глядати языкы...",
+ "compose.published.body": "Пост опубликованый.",
+ "compose.saved.body": "Пост усокоченый.",
+ "compose_form.direct_message_warning_learn_more": "Читайте бульше",
+ "compose_form.encryption_warning": "Публикації на Mastodon не шіфрувут ся. Не шырьте чутливу інформацію через Mastodon.",
+ "compose_form.hashtag_warning": "Сись пост не буде ся появляти у исписови по гештеґови, бо вун не є публичный. Лишек публичні посты буде видко за гештеґом.",
+ "compose_form.lock_disclaimer": "Ваш профіл є {locked}. Хоть-тко може ся на вас пудписати, обы видїти ваші ексклузівні посты.",
+ "compose_form.lock_disclaimer.lock": "замкнено",
+ "compose_form.placeholder": "Што нового?",
+ "compose_form.poll.duration": "Трывалость убзвідованя",
+ "compose_form.poll.multiple": "Дакулько варіантув",
+ "compose_form.poll.option_placeholder": "Варіант {number}",
+ "compose_form.poll.single": "Уберіт єден",
+ "compose_form.poll.switch_to_multiple": "Змінити убзвідованя обы поволити дакулько варіантув",
+ "compose_form.poll.switch_to_single": "Змінити убзвідованя обы поволити лишек єден варіант",
+ "compose_form.poll.type": "Стіл",
+ "compose_form.publish": "Публикація",
+ "compose_form.publish_form": "Нова публикація",
+ "compose_form.reply": "Удповідь",
+ "copypaste.copy_to_clipboard": "Копіровати у памнять",
+ "directory.recently_active": "Недавно актівні",
+ "disabled_account_banner.account_settings": "Штімованя акаунта",
+ "disabled_account_banner.text": "Ваш акаунт {disabledAccount} раз є неактівный.",
+ "dismissable_banner.community_timeline": "Туй сут недавні публикації уд профілув на серверови {domain}."
}
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 150b808f894651..67ebb031aefcd0 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -32,7 +32,7 @@
"account.featured_tags.last_status_never": "Немає дописів",
"account.featured_tags.title": "{name} виділяє хештеґи",
"account.follow": "Підписатися",
- "account.follow_back": "Підписатися взаємно",
+ "account.follow_back": "Стежити також",
"account.followers": "Підписники",
"account.followers.empty": "Ніхто ще не підписаний на цього користувача.",
"account.followers_counter": "{count, plural, one {{counter} підписник} few {{counter} підписники} many {{counter} підписників} other {{counter} підписники}}",
@@ -217,18 +217,18 @@
"domain_block_modal.title": "Заблокувати домен?",
"domain_block_modal.you_will_lose_followers": "Усіх ваших підписників з цього сервера буде вилучено.",
"domain_block_modal.you_wont_see_posts": "Ви не бачитимете дописів і сповіщень від користувачів на цьому сервері.",
- "domain_pill.activitypub_lets_connect": "Це дозволяє вам спілкуватися та взаємодіяти з людьми не лише на Mastodon, але й у різних соціальних додатках.",
- "domain_pill.activitypub_like_language": "ActivityPub - це як мова, якою Мастодонт розмовляє з іншими соціальними мережами.",
+ "domain_pill.activitypub_lets_connect": "Це дозволяє вам спілкуватися та взаємодіяти з людьми не лише на Mastodon, але й у різних соціальних застосунках.",
+ "domain_pill.activitypub_like_language": "ActivityPub - це як мова, якою Mastodon розмовляє з іншими соціальними мережами.",
"domain_pill.server": "Сервер",
"domain_pill.their_handle": "Їхня адреса:",
- "domain_pill.their_server": "Їхній цифровий дім, де живуть усі їхні пости.",
+ "domain_pill.their_server": "Їхній цифровий дім, де живуть усі їхні дописи.",
"domain_pill.their_username": "Їхній унікальний ідентифікатор на їхньому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
"domain_pill.username": "Ім'я користувача",
"domain_pill.whats_in_a_handle": "Що є в адресі?",
"domain_pill.who_they_are": "Оскільки дескриптори вказують, хто це і де він знаходиться, ви можете взаємодіяти з людьми через соціальну мережу платформ на основі .",
"domain_pill.who_you_are": "Оскільки ваш нікнейм вказує, хто ви та де ви, люди можуть взаємодіяти з вами через соціальну мережу платформ на основі .",
"domain_pill.your_handle": "Ваша адреса:",
- "domain_pill.your_server": "Ваш цифровий дім, де живуть усі ваші публікації. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.",
+ "domain_pill.your_server": "Ваш цифровий дім, де живуть усі ваші дописи. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.",
"domain_pill.your_username": "Ваш унікальний ідентифікатор на цьому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
"embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.",
"embed.preview": "Ось який вигляд це матиме:",
@@ -489,9 +489,9 @@
"notification.reblog": "{name} поширює ваш допис",
"notification.relationships_severance_event": "Втрачено з'єднання з {name}",
"notification.relationships_severance_event.account_suspension": "Адміністратор з {from} призупинив {target}, що означає, що ви більше не можете отримувати оновлення від них або взаємодіяти з ними.",
- "notification.relationships_severance_event.domain_block": "Адміністратор з {from} заблокував {target}, включаючи {followersCount} ваших підписників і {{followingCount, plural, one {# account} other {# accounts}}, на які ви підписані.",
- "notification.relationships_severance_event.learn_more": "Дізнатися більше",
- "notification.relationships_severance_event.user_domain_block": "Ви заблокували {target}, видаливши {followersCount} ваших підписників і {followingCount, plural, one {# account} other {# accounts}}, за якими ви стежите.",
+ "notification.relationships_severance_event.domain_block": "Адміністратор з {from} заблокував {target}, включаючи {followersCount} ваших підписників і {followingCount , plural, one {# обліковий запис} few {# облікові записи} many {# облікових записів} other {# обліковий запис}}, на які ви підписані.",
+ "notification.relationships_severance_event.learn_more": "Докладніше",
+ "notification.relationships_severance_event.user_domain_block": "Ви заблокували {target}, видаливши {followersCount} ваших підписників і {followingCount, plural, one {# обліковий запис} few {# облікові записи} many {# облікових записів} other {# обліковий запис}}, за якими ви стежите.",
"notification.status": "{name} щойно дописує",
"notification.update": "{name} змінює допис",
"notification_requests.accept": "Прийняти",
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 12eac79b984dfa..da86a4caa71aac 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -1366,6 +1366,8 @@ body > [data-popper-placement] {
min-height: 54px;
border-bottom: 1px solid var(--background-border-color);
cursor: auto;
+ opacity: 1;
+ animation: fade 150ms linear;
@keyframes fade {
0% {
@@ -1377,9 +1379,6 @@ body > [data-popper-placement] {
}
}
- opacity: 1;
- animation: fade 150ms linear;
-
.media-gallery,
.video-player,
.audio-player,
@@ -4851,8 +4850,10 @@ a.status-card {
&__menu {
@include search-popout;
- padding: 0;
- background: $ui-secondary-color;
+ & {
+ padding: 0;
+ background: $ui-secondary-color;
+ }
}
&__menu-list {
@@ -10453,7 +10454,7 @@ noscript {
gap: 4px;
dt {
- flex: 0 0 auto;
+ flex: 0 1 auto;
color: $dark-text-color;
min-width: 0;
overflow: hidden;
diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb
index dbfdd33fccaf3a..72992d2f42ad80 100644
--- a/app/lib/link_details_extractor.rb
+++ b/app/lib/link_details_extractor.rb
@@ -62,7 +62,8 @@ def date_modified
end
def author_name
- author['name']
+ name = author['name']
+ name.is_a?(Array) ? name.join(', ') : name
end
def author_url
@@ -156,11 +157,11 @@ def height
end
def title
- html_entities.decode(structured_data&.headline || opengraph_tag('og:title') || document.xpath('//title').map(&:content).first).strip
+ html_entities_decode(structured_data&.headline || opengraph_tag('og:title') || document.xpath('//title').map(&:content).first)&.strip
end
def description
- html_entities.decode(structured_data&.description || opengraph_tag('og:description') || meta_tag('description'))
+ html_entities_decode(structured_data&.description || opengraph_tag('og:description') || meta_tag('description'))
end
def published_at
@@ -180,7 +181,7 @@ def canonical_url
end
def provider_name
- html_entities.decode(structured_data&.publisher_name || opengraph_tag('og:site_name'))
+ html_entities_decode(structured_data&.publisher_name || opengraph_tag('og:site_name'))
end
def provider_url
@@ -188,7 +189,7 @@ def provider_url
end
def author_name
- html_entities.decode(structured_data&.author_name || opengraph_tag('og:author') || opengraph_tag('og:author:username'))
+ html_entities_decode(structured_data&.author_name || opengraph_tag('og:author') || opengraph_tag('og:author:username'))
end
def author_url
@@ -257,7 +258,7 @@ def structured_data
next if json_ld.blank?
- structured_data = StructuredData.new(html_entities.decode(json_ld))
+ structured_data = StructuredData.new(html_entities_decode(json_ld))
next unless structured_data.valid?
@@ -273,10 +274,11 @@ def document
end
def detect_encoding_and_parse_document
- [detect_encoding, nil, @html_charset, 'UTF-8'].uniq.each do |encoding|
+ [detect_encoding, nil, @html_charset].uniq.each do |encoding|
document = Nokogiri::HTML(@html, nil, encoding)
return document if document.to_s.valid_encoding?
end
+ Nokogiri::HTML(@html, nil, 'UTF-8')
end
def detect_encoding
@@ -290,6 +292,15 @@ def detector
end
end
+ def html_entities_decode(string)
+ return if string.nil?
+
+ unicode_string = string.to_s.encode('UTF-8')
+ raise EncodingError, 'cannot convert string to valid UTF-8' unless unicode_string.valid_encoding?
+
+ html_entities.decode(unicode_string)
+ end
+
def html_entities
@html_entities ||= HTMLEntities.new(:expanded)
end
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index eac02ac14ff05c..5a11351e58808a 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -46,6 +46,11 @@ class PreviewCard < ApplicationRecord
y_comp: 4,
}.freeze
+ # URL size limit to safely store in PosgreSQL's unique indexes
+ # Technically this is a byte-size limit but we use it as a
+ # character limit to work with length validation
+ URL_CHARACTER_LIMIT = 2692
+
self.inheritance_column = false
enum :type, { link: 0, photo: 1, video: 2, rich: 3 }
@@ -63,7 +68,7 @@ class PreviewCard < ApplicationRecord
convert_options: { all: '-quality 90 +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' },
validate_media_type: false
- validates :url, presence: true, uniqueness: true, url: true
+ validates :url, presence: true, uniqueness: true, url: true, length: { maximum: URL_CHARACTER_LIMIT }
validates_attachment_content_type :image, content_type: IMAGE_MIME_TYPES
validates_attachment_size :image, less_than: LIMIT
remotable_attachment :image, LIMIT
diff --git a/app/models/status.rb b/app/models/status.rb
index baa6578005532e..73f0052673569c 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -288,7 +288,7 @@ def ordered_media_attachments
else
map = media_attachments.index_by(&:id)
ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] }
- end
+ end.take(MEDIA_ATTACHMENTS_LIMIT)
end
def replies_count
diff --git a/app/models/status_edit.rb b/app/models/status_edit.rb
index 089c42fb99493d..6e25a6f3bbdd6b 100644
--- a/app/models/status_edit.rb
+++ b/app/models/status_edit.rb
@@ -53,12 +53,14 @@ def emojis
def ordered_media_attachments
return @ordered_media_attachments if defined?(@ordered_media_attachments)
- @ordered_media_attachments = if ordered_media_attachment_ids.nil?
- []
- else
- map = status.media_attachments.index_by(&:id)
- ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) }
- end
+ @ordered_media_attachments = begin
+ if ordered_media_attachment_ids.nil?
+ []
+ else
+ map = status.media_attachments.index_by(&:id)
+ ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) }
+ end
+ end.take(Status::MEDIA_ATTACHMENTS_LIMIT)
end
def proper
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 8bc9f912c55da0..adabb1096e86eb 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -15,9 +15,6 @@ class FetchLinkCardService < BaseService
)
}iox
- # URL size limit to safely store in PosgreSQL's unique indexes
- BYTESIZE_LIMIT = 2692
-
def call(status)
@status = status
@original_url = parse_urls
@@ -32,7 +29,7 @@ def call(status)
end
attach_card if @card&.persisted?
- rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError => e
+ rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, EncodingError, ActiveRecord::RecordInvalid => e
Rails.logger.debug { "Error fetching link #{@original_url}: #{e}" }
nil
end
@@ -88,7 +85,7 @@ def parse_urls
def bad_url?(uri)
# Avoid local instance URLs and invalid URLs
- uri.host.blank? || TagManager.instance.local_url?(uri.to_s) || !%w(http https).include?(uri.scheme) || uri.to_s.bytesize > BYTESIZE_LIMIT
+ uri.host.blank? || TagManager.instance.local_url?(uri.to_s) || !%w(http https).include?(uri.scheme)
end
def mention_link?(anchor)
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 53b02edc40227e..e1d98b8ba3be33 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -2,9 +2,21 @@
require_relative '../../lib/mastodon/sidekiq_middleware'
+SIDEKIQ_WILL_PROCESSES_JOBS_FILE = Rails.root.join('tmp', 'sidekiq_process_has_started_and_will_begin_processing_jobs').freeze
+
Sidekiq.configure_server do |config|
config.redis = REDIS_SIDEKIQ_PARAMS
+ # This is used in Kubernetes setups, to signal that the Sidekiq process has started and will begin processing jobs
+ # This comes from https://github.com/sidekiq/sidekiq/wiki/Kubernetes#sidekiq
+ config.on(:startup) do
+ FileUtils.touch(SIDEKIQ_WILL_PROCESSES_JOBS_FILE)
+ end
+
+ config.on(:shutdown) do
+ FileUtils.rm_f(SIDEKIQ_WILL_PROCESSES_JOBS_FILE)
+ end
+
config.server_middleware do |chain|
chain.add Mastodon::SidekiqMiddleware
end
diff --git a/config/initializers/vapid.rb b/config/initializers/vapid.rb
index 7dd870c8b7d9af..551ede34fb9004 100644
--- a/config/initializers/vapid.rb
+++ b/config/initializers/vapid.rb
@@ -5,7 +5,7 @@
# You should only generate this once per instance. If you later decide to change it, all push subscription will
# be invalidated, requiring the users to access the website again to resubscribe.
#
- # Generate with `rake mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web rake mastodon:webpush:generate_vapid_key` if you use docker compose)
+ # Generate with `bundle exec rails mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web bundle exec rails mastodon:webpush:generate_vapid_key` if you use docker compose)
#
# For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml
index b3ca90069b50ed..8cdc6501cbb494 100644
--- a/config/locales/activerecord.kab.yml
+++ b/config/locales/activerecord.kab.yml
@@ -21,6 +21,18 @@ kab:
username:
invalid: ilaq ad ilin isekkilen, uṭṭunen d yijerriden n wadda kan
reserved: yettwaṭṭef
+ admin/webhook:
+ attributes:
+ url:
+ invalid: mačči d URL ameɣtu
+ doorkeeper/application:
+ attributes:
+ website:
+ invalid: mačči d URL ameɣtu
+ import:
+ attributes:
+ data:
+ malformed: yir amsal
status:
attributes:
reblog:
@@ -28,4 +40,20 @@ kab:
user:
attributes:
email:
+ blocked: isseqdac asaǧǧaw n yimayl ur yettusirgen ara
unreachable: ur d-ttban ara d akken yella
+ role_id:
+ elevated: ur yezmir ara ad iεeddi tamlilt-ik tamirant
+ user_role:
+ attributes:
+ permissions_as_keys:
+ dangerous: deg-s tisirag tiriɣelsanin i temlilt tazadurt
+ elevated: ur yezmir ara ad yesεu tirirag ur nelli ara deg temlilit-ik tamirant
+ own_role: ur yezmir ara ad yettwabeddel s temlilt-ik tamirant
+ position:
+ elevated: ur yezmir ara ad iεeddi tamlilt-ik tamirant
+ own_role: ur yezmir ara ad yettwabeddel s temlilt-ik tamirant
+ webhook:
+ attributes:
+ events:
+ invalid_permissions: ur yezmir ara ad yesεu tidyanin iwumi ur tesεiḍ ara tisirag
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 20e7e4d46b81d5..7e0aaaeefb6fe3 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -118,7 +118,7 @@ cs:
promote: Povýšit
protocol: Protokol
public: Veřejný
- push_subscription_expires: Odebírání PuSH expiruje
+ push_subscription_expires: Odebírání PuSH vyprší
redownload: Obnovit profil
redownloaded_msg: Profil účtu %{username} byl úspěšně obnoven ze zdroje
reject: Zamítnout
diff --git a/config/locales/devise.kab.yml b/config/locales/devise.kab.yml
index 438c1df2b9a46f..3fbc58c1f57fcb 100644
--- a/config/locales/devise.kab.yml
+++ b/config/locales/devise.kab.yml
@@ -12,6 +12,7 @@ kab:
last_attempt: Γur-k yiwen n uɛraḍ-nniḍen kan send ad yettucekkel umiḍan-ik.
locked: Amiḍan-ik yettwargel.
not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir.
+ omniauth_user_creation_failure: Tuccḍa lawan n tmerna n umiḍan i timagit-a.
pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli.
timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ.
unauthenticated: Ilaq ad teqqneḍ neɣ ad tjerrḍeḍ akken ad tkemmelḍ.
@@ -47,21 +48,41 @@ kab:
subject: 'Mastodon: Iwellihen n uwennez n wawal uffir'
title: Aɛiwed n wawal uffir
two_factor_disabled:
+ explanation: Tuqqna tella tura s useqdec n tansa n yimayl tasuft d wawal n uεeddi.
subject: 'Mastodon: Asesteb s snat n tarrayin yensa'
+ subtitle: Asesteb s snat tarrayin i umiḍan-ik yensan.
title: Asesteb s snat n tarrayin insa
two_factor_enabled:
+ explanation: Ajuṭu yettusirwen s usnas TOTP yeqqnen ilaq i wakken ad teqqneḍ.
subject: 'Mastodon: Asesteb s snat n tarrayin yermed'
+ subtitle: Asesteb s snat tarrayin yettwarmed i umiḍan-ik.
title: Asesteb s snat n tarrayin irmed
two_factor_recovery_codes_changed:
explanation: Tangalt n tuɣalin tettwaḥbes sakin nesnulfa-d yiwet d tamaynut.
subject: 'Mastodon: Tingalin n tuɣalin n snat n tarayin ttwarnanat i tikkelt-nniḍen'
+ subtitle: Tangalt n tuɣalin tettwaḥbes sakin nesnulfa-d yiwet d tamaynut.
title: Tangalt n tuɣalin 2FA tettwabeddel
unlock_instructions:
subject: 'Mastodon: iwelihhen n userreḥ'
webauthn_credential:
added:
+ explanation: Tasarut-a n tɣellist tettwarna ɣer umiḍan-ik·im
subject: 'Maṣṭudun : Tasarutt tamaynutt n tɣellist'
title: Tasarut tamaynutt n tɣellist tamaynut tettwarna
+ deleted:
+ explanation: Tasarut-a n tɣellist tettwakkes seg umiḍan-ik·im
+ subject: 'Mastodon: Tasarut n tɣellsit tettwakkes'
+ title: Yiwet seg tsura-k·m n tɣellist tettwakkes
+ webauthn_disabled:
+ explanation: Yensa usesteb s tsura n tɣellist i umiḍan-ik.
+ extra: Tzemreḍ ad tkecmeḍ tura s useqdec asuf n ujuṭu yettwasran s usnas TOPTP yeqqnen.
+ subject: 'Mastodon: Asesteb s tsura n tɣellist yensa'
+ title: Tisura n tɣellist nsant
+ webauthn_enabled:
+ explanation: Asesteb n tsarut n tɣellist tettwarmed i umiḍan-ik.
+ extra: Tasarut-ik n tɣellist tezmer tura ad tettuseqdec i unekcum.
+ subject: 'Mastodon: Asesteb n tsarut n tɣellist yermed'
+ title: Tisura n tɣellist remdent
omniauth_callbacks:
failure: Ur nezmir ara ad ak·akem-nsesṭeb seg %{kind} acku "%{reason}".
success: Asesṭeb idda akken iwata seg umiḍan %{kind}.
diff --git a/config/locales/doorkeeper.kab.yml b/config/locales/doorkeeper.kab.yml
index 1b1a7df957645f..33aecd8c6f03d7 100644
--- a/config/locales/doorkeeper.kab.yml
+++ b/config/locales/doorkeeper.kab.yml
@@ -5,6 +5,7 @@ kab:
doorkeeper/application:
name: Isem n usnas
redirect_uri: URI n uwelleh
+ scopes: Tinerfadin
website: Asmel web n usnas
errors:
models:
@@ -39,6 +40,7 @@ kab:
empty: Ulac ɣur-k·m isnasen.
name: Isem
new: Asnas amaynut
+ scopes: Tinerfadin
show: Ẓer
title: Isnasen-ik·im
new:
@@ -47,6 +49,8 @@ kab:
actions: Tigawin
application_id: ID n usnas
callback_urls: URL n tririt n wawal
+ scopes: Tinerfadin
+ secret: Tuffirt n umsaɣ
title: 'Asnas: %{name}'
authorizations:
buttons:
@@ -55,6 +59,7 @@ kab:
error:
title: Tella-d tuccḍa
new:
+ review_permissions: Asenqed n tsirag
title: Tlaq tsiregt
show:
title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas.
@@ -64,8 +69,12 @@ kab:
confirmations:
revoke: Tetḥeqqeḍ?
index:
+ authorized_at: Yettwasireg ɣef %{date}
description_html: Ha-t-an yisnasen i izemren ad kecmen ɣer umiḍan-ik·im, s useqdec n API. Ma llan yisnasen ur teεqileḍ ara da, neɣ kra n wesnas ur iteddu ara akken ilaq, tzemreḍ ad tekkseḍ anekcum-is.
last_used_at: Yettwaseqdec i tikkelt taneggarut ass n %{date}
+ never_used: Urǧin yettwaseqdac
+ scopes: Tisirag
+ superapp: Adigan
title: Isnasen-ik·im yettusirgen
errors:
messages:
@@ -82,13 +91,28 @@ kab:
destroy:
notice: Yettwaḥwi wesnas.
grouped_scopes:
+ access:
+ read: Anekcum i tɣuri kan
+ read/write: Anekcum i tɣuri d tira
+ write: Anekcum i tira kan
title:
accounts: Imiḍanen
admin/accounts: Tadbelt n imiḍan
+ admin/all: Akk timahilin tinebdalin
+ admin/reports: Tadbelt n yineqqisen
+ blocks: Yewḥel
+ bookmarks: Ticraḍ
+ conversations: Idiwenniyen
crypto: Awgelhen seg yixef ɣer yixef
+ favourites: Imenyafen
filters: Imzizdigen
+ follow: Aḍfar, asgugem akked usewḥel
+ follows: Aḍfar
lists: Tibdarin
+ media: Imeddayen n umidya
+ mutes: Yeggugem
notifications: Tilɣa
+ profile: Amaɣnu-k Mastodon
push: Tilɣa yettudemmren
reports: Ineqqisen
search: Nadi
diff --git a/config/locales/doorkeeper.ko.yml b/config/locales/doorkeeper.ko.yml
index 3ab0698d51c4ef..7ec357bf9fdec4 100644
--- a/config/locales/doorkeeper.ko.yml
+++ b/config/locales/doorkeeper.ko.yml
@@ -31,7 +31,7 @@ ko:
form:
error: 이런! 오류를 확인하세요
help:
- native_redirect_uri: "%{native_redirect_uri}에서 로컬 테스트를 할 수 있습니다."
+ native_redirect_uri: "%{native_redirect_uri}를 이용해 로컬 테스트를 할 수 있습니다"
redirect_uri: 한 줄에 하나의 URI를 작성하세요
scopes: 스페이스로 범위를 구분하세요. 빈 칸으로 놔두면 기본 범위를 사용합니다.
index:
diff --git a/config/locales/doorkeeper.lv.yml b/config/locales/doorkeeper.lv.yml
index 5aa5daef3f6d16..11c50203050e4c 100644
--- a/config/locales/doorkeeper.lv.yml
+++ b/config/locales/doorkeeper.lv.yml
@@ -25,7 +25,7 @@ lv:
edit: Labot
submit: Apstiprināt
confirmations:
- destroy: Vai esi pārliecināts?
+ destroy: Vai tiešām?
edit:
title: Labot lietotni
form:
@@ -69,7 +69,7 @@ lv:
buttons:
revoke: Atsaukt
confirmations:
- revoke: Vai esi pārliecināts?
+ revoke: Vai tiešām?
index:
authorized_at: Autorizētas %{date}
description_html: Šīs ir lietotnes, kas var piekļūt Tavam kontam ar API. Ja šeit ir lietotnes, kuras neatpazīsti, vai lietotne darbojas ne tā, kā paredzēts, vari atsaukt tās piekļuvi.
@@ -135,6 +135,7 @@ lv:
media: Multividesu pielikumi
mutes: Apklusinātie
notifications: Paziņojumi
+ profile: Tavs Mastodon profils
push: Uznirstošie paziņojumi
reports: Ziņojumi
search: Meklēt
@@ -165,6 +166,7 @@ lv:
admin:write:reports: veikt moderācijas darbības pārskatos
crypto: lieto pilnīgu šifrēšanu
follow: mainīt konta attiecības
+ profile: lasīt tikai Tava konta profila informāciju
push: saņemt savus push paziņojumus
read: lasīt visus sava konta datus
read:accounts: apskatīt kontu informāciju
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index ad4744e15b3e7b..c9f08dcad74d3a 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -31,18 +31,18 @@ gl:
created_msg: Nota de moderación creada correctamente!
destroyed_msg: Nota de moderación eliminada de xeito correcto!
accounts:
- add_email_domain_block: Bloquear o dominio do email
+ add_email_domain_block: Bloquear o dominio do enderezo
approve: Aprobar
approved_msg: Aprobada a solicitude de rexistro de %{username}
are_you_sure: Está segura?
avatar: Imaxe de perfil
by_domain: Dominio
change_email:
- changed_msg: Email mudado de xeito correcto!
- current_email: Email actual
- label: Mudar email
- new_email: Novo email
- submit: Mudar email
+ changed_msg: Correo cambiado de xeito correcto!
+ current_email: Enderezo actual
+ label: Cambiar de enderezo
+ new_email: Novo enderezo
+ submit: Cambiar de enderezo
title: Mudar email de %{username}
change_role:
changed_msg: Rol mudado correctamente!
@@ -64,10 +64,10 @@ gl:
display_name: Nome a amosar
domain: Dominio
edit: Editar
- email: Email
- email_status: Estado do email
+ email: Enderezo de correo
+ email_status: Estado do correo
enable: Activar
- enable_sign_in_token_auth: Activar autenticación cun token no email
+ enable_sign_in_token_auth: Activar autenticación cun token no correo
enabled: Activado
enabled_msg: Desbloqueada a conta de %{username}
followers: Seguidoras
@@ -132,7 +132,7 @@ gl:
resubscribe: Resubscribir
role: Rol
search: Procurar
- search_same_email_domain: Outras usuarias co mesmo dominio de email
+ search_same_email_domain: Outras usuarias co mesmo dominio de correo
search_same_ip: Outras usuarias co mesmo IP
security: Seguridade
security_measures:
@@ -154,9 +154,9 @@ gl:
suspension_irreversible: Elimináronse de xeito irreversible os datos desta conta. Podes reactivar a conta para facela usable novamente pero non recuperará os datos eliminados.
suspension_reversible_hint_html: Esta conta foi suspendida, e os datos serán totalmente eliminados o %{date}. Ata entón, a conta pode ser restaurada sen danos. Se desexas eliminar agora mesmo todos os datos da conta, podes facelo aquí embaixo.
title: Contas
- unblock_email: Desbloquear enderezo de email
- unblocked_email_msg: Enderezo de email de %{username} desbloqueado
- unconfirmed_email: Email non confirmado
+ unblock_email: Desbloquear enderezo de correo
+ unblocked_email_msg: Enderezo de correo de %{username} desbloqueado
+ unconfirmed_email: Enderezo de correo sen confirmar
undo_sensitized: Desmarcar como sensible
undo_silenced: Desfacer acalar
undo_suspension: Desfacer suspensión
@@ -173,12 +173,12 @@ gl:
approve_appeal: Aprobar apelación
approve_user: Aprobar Usuaria
assigned_to_self_report: Asignar denuncia
- change_email_user: Editar email da usuaria
+ change_email_user: Editar correo electrónico da usuaria
change_role_user: Cambiar Rol da Usuaria
confirm_user: Confirmar usuaria
create_account_warning: Crear aviso
create_announcement: Crear anuncio
- create_canonical_email_block: Crear Bloqueo de email
+ create_canonical_email_block: Crear Bloqueo de correo electrónico
create_custom_emoji: Crear emoticonas personalizadas
create_domain_allow: Crear Dominio Permitido
create_domain_block: Crear bloquedo do Dominio
@@ -188,7 +188,7 @@ gl:
create_user_role: Crear Rol
demote_user: Degradar usuaria
destroy_announcement: Eliminar anuncio
- destroy_canonical_email_block: Eliminar Bloqueo de email
+ destroy_canonical_email_block: Eliminar Bloqueo de correo electrónico
destroy_custom_emoji: Eliminar emoticona personalizada
destroy_domain_allow: Eliminar Dominio permitido
destroy_domain_block: Eliminar bloqueo do Dominio
@@ -200,7 +200,7 @@ gl:
destroy_user_role: Eliminar Rol
disable_2fa_user: Desactivar 2FA
disable_custom_emoji: Desactivar emoticona personalizada
- disable_sign_in_token_auth_user: Desactivar Autenticación por token no email para Usuaria
+ disable_sign_in_token_auth_user: Desactivar Autenticación con token no correo para Usuaria
disable_user: Desactivar usuaria
enable_custom_emoji: Activar emoticona personalizada
enable_sign_in_token_auth_user: Activar Autenticación con token no email para Usuaria
@@ -211,14 +211,14 @@ gl:
reject_user: Rexeitar Usuaria
remove_avatar_user: Eliminar avatar
reopen_report: Reabrir denuncia
- resend_user: Reenviar o email de confirmación
+ resend_user: Reenviar o correo de confirmación
reset_password_user: Restabelecer contrasinal
resolve_report: Resolver denuncia
sensitive_account: Marca o multimedia da túa conta como sensible
silence_account: Silenciar conta
suspend_account: Suspender conta
unassigned_report: Desasignar denuncia
- unblock_email_account: Desbloquear enderezo de email
+ unblock_email_account: Desbloquear enderezo de correo
unsensitive_account: Retira a marca de sensible do multimedia da conta
unsilence_account: Deixar de silenciar conta
unsuspend_account: Retirar suspensión de conta
@@ -660,7 +660,7 @@ gl:
delete_data_html: Eliminar o perfil e contidos de @%{acct} para os próximos 30 días a non ser que sexa suspendida nese período
preview_preamble_html: "@%{acct} vai recibir un aviso co seguinte contido:"
record_strike_html: Anotar un aviso contra @%{acct} para axudarche a xestionar futuros problemas con esta conta
- send_email_html: Enviar un email de aviso a @%{acct}
+ send_email_html: Enviar un correo de aviso a @%{acct}
warning_placeholder: Razóns adicionais optativas para a acción de moderación.
target_origin: Orixe da conta denunciada
title: Denuncias
@@ -1060,7 +1060,7 @@ gl:
redirect_to_app_html: Ímoste redirixir á app %{app_name}. Se iso non acontece, proba %{clicking_this_link} ou volve ti manualmente á app.
registration_complete: Completouse a creación da conta en %{domain}!
welcome_title: Benvida, %{name}!
- wrong_email_hint: Se o enderezo de email non é correcto, podes cambialo nos axustes da conta.
+ wrong_email_hint: Se o enderezo de correo non é correcto, podes cambialo nos axustes da conta.
delete_account: Eliminar conta
delete_account_html: Se queres eliminar a túa conta, podes facelo aquí. Deberás confirmar a acción.
description:
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index a8e2ade61df8e5..f7feb73ba0b03d 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -1741,7 +1741,7 @@ ko:
contrast: 마스토돈 (고대비)
default: 마스토돈 (어두움)
mastodon-light: 마스토돈 (밝음)
- system: 자동 선택 (시스템 테마 이용)
+ system: 자동 (시스템 테마 사용)
time:
formats:
default: "%Y-%m-%d %H:%M"
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index cd54d51051d838..79bc2a275f4045 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -116,6 +116,8 @@ ro:
redownloaded_msg: S-a reîmprospătat cu succes profilul %{username} de la origine
reject: Respinge
rejected_msg: S-a respins cu succes cererea de înregistrare a utilizatorului %{username}
+ remote_suspension_irreversible: Datele acestui cont au fost șterse în mod ireversibil.
+ remote_suspension_reversible_hint_html: Contul a fost suspendat pe server-ul respectiv, iar datele vor fi șterse complet pe %{date}. Până atunci, server-ul remote poate restabili acest cont fără consecințe negative. Dacă dorești să elimini toate datele contului numaidecât, poți face acest lucru mai jos.
remove_avatar: Elimină avatar
remove_header: Elimină antet
removed_avatar_msg: S-a îndepărtat cu succes poza de profil a utilizatorului %{username}
diff --git a/config/locales/ry.yml b/config/locales/ry.yml
index 6fe57b65cdb30e..e384b7f1b74810 100644
--- a/config/locales/ry.yml
+++ b/config/locales/ry.yml
@@ -1 +1,21 @@
+---
ry:
+ accounts:
+ follow: Пудписати ся
+ following: Пудпискы
+ posts:
+ few: Публикації
+ one: Публикація
+ other: Публикації
+ posts_tab_heading: Публикації
+ imports:
+ titles:
+ following: Імпортованя пудписок
+ types:
+ following: Испис пудписок
+ notification_mailer:
+ follow:
+ body: "%{name} ся пудписує ся на вас!"
+ subject: "%{name} ся пудписує ся на вас"
+ relationships:
+ following: Пудпискы
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 0411c45bc169f4..e46ccb8737fd09 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -255,7 +255,7 @@ gl:
require_invite_text: Pedir unha razón para unirse
show_domain_blocks: Amosar dominios bloqueados
show_domain_blocks_rationale: Explicar porque están bloqueados os dominios
- site_contact_email: Email de contacto
+ site_contact_email: Correo de contacto
site_contact_username: Nome do contacto
site_extended_description: Descrición ampla
site_short_description: Descrición do servidor
diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml
index 9461f16cd54577..63e2b9aacf1bf6 100644
--- a/config/locales/simple_form.kab.yml
+++ b/config/locales/simple_form.kab.yml
@@ -5,6 +5,7 @@ kab:
account:
display_name: Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer.
fields: Asebter-ik·im agejdan, imqimen, leεmer, ayen tebɣiḍ.
+ note: 'Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen.'
account_alias:
acct: Sekcem isem n umseqdac@domain n umiḍan s wansa itebγiḍ ad gujjeḍ
account_migration:
@@ -27,6 +28,8 @@ kab:
name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :'
imports:
data: Afaylu CSV id yusan seg uqeddac-nniḍen n Maṣṭudun
+ invite_request:
+ text: Aya ad aɣ-iɛiwen ad nessenqed tuttra-k•m
ip_block:
comment: D afrayan. Cfu ɣef wayɣer i terniḍ alugen-a.
severities:
@@ -36,6 +39,8 @@ kab:
fields:
name: Tabzimt
value: Agbur
+ account_alias:
+ acct: Tansa n umiḍan aqbur
account_migration:
acct: Tansa n umiḍan amaynut
account_warning_preset:
@@ -51,6 +56,7 @@ kab:
suspend: Ḥbes di leεḍil
announcement:
ends_at: Tagara n tedyant
+ starts_at: Tazwara n tedyant
text: Alɣu
defaults:
autofollow: Ɛreḍ-it-id ad yeḍfer amiḍan-ik·im
@@ -59,18 +65,25 @@ kab:
chosen_languages: Sizdeg tutlayin
confirm_new_password: Sentem awal uffir amaynut
confirm_password: Sentem awal uffir
+ context: Isatalen n umsizdeg
current_password: Awal uffir n tura
data: Isefka
display_name: Isem ara d-yettwaskanen
email: Tansa imayl
expires_in: Ad yemmet
+ fields: Urtiyen niḍen
header: Ixef
+ honeypot: "%{label} (ur tettaččar ara)"
+ inbox_url: URL n tbewwaḍt n urmas yettwacudden
+ irreversible: Kkes deg wadeg n tuffra
locale: Tutlayt n wegrudem
max_uses: Amḍan afellay n iseqdacen
new_password: Awal uffir amaynut
note: Tameddurt
otp_attempt: Tangalt n snat n tarayin
password: Awal uffir
+ phrase: Awal n tsarut neɣ tafyirt
+ setting_advanced_layout: Rmed agrudem n web leqqayen
setting_default_language: Tutlayt n tira
setting_default_privacy: Tabaḍnit n tira
setting_display_media_default: Akk-a kan
@@ -88,8 +101,15 @@ kab:
featured_tag:
name: Ahacṭag
form_admin_settings:
+ custom_css: CSS udmawan
+ profile_directory: Rmed akaram n imaγnuten
+ site_contact_email: Imayl n unermas
+ site_short_description: Aglam n uqeddac
site_terms: Tasertit tabaḍnit
site_title: Isem n uqeddac
+ status_page_url: URL n uusebter n waddaden
+ theme: Asentel amezwer
+ thumbnail: Tanfult n uqeddac
interactions:
must_be_follower: Ssewḥel ilɣa sɣur wid akked tid ur yellin ara d imeḍfaren-ik·im
must_be_following: Ssewḥel ilɣa sɣur wid akked tid ur tettḍafareḍ ara
@@ -109,18 +129,25 @@ kab:
follow: Yeḍfer-ik·im-id walbɛaḍ
follow_request: Ma yella win i d-yessutren ad k·em-yeḍfer
mention: Yuder-ik·em-id walbɛaḍ
+ pending_account: Amiḍan amaynut yesran asenqed
reblog: Yella win yesselhan adda-dik·im
+ report: Aneqis amaynut yettwazen
rule:
hint: Isallen-nniḍen
text: Alugen
tag:
name: Ahacṭag
user:
+ role: Tamlilt
time_zone: Tamnaḍt tasragant
user_role:
name: Isem
permissions_as_keys: Tisirag
+ webhook:
+ events: Tidyanin turmidin
'no': Ala
+ not_recommended: Ur yettuwelleh ara
+ overridden: Yeččur
recommended: Yettuwelleh
required:
mark: "*"
diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml
index dfb44c77453e56..5df411b9512d3e 100644
--- a/config/locales/simple_form.ro.yml
+++ b/config/locales/simple_form.ro.yml
@@ -2,6 +2,12 @@
ro:
simple_form:
hints:
+ account:
+ discoverable: Este posibil ca postările și profilul tău să fie recomandate în diferite zone ale Mastodon, iar profilul tău ar poate fi sugerat altor utilizatori.
+ fields: Pagina ta principală, pronumele tale, vârsta, sau orice îți dorești.
+ indexable: Postările tale publice pot apărea în rezultatele căutărilor pe Mastodon. Persoanele care au interacționat cu postările tale vor putea să le caute oricând.
+ note: 'Poți @menționa alte persoane sau #hashtag-uri.'
+ unlocked: Alte persoane vă vor putea urmări fără a solicita aprobare. Debifați dacă doriți să revizuiți cererile și să alegeți dacă doriți să acceptați sau să respingeți noii urmăritori.
account_alias:
acct: Specificați numele de utilizator@domeniu al contului de la care doriți să treceți
account_migration:
@@ -23,12 +29,14 @@ ro:
text: Poți folosi sintaxa de postare. Te rugăm să fii atent la spațiul pe care anunțul îl va ocupa pe ecranul utilizatorului
defaults:
autofollow: Persoanele care se înregistrează datorită invitației tale te vor urmări automat
+ avatar: WEBP, PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px
bot: Acest cont performează în cea mai mare parte acțiuni automate și nu poate fi monitorizat
context: Contextele în care filtrul trebuie aplicat
current_password: În scopuri de securitate, vă rugăm să introduceţi parola contului curent
current_username: Pentru a confirma, vă rugăm să introduceţi numele de utilizator al contului curent
digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență
email: Vei primi un e-mail de confirmare
+ header: WEBP, PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px
inbox_url: Copiază adresa URL de pe prima pagină a reului pe care vrei să îl utilizezi
irreversible: Postările sortate vor dispărea ireversibil, chiar dacă filtrul este ulterior șters
locale: Limba interfaței de utilizator, e-mailurile si notificările push
@@ -36,17 +44,27 @@ ro:
phrase: Vor fi potrivite indiferent de textul din casetă sau advertismentul unei postări
scopes: La care API-uri aplicația are nevoie de acces. Dacă selectezi un scop principal nu mai e nevoie să selectezi fiecare sub-scop al acestuia.
setting_aggregate_reblogs: Nu afișa impulsurile noi pentru postările care au fost deja recent impulsionate (afectează doar noile impulsuri primite)
+ setting_always_send_emails: În mod normal, notificările prin e-mail nu vor fi trimise când utilizați în mod activ Mastodon
setting_default_sensitive: Fișierele media sensibile sunt ascunse implicit și pot fi dezvăluite cu un clic
setting_display_media_default: Ascunde conținutul media marcat ca sensibil (NSFW)
setting_display_media_hide_all: Întotdeauna ascunde tot conținutul media
setting_display_media_show_all: Întotdeauna afișează conținutul media marcat ca sensibil
setting_use_blurhash: Gradienții sunt bazați pe culorile vizualelor ascunse, dar ofuscă orice detalii
setting_use_pending_items: Ascunde actualizările cronologice din spatele unui click în loc de a derula automat fluxul
+ username: Poți folosi litere, numere sau liniuțe de subliniere
whole_word: Când fraza sau cuvântul este doar alfanumeric, acesta se aplică doar dacă există o potrivire completă
domain_allow:
domain: Acest domeniu va putea prelua date de pe acest server și datele primite de la el vor fi procesate și stocate
email_domain_block:
+ domain: Acesta poate fi numele de domeniu care apare în adresa de e-mail sau în înregistrarea MX pe care o utilizează. Acestea vor fi verificate la înscriere.
with_dns_records: Se va face o încercare de a rezolva înregistrările DNS ale domeniului dat și rezultatele vor fi de asemenea afișate pe lista neagră
+ featured_tag:
+ name: 'Iată câteva dintre hashtag-urile pe care le-ai folosit cel mai recent:'
+ filters:
+ action: Alege ce acţiune va fi efectuată atunci când o postare corespunde filtrului
+ actions:
+ hide: Ascunde complet conținutul filtrat, ca și cum nu ar exista
+ warn: Ascunde conținutul filtrat în spatele unui avertisment care menționează titlul filtrului
form_challenge:
current_password: Ați intrat într-o zonă securizată
imports:
diff --git a/config/routes.rb b/config/routes.rb
index 4b3bd4f187a158..2c06762c229224 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -63,12 +63,16 @@ def redirect_with_vary(path)
tokens: 'oauth/tokens'
end
- get '.well-known/oauth-authorization-server', to: 'well_known/oauth_metadata#show', as: :oauth_metadata, defaults: { format: 'json' }
- get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' }
- get '.well-known/nodeinfo', to: 'well_known/node_info#index', as: :nodeinfo, defaults: { format: 'json' }
- get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger
- get '.well-known/change-password', to: redirect('/auth/edit')
- get '.well-known/proxy', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" }
+ scope path: '.well-known' do
+ scope module: :well_known do
+ get 'oauth-authorization-server', to: 'oauth_metadata#show', as: :oauth_metadata, defaults: { format: 'json' }
+ get 'host-meta', to: 'host_meta#show', as: :host_meta, defaults: { format: 'xml' }
+ get 'nodeinfo', to: 'node_info#index', as: :nodeinfo, defaults: { format: 'json' }
+ get 'webfinger', to: 'webfinger#show', as: :webfinger
+ end
+ get 'change-password', to: redirect('/auth/edit'), as: nil
+ get 'proxy', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" }, as: nil
+ end
get '/nodeinfo/2.0', to: 'well_known/node_info#show', as: :nodeinfo_schema
@@ -94,7 +98,7 @@ def redirect_with_vary(path)
namespace :auth do
resource :setup, only: [:show, :update], controller: :setup
- resource :challenge, only: [:create], controller: :challenges
+ resource :challenge, only: [:create]
get 'sessions/security_key_options', to: 'sessions#webauthn_options'
post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation
end
diff --git a/config/routes/api.rb b/config/routes/api.rb
index 3eb4bb4b4d58c4..9011916697452d 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -203,9 +203,11 @@
post :unmute
end
- resource :pin, only: :create, controller: 'accounts/pins'
- post :unpin, to: 'accounts/pins#destroy'
- resource :note, only: :create, controller: 'accounts/notes'
+ scope module: :accounts do
+ resource :pin, only: :create
+ post :unpin, to: 'pins#destroy'
+ resource :note, only: :create
+ end
end
resources :tags, only: [:show] do
@@ -218,7 +220,7 @@
resources :followed_tags, only: [:index]
resources :lists, only: [:index, :create, :show, :update, :destroy] do
- resource :accounts, only: [:show, :create, :destroy], controller: 'lists/accounts'
+ resource :accounts, only: [:show, :create, :destroy], module: :lists
end
namespace :featured_tags do
@@ -228,7 +230,7 @@
resources :featured_tags, only: [:index, :create, :destroy]
resources :polls, only: [:create, :show] do
- resources :votes, only: :create, controller: 'polls/votes'
+ resources :votes, only: :create, module: :polls
end
namespace :push do
@@ -314,8 +316,10 @@
resources :suggestions, only: [:index]
resource :instance, only: [:show]
resources :filters, only: [:index, :create, :show, :update, :destroy] do
- resources :keywords, only: [:index, :create], controller: 'filters/keywords'
- resources :statuses, only: [:index, :create], controller: 'filters/statuses'
+ scope module: :filters do
+ resources :keywords, only: [:index, :create]
+ resources :statuses, only: [:index, :create]
+ end
end
namespace :filters do
diff --git a/config/routes/settings.rb b/config/routes/settings.rb
index 888fa9ecb55543..297b80942c9b5c 100644
--- a/config/routes/settings.rb
+++ b/config/routes/settings.rb
@@ -26,9 +26,9 @@
resources :follows, only: :index, controller: :following_accounts
resources :blocks, only: :index, controller: :blocked_accounts
resources :mutes, only: :index, controller: :muted_accounts
- resources :lists, only: :index, controller: :lists
+ resources :lists, only: :index
resources :domain_blocks, only: :index, controller: :blocked_domains
- resources :bookmarks, only: :index, controller: :bookmarks
+ resources :bookmarks, only: :index
end
resources :two_factor_authentication_methods, only: [:index] do
@@ -37,13 +37,13 @@
end
end
- resource :otp_authentication, only: [:show, :create], controller: 'two_factor_authentication/otp_authentication'
+ scope module: :two_factor_authentication do
+ resource :otp_authentication, only: [:show, :create], controller: :otp_authentication
- resources :webauthn_credentials, only: [:index, :new, :create, :destroy],
- path: 'security_keys',
- controller: 'two_factor_authentication/webauthn_credentials' do
- collection do
- get :options
+ resources :webauthn_credentials, only: [:index, :new, :create, :destroy], path: 'security_keys' do
+ collection do
+ get :options
+ end
end
end
diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb
index bf7f9bd70485c0..678ceee1158eb1 100644
--- a/spec/controllers/admin/disputes/appeals_controller_spec.rb
+++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb
@@ -34,7 +34,7 @@
let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
- it 'redirects back to the strike page and notifies target account about approved appeal', :sidekiq_inline do
+ it 'redirects back to the strike page and notifies target account about approved appeal', :inline_jobs do
emails = capture_emails { subject }
expect(response)
@@ -58,7 +58,7 @@
let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
- it 'redirects back to the strike page and notifies target account about rejected appeal', :sidekiq_inline do
+ it 'redirects back to the strike page and notifies target account about rejected appeal', :inline_jobs do
emails = capture_emails { subject }
expect(response)
diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb
index 87b08323da917c..eb2c6265d12eec 100644
--- a/spec/controllers/admin/domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/domain_blocks_controller_spec.rb
@@ -176,7 +176,7 @@
end
end
- describe 'PUT #update', :sidekiq_inline do
+ describe 'PUT #update', :inline_jobs do
subject do
post :update, params: { :id => domain_block.id, :domain_block => { domain: 'example.com', severity: new_severity }, 'confirm' => '' }
end
diff --git a/spec/controllers/admin/resets_controller_spec.rb b/spec/controllers/admin/resets_controller_spec.rb
index 10ed2cf969730c..0cbc3b60ab6f88 100644
--- a/spec/controllers/admin/resets_controller_spec.rb
+++ b/spec/controllers/admin/resets_controller_spec.rb
@@ -13,7 +13,7 @@
sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
end
- describe 'POST #create', :sidekiq_inline do
+ describe 'POST #create', :inline_jobs do
it 'redirects to admin accounts page' do
emails = capture_emails { subject }
diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb
index e78554ec7dc3e8..9a94e5e1a1a464 100644
--- a/spec/controllers/auth/sessions_controller_spec.rb
+++ b/spec/controllers/auth/sessions_controller_spec.rb
@@ -123,7 +123,7 @@
user.update(current_sign_in_at: 1.month.ago)
end
- it 'logs the user in and sends suspicious email and redirects home', :sidekiq_inline do
+ it 'logs the user in and sends suspicious email and redirects home', :inline_jobs do
emails = capture_emails { subject }
expect(response)
@@ -263,7 +263,7 @@
travel_to '2023-12-20T10:00:00Z'
end
- it 'does not log the user in, sets a flash message, and sends a suspicious sign in email', :sidekiq_inline do
+ it 'does not log the user in, sets a flash message, and sends a suspicious sign in email', :inline_jobs do
emails = capture_emails do
Auth::SessionsController::MAX_2FA_ATTEMPTS_PER_HOUR.times do
post :create, params: { user: { otp_attempt: '1234' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s }
diff --git a/spec/controllers/concerns/user_tracking_concern_spec.rb b/spec/controllers/concerns/user_tracking_concern_spec.rb
index b1de3cf4e2e2a0..f23d482f5f9303 100644
--- a/spec/controllers/concerns/user_tracking_concern_spec.rb
+++ b/spec/controllers/concerns/user_tracking_concern_spec.rb
@@ -75,7 +75,7 @@ def show
expect(redis.ttl("account:#{user.account_id}:regeneration")).to be >= 0
end
- it 'regenerates feed when sign in is older than two weeks', :sidekiq_inline do
+ it 'regenerates feed when sign in is older than two weeks', :inline_jobs do
get :show
expect_updated_sign_in_at(user)
diff --git a/spec/controllers/disputes/appeals_controller_spec.rb b/spec/controllers/disputes/appeals_controller_spec.rb
index 99d5a8b17f0252..3e874bbdcc0cab 100644
--- a/spec/controllers/disputes/appeals_controller_spec.rb
+++ b/spec/controllers/disputes/appeals_controller_spec.rb
@@ -17,7 +17,7 @@
let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
let(:params) { { strike_id: strike.id, appeal: { text: 'Foo' } } }
- it 'notifies staff about new appeal and redirects back to strike page', :sidekiq_inline do
+ it 'notifies staff about new appeal and redirects back to strike page', :inline_jobs do
emails = capture_emails { subject }
expect(emails.size)
@@ -36,7 +36,7 @@
let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
let(:params) { { strike_id: strike.id, appeal: { text: '' } } }
- it 'does not send email and renders strike show page', :sidekiq_inline do
+ it 'does not send email and renders strike show page', :inline_jobs do
emails = capture_emails { subject }
expect(emails).to be_empty
diff --git a/spec/controllers/settings/deletes_controller_spec.rb b/spec/controllers/settings/deletes_controller_spec.rb
index ccca4564e733a1..3342599bc1172e 100644
--- a/spec/controllers/settings/deletes_controller_spec.rb
+++ b/spec/controllers/settings/deletes_controller_spec.rb
@@ -50,7 +50,7 @@
delete :destroy, params: { form_delete_confirmation: { password: 'petsmoldoggos' } }
end
- it 'removes user record and redirects', :aggregate_failures, :sidekiq_inline do
+ it 'removes user record and redirects', :aggregate_failures, :inline_jobs do
expect(response).to redirect_to '/auth/sign_in'
expect(User.find_by(id: user.id)).to be_nil
expect(user.account.reload).to be_suspended
diff --git a/spec/fixtures/requests/latin1_posing_as_utf8_broken.txt b/spec/fixtures/requests/latin1_posing_as_utf8_broken.txt
new file mode 100644
index 00000000000000..ed8a4716a3eba6
--- /dev/null
+++ b/spec/fixtures/requests/latin1_posing_as_utf8_broken.txt
@@ -0,0 +1,17 @@
+HTTP/1.1 200 OK
+server: nginx
+date: Thu, 13 Jun 2024 14:33:13 GMT
+content-type: text/html; charset=utf-8
+content-length: 158
+accept-ranges: bytes
+
+
+
+
+
+ Tofu l'orange
+
+
+