Merge pull request #3449 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes up to d52d0e4ded
This commit is contained in:
Claire
2026-03-18 18:01:10 +01:00
committed by GitHub
46 changed files with 219 additions and 110 deletions

View File

@@ -67,7 +67,6 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'mime-types', '~> 3.7.0', require: 'mime/types/columnar'
gem 'mutex_m'
gem 'nokogiri', '~> 1.15'
gem 'oj', '~> 3.14'
gem 'ox', '~> 2.14'
gem 'parslet'
gem 'premailer-rails'
@@ -96,6 +95,7 @@ gem 'tzinfo-data', '~> 1.2023'
gem 'webauthn', '~> 3.0'
gem 'webpush', github: 'mastodon/webpush', ref: '9631ac63045cfabddacc69fc06e919b4c13eb913'
gem 'json'
gem 'json-ld'
gem 'json-ld-preloaded', '~> 3.2'
gem 'rdf-normalize', '~> 0.5'

View File

@@ -10,7 +10,7 @@ GIT
GEM
remote: https://rubygems.org/
specs:
action_text-trix (2.1.16)
action_text-trix (2.1.17)
railties
actioncable (8.1.2)
actionpack (= 8.1.2)
@@ -429,7 +429,7 @@ GEM
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
loofah (2.25.0)
loofah (2.25.1)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.9.0)
@@ -473,9 +473,6 @@ GEM
nokogiri (1.19.1)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
oj (3.16.16)
bigdecimal (>= 3.0)
ostruct (>= 0.2)
omniauth (2.1.4)
hashie (>= 3.4.6)
logger
@@ -997,6 +994,7 @@ DEPENDENCIES
inline_svg
irb (~> 1.8)
jd-paperclip-azure (~> 3.0)
json
json-ld
json-ld-preloaded (~> 3.2)
json-schema (~> 6.0)
@@ -1015,7 +1013,6 @@ DEPENDENCIES
net-http (~> 0.6.0)
net-ldap (~> 0.18)
nokogiri (~> 1.15)
oj (~> 3.14)
omniauth (~> 2.0)
omniauth-cas (~> 3.0.0.beta.1)
omniauth-rails_csrf_protection (~> 2.0)

View File

@@ -1 +1,27 @@
@use 'common';
@use 'mastodon/variables';
@use 'mastodon/mixins';
@use '@/styles/fonts/roboto';
@use '@/styles/fonts/roboto-mono';
@use 'mastodon/reset';
@use 'mastodon/theme';
@use 'mastodon/basics';
@use 'mastodon/branding';
@use 'mastodon/containers';
@use 'mastodon/lists';
@use 'mastodon/widgets';
@use 'mastodon/forms';
@use 'mastodon/accounts';
@use 'mastodon/components';
@use 'mastodon/polls';
@use 'mastodon/modal';
@use 'mastodon/emoji_picker';
@use 'mastodon/about';
@use 'mastodon/tables';
@use 'mastodon/admin';
@use 'mastodon/dashboard';
@use 'mastodon/rtl';
@use 'mastodon/accessibility';
@use 'mastodon/rich_text';
@use 'mastodon/glitch/local_settings';
@use 'mastodon/glitch/doodle';

View File

@@ -1,27 +0,0 @@
@use 'mastodon/variables';
@use 'mastodon/mixins';
@use '@/styles/fonts/roboto';
@use '@/styles/fonts/roboto-mono';
@use 'mastodon/reset';
@use 'mastodon/theme';
@use 'mastodon/basics';
@use 'mastodon/branding';
@use 'mastodon/containers';
@use 'mastodon/lists';
@use 'mastodon/widgets';
@use 'mastodon/forms';
@use 'mastodon/accounts';
@use 'mastodon/components';
@use 'mastodon/polls';
@use 'mastodon/modal';
@use 'mastodon/emoji_picker';
@use 'mastodon/about';
@use 'mastodon/tables';
@use 'mastodon/admin';
@use 'mastodon/dashboard';
@use 'mastodon/rtl';
@use 'mastodon/accessibility';
@use 'mastodon/rich_text';
@use 'mastodon/glitch/local_settings';
@use 'mastodon/glitch/doodle';

View File

@@ -1131,7 +1131,7 @@
"status.quote_manual_review": "Аўтар зробіць агляд уручную",
"status.quote_noun": "Цытаваць",
"status.quote_policy_change": "Змяніць, хто можа цытаваць",
"status.quote_post_author": "Цытаваў допіс @{name}",
"status.quote_post_author": "Цытаваў(-ла) допіс @{name}",
"status.quote_private": "Прыватныя допісы нельга цытаваць",
"status.quotes.empty": "Яшчэ ніхто не цытаваў гэты допіс. Калі гэта адбудзецца, то Вы пабачыце гэта тут.",
"status.quotes.local_other_disclaimer": "Цытаты, у якіх адмовіў аўтар, паказаныя не будуць.",

View File

@@ -188,7 +188,7 @@
"account_edit.image_alt_modal.details_content": "Richtig: <ul> <li>Beschreibe dich selbst wie abgebildet</li> <li>Verwende beim Beschreiben die 3. Person (z. B. „Axel“ anstatt „ich“)</li> <li>Formuliere kurz und knackig ein paar Wörter sind ausreichend</li> </ul> Falsch: <ul> <li>Mit „Bild von“ beginnen bei Screenreadern überflüssig</li> </ul> Korrektes Beispiel: <ul> <li>„Axel trägt ein grünes T-Shirt und eine Brille.“</li> </ul>",
"account_edit.image_alt_modal.details_title": "Hinweis: Bildbeschreibung für Profilbilder",
"account_edit.image_alt_modal.edit_title": "Bildbeschreibung bearbeiten",
"account_edit.image_alt_modal.text_hint": "Bildbeschreibungen können von Screenreadern erfasst werden. Dadurch können Menschen, die darauf angewiesen sind, deine Medieninhalte besser wahrnehmen.",
"account_edit.image_alt_modal.text_hint": "Bildbeschreibungen können sehbehinderten oder blinden Menschen helfen, deine Medieninhalte mithilfe eines Screenreaders besser zu verstehen und einzuordnen.",
"account_edit.image_alt_modal.text_label": "Bildbeschreibung",
"account_edit.image_delete_modal.confirm": "Möchtest du dieses Bild wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"account_edit.image_delete_modal.delete_button": "Löschen",

View File

@@ -10,7 +10,7 @@
"about.domain_blocks.suspended.explanation": "Τα δεδομένα αυτού του διακομιστή, δε θα επεξεργάζονται, δε θα αποθηκεύονται και δε θα ανταλλάσσονται, καθιστώντας οποιαδήποτε αλληλεπίδραση ή επικοινωνία με χρήστες από αυτόν το διακομιστή αδύνατη.",
"about.domain_blocks.suspended.title": "Σε αναστολή",
"about.language_label": "Γλώσσα",
"about.not_available": "Αυτές οι πληροφορίες δεν έχουν είναι διαθέσιμες σε αυτόν τον διακομιστή.",
"about.not_available": "Αυτές οι πληροφορίες δεν έχουν γίνει διαθέσιμες σε αυτόν τον διακομιστή.",
"about.powered_by": "Αποκεντρωμένο μέσο κοινωνικής δικτύωσης που βασίζεται στο {mastodon}",
"about.rules": "Κανόνες διακομιστή",
"account.account_note_header": "Προσωπική σημείωση",
@@ -67,7 +67,7 @@
"account.followers_counter": "{count, plural, one {{counter} ακόλουθος} other {{counter} ακόλουθοι}}",
"account.followers_you_know_counter": "{counter} που ξέρεις",
"account.following": "Ακολουθείτε",
"account.following_counter": "{count, plural, one {{counter} ακολουθεί} other {{counter} ακολουθούν}}",
"account.following_counter": "{count, plural, one {{counter} ακολουθεί} other {{counter} ακολουθεί}}",
"account.follows.empty": "Αυτός ο χρήστης δεν ακολουθεί κανέναν ακόμη.",
"account.follows_you": "Σε ακολουθεί",
"account.go_to_profile": "Μετάβαση στο προφίλ",

View File

@@ -44,9 +44,11 @@
"account.familiar_followers_two": "Jälgijateks {name1} ja {name2}",
"account.featured": "Esiletõstetud",
"account.featured.accounts": "Profiilid",
"account.featured.collections": "Kogud",
"account.featured.hashtags": "Teemaviited",
"account.featured_tags.last_status_at": "Viimane postitus: {date}",
"account.featured_tags.last_status_never": "Postitusi pole",
"account.field_overflow": "Näita kogu sisu",
"account.filters.all": "Kõik tegevused",
"account.filters.boosts_toggle": "Näita hooandmisi",
"account.filters.posts_boosts": "Postitused ja hooandmised",

View File

@@ -185,8 +185,10 @@
"account_edit.field_reorder_modal.handle_label": "Siirrä kenttää ”{item}”",
"account_edit.field_reorder_modal.title": "Järjestele kenttiä",
"account_edit.image_alt_modal.add_title": "Lisää tekstivastine",
"account_edit.image_alt_modal.details_content": "TEE NÄIN: <ul> <li>Kuvaile itseäsi kuvan mukaisesti</li> <li>Käytä kolmannen persoonan muotoja (esim. ”Aleksi” eikä ”minä”)</li> <li>Ole ytimekäs usein muutama sana riittää</li> </ul> ÄLÄ TEE NÄIN: <ul> <li>Aloita sanalla ”Kuva” sen on tarpeetonta näytönlukuohjelmille</li> </ul> ESIMERKKI: <ul> <li>”Aleksi yllään vihreä paita ja lasit”</li> </ul>",
"account_edit.image_alt_modal.details_title": "Vinkkejä: profiilikuvien tekstivastineet",
"account_edit.image_alt_modal.edit_title": "Muokkaa tekstivastinetta",
"account_edit.image_alt_modal.text_hint": "Teksivastine auttaa näytönlukuohjelmien käyttäjiä ymmärtämään sisältöä.",
"account_edit.image_alt_modal.text_label": "Tekstivastine",
"account_edit.image_delete_modal.confirm": "Haluatko varmasti poistaa tämän kuvan? Tätä toimea ei voi kumota.",
"account_edit.image_delete_modal.delete_button": "Poista",

View File

@@ -184,6 +184,7 @@
"account_edit.field_reorder_modal.drag_start": "Champ « {item} » sélectionné.",
"account_edit.field_reorder_modal.handle_label": "Faites glisser le champ « {item} »",
"account_edit.field_reorder_modal.title": "Réorganiser les champs",
"account_edit.image_alt_modal.add_title": "Ajouter un texte alternatif",
"account_edit.image_edit.add_button": "Ajouter une image",
"account_edit.image_edit.alt_add_button": "Ajouter un texte alternatif",
"account_edit.image_edit.alt_edit_button": "Modifier le texte alternatif",

View File

@@ -184,6 +184,7 @@
"account_edit.field_reorder_modal.drag_start": "Champ « {item} » sélectionné.",
"account_edit.field_reorder_modal.handle_label": "Faites glisser le champ « {item} »",
"account_edit.field_reorder_modal.title": "Réorganiser les champs",
"account_edit.image_alt_modal.add_title": "Ajouter un texte alternatif",
"account_edit.image_edit.add_button": "Ajouter une image",
"account_edit.image_edit.alt_add_button": "Ajouter un texte alternatif",
"account_edit.image_edit.alt_edit_button": "Modifier le texte alternatif",

View File

@@ -184,6 +184,15 @@
"account_edit.field_reorder_modal.drag_start": "השדה \"{item}\" נבחר.",
"account_edit.field_reorder_modal.handle_label": "הזזת השדה \"{item}\"",
"account_edit.field_reorder_modal.title": "סידור שדות",
"account_edit.image_alt_modal.add_title": "הוספת מלל חלופי",
"account_edit.image_alt_modal.details_content": "עשו: <ul><li>תארו עצמכם כפי שאתם בצילום</li><li>השתמשו בשפה בגוף שלישי (למשל \"רונית\" במקום \"אני\")</li><li>היו תמציתיים - מילים ספורות יספיקו לרוב</li></ul>אל תעשו: <ul><li>להתחיל תיאור עם \"תמונה של...\" - זה חזרתי מבחינת קוראי מסך</li></ul>דוגמא: <ul><li>\"רונית לבושה בחולצה ירוקה ומרכיבה משקפים\"</li></ul>",
"account_edit.image_alt_modal.details_title": "עצות: מלל חלופי לתמונות פרופיל",
"account_edit.image_alt_modal.edit_title": "עריכת מלל חלופי",
"account_edit.image_alt_modal.text_hint": "מלל חלופי מסייע למשתמשי קוראי מסך להבין את התוכן שלך.",
"account_edit.image_alt_modal.text_label": "מלל חלופי",
"account_edit.image_delete_modal.confirm": "האם למחוק את התמונה? לא ניתן לבטל פעולה זו.",
"account_edit.image_delete_modal.delete_button": "מחיקה",
"account_edit.image_delete_modal.title": "למחוק תמונה?",
"account_edit.image_edit.add_button": "הוספת תמונה",
"account_edit.image_edit.alt_add_button": "הוספת מלל חלופי",
"account_edit.image_edit.alt_edit_button": "עריכת מלל חלופי",
@@ -203,6 +212,16 @@
"account_edit.profile_tab.subtitle": "התאימו את הטאבים בפרופיל שלכם ומה שהם יציגו.",
"account_edit.profile_tab.title": "הגדרות טאבים לפרופיל",
"account_edit.save": "שמירה",
"account_edit.upload_modal.back": "חזרה",
"account_edit.upload_modal.done": "בוצע",
"account_edit.upload_modal.next": "הבא",
"account_edit.upload_modal.step_crop.zoom": "הגדלה",
"account_edit.upload_modal.step_upload.button": "עיון בקבצים",
"account_edit.upload_modal.step_upload.dragging": "גרור להעלאה",
"account_edit.upload_modal.step_upload.header": "בחר/י תמונה",
"account_edit.upload_modal.step_upload.hint": "תכנים בתקן WEBP, PNG, GIF או JPG, עד לגודל {limit} מ\"ב.{br}התמונה תתוקן לגודל {width} על {height} פיקסלים.",
"account_edit.upload_modal.title_add": "הוספת תמונת פרופיל",
"account_edit.upload_modal.title_replace": "החלפת תמונת פרופיל",
"account_edit.verified_modal.details": "הוספת אמינות לחשבון המסטודון על ידי הוספת קישורים מוודאים לאתרים אישיים. כך זה עובד:",
"account_edit.verified_modal.invisible_link.details": "הוסיפו את הקישור בכותרת. החלק החשוב הוא rel=\"me\" שמונע התחזות על אתרים עם תוכן משתמשים. ניתן גם ליצור תגית link בכותרת העמוד במקום קישור {tag} אבל קוד ה־HTML חייב להופיע שם ללא הרצה של ג'אווהסקריפט.",
"account_edit.verified_modal.invisible_link.summary": "כיצד לגרום לקישור להיות בלתי נראה?",

View File

@@ -184,6 +184,15 @@
"account_edit.field_reorder_modal.drag_start": "Opgepakt veld \"{item}\".",
"account_edit.field_reorder_modal.handle_label": "Veld \"{item}\" slepen",
"account_edit.field_reorder_modal.title": "Velden herschikken",
"account_edit.image_alt_modal.add_title": "Alt-tekst toevoegen",
"account_edit.image_alt_modal.details_content": "DOEN: <ul> <li>Beschrijf jezelf zoals afgebeeld</li> <li>Gebruik taal van een derde persoon (bijv. “Alex” in plaats van “ik”)</li> <li>Wees beknopt - een paar woorden is vaak genoeg</li> </ul> NIET DOEN: <ul> <li>Begin met “Foto van” - dit is overbodig voor schermlezers</li> </ul> VOORBEELD: <ul> <li>“Alex draagt een groen shirt en een bril”</li> </ul>",
"account_edit.image_alt_modal.details_title": "Tips: Alt-tekst voor profielfoto's",
"account_edit.image_alt_modal.edit_title": "Alt-tekst bewerken",
"account_edit.image_alt_modal.text_hint": "Alt-text helpt gebruikers van schermlezer jouw inhoud te begrijpen.",
"account_edit.image_alt_modal.text_label": "Alt-tekst",
"account_edit.image_delete_modal.confirm": "Weet je zeker dat je deze afbeelding wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"account_edit.image_delete_modal.delete_button": "Verwijderen",
"account_edit.image_delete_modal.title": "Afbeelding verwijderen?",
"account_edit.image_edit.add_button": "Afbeelding toevoegen",
"account_edit.image_edit.alt_add_button": "Alt-tekst toevoegen",
"account_edit.image_edit.alt_edit_button": "Alt-tekst bewerken",
@@ -203,6 +212,16 @@
"account_edit.profile_tab.subtitle": "De tabbladen op je profiel aanpassen en wat er op wordt weergegeven.",
"account_edit.profile_tab.title": "Instellingen voor tabblad Profiel",
"account_edit.save": "Opslaan",
"account_edit.upload_modal.back": "Terug",
"account_edit.upload_modal.done": "Klaar",
"account_edit.upload_modal.next": "Volgende",
"account_edit.upload_modal.step_crop.zoom": "Zoom",
"account_edit.upload_modal.step_upload.button": "Door bestanden bladeren",
"account_edit.upload_modal.step_upload.dragging": "Hierheen slepen om te uploaden",
"account_edit.upload_modal.step_upload.header": "Kies een afbeelding",
"account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- of JPG-formaat, tot max. {limit}MB.{br}Afbeelding wordt geschaald naar {width}x{height}px.",
"account_edit.upload_modal.title_add": "Profielfoto toevoegen",
"account_edit.upload_modal.title_replace": "Profielfoto vervangen",
"account_edit.verified_modal.details": "Voeg geloofwaardigheid toe aan je Mastodonprofiel door links naar persoonlijke websites te verifiëren. Zo werkt het:",
"account_edit.verified_modal.invisible_link.details": "Voeg de link toe aan uw header. Het belangrijke onderdeel is rel=\"me\" om te voorkomen dat websites impersoneren met door de gebruiker gegenereerde inhoud. Je kunt zelfs een linktag gebruiken in de kop van de pagina in plaats van {tag}, maar de HTML moet toegankelijk zijn zonder JavaScript uit te voeren.",
"account_edit.verified_modal.invisible_link.summary": "Hoe maak ik de link onzichtbaar?",

View File

@@ -183,6 +183,13 @@
"account_edit.field_reorder_modal.drag_start": "Apanhou o campo \"{item}\".",
"account_edit.field_reorder_modal.handle_label": "Arrastar o campo \"{item}\"",
"account_edit.field_reorder_modal.title": "Reordenar campos",
"account_edit.image_alt_modal.add_title": "Adicionar texto alternativo",
"account_edit.image_alt_modal.edit_title": "Editar texto alternativo",
"account_edit.image_alt_modal.text_hint": "O texto alternativo ajuda os utilizadores que usam um leitor de ecrã a entender seu conteúdo.",
"account_edit.image_alt_modal.text_label": "Texto alternativo",
"account_edit.image_delete_modal.confirm": "Tem a certeza que pretende eliminar esta imagem? Esta ação é irreversível.",
"account_edit.image_delete_modal.delete_button": "Eliminar",
"account_edit.image_delete_modal.title": "Eliminar imagem?",
"account_edit.image_edit.add_button": "Adicionar imagem",
"account_edit.image_edit.alt_add_button": "Adicionar texto alternativo",
"account_edit.image_edit.alt_edit_button": "Editar texto alternativo",
@@ -201,6 +208,15 @@
"account_edit.profile_tab.subtitle": "Personalize as abas do seu perfil e o que elas exibem.",
"account_edit.profile_tab.title": "Configurações da aba do perfil",
"account_edit.save": "Guardar",
"account_edit.upload_modal.back": "Voltar",
"account_edit.upload_modal.done": "Concluído",
"account_edit.upload_modal.next": "Seguinte",
"account_edit.upload_modal.step_crop.zoom": "Ampliação",
"account_edit.upload_modal.step_upload.button": "Explorar ficheiros",
"account_edit.upload_modal.step_upload.dragging": "Solte para transferir",
"account_edit.upload_modal.step_upload.header": "Escolha uma imagem",
"account_edit.upload_modal.title_add": "Adicionar foto de perfil",
"account_edit.upload_modal.title_replace": "Substituir foto de perfil",
"account_edit.verified_modal.details": "Adicione credibilidade ao seu perfil no Mastodon verificando links para sites pessoais. Veja como funciona:",
"account_edit.verified_modal.invisible_link.details": "Adicione o link ao seu cabeçalho. A parte importante é rel=\"me\", que evita a personificação em sites com conteúdo gerado por utilizadores. Você também pode usar uma tag de link no cabeçalho da página em vez de {tag}, mas o HTML deve ser acessível sem executar JavaScript.",
"account_edit.verified_modal.invisible_link.summary": "Como faço para tornar o link invisível?",
@@ -372,6 +388,7 @@
"collections.search_accounts_max_reached": "Já adicionou o máximo de contas",
"collections.sensitive": "Sensível",
"collections.topic_hint": "Adicione uma etiqueta para ajudar outros a entender o tópico principal desta coleção.",
"collections.topic_special_chars_hint": "Os carateres especiais serão removidos ao guardar",
"collections.view_collection": "Ver coleções",
"collections.view_other_collections_by_user": "Ver outras coleções deste utilizador",
"collections.visibility_public": "Pública",

View File

@@ -184,6 +184,15 @@
"account_edit.field_reorder_modal.drag_start": "\"{item}\" alanı seçildi.",
"account_edit.field_reorder_modal.handle_label": "\"{item}\" alanını sürükle",
"account_edit.field_reorder_modal.title": "Alanları yeniden düzenle",
"account_edit.image_alt_modal.add_title": "Alternatif metin ekle",
"account_edit.image_alt_modal.details_content": "Yapılması gerekenler: <ul><li>Kendinizi resimdeki gibi tanımlayın</li><li>Üçüncü şahıs zamirleri kullanın (ör. “ben” yerine “Alex”)</li><li>Kısa ve öz olun genellikle birkaç kelime yeterlidir</li></ul>Yapılmaması gerekenler:<ul><li>“Fotoğrafında” ifadesiyle başlamayın bu, ekran okuyucular için gereksizdir</li></ul>Örnek:<ul><li>\"Yeşil gömlek ve gözlük takan Alex</li></ul>",
"account_edit.image_alt_modal.details_title": "İpuçları: Profil fotoğrafları için alternatif metinler",
"account_edit.image_alt_modal.edit_title": "Alternatif metni düzenle",
"account_edit.image_alt_modal.text_hint": "Alternatif metin ekran okuyucu kullanan kullanıcıların içeriği anlamasına yardımcı olur.",
"account_edit.image_alt_modal.text_label": "Alternatif metin",
"account_edit.image_delete_modal.confirm": "Bu görseli silmek istediğinize emin misiniz? Bu işlem geri alınamaz.",
"account_edit.image_delete_modal.delete_button": "Sil",
"account_edit.image_delete_modal.title": "Resim silinsin mi?",
"account_edit.image_edit.add_button": "Görsel ekle",
"account_edit.image_edit.alt_add_button": "Alternatif metin ekle",
"account_edit.image_edit.alt_edit_button": "Alternatif metni düzenle",

View File

@@ -184,6 +184,15 @@
"account_edit.field_reorder_modal.drag_start": "Đã chọn trường \"{item}\".",
"account_edit.field_reorder_modal.handle_label": "Kéo trường \"{item}\"",
"account_edit.field_reorder_modal.title": "Sắp xếp lại trường",
"account_edit.image_alt_modal.add_title": "Thêm văn bản thay thế",
"account_edit.image_alt_modal.details_content": "NÊN: <ul> <li>Mô tả bản thân bạn trong hình</li> <li>Dùng ngôn ngữ góc nhìn thứ ba (ví dụ “Alex” thay vì “tôi”)</li> <li>Súc tích một vài từ là đủ</li> </ul> KHÔNG NÊN: <ul> <li>Bắt đầu bằng “Hình ảnh của” điều này là thừa đối với trình đọc màn hình.</li> </ul> VÍ DỤ: <ul> <li>“Alex mặc áo xanh và đeo kính”</li> </ul>",
"account_edit.image_alt_modal.details_title": "Gợi ý: Văn bản thay thế của ảnh đại diện",
"account_edit.image_alt_modal.edit_title": "Sửa văn bản thay thế",
"account_edit.image_alt_modal.text_hint": "Văn bản thay thế giúp người dùng phần mềm đọc màn hình hiểu được nội dung của bạn.",
"account_edit.image_alt_modal.text_label": "Văn bản thay thế",
"account_edit.image_delete_modal.confirm": "Bạn có chắc chắn muốn xóa hình ảnh này? Hành động này không thể hoàn tác.",
"account_edit.image_delete_modal.delete_button": "Xóa",
"account_edit.image_delete_modal.title": "Xóa hình ảnh?",
"account_edit.image_edit.add_button": "Thêm ảnh",
"account_edit.image_edit.alt_add_button": "Thêm văn bản thay thế",
"account_edit.image_edit.alt_edit_button": "Sửa văn bản thay thế",

View File

@@ -186,7 +186,7 @@
"account_edit.field_reorder_modal.title": "重新排列字段",
"account_edit.image_alt_modal.add_title": "添加替代文本",
"account_edit.image_alt_modal.details_content": "建议这么做:<ul> <li>根据图片内容描述你自己的样子</li> <li>文本使用第三人称例如称呼自己为“Alex”而不是“我”</li> <li>保持简洁:通常只需要简单描述一下</li> </ul> 不建议这么做:<ul> <li>以“……的图片”开头或结尾:屏幕阅读器自己会说这是图片</li> </ul> 示例:<ul> <li>“穿绿色衬衫戴着眼镜的Alex”</li> </ul>",
"account_edit.image_alt_modal.details_title": "小贴士:为头像添加替代文本",
"account_edit.image_alt_modal.details_title": "小贴士:为头像添加替代文本的注意事项",
"account_edit.image_alt_modal.edit_title": "编辑替代文本",
"account_edit.image_alt_modal.text_hint": "替代文本可以帮助使用屏幕阅读器的用户理解你的内容。",
"account_edit.image_alt_modal.text_label": "替代文本",

View File

@@ -1 +1,24 @@
@use 'common';
@use 'mastodon/variables';
@use 'mastodon/mixins';
@use 'fonts/roboto';
@use 'fonts/roboto-mono';
@use 'mastodon/reset';
@use 'mastodon/theme';
@use 'mastodon/basics';
@use 'mastodon/branding';
@use 'mastodon/containers';
@use 'mastodon/lists';
@use 'mastodon/widgets';
@use 'mastodon/forms';
@use 'mastodon/accounts';
@use 'mastodon/components';
@use 'mastodon/polls';
@use 'mastodon/modal';
@use 'mastodon/emoji_picker';
@use 'mastodon/about';
@use 'mastodon/tables';
@use 'mastodon/admin';
@use 'mastodon/dashboard';
@use 'mastodon/rtl';
@use 'mastodon/rich_text';

View File

@@ -1,24 +0,0 @@
@use 'mastodon/variables';
@use 'mastodon/mixins';
@use 'fonts/roboto';
@use 'fonts/roboto-mono';
@use 'mastodon/reset';
@use 'mastodon/theme';
@use 'mastodon/basics';
@use 'mastodon/branding';
@use 'mastodon/containers';
@use 'mastodon/lists';
@use 'mastodon/widgets';
@use 'mastodon/forms';
@use 'mastodon/accounts';
@use 'mastodon/components';
@use 'mastodon/polls';
@use 'mastodon/modal';
@use 'mastodon/emoji_picker';
@use 'mastodon/about';
@use 'mastodon/tables';
@use 'mastodon/admin';
@use 'mastodon/dashboard';
@use 'mastodon/rtl';
@use 'mastodon/rich_text';

View File

@@ -142,7 +142,7 @@ class FeedManager
def unpush_from_direct(account, status, update: false)
return false unless remove_from_feed(:direct, account.id, status)
redis.publish("timeline:direct:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s)) unless update
redis.publish("timeline:direct:#{account.id}", { event: :delete, payload: status.id.to_s }.to_json) unless update
true
end

View File

@@ -2,15 +2,20 @@
class Form::Redirect
include ActiveModel::Model
include ActiveModel::Attributes
include ActiveModel::Attributes::Normalization
attr_accessor :account, :target_account, :current_password,
:current_username
attr_accessor :account, :target_account, :current_password
attr_reader :acct
attribute :acct, :string
attribute :current_username, :string
validates :acct, presence: true, domain: { acct: true }
validate :validate_target_account
normalizes :acct, with: ->(value) { value.to_s.strip.gsub(/\A@/, '') }, apply_to_nil: true
normalizes :current_username, with: ->(value) { value.strip.delete_prefix('@') }
def valid_with_challenge?(current_user)
if current_user.encrypted_password.present?
errors.add(:current_password, :invalid) unless current_user.valid_password?(current_password)
@@ -24,10 +29,6 @@ class Form::Redirect
valid?
end
def acct=(val)
@acct = val.to_s.strip.gsub(/\A@/, '')
end
private
def set_target_account

View File

@@ -25,13 +25,11 @@ class BackupService < BaseService
skeleton[:orderedItems] = ['!PLACEHOLDER!']
skeleton = JSON.generate(skeleton)
prepend, append = skeleton.split('"!PLACEHOLDER!"')
add_comma = false
file.write(prepend)
account.statuses.with_includes.reorder(nil).find_in_batches do |statuses|
file.write(',') if add_comma
add_comma = true
account.statuses.with_includes.reorder(nil).find_in_batches.with_index do |statuses, batch|
file.write(',') unless batch.zero?
file.write(statuses.map do |status|
serializer = status.reblog? ? ActivityPub::AnnounceNoteSerializer : ActivityPub::CreateNoteSerializer
@@ -124,11 +122,8 @@ class BackupService < BaseService
zipfile.get_output_stream('likes.json') do |io|
io.write(prepend)
add_comma = false
Status.reorder(nil).joins(:favourites).includes(:account).merge(account.favourites).find_in_batches do |statuses|
io.write(',') if add_comma
add_comma = true
Status.reorder(nil).joins(:favourites).includes(:account).merge(account.favourites).find_in_batches.with_index do |statuses, batch|
io.write(',') unless batch.zero?
io.write(statuses.map do |status|
JSON.generate(ActivityPub::TagManager.instance.uri_for(status))
@@ -151,10 +146,8 @@ class BackupService < BaseService
zipfile.get_output_stream('bookmarks.json') do |io|
io.write(prepend)
add_comma = false
Status.reorder(nil).joins(:bookmarks).includes(:account).merge(account.bookmarks).find_in_batches do |statuses|
io.write(',') if add_comma
add_comma = true
Status.reorder(nil).joins(:bookmarks).includes(:account).merge(account.bookmarks).find_in_batches.with_index do |statuses, batch|
io.write(',') unless batch.zero?
io.write(statuses.map do |status|
JSON.generate(ActivityPub::TagManager.instance.uri_for(status))

View File

@@ -1,3 +0,0 @@
# frozen_string_literal: true
Oj.default_options = { mode: :compat, time_format: :ruby, use_to_json: true }

View File

@@ -1321,6 +1321,7 @@ be:
progress:
confirm: Пацвердзіць email
details: Вашы даныя
list: Прагрэс рэгістрацыі
review: Наш водгук
rules: Прыняць правілы
providers:

View File

@@ -1279,6 +1279,7 @@ da:
progress:
confirm: Bekræft e-mail
details: Dine detaljer
list: Status for tilmelding
review: Vores gennemgang
rules: Acceptér regler
providers:

View File

@@ -779,7 +779,7 @@ de:
delete_user_data: Kontodaten löschen
delete_user_data_description: Daten anderer Profile ohne Verzögerung löschen
invite_users: Einladungen
invite_users_description: Erlaubt bereits registrierten Benutzer*innen, neue Leute zum Server einzuladen
invite_users_description: Neue Benutzer*innen zur Registrierung auf diesem Server einladen
manage_announcements: Ankündigungen
manage_announcements_description: Ankündigungen dieses Servers verwalten
manage_appeals: Einsprüche
@@ -805,7 +805,7 @@ de:
manage_user_access: Kontozugriff
manage_user_access_description: Zwei-Faktor-Authentisierungen anderer können deaktiviert, E-Mail-Adressen geändert und Passwörter zurückgesetzt werden
manage_users: Konten
manage_users_description: Erlaubt es Benutzer*innen, die Details anderer Profile einzusehen und diese Accounts zu moderieren
manage_users_description: Details anderer Profile einsehen und Moderation von Konten
manage_webhooks: Webhooks
manage_webhooks_description: Webhooks für administrative Vorgänge einrichten
view_audit_log: Protokoll anzeigen
@@ -814,7 +814,7 @@ de:
view_dashboard_description: Dashboard und verschiedene Metriken
view_devops: DevOps
view_devops_description: Auf Sidekiq- und pgHero-Dashboards zugreifen
view_feeds: Live-Feeds und Hashtags anzeigen
view_feeds: Live-Feeds und Hashtags
view_feeds_description: Zugriff auf Live-Feeds und Hashtags unabhängig der Servereinstellungen
requires_2fa: Zwei-Faktor-Authentisierung erforderlich
title: Rollen
@@ -1279,6 +1279,7 @@ de:
progress:
confirm: E-Mail bestätigen
details: Deine Daten
list: Registrierungsfortschritt
review: Unsere Überprüfung
rules: Serverregeln akzeptieren
providers:

View File

@@ -125,7 +125,7 @@ de:
accounts: Konten
admin/accounts: Kontenverwaltung
admin/all: Alle administrativen Funktionen
admin/reports: Meldungen verwalten
admin/reports: Meldungen
all: Voller Zugriff auf dein Mastodon-Konto
blocks: Blockierungen
bookmarks: Lesezeichen

View File

@@ -14,7 +14,7 @@ el:
other: Ακόλουθοι
following:
one: Ακολουθεί
other: Ακολουθούν
other: Ακολουθεί
instance_actor_flash: Αυτός ο λογαριασμός είναι εικονικός και χρησιμοποιείται για να αντιπροσωπεύει τον ίδιο τον διακομιστή και όχι κάποιον μεμονωμένο χρήστη. Χρησιμοποιείται για σκοπούς ομοσπονδίας και δεν πρέπει να ανασταλεί.
last_active: τελευταία ενεργός/ή
link_verified_on: Η ιδιοκτησία αυτού του συνδέσμου ελέγχθηκε στις %{date}
@@ -1279,6 +1279,7 @@ el:
progress:
confirm: Επιβεβαίωση email
details: Τα στοιχεία σας
list: Πρόοδος εγγραφής
review: Η αξιολόγησή μας
rules: Αποδοχή κανόνων
providers:
@@ -1601,7 +1602,7 @@ el:
blocking: Λίστα αποκλεισμού
bookmarks: Σελιδοδείκτες
domain_blocking: Λίστα αποκλεισμένων τομέων
following: Λίστα ατόμων που ακολουθείτε
following: Λίστα λογαριασμών που ακολουθείτε
lists: Λίστες
muting: Λίστα αποσιωπήσεων
upload: Μεταφόρτωση

View File

@@ -1279,7 +1279,6 @@ en-GB:
progress:
confirm: Confirm email
details: Your details
list: Sign up progress
review: Our review
rules: Accept rules
providers:

View File

@@ -1279,6 +1279,7 @@ es-AR:
progress:
confirm: Confirmar correo electrónico
details: Tus detalles
list: Proceso de registro
review: Nuestra reseña
rules: Aceptar reglas
providers:

View File

@@ -1279,6 +1279,7 @@ es-MX:
progress:
confirm: Confirmar dirección de correo
details: Tus detalles
list: Registrar el progreso
review: Nuestra revisión
rules: Aceptar reglas
providers:

View File

@@ -1279,6 +1279,7 @@ fi:
progress:
confirm: Vahvista sähköpostiosoite
details: Omat tietosi
list: Rekisteröitymisprosessi
review: Arviomme
rules: Hyväksy säännöt
providers:

View File

@@ -1279,6 +1279,7 @@ gl:
progress:
confirm: Confirmar correo
details: Detalles
list: Progreso da creación da conta
review: A nosa revisión
rules: Aceptar regras
providers:

View File

@@ -1321,6 +1321,7 @@ he:
progress:
confirm: אימות כתובת הדואל
details: הפרטים שלך
list: התקדמות תהליך ההרשמה
review: הבדיקה שלנו
rules: הסכמה לתקנות
providers:

View File

@@ -1283,6 +1283,7 @@ is:
progress:
confirm: Staðfesta tölvupóstfang
details: Nánari upplýsingar þínar
list: Nýskráningarferli
review: Yfirferð okkar
rules: Samþykkja reglur
providers:

View File

@@ -1279,6 +1279,7 @@ it:
progress:
confirm: Conferma l'e-mail
details: I tuoi dettagli
list: Stato della registrazione
review: La nostra revisione
rules: Accetta le regole
providers:

View File

@@ -1279,6 +1279,7 @@ nl:
progress:
confirm: E-mailadres bevestigen
details: Jouw gegevens
list: Voortgang aanmelding
review: Onze beoordeling
rules: Regels accepteren
providers:

View File

@@ -1268,6 +1268,7 @@ sq:
progress:
confirm: Ripohoni email-in
details: Hollësitë tuaja
list: Ecuri regjistrimi
review: Shqyrtimi ynë
rules: Pranoni rregulla
providers:

View File

@@ -1279,6 +1279,7 @@ tr:
progress:
confirm: E-postanızı onaylayın
details: Ayrıntılarınız
list: Kayıt ilerlemesi
review: İncelememiz
rules: Kabul kuralları
providers:

View File

@@ -1258,6 +1258,7 @@ vi:
progress:
confirm: Xác nhận email
details: Điền thông tin
list: Quy trình đăng ký
review: Đợi duyệt
rules: Đọc nội quy
providers:

View File

@@ -1258,6 +1258,7 @@ zh-CN:
progress:
confirm: 确认邮箱
details: 你的详细信息
list: 注册流程
review: 我们的审核
rules: 接受规则
providers:

View File

@@ -1260,6 +1260,7 @@ zh-TW:
progress:
confirm: 驗證電子郵件地址
details: 您的個人資料
list: 註冊流程
review: 我們的審核
rules: 接受規則
providers:

View File

@@ -8,7 +8,7 @@ class GlitchMigrateUserSkin < ActiveRecord::Migration[8.0]
def up
User.where.not(settings: nil).find_each do |user|
settings = Oj.load(user.attributes_before_type_cast['settings'])
settings = JSON.parse(user.attributes_before_type_cast['settings'])
next if settings.nil? || settings['skin'].blank? || %w(system default mastodon-light contrast).exclude?(settings['skin'])
case settings['skin']
@@ -25,7 +25,7 @@ class GlitchMigrateUserSkin < ActiveRecord::Migration[8.0]
settings['skin'] = 'default'
user.update_column('settings', Oj.dump(settings))
user.update_column('settings', JSON.generate(settings))
end
end
end

View File

@@ -29,4 +29,11 @@ RSpec.describe Form::Redirect do
end
end
end
describe 'Normalizations' do
it { is_expected.to normalize(:acct).from(nil).to('') }
it { is_expected.to normalize(:acct).from(' @username ').to('username') }
it { is_expected.to normalize(:current_username).from(' @username ').to('username') }
end
end

View File

@@ -10,7 +10,9 @@ RSpec.describe BackupService do
let!(:status) { Fabricate(:status, account: user.account, text: 'Hello', visibility: :public, media_attachments: [attachment]) }
let!(:private_status) { Fabricate(:status, account: user.account, text: 'secret', visibility: :private) }
let!(:favourite) { Fabricate(:favourite, account: user.account) }
let!(:more_favourite) { Fabricate(:favourite, account: user.account) }
let!(:bookmark) { Fabricate(:bookmark, account: user.account) }
let!(:more_bookmark) { Fabricate(:bookmark, account: user.account) }
let!(:backup) { Fabricate(:backup, user: user) }
def read_zip_file(backup, filename)
@@ -71,21 +73,27 @@ RSpec.describe BackupService do
end
def expect_likes_export
json = export_json(:likes)
aggregate_failures do
expect(json['type']).to eq 'OrderedCollection'
expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(favourite.status)]
end
expect(export_json(:likes).deep_symbolize_keys)
.to include(
id: 'likes.json',
type: 'OrderedCollection',
orderedItems: contain_exactly(
ActivityPub::TagManager.instance.uri_for(favourite.status),
ActivityPub::TagManager.instance.uri_for(more_favourite.status)
)
)
end
def expect_bookmarks_export
json = export_json(:bookmarks)
aggregate_failures do
expect(json['type']).to eq 'OrderedCollection'
expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(bookmark.status)]
end
expect(export_json(:bookmarks).deep_symbolize_keys)
.to include(
id: 'bookmarks.json',
type: 'OrderedCollection',
orderedItems: contain_exactly(
ActivityPub::TagManager.instance.uri_for(bookmark.status),
ActivityPub::TagManager.instance.uri_for(more_bookmark.status)
)
)
end
def export_json_raw(type)

View File

@@ -32,6 +32,19 @@ RSpec.describe 'Settings Migration Redirects' do
.to have_content(I18n.t('migrations.cancelled_msg'))
end
context 'when user has blank encrypted password' do
before { user.update! encrypted_password: '' }
it 'saves a redirect via username confirmation' do
visit new_settings_migration_redirect_path
fill_in 'form_redirect_acct', with: 'new@example.host'
fill_in 'form_redirect_current_username', with: " @#{user.account.username} "
expect { click_on I18n.t('migrations.set_redirect') }
.to(change { user.reload.account.moved_to_account_id }.from(nil))
end
end
private
def stub_resolver