-
+
{firstVerifiedField ? (
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 5809c94000c5a1..30d710518429ed 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -85,6 +85,7 @@
"alert.unexpected.message": "لقد طرأ خطأ غير متوقّع.",
"alert.unexpected.title": "المعذرة!",
"alt_text_badge.title": "نص بديل",
+ "alt_text_modal.cancel": "إلغاء",
"announcement.announcement": "إعلان",
"annual_report.summary.archetype.booster": "The cool-hunter",
"attachments_list.unprocessed": "(غير معالَج)",
@@ -120,13 +121,16 @@
"column.blocks": "المُستَخدِمون المَحظورون",
"column.bookmarks": "الفواصل المرجعية",
"column.community": "الخيط الزمني المحلي",
+ "column.create_list": "إنشاء القائمة",
"column.direct": "الإشارات الخاصة",
"column.directory": "تَصَفُّحُ المَلفات الشخصية",
"column.domain_blocks": "النطاقات المحظورة",
+ "column.edit_list": "تعديل القائمة",
"column.favourites": "المفضلة",
"column.firehose": "الموجزات الحية",
"column.follow_requests": "طلبات المتابعة",
"column.home": "الرئيسية",
+ "column.list_members": "إدارة أعضاء القائمة",
"column.lists": "القوائم",
"column.mutes": "المُستَخدِمون المَكتومون",
"column.notifications": "الإشعارات",
@@ -139,6 +143,7 @@
"column_header.pin": "تثبيت",
"column_header.show_settings": "إظهار الإعدادات",
"column_header.unpin": "إلغاء التَّثبيت",
+ "column_search.cancel": "إلغاء",
"column_subheading.settings": "الإعدادات",
"community.column_settings.local_only": "المحلي فقط",
"community.column_settings.media_only": "الوسائط فقط",
@@ -157,6 +162,7 @@
"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": "الطراز",
@@ -195,6 +201,7 @@
"confirmations.unfollow.title": "إلغاء متابعة المستخدم؟",
"content_warning.hide": "إخفاء المنشور",
"content_warning.show": "إظهار على أي حال",
+ "content_warning.show_more": "إظهار المزيد",
"conversation.delete": "احذف المحادثة",
"conversation.mark_as_read": "اعتبرها كمقروءة",
"conversation.open": "اعرض المحادثة",
@@ -325,6 +332,7 @@
"footer.privacy_policy": "سياسة الخصوصية",
"footer.source_code": "الاطلاع على الشفرة المصدرية",
"footer.status": "الحالة",
+ "footer.terms_of_service": "شروط الخدمة",
"generic.saved": "تم الحفظ",
"getting_started.heading": "استعدّ للبدء",
"hashtag.column_header.tag_mode.all": "و {additional}",
@@ -358,6 +366,7 @@
"ignore_notifications_modal.ignore": "تجاهل الإشعارات",
"ignore_notifications_modal.limited_accounts_title": "تجاهل الإشعارات من الحسابات التي هي تحت الإشراف؟",
"ignore_notifications_modal.new_accounts_title": "تجاهل الإشعارات الصادرة من الحسابات الجديدة؟",
+ "interaction_modal.no_account_yet": "لا تملك حساباً بعد؟",
"interaction_modal.on_another_server": "على خادم مختلف",
"interaction_modal.on_this_server": "على هذا الخادم",
"interaction_modal.title.favourite": "إضافة منشور {name} إلى المفضلة",
@@ -408,11 +417,21 @@
"limited_account_hint.title": "تم إخفاء هذا الملف الشخصي من قبل مشرفي {domain}.",
"link_preview.author": "مِن {name}",
"link_preview.more_from_author": "المزيد من {name}",
+ "lists.add_member": "إضافة",
+ "lists.add_to_list": "إضافة إلى القائمة",
+ "lists.add_to_lists": "إضافة {name} إلى القوائم",
+ "lists.create": "إنشاء",
+ "lists.create_list": "إنشاء قائمة",
"lists.delete": "احذف القائمة",
+ "lists.done": "تمّ",
"lists.edit": "عدّل القائمة",
+ "lists.exclusive": "إخفاء الأعضاء في الصفحة الرئيسية",
+ "lists.remove_member": "إزالة",
"lists.replies_policy.followed": "أي مستخدم متابَع",
"lists.replies_policy.list": "أعضاء القائمة",
"lists.replies_policy.none": "لا أحد",
+ "lists.save": "حفظ",
+ "lists.search": "بحث",
"load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}",
"loading_indicator.label": "جاري التحميل…",
"media_gallery.hide": "إخفاء",
@@ -464,7 +483,7 @@
"notification.label.private_reply": "رد خاص",
"notification.label.reply": "ردّ",
"notification.mention": "إشارة",
- "notification.mentioned_you": "{name} mentioned you",
+ "notification.mentioned_you": "أشارَ إليك {name}",
"notification.moderation-warning.learn_more": "اعرف المزيد",
"notification.moderation_warning": "لقد تلقيت تحذيرًا بالإشراف",
"notification.moderation_warning.action_delete_statuses": "تم حذف بعض من منشوراتك.",
@@ -740,6 +759,7 @@
"subscribed_languages.target": "تغيير اللغات المشتركة لـ {target}",
"tabs_bar.home": "الرئيسية",
"tabs_bar.notifications": "الإشعارات",
+ "terms_of_service.title": "شروط الخدمة",
"time_remaining.days": "{number, plural, one {# يوم} other {# أيام}} متبقية",
"time_remaining.hours": "{number, plural, one {# ساعة} other {# ساعات}} متبقية",
"time_remaining.minutes": "{number, plural, one {# دقيقة} other {# دقائق}} متبقية",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 74b0c3531b735a..cdcbddf55a6b99 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Възникна неочаквана грешка.",
"alert.unexpected.title": "Опаа!",
"alt_text_badge.title": "Алтернативен текст",
+ "alt_text_modal.add_alt_text": "Добавяне на алтернативен текст",
+ "alt_text_modal.add_text_from_image": "Добавяне на текст от образ",
+ "alt_text_modal.cancel": "Отказ",
+ "alt_text_modal.change_thumbnail": "Промяна на миниобраза",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Опишете това за хора със слухови увреждания…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Опишете това за хора със зрителни увреждания…",
+ "alt_text_modal.done": "Готово",
"announcement.announcement": "Оповестяване",
"annual_report.summary.archetype.booster": "Якият подсилвател",
"annual_report.summary.archetype.lurker": "Дебнещото",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Пренебрегвате ли известията от хора, които не са ви последвали?",
"ignore_notifications_modal.not_following_title": "Пренебрегвате ли известията от хора, които не сте последвали?",
"ignore_notifications_modal.private_mentions_title": "Пренебрегвате ли известия от непоискани лични споменавания?",
+ "info_button.label": "Помощ",
+ "info_button.what_is_alt_text": "
Какво е алтернативен текст?
Алтернативният текст осигурява описания на изображение за хора със зрителни увреждания, връзки с ниска честотна лента или търсещите допълнителен контекст.
Може да подобрите достъпността и разбираемостта за всеки, пишейки ясен, кратък и обективен алтернативен текст.
Уловете важните елементи
Обобщете текста в образите
Употребявайте правилна структура на изречението
Избягвайте излишна информация
Съсредоточете се върху тенденциите и ключови констатации в сложни онагледявания (като диаграми и карти)
",
"interaction_modal.action.favourite": "Трябва да направите любимо от акаунта си, за да продължите.",
"interaction_modal.action.follow": "Трябва да последвате от акаунта си, за да продължите.",
"interaction_modal.action.reblog": "Трябва да разпространите нечий блог от акаунта си, за да продължите.",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index bd264ece96088e..9ce2612b77d2f3 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -90,8 +90,8 @@
"alt_text_modal.add_text_from_image": "Afegiu text d'una imatge",
"alt_text_modal.cancel": "Cancel·la",
"alt_text_modal.change_thumbnail": "Canvia la miniatura",
- "alt_text_modal.describe_for_people_with_hearing_impairments": "Descriu això per a persones amb problemes d'audició…",
- "alt_text_modal.describe_for_people_with_visual_impairments": "Descriu això per a persones amb problemes visuals…",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Descriviu això per a persones amb problemes d'audició…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Descriviu això per a persones amb problemes visuals…",
"alt_text_modal.done": "Fet",
"announcement.announcement": "Anunci",
"annual_report.summary.archetype.booster": "Sempre a la moda",
@@ -414,6 +414,7 @@
"ignore_notifications_modal.not_followers_title": "Voleu ignorar les notificacions de qui no us segueix?",
"ignore_notifications_modal.not_following_title": "Voleu ignorar les notificacions de qui no seguiu?",
"ignore_notifications_modal.private_mentions_title": "Voleu ignorar les notificacions de mencions privades no sol·licitades?",
+ "info_button.label": "Ajuda",
"interaction_modal.action.favourite": "Per a continuar heu d'afavorir des del vostre compte.",
"interaction_modal.action.follow": "Per a continuar heu de seguir des del vostre compte.",
"interaction_modal.action.reblog": "Per a continuar heu d'impulsar des del vostre compte.",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 05fb7200b50c64..66cc0727b6b33d 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Objevila se neočekávaná chyba.",
"alert.unexpected.title": "Jejda!",
"alt_text_badge.title": "Popisek",
+ "alt_text_modal.add_alt_text": "Přidat alt text",
+ "alt_text_modal.add_text_from_image": "Přidat text z obrázku",
+ "alt_text_modal.cancel": "Zrušit",
+ "alt_text_modal.change_thumbnail": "Změnit miniaturu",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Popište to pro osoby se sluchovým postižením…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Popište to pro osoby se zrakovým postižením…",
+ "alt_text_modal.done": "Hotovo",
"announcement.announcement": "Oznámení",
"annual_report.summary.archetype.booster": "Lovec obsahu",
"annual_report.summary.archetype.lurker": "Špión",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignorovat oznámení od lidí, kteří vás nesledují?",
"ignore_notifications_modal.not_following_title": "Ignorovat oznámení od lidí, které nesledujete?",
"ignore_notifications_modal.private_mentions_title": "Ignorovat oznámení z nevyžádaných soukromých zmínek?",
+ "info_button.label": "Nápověda",
+ "info_button.what_is_alt_text": "
Co je to alt text?
Alt text poskytuje popis obrázků pro lidi se zrakovými postižením, špatným připojením něbo těm, kteří potřebují více kontextu.
Můžete zlepšit přístupnost a porozumění napsáním jasného, stručného a objektivního alt textu.
Zachyťte důležité prvky
Shrňte text v obrázku
Použijte pravidelnou větnou skladbu
Vyhněte se nadbytečným informacím
U komplexních vizualizací (diagramy, mapy...) se zaměřte na trendy a klíčová zjištění
",
"interaction_modal.action.favourite": "Chcete-li pokračovat, musíte oblíbit z vašeho účtu.",
"interaction_modal.action.follow": "Chcete-li pokračovat, musíte sledovat z vašeho účtu.",
"interaction_modal.action.reblog": "Chcete-li pokračovat, musíte dát boost z vašeho účtu.",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 43539d366555ba..c40e230bfc5da4 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignorér notifikationer fra folk, som ikke er følgere?",
"ignore_notifications_modal.not_following_title": "Ignorér notifikationer fra folk, man ikke følger?",
"ignore_notifications_modal.private_mentions_title": "Ignorér notifikationer fra uopfordrede Private omtaler?",
+ "info_button.label": "Hjælp",
+ "info_button.what_is_alt_text": "
Hvad er alt-tekst?
Alt-tekst leverer billedbeskrivelser til folk med synsnedsættelser, lav båndbredde-forbindelser eller med ønske om ekstra kontekst.
Tilgængelighed og forståelse kan forbedres for alle ved at skrive klar, kortfattet og objektiv alt-tekst.
Fang vigtige elementer
Opsummér tekst i billeder
Brug almindelig sætningsstruktur
Undgå overflødig information
Fokusér på tendenser og centrale resultater i kompleks grafik (såsom diagrammer eller kort)
",
"interaction_modal.action.favourite": "For at fortsætte, skal man vælge Gør til favorit fra sin konto.",
"interaction_modal.action.follow": "For at fortsætte, skal man vælge Følg fra sin konto.",
"interaction_modal.action.reblog": "For at fortsætte, skal man vælge Genblog fra sin konto.",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 7a7d5d614c0672..1032271fc92b31 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -4,7 +4,7 @@
"about.disclaimer": "Mastodon ist eine freie, quelloffene Software und eine Marke der Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Grund unbekannt",
"about.domain_blocks.preamble": "Mastodon erlaubt es dir grundsätzlich, alle Inhalte von allen Nutzer*innen auf allen Servern im Fediverse zu sehen und mit ihnen zu interagieren. Für diesen Server gibt es aber ein paar Ausnahmen.",
- "about.domain_blocks.silenced.explanation": "Alle Inhalte und Profile dieses Servers werden zunächst nicht angezeigt. Du kannst die Profile und Inhalte aber dennoch sehen, wenn du explizit nach diesen suchst oder diesen folgst.",
+ "about.domain_blocks.silenced.explanation": "Standardmäßig werden von diesem Server keine Inhalte oder Profile angezeigt. Du kannst die Profile und Inhalte aber dennoch sehen, wenn du explizit nach diesen suchst oder diesen folgst.",
"about.domain_blocks.silenced.title": "Stummgeschaltet",
"about.domain_blocks.suspended.explanation": "Es werden keine Daten von diesem Server verarbeitet, gespeichert oder ausgetauscht, sodass eine Interaktion oder Kommunikation mit Nutzer*innen dieses Servers nicht möglich ist.",
"about.domain_blocks.suspended.title": "Gesperrt",
@@ -42,8 +42,8 @@
"account.hide_reblogs": "Geteilte Beiträge von @{name} ausblenden",
"account.in_memoriam": "Zum Andenken.",
"account.joined_short": "Mitglied seit",
- "account.languages": "Ausgewählte Sprachen ändern",
- "account.link_verified_on": "Das Profil mit dieser E-Mail-Adresse wurde bereits am {date} bestätigt",
+ "account.languages": "Sprache ändern.",
+ "account.link_verified_on": "Das Profil mit dieser E-Mail-Adresse wurde bereits am {date} verifiziert",
"account.locked_info": "Die Privatsphäre dieses Kontos wurde auf „geschützt“ gesetzt. Die Person bestimmt manuell, wer ihrem Profil folgen darf.",
"account.media": "Medien",
"account.mention": "@{name} erwähnen",
@@ -63,7 +63,7 @@
"account.share": "Profil von @{name} teilen",
"account.show_reblogs": "Geteilte Beiträge von @{name} anzeigen",
"account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
- "account.unblock": "Blockierung von @{name} aufheben",
+ "account.unblock": "{name} nicht mehr blockieren",
"account.unblock_domain": "Blockierung von {domain} aufheben",
"account.unblock_short": "Blockierung aufheben",
"account.unendorse": "Im Profil nicht mehr empfehlen",
@@ -72,12 +72,12 @@
"account.unmute_notifications_short": "Stummschaltung der Benachrichtigungen aufheben",
"account.unmute_short": "Stummschaltung aufheben",
"account_note.placeholder": "Klicken, um Notiz hinzuzufügen",
- "admin.dashboard.daily_retention": "Verweildauer der Benutzer*innen pro Tag nach der Registrierung",
- "admin.dashboard.monthly_retention": "Verweildauer der Benutzer*innen pro Monat nach der Registrierung",
+ "admin.dashboard.daily_retention": "Verweildauer der Nutzer*innen pro Tag nach der Registrierung",
+ "admin.dashboard.monthly_retention": "Verweildauer der Nutzer*innen pro Monat nach der Registrierung",
"admin.dashboard.retention.average": "Durchschnitt",
"admin.dashboard.retention.cohort": "Monat der Registrierung",
"admin.dashboard.retention.cohort_size": "Neue Konten",
- "admin.impact_report.instance_accounts": "Kontenprofile, die dadurch gelöscht würden",
+ "admin.impact_report.instance_accounts": "Profilkonten, die dadurch gelöscht würden",
"admin.impact_report.instance_followers": "Follower, die unsere Nutzer*innen verlieren würden",
"admin.impact_report.instance_follows": "Follower, die deren Nutzer*innen verlieren würden",
"admin.impact_report.title": "Zusammenfassung der Auswirkung",
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Benachrichtigungen von Profilen ignorieren, die dir nicht folgen?",
"ignore_notifications_modal.not_following_title": "Benachrichtigungen von Profilen ignorieren, denen du nicht folgst?",
"ignore_notifications_modal.private_mentions_title": "Benachrichtigungen von unerwünschten privaten Erwähnungen ignorieren?",
+ "info_button.label": "Hilfe",
+ "info_button.what_is_alt_text": "
Was ist Alt-Text?
Alt-Text bietet Bildbeschreibungen für Personen mit einer Sehschwäche, einer schlechten Internetverbindung und für alle, die zusätzlichen Kontext möchten.
Du kannst die Zugänglichkeit und die Verständlichkeit für alle verbessern, indem du eine klare, genaue und objektive Bildbeschreibung hinzufügst.
Erfasse wichtige Elemente
Fasse Text in Bildern zusammen
Verwende einen korrekten Satzbau
Vermeide unwichtige Informationen
Konzentriere dich bei komplexen Darstellungen (z. B. Diagramme oder Karten) auf Trends und wichtige Erkenntnisse
",
"interaction_modal.action.favourite": "Du musst von deinem Konto aus favorisieren, um fortzufahren.",
"interaction_modal.action.follow": "Du musst von deinem Konto aus folgen, um fortzufahren.",
"interaction_modal.action.reblog": "Du musst von deinem Konto aus teilen, um fortzufahren.",
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index dbbb2e9fec20e8..e45f9736143c4f 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.",
"alert.unexpected.title": "Ουπς!",
"alt_text_badge.title": "Εναλλακτικό κείμενο",
+ "alt_text_modal.add_alt_text": "Προσθήκη εναλλακτικού κειμένου",
+ "alt_text_modal.add_text_from_image": "Προσθήκη κειμένου από εικόνα",
+ "alt_text_modal.cancel": "Ακύρωση",
+ "alt_text_modal.change_thumbnail": "Αλλαγή μικρογραφίας",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Περιέγραψε αυτό για άτομα με προβλήματα ακοής…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Περιέγραψε αυτό για άτομα με προβλήματα όρασης…",
+ "alt_text_modal.done": "Ολοκληρώθηκε",
"announcement.announcement": "Ανακοίνωση",
"annual_report.summary.archetype.booster": "Ο κυνηγός των φοβερών",
"annual_report.summary.archetype.lurker": "Ο διακριτικός",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Αγνόηση ειδοποιήσεων από άτομα που δε σας ακολουθούν;",
"ignore_notifications_modal.not_following_title": "Αγνόηση ειδοποιήσεων από άτομα που δεν ακολουθείς;",
"ignore_notifications_modal.private_mentions_title": "Αγνόηση ειδοποιήσεων από μη ζητηθείσες ιδιωτικές αναφορές;",
+ "info_button.label": "Βοήθεια",
+ "info_button.what_is_alt_text": "Το εναλλακτικό κείμενο παρέχει περιγραφές εικόνας για άτομα με προβλήματα όρασης, διαδικτυακές συνδέσεις χαμηλής ταχύτητας ή για άτομα που αναζητούν επιπλέον περιεχόμενο.\\n\\nΜπορείς να βελτιώσεις την προσβασιμότητα και την κατανόηση για όλους, γράφοντας σαφές, συνοπτικό και αντικειμενικό εναλλακτικό κείμενο.\\n\\n
Κατέγραψε σημαντικά στοιχεία
\\n
Συνόψισε το κείμενο στις εικόνες
\\n
Χρησιμοποίησε δομή κανονικής πρότασης
\\n
Απέφυγε περιττές πληροφορίες
\\n
Εστίασε στις τάσεις και τα βασικά ευρήματα σε σύνθετα οπτικά στοιχεία (όπως διαγράμματα ή χάρτες)
",
"interaction_modal.action.favourite": "Για να συνεχίσεις, θα πρέπει να αγαπήσεις από τον λογαριασμό σου.",
"interaction_modal.action.follow": "Για να συνεχίσεις, θα πρέπει να ακολουθήσεις από τον λογαριασμό σου.",
"interaction_modal.action.reblog": "Για να συνεχίσεις, θα πρέπει να αναδημοσιεύσεις από τον λογαριασμό σου.",
@@ -457,6 +466,7 @@
"keyboard_shortcuts.toggle_hidden": "Εμφάνιση/απόκρυψη κειμένου πίσω από το CW",
"keyboard_shortcuts.toggle_sensitivity": "Εμφάνιση/απόκρυψη πολυμέσων",
"keyboard_shortcuts.toot": "Δημιουργία νέας ανάρτησης",
+ "keyboard_shortcuts.translate": "να μεταφράσει μια δημοσίευση",
"keyboard_shortcuts.unfocus": "Αποεστίαση του πεδίου σύνθεσης/αναζήτησης",
"keyboard_shortcuts.up": "Μετακίνηση προς τα πάνω στη λίστα",
"lightbox.close": "Κλείσιμο",
@@ -836,6 +846,7 @@
"status.reblogs.empty": "Κανείς δεν ενίσχυσε αυτή την ανάρτηση ακόμα. Μόλις το κάνει κάποιος, θα εμφανιστεί εδώ.",
"status.redraft": "Σβήσε & ξαναγράψε",
"status.remove_bookmark": "Αφαίρεση σελιδοδείκτη",
+ "status.remove_favourite": "Κατάργηση από τα αγαπημένα",
"status.replied_in_thread": "Απαντήθηκε σε νήμα",
"status.replied_to": "Απάντησε στον {name}",
"status.reply": "Απάντησε",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index 5983dc3527eb17..70a194e1fb6013 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "An unexpected error occurred.",
"alert.unexpected.title": "Oops!",
"alt_text_badge.title": "Alt text",
+ "alt_text_modal.add_alt_text": "Add alt text",
+ "alt_text_modal.add_text_from_image": "Add text from image",
+ "alt_text_modal.cancel": "Cancel",
+ "alt_text_modal.change_thumbnail": "Change thumbnail",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Describe this for people with hearing impairments…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Describe this for people with visual impairments…",
+ "alt_text_modal.done": "Done",
"announcement.announcement": "Announcement",
"annual_report.summary.archetype.booster": "The cool-hunter",
"annual_report.summary.archetype.lurker": "The lurker",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignore notifications from people not following you?",
"ignore_notifications_modal.not_following_title": "Ignore notifications from people you don't follow?",
"ignore_notifications_modal.private_mentions_title": "Ignore notifications from unsolicited Private Mentions?",
+ "info_button.label": "Help",
+ "info_button.what_is_alt_text": "
What is alt text?
Alt text provides image descriptions for people with vision impairments, low-bandwidth connections, or those seeking extra context.
You can improve accessibility and understanding for everyone by writing clear, concise, and objective alt text.
Capture important elements
Summarise text in images
Use regular sentence structure
Avoid redundant information
Focus on trends and key findings in complex visuals (like diagrams or maps)
",
"interaction_modal.action.favourite": "To continue, you need to favourite from your account.",
"interaction_modal.action.follow": "To continue, you need to follow from your account.",
"interaction_modal.action.reblog": "To continue, you need to reblog from your account.",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index ac05c0f53eecde..a2dedd22d5a8be 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignore notifications from people not following you?",
"ignore_notifications_modal.not_following_title": "Ignore notifications from people you don't follow?",
"ignore_notifications_modal.private_mentions_title": "Ignore notifications from unsolicited Private Mentions?",
+ "info_button.label": "Help",
+ "info_button.what_is_alt_text": "
What is alt text?
Alt text provides image descriptions for people with vision impairments, low-bandwidth connections, or those seeking extra context.
You can improve accessibility and understanding for everyone by writing clear, concise, and objective alt text.
Capture important elements
Summarize text in images
Use regular sentence structure
Avoid redundant information
Focus on trends and key findings in complex visuals (like diagrams or maps)
",
"interaction_modal.action.favourite": "To continue, you need to favorite from your account.",
"interaction_modal.action.follow": "To continue, you need to follow from your account.",
"interaction_modal.action.reblog": "To continue, you need to reblog from your account.",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 9a38b6fc618f04..4679623b023f7a 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ĉu ignori sciigojn de homoj, kiuj ne sekvas vin?",
"ignore_notifications_modal.not_following_title": "Ĉu ignori sciigojn de homoj, kiujn vi ne sekvas?",
"ignore_notifications_modal.private_mentions_title": "Ĉu ignori sciigojn de nepetitaj privataj mencioj?",
+ "info_button.label": "Helpo",
+ "info_button.what_is_alt_text": "
Kio estas la alternativa teksto?
La alternativa teksto ofertas priskribojn de la bildoj por individuoj kun vidaj malfacilaĵoj, konektoj kun malalta larĝa bando aŭ kiuj serĉas plian kuntekston.
Vi povas plibonigi alireblecon kaj komprenon por ĉiuj per skribado de klaraj, koncizaj, kaj objektivaj alternativaj tekstoj.
Kaptu gravajn elementojn.
Resumu tekston en bildoj.
Uzu regulan frazstrukturon.
Evitu redundan informon.
Fokusu sur tendencoj kaj ĉefaj trovoj en kompleksaj visualoj (kiel diagramoj aŭ mapoj).
",
"interaction_modal.action.favourite": "Por daŭrigi, vi devas stelumi el via konto.",
"interaction_modal.action.follow": "Por daŭrigi, vi devas sekvi el via konto.",
"interaction_modal.action.reblog": "Por daŭrigi, vi devas diskonigi el via konto.",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index e56ca403d99b00..5bef46bd3e45c4 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de cuentas que no te siguen?",
"ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de cuentas a las que no seguís?",
"ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?",
+ "info_button.label": "Ayuda",
+ "info_button.what_is_alt_text": "
¿Qué es el texto alternativo?
El texto alternativo proporciona descripciones de las imágenes para personas con dificultades visuales, conexiones con escaso ancho de banda o que buscan un contexto adicional.
Podés mejorar la accesibilidad y la comprensión para todos escribiendo un texto alternativo claro, conciso y objetivo.
Captura los elementos importantes.
Resumí el texto en imágenes.
Usá una estructura de frases normal.
Evitá la información redundante.
Focalizate en las tendencias y conclusiones clave de los elementos visuales complejos (como diagramas o mapas).
",
"interaction_modal.action.favourite": "Para continuar, tenés que marcar como favorito desde tu cuenta.",
"interaction_modal.action.follow": "Para continuar, tenés que seguir desde tu cuenta.",
"interaction_modal.action.reblog": "Para continuar, tenés que adherir desde tu cuenta.",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index 428153e5b148b7..473b489a0b59b2 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -28,7 +28,7 @@
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
"account.endorse": "Destacar en mi perfil",
"account.featured_tags.last_status_at": "Última publicación el {date}",
- "account.featured_tags.last_status_never": "No hay publicaciones",
+ "account.featured_tags.last_status_never": "Sin publicaciones",
"account.featured_tags.title": "Etiquetas destacadas de {name}",
"account.follow": "Seguir",
"account.follow_back": "Seguir también",
@@ -146,7 +146,7 @@
"column.about": "Acerca de",
"column.blocks": "Usuarios bloqueados",
"column.bookmarks": "Marcadores",
- "column.community": "Línea de tiempo local",
+ "column.community": "Cronología local",
"column.create_list": "Crear lista",
"column.direct": "Menciones privadas",
"column.directory": "Buscar perfiles",
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te siguen?",
"ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?",
"ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?",
+ "info_button.label": "Ayuda",
+ "info_button.what_is_alt_text": "
¿Qué es el texto alternativo?
El texto alternativo ofrece descripciones de las imágenes para individuos con dificultades visuales, conexiones de bajo ancho de banda o que buscan un contexto adicional.
Puedes mejorar la accesibilidad y la comprensión para todos redactando un texto alternativo claro, breve y objetivo.
Captura los elementos clave.
Resume el texto en imágenes.
Utiliza una estructura de oraciones estándar.
Evita la información repetitiva.
Enfócate en las tendencias y conclusiones principales de los elementos visuales complejos (como gráficos o mapas).
",
"interaction_modal.action.favourite": "Para continuar, debes marcar como favorito desde tu cuenta.",
"interaction_modal.action.follow": "Para continuar, debes seguir desde tu cuenta.",
"interaction_modal.action.reblog": "Para continuar, debes impulsar desde tu cuenta.",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index e014f967903d37..ba903ceaa72421 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "¿Ignorar notificaciones de personas que no te siguen?",
"ignore_notifications_modal.not_following_title": "¿Ignorar notificaciones de personas a las que no sigues?",
"ignore_notifications_modal.private_mentions_title": "¿Ignorar notificaciones de menciones privadas no solicitadas?",
+ "info_button.label": "Ayuda",
+ "info_button.what_is_alt_text": "
¿Qué es el texto alternativo?
El texto alternativo proporciona descripciones de las imágenes para personas con problemas de visión, conexiones con poco ancho de banda o que buscan un contexto adicional.
Puedes mejorar la accesibilidad y la comprensión para todos escribiendo un texto alternativo claro, conciso y objetivo.
Captura los elementos importantes.
Resume el texto en imágenes.
Usa una estructura de frases normal.
Evita la información redundante.
Céntrate en las tendencias y conclusiones clave de los elementos visuales complejos (como diagramas o mapas).
",
"interaction_modal.action.favourite": "Para continuar, tienes que marcar como favorito desde tu cuenta.",
"interaction_modal.action.follow": "Para continuar, tienes que seguir desde tu cuenta.",
"interaction_modal.action.reblog": "Para continuar, tienes que impulsar desde tu cuenta.",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index de98e7a4f503c3..bd86e984aad282 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Tekkis ootamatu viga.",
"alert.unexpected.title": "Oih!",
"alt_text_badge.title": "Alternatiivtekst",
+ "alt_text_modal.add_alt_text": "Lisa alt-tekst",
+ "alt_text_modal.add_text_from_image": "Lisa tekst pildilt",
+ "alt_text_modal.cancel": "Tühista",
+ "alt_text_modal.change_thumbnail": "Muuda pisipilti",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Kirjelda seda kuulmispuudega inimeste jaoks…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Kirjelda seda nägemispuudega inimeste jaoks…",
+ "alt_text_modal.done": "Valmis",
"announcement.announcement": "Teadaanne",
"annual_report.summary.archetype.booster": "Ägesisu küttija",
"annual_report.summary.archetype.lurker": "Hiilija",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignoreeri inimeste teavitusi, kes sind ei jälgi?",
"ignore_notifications_modal.not_following_title": "Ignoreeri inimeste teavitusi, keda sa ei jälgi?",
"ignore_notifications_modal.private_mentions_title": "Ignoreeri soovimatute eraviisiliste mainimiste teateid?",
+ "info_button.label": "Abi",
+ "info_button.what_is_alt_text": "
Mis on alt-tekst?
Alt-tekst pakub pildi kirjeldust nägemispuudega inimeste jaoks või neile, kel on aeglane internet või neile, kes otsivad lisaselgitust
Saad parandada ligipääsetavust ja mõistmist kõigi jaoks, kirjutades selge, lühida ja objektiivse alt-teksti.
Lisa tähtsad elemendid
Tee pildil olevast tekstist kokkuvõte
Kasuta reeglipärast lausestruktuuri
Väldi ebaolulist infot
Keskendu keerukate vaadete puhul (näiteks diagrammid ja kaardid) puhul trendidele ja põhiseostele
",
"interaction_modal.action.favourite": "Jätkamiseks pead oma konto alt lemmikuks märkima.",
"interaction_modal.action.follow": "Jätkamiseks pead oma konto alt lemmikuks märkima.",
"interaction_modal.action.reblog": "Jätkamiseks pead jagama oma konto alt.",
@@ -457,6 +466,7 @@
"keyboard_shortcuts.toggle_hidden": "Näita/peida teksti hoiatuse taga",
"keyboard_shortcuts.toggle_sensitivity": "Näita/peida meediat",
"keyboard_shortcuts.toot": "Alusta uut postitust",
+ "keyboard_shortcuts.translate": "postituse tõlkimiseks",
"keyboard_shortcuts.unfocus": "Fookus tekstialalt/otsingult ära",
"keyboard_shortcuts.up": "Liigu loetelus üles",
"lightbox.close": "Sulge",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index f201baa2897cdd..1341bb17f3872d 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -86,12 +86,18 @@
"alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
"alert.unexpected.title": "Ene!",
"alt_text_badge.title": "Testu alternatiboa",
+ "alt_text_modal.add_alt_text": "Gehitu ordezko testua",
+ "alt_text_modal.add_text_from_image": "Gehitu testua iruditik",
+ "alt_text_modal.cancel": "Utzi",
+ "alt_text_modal.change_thumbnail": "Aldatu koadro txikia",
+ "alt_text_modal.done": "Egina",
"announcement.announcement": "Iragarpena",
"annual_report.summary.followers.followers": "jarraitzaileak",
"annual_report.summary.followers.total": "{count} guztira",
"annual_report.summary.highlighted_post.by_favourites": "egindako bidalketa gogokoena",
"annual_report.summary.highlighted_post.by_reblogs": "egindako bidalketa zabalduena",
"annual_report.summary.highlighted_post.by_replies": "erantzun gehien izan dituen bidalketa",
+ "annual_report.summary.highlighted_post.possessive": "{name}-(r)ena",
"annual_report.summary.most_used_app.most_used_app": "app erabiliena",
"annual_report.summary.most_used_hashtag.most_used_hashtag": "traola erabiliena",
"annual_report.summary.most_used_hashtag.none": "Bat ere ez",
@@ -120,6 +126,7 @@
"bundle_column_error.routing.body": "Eskatutako orria ezin izan da aurkitu. Ziur helbide-barrako URLa zuzena dela?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "Itxi",
+ "bundle_modal_error.message": "Zerbait okerra gertatu da pantaila hau kargatzean.",
"bundle_modal_error.retry": "Saiatu berriro",
"closed_registrations.other_server_instructions": "Mastodon deszentralizatua denez, beste kontu bat sortu dezakezu beste zerbitzari batean eta honekin komunikatu.",
"closed_registrations_modal.description": "Une honetan ezin da konturik sortu {domain} zerbitzarian, baina kontuan izan Mastodon erabiltzeko ez duzula zertan konturik izan zehazki {domain} zerbitzarian.",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 576b1847c5518a..625acc01a97d4b 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -101,7 +101,7 @@
"annual_report.summary.archetype.replier": "پاسخگو",
"annual_report.summary.followers.followers": "دنبال کننده",
"annual_report.summary.followers.total": "در مجموع {count}",
- "annual_report.summary.here_it_is": "بازبینی {year}تان:",
+ "annual_report.summary.here_it_is": "بازبینی {year} تان:",
"annual_report.summary.highlighted_post.by_favourites": "پرپسندترین فرسته",
"annual_report.summary.highlighted_post.by_reblogs": "پرتقویتترین فرسته",
"annual_report.summary.highlighted_post.by_replies": "پرپاسخترین فرسته",
@@ -175,7 +175,7 @@
"community.column_settings.media_only": "فقط رسانه",
"community.column_settings.remote_only": "تنها دوردست",
"compose.language.change": "تغییر زبان",
- "compose.language.search": "جستوجوی زبانها…",
+ "compose.language.search": "جستوجوی زبانها...",
"compose.published.body": "فرسته منتشر شد.",
"compose.published.open": "گشودن",
"compose.saved.body": "فرسته ذخیره شد.",
@@ -256,7 +256,7 @@
"domain_block_modal.they_cant_follow": "هیچکسی از این کارساز نمیتواند پیتان بگیرد.",
"domain_block_modal.they_wont_know": "نخواهند دانست که مسدود شدهاند.",
"domain_block_modal.title": "انسداد دامنه؟",
- "domain_block_modal.you_will_lose_num_followers": "تعداد {followersCount, plural,other {{followersCount}}} پیگیرنده و {followingCount, plural,other {{followingCount}}} شخص پیگرفته شده را از دست خواهید داد.",
+ "domain_block_modal.you_will_lose_num_followers": "شما {followersCount, plural, one {{followersCountDisplay} پیگیرنده} other {{followersCountDisplay} پیگیرنده}} و {followingCount, plural, one {{followingCountDisplay} فرد پیگرفتهشده} other {{followingCountDisplay} فرد پیگرفتهشده}} را از دست خواهید داد.",
"domain_block_modal.you_will_lose_relationships": "شما تمام پیگیرکنندگان و افرادی که از این کارساز پیگیری میکنید را از دست خواهید داد.",
"domain_block_modal.you_wont_see_posts": "فرستهها یا آگاهیها از کاربران روی این کارساز را نخواهید دید.",
"domain_pill.activitypub_lets_connect": "این به شما اجازه میدهد تا نه تنها در ماستودون، بلکه در برنامههای اجتماعی مختلف نیز با افراد ارتباط برقرار کرده و تعامل داشته باشید.",
@@ -304,7 +304,7 @@
"empty_column.follow_requests": "شما هنوز هیچ درخواست پیگیریای ندارید. هنگامی که چنین درخواستی بگیرید، اینجا نشان داده خواهد شد.",
"empty_column.followed_tags": "شما هیچ برچسبی را پینگرفتید. هنگامی که برچسبی را پیگیری کنید اینجا نمایان میشوند.",
"empty_column.hashtag": "هنوز هیچ چیزی در این برچسب نیست.",
- "empty_column.home": "خط زمانی خانگیتان خالی است! برای پر کردنش، افراد بیشتری را پی بگیرید. {suggestions}",
+ "empty_column.home": "خط زمانی خانگیتان خالی است! برای پر کردنش، افراد بیشتری را پی بگیرید.",
"empty_column.list": "هنوز چیزی در این سیاهه نیست. هنگامی که اعضایش فرستههای جدیدی بفرستند، اینجا ظاهر خواهند شد.",
"empty_column.mutes": "هنوز هیچ کاربری را خموش نکردهاید.",
"empty_column.notification_requests": "همه چیز تمیز است! هیچچیزی اینجا نیست. هنگامی که آگاهیهای جدیدی دریافت کنید، بسته به تنظیماتتان اینجا ظاهر خواهند شد.",
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "چشمپوشی از آگاهیهای افرادی که پیتان نمیگیرند؟",
"ignore_notifications_modal.not_following_title": "چشمپوشی از آگاهیهای افرادی که پیشان نمیگیرید؟",
"ignore_notifications_modal.private_mentions_title": "چشمپوشی از نامبریهای خصوصی ناخواسته؟",
+ "info_button.label": "راهنما",
+ "info_button.what_is_alt_text": "
متن جایگزین چیست؟
متن جایگزین توضیحات تصویری را برای افراد دارای اختلالات بینایی، اتصالات با پهنای باند کم یا کسانی که به دنبال زمینه اضافی هستند ارائه می دهد.
با نوشتن متن جایگزین واضح، مختصر و عینی می توانید دسترسی و درک را برای همه بهبود بخشید.
عناصر مهم را ضبط کنید
متن را در تصاویر خلاصه کنید
از ساختار جمله منظم استفاده کنید
از اطلاعات اضافی خودداری کنید
روی روندها و یافته های کلیدی در تصاویر پیچیده (مانند نمودارها یا نقشه ها) تمرکز کنید.
",
"interaction_modal.action.favourite": "برای ادامه، باید از حساب خود به دلخواه انتخاب کنید.",
"interaction_modal.action.follow": "برای ادامه، باید از حساب کاربری خود دنبال کنید.",
"interaction_modal.action.reblog": "برای ادامه، باید از حساب خود مجددا بلاگ کنید.",
@@ -551,7 +553,7 @@
"notification.admin.report_statuses_other": "{name}، {target} را گزارش داد",
"notification.admin.sign_up": "{name} ثبت نام کرد",
"notification.admin.sign_up.name_and_others": "{name} و {count, plural, one {# نفر دیگر} other {# نفر دیگر}} ثبتنام کردند",
- "notification.annual_report.message": "آمار #Wrapstodon {year}تان منتظر است! لحظههای به یاد ماندنی و نقاط پررنگ سال را روی ماستودون رونمایی کنید!",
+ "notification.annual_report.message": "آمار #Wrapstodon {year} تان منتظر است! لحظههای به یاد ماندنی و نقاط پررنگ سال را روی ماستودون رونمایی کنید!",
"notification.annual_report.view": "دیدن #Wrapstodon",
"notification.favourite": "{name} فرستهتان را برگزید",
"notification.favourite.name_and_others_with_link": "{name} و {count, plural, one {# نفر دیگر} other {# نفر دیگر}} فرستهتان را برگزیدند",
@@ -799,7 +801,7 @@
"server_banner.is_one_of_many": "{domain} یکی از بسیاری از سرورهای مستقل ماستودون است که می توانید از آن برای شرکت در fediverse استفاده کنید.",
"server_banner.server_stats": "آمار کارساز:",
"sign_in_banner.create_account": "ایجاد حساب",
- "sign_in_banner.follow_anyone": "هر کسی را در سراسر fediverse دنبال کنید و همه را به ترتیب زمانی ببینید. هیچ الگوریتم، تبلیغات یا طعمه کلیکی در چشم نیست.",
+ "sign_in_banner.follow_anyone": "هر کسی را در سراسر فدیورس دنبال کنید و همه را به ترتیب زمانی ببینید. هیچ الگوریتم، تبلیغات یا طعمه کلیکی در چشم نیست.",
"sign_in_banner.mastodon_is": "ماستودون بهترین راه برای پیگیری اتفاقات است.",
"sign_in_banner.sign_in": "ورود",
"sign_in_banner.sso_redirect": "ورود یا ثبت نام",
@@ -888,7 +890,7 @@
"upload_form.drag_and_drop.on_drag_over": "پیوست رسانه {item} منتقل شد.",
"upload_form.drag_and_drop.on_drag_start": "پیوست رسانه {item} برداشته شد.",
"upload_form.edit": "ویرایش",
- "upload_progress.label": "در حال بارگذاری…",
+ "upload_progress.label": "در حال بارگذاری...",
"upload_progress.processing": "در حال پردازش…",
"username.taken": "این نام کاربری گرفته شده. نام دیگری امتحان کنید",
"video.close": "بستن ویدیو",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 2d6598c20de5a1..2b1929a3132665 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Tapahtui odottamaton virhe.",
"alert.unexpected.title": "Hups!",
"alt_text_badge.title": "Vaihtoehtoinen teksti",
+ "alt_text_modal.add_alt_text": "Lisää vaihtoehtoinen teksti",
+ "alt_text_modal.add_text_from_image": "Lisää teksti kuvasta",
+ "alt_text_modal.cancel": "Peruuta",
+ "alt_text_modal.change_thumbnail": "Vaihda pikkukuva",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Kuvaile tätä kuulovammallisille ihmisille…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Kuvaile tätä näkövammallisille ihmisille…",
+ "alt_text_modal.done": "Valmis",
"announcement.announcement": "Tiedote",
"annual_report.summary.archetype.booster": "Tehostaja",
"annual_report.summary.archetype.lurker": "Lymyilijä",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Sivuutetaanko ilmoitukset käyttäjiltä, jotka eivät seuraa sinua?",
"ignore_notifications_modal.not_following_title": "Sivuutetaanko ilmoitukset käyttäjiltä, joita et seuraa?",
"ignore_notifications_modal.private_mentions_title": "Sivuutetaanko ilmoitukset pyytämättömistä yksityismaininnoista?",
+ "info_button.label": "Ohje",
+ "info_button.what_is_alt_text": "
Mikä vaihtoehtoinen teksti on?
Vaihtoehtoinen teksti tarjoaa kuvauksen kuvista ihmisille, joilla on näkövamma tai matalan kaistanleveyden yhteys tai jotka kaipaavat lisäkontekstia.
Voit parantaa saavutettavuutta ja ymmärrettävyyttä kaikkien näkökulmasta kirjoittamalla selkeän, tiiviin ja objektiivisen vaihtoehtoisen tekstin.
Ota mukaan tärkeät elementit
Tiivistä kuvissa oleva teksti
Käytä tavallisia lauserakenteita
Vältä turhaa tietoa
Keskity trendeihin ja keskeisiin tuloksiin monimutkaisissa visuaalisissa esityksissä (kuten kaavioissa tai kartoissa)
",
"interaction_modal.action.favourite": "Jotta voit jatkaa, sinun tulee lisätä julkaisu suosikiksesi omalta tililtäsi.",
"interaction_modal.action.follow": "Jotta voit jatkaa, sinun tulee seurata käyttäjää omalta tililtäsi.",
"interaction_modal.action.reblog": "Jotta voit jatkaa, sinun tulee uudelleenjulkaista omalta tililtäsi.",
diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json
index 7530ffcc6d73d5..42677ebe56dd6b 100644
--- a/app/javascript/mastodon/locales/fo.json
+++ b/app/javascript/mastodon/locales/fo.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Lat sum um tú ikki sær fráboðanir frá fólki, sum ikki fylgja tær?",
"ignore_notifications_modal.not_following_title": "Lat sum um tú ikki sær fráboðanir frá fólki, sum tú ikki fylgir?",
"ignore_notifications_modal.private_mentions_title": "Lat sum um tú ikki sær fráboðanir frá óbiðnum privatum umrøðum?",
+ "info_button.label": "Hjálp",
+ "info_button.what_is_alt_text": "
Hvat er alt tekstur?
Alt tekstur lýsir myndir fyri fólki, sum síggja illa, ella sum hava ringt net samband ella tey, sum vilja vita meira um samanhangin.
Tú kanst bøta um atkomuna og fatanina hjá øllum við at skriva kláran, stuttan og objektivan alt tekst.
Fanga týdningarmikil element
Samanfata tekst í myndum
Brúka reglubundnan setningsbygnað
Lat vera við at siga ting upp í saman
Fokusera á rák og høvuðsúrslit í kompleksum myndum (sosum diagrammir og kort)
",
"interaction_modal.action.favourite": "Fyri at halda fram, so mást tú yndismerkja frá tínari kontu.",
"interaction_modal.action.follow": "Fyri at halda fram, mást tú fylgja frá tínari kontu.",
"interaction_modal.action.reblog": "Fyri at halda fram, mást tú endurblogga frá tínari kontu.",
diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json
index 3f72cc9e07cb66..2fddca9f1688b7 100644
--- a/app/javascript/mastodon/locales/fr-CA.json
+++ b/app/javascript/mastodon/locales/fr-CA.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignorer les notifications provenant des personnes qui ne vous suivent pas ?",
"ignore_notifications_modal.not_following_title": "Ignorer les notifications provenant des personnes que vous ne suivez pas ?",
"ignore_notifications_modal.private_mentions_title": "Ignorer les notifications issues des mentions privées non sollicitées ?",
+ "info_button.label": "Aide",
+ "info_button.what_is_alt_text": "
Qu'est-ce que le texte alternatif ?
Un texte alternatif fournit une description de l'image aux personnes avec un handicap visuel ou une connexion limitée ou qui souhaitent avoir un contexte supplémentaire.
Vous pouvez améliorer l'accessibilité et la compression de tout le monde en écrivant un texte alternatif clair, concis et objectif.
Identifiez les éléments importants
Résumez le texte présent à l'image
Utilisez une structure de phrase normale
Évitez les informations redondantes
Pour les visuels complexes (tels que les diagrammes ou les cartes), indiquez les tendances ou points-clés
",
"interaction_modal.action.favourite": "Pour continuer, vous devez ajouter en favori depuis votre compte.",
"interaction_modal.action.follow": "Pour continuer, vous devez suivre depuis votre compte.",
"interaction_modal.action.reblog": "Pour continuer, vous devez booster depuis votre compte.",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 1de6672353766a..1660132fedb8b4 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignorer les notifications provenant des personnes qui ne vous suivent pas ?",
"ignore_notifications_modal.not_following_title": "Ignorer les notifications provenant des personnes que vous ne suivez pas ?",
"ignore_notifications_modal.private_mentions_title": "Ignorer les notifications issues des mentions privées non sollicitées ?",
+ "info_button.label": "Aide",
+ "info_button.what_is_alt_text": "
Qu'est-ce que le texte alternatif ?
Un texte alternatif fournit une description de l'image aux personnes avec un handicap visuel ou une connexion limitée ou qui souhaitent avoir un contexte supplémentaire.
Vous pouvez améliorer l'accessibilité et la compression de tout le monde en écrivant un texte alternatif clair, concis et objectif.
Identifiez les éléments importants
Résumez le texte présent à l'image
Utilisez une structure de phrase normale
Évitez les informations redondantes
Pour les visuels complexes (tels que les diagrammes ou les cartes), indiquez les tendances ou points-clés
",
"interaction_modal.action.favourite": "Pour continuer, vous devez ajouter en favori depuis votre compte.",
"interaction_modal.action.follow": "Pour continuer, vous devez suivre depuis votre compte.",
"interaction_modal.action.reblog": "Pour continuer, vous devez booster depuis votre compte.",
@@ -549,7 +551,7 @@
"notification.admin.report_account_other": "{name} a signalé {count, plural, one {un message} other {# messages}} depuis {target}",
"notification.admin.report_statuses": "{name} a signalé {target} pour {category}",
"notification.admin.report_statuses_other": "{name} a signalé {target}",
- "notification.admin.sign_up": "{name} s'est inscrit",
+ "notification.admin.sign_up": "{name} s'est inscrit·e",
"notification.admin.sign_up.name_and_others": "{name} et {count, plural, one {# autre} other {# autres}} se sont inscrit",
"notification.annual_report.message": "Votre {year} #Wrapstodon attend ! Dévoilez les moments forts et mémorables de votre année sur Mastodon !",
"notification.annual_report.view": "Voir #Wrapstodon",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 700815db49b244..87c8e939ee8125 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignorar notificacións de persoas que non te seguen?",
"ignore_notifications_modal.not_following_title": "Ignorar notificacións de persoas que non segues?",
"ignore_notifications_modal.private_mentions_title": "Ignorar notificacións de Mencións Privadas non solicitadas?",
+ "info_button.label": "Axuda",
+ "info_button.what_is_alt_text": "
Que é o Texto Alternativo?
O Text Alt proporciona a descrición das imaxes para as persoas con deficiencias visuais, conexións a internet de baixa calidade ou para engadir contexto ás mesmas.
Podes mellorar a accesibilidade e a comprensión da publicación ao escribir un texto alternativo claro, conciso e obxectivo.
Identifica os elementos importantes
Inclúe o texto que apareza nas imaxes
Utiliza sintaxe estándar nas frases
Evita información redundante
Céntrate nos elementos principais cando sexan imaxes complexas (como diagramas ou mapas)
",
"interaction_modal.action.favourite": "Para continuar, debes favorecer desde a túa conta.",
"interaction_modal.action.follow": "Para continuar, debes facer seguimento desde a túa conta.",
"interaction_modal.action.reblog": "Para continuar, debes promover desde a túa conta.",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 5b43bd0b847827..22481cfe5bc7f4 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "להתעלם מהתראות מא.נשים שאינם עוקביך?",
"ignore_notifications_modal.not_following_title": "להתעלם מהתראות מא.נשים שאינם נעקביך?",
"ignore_notifications_modal.private_mentions_title": "להתעלם מהתראות מאיזכורים פרטיים?",
+ "info_button.label": "עזרה",
+ "info_button.what_is_alt_text": "
מהו כיתוב חלופי?
כיתוב חלופי משמש תיאור מילולי של תמונות לסובלים ממגבלות ראיה, חיבורי רשת איטיים, או אלו הצריכים הקשר יותר מפורט לתוכן המולטימדיה המצורף.
ניתן לשפר את הנגישות והבנת התוכן לכולם ע\"י כתיבת תיאור ברור, תמציתי ונטול פניות.
כיסוי היסודות החשובים
סיכום המלל שבתמונות
שימוש במבנה משפטים רגיל
יש להמנע מחזרה על מידע
אם העזרים הויזואליים הם דיאגרמות או מפות, התמקדו במגמות וממצאים מרכזיים.
",
"interaction_modal.action.favourite": "כדי להמשיך, עליך לחבב מחשבונך.",
"interaction_modal.action.follow": "כדי להמשיך, עליך לעקוב מחשבונך.",
"interaction_modal.action.reblog": "כדי להמשיך, עליך להדהד מחשבונך.",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 664c0c58db8e24..ab8ee642499615 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Váratlan hiba történt.",
"alert.unexpected.title": "Hoppá!",
"alt_text_badge.title": "Helyettesítő szöveg",
+ "alt_text_modal.add_alt_text": "Helyettesítő szöveg hozzáadása",
+ "alt_text_modal.add_text_from_image": "Szöveg hozzáadása a képből",
+ "alt_text_modal.cancel": "Mégse",
+ "alt_text_modal.change_thumbnail": "Bélyegkép megváltoztatása",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Írd le a hallássérültek számára…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Írd le a látássérültek számára…",
+ "alt_text_modal.done": "Kész",
"announcement.announcement": "Közlemény",
"annual_report.summary.archetype.booster": "A cool-vadász",
"annual_report.summary.archetype.lurker": "A settenkedő",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Nem követőktől érkező értesítések figyelmen kívül hagyása?",
"ignore_notifications_modal.not_following_title": "Nem követettektől érkező értesítések figyelmen kívül hagyása?",
"ignore_notifications_modal.private_mentions_title": "Figyelmen kívül hagyod a kéretlen privát említéseket?",
+ "info_button.label": "Súgó",
+ "info_button.what_is_alt_text": "
Mi az alternatív szöveg?
Az alternatív szöveg képleírást biztosít a látássérültek, az alacsony sávszélességű kapcsolatokkal rendelkezők, illetve a bővebb kontextust keresők számára.
Az egyértelmű, tömör és objektív alternatív szöveg megírásával mindenki számára akadálymentesebb és könnyebben érthető lesz.
Rögzítsd a fontos elemeket.
Foglald össze szövegesen a képeket.
Használj szabályos mondatszerkezetet.
Kerüld a felesleges információkat.
Összetett vizuális ábrákon (például diagramokon vagy térképeken) összpontosíts a trendekre és a legfontosabb megállapításokra.
",
"interaction_modal.action.favourite": "A folytatáshoz a fiókodból kell kedvencnek jelölnöd.",
"interaction_modal.action.follow": "A folytatáshoz a fiókodból kell követned.",
"interaction_modal.action.reblog": "A folytatáshoz a fiókodból kell megosztanod.",
diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index a39f4939577793..fc3194e4dda8df 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -89,6 +89,7 @@
"alt_text_modal.add_text_from_image": "Adder texto ab imagine",
"alt_text_modal.cancel": "Cancellar",
"alt_text_modal.change_thumbnail": "Cambiar le miniatura",
+ "alt_text_modal.done": "Preste",
"announcement.announcement": "Annuncio",
"annual_report.summary.archetype.booster": "Le impulsator",
"annual_report.summary.archetype.lurker": "Le lector",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index ee0e38140bdbe6..743c4cad828b43 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Upp kom óvænt villa.",
"alert.unexpected.title": "Úbbs!",
"alt_text_badge.title": "Hjálpartexti mynda",
+ "alt_text_modal.add_alt_text": "Bæta við hjálpartexta",
+ "alt_text_modal.add_text_from_image": "Bæta við texta úr mynd",
+ "alt_text_modal.cancel": "Hætta við",
+ "alt_text_modal.change_thumbnail": "Skipta um smámynd",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Lýstu þessu fyrir fólk með skerta heyrn…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Lýstu þessu fyrir fólk með skerta sjón…",
+ "alt_text_modal.done": "Lokið",
"announcement.announcement": "Auglýsing",
"annual_report.summary.archetype.booster": "Svali gaurinn",
"annual_report.summary.archetype.lurker": "Lurkurinn",
@@ -407,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Hunsa tilkynningar frá fólki sem fylgist ekki með þér?",
"ignore_notifications_modal.not_following_title": "Hunsa tilkynningar frá fólki sem þú fylgist ekki með?",
"ignore_notifications_modal.private_mentions_title": "Hunsa tilkynningar frá óumbeðnum tilvísunum í einkaspjalli?",
+ "info_button.label": "Hjálp",
+ "info_button.what_is_alt_text": "
Hvað er alt-texti?
Hjálpartexti eða ALT-myndatexti inniheldur lýsingu á myndefni fyrir fólk með ýmsar gerðir sjónskerðingar, fyrir tengingar með litla bandbreidd, eða til að gefa nánara samhengi fyrir myndefni.
Þú getur með þessu bætt almennt aðgengi og aukið skilning á efni sem þú birtir með því að skrifa skýran, skorinortan og hlutlægan alt-texta til vara.
Lýstu mikilvægum atriðum
\\n
Hafðu yfirlit með þeim texta sem sést í myndum
Notaðu eðlilega setningaskipan
Forðastu óþarfar upplýsingar
Leggðu áherslu á aðalatriði í flóknu myndefni (eins og línuritum eða landakortum)
",
"interaction_modal.action.favourite": "Til að halda áfram þarftu að setja eitthvað í eftirlæti, verandi inni á aðgangnum þínum.",
"interaction_modal.action.follow": "Til að halda áfram þarftu að fylgjast með einhverjum, verandi inni á aðgangnum þínum.",
"interaction_modal.action.reblog": "Til að halda áfram þarftu að endurbirta frá einhverjum, verandi inni á aðgangnum þínum.",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 81082e30c0c017..fc52700692a824 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -1,6 +1,6 @@
{
"about.blocks": "Server moderati",
- "about.contact": "Contatto:",
+ "about.contact": "Contatti:",
"about.disclaimer": "Mastodon è un software libero e open-source e un marchio di Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo non disponibile",
"about.domain_blocks.preamble": "Mastodon, generalmente, ti consente di visualizzare i contenuti e interagire con gli utenti da qualsiasi altro server nel fediverso. Queste sono le eccezioni che sono state fatte su questo particolare server.",
@@ -39,7 +39,7 @@
"account.following_counter": "{count, plural, one {{counter} segui} other {{counter} segui}}",
"account.follows.empty": "Questo utente non segue ancora nessuno.",
"account.go_to_profile": "Vai al profilo",
- "account.hide_reblogs": "Nascondi potenziamenti da @{name}",
+ "account.hide_reblogs": "Nascondi condivisioni da @{name}",
"account.in_memoriam": "In memoria.",
"account.joined_short": "Iscritto",
"account.languages": "Modifica le lingue d'iscrizione",
@@ -61,7 +61,7 @@
"account.requested": "In attesa d'approvazione. Clicca per annullare la richiesta di seguire",
"account.requested_follow": "{name} ha richiesto di seguirti",
"account.share": "Condividi il profilo di @{name}",
- "account.show_reblogs": "Mostra potenziamenti da @{name}",
+ "account.show_reblogs": "Mostra condivisioni da @{name}",
"account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} post}}",
"account.unblock": "Sblocca @{name}",
"account.unblock_domain": "Sblocca il dominio {domain}",
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ignorare le notifiche delle persone che non ti seguono?",
"ignore_notifications_modal.not_following_title": "Ignorare le notifiche delle persone che non segui?",
"ignore_notifications_modal.private_mentions_title": "Ignorare le notifiche provenienti da menzioni private indesiderate?",
+ "info_button.label": "Aiuto",
+ "info_button.what_is_alt_text": "
Cos'è il testo alternativo?
Il testo alternativo fornisce descrizioni delle immagini per le persone con disturbi della vista, connessioni a bassa larghezza di banda o per coloro che cercano un contesto aggiuntivo.
È possibile migliorare l'accessibilità e la comprensione per tutti scrivendo un testo alt chiaro, conciso e obiettivo.
Cattura elementi importanti
Riassume il testo nelle immagini
Usa la struttura delle frasi regolari
Evita le informazioni ridondanti
Concentrati sulle tendenze e i risultati chiave in immagini complesse (come diagrammi o mappe)
",
"interaction_modal.action.favourite": "Per continuare, devi aggiungere ai preferiti il tuo account.",
"interaction_modal.action.follow": "Per continuare, devi seguire dal tuo account.",
"interaction_modal.action.reblog": "Per continuare, devi condividere dal tuo account.",
@@ -696,7 +698,7 @@
"privacy.private.short": "Follower",
"privacy.public.long": "Chiunque dentro e fuori Mastodon",
"privacy.public.short": "Pubblico",
- "privacy.unlisted.additional": "Si comporta esattamente come pubblico, tranne per il fatto che il post non verrà visualizzato nei feed live o negli hashtag, nell'esplorazione o nella ricerca Mastodon, anche se hai attivato l'attivazione a livello di account.",
+ "privacy.unlisted.additional": "",
"privacy.unlisted.long": "Meno fanfare algoritmiche",
"privacy.unlisted.short": "Pubblico silenzioso",
"privacy_policy.last_updated": "Ultimo aggiornamento {date}",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index ff41d870479c56..0c9b4a6062b0e7 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -86,6 +86,10 @@
"alert.unexpected.message": "不明なエラーが発生しました。",
"alert.unexpected.title": "エラー!",
"alt_text_badge.title": "代替テキスト",
+ "alt_text_modal.add_alt_text": "代替テキストを追加",
+ "alt_text_modal.cancel": "キャンセル",
+ "alt_text_modal.change_thumbnail": "サムネイルを変更",
+ "alt_text_modal.done": "完了",
"announcement.announcement": "お知らせ",
"annual_report.summary.archetype.booster": "トレンドハンター",
"annual_report.summary.archetype.lurker": "ROM専",
@@ -407,6 +411,8 @@
"ignore_notifications_modal.not_followers_title": "本当に「フォローされていないアカウントからの通知」を無視するようにしますか?",
"ignore_notifications_modal.not_following_title": "本当に「フォローしていないアカウントからの通知」を無視するようにしますか?",
"ignore_notifications_modal.private_mentions_title": "本当に「外部からの非公開の返信」を無視するようにしますか?",
+ "info_button.label": "ヘルプ",
+ "info_button.what_is_alt_text": "
",
"interaction_modal.action.favourite": "お気に入り登録はあなたのアカウントがあるサーバーで行う必要があります。",
"interaction_modal.action.follow": "ユーザーをフォローするには、あなたのアカウントがあるサーバーからフォローする必要があります。",
"interaction_modal.action.reblog": "投稿をブーストするには、あなたのアカウントがあるサーバーでブーストする必要があります。",
@@ -836,6 +842,7 @@
"status.reblogs.empty": "まだ誰もブーストしていません。ブーストされるとここに表示されます。",
"status.redraft": "削除して下書きに戻す",
"status.remove_bookmark": "ブックマークを削除",
+ "status.remove_favourite": "お気に入りから削除",
"status.replied_in_thread": "ほかのユーザーへ",
"status.replied_to": "{name}さんへの返信",
"status.reply": "返信",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index 02ecec2a70e621..8cdfe6df193456 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -74,7 +74,10 @@
"alert.unexpected.message": "Yeḍra-d unezri ur netturaǧu ara.",
"alert.unexpected.title": "Ayhuh!",
"alt_text_badge.title": "Aḍris asegzan",
+ "alt_text_modal.cancel": "Semmet",
+ "alt_text_modal.done": "Immed",
"announcement.announcement": "Ulɣu",
+ "annual_report.summary.most_used_hashtag.none": "Ula yiwen",
"audio.hide": "Ffer amesli",
"block_modal.show_less": "Ssken-d drus",
"block_modal.show_more": "Ssken-d ugar",
@@ -100,9 +103,11 @@
"column.blocks": "Imiḍanen yettusḥebsen",
"column.bookmarks": "Ticraḍ",
"column.community": "Tasuddemt tadigant",
+ "column.create_list": "Snulfu-d tabdart",
"column.direct": "Tabdarin tusligin",
"column.directory": "Inig deg imeɣna",
"column.domain_blocks": "Taɣulin yeffren",
+ "column.edit_list": "Ẓreg tabdart",
"column.favourites": "Imenyafen",
"column.follow_requests": "Isuturen n teḍfeṛt",
"column.home": "Agejdan",
@@ -165,6 +170,7 @@
"confirmations.unfollow.message": "Tetḥeqqeḍ belli tebɣiḍ ur teṭafaṛeḍ ara {name}?",
"content_warning.hide": "Ffer tasuffeɣt",
"content_warning.show": "Ssken-d akken tebɣu tili",
+ "content_warning.show_more": "Sken-d ugar",
"conversation.delete": "Kkes adiwenni",
"conversation.mark_as_read": "Creḍ yettwaɣṛa",
"conversation.open": "Ssken adiwenni",
@@ -325,11 +331,20 @@
"link_preview.author": "S-ɣur {name}",
"link_preview.more_from_author": "Ugar sɣur {name}",
"link_preview.shares": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}",
+ "lists.add_member": "Rnu",
+ "lists.add_to_list": "Rnu ɣer tebdart",
+ "lists.add_to_lists": "Rnu {name} ɣer tebdarin",
+ "lists.create": "Snulfu-d",
"lists.delete": "Kkes tabdart",
"lists.edit": "Ẓreg tabdart",
+ "lists.list_name": "Isem n tebdart",
+ "lists.new_list_name": "Isem n tebdart tamaynut",
+ "lists.remove_member": "Kkes",
"lists.replies_policy.followed": "Kra n useqdac i yettwaḍefren",
"lists.replies_policy.list": "Iɛeggalen n tebdart",
"lists.replies_policy.none": "Ula yiwen·t",
+ "lists.save": "Sekles",
+ "lists.search": "Nadi",
"load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}",
"loading_indicator.label": "Yessalay-d …",
"media_gallery.hide": "Seggelmes",
@@ -399,6 +414,7 @@
"notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib",
"notifications.column_settings.follow": "Imeḍfaṛen imaynuten:",
"notifications.column_settings.follow_request": "Isuturen imaynuten n teḍfeṛt:",
+ "notifications.column_settings.group": "Agraw",
"notifications.column_settings.mention": "Abdar:",
"notifications.column_settings.poll": "Igemmaḍ n usenqed:",
"notifications.column_settings.push": "Alɣuten yettudemmren",
@@ -429,6 +445,9 @@
"notifications.policy.filter_private_mentions_title": "Abdar uslig ur yettwasferken ara",
"notifications_permission_banner.enable": "Rmed alɣuten n tnarit",
"notifications_permission_banner.title": "Ur zeggel acemma",
+ "onboarding.follows.back": "Uɣal",
+ "onboarding.follows.done": "Immed",
+ "onboarding.follows.search": "Nadi",
"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",
@@ -524,6 +543,7 @@
"search_results.accounts": "Imeɣna",
"search_results.all": "Akk",
"search_results.hashtags": "Ihacṭagen",
+ "search_results.no_results": "Ulac igemmaḍ.",
"search_results.see_all": "Wali-ten akk",
"search_results.statuses": "Tisuffaɣ",
"server_banner.active_users": "iseqdacen urmiden",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index fd5e2b906d3c7a..88f35cfc30a08d 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "예상하지 못한 에러가 발생했습니다.",
"alert.unexpected.title": "앗!",
"alt_text_badge.title": "대체 문구",
+ "alt_text_modal.add_alt_text": "대체 텍스트 추가",
+ "alt_text_modal.add_text_from_image": "이미지에서 텍스트 추가",
+ "alt_text_modal.cancel": "취소",
+ "alt_text_modal.change_thumbnail": "썸네일 변경",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "청력 장애가 있는 사람들을 위한 설명을 작성하세요…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "시각 장애가 있는 사람들을 위한 설명을 작성하세요…",
+ "alt_text_modal.done": "완료",
"announcement.announcement": "공지사항",
"annual_report.summary.archetype.booster": "연쇄부스트마",
"annual_report.summary.archetype.lurker": "은둔자",
@@ -407,6 +414,14 @@
"ignore_notifications_modal.not_followers_title": "나를 팔로우하지 않는 사람들의 알림을 무시할까요?",
"ignore_notifications_modal.not_following_title": "내가 팔로우하지 않는 사람들의 알림을 무시할까요?",
"ignore_notifications_modal.private_mentions_title": "요청하지 않은 개인 멘션 알림을 무시할까요?",
+ "info_button.label": "도움말",
+ "interaction_modal.action.favourite": "계속하려면 내 계정으로 즐겨찾기해야 합니다.",
+ "interaction_modal.action.follow": "계속하려면 내 계정으로 팔로우해야 합니다.",
+ "interaction_modal.action.reblog": "계속하려면 내 계정으로 리블로그해야 합니다.",
+ "interaction_modal.action.reply": "계속하려면 내 계정으로 답장해야 합니다.",
+ "interaction_modal.action.vote": "계속하려면 내 계정으로 투표해야 합니다.",
+ "interaction_modal.go": "이동",
+ "interaction_modal.no_account_yet": "아직 계정이 없나요?",
"interaction_modal.on_another_server": "다른 서버에",
"interaction_modal.on_this_server": "이 서버에서",
"interaction_modal.title.favourite": "{name} 님의 게시물을 좋아하기",
@@ -830,6 +845,7 @@
"status.reblogs.empty": "아직 아무도 이 게시물을 부스트하지 않았습니다. 부스트 한 사람들이 여기에 표시 됩니다.",
"status.redraft": "지우고 다시 쓰기",
"status.remove_bookmark": "북마크 삭제",
+ "status.remove_favourite": "즐겨찾기에서 제거",
"status.replied_in_thread": "글타래에 답장",
"status.replied_to": "{name} 님에게",
"status.reply": "답장",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 9379620c7eb6bc..083527f7d5c4cd 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Įvyko netikėta klaida.",
"alert.unexpected.title": "Ups!",
"alt_text_badge.title": "Alternatyvus tekstas",
+ "alt_text_modal.add_alt_text": "Pridėti alternatyvųjį tekstą",
+ "alt_text_modal.add_text_from_image": "Pridėti tekstą iš vaizdo",
+ "alt_text_modal.cancel": "Atšaukti",
+ "alt_text_modal.change_thumbnail": "Keisti miniatiūrą",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Aprašykite tai klausos negalią turintiems asmenims…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Aprašykite tai regos sutrikimų turintiems asmenims…",
+ "alt_text_modal.done": "Atlikta",
"announcement.announcement": "Skelbimas",
"annual_report.summary.archetype.booster": "Šaunus medžiotojas",
"annual_report.summary.archetype.lurker": "Stebėtojas",
@@ -287,7 +294,7 @@
"empty_column.community": "Vietinė laiko skalė yra tuščia. Parašyk ką nors viešai, kad pradėtum sąveikauti.",
"empty_column.direct": "Dar neturi jokių privačių paminėjimų. Kai išsiųsi arba gausi vieną iš jų, jis bus rodomas čia.",
"empty_column.domain_blocks": "Kol kas nėra užblokuotų serverių.",
- "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrink vėliau!",
+ "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrinkite vėliau!",
"empty_column.favourited_statuses": "Dar neturi mėgstamų įrašų. Kai vieną iš jų pamėgsi, jis bus rodomas čia.",
"empty_column.favourites": "Šio įrašo dar niekas nepamėgo. Kai kas nors tai padarys, jie bus rodomi čia.",
"empty_column.follow_requests": "Dar neturi jokių sekimo prašymų. Kai gausi tokį prašymą, jis bus rodomas čia.",
@@ -403,6 +410,8 @@
"ignore_notifications_modal.not_followers_title": "Ignoruoti pranešimus iš žmonių, kurie tave neseka?",
"ignore_notifications_modal.not_following_title": "Ignoruoti pranešimus iš žmonių, kuriuos neseki?",
"ignore_notifications_modal.private_mentions_title": "Ignoruoti pranešimus iš neprašytų privačių paminėjimų?",
+ "info_button.label": "Žinynas",
+ "info_button.what_is_alt_text": "
Kas yra alternatyvusis tekstas?
Alternatyvusis tekstas pateikia vaizdų aprašymus asmenims su regos sutrikimais, turintiems mažo pralaidumo ryšį arba ieškantiems papildomo konteksto.
Galite pagerinti prieinamumą ir suprantamumą visiems, jei parašysite aiškų, glaustą ir objektyvų alternatyvųjį tekstą.
Užfiksuokite svarbiausius elementus.
Apibendrinkite tekstą vaizduose.
Naudokite įprasta sakinio struktūrą.
Venkite nereikalingos informacijos.
Sutelkite dėmesį į tendencijas ir pagrindines išvadas sudėtinguose vaizdiniuose (tokiuose kaip diagramos ar žemėlapiai).
",
"interaction_modal.action.favourite": "Kad tęstumėte, turite pamėgti iš savo paskyros.",
"interaction_modal.action.follow": "Kad tęstumėte, turite sekti iš savo paskyros.",
"interaction_modal.action.reblog": "Kad tęstumėte, turite pasidalinti iš savo paskyros.",
@@ -707,7 +716,7 @@
"report.categories.violation": "Turinys pažeidžia vieną ar daugiau serverio taisyklių",
"report.category.subtitle": "Pasirink geriausią atitikmenį.",
"report.category.title": "Papasakok mums, kas vyksta su šiuo {type}",
- "report.category.title_account": "profilis",
+ "report.category.title_account": "profiliu",
"report.category.title_status": "įrašas",
"report.close": "Atlikta",
"report.comment.title": "Ar yra dar kas nors, ką, tavo manymu, turėtume žinoti?",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index d97ce0279857dc..817160a0322d74 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Meldingen negeren van mensen die jou niet volgen?",
"ignore_notifications_modal.not_following_title": "Meldingen negeren van mensen die je niet volgt?",
"ignore_notifications_modal.private_mentions_title": "Meldingen negeren van ongevraagde privéberichten?",
+ "info_button.label": "Help",
+ "info_button.what_is_alt_text": "
Wat is alt-tekst?
Alt-tekst biedt beschrijvingen van afbeeldingen voor mensen met een visuele beperking, voor verbindingen met lage internetsnelheid of mensen die op zoek zijn naar extra context.
Je kunt de toegankelijkheid en de begrijpelijkheid voor iedereen verbeteren door heldere, beknopte en objectieve alt-teksten te schrijven.
Leg belangrijke elementen vast
Tekst in afbeeldingen samenvatten
Een eenvoudige zinsbouw gebruiken
Overbodige informatie vermijden
Voor complexe diagrammen of kaarten alleen op trends en belangrijke bevindingen focussen
",
"interaction_modal.action.favourite": "Om verder te gaan, moet je vanaf je eigen account als favoriet markeren.",
"interaction_modal.action.follow": "Om verder te gaan, moet je vanaf je eigen account volgen.",
"interaction_modal.action.reblog": "Om verder te gaan, moet je vanaf je eigen account boosten.",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 079a128cf86347..8e3b8a26fac44e 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Wystąpił nieoczekiwany błąd.",
"alert.unexpected.title": "Ups!",
"alt_text_badge.title": "Tekst alternatywny",
+ "alt_text_modal.add_alt_text": "Dodaj tekst alternatywny",
+ "alt_text_modal.add_text_from_image": "Dodaj tekst z obrazu",
+ "alt_text_modal.cancel": "Anuluj",
+ "alt_text_modal.change_thumbnail": "Zmień miniaturę",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Opisz to dla osób z wadą słuchu…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Opisz to dla osób z wadą wzroku…",
+ "alt_text_modal.done": "Gotowe",
"announcement.announcement": "Ogłoszenie",
"annual_report.summary.archetype.booster": "Łowca treści",
"annual_report.summary.archetype.lurker": "Czyhający",
@@ -103,6 +110,7 @@
"annual_report.summary.most_used_hashtag.most_used_hashtag": "najczęściej używany hashtag",
"annual_report.summary.most_used_hashtag.none": "Brak",
"annual_report.summary.new_posts.new_posts": "nowe wpisy",
+ "annual_report.summary.percentile.text": "Plasuje Cię w czołówce użytkowników {domain}.",
"annual_report.summary.percentile.we_wont_tell_bernie": "Nie powiemy Berniemu.",
"annual_report.summary.thanks": "Dziękujemy, że jesteś częścią Mastodona!",
"attachments_list.unprocessed": "(nieprzetworzone)",
@@ -408,6 +416,10 @@
"ignore_notifications_modal.private_mentions_title": "Ignoruj powiadomienia o nieproszonych wzmiankach prywatnych?",
"interaction_modal.action.favourite": "Aby kontynuować, musisz dodać do ulubionych na swoim koncie.",
"interaction_modal.action.follow": "Aby kontynuować, musisz obserwować ze swojego konta.",
+ "interaction_modal.action.reblog": "Aby kontynuować, musisz podać dalej ze swojego konta.",
+ "interaction_modal.action.reply": "Aby kontynuować, musisz odpowiedzieć ze swojego konta.",
+ "interaction_modal.action.vote": "Aby kontynuować, musisz zagłosować ze swojego konta.",
+ "interaction_modal.go": "Dalej",
"interaction_modal.no_account_yet": "Nie masz jeszcze konta?",
"interaction_modal.on_another_server": "Na innym serwerze",
"interaction_modal.on_this_server": "Na tym serwerze",
@@ -452,6 +464,7 @@
"keyboard_shortcuts.toggle_hidden": "aby wyświetlić lub ukryć wpis spod CW",
"keyboard_shortcuts.toggle_sensitivity": "Pokaż/ukryj multimedia",
"keyboard_shortcuts.toot": "Stwórz nowy post",
+ "keyboard_shortcuts.translate": "Aby przetłumaczyć post",
"keyboard_shortcuts.unfocus": "aby opuścić pole wyszukiwania/pisania",
"keyboard_shortcuts.up": "aby przejść na górę listy",
"lightbox.close": "Zamknij",
@@ -690,6 +703,8 @@
"privacy_policy.title": "Polityka prywatności",
"recommended": "Zalecane",
"refresh": "Odśwież",
+ "regeneration_indicator.please_stand_by": "Proszę czekać.",
+ "regeneration_indicator.preparing_your_home_feed": "Przygotowywanie Twojego kanału wiadomości...",
"relative_time.days": "{number} dni",
"relative_time.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}} temu",
"relative_time.full.hours": "{number, plural, one {# godzinę} few {# godziny} many {# godzin} other {# godzin}} temu",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index f9cd9dfcc1fe1e..48ae395481f76e 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -414,9 +414,11 @@
"ignore_notifications_modal.not_followers_title": "Ignorar notificações de pessoas que não te seguem?",
"ignore_notifications_modal.not_following_title": "Ignorar notificações de pessoas que não segues?",
"ignore_notifications_modal.private_mentions_title": "Ignorar notificações de menções privadas não solicitadas?",
+ "info_button.label": "Ajuda",
+ "info_button.what_is_alt_text": "
O que é texto alternativo?
O texto alternativo fornece descrições de imagens para pessoas com deficiências visuais, conexões de baixa largura de banda ou pessoas que procuram um contexto adicional.
Podes melhorar a acessibilidade e a compreensão para todos escrevendo um texto alternativo claro, conciso e objetivo.
Capta elementos importantes
Resume o texto que aparece nas imagens
Usa uma estrutura de frase regular
Evita informações redundantes
Centra-te nas tendências e nas principais conclusões em imagens complexas (como diagramas ou mapas)
",
"interaction_modal.action.favourite": "Para continuar, tens de adicionar um favorito na tua conta.",
"interaction_modal.action.follow": "Para continuar, tens de seguir alguém na tua conta.",
- "interaction_modal.action.reblog": "Para continuar, tens de fazer uma republicação na tua conta.",
+ "interaction_modal.action.reblog": "Para continuar, tens de impulsionar desde a tua conta.",
"interaction_modal.action.reply": "Para continuar, tens de fazer uma resposta na tua conta.",
"interaction_modal.action.vote": "Para continuar é necessário votar a partir da tua conta.",
"interaction_modal.go": "Ir",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 1148254a4dbfc8..68b774336e6751 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -409,6 +409,8 @@
"ignore_notifications_modal.not_followers_title": "Të shpërfillen njoftime nga persona që s’ju ndjekin?",
"ignore_notifications_modal.not_following_title": "Të shpërfillen njoftime nga persona që s’i ndiqni?",
"ignore_notifications_modal.private_mentions_title": "Të shpërfillen njoftime nga Përmendje Private të pakërkuara?",
+ "info_button.label": "Ndihmë",
+ "info_button.what_is_alt_text": "
Ç’është teksti alternativ?
Teksti alternativ jep përshkrime figurash për persona me mangësi në të parët, lidhje me gjerësi bande të ulët, ose për ata që duan kontekst shtesë.
Mund të përmirësoni përdorimin nga persona me aftësi të kufizuara dhe kuptimin për këto, duke shkruar tekst alternativ të qartë, konciz dhe objektiv.
Rrokni elementët e rëndësishëm
Përmblidhni tekst në figura
Përdorni strukturë të rregullt fjalish
Shmangni përsëritje informacioni
Në aspekte pamore të ndërlikuara (fjala vjen, diagrame ose harta) përqendrohuni te prirje dhe gjetje gjërash kyçe
",
"interaction_modal.action.favourite": "Që të vazhdoni, lypset t’i vini shenjë si i parapëlqyer që nga llogaria juaj.",
"interaction_modal.action.follow": "Që të vazhdoni, lypset ta ndiqni që nga llogaria juaj.",
"interaction_modal.action.reblog": "Që të vazhdoni, lypset ta riblogoni që nga llogaria juaj.",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 52993740c55abb..da6a49b75ad73e 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -523,7 +523,7 @@
"navigation_bar.favourites": "Favoriter",
"navigation_bar.filters": "Tystade ord",
"navigation_bar.follow_requests": "Följförfrågningar",
- "navigation_bar.followed_tags": "Utvalda hashtags",
+ "navigation_bar.followed_tags": "Följda hashtaggar",
"navigation_bar.follows_and_followers": "Följer och följare",
"navigation_bar.lists": "Listor",
"navigation_bar.logout": "Logga ut",
diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json
index f60c2fe2896e8a..7291588a38c45d 100644
--- a/app/javascript/mastodon/locales/tok.json
+++ b/app/javascript/mastodon/locales/tok.json
@@ -1,11 +1,12 @@
{
"about.blocks": "ma lawa",
"about.contact": "toki:",
- "about.disclaimer": "ilo Masoton la, jan ale li ken kama jo e ona kepeken mani ala, li ken ante e toki ilo ona. kulupu esun Mastodon li jo e nimi ona. kulupu esun Mastodon li nasin lawa gGmbH.",
+ "about.disclaimer": "ilo Masoton la jan ale li lawa e ona li pana e pona tawa ona. kulupu esun Mastodon gGmbH li lawa e nimi ona.",
"about.domain_blocks.no_reason_available": "mi sona ala e tan",
"about.domain_blocks.preamble": "ilo Masoton li ken e ni: sina lukin e toki jan pi ma ilo mute. sina ken toki tawa ona lon kulupu ma. taso, ma ni li ken ala e ni tawa ma ni:",
"about.domain_blocks.silenced.explanation": "sina lukin ala e toki e jan tan ma ni. taso, sina wile la, sina ken ni.",
- "about.domain_blocks.silenced.title": "ken lili lukin",
+ "about.domain_blocks.silenced.title": "ken lukin lili ",
+ "about.domain_blocks.suspended.explanation": "sona ale pi ma ni li kama pali ala, li kama esun ala, li kama awen ala la sina ken ala toki tawa jan pi ma ni.",
"about.domain_blocks.suspended.title": "weka",
"about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.",
"about.powered_by": "lipu kulupu pi jan lawa mute tan {mastodon}",
@@ -18,7 +19,7 @@
"account.block_domain": "o weka e ma {domain}",
"account.block_short": "o weka e jan tawa mi",
"account.blocked": "jan li weka tawa mi",
- "account.cancel_follow_request": "o pini kute",
+ "account.cancel_follow_request": "o kute ala",
"account.copy": "o pali same e linja pi lipu jan",
"account.direct": "len la o mu e @{name}",
"account.disable_notifications": "@{name} li toki la o mu ala e mi",
@@ -50,74 +51,95 @@
"account.mute": "o len e @{name}",
"account.mute_notifications_short": "o kute ala e mu tan jan ni",
"account.mute_short": "o kute ala",
- "account.muted": "sina len e jan ni",
+ "account.muted": "sina kute ala e jan ni",
"account.mutual": "jan pona sona",
- "account.no_bio": "lipu li weka",
+ "account.no_bio": "lipu li weka.",
"account.open_original_page": "o open e lipu open",
"account.posts": "toki suli",
"account.posts_with_replies": "toki ale",
- "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_follow": "{name} li wile kute e sina",
+ "account.report": "jan @{name} la o toki e ike tawa lawa",
+ "account.requested": "jan ni o ken e kute sina",
+ "account.requested_follow": "jan {name} li wile kute e sina",
"account.share": "o pana e lipu jan @{name}",
"account.show_reblogs": "o lukin e pana toki tan @{name}",
"account.statuses_counter": "{count, plural, other {toki {counter}}}",
"account.unblock": "o weka ala e jan {name}",
"account.unblock_domain": "o weka ala e ma {domain}",
- "account.unblock_short": "o pini weka",
+ "account.unblock_short": "o weka ala",
"account.unendorse": "lipu jan la o suli ala e ni",
- "account.unfollow": "o pini kute",
+ "account.unfollow": "o kute ala",
"account.unmute": "o len ala e @{name}",
"account.unmute_notifications_short": "o kute e mu tan jan ni",
"account.unmute_short": "o len ala",
"account_note.placeholder": "o luka e ni la sona pi sina taso",
+ "admin.dashboard.daily_retention": "nanpa pi awen jan lon tenpo suno",
+ "admin.dashboard.monthly_retention": "nanpa pi awen jan lon tenpo mun",
"admin.dashboard.retention.average": "sama",
"admin.dashboard.retention.cohort": "tenpo mun open",
"admin.dashboard.retention.cohort_size": "jan sin",
+ "admin.impact_report.instance_accounts": "ni li pakala li weka e lipu jan ni",
+ "admin.impact_report.instance_followers": "jan pi ma mi li weka tan jan kute ni",
+ "admin.impact_report.instance_follows": "ma ante li weka tan jan kute ni",
+ "admin.impact_report.title": "sona pi pakala kulupu",
"alert.rate_limited.message": "tenpo {retry_time, time, medium} la o pali awen",
+ "alert.rate_limited.title": "ilo ni li lili e ken sina",
"alert.unexpected.message": "pakala li lon",
"alert.unexpected.title": "pakala a!",
"alt_text_badge.title": "toki sona sitelen",
+ "alt_text_modal.add_alt_text": "o pana e toki pi sona lukin",
+ "alt_text_modal.add_text_from_image": "o kama jo e toki sitelen tan sitelen ni",
+ "alt_text_modal.cancel": "weka",
+ "alt_text_modal.change_thumbnail": "o ante e sitelen lili",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "jan li ken ala kute la o pana e toki pi sona kalama…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "jan li ken ala lukin la o pana e toki pi sona lukin…",
+ "alt_text_modal.done": "pini",
"announcement.announcement": "toki suli",
"annual_report.summary.archetype.booster": "jan ni li alasa e pona",
"annual_report.summary.archetype.lurker": "jan ni li lukin taso",
"annual_report.summary.archetype.oracle": "jan ni li sona suli",
"annual_report.summary.archetype.pollster": "jan ni li wile sona e pilin jan",
"annual_report.summary.archetype.replier": "jan ni li toki tawa jan mute",
+ "annual_report.summary.followers.followers": "jan kute sina",
"annual_report.summary.followers.total": "ale la {count}",
"annual_report.summary.here_it_is": "toki lili la tenpo sike nanpa {year} li sama ni tawa sina:",
+ "annual_report.summary.highlighted_post.by_favourites": "toki pi olin nanpa wan",
+ "annual_report.summary.highlighted_post.by_reblogs": "toki pi sike nanpa wan",
+ "annual_report.summary.highlighted_post.by_replies": "toki li jo e toki kama pi nanpa wan",
"annual_report.summary.highlighted_post.possessive": "tan jan {name}",
"annual_report.summary.most_used_hashtag.none": "ala",
"annual_report.summary.new_posts.new_posts": "toki suli sin",
- "annual_report.summary.percentile.we_wont_tell_bernie": "mi toki ala e ni tawa jan Peni.",
+ "annual_report.summary.percentile.text": "ni la sina nanpa sewipi jan ale lon {domain}.",
+ "annual_report.summary.percentile.we_wont_tell_bernie": "sona ni li len tawa ale.",
"annual_report.summary.thanks": "sina jan pi kulupu Masoton la sina pona a!",
"attachments_list.unprocessed": "(nasin open)",
"audio.hide": "o len e kalama",
+ "block_modal.remote_users_caveat": "mi pana e wile sina tawa ma {domain}. taso, o sona: ma li ken kepeken nasin len ante la pakala li ken lon. toki pi lukin ale la jan pi ma ala li ken lukin.",
"block_modal.show_less": "o lili e lukin",
- "block_modal.show_more": "o mute e lukin",
- "block_modal.they_cant_mention": "ona li ken ala toki e sina li ken ala alasa e sina",
+ "block_modal.show_more": "o suli e lukin",
+ "block_modal.they_cant_mention": "ona li ken ala toki tawa sina li ken ala kute e sina.",
"block_modal.they_cant_see_posts": "ona li ken ala lukin e toki sina. sina ken ala lukin e toki ona.",
- "block_modal.they_will_know": "ona li sona e ni: sina ala e lukin ona.",
+ "block_modal.they_will_know": "ona li sona e ni: sina weka e lukin ona.",
"block_modal.title": "o weka ala weka e jan",
- "block_modal.you_wont_see_mentions": "nimi ona li lon toki suli la sina lukin ala e toki ni.",
+ "block_modal.you_wont_see_mentions": "jan li toki e nimi ona la sina lukin ala e toki ni.",
"boost_modal.combo": "sina ken luka e nena {combo} tawa ni: sina wile ala luka e nena lon tenpo kama",
"boost_modal.reblog": "o wawa ala wawa e toki?",
- "boost_modal.undo_reblog": "o pini ala pini e wawa toki?",
+ "boost_modal.undo_reblog": "o weka ala weka e wawa toki?",
"bundle_column_error.copy_stacktrace": "o awen e sona pakala lon ilo sina",
"bundle_column_error.error.body": "ilo li ken ala pana e lipu ni. ni li ken tan pakala ilo.",
- "bundle_column_error.error.title": "ike a!",
+ "bundle_column_error.error.title": "pakala a!",
"bundle_column_error.network.body": "mi lukin pana e lipu la, pakala li lon. ken la, pakala li tan ilo nanpa sina. ken la, pakala li tan ilo nanpa suli pi ma kulupu ni.",
"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.return": "o tawa tomo",
+ "bundle_column_error.retry": "o alasa sin",
+ "bundle_column_error.return": "o tawa open",
"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_modal_error.close": "o pini",
"bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.",
- "bundle_modal_error.retry": "o ni sin",
- "closed_registrations.other_server_instructions": "kulupu Masoton li jo e jan lawa mute, la sina ken pali e sijelo lon ma ante, li ken lukin e ijo pi ma ni.",
+ "bundle_modal_error.retry": "o alasa sin",
+ "closed_registrations.other_server_instructions": "kulupu Masoton la lawa mute li lon. sina ken pali e sijelo lon ma ante la sina awen ken lukin e ijo pi ma ni.",
"closed_registrations_modal.description": "tenpo ni la, sina ken ala pali e jan lon ma {domain}. taso sina wile kepeken ilo Masoton la, sina ken pali e jan lon ma ante lon ala ma {domain}.",
"closed_registrations_modal.find_another_server": "o alasa e ma ante",
+ "closed_registrations_modal.preamble": "ilo Masoton li lon ilo wan ala. sina kepeken ma ante la sina ken lukin li ken kute e jan pi ma ni. sina wile la, sina ken pali e ma sin!",
"closed_registrations_modal.title": "sina kama lon kulupu Masoton",
"column.about": "sona",
"column.blocks": "kulupu pi jan weka",
@@ -137,8 +159,11 @@
"column.mutes": "jan len",
"column.notifications": "mu pi sona sin",
"column.pins": "toki sewi",
+ "column.public": "toki pi ma poka ale",
"column_back_button.label": "o tawa monsi",
"column_header.hide_settings": "o len e lawa",
+ "column_header.moveLeft_settings": "poki toki ni o tawa ni ←",
+ "column_header.moveRight_settings": "poki toki ni o tawa ni →",
"column_header.pin": "o sewi",
"column_header.show_settings": "o lukin e lawa",
"column_header.unpin": "o sewi ala",
@@ -154,6 +179,8 @@
"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.encryption_warning": "toki li len ala lon ilo Masoton ꞏ o pana ala e sona suli len lon ilo Masoton",
+ "compose_form.lock_disclaimer": "lipu sina li open, li {locked} ala. jan ale li ken kama kute e sina, li ken lukin e toki sama ni.",
+ "compose_form.lock_disclaimer.lock": "pini",
"compose_form.placeholder": "sina wile toki e seme?",
"compose_form.poll.duration": "tenpo pana",
"compose_form.poll.multiple": "pana mute",
@@ -169,7 +196,7 @@
"compose_form.spoiler.marked": "o weka e toki pi ijo ike ken",
"compose_form.spoiler.unmarked": "o pali e toki pi ijo ike ken",
"compose_form.spoiler_placeholder": "toki pi ijo ike ken (sina ken ala e ni)",
- "confirmation_modal.cancel": "o pini",
+ "confirmation_modal.cancel": "o weka",
"confirmations.block.confirm": "o weka",
"confirmations.delete.confirm": "o weka",
"confirmations.delete.message": "sina wile ala wile weka e toki ni?",
@@ -182,22 +209,31 @@
"confirmations.edit.confirm": "o ante",
"confirmations.edit.message": "sina ante e toki sina la toki pali sina li weka. sina wile ala wile e ni?",
"confirmations.edit.title": "o weka ala weka e toki? ni la, toki li kama toki sin.",
+ "confirmations.follow_to_list.confirm": "o kute, o pana tawa lipu jan",
+ "confirmations.follow_to_list.message": "sina wile pana e {name} tawa lipu jan la o kama kute e ona.",
+ "confirmations.follow_to_list.title": "sina wile ala wile kute?",
"confirmations.logout.confirm": "o weka",
"confirmations.logout.message": "sina wile ala wile weka",
"confirmations.logout.title": "o weka?",
"confirmations.mute.confirm": "o len",
"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.redraft.title": "ni li weka li pali sin e toki ni.",
"confirmations.reply.confirm": "toki lon toki ni",
"confirmations.reply.message": "sina toki lon toki ni la toki pali sina li weka. sina wile ala wile e ni?",
- "confirmations.unfollow.confirm": "o pini kute",
+ "confirmations.reply.title": "sina wile ala wile weka e toki lon?",
+ "confirmations.unfollow.confirm": "o kute ala",
"confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?",
+ "confirmations.unfollow.title": "sina wile ala wile pini kute?",
+ "content_warning.hide": "o len",
"content_warning.show": "o lukin",
+ "content_warning.show_more": "o lukin",
"conversation.delete": "o weka e toki ni",
"conversation.mark_as_read": "ni o sin ala",
"conversation.open": "o lukin e toki",
"conversation.with": "lon {names}",
"copy_icon_button.copied": "toki li awen lon ilo sina",
+ "copypaste.copied": "sina jo e toki",
"copypaste.copy_to_clipboard": "o awen lon ilo sina",
"directory.local": "tan {domain} taso",
"directory.new_arrivals": "jan pi kama sin",
@@ -206,15 +242,24 @@
"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.explore_links": "tenpo suno ni la jan pi kulupu ale li toki e ijo sin ni. ijo sin pi jan ante mute li sewi lon lipu ni.",
"domain_block_modal.block": "o weka e ma",
"domain_block_modal.they_wont_know": "ona li sona ala e ni: sina weka e ona.",
+ "domain_block_modal.title": "sina wile weka ala weka e ma?",
"domain_block_modal.you_will_lose_num_followers": "{followersCount, plural, other {jan {followersCountDisplay}}} li kute e sina la, ona kama kute ala e sina. sina kute e {followingCount, plural,other {jan {followingCountDisplay}}} la, sina kama kute ala e ona.",
"domain_block_modal.you_will_lose_relationships": "jan li lon kulupu ni la ona kute e sina la, ona li kama kute ala e sina. jan li lon kulupu ni la sina kute e ona la, sina kama kute ala e ona.",
"domain_block_modal.you_wont_see_posts": "sina ken ala lukin e toki tan jan pi ma ni",
"domain_pill.server": "ma",
"domain_pill.their_handle": "nimi pi ona taso li ni:",
+ "domain_pill.their_server": "ni li ma ona lon ilo. toki ale ona li lon ma ni.",
+ "domain_pill.their_username": "ni li nimi ona lon ma ni. jan mute li lon ma ante la, nimi ona li ken sama.",
"domain_pill.username": "nimi jan",
+ "domain_pill.whats_in_a_handle": "seme li lon nimi?",
+ "domain_pill.who_they_are": "nimi ilo la sona jan en sona ma li lon. ni la sina ken toki tawa jan ni lon .",
+ "domain_pill.your_handle": "nimi sina:",
+ "domain_pill.your_server": "ni li ma sina lon ilo. toki ale sina li lon ma ni. ma li ike tawa sina la, sina ken tawa ma ante. ni la jan kute sina li tawa sama.",
"domain_pill.your_username": "ni li nimi sina. ma sina la, sina taso li jo e ona. jan mute li lon ma ante la, ona li ken jo e nimi sama.",
+ "embed.instructions": "o pana e toki ni la, toki li lon lipu ante. ",
"embed.preview": "ni li jo e sitelen ni:",
"emoji_button.activity": "musi",
"emoji_button.clear": "o weka",
@@ -225,6 +270,7 @@
"emoji_button.not_found": "sitelen pilin ala li lon",
"emoji_button.objects": "ijo",
"emoji_button.people": "jan",
+ "emoji_button.recent": "kepeken suli",
"emoji_button.search": "o alasa...",
"emoji_button.search_results": "ijo pi alasa ni",
"emoji_button.symbols": "sitelen",
@@ -249,6 +295,7 @@
"explore.title": "o alasa",
"explore.trending_links": "sin",
"explore.trending_statuses": "toki",
+ "explore.trending_tags": "kulupu pi lipu suli",
"filter_modal.added.settings_link": "lipu lawa",
"filter_modal.select_filter.expired": "tenpo pini",
"filter_modal.select_filter.search": "o alasa anu pali",
@@ -277,15 +324,23 @@
"hashtag.column_settings.tag_mode.all": "ale ni",
"hashtag.column_settings.tag_mode.any": "wan ni",
"hashtag.column_settings.tag_mode.none": "ala ni",
+ "hashtag.counter_by_accounts": "{count, plural, other {jan {counter}}}",
"hashtag.counter_by_uses": "{count, plural, other {toki {counter}}}",
+ "hashtag.follow": "o kute e kulupu lipu",
+ "hashtag.unfollow": "o kute ala e kulupu lipu",
"home.pending_critical_update.link": "o lukin e ijo ilo sin",
+ "info_button.label": "sona",
+ "interaction_modal.go": "o tawa ma ni",
"interaction_modal.on_another_server": "lon ma ante",
"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.reblog": "o wawa e toki {name}",
"interaction_modal.title.reply": "o toki lon toki pi jan {name}",
+ "interaction_modal.title.vote": "o pana tawa wile sona pi jan {name}",
+ "interaction_modal.username_prompt": "ni li sama ni: {example}",
"intervals.full.days": "{number, plural, other {suni #}}",
+ "intervals.full.hours": "{number, plural, other {tenpo suli #}}",
"keyboard_shortcuts.blocked": "o lukin e lipu sina pi jan weka",
"keyboard_shortcuts.boost": "o pana sin e toki",
"keyboard_shortcuts.down": "o tawa anpa lon lipu",
@@ -304,10 +359,17 @@
"lightbox.previous": "monsi",
"link_preview.author": "tan {name}",
"lists.delete": "o weka e kulupu lipu",
+ "lists.done": "ale li pini",
"lists.edit": "o ante e kulupu lipu",
+ "lists.list_members_count": "{count, plural, other {jan #}}",
+ "lists.list_name": "nimi kulupu",
+ "lists.new_list_name": "nimi pi kulupu sin",
+ "lists.no_lists_yet": "kulupu li lon ala.",
+ "lists.remove_member": "o weka",
"lists.replies_policy.followed": "jan kute ale",
"lists.replies_policy.list": "jan pi kulupu ni taso",
"lists.replies_policy.none": "jan ala",
+ "lists.search": "o alasa",
"load_pending": "{count, plural, other {ijo sin #}}",
"loading_indicator.label": "ni li kama…",
"mute_modal.title": "sina wile ala wile kute e jan ni?",
@@ -368,7 +430,7 @@
"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": "ale li pona",
"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.next": "awen",
@@ -377,7 +439,7 @@
"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.unfollow": "o pini kute e {name}",
+ "report.unfollow": "o kute ala e {name}",
"report_notification.categories.legal": "ike tawa nasin lawa",
"report_notification.categories.other": "ante",
"search.no_recent_searches": "alasa ala li lon tenpo poka",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 4ee3f40e56c4e5..484e6c6b731002 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -414,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Takip etmeyen kişilerin bildirimlerini yoksay?",
"ignore_notifications_modal.not_following_title": "Takip etmediğin kişilerin bildirimlerini yoksay?",
"ignore_notifications_modal.private_mentions_title": "İstenmeyen özel bahsetmelerden gelen bildirimleri yoksay?",
+ "info_button.label": "Yardım",
+ "info_button.what_is_alt_text": "
Alternatif metin nedir?
Alternatif metin, görme bozukluğu olan, düşük bant genişliğine sahip bağlantıları olan veya ekstra bağlam arayan kişiler için görsel açıklamaları sağlar.
Net, sade ve nesnel alternatif metin yazarak herkes için erişilebilirliği ve anlaşılabilirliği iyileştirebilirsiniz.
Önemlileri yakalayın
Resimlerdeki metni özetleyin
Düzenli cümle yapısı kullanın
Gereksiz bilgilerden kaçının
Karmaşık görsellerde (şemalar veya haritalar gibi) trendlere ve temel bulgulara odaklanın
",
"interaction_modal.action.favourite": "Devam etmek için, hesabınızı kullanarak beğenmelisiniz.",
"interaction_modal.action.follow": "Devam etmek için, hesabınızı kullanarak takip etmelisiniz.",
"interaction_modal.action.reblog": "Devam etmek için, hesabınızı kullanarak tekrar göndermelisiniz.",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index aa1abff2865a48..277c7df4a7dcc3 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -87,7 +87,11 @@
"alert.unexpected.title": "Ой!",
"alt_text_badge.title": "Альтернативний текст",
"alt_text_modal.add_alt_text": "Додати альтернативний текст",
+ "alt_text_modal.add_text_from_image": "Додати текст із малюнку",
"alt_text_modal.cancel": "Скасувати",
+ "alt_text_modal.change_thumbnail": "Змінити мініатюру",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Опишіть цю ідею для людей із порушеннями слуху…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Опишіть цю ідею для людей із порушеннями зору…",
"alt_text_modal.done": "Готово",
"announcement.announcement": "Оголошення",
"annual_report.summary.archetype.booster": "Мисливець на дописи",
@@ -410,6 +414,8 @@
"ignore_notifications_modal.not_followers_title": "Ігнорувати сповіщення від людей, які не підписані на вас?",
"ignore_notifications_modal.not_following_title": "Ігнорувати сповіщення від людей, на яких ви не підписалися?",
"ignore_notifications_modal.private_mentions_title": "Ігнорувати сповіщення від небажаних приватних згадок?",
+ "info_button.label": "Довідка",
+ "info_button.what_is_alt_text": "
Що таке альтернативний текст?
Альтернативний текст містить описи зображень для людей з вадами зору, низькошвидкісними з'єднаннями або тих, хто шукає додатковий контекст.
Ви можете покращити доступність і розуміння для всіх, написавши чіткий та лаконічний альтернативний текст.
Позначайте важливі елементи
Охоплюйте текст у картинках
Використовуйте звичайну структуру речень
Уникайте надлишкової інформації
Зосередьтеся на тенденціях і ключових висновках у складних візуальних формах (наприклад, діаграмах або картах)
",
"interaction_modal.action.favourite": "若欲繼續,您必須自您的帳號加入最愛。",
"interaction_modal.action.follow": "若欲繼續,您必須自您的帳號跟隨。",
"interaction_modal.action.reblog": "若欲繼續,您必須自您的帳號轉嘟。",
diff --git a/app/javascript/material-icons/400-24px/question_mark-fill.svg b/app/javascript/material-icons/400-24px/question_mark-fill.svg
new file mode 100644
index 00000000000000..9b02086c4d8756
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/question_mark-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/question_mark.svg b/app/javascript/material-icons/400-24px/question_mark.svg
new file mode 100644
index 00000000000000..9b02086c4d8756
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/question_mark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 2d2c0c2bcaa44f..d23d789e4664e7 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -451,6 +451,15 @@
background: darken($ui-base-color, 10%);
}
+.dropdown-button.warning {
+ border-color: #b3261e;
+ color: #b3261e;
+
+ &.active {
+ background-color: #f9dedc;
+ }
+}
+
.search__popout__menu__item {
&:hover,
&:active,
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 895872e233850f..1657fba44b6e13 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -50,6 +50,34 @@
}
}
+.help-button {
+ background: $ui-button-background-color;
+ border: 0;
+ color: $ui-button-color;
+ border-radius: 20px;
+ cursor: pointer;
+ width: 24px;
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:active,
+ &:focus,
+ &:hover {
+ background-color: $ui-button-focus-background-color;
+ }
+
+ &:focus-visible {
+ outline: $ui-button-icon-focus-outline;
+ }
+
+ .icon {
+ width: 14px;
+ height: 14px;
+ }
+}
+
.button {
background-color: $ui-button-background-color;
border: 10px none;
@@ -6091,6 +6119,20 @@ a.status-card {
}
}
+ &__popout {
+ background: var(--dropdown-background-color);
+ backdrop-filter: var(--background-filter);
+ border: 1px solid var(--dropdown-border-color);
+ box-shadow: var(--dropdown-shadow);
+ max-width: 320px;
+ padding: 16px;
+ border-radius: 8px;
+ z-index: 9999 !important;
+ font-size: 14px;
+ line-height: 20px;
+ color: $darker-text-color;
+ }
+
.copy-paste-text {
margin-bottom: 0;
}
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index a8949b7100ef6f..09ec0e9e41dc39 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -83,9 +83,12 @@ code {
&__toolbar {
margin-top: 16px;
display: flex;
- justify-content: space-between;
align-items: center;
gap: 16px;
+
+ .character-counter {
+ flex: 0 0 auto;
+ }
}
&.hidden {
@@ -561,11 +564,14 @@ code {
}
.stacked-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
margin-top: 30px;
margin-bottom: 15px;
}
- button:not(.button, .link-button) {
+ .btn {
display: block;
width: 100%;
border: 0;
@@ -582,8 +588,6 @@ code {
cursor: pointer;
font-weight: 500;
outline: 0;
- margin-bottom: 10px;
- margin-inline-end: 10px;
&:last-child {
margin-inline-end: 0;
diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb
index 5b9437eb8dad40..9122b07483e99f 100644
--- a/app/lib/activitypub/adapter.rb
+++ b/app/lib/activitypub/adapter.rb
@@ -17,7 +17,7 @@ def serializable_hash(options = nil)
options = serialization_options(options)
serialized_hash = serializer.serializable_hash(options.merge(named_contexts: named_contexts, context_extensions: context_extensions))
- serialized_hash = serialized_hash.select { |k, _| options[:fields].include?(k) } if options[:fields]
+ serialized_hash = serialized_hash.slice(*options[:fields]) if options[:fields]
serialized_hash = self.class.transform_key_casing!(serialized_hash, instance_options)
{ '@context': serialized_context(named_contexts, context_extensions) }.merge(serialized_hash)
diff --git a/app/lib/http_signature_draft.rb b/app/lib/http_signature_draft.rb
new file mode 100644
index 00000000000000..fc0d498b29150a
--- /dev/null
+++ b/app/lib/http_signature_draft.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+# This implements an older draft of HTTP Signatures:
+# https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures
+
+class HttpSignatureDraft
+ REQUEST_TARGET = '(request-target)'
+
+ def initialize(keypair, key_id, full_path: true)
+ @keypair = keypair
+ @key_id = key_id
+ @full_path = full_path
+ end
+
+ def request_target(verb, url)
+ if url.query.nil? || !@full_path
+ "#{verb} #{url.path}"
+ else
+ "#{verb} #{url.path}?#{url.query}"
+ end
+ end
+
+ def sign(signed_headers, verb, url)
+ signed_headers = signed_headers.merge(REQUEST_TARGET => request_target(verb, url))
+ signed_string = signed_headers.map { |key, value| "#{key.downcase}: #{value}" }.join("\n")
+ algorithm = 'rsa-sha256'
+ signature = Base64.strict_encode64(@keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string))
+
+ "keyId=\"#{@key_id}\",algorithm=\"#{algorithm}\",headers=\"#{signed_headers.keys.join(' ').downcase}\",signature=\"#{signature}\""
+ end
+end
diff --git a/app/lib/request.rb b/app/lib/request.rb
index f984f0e63e4d0a..4e86cc2fdfe893 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -61,8 +61,6 @@ def readpartial(size, buffer = nil)
end
class Request
- REQUEST_TARGET = '(request-target)'
-
# We enforce a 5s timeout on DNS resolving, 5s timeout on socket opening
# and 5s timeout on the TLS handshake, meaning the worst case should take
# about 15s in total
@@ -78,11 +76,18 @@ def initialize(verb, url, **options)
@http_client = options.delete(:http_client)
@allow_local = options.delete(:allow_local)
@full_path = !options.delete(:omit_query_string)
- @options = options.merge(socket_class: use_proxy? || @allow_local ? ProxySocket : Socket)
- @options = @options.merge(timeout_class: PerOperationWithDeadline, timeout_options: TIMEOUT)
+ @options = {
+ follow: {
+ max_hops: 3,
+ on_redirect: ->(response, request) { re_sign_on_redirect(response, request) },
+ },
+ socket_class: use_proxy? || @allow_local ? ProxySocket : Socket,
+ }.merge(options)
@options = @options.merge(proxy_url) if use_proxy?
@headers = {}
+ @signing = nil
+
raise Mastodon::HostValidationError, 'Instance does not support hidden service connections' if block_hidden_service?
set_common_headers!
@@ -92,8 +97,9 @@ def initialize(verb, url, **options)
def on_behalf_of(actor, sign_with: nil)
raise ArgumentError, 'actor must not be nil' if actor.nil?
- @actor = actor
- @keypair = sign_with.present? ? OpenSSL::PKey::RSA.new(sign_with) : @actor.keypair
+ key_id = ActivityPub::TagManager.instance.key_uri_for(actor)
+ keypair = sign_with.present? ? OpenSSL::PKey::RSA.new(sign_with) : actor.keypair
+ @signing = HttpSignatureDraft.new(keypair, key_id, full_path: @full_path)
self
end
@@ -119,7 +125,7 @@ def perform
end
def headers
- (@actor ? @headers.merge('Signature' => signature) : @headers).without(REQUEST_TARGET)
+ (@signing ? @headers.merge('Signature' => signature) : @headers)
end
class << self
@@ -134,14 +140,13 @@ def valid_url?(url)
end
def http_client
- HTTP.use(:auto_inflate).follow(max_hops: 3)
+ HTTP.use(:auto_inflate)
end
end
private
def set_common_headers!
- @headers[REQUEST_TARGET] = request_target
@headers['User-Agent'] = Mastodon::Version.user_agent
@headers['Host'] = @url.host
@headers['Date'] = Time.now.utc.httpdate
@@ -152,31 +157,28 @@ def set_digest!
@headers['Digest'] = "SHA-256=#{Digest::SHA256.base64digest(@options[:body])}"
end
- def request_target
- if @url.query.nil? || !@full_path
- "#{@verb} #{@url.path}"
- else
- "#{@verb} #{@url.path}?#{@url.query}"
- end
+ def signature
+ @signing.sign(@headers.without('User-Agent', 'Accept-Encoding'), @verb, @url)
end
- def signature
- algorithm = 'rsa-sha256'
- signature = Base64.strict_encode64(@keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string))
+ def re_sign_on_redirect(_response, request)
+ # Delete existing signature if there is one, since it will be invalid
+ request.headers.delete('Signature')
- "keyId=\"#{key_id}\",algorithm=\"#{algorithm}\",headers=\"#{signed_headers.keys.join(' ').downcase}\",signature=\"#{signature}\""
- end
+ return unless @signing.present? && @verb == :get
- def signed_string
- signed_headers.map { |key, value| "#{key.downcase}: #{value}" }.join("\n")
- end
+ signed_headers = request.headers.to_h.slice(*@headers.keys)
+ unless @headers.keys.all? { |key| signed_headers.key?(key) }
+ # We have lost some headers in the process, so don't sign the new
+ # request, in order to avoid issuing a valid signature with fewer
+ # conditions than expected.
- def signed_headers
- @headers.without('User-Agent', 'Accept-Encoding')
- end
+ Rails.logger.warn { "Some headers (#{@headers.keys - signed_headers.keys}) have been lost on redirect from {@uri} to #{request.uri}, this should not happen. Skipping signatures" }
+ return
+ end
- def key_id
- ActivityPub::TagManager.instance.key_uri_for(@actor)
+ signature_value = @signing.sign(signed_headers.without('User-Agent', 'Accept-Encoding'), @verb, Addressable::URI.parse(request.uri))
+ request.headers['Signature'] = signature_value
end
def http_client
diff --git a/app/models/poll.rb b/app/models/poll.rb
index 93ef0cc58929d1..7c59339b7e831e 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -37,7 +37,8 @@ class Poll < ApplicationRecord
validates :options, presence: true
validates :expires_at, presence: true, if: :local?
- validates_with PollValidator, on: :create, if: :local?
+ validates_with PollOptionsValidator, if: :local?
+ validates_with PollExpirationValidator, if: -> { local? && expires_at_changed? }
before_validation :prepare_options, if: :local?
before_validation :prepare_votes_count
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index dee9e5ab0e5a1b..bc22880dcc216f 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -19,10 +19,10 @@ def max_feed_hashtags
def poll_limits
{
- max_options: PollValidator::MAX_OPTIONS,
- max_option_chars: PollValidator::MAX_OPTION_CHARS,
- min_expiration: PollValidator::MIN_EXPIRATION,
- max_expiration: PollValidator::MAX_EXPIRATION,
+ max_options: PollOptionsValidator::MAX_OPTIONS,
+ max_option_chars: PollOptionsValidator::MAX_OPTION_CHARS,
+ min_expiration: PollExpirationValidator::MIN_EXPIRATION,
+ max_expiration: PollExpirationValidator::MAX_EXPIRATION,
}
end
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index 3c88c4e1274c56..ec33fb39a2917c 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -88,10 +88,10 @@ def configuration
},
polls: {
- max_options: PollValidator::MAX_OPTIONS,
- max_characters_per_option: PollValidator::MAX_OPTION_CHARS,
- min_expiration: PollValidator::MIN_EXPIRATION,
- max_expiration: PollValidator::MAX_EXPIRATION,
+ max_options: PollOptionsValidator::MAX_OPTIONS,
+ max_characters_per_option: PollOptionsValidator::MAX_OPTION_CHARS,
+ min_expiration: PollExpirationValidator::MIN_EXPIRATION,
+ max_expiration: PollExpirationValidator::MAX_EXPIRATION,
},
translation: {
diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb
index 77ee92ca0c44b2..420f1926cfa275 100644
--- a/app/serializers/rest/v1/instance_serializer.rb
+++ b/app/serializers/rest/v1/instance_serializer.rb
@@ -42,10 +42,10 @@ def max_toot_chars
def poll_limits
{
- max_options: PollValidator::MAX_OPTIONS,
- max_option_chars: PollValidator::MAX_OPTION_CHARS,
- min_expiration: PollValidator::MIN_EXPIRATION,
- max_expiration: PollValidator::MAX_EXPIRATION,
+ max_options: PollOptionsValidator::MAX_OPTIONS,
+ max_option_chars: PollOptionsValidator::MAX_OPTION_CHARS,
+ min_expiration: PollExpirationValidator::MIN_EXPIRATION,
+ max_expiration: PollExpirationValidator::MAX_EXPIRATION,
}
end
@@ -84,10 +84,10 @@ def configuration
},
polls: {
- max_options: PollValidator::MAX_OPTIONS,
- max_characters_per_option: PollValidator::MAX_OPTION_CHARS,
- min_expiration: PollValidator::MIN_EXPIRATION,
- max_expiration: PollValidator::MAX_EXPIRATION,
+ max_options: PollOptionsValidator::MAX_OPTIONS,
+ max_characters_per_option: PollOptionsValidator::MAX_OPTION_CHARS,
+ min_expiration: PollExpirationValidator::MIN_EXPIRATION,
+ max_expiration: PollExpirationValidator::MAX_EXPIRATION,
},
}
end
diff --git a/app/validators/poll_expiration_validator.rb b/app/validators/poll_expiration_validator.rb
new file mode 100644
index 00000000000000..ea8b08e186be3b
--- /dev/null
+++ b/app/validators/poll_expiration_validator.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class PollExpirationValidator < ActiveModel::Validator
+ MAX_EXPIRATION = 1.month.freeze
+ MIN_EXPIRATION = 5.minutes.freeze
+
+ def validate(poll)
+ current_time = Time.now.utc
+
+ poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_long')) if poll.expires_at.nil? || poll.expires_at - current_time > MAX_EXPIRATION
+ poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_short')) if poll.expires_at.present? && (poll.expires_at - current_time).ceil < MIN_EXPIRATION
+ end
+end
diff --git a/app/validators/poll_validator.rb b/app/validators/poll_options_validator.rb
similarity index 60%
rename from app/validators/poll_validator.rb
rename to app/validators/poll_options_validator.rb
index 1aaf5a5d024ff1..cfd808c9c3ed87 100644
--- a/app/validators/poll_validator.rb
+++ b/app/validators/poll_options_validator.rb
@@ -1,19 +1,13 @@
# frozen_string_literal: true
-class PollValidator < ActiveModel::Validator
+class PollOptionsValidator < ActiveModel::Validator
MAX_OPTIONS = (ENV['MAX_POLL_OPTIONS'] || 5).to_i
MAX_OPTION_CHARS = (ENV['MAX_POLL_OPTION_CHARS'] || 100).to_i
- MAX_EXPIRATION = 1.month.freeze
- MIN_EXPIRATION = 5.minutes.freeze
def validate(poll)
- current_time = Time.now.utc
-
poll.errors.add(:options, I18n.t('polls.errors.too_few_options')) unless poll.options.size > 1
poll.errors.add(:options, I18n.t('polls.errors.too_many_options', max: MAX_OPTIONS)) if poll.options.size > MAX_OPTIONS
poll.errors.add(:options, I18n.t('polls.errors.over_character_limit', max: MAX_OPTION_CHARS)) if poll.options.any? { |option| option.mb_chars.grapheme_length > MAX_OPTION_CHARS }
poll.errors.add(:options, I18n.t('polls.errors.duplicate_options')) unless poll.options.uniq.size == poll.options.size
- poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_long')) if poll.expires_at.nil? || poll.expires_at - current_time > MAX_EXPIRATION
- poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_short')) if poll.expires_at.present? && (poll.expires_at - current_time).ceil < MIN_EXPIRATION
end
end
diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml
index afeeef0c6d5d66..5e9aa02d68331f 100644
--- a/app/views/auth/registrations/new.html.haml
+++ b/app/views/auth/registrations/new.html.haml
@@ -72,7 +72,7 @@
.fields-group
= f.input :agreement,
as: :boolean,
- label: t('auth.user_agreement_html', privacy_policy_path: privacy_policy_path, terms_of_service_path: terms_of_service_path),
+ label: TermsOfService.live.exists? ? t('auth.user_agreement_html', privacy_policy_path: privacy_policy_path, terms_of_service_path: terms_of_service_path) : t('auth.user_privacy_agreement_html', privacy_policy_path: privacy_policy_path),
required: false,
wrapper: :with_label
diff --git a/bin/prometheus_exporter b/bin/prometheus_exporter
new file mode 100755
index 00000000000000..7e0304de9eb50f
--- /dev/null
+++ b/bin/prometheus_exporter
@@ -0,0 +1,27 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+#
+# This file was generated by Bundler.
+#
+# The application 'prometheus_exporter' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
+
+bundle_binstub = File.expand_path("bundle", __dir__)
+
+if File.file?(bundle_binstub)
+ if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
+ load(bundle_binstub)
+ else
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
+Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
+ end
+end
+
+require "rubygems"
+require "bundler/setup"
+
+load Gem.bin_path("prometheus_exporter", "prometheus_exporter")
diff --git a/config/initializers/prometheus_exporter.rb b/config/initializers/prometheus_exporter.rb
new file mode 100644
index 00000000000000..197777e3b65bbd
--- /dev/null
+++ b/config/initializers/prometheus_exporter.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true'
+ if ENV['MASTODON_PROMETHEUS_EXPORTER_LOCAL'] == 'true'
+ require 'prometheus_exporter/server'
+ require 'prometheus_exporter/client'
+
+ # bind is the address, on which the webserver will listen
+ # port is the port that will provide the /metrics route
+ server = PrometheusExporter::Server::WebServer.new bind: ENV.fetch('MASTODON_PROMETHEUS_EXPORTER_HOST', 'localhost'), port: ENV.fetch('MASTODON_PROMETHEUS_EXPORTER_PORT', '9394').to_i
+ server.start
+
+ # wire up a default local client
+ PrometheusExporter::Client.default = PrometheusExporter::LocalClient.new(collector: server.collector)
+ end
+
+ if ENV['MASTODON_PROMETHEUS_EXPORTER_WEB_DETAILED_METRICS'] == 'true'
+ # Optional, as those metrics might generate extra overhead and be redundant with what OTEL provides
+ require 'prometheus_exporter/middleware'
+
+ # Per-action/controller request stats like HTTP status and timings
+ Rails.application.middleware.unshift PrometheusExporter::Middleware
+ end
+end
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 5b281c4339ef77..fca0bec422b54e 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -22,6 +22,48 @@
end
end
+ if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true'
+ require 'prometheus_exporter'
+ require 'prometheus_exporter/instrumentation'
+
+ config.on :startup do
+ # Ruby process metrics (memory, GC, etc)
+ PrometheusExporter::Instrumentation::Process.start type: 'sidekiq'
+
+ # Sidekiq process metrics (concurrency, busy, etc)
+ PrometheusExporter::Instrumentation::SidekiqProcess.start
+
+ # ActiveRecord metrics (connection pool usage)
+ PrometheusExporter::Instrumentation::ActiveRecord.start(
+ custom_labels: { type: 'sidekiq' },
+ config_labels: [:database, :host]
+ )
+
+ if ENV['MASTODON_PROMETHEUS_EXPORTER_SIDEKIQ_DETAILED_METRICS'] == 'true'
+ # Optional, as those metrics might generate extra overhead and be redundant with what OTEL provides
+
+ # Per-job metrics
+ config.server_middleware do |chain|
+ chain.add PrometheusExporter::Instrumentation::Sidekiq
+ end
+ config.death_handlers << PrometheusExporter::Instrumentation::Sidekiq.death_handler
+
+ # Per-queue metrics for queues handled by this process (size, latency, etc)
+ # They will be reported by every process handling those queues, so do not sum them up
+ PrometheusExporter::Instrumentation::SidekiqQueue.start
+
+ # Global Sidekiq metrics (size of the global queues, number of jobs, etc)
+ # Will be the same for every Sidekiq process
+ PrometheusExporter::Instrumentation::SidekiqStats.start
+ end
+ end
+
+ at_exit do
+ # Wait for the latest metrics to be reported before shutting down
+ PrometheusExporter::Client.default.stop(wait_timeout_seconds: 10)
+ end
+ end
+
config.server_middleware do |chain|
chain.add Mastodon::SidekiqMiddleware
end
diff --git a/config/locales/activerecord.ar.yml b/config/locales/activerecord.ar.yml
index cacbf0714f5e3c..7426e21e21a201 100644
--- a/config/locales/activerecord.ar.yml
+++ b/config/locales/activerecord.ar.yml
@@ -15,6 +15,9 @@ ar:
user/invite_request:
text: الغرض
errors:
+ attributes:
+ domain:
+ invalid: ليس بإسم نطاق صالح
models:
account:
attributes:
diff --git a/config/locales/activerecord.el.yml b/config/locales/activerecord.el.yml
index a6108ec0ca8c22..9b17b7593998f9 100644
--- a/config/locales/activerecord.el.yml
+++ b/config/locales/activerecord.el.yml
@@ -23,6 +23,8 @@ el:
models:
account:
attributes:
+ fields:
+ fields_with_values_missing_labels: περιέχει τιμές με ετικέτες που λείπουν
username:
invalid: μόνο γράμματα, αριθμοί και κάτω παύλες
reserved: είναι δεσμευμένο
diff --git a/config/locales/activerecord.ko.yml b/config/locales/activerecord.ko.yml
index 5dbd2e3d78e41d..9442c3aae3d9ac 100644
--- a/config/locales/activerecord.ko.yml
+++ b/config/locales/activerecord.ko.yml
@@ -23,6 +23,8 @@ ko:
models:
account:
attributes:
+ fields:
+ fields_with_values_missing_labels: 라벨 없는 값들이 존재합니다
username:
invalid: 영문자와 숫자, 밑줄만 사용 가능합니다
reserved: 예약되어 있습니다
diff --git a/config/locales/activerecord.pl.yml b/config/locales/activerecord.pl.yml
index 06b358700836dc..62edc03c0eafa5 100644
--- a/config/locales/activerecord.pl.yml
+++ b/config/locales/activerecord.pl.yml
@@ -23,6 +23,8 @@ pl:
models:
account:
attributes:
+ fields:
+ fields_with_values_missing_labels: zawiera wartości z brakującymi etykietami
username:
invalid: może składać się tylko z liter, cyfr i podkreślników
reserved: jest zarezerwowana
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 5eea1390ce9521..556c47b10bdfed 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -834,6 +834,7 @@ ar:
batch:
remove_from_report: إزالة من التقرير
report: إبلاغ
+ contents: المحتوى
deleted: محذوف
favourites: المفضلة
history: تاريخ التعديلات
@@ -910,6 +911,9 @@ ar:
search: البحث
title: الوسوم
updated_msg: تم تحديث إعدادات الوسوم بنجاح
+ terms_of_service:
+ save_draft: حفظ المسودة
+ title: شروط الخدمة
title: الإدارة
trends:
allow: السماح
@@ -1813,6 +1817,8 @@ ar:
too_late: فات الأوان للطعن في هذه العقوبة
tags:
does_not_match_previous_name: لا يطابق الإسم السابق
+ terms_of_service:
+ title: شروط الخدمة
themes:
contrast: ماستدون (تباين عالٍ)
default: ماستدون (داكن)
@@ -1873,6 +1879,8 @@ ar:
further_actions_html: إذا لم يكن هذا أنت، نوصي لك %{action} على الفور وتمكين المصادقة ذات العاملين للحفاظ على أمان حسابك.
subject: تم النفاذ عبر حسابك من خلال عنوان إيبي جديد
title: تسجيل دخول جديد
+ terms_of_service_changed:
+ title: تحديث مهم
warning:
appeal: تقديم طعن
appeal_description: إذا كنت تعتقد أن هذا خطأ، يمكنك تقديم طعن إلى فريق %{instance}.
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index acd103a2507868..c602b36c8c3129 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -1206,6 +1206,7 @@ ca:
too_fast: Formulari enviat massa ràpid, torna a provar-ho.
use_security_key: Usa clau de seguretat
user_agreement_html: He llegit i estic d'acord amb les condicions de servei i la política de privadesa
+ user_privacy_agreement_html: He llegit i estic d'acord amb la política de privacitat
author_attribution:
example_title: Text d'exemple
hint_html: Escriviu notícies o un blog fora de Mastodon? Controleu quin crèdit rebeu quan es comparteixen aquí.
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 135975c3c8c7ae..3ca73a3a149d45 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -1247,6 +1247,7 @@ cs:
too_fast: Formulář byl odeslán příliš rychle, zkuste to znovu.
use_security_key: Použít bezpečnostní klíč
user_agreement_html: Přečetl jsem si a souhlasím s podmínkami služby a ochranou osobních údajů
+ user_privacy_agreement_html: Četl jsem a souhlasím se zásadami ochrany osobních údajů
author_attribution:
example_title: Ukázkový text
hint_html: Píšete novinové články nebo blog mimo Mastodon? Kontrolujte, jak Vám bude připisováno autorství, když jsou sdíleny na Mastodonu.
diff --git a/config/locales/da.yml b/config/locales/da.yml
index c571c0990290d8..b567fa016c8aff 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -1209,6 +1209,7 @@ da:
too_fast: Formularen indsendt for hurtigt, forsøg igen.
use_security_key: Brug sikkerhedsnøgle
user_agreement_html: Jeg accepterer Tjenestevilkår og Fortrolighedspolitik
+ user_privacy_agreement_html: Jeg accepterer fortrolighedspolitikken
author_attribution:
example_title: Eksempeltekst
hint_html: Skriver du nyheder eller blogartikler uden for Mastodon? Styr, hvordan man bliver krediteret, når disse deles på Mastodon.
diff --git a/config/locales/de.yml b/config/locales/de.yml
index d1d557432b668e..17c5098e2035bb 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -1209,6 +1209,7 @@ de:
too_fast: Formular zu schnell übermittelt. Bitte versuche es erneut.
use_security_key: Sicherheitsschlüssel verwenden
user_agreement_html: Ich stimme den Nutzungsbedingungen sowie der Datenschutzerklärung zu
+ user_privacy_agreement_html: Ich stimme der Datenschutzerklärung zu
author_attribution:
example_title: Beispieltext
hint_html: Schreibst du außerhalb von Mastodon journalistische Artikel oder andere Texte, beispielsweise in einem Blog? Lege hier fest, wann auf dein Profil verwiesen werden soll, wenn Links zu deinen Werken auf Mastodon geteilt werden.
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 1cd14be7f91870..0c40ffabdc4634 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -1209,6 +1209,7 @@ el:
too_fast: Η φόρμα υποβλήθηκε πολύ γρήγορα, προσπαθήστε ξανά.
use_security_key: Χρήση κλειδιού ασφαλείας
user_agreement_html: Έχω διαβάσει με τους όρους παροχής υπηρεσιών και την πολιτική απορρήτου
+ user_privacy_agreement_html: Έχω διαβάσει και συμφωνώ με την πολιτική απορρήτου
author_attribution:
example_title: Δείγμα κειμένου
hint_html: Γράφεις ειδήσεις ή blog άρθρα εκτός του Mastodon; Έλεγξε πώς μπορείς να πάρεις τα εύσημα όταν μοιράζονται στο Mastodon.
diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
index 7a26de73c0f986..c8c3e486b79e88 100644
--- a/config/locales/en-GB.yml
+++ b/config/locales/en-GB.yml
@@ -1209,6 +1209,7 @@ en-GB:
too_fast: Form submitted too fast, try again.
use_security_key: Use security key
user_agreement_html: I have read and agree to the terms of service and privacy policy
+ user_privacy_agreement_html: I have read and agree to the privacy policy
author_attribution:
example_title: Sample text
hint_html: Are you writing news or blog articles outside of Mastodon? Control how you get credited when they are shared on Mastodon.
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ab76b462ee5fbb..fdf73bad9e247a 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1209,6 +1209,7 @@ en:
too_fast: Form submitted too fast, try again.
use_security_key: Use security key
user_agreement_html: I have read and agree to the terms of service and privacy policy
+ user_privacy_agreement_html: I have read and agree to the privacy policy
author_attribution:
example_title: Sample text
hint_html: Are you writing news or blog articles outside of Mastodon? Control how you get credited when they are shared on Mastodon.
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 400b03958ef6e7..d56d67e28ea0b3 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -1209,6 +1209,7 @@ eo:
too_fast: Formularo sendita tro rapide, klopodu denove.
use_security_key: Uzi sekurecan ŝlosilon
user_agreement_html: Mi legis kaj konsentas pri la servokondiĉoj kaj privateca politiko
+ user_privacy_agreement_html: Mi legis kaj konsentis pri privatpolitiko
author_attribution:
example_title: Ekzempla teksto
hint_html: Ĉu vi skribas novaĵojn aŭ blogartikolojn ekster Mastodon? Kontrolu kiel vi estas kreditita kiam ili estas kunhavataj ĉe Mastodon.
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index e3bcc5e5b5ec6a..2f313da8d40039 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -1209,6 +1209,7 @@ es-AR:
too_fast: Formulario enviado demasiado rápido, probá de nuevo.
use_security_key: Usar la llave de seguridad
user_agreement_html: Leí y acepto los términos del servicio y la política de privacidad
+ user_privacy_agreement_html: Leí y acepto la política de privacidad
author_attribution:
example_title: Texto de ejemplo
hint_html: "¿Escribís artículos de noticias o de blog fuera de Mastodon? Controlá cómo se te acredita cuando se comparten en Mastodon."
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 6bdee869e7b841..135ca6cc78f6f7 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -1209,6 +1209,7 @@ es-MX:
too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo.
use_security_key: Usar la clave de seguridad
user_agreement_html: He leído y acepto las condiciones del servicio y la política de privacidad
+ user_privacy_agreement_html: Leí y acepto la política de privacidad
author_attribution:
example_title: Texto de ejemplo
hint_html: "¿Estás escribiendo artículos de noticias o blogs fuera de Mastodon? Controla cómo te acreditan cuando se comparten en Mastodon."
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 5e3374ae8ccfa7..7f7473f18fd34d 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1209,6 +1209,7 @@ es:
too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo.
use_security_key: Usar la clave de seguridad
user_agreement_html: He leído y acepto los términos del servicio y la política de privacidad
+ user_privacy_agreement_html: He leído y acepto la política de privacidad
author_attribution:
example_title: Texto de ejemplo
hint_html: "¿Escribes noticias o artículos de blog fuera de Mastodon? Controla cómo se te acredita cuando se comparten en Mastodon."
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 97a8da3704137e..97943a46bb9f97 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -25,6 +25,7 @@ eu:
admin:
account_actions:
action: Burutu ekintza
+ already_silenced: Kontu hau dagoeneko mugatua izan da.
already_suspended: Kontu hau dagoeneko kanporatua izan da.
title: Burutu moderazio ekintza %{acct} kontuan
account_moderation_notes:
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 8f96137bdbdcff..8a5d36e1e3efa0 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -388,7 +388,7 @@ fa:
website: پایگاه وب
disputes:
appeals:
- empty: هیچ درخواست تجدیدنظری یافت نشد
+ empty: هیچ درخواست تجدیدنظری یافت نشد.
title: درخواستهای تجدیدنظر
domain_allows:
add_new: مجاز کردن دامنه
@@ -672,7 +672,7 @@ fa:
actions:
delete_html: پست های توهین آمیز را حذف کنید
mark_as_sensitive_html: رسانه پست های توهین آمیز را به عنوان حساس علامت گذاری کنید
- silence_html: دسترسی @%{acct} را به شدت محدود کنید و نمایه و محتویات آنها را فقط برای افرادی که قبلاً آنها را دنبال میکنند قابل مشاهده کنید یا به صورت دستی نمایه آن را جستجو کنید.
+ silence_html: دسترسی @%{acct} را به شدت محدود کنید و نمایه و محتویات آنها را فقط برای افرادی که قبلاً آنها را دنبال میکنند قابل مشاهده کنید یا به صورت دستی نمایه آن را جستجو کنید
suspend_html: تعلیق @%{acct}، غیرقابل دسترس کردن نمایه و محتوای آنها و تعامل با آنها غیر ممکن
close_report: 'علامت گذاری گزارش #%{id} به عنوان حل شده است'
close_reports_html: "همه گزارشها در برابر @%{acct} را بهعنوان حلوفصل علامتگذاری کنید"
@@ -1209,6 +1209,7 @@ fa:
too_fast: فرم با سرعت بسیار زیادی فرستاده شد، دوباره تلاش کنید.
use_security_key: استفاده از کلید امنیتی
user_agreement_html: من خوانده ام و موافقم شرایط خدمات و سیاست حفظ حریم خصوصی
+ user_privacy_agreement_html: من خطمشی رازداری را خواندهام و با آن موافقم
author_attribution:
example_title: متن نمونه
hint_html: آیا در خارج از ماستودون اخبار یا مقالات وبلاگ می نویسید؟ نحوه دریافت اعتبار زمانی که آنها در ماستودون به اشتراک گذاشته می شوند را کنترل کنید.
@@ -1434,8 +1435,8 @@ fa:
other: شما میخواهید لیست حسابهای بیصدا را جایگزین کنید با حداکثر %{count} حساب از %{filename}.
preambles:
blocking_html:
- one: شما در شرف مسدود کردن حداکثر %{count} حساب از %{filename} هستید.
- other: شما در شرف مسدود کردن حداکثر %{count} حساب از %{filename} هستید.
+ one: شما در شرف مسدود کردن حداکثر %{count} حساب از %{filename} هستید.
+ other: شما در شرف مسدود کردن حداکثر %{count} حساب از %{filename} هستید.
bookmarks_html:
one: شما میخواهید تا %{count} پست را از %{filename} به نشانکها خود اضافه کنید.
other: شما میخواهید تا %{count} پست را از %{filename} به نشانکها خود اضافه کنید.
@@ -1449,10 +1450,8 @@ fa:
one: شما در حال افزودن %{count} حساب از %{filename} به لیستهای خود هستید. اگر لیستی برای افزودن وجود نداشته باشد، لیست های جدیدی ایجاد می شود.
other: شما میخواهید تا %{count} حساب از %{filename} را به فهرستهای خود اضافه کنید. اگر لیستی برای افزودن وجود نداشته باشد، لیست های جدیدی ایجاد می شود.
muting_html:
- one: 'شما در حال انجام بی صدا تا %{count} حساب کاربری از %{filename}.
-
- '
- other:
+ one: شما در حال بی صدا کردن تا %{count} حساب از %{filename} هستید.
+ other: شما در حال بی صدا کردن تا %{count} حساب از %{filename} هستید.
preface: میتوانید دادههایی را که از کارسازی دیگر برونریختهاید، چون سیاههای از افرادی که پی گرفته یا مسدود میکنید را درونریزی کنید.
recent_imports: واردشدههای اخیر
states:
@@ -1883,7 +1882,7 @@ fa:
formats:
default: "%d %b %Y, %H:%M"
month: "%b %Y"
- time: "%OH:%OM"
+ time: "%H:%M"
with_time_zone: "%b %d, %Y, %H:%M %Z"
translation:
errors:
@@ -1965,7 +1964,7 @@ fa:
none: هشدار برای %{acct}
sensitive: فرستههایتان روی %{acct} از اکنون به عنوان حسّاس علامت خواهند خورد
silence: حساب %{acct} شما محدود شده است
- suspend: حساب %{acct} شما معلق شده است
+ suspend: حساب %{acct} شما معلق شده است
title:
delete_statuses: فرستهها برداشته شدند
disable: حساب متوقف شده است
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 064ca67cbf430d..c7148772b80994 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -1209,6 +1209,7 @@ fi:
too_fast: Lomake lähetettiin liian nopeasti, yritä uudelleen.
use_security_key: Käytä suojausavainta
user_agreement_html: Olen lukenut ja hyväksyn käyttöehdot ja tietosuojakäytännön
+ user_privacy_agreement_html: Olen lukenut ja hyväksyn tietosuojakäytännön
author_attribution:
example_title: Esimerkkiteksti
hint_html: Kirjoitatko uutisia tai blogitekstejä Mastodonin ulkopuolella? Määrää, kuinka tulet tunnustetuksi, kun niitä jaetaan Mastodonissa.
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index 441217ec0ef833..df99926a4c46a9 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -1206,6 +1206,7 @@ fo:
too_fast: Oyðublaðið innsent ov skjótt, royn aftur.
use_security_key: Brúka trygdarlykil
user_agreement_html: Eg havi lisið og taki undir við tænastutreytunum og privatlívspolitikkinum
+ user_privacy_agreement_html: I have lisið og taki undir við privatlívspolitikkinum
author_attribution:
example_title: Tekstadømi
hint_html: Skrivar tú tíðindi ella greinar til bloggin uttanfyri Mastodon? Her kanst tú stýra, hvussu tú verður tilsipað/ur, tá ið títt tilfar verður deilt á Mastodon.
diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml
index 4fefee7ae09a55..37c34b767848f2 100644
--- a/config/locales/fr-CA.yml
+++ b/config/locales/fr-CA.yml
@@ -1212,6 +1212,7 @@ fr-CA:
too_fast: Formulaire envoyé trop rapidement, veuillez réessayer.
use_security_key: Utiliser la clé de sécurité
user_agreement_html: J'ai lu et j'accepte les conditions d'utilisation et la politique de confidentialité
+ user_privacy_agreement_html: J’ai lu et j’accepte la politique de confidentialité
author_attribution:
example_title: Exemple de texte
hint_html: Vous écrivez des nouvelles ou des articles de blog en dehors de Mastodon ? Contrôlez la façon dont vous êtes crédité lorsqu'ils sont partagés sur Mastodon.
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 3000f9a4a9130d..0c1e248467ac7c 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -1212,6 +1212,7 @@ fr:
too_fast: Formulaire envoyé trop rapidement, veuillez réessayer.
use_security_key: Utiliser la clé de sécurité
user_agreement_html: J'ai lu et j'accepte les conditions d'utilisation et la politique de confidentialité
+ user_privacy_agreement_html: J’ai lu et j’accepte la politique de confidentialité
author_attribution:
example_title: Exemple de texte
hint_html: Vous écrivez des nouvelles ou des articles de blog en dehors de Mastodon ? Contrôlez la façon dont vous êtes crédité lorsqu'ils sont partagés sur Mastodon.
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 63a2b9b340ab86..fe0b00fec22ac9 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -1209,6 +1209,7 @@ gl:
too_fast: Formulario enviado demasiado rápido, inténtao outra vez.
use_security_key: Usa chave de seguridade
user_agreement_html: Lin e acepto os termos do servizo e a política de privacidade
+ user_privacy_agreement_html: Lin e acepto a política de privacidade
author_attribution:
example_title: Texto de mostra
hint_html: Escribes novas ou artigos nun blog alleos a Mastodon? Xestiona o xeito en que podes dar crédito da túa autoría cando os compartes en Mastodon.
diff --git a/config/locales/he.yml b/config/locales/he.yml
index eea4c631797589..0a68d338f0841c 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -1247,6 +1247,7 @@ he:
too_fast: הטופס הוגש מהר מדי, נסה/י שוב.
use_security_key: שימוש במפתח אבטחה
user_agreement_html: קראתי וזו הסכמתי למסמך תנאי השירות ומדיניות הפרטיות
+ user_privacy_agreement_html: קראתי והסכמתי למדיניות הפרטיות
author_attribution:
example_title: טקסט לדוגמה
hint_html: האם יש לך בלוג או טור חדשות שמתפרסם מחוץ למסטודון? ניתן לשלוט איך יוצג הקרדיט שלך כשמשתפים את הלינק במסטודון.
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index da51e3b5a90bcd..722c3617107ba2 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -1209,6 +1209,7 @@ hu:
too_fast: Túl gyorsan küldted el az űrlapot, próbáld később.
use_security_key: Biztonsági kulcs használata
user_agreement_html: Elolvastam és egyetértek a felhasználási feltételekkel és az adatvédelmi nyilatkozattal
+ user_privacy_agreement_html: Elolvastam és egyetértek az adatvédemi nyilatkozattal
author_attribution:
example_title: Mintaszöveg
hint_html: Mastodonon kívül írsz híreket vagy blogbejegyzéseket? Szabályozd, hogyan tüntethetnek fel szerzőként, amikor Mastodonon osztják meg őket.
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 229cbb56bf03ef..c4172f238d4e34 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -1213,6 +1213,7 @@ is:
too_fast: Innfyllingarform sent inn of hratt, prófaðu aftur.
use_security_key: Nota öryggislykil
user_agreement_html: Ég hef lesið og samþykkt þjónustuskilmálana og stefnuna um persónuvernd
+ user_privacy_agreement_html: Ég hef lesið og samþykkt persónuverndarstefnuna
author_attribution:
example_title: Sýnitexti
hint_html: Ertu að skrifa fréttir eða bloggfærslur utan Mastodon? Stýrðu því hvernig vitnað er í þig þegar þeim er deilt á Mastodon.
diff --git a/config/locales/it.yml b/config/locales/it.yml
index a561079f3ab936..734860f3bbdcf1 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -1211,6 +1211,7 @@ it:
too_fast: Modulo inviato troppo velocemente, riprova.
use_security_key: Usa la chiave di sicurezza
user_agreement_html: Ho letto e accetto i termini di servizio e l'informativa sulla privacy
+ user_privacy_agreement_html: Ho letto e accetto l'informativa sulla privacy
author_attribution:
example_title: Testo di esempio
hint_html: Stai scrivendo notizie o articoli di blog al di fuori di Mastodon? Controlla come vieni accreditato quando vengono condivisi su Mastodon.
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 201bdc1a0888c9..77670f0ec30758 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -1190,6 +1190,7 @@ ja:
too_fast: フォームの送信が速すぎます。もう一度やり直してください。
use_security_key: セキュリティキーを使用
user_agreement_html: 利用規約 および プライバシーポリシーを読み、同意します。
+ user_privacy_agreement_html: プライバシーポリシーを読み、同意します
author_attribution:
example_title: サンプルテキスト
hint_html: Mastodonの外でニュースやブログなどを執筆しているユーザーは、Mastodonで自分の記事が共有されたときに著者情報を表示させることができます。
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index 314029a89ede52..11cc8b331835c9 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -413,6 +413,7 @@ kab:
account: Ameskar
application: Asnas
back_to_account: Tuɣalin ɣer usebter n umiḍan
+ contents: Agbur
deleted: Yettwakkes
favourites: Imenyafen
language: Tutlayt
@@ -432,6 +433,9 @@ kab:
tags:
search: Anadi
title: Ihacṭagen
+ terms_of_service:
+ draft: Arewway
+ publish: Asuffeɣ
title: Tadbelt
trends:
allow: Sireg
@@ -781,6 +785,7 @@ kab:
delete: Tukksa n umiḍan
development: Taneflit
edit_profile: Ẓreg amaɣnu
+ export: Sifeḍ
import: Kter
import_and_export: Taktert d usifeḍ
migrate: Tunigin n umiḍan
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index f7469ce25a1cc5..5405cabd9b4002 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -301,8 +301,8 @@ ko:
update_user_role_html: "%{name} 님이 %{target} 역할을 수정했습니다"
deleted_account: 계정을 삭제했습니다
empty: 로그를 찾을 수 없습니다
- filter_by_action: 행동으로 거르기
- filter_by_user: 사용자로 거르기
+ filter_by_action: 동작 별 필터
+ filter_by_user: 사용자 기준으로 필터
title: 감사 로그
unavailable_instance: "(도메인네임 사용불가)"
announcements:
@@ -925,9 +925,12 @@ ko:
generates:
action: 생성
chance_to_review_html: "생성된 이용 약관은 자동으로 게시되지 않을 것입니다. 결과를 확인할 기회가 있습니다. 진행하려면 필요한 정보들을 입력하세요."
+ explanation_html: 제공되는 이용약관 틀은 정보 제공만을 목적으로 하며 법률 조언으로 해석하면 안 됩니다. 귀하의 상황에 맞는 법률 자문을 받아주시기 바랍니다.
title: 이용 약관 설정
history: 역사
live: 활성
+ no_history: 기록된 이용약관 변경이 아직 없습니다.
+ no_terms_of_service_html: 현재 설정된 이용약관이 없습니다. 이용약관은 명확성을 제공하고 귀하와 사용자간 분쟁에서 발생할 수 있는 책임으로부터 보호할 수 있습니다.
notified_on_html: 사용자들이 %{date}에 알림을 받았습니다
notify_users: 사용자들에게 알리기
preview:
@@ -1189,6 +1192,7 @@ ko:
too_fast: 너무 빠르게 양식이 제출되었습니다, 다시 시도하세요.
use_security_key: 보안 키 사용
user_agreement_html: 이용 약관과 개인정보처리방침을 읽었고 동의합니다
+ user_privacy_agreement_html: 개인정보처리방침을 읽었고 동의합니다
author_attribution:
example_title: 예시 텍스트
hint_html: 마스토돈 밖에서 뉴스나 블로그 글을 쓰시나요? 마스토돈에 공유되었을 때 어떻게 표시될지를 제어하세요.
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index dbca48dd37612f..7659cfcbfbd1a5 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -456,8 +456,8 @@ lt:
availability:
title: Prieinamumas
warning: Paskutinis bandymas prisijungti prie šio serverio buvo nesėkmingas
- back_to_all: Visi
- back_to_limited: Apribotas
+ back_to_all: Viskas
+ back_to_limited: Apribota
back_to_warning: Įspėjimas
by_domain: Domenas
content_policies:
@@ -864,6 +864,7 @@ lt:
self_destruct: Kadangi %{domain} uždaromas, turėsi tik ribotą prieigą prie savo paskyros.
view_strikes: Peržiūrėti ankstesnius savo paskyros pažeidimus
user_agreement_html: Perskaičiau ir sutinku su paslaugų sąlygomis ir privatumo politika
+ user_privacy_agreement_html: Perskaičiau ir sutinku su privatumo politika
author_attribution:
example_title: Teksto pavyzdys
hint_html: Ar rašote naujienas ar tinklaraščio straipsnius už „Mastodon“ ribų? Valdykite, kaip būsite nurodomi, kai jais bus bendrinama platformoje „Mastodon“.
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 9f71900040dbf6..9f05104153dac3 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -1209,6 +1209,7 @@ nl:
too_fast: Formulier is te snel ingediend. Probeer het nogmaals.
use_security_key: Beveiligingssleutel gebruiken
user_agreement_html: Ik heb de gebruiksvoorwaarden en het privacybeleid gelezen en ga ermee akkoord
+ user_privacy_agreement_html: Ik heb het privacybeleid gelezen en ga ermee akkoord
author_attribution:
example_title: Voorbeeldtekst
hint_html: Schrijf je nieuws- of blogartikelen buiten Mastodon? Bepaal hoe je geattribueerd wordt als deze gedeeld worden op Mastodon.
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 83a9674f843623..e2e28600591a3c 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -285,6 +285,7 @@ pl:
enable_user_html: "%{name} przywrócił(a) możliwość logowania użytkownikowi %{target}"
memorialize_account_html: "%{name} nadał(a) kontu %{target} status in memoriam"
promote_user_html: "%{name} podniósł(a) uprawnienia użytkownikowi %{target}"
+ publish_terms_of_service_html: "%{name} opublikował aktualizacje warunków korzystania z usługi"
reject_appeal_html: "%{name} zatwierdził(-a) odwołanie decyzji moderacyjnej od %{target}"
reject_user_html: "%{name} odrzucił rejestrację od %{target}"
remove_avatar_user_html: "%{name} usunął(-ęła) awatar użytkownikowi %{target}"
@@ -955,9 +956,36 @@ pl:
title: Hashtagi
updated_msg: Pomyślnie uaktualniono ustawienia hashtagów
terms_of_service:
+ back: Powrót do warunków świadczenia usług
+ changelog: Co się zmieniło
+ create: Użyj własnego
+ current: Aktualna wersja
draft: Szkic
generate: Użyj szablonu
+ generates:
+ action: Wygeneruj
+ chance_to_review_html: "Wygenerowane warunki świadczenia usług nie zostaną automatycznie opublikowane. Będziesz miał szansę je sprawdzić raz jeszcze. Wypełnij wymagane pola, aby kontynuować."
+ explanation_html: Dostarczany wzór warunków świadczenia usług służy wyłącznie celom informacyjnym i nie powinien być interpretowany jako porada prawna w odniesieniu do żadnego przedmiotu. Proszę skonsultować się ze swoim doradcą prawnym w sprawie swojej sytuacji i konkretnych kwestii prawnych, które państwo posiadają.
+ title: Warunki korzystania z usługi
+ history: Historia
+ live: Rzeczywiste
+ no_history: Nie ma jeszcze zapisanych zmian w warunkach korzystania z usługi.
+ no_terms_of_service_html: Obecnie nie masz żadnych skonfigurowanych warunków korzystania z usługi. Warunki korzystania z usługi mają zapewnić jasność i ochronę przed potencjalnymi zobowiązaniami w sporach z użytkownikami.
+ notified_on_html: Użytkownicy powiadomieni o %{date}
+ notify_users: Powiadom użytkowników
+ preview:
+ explanation_html: 'E-mail zostanie wysłany do %{display_count} użytkowników, którzy zarejestrowali się przed %{date}. Otrzymają oni wiadomość o następującej treści:'
+ send_preview: Wyślij podgląd do %{email}
+ send_to_all:
+ few: Wyślij %{display_count} wiadomości e-mail
+ many: Wyślij %{display_count} wiadomości e-mail
+ one: Wyślij %{display_count} wiadomość e-mail
+ other: Wyślij %{display_count} wiadomości e-mail
+ title: Podgląd warunków powiadomienia o usłudze
+ publish: Publikuj
+ published_on_html: Opublikowano w dniu %{date}
save_draft: Zapisz wersję roboczą
+ title: Warunki korzystania z usługi
title: Administracja
trends:
allow: Zezwól
@@ -1197,6 +1225,7 @@ pl:
set_new_password: Ustaw nowe hasło
setup:
email_below_hint_html: Sprawdź folder ze spamem lub poproś o inny link potwierdzający. Możesz poprawić swój adres e-mail, jeśli jest niepoprawny.
+ email_settings_hint_html: Kliknij link, który wysłaliśmy do %{email} , aby rozpocząć korzystanie z Mastodon. Poczekamy tutaj.
link_not_received: Nie otrzymano linku?
new_confirmation_instructions_sent: Za kilka minut otrzymasz nowy e-mail z linkiem potwierdzającym!
title: Sprawdź swoją skrzynkę odbiorczą
@@ -1205,6 +1234,7 @@ pl:
title: Zaloguj się do %{domain}
sign_up:
manual_review: Rejestracja na %{domain} przechodzi przez ręczne sprawdzanie przez naszych moderatorów. Aby pomóc nam usprawnić ten proces, napisz coś o sobie oraz dlaczego chcesz założyć konto na %{domain}.
+ preamble: Z kontem na tym serwerze Mastodon będziesz mógł obserwować każdą inną osobę w sieci, niezależnie od miejsca przechowywania ich konta.
title: Skonfigurujmy Twoje konto na %{domain}.
status:
account_status: Stan konta
@@ -1435,6 +1465,68 @@ pl:
merge_long: Zachowaj obecne wpisy i dodaj nowe
overwrite: Nadpisz
overwrite_long: Zastąp obecne wpisy nowymi
+ overwrite_preambles:
+ blocking_html:
+ few: Zamierzasz zastąpić swoją listę bloków maksymalnie %{count} kontami z %{filename}.
+ many: Zamierzasz zastąpić swoją listę bloków maksymalnie %{count} kontami z %{filename}.
+ one: Zamierzasz zastąpić swoją listę bloków maksymalnie %{count} kontem z %{filename}.
+ other: Zamierzasz zastąpić swoją listę bloków maksymalnie %{count} kontami z %{filename}.
+ bookmarks_html:
+ few: Zamierzasz zastąpić swoje zakładki maksymalnie %{count} wpisami z %{filename}.
+ many: Zamierzasz zastąpić swoje zakładki maksymalnie %{count} wpisami z %{filename}.
+ one: Zamierzasz zastąpić swoje zakładki maksymalnie %{count} wpisem z %{filename}.
+ other: Zamierzasz zastąpić swoje zakładki maksymalnie %{count} wpisami z %{filename}.
+ domain_blocking_html:
+ few: Zamierzasz zastąpić swoją listę bloków domen maksymalnie %{count} domenami z %{filename}.
+ many: Zamierzasz zastąpić swoją listę bloków domen maksymalnie %{count} domenami z %{filename}.
+ one: Zamierzasz zastąpić swoją listę bloków domen maksymalnie %{count} domeną z %{filename}.
+ other: Zamierzasz zastąpić swoją listę bloków domen maksymalnie %{count} domenami z %{filename}.
+ following_html:
+ few: Zamierzasz zaobserwować maksymalnie %{count} konta z %{filename} i przestać obserwować kogokolwiek innego.
+ many: Zamierzasz zaobserwować maksymalnie %{count} kont z %{filename} i przestać obserwować kogokolwiek innego.
+ one: Zamierzasz zaobserwować maksymalnie %{count} konto z %{filename} i przestać obserwować kogokolwiek innego.
+ other: Zamierzasz zaobserwować maksymalnie %{count} kont z %{filename} i przestać obserwować kogokolwiek innego.
+ lists_html:
+ few: Zamierzasz zastąpić swoje listy maksymalnie %{count} kontami z %{filename}.
+ many: Zamierzasz zastąpić swoje listy maksymalnie %{count} kontami z %{filename}.
+ one: Zamierzasz zastąpić swoje listy maksymalnie %{count} kontem z %{filename}.
+ other: Zamierzasz zastąpić swoje listy maksymalnie %{count} kontami z %{filename}.
+ muting_html:
+ few: Zamierzasz zastąpić swoją listę wyciszonych maksymalnie %{count} kontami z %{filename}.
+ many: Zamierzasz zastąpić swoją listę wyciszonych maksymalnie %{count} kontami z %{filename}.
+ one: Zamierzasz zastąpić swoją listę wyciszonych maksymalnie %{count} kontem z %{filename}.
+ other: Zamierzasz zastąpić swoją listę wyciszonych maksymalnie %{count} kontami z %{filename}.
+ preambles:
+ blocking_html:
+ few: Zamierzasz zablokować maksymalnie %{count} konta z %{filename}.
+ many: Zamierzasz zablokować maksymalnie %{count} kont z %{filename}.
+ one: Zamierzasz zablokować maksymalnie %{count} konto z %{filename}.
+ other: Zamierzasz zablokować maksymalnie %{count} kont z %{filename}.
+ bookmarks_html:
+ few: Zamierzasz dodać maksymalnie %{count} wpisy do twoich zakładek z %{filename}.
+ many: Zamierzasz dodać maksymalnie %{count} wpisów do twoich zakładek z %{filename}.
+ one: Zamierzasz dodać maksymalnie %{count} wpis do twoich zakładek z %{filename}.
+ other: Zamierzasz dodać maksymalnie %{count} wpisów do twoich zakładek z %{filename}.
+ domain_blocking_html:
+ few: Zamierzasz zablokować maksymalnie %{count} domeny z %{filename}.
+ many: Zamierzasz zablokować maksymalnie %{count} domeny z %{filename}.
+ one: Zamierzasz zablokować maksymalnie %{count} domenę z %{filename}.
+ other: Zamierzasz zablokować maksymalnie %{count} domeny z %{filename}.
+ following_html:
+ few: Zamierzasz zaobserwować maksymalnie %{count} konta z %{filename}.
+ many: Zamierzasz zaobserwować maksymalnie %{count} kont z %{filename}.
+ one: Zamierzasz zaobserwować maksymalnie %{count} konto z %{filename}.
+ other: Zamierzasz zaobserwować maksymalnie %{count} kont z %{filename}.
+ lists_html:
+ few: Zamierzasz dodać maksymalnie %{count} konta do twoich list z %{filename}. Jeżeli nie ma list, nowe zostaną utworzone.
+ many: Zamierzasz dodać maksymalnie %{count} kont do twoich list z %{filename}. Jeżeli nie ma list, nowe zostaną utworzone.
+ one: Zamierzasz dodać maksymalnie %{count} konto do twoich list z %{filename}. Jeżeli nie ma list, nowe zostaną utworzone.
+ other: Zamierzasz dodać maksymalnie %{count} kont do twoich list z %{filename}. Jeżeli nie ma list, nowe zostaną utworzone.
+ muting_html:
+ few: Zamierzasz wyciszyć maksymalnie %{count} konta z %{filename}.
+ many: Zamierzasz wyciszyć maksymalnie %{count} kont z %{filename}.
+ one: Zamierzasz wyciszyć maksymalnie %{count} konto z %{filename}.
+ other: Zamierzasz wyciszyć maksymalnie %{count} kont z %{filename}.
preface: Możesz zaimportować pewne dane (np. lista kont, które obserwujesz lub blokujesz) do swojego konta na tym serwerze, korzystając z danych wyeksportowanych z innego serwera.
recent_imports: Ostatnie importy
states:
@@ -1926,6 +2018,15 @@ pl:
further_actions_html: Jeśli to nie Ty, zalecamy %{action} natychmiastowo i włącz uwierzytelnianie dwuetapowe, aby Twoje konto było bezpieczne.
subject: Uzyskano dostęp do twojego konta z nowego adresu IP
title: Nowe logowanie
+ terms_of_service_changed:
+ agreement: Kontynuując używanie %{domain}, zgadzasz się na te warunki. Jeśli nie zgadzasz się ze zaktualizowanymi warunkami, możesz wypowiedzieć umowę z %{domain} w dowolnym momencie, usuwając swoje konto.
+ changelog: 'W skrócie oto co oznacza dla Ciebie ta aktualizacja:'
+ description: 'Otrzymujesz ten e-mail, ponieważ wprowadzamy pewne zmiany w naszym regulaminie usługi w %{domain}. Zachęcamy Cię do pełnego zapoznania się z aktualnymi warunkami:'
+ description_html: Otrzymujesz ten e-mail, ponieważ wprowadzamy pewne zmiany w naszym regulaminie usługi w %{domain}. Zachęcamy do zapoznania się z aktualnymi warunkami w całości tutaj.
+ sign_off: Zespół %{domain}
+ subject: Aktualizacja warunków korzystania z usług
+ subtitle: Warunki korzystania z %{domain} zmieniają się
+ title: Ważna aktualizacja
warning:
appeal: Złóż odwołanie
appeal_description: Jeśli uważasz, że zaszło nieporozumienie, możesz złożyć odwołanie do zespołu %{instance}.
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 7dcf0977f35f58..4015005b2d87b1 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -844,7 +844,7 @@ pt-PT:
no_status_selected: Nenhum estado foi alterado porque nenhum foi selecionado
open: Abrir publicação
original_status: Publicação original
- reblogs: Reblogues
+ reblogs: Impulsos
replied_to_html: Respondeu a %{acct_link}
status_changed: Publicação alterada
status_title: Publicado por @%{name}
@@ -1209,6 +1209,7 @@ pt-PT:
too_fast: Formulário enviado demasiado rapidamente, tenta novamente.
use_security_key: Usar chave de segurança
user_agreement_html: Eu li e concordo com os termos do serviço e política de privacidade
+ user_privacy_agreement_html: Eu li e concordo com a política de privacidade
author_attribution:
example_title: Texto de exemplo
hint_html: Estás a escrever notícias ou artigos de blogue fora do Mastodon? Controla a forma como és creditados quando estes são partilhados no Mastodon.
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index f5be51f9c32df9..45b1be79b75032 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -313,6 +313,11 @@ ar:
name: الوسم
trendable: السماح لهذه الكلمة المفتاحية بالظهور تحت المتداوَلة
usable: السماح للمنشورات باستخدام هذا الوسم محليا
+ terms_of_service:
+ text: شروط الخدمة
+ terms_of_service_generator:
+ domain: النطاق
+ jurisdiction: الاختصاص القانوني
user:
role: الدور
time_zone: النطاق الزمني
diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml
index dacd1f63726c7c..6f3681de5bcd9f 100644
--- a/config/locales/simple_form.bg.yml
+++ b/config/locales/simple_form.bg.yml
@@ -3,6 +3,7 @@ bg:
simple_form:
hints:
account:
+ attribution_domains: Едно на ред. Защитава от фалшиви атрибути.
discoverable: Вашите публични публикации и профил може да се представят или препоръчват в различни области на Mastodon и вашия профил може да се предлага на други потребители.
display_name: Вашето пълно име или псевдоним.
fields: Вашата начална страница, местоимения, години, всичко що искате.
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 515c7fb9e82c78..37ad72a7e47230 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -3,6 +3,7 @@ cs:
simple_form:
hints:
account:
+ attribution_domains: Jeden na řádek. Chrání před falešným připisování autorství.
discoverable: Vaše veřejné příspěvky a profil mohou být zobrazeny nebo doporučeny v různých oblastech Mastodonu a váš profil může být navrhován ostatním uživatelům.
display_name: Vaše celé jméno nebo přezdívka.
fields: Vaše domovská stránka, zájmena, věk, cokoliv chcete.
@@ -155,6 +156,7 @@ cs:
url: Kam budou události odesílány
labels:
account:
+ attribution_domains: Webové stránky s povolením Vám připsat autorství
discoverable: Zobrazovat profil a příspěvky ve vyhledávacích algoritmech
fields:
name: Označení
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index e06cf7069dd640..4b6cc80a120df0 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -3,6 +3,7 @@ el:
simple_form:
hints:
account:
+ attribution_domains: Μία ανά γραμμή. Προστατεύει από ψευδείς ιδιότητες.
discoverable: Οι δημόσιες δημοσιεύσεις και το προφίλ σου μπορεί να εμφανίζονται ή να συνιστώνται σε διάφορους τομείς του Mastodon και το προφίλ σου μπορεί να προτείνεται σε άλλους χρήστες.
display_name: Το πλήρες ή το αστείο σου όνομα.
fields: Η αρχική σου σελίδα, αντωνυμίες, ηλικία, ό,τι θες.
@@ -136,6 +137,7 @@ el:
admin_email: Οι νομικές ανακοινώσεις περιλαμβάνουν αντικρούσεις, δικαστικές αποφάσεις, αιτήματα που έχουν ληφθεί και αιτήματα επιβολής του νόμου.
arbitration_address: Μπορεί να είναι το ίδιο με τη φυσική διεύθυνση παραπάνω, ή “N/A” εάν χρησιμοποιείται email
arbitration_website: Μπορεί να είναι μια φόρμα ιστού, ή “N/A” εάν χρησιμοποιείται email
+ dmca_address: Για τους φορείς των ΗΠΑ, χρησιμοποιήστε τη διεύθυνση που έχει καταχωρηθεί στο DMCA Designated Agent Directory. A P.O. Η λίστα είναι διαθέσιμη κατόπιν απευθείας αιτήματος, Χρησιμοποιήστε το αίτημα απαλλαγής από την άδεια χρήσης του καθορισμένου από το DMCA Agent Post Office Box για να στείλετε email στο Γραφείο Πνευματικών Δικαιωμάτων και περιγράψτε ότι είστε συντονιστής περιεχομένου με βάση το σπίτι, ο οποίος φοβάται την εκδίκηση ή την απόδοση για τις ενέργειές σας και πρέπει να χρησιμοποιήσετε ένα P.. Box για να αφαιρέσετε τη διεύθυνση οικίας σας από τη δημόσια προβολή.
dmca_email: Μπορεί να είναι το ίδιο email που χρησιμοποιείται για “Διεύθυνση email για νομικές ανακοινώσεις” παραπάνω
domain: Μοναδικό αναγνωριστικό της διαδικτυακής υπηρεσίας που παρέχεις.
jurisdiction: Ανέφερε τη χώρα όπου ζει αυτός που πληρώνει τους λογαριασμούς. Εάν πρόκειται για εταιρεία ή άλλη οντότητα, ανέφερε τη χώρα όπου υφίσταται, και την πόλη, περιοχή, έδαφος ή πολιτεία ανάλογα με την περίπτωση.
@@ -154,6 +156,7 @@ el:
url: Πού θα σταλούν τα γεγονότα
labels:
account:
+ attribution_domains: Ιστοσελίδες επιτρέπεται να σας αναφέρουν
discoverable: Παροχή προφίλ και αναρτήσεων σε αλγορίθμους ανακάλυψης
fields:
name: Περιγραφή
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index e39e27f6dd1e11..c3cf3692be9989 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -245,7 +245,7 @@ fa:
sign_in_token_attempt: کد امنیتی
title: عنوان
type: نوع درونریزی
- username: نام کاربری (لاتین)
+ username: نام کاربری
username_or_email: نام کاربری یا ایمیل
whole_word: تطابق واژهٔ کامل
email_domain_block:
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index d40ca7ebf8fb09..92d306224ad0b9 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -3,6 +3,7 @@ ko:
simple_form:
hints:
account:
+ attribution_domains: 한 줄에 하나씩. 가짜 기여로부터 보호합니다.
discoverable: 내 공개 게시물과 프로필이 마스토돈의 다양한 추천 기능에 나타날 수 있고 프로필이 다른 사용자에게 제안될 수 있습니다
display_name: 진짜 이름 또는 재미난 이름.
fields: 홈페이지, 호칭, 나이, 뭐든지 적고 싶은 것들.
@@ -133,8 +134,12 @@ ko:
changelog: 마크다운 문법을 사용할 수 있습니다.
text: 마크다운 문법을 사용할 수 있습니다.
terms_of_service_generator:
+ admin_email: 법적 고지에는 이의 제기, 법원 명령, 게시 중단 요청, 법 집행 요청이 포함됩니다.
+ arbitration_address: 위의 실제 주소와 같을 수 있으며, 이메일을 사용한다면 "N/A"로 두세요
arbitration_website: 웹 형태를 사용할 수 있습니다. 이메일을 사용한다면 "N/A"로 둘 수 있습니다
dmca_email: 상단의 "법적 통지를 위한 이메일 주소"와 같은 주소를 사용할 수 있습니다
+ domain: 귀하가 제공하는 온라인 서비스의 고유 식별정보입니다.
+ jurisdiction: 요금을 지불하는 사람이 거주하는 국가를 기재하세요. 회사나 기타 법인인 경우 해당 법인이 설립된 국가와 도시, 지역, 영토 또는 주를 적절히 기재하세요.
user:
chosen_languages: 체크하면, 선택 된 언어로 작성된 게시물들만 공개 타임라인에 보여집니다
role: 역할은 사용자가 어떤 권한을 가지게 될 지 결정합니다.
@@ -150,6 +155,7 @@ ko:
url: 이벤트가 어디로 전송될 지
labels:
account:
+ attribution_domains: 나를 기여자로 올릴 수 있도록 허용된 웹사이트들
discoverable: 발견하기 알고리즘에 프로필과 게시물을 추천하기
fields:
name: 라벨
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index d7f3829af2f2e9..efa17c1a9bd12d 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -3,6 +3,7 @@ pl:
simple_form:
hints:
account:
+ attribution_domains: Jedna na linię.
discoverable: Twój profil i publiczne wpisy mogą być promowane lub polecane na Mastodonie i twój profil może być sugerowany innym użytkownikom.
display_name: Twoje imię lub pseudonim.
fields: Co ci się tylko podoba – twoja strona domowa, zaimki, wiek…
@@ -129,6 +130,13 @@ pl:
show_application: Ty zawsze widzisz program użyty do zamieszczenia.
tag:
name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne
+ terms_of_service:
+ changelog: Może być stworzony przy pomocy składni Markdown.
+ text: Może być stworzony przy pomocy składni Markdown.
+ terms_of_service_generator:
+ admin_email: Zawiadomienia prawne obejmują środki zapobiegawcze, nakazy sądowe, wnioski o popełnienie sprawy oraz wnioski organów ścigania.
+ arbitration_address: Może być taki sam jak adres fizyczny powyżej lub „N/A” jeśli używasz adresu e-mail
+ arbitration_website: Może być formularzem internetowym lub „N/A”, jeśli używasz adresu e-mail
user:
chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu
role: Rola kontroluje uprawnienia użytkownika.
@@ -321,6 +329,10 @@ pl:
changelog: Co się zmieniło?
text: Warunki korzystania z usługi
terms_of_service_generator:
+ arbitration_address: Adres fizyczny powiadomień arbitrażowych
+ arbitration_website: Strona internetowa do składania zgłoszeń arbitrażowych
+ dmca_address: Adres fizyczny dla zgłoszeń naruszenia DMCA/praw autorskich
+ dmca_email: Adres e-mail dla zgłoszeń naruszenia DMCA/praw autorskich
domain: Domena
jurisdiction: Jurysdykcja
user:
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index ebf16f839d8a23..1330878c48aa20 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -63,7 +63,7 @@ pt-PT:
setting_system_scrollbars_ui: Aplica-se apenas a navegadores de desktop baseados no Safari e Chrome
setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer pormenores
setting_use_pending_items: Ocultar as atualizações da cronologia após um clique em vez de percorrer automaticamente a cronologia
- username: Pode utilizar letras, números e traços inferiores (_)
+ username: Podes utilizar letras, números e traços inferiores (_)
whole_word: Quando a palavra-chave ou expressão-chave é somente alfanumérica, ela só será aplicada se corresponder à palavra completa
domain_allow:
domain: Este domínio será capaz de obter dados desta instância e os dados dele recebidos serão processados e armazenados
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 0c6be357ced32b..1e42c6568011ec 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -3,6 +3,7 @@ zh-CN:
simple_form:
hints:
account:
+ attribution_domains: 每行一个域名。这样就可以保护作品免受虚假署名。
discoverable: 你的公开嘟文和个人资料可能会在 Mastodon 的多个位置展示,你的个人资料可能会被推荐给其他用户。
display_name: 你的全名或昵称。
fields: 你的主页、人称代词、年龄,以及任何你想要添加的内容。
@@ -46,7 +47,7 @@ zh-CN:
current_username: 请输入当前账号的用户名以确认
digest: 仅在你长时间未登录,且收到了私信时发送
email: 我们会向你发送一封确认邮件
- header: 支持WEBP、PNG、GIF 或 JPG。最大 %{size}。分辨率将被压缩至 %{dimensions}px
+ header: 支持 WEBP、PNG、GIF 或 JPG。最大 %{size}。分辨率将被压缩至 %{dimensions}px
inbox_url: 从你想要使用的中继站的主页上复制 URL
irreversible: 被过滤的嘟文会永久消失,移除过滤规则后也不会恢复
locale: 在用户界面、电子邮件和推送通知中使用的语言
@@ -155,6 +156,7 @@ zh-CN:
url: 事件将被发往的目的地
labels:
account:
+ attribution_domains: 授权展示你的署名的网站
discoverable: 在发现算法中展示你的账号与嘟文
fields:
name: 标签
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 4ac12b67a49280..0697bb0a991c58 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -1203,6 +1203,7 @@ sq:
too_fast: Formulari u parashtrua shumë shpejt, riprovoni.
use_security_key: Përdor kyç sigurie
user_agreement_html: I kam lexuar dhe pajtohen me kushtet e shërbimit dhe rregullat e privatësisë
+ user_privacy_agreement_html: I kam lexuar dhe pajtohem me rregullat e privatësisë
author_attribution:
example_title: Tekst shembull
hint_html: Shkruani lajme, apo artikuj blogu jashtë Mastodon-it? Kontrolloni se si ju jepet hakë, kur ndahen me të tjerët në Mastodon.
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 65ec6ef58a7462..7470f88c50ed9c 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -1209,6 +1209,7 @@ tr:
too_fast: Form çok hızlı gönderildi, tekrar deneyin.
use_security_key: Güvenlik anahtarını kullan
user_agreement_html: hizmet şartları ve gizlilik politikasını okudum ve kabul ediyorum
+ user_privacy_agreement_html: Gizlilik politikasını okudum ve kabul ettim
author_attribution:
example_title: Örnek metin
hint_html: Mastodon dışında haber veya günlük yazıları mı yazıyorsunuz? Bu yazılar Mastodon'da paylaşıldığında size nasıl atıf yapılacağını denetleyin.
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index c4abba8e111832..801d32b1aba3ee 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -1242,6 +1242,7 @@ uk:
too_fast: Форму подано занадто швидко, спробуйте ще раз.
use_security_key: Використовувати ключ безпеки
user_agreement_html: Я прочитав і приймаю умови використання та політику конфіденційності< /a>
+ user_privacy_agreement_html: Мною прочитано і я погоджуюся з політикою приватності
author_attribution:
example_title: Зразок тексту
hint_html: Ви пишете новини чи статті в блозі за межами Mastodon? Контролюйте, як вони підписуються, коли ними діляться на Mastodon.
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index e6da2ee8d31290..a7fbfa3de23138 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -1,7 +1,7 @@
---
zh-CN:
about:
- about_mastodon_html: 来自未来的社交网络:无广告、无监视、去中心化、合乎道德!加入 Mastodon,掌控自己的数据!
+ about_mastodon_html: 来自未来的社交网络:无广告、无监视、去中心化、合乎道德!使用 Mastodon 夺回你的数据!
contact_missing: 未设定
contact_unavailable: 未公开
hosted_on: 运行在 %{domain} 上的 Mastodon 实例
@@ -1190,6 +1190,7 @@ zh-CN:
too_fast: 表单提交过快,请重试。
use_security_key: 使用安全密钥
user_agreement_html: 我已阅读并同意 服务条款 与 隐私政策
+ user_privacy_agreement_html: 我已阅读并同意隐私政策
author_attribution:
example_title: 示例文本
hint_html: 你是否在 Mastodon 之外撰写新闻或博客文章?控制它们被分享到 Mastodon 时的署名方式。
@@ -1830,10 +1831,10 @@ zh-CN:
terms_of_service:
title: 服务条款
themes:
- contrast: Mastodon (高对比度)
- default: Mastodon (暗色)
- mastodon-light: Mastodon (亮色)
- system: 自动切换 (使用系统主题)
+ contrast: Mastodon(高对比度)
+ default: Mastodon(暗色主题)
+ mastodon-light: Mastodon(亮色主题)
+ system: 自动切换(使用系统主题)
time:
formats:
default: "%Y年%m月%d日 %H:%M"
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index cf215240e95634..4a3ab2ba238428 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -1192,6 +1192,7 @@ zh-TW:
too_fast: 送出表單的速度太快跟不上,請稍後再試。
use_security_key: 使用安全金鑰
user_agreement_html: 我已閱讀並同意 服務條款 與 隱私權政策
+ user_privacy_agreement_html: 我已閱讀並同意 隱私權政策
author_attribution:
example_title: 範例文字
hint_html: 您是否正於 Mastodon 之外撰寫新聞或部落格文章?控制當它們於 Mastodon 上分享時您如何獲得信譽。
diff --git a/config/puma.rb b/config/puma.rb
index ac9ccac2091c73..4fe8f802b9c44a 100644
--- a/config/puma.rb
+++ b/config/puma.rb
@@ -17,6 +17,27 @@
preload_app!
+if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true'
+ require 'prometheus_exporter'
+ require 'prometheus_exporter/instrumentation'
+
+ on_worker_boot do
+ # Ruby process metrics (memory, GC, etc)
+ PrometheusExporter::Instrumentation::Process.start(type: 'puma')
+
+ # ActiveRecord metrics (connection pool usage)
+ PrometheusExporter::Instrumentation::ActiveRecord.start(
+ custom_labels: { type: 'puma' }, # optional params
+ config_labels: [:database, :host] # optional params
+ )
+ end
+
+ after_worker_boot do
+ # Puma metrics
+ PrometheusExporter::Instrumentation::Puma.start unless PrometheusExporter::Instrumentation::Puma.started?
+ end
+end
+
on_worker_boot do
ActiveSupport.on_load(:active_record) do
ActiveRecord::Base.establish_connection
diff --git a/config/templates/terms-of-service.md b/config/templates/terms-of-service.md
index cb81a22e84327d..4b11a9897cfcc7 100644
--- a/config/templates/terms-of-service.md
+++ b/config/templates/terms-of-service.md
@@ -58,16 +58,18 @@ attempt to):
or limit the functionality of the Instance, launch a denial of service attack,
or in any other way attempt to interfere with the functioning and availability
of the Instance;
-- Except as may be the result of standard search engine or Internet browser
- usage, use, launch, develop, or distribute any automated system, including
- without limitation, any spider, robot, cheat utility, scraper, offline reader,
- or any data mining or similar data gathering extraction tools to access the
- Instance, or use or launch any unauthorized script or other software;
+- Use, launch, develop, or distribute any automated system, including without
+ limitation, any spider, robot, cheat utility, scraper, offline reader, or any
+ data mining or similar data gathering extraction tools to access the Instance,
+ except in each case as may be the result of standard search engine or Internet
+ browser and local caching or for human review and interaction with Content on
+ the Instance;
+- Use or launch any unauthorized script or other software;
- Interfere with, disable, vandalize or disrupt the Instance or servers or
networks connected to the Instance;
- Hack into, penetrate, disable, or otherwise circumvent the security measures
of the Instance or servers or networks connected to the Instance;
-- or otherwise use the Instance in any way that violates any applicable
+- Otherwise use the Instance in any way that violates any applicable
national, federal, state, local or international law or regulation.
## Intellectual Property
diff --git a/docker-compose.yml b/docker-compose.yml
index 6c4497756211c1..93e5bd4ecd0b2c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,5 +1,5 @@
# This file is designed for production server deployment, not local development work
-# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/README.md#docker
+# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/docs/DEVELOPMENT.md#docker
services:
db:
diff --git a/lib/devise/strategies/two_factor_ldap_authenticatable.rb b/lib/devise/strategies/two_factor_ldap_authenticatable.rb
index c8258deb16ddb1..2efd1323a82eb1 100644
--- a/lib/devise/strategies/two_factor_ldap_authenticatable.rb
+++ b/lib/devise/strategies/two_factor_ldap_authenticatable.rb
@@ -23,7 +23,7 @@ def authenticate!
protected
def valid_params?
- params[scope] && params[scope][:password].present?
+ params[scope].is_a?(Hash) && params[scope][:password].present?
end
end
end
diff --git a/lib/devise/strategies/two_factor_pam_authenticatable.rb b/lib/devise/strategies/two_factor_pam_authenticatable.rb
index a9db1b6a29ff96..2164b0323427d1 100644
--- a/lib/devise/strategies/two_factor_pam_authenticatable.rb
+++ b/lib/devise/strategies/two_factor_pam_authenticatable.rb
@@ -22,7 +22,7 @@ def authenticate!
protected
def valid_params?
- params[scope] && params[scope][:password].present?
+ params[scope].is_a?(Hash) && params[scope][:password].present?
end
end
end
diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb
index 4d48a0d9d3e2b1..f3f08c79405695 100644
--- a/spec/controllers/admin/domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/domain_blocks_controller_spec.rb
@@ -48,15 +48,11 @@
post :create, params: { domain_block: { domain: 'example.com', severity: 'silence' } }
end
- it 'records a block' do
+ it 'records a block, calls a worker, redirects' do
expect(DomainBlock.exists?(domain: 'example.com', severity: 'silence')).to be true
- end
- it 'calls DomainBlockWorker' do
expect(DomainBlockWorker).to have_received(:perform_async)
- end
- it 'redirects with a success message' do
expect(flash[:notice]).to eq I18n.t('admin.domain_blocks.created_msg')
expect(response).to redirect_to(admin_instances_path(limited: '1'))
end
@@ -68,15 +64,11 @@
post :create, params: { domain_block: { domain: 'example.com', severity: 'silence' } }
end
- it 'does not record a block' do
+ it 'does not record a block or call worker, renders new' do
expect(DomainBlock.exists?(domain: 'example.com', severity: 'silence')).to be false
- end
- it 'does not call DomainBlockWorker' do
expect(DomainBlockWorker).to_not have_received(:perform_async)
- end
- it 'renders new' do
expect(response).to render_template :new
end
end
@@ -87,15 +79,11 @@
post :create, params: { domain_block: { domain: 'example.com', severity: 'suspend', reject_media: true, reject_reports: true } }
end
- it 'does not record a block' do
+ it 'does not record a block or call worker, renders confirm suspension' do
expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be false
- end
- it 'does not call DomainBlockWorker' do
expect(DomainBlockWorker).to_not have_received(:perform_async)
- end
- it 'renders confirm_suspension' do
expect(response).to render_template :confirm_suspension
end
end
@@ -105,15 +93,11 @@
post :create, params: { :domain_block => { domain: 'example.com', severity: 'suspend', reject_media: true, reject_reports: true }, 'confirm' => '' }
end
- it 'records a block' do
+ it 'records a block and calls worker and redirects' do
expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be true
- end
- it 'calls DomainBlockWorker' do
expect(DomainBlockWorker).to have_received(:perform_async)
- end
- it 'redirects with a success message' do
expect(flash[:notice]).to eq I18n.t('admin.domain_blocks.created_msg')
expect(response).to redirect_to(admin_instances_path(limited: '1'))
end
@@ -130,15 +114,11 @@
post :create, params: { domain_block: { domain: 'example.com', severity: 'suspend', reject_media: true, reject_reports: true } }
end
- it 'does not record a block' do
+ it 'does not record a block or call worker, renders confirm suspension' do
expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be false
- end
- it 'does not call DomainBlockWorker' do
expect(DomainBlockWorker).to_not have_received(:perform_async)
- end
- it 'renders confirm_suspension' do
expect(response).to render_template :confirm_suspension
end
end
@@ -148,15 +128,11 @@
post :create, params: { :domain_block => { domain: 'example.com', severity: 'suspend', reject_media: true, reject_reports: true }, 'confirm' => '' }
end
- it 'updates the record' do
+ it 'updates the record and calls worker, redirects' do
expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be true
- end
- it 'calls DomainBlockWorker' do
expect(DomainBlockWorker).to have_received(:perform_async)
- end
- it 'redirects with a success message' do
expect(flash[:notice]).to eq I18n.t('admin.domain_blocks.created_msg')
expect(response).to redirect_to(admin_instances_path(limited: '1'))
end
diff --git a/spec/controllers/admin/email_domain_blocks_controller_spec.rb b/spec/controllers/admin/email_domain_blocks_controller_spec.rb
index c7460c21101f25..f274c01281117e 100644
--- a/spec/controllers/admin/email_domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/email_domain_blocks_controller_spec.rb
@@ -58,11 +58,9 @@
post :create, params: { email_domain_block: { domain: 'example.com' }, save: '' }
end
- it 'blocks the domain' do
+ it 'blocks the domain and redirects to email domain blocks' do
expect(EmailDomainBlock.find_by(domain: 'example.com')).to_not be_nil
- end
- it 'redirects to e-mail domain blocks' do
expect(response).to redirect_to(admin_email_domain_blocks_path)
end
end
diff --git a/spec/controllers/admin/roles_controller_spec.rb b/spec/controllers/admin/roles_controller_spec.rb
index 2c43a0ca870ae5..173a89e5d5d6ef 100644
--- a/spec/controllers/admin/roles_controller_spec.rb
+++ b/spec/controllers/admin/roles_controller_spec.rb
@@ -68,11 +68,9 @@
let(:selected_position) { 1 }
let(:selected_permissions_as_keys) { %w(manage_roles) }
- it 'redirects to roles page' do
+ it 'redirects to roles page and creates role' do
expect(response).to redirect_to(admin_roles_path)
- end
- it 'creates new role' do
expect(UserRole.find_by(name: 'Bar')).to_not be_nil
end
end
@@ -81,11 +79,9 @@
let(:selected_position) { 100 }
let(:selected_permissions_as_keys) { %w(manage_roles) }
- it 'renders new template' do
+ it 'renders new template and does not create role' do
expect(response).to render_template(:new)
- end
- it 'does not create new role' do
expect(UserRole.find_by(name: 'Bar')).to be_nil
end
end
@@ -94,11 +90,9 @@
let(:selected_position) { 1 }
let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) }
- it 'renders new template' do
+ it 'renders new template and does not create role' do
expect(response).to render_template(:new)
- end
- it 'does not create new role' do
expect(UserRole.find_by(name: 'Bar')).to be_nil
end
end
@@ -109,11 +103,9 @@
let(:selected_position) { 1 }
let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) }
- it 'redirects to roles page' do
+ it 'redirects to roles page and creates new role' do
expect(response).to redirect_to(admin_roles_path)
- end
- it 'creates new role' do
expect(UserRole.find_by(name: 'Bar')).to_not be_nil
end
end
@@ -166,11 +158,9 @@
end
context 'when user does not have permission to manage roles' do
- it 'returns http forbidden' do
+ it 'returns http forbidden and does not update role' do
expect(response).to have_http_status(403)
- end
- it 'does not update the role' do
expect(role.reload.name).to eq 'Bar'
end
end
@@ -179,11 +169,9 @@
let(:permissions) { UserRole::FLAGS[:manage_roles] }
context 'when role has permissions the user doesn\'t' do
- it 'renders edit template' do
+ it 'renders edit template and does not update role' do
expect(response).to render_template(:edit)
- end
- it 'does not update the role' do
expect(role.reload.name).to eq 'Bar'
end
end
@@ -192,11 +180,9 @@
let(:permissions) { UserRole::FLAGS[:manage_roles] | UserRole::FLAGS[:manage_users] }
context 'when user outranks the role' do
- it 'redirects to roles page' do
+ it 'redirects to roles page and updates role' do
expect(response).to redirect_to(admin_roles_path)
- end
- it 'updates the role' do
expect(role.reload.name).to eq 'Baz'
end
end
@@ -204,11 +190,9 @@
context 'when role outranks user' do
let(:role_position) { current_role.position + 1 }
- it 'returns http forbidden' do
+ it 'returns http forbidden and does not update role' do
expect(response).to have_http_status(403)
- end
- it 'does not update the role' do
expect(role.reload.name).to eq 'Bar'
end
end
diff --git a/spec/controllers/admin/settings/branding_controller_spec.rb b/spec/controllers/admin/settings/branding_controller_spec.rb
index 843021469e5ba7..6b3621bb8a3676 100644
--- a/spec/controllers/admin/settings/branding_controller_spec.rb
+++ b/spec/controllers/admin/settings/branding_controller_spec.rb
@@ -16,7 +16,8 @@
patch :update, params: { form_admin_settings: { new_setting_key: 'New key value' } }
- expect(response).to redirect_to(admin_settings_branding_path)
+ expect(response)
+ .to have_http_status(400)
expect(Setting.new_setting_key).to be_nil
end
end
diff --git a/spec/controllers/admin/users/roles_controller_spec.rb b/spec/controllers/admin/users/roles_controller_spec.rb
index bfc2bb151fa7c5..a7d59181d62dcf 100644
--- a/spec/controllers/admin/users/roles_controller_spec.rb
+++ b/spec/controllers/admin/users/roles_controller_spec.rb
@@ -44,11 +44,9 @@
let(:permissions) { UserRole::FLAGS[:manage_roles] }
let(:position) { 1 }
- it 'updates user role' do
+ it 'updates user role and redirects' do
expect(user.reload.role_id).to eq selected_role&.id
- end
- it 'redirects back to account page' do
expect(response).to redirect_to(admin_account_path(user.account_id))
end
end
@@ -57,11 +55,9 @@
let(:permissions) { UserRole::FLAGS[:administrator] }
let(:position) { 100 }
- it 'does not update user role' do
+ it 'does not update user role and renders edit' do
expect(user.reload.role_id).to eq previous_role&.id
- end
- it 'renders edit form' do
expect(response).to render_template(:show)
end
end
@@ -71,11 +67,9 @@
let(:permissions) { UserRole::FLAGS[:manage_roles] }
let(:position) { 1 }
- it 'does not update user role' do
+ it 'does not update user role and returns http forbidden' do
expect(user.reload.role_id).to eq previous_role&.id
- end
- it 'returns http forbidden' do
expect(response).to have_http_status(403)
end
end
diff --git a/spec/lib/activitypub/linked_data_signature_spec.rb b/spec/lib/activitypub/linked_data_signature_spec.rb
index b1a8dc5c49c39b..8128fdd070b645 100644
--- a/spec/lib/activitypub/linked_data_signature_spec.rb
+++ b/spec/lib/activitypub/linked_data_signature_spec.rb
@@ -13,10 +13,13 @@
{
'@context' => 'https://www.w3.org/ns/activitystreams',
'id' => 'http://example.com/hello-world',
+ 'type' => 'Note',
+ 'content' => 'Hello world',
}
end
- let(:json) { raw_json.merge('signature' => signature) }
+ let(:signed_json) { raw_json.merge('signature' => signature) }
+ let(:json) { signed_json }
describe '#verify_actor!' do
context 'when signature matches' do
@@ -90,6 +93,54 @@
expect(subject.verify_actor!).to be_nil
end
end
+
+ context 'when an attribute has been removed from the document' do
+ let(:signature) { raw_signature.merge('type' => 'RsaSignature2017', 'signatureValue' => sign(sender, raw_signature, raw_json)) }
+ let(:json) { signed_json.without('content') }
+
+ let(:raw_signature) do
+ {
+ 'creator' => 'http://example.com/alice',
+ 'created' => '2017-09-23T20:21:34Z',
+ }
+ end
+
+ it 'returns nil' do
+ expect(subject.verify_actor!).to be_nil
+ end
+ end
+
+ context 'when an attribute has been added to the document' do
+ let(:signature) { raw_signature.merge('type' => 'RsaSignature2017', 'signatureValue' => sign(sender, raw_signature, raw_json)) }
+ let(:json) { signed_json.merge('attributedTo' => 'http://example.com/bob') }
+
+ let(:raw_signature) do
+ {
+ 'creator' => 'http://example.com/alice',
+ 'created' => '2017-09-23T20:21:34Z',
+ }
+ end
+
+ it 'returns nil' do
+ expect(subject.verify_actor!).to be_nil
+ end
+ end
+
+ context 'when an existing attribute has been changed' do
+ let(:signature) { raw_signature.merge('type' => 'RsaSignature2017', 'signatureValue' => sign(sender, raw_signature, raw_json)) }
+ let(:json) { signed_json.merge('content' => 'oops') }
+
+ let(:raw_signature) do
+ {
+ 'creator' => 'http://example.com/alice',
+ 'created' => '2017-09-23T20:21:34Z',
+ }
+ end
+
+ it 'returns nil' do
+ expect(subject.verify_actor!).to be_nil
+ end
+ end
end
describe '#sign!' do
diff --git a/spec/lib/request_spec.rb b/spec/lib/request_spec.rb
index f17cf637b99a31..79c400e098e489 100644
--- a/spec/lib/request_spec.rb
+++ b/spec/lib/request_spec.rb
@@ -60,16 +60,12 @@
expect(a_request(:get, 'http://example.com')).to have_been_made.once
end
- it 'sets headers' do
- expect { |block| subject.perform(&block) }.to yield_control
- expect(a_request(:get, 'http://example.com').with(headers: subject.headers)).to have_been_made
- end
-
- it 'closes underlying connection' do
+ it 'makes a request with expected headers, yields, and closes the underlying connection' do
allow(subject.send(:http_client)).to receive(:close)
expect { |block| subject.perform(&block) }.to yield_control
+ expect(a_request(:get, 'http://example.com').with(headers: subject.headers)).to have_been_made
expect(subject.send(:http_client)).to have_received(:close)
end
@@ -80,6 +76,29 @@
end
end
+ context 'with a redirect and HTTP signatures' do
+ let(:account) { Fabricate(:account) }
+
+ before do
+ stub_request(:get, 'http://example.com').to_return(status: 301, headers: { Location: 'http://redirected.example.com/foo' })
+ stub_request(:get, 'http://redirected.example.com/foo').to_return(body: 'lorem ipsum')
+ end
+
+ it 'makes a request with expected headers and follows redirects' do
+ expect { |block| subject.on_behalf_of(account).perform(&block) }.to yield_control
+
+ # request.headers includes the `Signature` sent for the first request
+ expect(a_request(:get, 'http://example.com').with(headers: subject.headers)).to have_been_made.once
+
+ # request.headers includes the `Signature`, but it has changed
+ expect(a_request(:get, 'http://redirected.example.com/foo').with(headers: subject.headers.merge({ 'Host' => 'redirected.example.com' }))).to_not have_been_made
+
+ # `with(headers: )` matching tests for inclusion, so strip `Signature`
+ # This doesn't actually test that there is a signature, but it tests that the original signature is not passed
+ expect(a_request(:get, 'http://redirected.example.com/foo').with(headers: subject.headers.without('Signature').merge({ 'Host' => 'redirected.example.com' }))).to have_been_made.once
+ end
+ end
+
context 'with private host' do
around do |example|
WebMock.disable!
diff --git a/spec/requests/admin/account_actions_spec.rb b/spec/requests/admin/account_actions_spec.rb
new file mode 100644
index 00000000000000..5bf8f3e9b2aaa7
--- /dev/null
+++ b/spec/requests/admin/account_actions_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Account Actions' do
+ describe 'POST /admin/accounts/:account_id/action' do
+ before { sign_in Fabricate(:admin_user) }
+
+ let(:account) { Fabricate :account }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_account_action_path(account.id, admin_account_action: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/account_moderation_notes_spec.rb b/spec/requests/admin/account_moderation_notes_spec.rb
new file mode 100644
index 00000000000000..857bec1e098a96
--- /dev/null
+++ b/spec/requests/admin/account_moderation_notes_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Account Moderation Notes' do
+ describe 'POST /admin/account_moderation_notes' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_account_moderation_notes_path(account_moderation_note: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/accounts_spec.rb b/spec/requests/admin/accounts_spec.rb
new file mode 100644
index 00000000000000..de655f0d36a2d8
--- /dev/null
+++ b/spec/requests/admin/accounts_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Accounts' do
+ describe 'POST /admin/accounts/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_accounts_path(form_account_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_accounts_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/announcements_spec.rb b/spec/requests/admin/announcements_spec.rb
new file mode 100644
index 00000000000000..46d1b6a0965b2d
--- /dev/null
+++ b/spec/requests/admin/announcements_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Announcements' do
+ describe 'POST /admin/announcements' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_announcements_path(announcement: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/change_emails_spec.rb b/spec/requests/admin/change_emails_spec.rb
new file mode 100644
index 00000000000000..3df29eb77b450d
--- /dev/null
+++ b/spec/requests/admin/change_emails_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Account Change Email' do
+ describe 'PUT /admin/accounts/:account_id/change_email' do
+ before { sign_in Fabricate(:admin_user) }
+
+ let(:account) { Fabricate :account }
+
+ it 'gracefully handles invalid nested params' do
+ put admin_account_change_email_path(account.id, user: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/custom_emojis_spec.rb b/spec/requests/admin/custom_emojis_spec.rb
new file mode 100644
index 00000000000000..0c142f11f21119
--- /dev/null
+++ b/spec/requests/admin/custom_emojis_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Custom Emojis' do
+ describe 'POST /admin/custom_emojis' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_custom_emojis_path(custom_emoji: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/domain_allows_spec.rb b/spec/requests/admin/domain_allows_spec.rb
new file mode 100644
index 00000000000000..0d1f6d02489786
--- /dev/null
+++ b/spec/requests/admin/domain_allows_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Domain Allows' do
+ describe 'POST /admin/domain_allows' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_domain_allows_path(domain_allow: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/domain_blocks_spec.rb b/spec/requests/admin/domain_blocks_spec.rb
new file mode 100644
index 00000000000000..3b18a8ece12e55
--- /dev/null
+++ b/spec/requests/admin/domain_blocks_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Domain Blocks' do
+ describe 'POST /admin/domain_blocks/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_domain_blocks_path(form_domain_block_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_instances_path(limited: '1'))
+ end
+ end
+end
diff --git a/spec/requests/admin/email_domain_blocks_spec.rb b/spec/requests/admin/email_domain_blocks_spec.rb
new file mode 100644
index 00000000000000..7bccb3166b441d
--- /dev/null
+++ b/spec/requests/admin/email_domain_blocks_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Email Domain Blocks' do
+ describe 'POST /admin/email_domain_blocks' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_email_domain_blocks_path(email_domain_block: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+
+ describe 'POST /admin/email_domain_blocks/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_email_domain_blocks_path(form_email_domain_block_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_email_domain_blocks_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/export_domain_allows_spec.rb b/spec/requests/admin/export_domain_allows_spec.rb
new file mode 100644
index 00000000000000..761c39984ec197
--- /dev/null
+++ b/spec/requests/admin/export_domain_allows_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Export Domain Allows' do
+ describe 'POST /admin/export_domain_allows/import' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post import_admin_export_domain_allows_path(admin_import: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_instances_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/export_domain_blocks_spec.rb b/spec/requests/admin/export_domain_blocks_spec.rb
new file mode 100644
index 00000000000000..d7fed5287f51b2
--- /dev/null
+++ b/spec/requests/admin/export_domain_blocks_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Export Domain Blocks' do
+ describe 'POST /admin/export_domain_blocks/import' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post import_admin_export_domain_blocks_path(admin_import: 'invalid')
+
+ expect(response.body)
+ .to include(I18n.t('admin.export_domain_blocks.no_file'))
+ end
+ end
+end
diff --git a/spec/requests/admin/follow_recommendations_spec.rb b/spec/requests/admin/follow_recommendations_spec.rb
new file mode 100644
index 00000000000000..146c26448cd262
--- /dev/null
+++ b/spec/requests/admin/follow_recommendations_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Follow Recommendations' do
+ describe 'PUT /admin/follow_recommendations' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ put admin_follow_recommendations_path(form_account_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_follow_recommendations_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/invites_spec.rb b/spec/requests/admin/invites_spec.rb
new file mode 100644
index 00000000000000..c027fd30cfc717
--- /dev/null
+++ b/spec/requests/admin/invites_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Invites' do
+ describe 'POST /admin/invites' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_invites_path(invite: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/ip_blocks_spec.rb b/spec/requests/admin/ip_blocks_spec.rb
new file mode 100644
index 00000000000000..e74961aa3cd813
--- /dev/null
+++ b/spec/requests/admin/ip_blocks_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin IP Blocks' do
+ describe 'POST /admin/ip_blocks' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_ip_blocks_path(ip_block: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+
+ describe 'POST /admin/ip_blocks/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_ip_blocks_path(form_ip_block_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_ip_blocks_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/relays_spec.rb b/spec/requests/admin/relays_spec.rb
new file mode 100644
index 00000000000000..5dcdfe98924ad3
--- /dev/null
+++ b/spec/requests/admin/relays_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Relays' do
+ describe 'POST /admin/relays' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_relays_path(relay: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/report_notes_spec.rb b/spec/requests/admin/report_notes_spec.rb
new file mode 100644
index 00000000000000..170648a714f170
--- /dev/null
+++ b/spec/requests/admin/report_notes_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Report Notes' do
+ describe 'POST /admin/report_notes' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_report_notes_path(report_note: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/roles_spec.rb b/spec/requests/admin/roles_spec.rb
new file mode 100644
index 00000000000000..785da5a0ffdf5a
--- /dev/null
+++ b/spec/requests/admin/roles_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Roles' do
+ describe 'POST /admin/roles' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_roles_path(user_role: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/rules_spec.rb b/spec/requests/admin/rules_spec.rb
new file mode 100644
index 00000000000000..9382b38e59d385
--- /dev/null
+++ b/spec/requests/admin/rules_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Rules' do
+ describe 'POST /admin/rules' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_rules_path(rule: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/settings/about_spec.rb b/spec/requests/admin/settings/about_spec.rb
new file mode 100644
index 00000000000000..28be2c252d6263
--- /dev/null
+++ b/spec/requests/admin/settings/about_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Settings About' do
+ describe 'PUT /admin/settings/about' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ put admin_settings_about_path(form_admin_settings: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/statuses_spec.rb b/spec/requests/admin/statuses_spec.rb
new file mode 100644
index 00000000000000..9fa732e178f7f1
--- /dev/null
+++ b/spec/requests/admin/statuses_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Statuses' do
+ describe 'POST /admin/accounts/:account_id/statuses/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ let(:account) { Fabricate :account }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_account_statuses_path(account.id, admin_status_batch_action: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_account_statuses_path(account.id))
+ end
+ end
+end
diff --git a/spec/requests/admin/tags_spec.rb b/spec/requests/admin/tags_spec.rb
new file mode 100644
index 00000000000000..653c5bd9356bae
--- /dev/null
+++ b/spec/requests/admin/tags_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Tags' do
+ describe 'PUT /admin/tags/:id' do
+ before { sign_in Fabricate(:admin_user) }
+
+ let(:tag) { Fabricate :tag }
+
+ it 'gracefully handles invalid nested params' do
+ put admin_tag_path(tag.id, tag: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/terms_of_service/drafts_spec.rb b/spec/requests/admin/terms_of_service/drafts_spec.rb
new file mode 100644
index 00000000000000..2c3c77193e5a34
--- /dev/null
+++ b/spec/requests/admin/terms_of_service/drafts_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Terms Drafts' do
+ describe 'PUT /admin/terms_of_service/draft' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ put admin_terms_of_service_draft_path(terms_of_service: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/terms_of_service/generates_spec.rb b/spec/requests/admin/terms_of_service/generates_spec.rb
new file mode 100644
index 00000000000000..b8c51fdf2c76b8
--- /dev/null
+++ b/spec/requests/admin/terms_of_service/generates_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Terms Generates' do
+ describe 'POST /admin/terms_of_service/generates' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_terms_of_service_generate_path(terms_of_service_generator: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/trends/links/preview_card_providers_spec.rb b/spec/requests/admin/trends/links/preview_card_providers_spec.rb
new file mode 100644
index 00000000000000..69bf479c68667f
--- /dev/null
+++ b/spec/requests/admin/trends/links/preview_card_providers_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Trends Links Preview Card Providers' do
+ describe 'POST /admin/trends/links/publishers/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_trends_links_preview_card_providers_path(trends_preview_card_provider_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_trends_links_preview_card_providers_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/trends/links_spec.rb b/spec/requests/admin/trends/links_spec.rb
new file mode 100644
index 00000000000000..9fbfd567043e15
--- /dev/null
+++ b/spec/requests/admin/trends/links_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Trends Links' do
+ describe 'POST /admin/trends/links/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_trends_links_path(trends_preview_card_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_trends_links_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/trends/statuses_spec.rb b/spec/requests/admin/trends/statuses_spec.rb
new file mode 100644
index 00000000000000..ceae24ec8f0a68
--- /dev/null
+++ b/spec/requests/admin/trends/statuses_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Trends Statuses' do
+ describe 'POST /admin/trends/statuses/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_trends_statuses_path(trends_status_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_trends_statuses_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/trends/tags_spec.rb b/spec/requests/admin/trends/tags_spec.rb
new file mode 100644
index 00000000000000..e505be7a193075
--- /dev/null
+++ b/spec/requests/admin/trends/tags_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Trends Tags' do
+ describe 'POST /admin/trends/tags/batch' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_admin_trends_tags_path(trends_tag_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(admin_trends_tags_path)
+ end
+ end
+end
diff --git a/spec/requests/admin/users/roles_spec.rb b/spec/requests/admin/users/roles_spec.rb
new file mode 100644
index 00000000000000..b39e3f8bae1317
--- /dev/null
+++ b/spec/requests/admin/users/roles_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Users Roles' do
+ describe 'PUT /admin/users/:user_id/role' do
+ before { sign_in Fabricate(:admin_user) }
+
+ let(:user) { Fabricate :user }
+
+ it 'gracefully handles invalid nested params' do
+ put admin_user_role_path(user.id, user: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/warning_presets_spec.rb b/spec/requests/admin/warning_presets_spec.rb
new file mode 100644
index 00000000000000..6527cec30f370c
--- /dev/null
+++ b/spec/requests/admin/warning_presets_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Warning Presets' do
+ describe 'POST /admin/warning_presets' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_warning_presets_path(account_warning_preset: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/admin/webhooks_spec.rb b/spec/requests/admin/webhooks_spec.rb
new file mode 100644
index 00000000000000..fe047abd3c122e
--- /dev/null
+++ b/spec/requests/admin/webhooks_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Webhooks' do
+ describe 'POST /admin/webhooks' do
+ before { sign_in Fabricate(:admin_user) }
+
+ it 'gracefully handles invalid nested params' do
+ post admin_webhooks_path(webhook: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/api/v2/instance_spec.rb b/spec/requests/api/v2/instance_spec.rb
index ce1c999c9a9504..3350d68f7f7d6f 100644
--- a/spec/requests/api/v2/instance_spec.rb
+++ b/spec/requests/api/v2/instance_spec.rb
@@ -59,7 +59,7 @@ def include_configuration_limits
description_limit: MediaAttachment::MAX_DESCRIPTION_LENGTH
),
polls: include(
- max_options: PollValidator::MAX_OPTIONS
+ max_options: PollOptionsValidator::MAX_OPTIONS
)
)
)
diff --git a/spec/requests/auth/challenges_spec.rb b/spec/requests/auth/challenges_spec.rb
index 628bfe499b16ba..87692166575834 100644
--- a/spec/requests/auth/challenges_spec.rb
+++ b/spec/requests/auth/challenges_spec.rb
@@ -33,5 +33,14 @@
.to be_nil
end
end
+
+ context 'with invalid params' do
+ it 'gracefully handles invalid nested params' do
+ post auth_challenge_path(form_challenge: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
end
end
diff --git a/spec/requests/auth/sessions_spec.rb b/spec/requests/auth/sessions_spec.rb
new file mode 100644
index 00000000000000..246c3794cc2362
--- /dev/null
+++ b/spec/requests/auth/sessions_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Auth Sessions' do
+ describe 'POST /auth/sign_in' do
+ # The rack-attack check has issues with the non-nested invalid param used here
+ before { Rack::Attack.enabled = false }
+ after { Rack::Attack.enabled = true }
+
+ it 'gracefully handles invalid nested params' do
+ post user_session_path(user: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/filters/statuses_spec.rb b/spec/requests/filters/statuses_spec.rb
new file mode 100644
index 00000000000000..aa1d049da71b6e
--- /dev/null
+++ b/spec/requests/filters/statuses_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Filters Statuses' do
+ describe 'POST /filters/:filter_id/statuses/batch' do
+ before { sign_in(user) }
+
+ let(:filter) { Fabricate :custom_filter, account: user.account }
+ let(:user) { Fabricate :user }
+
+ it 'gracefully handles invalid nested params' do
+ post batch_filter_statuses_path(filter.id, form_status_filter_batch_action: 'invalid')
+
+ expect(response)
+ .to redirect_to(edit_filter_path(filter))
+ end
+ end
+end
diff --git a/spec/requests/relationships_spec.rb b/spec/requests/relationships_spec.rb
new file mode 100644
index 00000000000000..ee6b321c46a84c
--- /dev/null
+++ b/spec/requests/relationships_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Relationships' do
+ describe 'PUT /relationships' do
+ before { sign_in Fabricate(:user) }
+
+ it 'gracefully handles invalid nested params' do
+ put relationships_path(form_account_batch: 'invalid')
+
+ expect(response)
+ .to redirect_to(relationships_path)
+ end
+ end
+end
diff --git a/spec/requests/settings/applications_spec.rb b/spec/requests/settings/applications_spec.rb
index 8a5b3de895b47f..d2d91f03b1e564 100644
--- a/spec/requests/settings/applications_spec.rb
+++ b/spec/requests/settings/applications_spec.rb
@@ -40,5 +40,23 @@
expect(response)
.to redirect_to(settings_applications_path)
end
+
+ it 'gracefully handles invalid nested params' do
+ post settings_applications_path(doorkeeper_application: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+
+ describe 'PUT /settings/applications/:id' do
+ let(:application) { Fabricate :application, owner: user }
+
+ it 'gracefully handles invalid nested params' do
+ put settings_application_path(application.id, doorkeeper_application: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
end
end
diff --git a/spec/requests/settings/preferences/appearance_spec.rb b/spec/requests/settings/preferences/appearance_spec.rb
new file mode 100644
index 00000000000000..cfdc4dafc992f9
--- /dev/null
+++ b/spec/requests/settings/preferences/appearance_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Settings Preferences Appearance' do
+ describe 'PUT /settings/preferences/appearance' do
+ before { sign_in Fabricate(:user) }
+
+ it 'gracefully handles invalid nested params' do
+ put settings_preferences_appearance_path(user: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/settings/two_factor_authentication/confirmations_spec.rb b/spec/requests/settings/two_factor_authentication/confirmations_spec.rb
new file mode 100644
index 00000000000000..bf443a5e62fe00
--- /dev/null
+++ b/spec/requests/settings/two_factor_authentication/confirmations_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Settings 2FA Confirmations' do
+ describe 'POST /settings/two_factor_authentication/confirmations' do
+ before do
+ sign_in Fabricate(:user, encrypted_password: '') # Empty encrypted password avoids challengable flow
+ post settings_otp_authentication_path # Sets `session[:new_otp_secret]` which is needed for next step
+ end
+
+ it 'gracefully handles invalid nested params' do
+ post settings_two_factor_authentication_confirmation_path(form_two_factor_confirmation: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/requests/settings/verifications_spec.rb b/spec/requests/settings/verifications_spec.rb
new file mode 100644
index 00000000000000..5acfe648367a8b
--- /dev/null
+++ b/spec/requests/settings/verifications_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Settings Verifications' do
+ describe 'PUT /settings/verification' do
+ before { sign_in Fabricate(:user) }
+
+ it 'gracefully handles invalid nested params' do
+ put settings_verification_path(account: 'invalid')
+
+ expect(response)
+ .to have_http_status(400)
+ end
+ end
+end
diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb
index 1a8ea2d1709694..caaca2fe7c6600 100644
--- a/spec/services/activitypub/process_status_update_service_spec.rb
+++ b/spec/services/activitypub/process_status_update_service_spec.rb
@@ -268,7 +268,7 @@
it 'updates tags and featured tags' do
expect { subject.call(status, json, json) }
- .to change { status.tags.reload.pluck(:name) }.from(%w(test foo)).to(%w(foo bar))
+ .to change { status.tags.reload.pluck(:name) }.from(contain_exactly('test', 'foo')).to(contain_exactly('foo', 'bar'))
.and change { status.account.featured_tags.find_by(name: 'test').statuses_count }.by(-1)
.and change { status.account.featured_tags.find_by(name: 'bar').statuses_count }.by(1)
.and change { status.account.featured_tags.find_by(name: 'bar').last_status_at }.from(nil).to(be_present)
diff --git a/spec/system/settings/preferences/appearance_spec.rb b/spec/system/settings/preferences/appearance_spec.rb
index a7d408337a3caa..a1dcb37c9187e7 100644
--- a/spec/system/settings/preferences/appearance_spec.rb
+++ b/spec/system/settings/preferences/appearance_spec.rb
@@ -18,9 +18,12 @@
check confirm_reblog_field
uncheck confirm_delete_field
+ check advanced_layout_field
+
expect { save_changes }
.to change { user.reload.settings['web.reblog_modal'] }.to(true)
- .and(change { user.reload.settings['web.delete_modal'] }.to(false))
+ .and change { user.reload.settings['web.delete_modal'] }.to(false)
+ .and(change { user.reload.settings['web.advanced_layout'] }.to(true))
expect(page)
.to have_title(I18n.t('settings.appearance'))
end
@@ -40,4 +43,8 @@ def confirm_reblog_field
def theme_selection_field
I18n.t('simple_form.labels.defaults.setting_theme')
end
+
+ def advanced_layout_field
+ I18n.t('simple_form.labels.defaults.setting_advanced_layout')
+ end
end
diff --git a/spec/validators/poll_validator_spec.rb b/spec/validators/poll_expiration_validator_spec.rb
similarity index 64%
rename from spec/validators/poll_validator_spec.rb
rename to spec/validators/poll_expiration_validator_spec.rb
index f2a2534898d106..41b8c96211971c 100644
--- a/spec/validators/poll_validator_spec.rb
+++ b/spec/validators/poll_expiration_validator_spec.rb
@@ -2,7 +2,7 @@
require 'rails_helper'
-RSpec.describe PollValidator do
+RSpec.describe PollExpirationValidator do
describe '#validate' do
before do
validator.validate(poll)
@@ -14,16 +14,24 @@
let(:options) { %w(foo bar) }
let(:expires_at) { 1.day.from_now }
- it 'have no errors' do
+ it 'has no errors' do
expect(errors).to_not have_received(:add)
end
- context 'when expires is just 5 min ago' do
+ context 'when the poll expires in 5 min from now' do
let(:expires_at) { 5.minutes.from_now }
- it 'not calls errors add' do
+ it 'has no errors' do
expect(errors).to_not have_received(:add)
end
end
+
+ context 'when the poll expires in the past' do
+ let(:expires_at) { 5.minutes.ago }
+
+ it 'has errors' do
+ expect(errors).to have_received(:add)
+ end
+ end
end
end
diff --git a/spec/validators/poll_options_validator_spec.rb b/spec/validators/poll_options_validator_spec.rb
new file mode 100644
index 00000000000000..9e4ec744db1970
--- /dev/null
+++ b/spec/validators/poll_options_validator_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe PollOptionsValidator do
+ describe '#validate' do
+ before do
+ validator.validate(poll)
+ end
+
+ let(:validator) { described_class.new }
+ let(:poll) { instance_double(Poll, options: options, expires_at: expires_at, errors: errors) }
+ let(:errors) { instance_double(ActiveModel::Errors, add: nil) }
+ let(:options) { %w(foo bar) }
+ let(:expires_at) { 1.day.from_now }
+
+ it 'has no errors' do
+ expect(errors).to_not have_received(:add)
+ end
+
+ context 'when the poll has duplicate options' do
+ let(:options) { %w(foo foo) }
+
+ it 'adds errors' do
+ expect(errors).to have_received(:add)
+ end
+ end
+
+ context 'when the poll has no options' do
+ let(:options) { [] }
+
+ it 'adds errors' do
+ expect(errors).to have_received(:add)
+ end
+ end
+
+ context 'when the poll has too many options' do
+ let(:options) { Array.new(described_class::MAX_OPTIONS + 1) { |i| "option #{i}" } }
+
+ it 'adds errors' do
+ expect(errors).to have_received(:add)
+ end
+ end
+ end
+end
diff --git a/yarn.lock b/yarn.lock
index b4445c75069791..eb97502d9a590e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -55,57 +55,57 @@ __metadata:
languageName: node
linkType: hard
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/code-frame@npm:7.26.0"
+"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.2":
+ version: 7.26.2
+ resolution: "@babel/code-frame@npm:7.26.2"
dependencies:
"@babel/helper-validator-identifier": "npm:^7.25.9"
js-tokens: "npm:^4.0.0"
picocolors: "npm:^1.0.0"
- checksum: 10c0/46f7e367714be736b52ea3c01b24f47e2102e210fb83021d1c8237d8fc511b9538909e16e2fcdbb5cb6173e0794e28624309a59014e52fcfb7bde908f5284388
+ checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8
languageName: node
linkType: hard
-"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/compat-data@npm:7.26.0"
- checksum: 10c0/6325c9151a3c9b0a3a807e854a26255ef66d989bff331475a935af9bb18f160e0fffe6aed550e4e96b63f91efcd874bfbaab2a1f4a2f8d25645d712a0de590fb
+"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.26.5":
+ version: 7.26.5
+ resolution: "@babel/compat-data@npm:7.26.5"
+ checksum: 10c0/9d2b41f0948c3dfc5de44d9f789d2208c2ea1fd7eb896dfbb297fe955e696728d6f363c600cd211e7f58ccbc2d834fe516bb1e4cf883bbabed8a32b038afc1a0
languageName: node
linkType: hard
"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1, @babel/core@npm:^7.24.4, @babel/core@npm:^7.25.0":
- version: 7.26.0
- resolution: "@babel/core@npm:7.26.0"
+ version: 7.26.7
+ resolution: "@babel/core@npm:7.26.7"
dependencies:
"@ampproject/remapping": "npm:^2.2.0"
- "@babel/code-frame": "npm:^7.26.0"
- "@babel/generator": "npm:^7.26.0"
- "@babel/helper-compilation-targets": "npm:^7.25.9"
+ "@babel/code-frame": "npm:^7.26.2"
+ "@babel/generator": "npm:^7.26.5"
+ "@babel/helper-compilation-targets": "npm:^7.26.5"
"@babel/helper-module-transforms": "npm:^7.26.0"
- "@babel/helpers": "npm:^7.26.0"
- "@babel/parser": "npm:^7.26.0"
+ "@babel/helpers": "npm:^7.26.7"
+ "@babel/parser": "npm:^7.26.7"
"@babel/template": "npm:^7.25.9"
- "@babel/traverse": "npm:^7.25.9"
- "@babel/types": "npm:^7.26.0"
+ "@babel/traverse": "npm:^7.26.7"
+ "@babel/types": "npm:^7.26.7"
convert-source-map: "npm:^2.0.0"
debug: "npm:^4.1.0"
gensync: "npm:^1.0.0-beta.2"
json5: "npm:^2.2.3"
semver: "npm:^6.3.1"
- checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e
+ checksum: 10c0/fbd2cd9fc23280bdcaca556e558f715c0a42d940b9913c52582e8e3d24e391d269cb8a9cd6589172593983569021c379e28bba6b19ea2ee08674f6068c210a9d
languageName: node
linkType: hard
-"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.7.2":
- version: 7.26.0
- resolution: "@babel/generator@npm:7.26.0"
+"@babel/generator@npm:^7.26.5, @babel/generator@npm:^7.7.2":
+ version: 7.26.5
+ resolution: "@babel/generator@npm:7.26.5"
dependencies:
- "@babel/parser": "npm:^7.26.0"
- "@babel/types": "npm:^7.26.0"
+ "@babel/parser": "npm:^7.26.5"
+ "@babel/types": "npm:^7.26.5"
"@jridgewell/gen-mapping": "npm:^0.3.5"
"@jridgewell/trace-mapping": "npm:^0.3.25"
jsesc: "npm:^3.0.2"
- checksum: 10c0/b6bb9185f19a97eaf58e04a6d39a13237076678e7ed16b6321dea914535d4bf6a8d7727c9dcb65539845aa0096b326eb67be4bab764bd74bcfd848e2eda68609
+ checksum: 10c0/3be79e0aa03f38858a465d12ee2e468320b9122dc44fc85984713e32f16f4d77ce34a16a1a9505972782590e0b8d847b6f373621f9c6fafa1906d90f31416cb0
languageName: node
linkType: hard
@@ -118,16 +118,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.9"
- dependencies:
- "@babel/traverse": "npm:^7.25.9"
- "@babel/types": "npm:^7.25.9"
- checksum: 10c0/a6068bb813e7f72d12b72edeecb99167f60cd7964cacedfb60e01fff5e7bed4a5a7f4f7414de7cf352a1b71487df5f8dab8c2b5230de4ad5aea16adf32e14219
- languageName: node
- linkType: hard
-
"@babel/helper-builder-react-jsx@npm:^7.25.9":
version: 7.25.9
resolution: "@babel/helper-builder-react-jsx@npm:7.25.9"
@@ -138,16 +128,16 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-compilation-targets@npm:7.25.9"
+"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5":
+ version: 7.26.5
+ resolution: "@babel/helper-compilation-targets@npm:7.26.5"
dependencies:
- "@babel/compat-data": "npm:^7.25.9"
+ "@babel/compat-data": "npm:^7.26.5"
"@babel/helper-validator-option": "npm:^7.25.9"
browserslist: "npm:^4.24.0"
lru-cache: "npm:^5.1.1"
semver: "npm:^6.3.1"
- checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa
+ checksum: 10c0/9da5c77e5722f1a2fcb3e893049a01d414124522bbf51323bb1a0c9dcd326f15279836450fc36f83c9e8a846f3c40e88be032ed939c5a9840922bed6073edfb4
languageName: node
linkType: hard
@@ -271,16 +261,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-simple-access@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-simple-access@npm:7.25.9"
- dependencies:
- "@babel/traverse": "npm:^7.25.9"
- "@babel/types": "npm:^7.25.9"
- checksum: 10c0/3f1bcdb88ee3883ccf86959869a867f6bbf8c4737cd44fb9f799c38e54f67474590bc66802500ae9fe18161792875b2cfb7ec15673f48ed6c8663f6d09686ca8
- languageName: node
- linkType: hard
-
"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9":
version: 7.25.9
resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9"
@@ -323,24 +303,24 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helpers@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/helpers@npm:7.26.0"
+"@babel/helpers@npm:^7.26.7":
+ version: 7.26.7
+ resolution: "@babel/helpers@npm:7.26.7"
dependencies:
"@babel/template": "npm:^7.25.9"
- "@babel/types": "npm:^7.26.0"
- checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097
+ "@babel/types": "npm:^7.26.7"
+ checksum: 10c0/37fec398e53a2dbbf24bc2a025c4d571b2556cef18d8116d05d04b153f13ef659cdfbaab96c8eed875e629d39bdf9b3ea5d099ccf80544537de224e2d94f9b11
languageName: node
linkType: hard
-"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0":
- version: 7.26.1
- resolution: "@babel/parser@npm:7.26.1"
+"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.5, @babel/parser@npm:^7.26.7":
+ version: 7.26.7
+ resolution: "@babel/parser@npm:7.26.7"
dependencies:
- "@babel/types": "npm:^7.26.0"
+ "@babel/types": "npm:^7.26.7"
bin:
parser: ./bin/babel-parser.js
- checksum: 10c0/dc7d4e6b7eb667fa0784e7e2c3f6f92ca12ad72242f6d4311995310dae55093f02acdb595b69b0dbbf04cb61ad87156ac03186ff32eacfa35149c655bc22c14b
+ checksum: 10c0/dcb08a4f2878ece33caffefe43b71488d753324bae7ca58d64bca3bc4af34dcfa1b58abdf9972516d76af760fceb25bb9294ca33461d56b31c5059ccfe32001f
languageName: node
linkType: hard
@@ -637,14 +617,14 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-block-scoped-functions@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.9"
+"@babel/plugin-transform-block-scoped-functions@npm:^7.26.5":
+ version: 7.26.5
+ resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5"
dependencies:
- "@babel/helper-plugin-utils": "npm:^7.25.9"
+ "@babel/helper-plugin-utils": "npm:^7.26.5"
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 10c0/e92ba0e3d72c038513844d8fca1cc8437dcb35cd42778e97fd03cb8303380b201468611e7ecfdcae3de33473b2679fe2de1552c5f925d112c5693425cf851f10
+ checksum: 10c0/2f3060800ead46b09971dd7bf830d66383b7bc61ced9945633b4ef9bf87787956ea83fcf49b387cecb377812588c6b81681714c760f9cf89ecba45edcbab1192
languageName: node
linkType: hard
@@ -768,15 +748,14 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-exponentiation-operator@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.9"
+"@babel/plugin-transform-exponentiation-operator@npm:^7.26.3":
+ version: 7.26.3
+ resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3"
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.25.9"
"@babel/helper-plugin-utils": "npm:^7.25.9"
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 10c0/3b42f65bab3fee28c385115ce6bcb6ba544dff187012df408a432c9fb44c980afd898911020c723dc1c9257aaf3d7d0131ad83ba15102bf30ad9a86fc2a8a912
+ checksum: 10c0/cac922e851c6a0831fdd2e3663564966916015aeff7f4485825fc33879cbc3a313ceb859814c9200248e2875d65bb13802a723e5d7d7b40a2e90da82a5a1e15c
languageName: node
linkType: hard
@@ -872,16 +851,15 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-modules-commonjs@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.9"
+"@babel/plugin-transform-modules-commonjs@npm:^7.25.9, @babel/plugin-transform-modules-commonjs@npm:^7.26.3":
+ version: 7.26.3
+ resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3"
dependencies:
- "@babel/helper-module-transforms": "npm:^7.25.9"
+ "@babel/helper-module-transforms": "npm:^7.26.0"
"@babel/helper-plugin-utils": "npm:^7.25.9"
- "@babel/helper-simple-access": "npm:^7.25.9"
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 10c0/6ce771fb04d4810257fc8900374fece877dacaed74b05eaa16ad9224b390f43795c4d046cbe9ae304e1eb5aad035d37383895e3c64496d647c2128d183916e74
+ checksum: 10c0/82e59708f19f36da29531a64a7a94eabbf6ff46a615e0f5d9b49f3f59e8ef10e2bac607d749091508d3fa655146c9e5647c3ffeca781060cdabedb4c7a33c6f2
languageName: node
linkType: hard
@@ -934,7 +912,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9":
+"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6":
version: 7.26.6
resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6"
dependencies:
@@ -1219,14 +1197,14 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-typeof-symbol@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.9"
+"@babel/plugin-transform-typeof-symbol@npm:^7.26.7":
+ version: 7.26.7
+ resolution: "@babel/plugin-transform-typeof-symbol@npm:7.26.7"
dependencies:
- "@babel/helper-plugin-utils": "npm:^7.25.9"
+ "@babel/helper-plugin-utils": "npm:^7.26.5"
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 10c0/2b19fd88608589d9bc6b607ff17b06791d35c67ef3249f4659283454e6a9984241e3bd4c4eb72bb8b3d860a73223f3874558b861adb7314aa317c1c6a2f0cafb
+ checksum: 10c0/d5640e3457637e6eee1d7205d255602ccca124ed30e4de10ec75ba179d167e0a826ceeab424e119921f5c995dfddf39ef1f2c91efd2dcbf3f0dc1e7931dfd1d1
languageName: node
linkType: hard
@@ -1293,12 +1271,12 @@ __metadata:
linkType: hard
"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4":
- version: 7.26.0
- resolution: "@babel/preset-env@npm:7.26.0"
+ version: 7.26.7
+ resolution: "@babel/preset-env@npm:7.26.7"
dependencies:
- "@babel/compat-data": "npm:^7.26.0"
- "@babel/helper-compilation-targets": "npm:^7.25.9"
- "@babel/helper-plugin-utils": "npm:^7.25.9"
+ "@babel/compat-data": "npm:^7.26.5"
+ "@babel/helper-compilation-targets": "npm:^7.26.5"
+ "@babel/helper-plugin-utils": "npm:^7.26.5"
"@babel/helper-validator-option": "npm:^7.25.9"
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9"
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9"
@@ -1312,7 +1290,7 @@ __metadata:
"@babel/plugin-transform-arrow-functions": "npm:^7.25.9"
"@babel/plugin-transform-async-generator-functions": "npm:^7.25.9"
"@babel/plugin-transform-async-to-generator": "npm:^7.25.9"
- "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.9"
+ "@babel/plugin-transform-block-scoped-functions": "npm:^7.26.5"
"@babel/plugin-transform-block-scoping": "npm:^7.25.9"
"@babel/plugin-transform-class-properties": "npm:^7.25.9"
"@babel/plugin-transform-class-static-block": "npm:^7.26.0"
@@ -1323,7 +1301,7 @@ __metadata:
"@babel/plugin-transform-duplicate-keys": "npm:^7.25.9"
"@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9"
"@babel/plugin-transform-dynamic-import": "npm:^7.25.9"
- "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.9"
+ "@babel/plugin-transform-exponentiation-operator": "npm:^7.26.3"
"@babel/plugin-transform-export-namespace-from": "npm:^7.25.9"
"@babel/plugin-transform-for-of": "npm:^7.25.9"
"@babel/plugin-transform-function-name": "npm:^7.25.9"
@@ -1332,12 +1310,12 @@ __metadata:
"@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9"
"@babel/plugin-transform-member-expression-literals": "npm:^7.25.9"
"@babel/plugin-transform-modules-amd": "npm:^7.25.9"
- "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9"
+ "@babel/plugin-transform-modules-commonjs": "npm:^7.26.3"
"@babel/plugin-transform-modules-systemjs": "npm:^7.25.9"
"@babel/plugin-transform-modules-umd": "npm:^7.25.9"
"@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9"
"@babel/plugin-transform-new-target": "npm:^7.25.9"
- "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.9"
+ "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.26.6"
"@babel/plugin-transform-numeric-separator": "npm:^7.25.9"
"@babel/plugin-transform-object-rest-spread": "npm:^7.25.9"
"@babel/plugin-transform-object-super": "npm:^7.25.9"
@@ -1354,7 +1332,7 @@ __metadata:
"@babel/plugin-transform-spread": "npm:^7.25.9"
"@babel/plugin-transform-sticky-regex": "npm:^7.25.9"
"@babel/plugin-transform-template-literals": "npm:^7.25.9"
- "@babel/plugin-transform-typeof-symbol": "npm:^7.25.9"
+ "@babel/plugin-transform-typeof-symbol": "npm:^7.26.7"
"@babel/plugin-transform-unicode-escapes": "npm:^7.25.9"
"@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9"
"@babel/plugin-transform-unicode-regex": "npm:^7.25.9"
@@ -1367,7 +1345,7 @@ __metadata:
semver: "npm:^6.3.1"
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 10c0/26e19dc407cfa1c5166be638b4c54239d084fe15d8d7e6306d8c6dc7bc1decc51070a8dcf28352c1a2feeefbe52a06d193a12e302327ad5f529583df75fb7a26
+ checksum: 10c0/77d2e46a4f133768c5c8a6b3fec49a7c85c6baec601991e63458921e889ff93911f447723c3a99a6a471ca654ea6dc2aaa7ed690f3e518ee80cea7820ab80ce3
languageName: node
linkType: hard
@@ -1425,11 +1403,11 @@ __metadata:
linkType: hard
"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
- version: 7.26.0
- resolution: "@babel/runtime@npm:7.26.0"
+ version: 7.26.7
+ resolution: "@babel/runtime@npm:7.26.7"
dependencies:
regenerator-runtime: "npm:^0.14.0"
- checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287
+ checksum: 10c0/60199c049f90e5e41c687687430052a370aca60bac7859ff4ee761c5c1739b8ba1604d391d01588c22dc0e93828cbadb8ada742578ad1b1df240746bce98729a
languageName: node
linkType: hard
@@ -1444,28 +1422,28 @@ __metadata:
languageName: node
linkType: hard
-"@babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/traverse@npm:7.25.9"
+"@babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.7":
+ version: 7.26.7
+ resolution: "@babel/traverse@npm:7.26.7"
dependencies:
- "@babel/code-frame": "npm:^7.25.9"
- "@babel/generator": "npm:^7.25.9"
- "@babel/parser": "npm:^7.25.9"
+ "@babel/code-frame": "npm:^7.26.2"
+ "@babel/generator": "npm:^7.26.5"
+ "@babel/parser": "npm:^7.26.7"
"@babel/template": "npm:^7.25.9"
- "@babel/types": "npm:^7.25.9"
+ "@babel/types": "npm:^7.26.7"
debug: "npm:^4.3.1"
globals: "npm:^11.1.0"
- checksum: 10c0/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1
+ checksum: 10c0/b23a36ce40d2e4970741431c45d4f92e3f4c2895c0a421456516b2729bd9e17278846e01ee3d9039b0adf5fc5a071768061c17fcad040e74a5c3e39517449d5b
languageName: node
linkType: hard
-"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4":
- version: 7.26.0
- resolution: "@babel/types@npm:7.26.0"
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.5, @babel/types@npm:^7.26.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4":
+ version: 7.26.7
+ resolution: "@babel/types@npm:7.26.7"
dependencies:
"@babel/helper-string-parser": "npm:^7.25.9"
"@babel/helper-validator-identifier": "npm:^7.25.9"
- checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8
+ checksum: 10c0/7810a2bca97b13c253f07a0863a628d33dbe76ee3c163367f24be93bfaf4c8c0a325f73208abaaa050a6b36059efc2950c2e4b71fb109c0f07fa62221d8473d4
languageName: node
linkType: hard
@@ -2420,9 +2398,9 @@ __metadata:
languageName: node
linkType: hard
-"@formatjs/ts-transformer@npm:3.13.30":
- version: 3.13.30
- resolution: "@formatjs/ts-transformer@npm:3.13.30"
+"@formatjs/ts-transformer@npm:3.13.31":
+ version: 3.13.31
+ resolution: "@formatjs/ts-transformer@npm:3.13.31"
dependencies:
"@formatjs/icu-messageformat-parser": "npm:2.11.0"
"@types/json-stable-stringify": "npm:1"
@@ -2432,11 +2410,11 @@ __metadata:
tslib: "npm:2"
typescript: "npm:5"
peerDependencies:
- ts-jest: ">=27"
+ ts-jest: 27 || 28 || 29
peerDependenciesMeta:
ts-jest:
optional: true
- checksum: 10c0/ef828b477863b8205390ed42d94c4a8d4fcab10d4982e27dc3feaa85c1e2da317b73108f8d3b32f6191d1c5c41eb34d6909a53ba734dfca9146842992268d95c
+ checksum: 10c0/bfd7a41203c2b1691d883b3c306f3ae413b94c4875dec75df2be0e62da22625f673e41ecdc3257be40fe4a5b22a311365c2462d00a98f9bac59f00488543add0
languageName: node
linkType: hard
@@ -3286,8 +3264,8 @@ __metadata:
linkType: hard
"@reduxjs/toolkit@npm:^2.0.1":
- version: 2.5.0
- resolution: "@reduxjs/toolkit@npm:2.5.0"
+ version: 2.5.1
+ resolution: "@reduxjs/toolkit@npm:2.5.1"
dependencies:
immer: "npm:^10.0.3"
redux: "npm:^5.0.1"
@@ -3301,7 +3279,7 @@ __metadata:
optional: true
react-redux:
optional: true
- checksum: 10c0/81748a5a6d2f52a14769b6ed25aea1e77cda81b1db6599c7c3a1d1605696c65c4469f55146c2b2a7a2f8ebafa5ecd4996aa8deecb37aebb5307217ec2fe384ac
+ checksum: 10c0/e25dd4085e5611d21d4e8d47716072e12318ef8171323d40a80c5b8e79e6d514a973718eb44e41f8491355f7a15e488a0e9f88a97c237327de2615a00b470929
languageName: node
linkType: hard
@@ -5341,8 +5319,8 @@ __metadata:
linkType: hard
"babel-plugin-formatjs@npm:^10.5.1":
- version: 10.5.33
- resolution: "babel-plugin-formatjs@npm:10.5.33"
+ version: 10.5.34
+ resolution: "babel-plugin-formatjs@npm:10.5.34"
dependencies:
"@babel/core": "npm:^7.25.0"
"@babel/helper-plugin-utils": "npm:^7.25.0"
@@ -5350,12 +5328,12 @@ __metadata:
"@babel/traverse": "npm:^7.25.0"
"@babel/types": "npm:^7.25.0"
"@formatjs/icu-messageformat-parser": "npm:2.11.0"
- "@formatjs/ts-transformer": "npm:3.13.30"
+ "@formatjs/ts-transformer": "npm:3.13.31"
"@types/babel__core": "npm:^7.20.5"
"@types/babel__helper-plugin-utils": "npm:^7.10.3"
"@types/babel__traverse": "npm:^7.20.6"
tslib: "npm:2"
- checksum: 10c0/57c0477c576fbf717a11f0ca15d3f18990264a36f20d8d7e2b66461ed1e6b6880bb4b7847b7f4289a81b45f36b7ec2687becb2dde5006b53f97953b3cc3bc39b
+ checksum: 10c0/6e6c67db41044427a7f182e7c18a8519e5aca96645de094244b332cb8c82ed498c56a4634e4e4ed1a4ef85c8e996669ef5bddd63ee9c45d6e512cbbf782af2a2
languageName: node
linkType: hard
@@ -14636,24 +14614,24 @@ __metadata:
linkType: hard
"react-intl@npm:^7.0.0":
- version: 7.1.3
- resolution: "react-intl@npm:7.1.3"
+ version: 7.1.5
+ resolution: "react-intl@npm:7.1.5"
dependencies:
"@formatjs/ecma402-abstract": "npm:2.3.2"
"@formatjs/icu-messageformat-parser": "npm:2.11.0"
"@formatjs/intl": "npm:3.1.3"
"@types/hoist-non-react-statics": "npm:3"
- "@types/react": "npm:16 || 17 || 18"
+ "@types/react": "npm:16 || 17 || 18 || 19"
hoist-non-react-statics: "npm:3"
intl-messageformat: "npm:10.7.14"
tslib: "npm:2"
peerDependencies:
- react: ^16.6.0 || 17 || 18
+ react: ^16.6.0 || 17 || 18 || 19
typescript: 5
peerDependenciesMeta:
typescript:
optional: true
- checksum: 10c0/64d635819f4bdd09325ca4f7479c7b0254b45da76cc1cb70c4b51a404bf1cf2976125d4df5874fe34527e84813703ac6ff707e06e0e96616951fae1f20f9d246
+ checksum: 10c0/9d8d5afae16d26466f82fc1c0b8c4afd7559a8faa5b3ef31983a0af540b1b225fa89208b48bf9ec83056c0a27f2972fb86f2717422f788efdc819fb0e0846134
languageName: node
linkType: hard
@@ -14814,8 +14792,8 @@ __metadata:
linkType: hard
"react-select@npm:^5.7.3":
- version: 5.9.0
- resolution: "react-select@npm:5.9.0"
+ version: 5.10.0
+ resolution: "react-select@npm:5.10.0"
dependencies:
"@babel/runtime": "npm:^7.12.0"
"@emotion/cache": "npm:^11.4.0"
@@ -14829,7 +14807,7 @@ __metadata:
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- checksum: 10c0/f21f18ca41a8c866ab69f9c65253e86dcc5323477bbfc729bf6aa9d897e04e27cfffd13c07f10b70dc554e15ad1d238c1283e05e457bf4ead8526a1dd7fbc8b0
+ checksum: 10c0/64cc73ef43556d0a199420d7d19f9f72e3c5e3a7f6828aef5421ec16cc0e4bc337061a8fa3c03afc5b929a087a4ca866f497e0ef865b03fe014c5cacde5e71dd
languageName: node
linkType: hard