Merge branch 'main' into develop

This commit is contained in:
CMK 2022-04-22 17:49:28 +08:00
commit 2ddd4354ef
108 changed files with 1361 additions and 816 deletions

View File

@ -17,6 +17,6 @@
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.3.1</string> <string>1.3.1</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>110</string> <string>113</string>
</dict> </dict>
</plist> </plist>

View File

@ -1,51 +1,51 @@
"16wxgf" = "Post on Mastodon"; "16wxgf" = "Pubblica su Mastodon";
"751xkl" = "Text Content"; "751xkl" = "Contenuto testuale";
"CsR7G2" = "Post on Mastodon"; "CsR7G2" = "Pubblica su Mastodon";
"HZSGTr" = "What content to post?"; "HZSGTr" = "Quale contenuto postare?";
"HdGikU" = "Posting failed"; "HdGikU" = "Pubblicazione non riuscita";
"KDNTJ4" = "Failure Reason"; "KDNTJ4" = "Motivo del fallimento";
"RHxKOw" = "Send Post with text content"; "RHxKOw" = "Invia post con contenuto testuale";
"RxSqsb" = "Post"; "RxSqsb" = "Pubblica";
"WCIR3D" = "Post ${content} on Mastodon"; "WCIR3D" = "Pubblica ${content} su Mastodon";
"ZKJSNu" = "Post"; "ZKJSNu" = "Pubblica";
"ZS1XaK" = "${content}"; "ZS1XaK" = "${content}";
"ZbSjzC" = "Visibility"; "ZbSjzC" = "Visibilità";
"Zo4jgJ" = "Post Visibility"; "Zo4jgJ" = "Visibilità del post";
"apSxMG-dYQ5NN" = "There are ${count} options matching Public."; "apSxMG-dYQ5NN" = "Ci sono ${count} opzioni corrispondenti a 'Pubblico'.";
"apSxMG-ehFLjY" = "There are ${count} options matching Followers Only."; "apSxMG-ehFLjY" = "Ci sono ${count} opzioni corrispondenti a Solo Seguaci.";
"ayoYEb-dYQ5NN" = "${content}, Public"; "ayoYEb-dYQ5NN" = "${content}, Pubblico";
"ayoYEb-ehFLjY" = "${content}, Followers Only"; "ayoYEb-ehFLjY" = "${content}, Solo seguaci";
"dUyuGg" = "Post on Mastodon"; "dUyuGg" = "Pubblica su Mastodon";
"dYQ5NN" = "Public"; "dYQ5NN" = "Pubblico";
"ehFLjY" = "Followers Only"; "ehFLjY" = "Solo i seguaci";
"gfePDu" = "Posting failed. ${failureReason}"; "gfePDu" = "Pubblicazione fallita. ${failureReason}";
"k7dbKQ" = "Post was sent successfully."; "k7dbKQ" = "Post inviato con successo.";
"oGiqmY-dYQ5NN" = "Just to confirm, you wanted Public?"; "oGiqmY-dYQ5NN" = "Solo per confermare, volevi Pubblico?";
"oGiqmY-ehFLjY" = "Just to confirm, you wanted Followers Only?"; "oGiqmY-ehFLjY" = "Solo per confermare, volevi 'Solo seguaci'?";
"rM6dvp" = "URL"; "rM6dvp" = "URL";
"ryJLwG" = "Post was sent successfully. "; "ryJLwG" = "Post inviato con successo. ";

View File

@ -5,7 +5,7 @@
<key>There are ${count} options matching ${content}. - 2</key> <key>There are ${count} options matching ${content}. - 2</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${content}.</string> <string>Ci sono %#@count_option@ corrispondenti a «${content}».</string>
<key>count_option</key> <key>count_option</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -13,15 +13,15 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>%ld</string> <string>%ld</string>
<key>one</key> <key>one</key>
<string>1 option</string> <string>1 opzione</string>
<key>other</key> <key>other</key>
<string>%ld options</string> <string>%ld opzioni</string>
</dict> </dict>
</dict> </dict>
<key>There are ${count} options matching ${visibility}.</key> <key>There are ${count} options matching ${visibility}.</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${visibility}.</string> <string>Ci sono %#@count_option@ corrispondenti a «${visibility}».</string>
<key>count_option</key> <key>count_option</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -29,9 +29,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>%ld</string> <string>%ld</string>
<key>one</key> <key>one</key>
<string>1 option</string> <string>1 opzione</string>
<key>other</key> <key>other</key>
<string>%ld options</string> <string>%ld opzioni</string>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -471,15 +471,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ سنة</string> <string>مُنذُ %ldع</string>
<key>two</key> <key>two</key>
<string>مُنذُ سنتين</string> <string>مُنذُ %ldع</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld سنين</string> <string>مُنذُ %ldع</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld سنةً</string> <string>مُنذُ %ldع</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld سنة</string> <string>مُنذُ %ldع</string>
</dict> </dict>
</dict> </dict>
<key>date.month.ago.abbr</key> <key>date.month.ago.abbr</key>
@ -495,15 +495,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ شهر</string> <string>مُنذُ %ldش</string>
<key>two</key> <key>two</key>
<string>مُنذُ شهرين</string> <string>مُنذُ %ldش</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld أشهُر</string> <string>مُنذُ %ldش</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld شهرًا</string> <string>مُنذُ %ldش</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld شهر</string> <string>مُنذُ %ldش</string>
</dict> </dict>
</dict> </dict>
<key>date.day.ago.abbr</key> <key>date.day.ago.abbr</key>
@ -519,15 +519,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ يوم</string> <string>مُنذُ %ldي</string>
<key>two</key> <key>two</key>
<string>مُنذُ يومين</string> <string>مُنذُ %ldي</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld أيام</string> <string>مُنذُ %ldي</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld يومًا</string> <string>مُنذُ %ldي</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld يوم</string> <string>مُنذُ %ldي</string>
</dict> </dict>
</dict> </dict>
<key>date.hour.ago.abbr</key> <key>date.hour.ago.abbr</key>
@ -543,15 +543,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ ساعة</string> <string>مُنذُ %ldس</string>
<key>two</key> <key>two</key>
<string>مُنذُ ساعتين</string> <string>مُنذُ %ldس</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld ساعات</string> <string>مُنذُ %ldس</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld ساعةًَ</string> <string>مُنذُ %ldس</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld ساعة</string> <string>مُنذُ %ldس</string>
</dict> </dict>
</dict> </dict>
<key>date.minute.ago.abbr</key> <key>date.minute.ago.abbr</key>
@ -567,15 +567,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ دقيقة</string> <string>مُنذُ %ldد</string>
<key>two</key> <key>two</key>
<string>مُنذُ دقيقتان</string> <string>مُنذُ %ldد</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld دقائق</string> <string>مُنذُ %ldد</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld دقيقةً</string> <string>مُنذُ %ldد</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld دقيقة</string> <string>مُنذُ %ldد</string>
</dict> </dict>
</dict> </dict>
<key>date.second.ago.abbr</key> <key>date.second.ago.abbr</key>
@ -591,15 +591,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ ثانية</string> <string>مُنذُ %ldث</string>
<key>two</key> <key>two</key>
<string>مُنذُ ثانيتين</string> <string>مُنذُ %ldث</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld ثوان</string> <string>مُنذُ %ldث</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld ثانية</string> <string>مُنذُ %ldث</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld ثانية</string> <string>مُنذُ %ldث</string>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -492,6 +492,14 @@
"clear": "مَحو" "clear": "مَحو"
} }
}, },
"discovery": {
"tabs": {
"posts": "المنشورات",
"hashtags": "الوسوم",
"news": "الأخبار",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "مُفضَّلَتُك" "title": "مُفضَّلَتُك"
}, },

View File

@ -41,11 +41,11 @@
"block_entire_domain": "Bloquejar Domini" "block_entire_domain": "Bloquejar Domini"
}, },
"save_photo_failure": { "save_photo_failure": {
"title": "Desa l'Error de la Foto", "title": "Error al Desar la Foto",
"message": "Activa el permís d'accés a la biblioteca de fotos per desar-la." "message": "Activa el permís d'accés a la biblioteca de fotos per desar-la."
}, },
"delete_post": { "delete_post": {
"title": "Estàs segur que vols suprimir aquesta publicació?", "title": "Esborrar Publicació",
"message": "Estàs segur que vols suprimir aquesta publicació?" "message": "Estàs segur que vols suprimir aquesta publicació?"
}, },
"clean_cache": { "clean_cache": {
@ -83,7 +83,7 @@
"share_post": "Compartir Publicació", "share_post": "Compartir Publicació",
"open_in_safari": "Obrir a Safari", "open_in_safari": "Obrir a Safari",
"open_in_browser": "Obre al navegador", "open_in_browser": "Obre al navegador",
"find_people": "Busca persones per seguir", "find_people": "Busca persones a seguir",
"manually_search": "Cerca manualment a canvi", "manually_search": "Cerca manualment a canvi",
"skip": "Omet", "skip": "Omet",
"reply": "Respon", "reply": "Respon",
@ -110,26 +110,26 @@
"previous_status": "Publicació anterior", "previous_status": "Publicació anterior",
"next_status": "Publicació següent", "next_status": "Publicació següent",
"open_status": "Obre la publicació", "open_status": "Obre la publicació",
"open_author_profile": "Obre el perfil de l'autor", "open_author_profile": "Obre el Perfil de l'Autor",
"open_reblogger_profile": "Obre el perfil del impulsor", "open_reblogger_profile": "Obre el Perfil del Impulsor",
"reply_status": "Respon a la publicació", "reply_status": "Respon a la Publicació",
"toggle_reblog": "Commuta l'impuls de la publicació", "toggle_reblog": "Commuta l'Impuls de la Publicació",
"toggle_favorite": "Commuta el Favorit de la publicació", "toggle_favorite": "Commuta el Favorit de la Publicació",
"toggle_content_warning": "Commuta l'Avís de Contingut", "toggle_content_warning": "Commuta l'Avís de Contingut",
"preview_image": "Vista prèvia de l'Imatge" "preview_image": "Vista prèvia de l'Imatge"
}, },
"segmented_control": { "segmented_control": {
"previous_section": "Secció anterior", "previous_section": "Secció Anterior",
"next_section": "Secció següent" "next_section": "Secció Següent"
} }
}, },
"status": { "status": {
"user_reblogged": "%s ha impulsat", "user_reblogged": "%s ha impulsat",
"user_replied_to": "Ha respòs a %s", "user_replied_to": "Ha respòs a %s",
"show_post": "Mostra la publicació", "show_post": "Mostra la Publicació",
"show_user_profile": "Mostra el perfil de l'usuari", "show_user_profile": "Mostra el perfil de l'usuari",
"content_warning": "Advertència de Contingut", "content_warning": "Advertència de Contingut",
"media_content_warning": "Toca qualsevol lloc per mostrar", "media_content_warning": "Toca qualsevol lloc per a mostrar",
"tap_to_reveal": "Toca per a mostrar", "tap_to_reveal": "Toca per a mostrar",
"poll": { "poll": {
"vote": "Vota", "vote": "Vota",
@ -187,15 +187,15 @@
"now": "Ara" "now": "Ara"
}, },
"loader": { "loader": {
"load_missing_posts": "Carrega les publicacions que falten", "load_missing_posts": "Carrega les publicacions faltants",
"loading_missing_posts": "Carregant les publicacions que falten...", "loading_missing_posts": "Carregant les publicacions faltants...",
"show_more_replies": "Mostra més respostes" "show_more_replies": "Mostra més respostes"
}, },
"header": { "header": {
"no_status_found": "No s'ha trobat cap publicació", "no_status_found": "No s'ha trobat cap publicació",
"blocking_warning": "No pots veure el perfil d'aquest usuari\n fins que el desbloquegis.\nEl teu perfil els sembla així.", "blocking_warning": "No pots veure el perfil d'aquest usuari\n fins que el desbloquegis.\nEl teu perfil els sembla així.",
"user_blocking_warning": "No pots veure el perfil de %s\n fins que el desbloquegis.\nEl teu perfil els sembla així.", "user_blocking_warning": "No pots veure el perfil de %s\n fins que el desbloquegis.\nEl teu perfil els sembla així.",
"blocked_warning": "No pots veure el perfil d'aquest usuari\n fins que et desbloquegi.", "blocked_warning": "No pots veure el perfil d'aquest usuari\nfins que et desbloquegi.",
"user_blocked_warning": "No pots veure el perfil de %s\n fins que et desbloquegi.", "user_blocked_warning": "No pots veure el perfil de %s\n fins que et desbloquegi.",
"suspended_warning": "Aquest usuari ha estat suspès.", "suspended_warning": "Aquest usuari ha estat suspès.",
"user_suspended_warning": "El compte de %s ha estat suspès." "user_suspended_warning": "El compte de %s ha estat suspès."
@ -210,7 +210,7 @@
"log_in": "Inicia sessió" "log_in": "Inicia sessió"
}, },
"server_picker": { "server_picker": {
"title": "Tria un servidor,\nqualsevol servidor.", "title": "Mastodon està fet d'usuaris en diferents comunitats.",
"subtitle": "Tria una comunitat segons els teus interessos, regió o una de propòsit general.", "subtitle": "Tria una comunitat segons els teus interessos, regió o una de propòsit general.",
"subtitle_extend": "Tria una comunitat segons els teus interessos, regió o una de propòsit general. Cada comunitat és operada per una organització totalment independent o individualment.", "subtitle_extend": "Tria una comunitat segons els teus interessos, regió o una de propòsit general. Cada comunitat és operada per una organització totalment independent o individualment.",
"button": { "button": {
@ -271,7 +271,7 @@
"checked": "verificat", "checked": "verificat",
"unchecked": "no verificat" "unchecked": "no verificat"
}, },
"hint": "La teva contrasenya ha de tenir com a mínim buit caràcters" "hint": "La teva contrasenya ha de tenir com a mínim vuit caràcters"
}, },
"invite": { "invite": {
"registration_user_invite_request": "Perquè vols unir-te?" "registration_user_invite_request": "Perquè vols unir-te?"
@ -299,7 +299,7 @@
"inclusion": "%s no és un valor suportat" "inclusion": "%s no és un valor suportat"
}, },
"special": { "special": {
"username_invalid": "El nom d'usuari només ha de contenir caràcters alfanumèrics i guions baixos", "username_invalid": "El nom d'usuari ha de contenir només caràcters alfanumèrics i guions baixos",
"username_too_long": "El nom d'usuari és massa llarg (no pot ser més llarg de 30 caràcters)", "username_too_long": "El nom d'usuari és massa llarg (no pot ser més llarg de 30 caràcters)",
"email_invalid": "Aquesta no és una adreça de correu electrònic vàlida", "email_invalid": "Aquesta no és una adreça de correu electrònic vàlida",
"password_too_short": "La contrasenya és massa curta (ha de tenir 8 caràcters com a mínim)" "password_too_short": "La contrasenya és massa curta (ha de tenir 8 caràcters com a mínim)"
@ -318,7 +318,7 @@
}, },
"confirm_email": { "confirm_email": {
"title": "Una última cosa.", "title": "Una última cosa.",
"subtitle": "Acabem d'enviar un correu electrònic a %s,\ntoca l'enllaç per a confirmar el teu compte.", "subtitle": "Toca l'enllaç del correu electrònic que t'hem enviat per a confirmar el teu compte.",
"button": { "button": {
"open_email_app": "Obre l'aplicació de correu", "open_email_app": "Obre l'aplicació de correu",
"resend": "Reenvia" "resend": "Reenvia"
@ -492,6 +492,14 @@
"clear": "Neteja" "clear": "Neteja"
} }
}, },
"discovery": {
"tabs": {
"posts": "Publicacions",
"hashtags": "Etiquetes",
"news": "Notícies",
"for_you": "Per a tu"
}
},
"favorite": { "favorite": {
"title": "Els teus Favorits" "title": "Els teus Favorits"
}, },
@ -543,7 +551,7 @@
"anyone": "algú", "anyone": "algú",
"follower": "un seguidor", "follower": "un seguidor",
"follow": "a qualsevol que segueixi", "follow": "a qualsevol que segueixi",
"noone": "algú", "noone": "ningú",
"title": "Notifica'm quan" "title": "Notifica'm quan"
} }
}, },

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>1 Antwort</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld Antworten</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -130,7 +130,7 @@
"show_user_profile": "Benutzerprofil anzeigen", "show_user_profile": "Benutzerprofil anzeigen",
"content_warning": "Inhaltswarnung", "content_warning": "Inhaltswarnung",
"media_content_warning": "Tippe irgendwo zum Anzeigen", "media_content_warning": "Tippe irgendwo zum Anzeigen",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "Zum Anzeigen tippen",
"poll": { "poll": {
"vote": "Abstimmen", "vote": "Abstimmen",
"closed": "Beendet" "closed": "Beendet"
@ -143,10 +143,10 @@
"unfavorite": "Aus Favoriten entfernen", "unfavorite": "Aus Favoriten entfernen",
"menu": "Menü", "menu": "Menü",
"hide": "Verstecken", "hide": "Verstecken",
"show_image": "Show image", "show_image": "Bild anzeigen",
"show_gif": "Show GIF", "show_gif": "GIF anzeigen",
"show_video_player": "Show video player", "show_video_player": "Zeige Video-Player",
"tap_then_hold_to_show_menu": "Tap then hold to show menu" "tap_then_hold_to_show_menu": "Halte gedrückt um das Menü anzuzeigen"
}, },
"tag": { "tag": {
"url": "URL", "url": "URL",
@ -447,10 +447,10 @@
} }
}, },
"accessibility": { "accessibility": {
"show_avatar_image": "Show avatar image", "show_avatar_image": "Profilbild anzeigen",
"edit_avatar_image": "Edit avatar image", "edit_avatar_image": "Profilbild bearbeiten",
"show_banner_image": "Show banner image", "show_banner_image": "Bannerbild anzeigen",
"double_tap_to_open_the_list": "Double tap to open the list" "double_tap_to_open_the_list": "Doppeltippen, um die Liste zu öffnen"
} }
}, },
"follower": { "follower": {
@ -492,6 +492,14 @@
"clear": "Zurücksetzen" "clear": "Zurücksetzen"
} }
}, },
"discovery": {
"tabs": {
"posts": "Beiträge",
"hashtags": "Hashtags",
"news": "Nachrichten",
"for_you": "Für dich"
}
},
"favorite": { "favorite": {
"title": "Deine Favoriten" "title": "Deine Favoriten"
}, },
@ -553,7 +561,7 @@
"disable_avatar_animation": "Animierte Profilbilder deaktivieren", "disable_avatar_animation": "Animierte Profilbilder deaktivieren",
"disable_emoji_animation": "Animierte Emojis deaktivieren", "disable_emoji_animation": "Animierte Emojis deaktivieren",
"using_default_browser": "Standardbrowser zum Öffnen von Links verwenden", "using_default_browser": "Standardbrowser zum Öffnen von Links verwenden",
"open_links_in_mastodon": "Open links in Mastodon" "open_links_in_mastodon": "Links in Mastodon öffnen"
}, },
"boring_zone": { "boring_zone": {
"title": "Der langweilige Bereich", "title": "Der langweilige Bereich",

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -45,7 +45,7 @@
"message": "Por favor, habilitá el permiso de acceso a la biblioteca de fotos para guardar la imagen." "message": "Por favor, habilitá el permiso de acceso a la biblioteca de fotos para guardar la imagen."
}, },
"delete_post": { "delete_post": {
"title": "¿Estás seguro que querés eliminar este mensaje?", "title": "Eliminar mensaje",
"message": "¿Estás seguro que querés eliminar este mensaje?" "message": "¿Estás seguro que querés eliminar este mensaje?"
}, },
"clean_cache": { "clean_cache": {
@ -492,6 +492,14 @@
"clear": "Limpiar" "clear": "Limpiar"
} }
}, },
"discovery": {
"tabs": {
"posts": "Mensajes",
"hashtags": "Etiquetas",
"news": "Novedades",
"for_you": "Para vos"
}
},
"favorite": { "favorite": {
"title": "Tus favoritos" "title": "Tus favoritos"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Borrar" "clear": "Borrar"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Tus Favoritos" "title": "Tus Favoritos"
}, },

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>Erantzun bat</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld erantzun</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -130,7 +130,7 @@
"show_user_profile": "Erakutsi erabiltzailearen profila", "show_user_profile": "Erakutsi erabiltzailearen profila",
"content_warning": "Edukiaren abisua", "content_warning": "Edukiaren abisua",
"media_content_warning": "Ukitu edonon bistaratzeko", "media_content_warning": "Ukitu edonon bistaratzeko",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "Sakatu erakusteko",
"poll": { "poll": {
"vote": "Bozkatu", "vote": "Bozkatu",
"closed": "Itxita" "closed": "Itxita"
@ -143,10 +143,10 @@
"unfavorite": "Kendu gogokoa", "unfavorite": "Kendu gogokoa",
"menu": "Menua", "menu": "Menua",
"hide": "Ezkutatu", "hide": "Ezkutatu",
"show_image": "Show image", "show_image": "Erakutsi irudia",
"show_gif": "Show GIF", "show_gif": "Erakutsi GIFa",
"show_video_player": "Show video player", "show_video_player": "Erakutsi bideo-erreproduzigailua",
"tap_then_hold_to_show_menu": "Tap then hold to show menu" "tap_then_hold_to_show_menu": "Sakatu eta eutsi menua erakusteko"
}, },
"tag": { "tag": {
"url": "URLa", "url": "URLa",
@ -447,10 +447,10 @@
} }
}, },
"accessibility": { "accessibility": {
"show_avatar_image": "Show avatar image", "show_avatar_image": "Erakutsi abatarra",
"edit_avatar_image": "Edit avatar image", "edit_avatar_image": "Editatu abatarra",
"show_banner_image": "Show banner image", "show_banner_image": "Erakutsi banner irudia",
"double_tap_to_open_the_list": "Double tap to open the list" "double_tap_to_open_the_list": "Sakatu birritan zerrenda irekitzeko"
} }
}, },
"follower": { "follower": {
@ -492,6 +492,14 @@
"clear": "Garbitu" "clear": "Garbitu"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Zure gogokoak" "title": "Zure gogokoak"
}, },
@ -502,8 +510,8 @@
}, },
"notification_description": { "notification_description": {
"followed_you": "zu jarraitzen hasi da", "followed_you": "zu jarraitzen hasi da",
"favorited_your_post": "erabiltzaileak zure bidalketa gogoko du", "favorited_your_post": "(e)k zure bidalketa gogoko du",
"reblogged_your_post": "erabiltzaileak bultzada eman dio zure bidalketari", "reblogged_your_post": "(e)k bultzada eman dio zure bidalketari",
"mentioned_you": "erabiltzaileak aipatu zaitu", "mentioned_you": "erabiltzaileak aipatu zaitu",
"request_to_follow_you": "erabiltzaileak zu jarraitzea eskatu du", "request_to_follow_you": "erabiltzaileak zu jarraitzea eskatu du",
"poll_has_ended": "inkesta amaitu da" "poll_has_ended": "inkesta amaitu da"
@ -553,7 +561,7 @@
"disable_avatar_animation": "Desgaitu abatar animatuak", "disable_avatar_animation": "Desgaitu abatar animatuak",
"disable_emoji_animation": "Desgaitu emoji animatuak", "disable_emoji_animation": "Desgaitu emoji animatuak",
"using_default_browser": "Erabili nabigatzaile lehenetsia estekak irekitzeko", "using_default_browser": "Erabili nabigatzaile lehenetsia estekak irekitzeko",
"open_links_in_mastodon": "Open links in Mastodon" "open_links_in_mastodon": "Ireki estekak Mastodonen"
}, },
"boring_zone": { "boring_zone": {
"title": "Eremu aspergarria", "title": "Eremu aspergarria",

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>1 réponse</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld réponses</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -130,7 +130,7 @@
"show_user_profile": "Montrer le profil de lutilisateur·rice", "show_user_profile": "Montrer le profil de lutilisateur·rice",
"content_warning": "Avertissement de contenu", "content_warning": "Avertissement de contenu",
"media_content_warning": "Tapotez nimporte où pour révéler la publication", "media_content_warning": "Tapotez nimporte où pour révéler la publication",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "Appuyer pour afficher",
"poll": { "poll": {
"vote": "Voter", "vote": "Voter",
"closed": "Fermé" "closed": "Fermé"
@ -143,9 +143,9 @@
"unfavorite": "Retirer des favoris", "unfavorite": "Retirer des favoris",
"menu": "Menu", "menu": "Menu",
"hide": "Cacher", "hide": "Cacher",
"show_image": "Show image", "show_image": "Afficher limage",
"show_gif": "Show GIF", "show_gif": "Afficher le GIF",
"show_video_player": "Show video player", "show_video_player": "Afficher le lecteur vidéo",
"tap_then_hold_to_show_menu": "Tap then hold to show menu" "tap_then_hold_to_show_menu": "Tap then hold to show menu"
}, },
"tag": { "tag": {
@ -447,10 +447,10 @@
} }
}, },
"accessibility": { "accessibility": {
"show_avatar_image": "Show avatar image", "show_avatar_image": "Afficher lavatar",
"edit_avatar_image": "Edit avatar image", "edit_avatar_image": "Modifier lavatar",
"show_banner_image": "Show banner image", "show_banner_image": "Afficher limage de la bannière",
"double_tap_to_open_the_list": "Double tap to open the list" "double_tap_to_open_the_list": "Appuyer deux fois pour ouvrir la liste"
} }
}, },
"follower": { "follower": {
@ -492,6 +492,14 @@
"clear": "Effacer" "clear": "Effacer"
} }
}, },
"discovery": {
"tabs": {
"posts": "Messages",
"hashtags": "Hashtags",
"news": "Actualité",
"for_you": "Pour vous"
}
},
"favorite": { "favorite": {
"title": "Vos favoris" "title": "Vos favoris"
}, },
@ -553,7 +561,7 @@
"disable_avatar_animation": "Désactiver les avatars animés", "disable_avatar_animation": "Désactiver les avatars animés",
"disable_emoji_animation": "Désactiver les émojis animées", "disable_emoji_animation": "Désactiver les émojis animées",
"using_default_browser": "Utiliser le navigateur par défaut pour ouvrir les liens", "using_default_browser": "Utiliser le navigateur par défaut pour ouvrir les liens",
"open_links_in_mastodon": "Open links in Mastodon" "open_links_in_mastodon": "Ouvrir les liens dans Mastodon"
}, },
"boring_zone": { "boring_zone": {
"title": "La zone ennuyante", "title": "La zone ennuyante",

View File

@ -492,6 +492,14 @@
"clear": "Falamhaich" "clear": "Falamhaich"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Na h-annsachdan agad" "title": "Na h-annsachdan agad"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Hapus" "clear": "Hapus"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -95,7 +95,7 @@
<key>one</key> <key>one</key>
<string>1 preferito</string> <string>1 preferito</string>
<key>other</key> <key>other</key>
<string>%ld favorites</string> <string>%ld preferiti</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.reblog</key> <key>plural.count.reblog</key>
@ -189,9 +189,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 seguace</string> <string>1 following</string>
<key>other</key> <key>other</key>
<string>%ld following</string> <string>%ld stanno seguendo</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.follower</key> <key>plural.count.follower</key>
@ -205,9 +205,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 follower</string> <string>1 seguace</string>
<key>other</key> <key>other</key>
<string>%ld followers</string> <string>%ld seguaci</string>
</dict> </dict>
</dict> </dict>
<key>date.year.left</key> <key>date.year.left</key>
@ -221,9 +221,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 year left</string> <string>1 anno rimasto</string>
<key>other</key> <key>other</key>
<string>%ld years left</string> <string>%ld anni rimasti</string>
</dict> </dict>
</dict> </dict>
<key>date.month.left</key> <key>date.month.left</key>
@ -237,9 +237,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 months left</string> <string>1 mese rimasto</string>
<key>other</key> <key>other</key>
<string>%ld months left</string> <string>%ld mesi rimasti</string>
</dict> </dict>
</dict> </dict>
<key>date.day.left</key> <key>date.day.left</key>
@ -253,9 +253,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 day left</string> <string>1 giorno rimasto</string>
<key>other</key> <key>other</key>
<string>%ld days left</string> <string>%ld giorni rimasti</string>
</dict> </dict>
</dict> </dict>
<key>date.hour.left</key> <key>date.hour.left</key>
@ -269,9 +269,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 hour left</string> <string>1 ora rimasta</string>
<key>other</key> <key>other</key>
<string>%ld hours left</string> <string>%ld ore rimaste</string>
</dict> </dict>
</dict> </dict>
<key>date.minute.left</key> <key>date.minute.left</key>
@ -285,9 +285,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 minute left</string> <string>1 minuto rimasto</string>
<key>other</key> <key>other</key>
<string>%ld minutes left</string> <string>%ld minuti rimasti</string>
</dict> </dict>
</dict> </dict>
<key>date.second.left</key> <key>date.second.left</key>
@ -301,9 +301,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 second left</string> <string>1 secondo rimasto</string>
<key>other</key> <key>other</key>
<string>%ld seconds left</string> <string>%ld secondi rimasti</string>
</dict> </dict>
</dict> </dict>
<key>date.year.ago.abbr</key> <key>date.year.ago.abbr</key>
@ -317,9 +317,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1y ago</string> <string>1 anno fa</string>
<key>other</key> <key>other</key>
<string>%ldy ago</string> <string>%ld anni fa</string>
</dict> </dict>
</dict> </dict>
<key>date.month.ago.abbr</key> <key>date.month.ago.abbr</key>
@ -333,9 +333,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1M ago</string> <string>1 mese fa</string>
<key>other</key> <key>other</key>
<string>%ldM ago</string> <string>%ld mesi fa</string>
</dict> </dict>
</dict> </dict>
<key>date.day.ago.abbr</key> <key>date.day.ago.abbr</key>
@ -349,9 +349,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1d ago</string> <string>1 giorno fa</string>
<key>other</key> <key>other</key>
<string>%ldd ago</string> <string>%ld giorni fa</string>
</dict> </dict>
</dict> </dict>
<key>date.hour.ago.abbr</key> <key>date.hour.ago.abbr</key>
@ -365,9 +365,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1h ago</string> <string>1 ora fa</string>
<key>other</key> <key>other</key>
<string>%ldh ago</string> <string>%ld ore fa</string>
</dict> </dict>
</dict> </dict>
<key>date.minute.ago.abbr</key> <key>date.minute.ago.abbr</key>
@ -381,9 +381,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1m ago</string> <string>1 minuto fa</string>
<key>other</key> <key>other</key>
<string>%ldm ago</string> <string>%ld minuti fa</string>
</dict> </dict>
</dict> </dict>
<key>date.second.ago.abbr</key> <key>date.second.ago.abbr</key>
@ -397,9 +397,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1s ago</string> <string>1 secondo fa</string>
<key>other</key> <key>other</key>
<string>%lds ago</string> <string>%ld secondi fa</string>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -80,71 +80,71 @@
"preview": "Anteprima", "preview": "Anteprima",
"share": "Condividi", "share": "Condividi",
"share_user": "Condividi %s", "share_user": "Condividi %s",
"share_post": "Share Post", "share_post": "Condividi il post",
"open_in_safari": "Open in Safari", "open_in_safari": "Apri su Safari",
"open_in_browser": "Open in Browser", "open_in_browser": "Apri nel browser",
"find_people": "Find people to follow", "find_people": "Trova persone da seguire",
"manually_search": "Manually search instead", "manually_search": "Cerca manualmente invece",
"skip": "Skip", "skip": "Salta",
"reply": "Reply", "reply": "Rispondi",
"report_user": "Report %s", "report_user": "Segnala %s",
"block_domain": "Block %s", "block_domain": "Blocca %s",
"unblock_domain": "Unblock %s", "unblock_domain": "Sblocca %s",
"settings": "Settings", "settings": "Impostazioni",
"delete": "Delete" "delete": "Elimina"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Inizio",
"search": "Search", "search": "Cerca",
"notification": "Notification", "notification": "Notifiche",
"profile": "Profile" "profile": "Profilo"
}, },
"keyboard": { "keyboard": {
"common": { "common": {
"switch_to_tab": "Switch to %s", "switch_to_tab": "Passa a %s",
"compose_new_post": "Compose New Post", "compose_new_post": "Componi un nuovo post",
"show_favorites": "Show Favorites", "show_favorites": "Mostra preferiti",
"open_settings": "Open Settings" "open_settings": "Apri Impostazioni"
}, },
"timeline": { "timeline": {
"previous_status": "Previous Post", "previous_status": "Post precedente",
"next_status": "Next Post", "next_status": "Post successivo",
"open_status": "Open Post", "open_status": "Apri il post",
"open_author_profile": "Open Author's Profile", "open_author_profile": "Apri il profilo dell'autore",
"open_reblogger_profile": "Open Reblogger's Profile", "open_reblogger_profile": "Apri il profilo di chi ha condiviso",
"reply_status": "Reply to Post", "reply_status": "Rispondi al post",
"toggle_reblog": "Toggle Reblog on Post", "toggle_reblog": "Attiva/Disattiva condivisione sul post",
"toggle_favorite": "Toggle Favorite on Post", "toggle_favorite": "Attiva/Disattiva preferito nel post",
"toggle_content_warning": "Toggle Content Warning", "toggle_content_warning": "Attiva/Disattiva avvertimento contenuti",
"preview_image": "Preview Image" "preview_image": "Anteprima immagine"
}, },
"segmented_control": { "segmented_control": {
"previous_section": "Previous Section", "previous_section": "Sezione precedente",
"next_section": "Next Section" "next_section": "Sezione successiva"
} }
}, },
"status": { "status": {
"user_reblogged": "%s reblogged", "user_reblogged": "%s hanno condiviso",
"user_replied_to": "Replied to %s", "user_replied_to": "Rispondi a %s",
"show_post": "Show Post", "show_post": "Mostra il post",
"show_user_profile": "Show user profile", "show_user_profile": "Mostra il profilo dell'utente",
"content_warning": "Content Warning", "content_warning": "Avviso sul contenuto",
"media_content_warning": "Tap anywhere to reveal", "media_content_warning": "Tocca ovunque per rivelare",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "Tocca per rivelare",
"poll": { "poll": {
"vote": "Vote", "vote": "Vota",
"closed": "Closed" "closed": "Chiuso"
}, },
"actions": { "actions": {
"reply": "Reply", "reply": "Rispondi",
"reblog": "Reblog", "reblog": "Condivisione",
"unreblog": "Undo reblog", "unreblog": "Annulla condivisione",
"favorite": "Favorite", "favorite": "Preferito",
"unfavorite": "Unfavorite", "unfavorite": "Non preferito",
"menu": "Menu", "menu": "Menù",
"hide": "Hide", "hide": "Nascondi",
"show_image": "Show image", "show_image": "Mostra immagine",
"show_gif": "Show GIF", "show_gif": "Mostra GIF",
"show_video_player": "Mostra lettore video", "show_video_player": "Mostra lettore video",
"tap_then_hold_to_show_menu": "Tocca quindi tieni premuto per mostrare il menu" "tap_then_hold_to_show_menu": "Tocca quindi tieni premuto per mostrare il menu"
}, },
@ -219,88 +219,88 @@
"all_accessiblity_description": "Categoria: Tutti", "all_accessiblity_description": "Categoria: Tutti",
"academia": "accademia", "academia": "accademia",
"activism": "attivismo", "activism": "attivismo",
"food": "food", "food": "cibo",
"furry": "furry", "furry": "peloso",
"games": "games", "games": "giochi",
"general": "general", "general": "generale",
"journalism": "journalism", "journalism": "giornalismo",
"lgbt": "lgbt", "lgbt": "lgbt",
"regional": "regional", "regional": "locale",
"art": "art", "art": "arte",
"music": "music", "music": "musica",
"tech": "tech" "tech": "tecnologia"
}, },
"see_less": "See Less", "see_less": "Vedi meno",
"see_more": "See More" "see_more": "Vedi di più"
}, },
"label": { "label": {
"language": "LANGUAGE", "language": "LINGUA",
"users": "USERS", "users": "UTENTI",
"category": "CATEGORY" "category": "CATEGORIA"
}, },
"input": { "input": {
"placeholder": "Search communities" "placeholder": "Cerca comunità"
}, },
"empty_state": { "empty_state": {
"finding_servers": "Finding available servers...", "finding_servers": "Ricerca server disponibili...",
"bad_network": "Something went wrong while loading the data. Check your internet connection.", "bad_network": "Qualcosa è andato storto durante il caricamento dei dati. Controlla la tua connessione internet.",
"no_results": "No results" "no_results": "Nessun risultato"
} }
}, },
"register": { "register": {
"title": "Lets get you set up on %s", "title": "Facciamo in modo che sia configurato il %s",
"input": { "input": {
"avatar": { "avatar": {
"delete": "Delete" "delete": "Elimina"
}, },
"username": { "username": {
"placeholder": "username", "placeholder": "nome utente",
"duplicate_prompt": "This username is taken." "duplicate_prompt": "Questo nome utente è già stato preso."
}, },
"display_name": { "display_name": {
"placeholder": "display name" "placeholder": "visualizza nome"
}, },
"email": { "email": {
"placeholder": "email" "placeholder": "email"
}, },
"password": { "password": {
"placeholder": "password", "placeholder": "password",
"require": "Your password needs at least:", "require": "La tua password ha bisogno di almeno:",
"character_limit": "8 characters", "character_limit": "8 caratteri",
"accessibility": { "accessibility": {
"checked": "checked", "checked": "verificato",
"unchecked": "unchecked" "unchecked": "non verificato"
}, },
"hint": "Your password needs at least eight characters" "hint": "La tua password deve essere di almeno 8 caratteri"
}, },
"invite": { "invite": {
"registration_user_invite_request": "Why do you want to join?" "registration_user_invite_request": "Perché vuoi unirti?"
} }
}, },
"error": { "error": {
"item": { "item": {
"username": "Username", "username": "Nome utente",
"email": "Email", "email": "Email",
"password": "Password", "password": "Password",
"agreement": "Agreement", "agreement": "Accordo",
"locale": "Locale", "locale": "Locale",
"reason": "Reason" "reason": "Motivo"
}, },
"reason": { "reason": {
"blocked": "%s contains a disallowed email provider", "blocked": "%s contiene un provider email non consentito",
"unreachable": "%s does not seem to exist", "unreachable": "%s non sembra esistere",
"taken": "%s is already in use", "taken": "%s è già in uso",
"reserved": "%s is a reserved keyword", "reserved": "%s è una parola chiave riservata",
"accepted": "%s must be accepted", "accepted": "%s deve essere accettato",
"blank": "%s is required", "blank": "%s è richiesto",
"invalid": "%s is invalid", "invalid": "%s non è valido",
"too_long": "%s is too long", "too_long": "%s è troppo lungo",
"too_short": "%s is too short", "too_short": "%s è troppo corto",
"inclusion": "%s is not a supported value" "inclusion": "%s non è un valore supportato"
}, },
"special": { "special": {
"username_invalid": "Username must only contain alphanumeric characters and underscores", "username_invalid": "Il nome utente deve contenere solo caratteri alfanumerici e trattini bassi",
"username_too_long": "Username is too long (cant be longer than 30 characters)", "username_too_long": "Il nome utente è troppo lungo (non può essere più lungo di 30 caratteri)",
"email_invalid": "Questo non è un indirizzo email valido", "email_invalid": "Questo non è un indirizzo email valido",
"password_too_short": "La password è troppo corta (deve contenere almeno 8 caratteri)" "password_too_short": "La password è troppo corta (deve contenere almeno 8 caratteri)"
} }
@ -384,97 +384,97 @@
"visibility": { "visibility": {
"public": "Pubblico", "public": "Pubblico",
"unlisted": "Non elencato", "unlisted": "Non elencato",
"private": "Followers only", "private": "Solo i seguaci",
"direct": "Only people I mention" "direct": "Solo le persone che menziono"
}, },
"auto_complete": { "auto_complete": {
"space_to_add": "Space to add" "space_to_add": "Spazio da aggiungere"
}, },
"accessibility": { "accessibility": {
"append_attachment": "Add Attachment", "append_attachment": "Aggiungi allegato",
"append_poll": "Add Poll", "append_poll": "Aggiungi sondaggio",
"remove_poll": "Remove Poll", "remove_poll": "Elimina sondaggio",
"custom_emoji_picker": "Custom Emoji Picker", "custom_emoji_picker": "Selettore Emoji personalizzato",
"enable_content_warning": "Enable Content Warning", "enable_content_warning": "Abilita avvertimento contenuti",
"disable_content_warning": "Disable Content Warning", "disable_content_warning": "Disabilita avviso di contenuti",
"post_visibility_menu": "Post Visibility Menu" "post_visibility_menu": "Menu di visibilità del post"
}, },
"keyboard": { "keyboard": {
"discard_post": "Discard Post", "discard_post": "Scarta post",
"publish_post": "Publish Post", "publish_post": "Pubblica il post",
"toggle_poll": "Toggle Poll", "toggle_poll": "Attiva/Disattiva Sondaggio",
"toggle_content_warning": "Toggle Content Warning", "toggle_content_warning": "Attiva/Disattiva avviso contenuti",
"append_attachment_entry": "Add Attachment - %s", "append_attachment_entry": "Aggiungi allegato - %s",
"select_visibility_entry": "Select Visibility - %s" "select_visibility_entry": "Seleziona visibilità - %s"
} }
}, },
"profile": { "profile": {
"dashboard": { "dashboard": {
"posts": "posts", "posts": "post",
"following": "following", "following": "seguendo",
"followers": "followers" "followers": "seguaci"
}, },
"fields": { "fields": {
"add_row": "Add Row", "add_row": "Aggiungi riga",
"placeholder": { "placeholder": {
"label": "Label", "label": "Etichetta",
"content": "Content" "content": "Contenuto"
} }
}, },
"segmented_control": { "segmented_control": {
"posts": "Posts", "posts": "Post",
"replies": "Replies", "replies": "Risposte",
"posts_and_replies": "Posts and Replies", "posts_and_replies": "Post e risposte",
"media": "Media", "media": "Media",
"about": "About" "about": "Info su"
}, },
"relationship_action_alert": { "relationship_action_alert": {
"confirm_mute_user": { "confirm_mute_user": {
"title": "Mute Account", "title": "Silenzia account",
"message": "Confirm to mute %s" "message": "Confermi di silenziare %s"
}, },
"confirm_unmute_user": { "confirm_unmute_user": {
"title": "Unmute Account", "title": "Riattiva account",
"message": "Confirm to unmute %s" "message": "Confermi di riattivare %s"
}, },
"confirm_block_user": { "confirm_block_user": {
"title": "Block Account", "title": "Blocca account",
"message": "Confirm to block %s" "message": "Confermi di bloccare %s"
}, },
"confirm_unblock_user": { "confirm_unblock_user": {
"title": "Unblock Account", "title": "Sblocca account",
"message": "Confirm to unblock %s" "message": "Conferma per sbloccare %s"
} }
}, },
"accessibility": { "accessibility": {
"show_avatar_image": "Show avatar image", "show_avatar_image": "Mostra immagine avatar",
"edit_avatar_image": "Edit avatar image", "edit_avatar_image": "Modifica immagine avatar",
"show_banner_image": "Show banner image", "show_banner_image": "Mostra immagine banner",
"double_tap_to_open_the_list": "Double tap to open the list" "double_tap_to_open_the_list": "Doppio tocco per aprire la lista"
} }
}, },
"follower": { "follower": {
"footer": "Followers from other servers are not displayed." "footer": "I seguaci da altri server non vengono visualizzati."
}, },
"following": { "following": {
"footer": "Follows from other servers are not displayed." "footer": "I follow da altri server non vengono visualizzati."
}, },
"search": { "search": {
"title": "Search", "title": "Cerca",
"search_bar": { "search_bar": {
"placeholder": "Search hashtags and users", "placeholder": "Cerca hashtag e utenti",
"cancel": "Cancel" "cancel": "Annulla"
}, },
"recommend": { "recommend": {
"button_text": "See All", "button_text": "Vedi tutto",
"hash_tag": { "hash_tag": {
"title": "Trending on Mastodon", "title": "Di tendenza su Mastodon",
"description": "Hashtags that are getting quite a bit of attention", "description": "Hashtag che stanno ottenendo un bel po' di attenzione",
"people_talking": "%s people are talking" "people_talking": "%s persone ne parlano"
}, },
"accounts": { "accounts": {
"title": "Accounts you might like", "title": "Account che potrebbero piacerti",
"description": "You may like to follow these accounts", "description": "Potresti voler seguire questi account",
"follow": "Segui" "follow": "Segui"
} }
}, },
@ -492,6 +492,14 @@
"clear": "Cancella" "clear": "Cancella"
} }
}, },
"discovery": {
"tabs": {
"posts": "Post",
"hashtags": "Hashtag",
"news": "Notizie",
"for_you": "Per Te"
}
},
"favorite": { "favorite": {
"title": "I tuoi preferiti" "title": "I tuoi preferiti"
}, },
@ -559,50 +567,50 @@
"title": "La zona boring", "title": "La zona boring",
"account_settings": "Impostazioni account", "account_settings": "Impostazioni account",
"terms": "Termini di servizio", "terms": "Termini di servizio",
"privacy": "Privacy Policy" "privacy": "Politica sulla Privacy"
}, },
"spicy_zone": { "spicy_zone": {
"title": "The Spicy Zone", "title": "La zona piccante",
"clear": "Clear Media Cache", "clear": "Cancella la cache multimediale",
"signout": "Sign Out" "signout": "Esci"
} }
}, },
"footer": { "footer": {
"mastodon_description": "Mastodon is open source software. You can report issues on GitHub at %s (%s)" "mastodon_description": "Mastodon è un software open source. Puoi segnalare problemi su GitHub a %s (%s)"
}, },
"keyboard": { "keyboard": {
"close_settings_window": "Close Settings Window" "close_settings_window": "Chiudi la finestra Impostazioni"
} }
}, },
"report": { "report": {
"title_report": "Report", "title_report": "Segnala",
"title": "Report %s", "title": "Segnala %s",
"step1": "Step 1 of 2", "step1": "Fase 1 di 2",
"step2": "Step 2 of 2", "step2": "Fase 2 di 2",
"content1": "Are there any other posts youd like to add to the report?", "content1": "Ci sono altri post che vorresti aggiungere alla segnalazione?",
"content2": "Is there anything the moderators should know about this report?", "content2": "C'è qualcosa che i moderatori dovrebbero sapere su questa segnalazione?",
"report_sent_title": "Thanks for reporting, well look into this.", "report_sent_title": "Grazie per la segnalazione, esamineremo questo aspetto.",
"send": "Send Report", "send": "Invia segnalazione",
"skip_to_send": "Send without comment", "skip_to_send": "Invia senza commento",
"text_placeholder": "Type or paste additional comments", "text_placeholder": "Digita o incolla commenti aggiuntivi",
"reported": "REPORTED" "reported": "SEGNALATO"
}, },
"preview": { "preview": {
"keyboard": { "keyboard": {
"close_preview": "Close Preview", "close_preview": "Chiudi anteprima",
"show_next": "Show Next", "show_next": "Mostra successivo",
"show_previous": "Show Previous" "show_previous": "Mostra precedente"
} }
}, },
"account_list": { "account_list": {
"tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher", "tab_bar_hint": "Profilo corrente selezionato: %s. Doppio tocco e tieni premuto per mostrare il cambio account",
"dismiss_account_switcher": "Dismiss Account Switcher", "dismiss_account_switcher": "Ignora il cambio account",
"add_account": "Add Account" "add_account": "Aggiungi account"
}, },
"wizard": { "wizard": {
"new_in_mastodon": "New in Mastodon", "new_in_mastodon": "Nuovo su Mastodon",
"multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.", "multiple_account_switch_intro_description": "Passa tra più account tenendo premuto il pulsante del profilo.",
"accessibility_hint": "Double tap to dismiss this wizard" "accessibility_hint": "Doppio tocco per eliminare questa procedura guidata"
} }
} }
} }

View File

@ -492,6 +492,14 @@
"clear": "クリア" "clear": "クリア"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "お気に入り" "title": "お気に入り"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Sfeḍ" "clear": "Sfeḍ"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Ismenyifen-ik·im" "title": "Ismenyifen-ik·im"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Pak bike" "clear": "Pak bike"
} }
}, },
"discovery": {
"tabs": {
"posts": "Şandî",
"hashtags": "Hashtag",
"news": "Nûçe",
"for_you": "Ji bo te"
}
},
"favorite": { "favorite": {
"title": "Bijarteyên te" "title": "Bijarteyên te"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Wissen" "clear": "Wissen"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Uw favorieten" "title": "Uw favorieten"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -46,7 +46,7 @@
}, },
"delete_post": { "delete_post": {
"title": "Вы уверены, что хотите удалить этот пост?", "title": "Вы уверены, что хотите удалить этот пост?",
"message": "Are you sure you want to delete this post?" "message": "Вы уверены, что хотите удалить этот пост?"
}, },
"clean_cache": { "clean_cache": {
"title": "Очистка кэша", "title": "Очистка кэша",
@ -130,7 +130,7 @@
"show_user_profile": "Показать профиль пользователя", "show_user_profile": "Показать профиль пользователя",
"content_warning": "Предупреждение о содержании", "content_warning": "Предупреждение о содержании",
"media_content_warning": "Нажмите в любом месте, чтобы показать", "media_content_warning": "Нажмите в любом месте, чтобы показать",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "Нажмите, чтобы показать",
"poll": { "poll": {
"vote": "Проголосовать", "vote": "Проголосовать",
"closed": "Завершён" "closed": "Завершён"
@ -142,11 +142,11 @@
"favorite": "Добавить в избранное", "favorite": "Добавить в избранное",
"unfavorite": "Убрать из избранного", "unfavorite": "Убрать из избранного",
"menu": "Меню", "menu": "Меню",
"hide": "Hide", "hide": "Скрыть",
"show_image": "Show image", "show_image": "Показать изображение",
"show_gif": "Show GIF", "show_gif": "Показать GIF",
"show_video_player": "Show video player", "show_video_player": "Показать видеопроигрыватель",
"tap_then_hold_to_show_menu": "Tap then hold to show menu" "tap_then_hold_to_show_menu": "Нажмите и удерживайте, чтобы показать меню"
}, },
"tag": { "tag": {
"url": "Ссылка", "url": "Ссылка",
@ -175,7 +175,7 @@
"unblock_user": "Разблокировать %s", "unblock_user": "Разблокировать %s",
"blocked": "В заблокированных", "blocked": "В заблокированных",
"mute": "Игнорировать", "mute": "Игнорировать",
"mute_user": "Добавить %s в игнорируемые", "mute_user": "Игнорировать %s",
"unmute": "Убрать из игнорируемых", "unmute": "Убрать из игнорируемых",
"unmute_user": "Убрать %s из игнорируемых", "unmute_user": "Убрать %s из игнорируемых",
"muted": "В игнорируемых", "muted": "В игнорируемых",
@ -206,7 +206,7 @@
"scene": { "scene": {
"welcome": { "welcome": {
"slogan": "Социальная сеть\nпод вашим контролем.", "slogan": "Социальная сеть\nпод вашим контролем.",
"get_started": "Get Started", "get_started": "Присоединиться",
"log_in": "Вход" "log_in": "Вход"
}, },
"server_picker": { "server_picker": {
@ -321,7 +321,7 @@
"subtitle": "Мы только что отправили письмо на\n%s.\nНажмите на ссылку в нём, чтобы\nподтвердить свою учётную запись.", "subtitle": "Мы только что отправили письмо на\n%s.\nНажмите на ссылку в нём, чтобы\nподтвердить свою учётную запись.",
"button": { "button": {
"open_email_app": "Открыть приложение почты", "open_email_app": "Открыть приложение почты",
"resend": "Resend" "resend": "Отправить заново"
}, },
"dont_receive_email": { "dont_receive_email": {
"title": "Проверьте свой e-mail адрес", "title": "Проверьте свой e-mail адрес",
@ -424,7 +424,7 @@
"segmented_control": { "segmented_control": {
"posts": "Посты", "posts": "Посты",
"replies": "Ответы", "replies": "Ответы",
"posts_and_replies": "Posts and Replies", "posts_and_replies": "Посты и ответы",
"media": "Медиа", "media": "Медиа",
"about": "About" "about": "About"
}, },
@ -492,6 +492,14 @@
"clear": "Очистить" "clear": "Очистить"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Ваше избранное" "title": "Ваше избранное"
}, },
@ -553,7 +561,7 @@
"disable_avatar_animation": "Отключить анимацию аватарок", "disable_avatar_animation": "Отключить анимацию аватарок",
"disable_emoji_animation": "Отключить анимацию эмодзи", "disable_emoji_animation": "Отключить анимацию эмодзи",
"using_default_browser": "Использовать браузер по умолчанию для открытия ссылок", "using_default_browser": "Использовать браузер по умолчанию для открытия ссылок",
"open_links_in_mastodon": "Open links in Mastodon" "open_links_in_mastodon": "Открывать ссылки в Мастодоне"
}, },
"boring_zone": { "boring_zone": {
"title": "Зона скукотищи", "title": "Зона скукотищи",
@ -575,7 +583,7 @@
} }
}, },
"report": { "report": {
"title_report": "Report", "title_report": "Жалоба",
"title": "Пожаловаться на %s", "title": "Пожаловаться на %s",
"step1": "Шаг 1 из 2", "step1": "Шаг 1 из 2",
"step2": "Шаг 2 из 2", "step2": "Шаг 2 из 2",
@ -600,7 +608,7 @@
"add_account": "Add Account" "add_account": "Add Account"
}, },
"wizard": { "wizard": {
"new_in_mastodon": "New in Mastodon", "new_in_mastodon": "Новое в Мастодоне",
"multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.", "multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
"accessibility_hint": "Double tap to dismiss this wizard" "accessibility_hint": "Double tap to dismiss this wizard"
} }

View File

@ -492,6 +492,14 @@
"clear": "Tyhjennä" "clear": "Tyhjennä"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Omat suosikit" "title": "Omat suosikit"
}, },

View File

@ -492,6 +492,14 @@
"clear": "Rensa" "clear": "Rensa"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -111,7 +111,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld การตอบกลับ</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -130,7 +130,7 @@
"show_user_profile": "แสดงโปรไฟล์ผู้ใช้", "show_user_profile": "แสดงโปรไฟล์ผู้ใช้",
"content_warning": "คำเตือนเนื้อหา", "content_warning": "คำเตือนเนื้อหา",
"media_content_warning": "แตะที่ใดก็ตามเพื่อเปิดเผย", "media_content_warning": "แตะที่ใดก็ตามเพื่อเปิดเผย",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "แตะเพื่อเปิดเผย",
"poll": { "poll": {
"vote": "ลงคะแนน", "vote": "ลงคะแนน",
"closed": "ปิดแล้ว" "closed": "ปิดแล้ว"
@ -143,10 +143,10 @@
"unfavorite": "เลิกชื่นชอบ", "unfavorite": "เลิกชื่นชอบ",
"menu": "เมนู", "menu": "เมนู",
"hide": "ซ่อน", "hide": "ซ่อน",
"show_image": "Show image", "show_image": "แสดงภาพ",
"show_gif": "Show GIF", "show_gif": "แสดง GIF",
"show_video_player": "Show video player", "show_video_player": "แสดงตัวเล่นวิดีโอ",
"tap_then_hold_to_show_menu": "Tap then hold to show menu" "tap_then_hold_to_show_menu": "แตะค้างไว้เพื่อแสดงเมนู"
}, },
"tag": { "tag": {
"url": "URL", "url": "URL",
@ -447,10 +447,10 @@
} }
}, },
"accessibility": { "accessibility": {
"show_avatar_image": "Show avatar image", "show_avatar_image": "แสดงภาพประจำตัว",
"edit_avatar_image": "Edit avatar image", "edit_avatar_image": "แก้ไขภาพประจำตัว",
"show_banner_image": "Show banner image", "show_banner_image": "แสดงภาพแบนเนอร์",
"double_tap_to_open_the_list": "Double tap to open the list" "double_tap_to_open_the_list": "แตะสองครั้งเพื่อเปิดรายการ"
} }
}, },
"follower": { "follower": {
@ -492,6 +492,14 @@
"clear": "ล้าง" "clear": "ล้าง"
} }
}, },
"discovery": {
"tabs": {
"posts": "โพสต์",
"hashtags": "แฮชแท็ก",
"news": "ข่าว",
"for_you": "สำหรับคุณ"
}
},
"favorite": { "favorite": {
"title": "รายการโปรดของคุณ" "title": "รายการโปรดของคุณ"
}, },
@ -553,7 +561,7 @@
"disable_avatar_animation": "ปิดใช้งานภาพประจำตัวแบบเคลื่อนไหว", "disable_avatar_animation": "ปิดใช้งานภาพประจำตัวแบบเคลื่อนไหว",
"disable_emoji_animation": "ปิดใช้งานอีโมจิแบบเคลื่อนไหว", "disable_emoji_animation": "ปิดใช้งานอีโมจิแบบเคลื่อนไหว",
"using_default_browser": "ใช้เบราว์เซอร์เริ่มต้นเพื่อเปิดลิงก์", "using_default_browser": "ใช้เบราว์เซอร์เริ่มต้นเพื่อเปิดลิงก์",
"open_links_in_mastodon": "Open links in Mastodon" "open_links_in_mastodon": "เปิดลิงก์ใน Mastodon"
}, },
"boring_zone": { "boring_zone": {
"title": "โซนน่าเบื่อ", "title": "โซนน่าเบื่อ",

View File

@ -28,8 +28,8 @@
} }
}, },
"edit_profile_failure": { "edit_profile_failure": {
"title": "Lỗi chỉnh sửa trang cá nhân", "title": "Lỗi chỉnh sửa hồ sơ",
"message": "Không thể chỉnh sửa trang cá nhân. Vui lòng thử lại." "message": "Không thể chỉnh sửa hồ sơ. Vui lòng thử lại."
}, },
"sign_out": { "sign_out": {
"title": "Đăng xuất", "title": "Đăng xuất",
@ -97,7 +97,7 @@
"home": "Bảng tin", "home": "Bảng tin",
"search": "Tìm kiếm", "search": "Tìm kiếm",
"notification": "Thông báo", "notification": "Thông báo",
"profile": "Trang cá nhân" "profile": "Trang hồ sơ"
}, },
"keyboard": { "keyboard": {
"common": { "common": {
@ -127,7 +127,7 @@
"user_reblogged": "%s đăng lại", "user_reblogged": "%s đăng lại",
"user_replied_to": "Trả lời %s", "user_replied_to": "Trả lời %s",
"show_post": "Xem tút", "show_post": "Xem tút",
"show_user_profile": "Xem trang cá nhân", "show_user_profile": "Xem trang hồ sơ",
"content_warning": "Nội dung ẩn", "content_warning": "Nội dung ẩn",
"media_content_warning": "Nhấn để hiển thị", "media_content_warning": "Nhấn để hiển thị",
"tap_to_reveal": "Nhấn để hiển thị", "tap_to_reveal": "Nhấn để hiển thị",
@ -492,6 +492,14 @@
"clear": "Xóa" "clear": "Xóa"
} }
}, },
"discovery": {
"tabs": {
"posts": "Tút",
"hashtags": "Hashtag",
"news": "Tin tức",
"for_you": "Dành cho bạn"
}
},
"favorite": { "favorite": {
"title": "Lượt thích" "title": "Lượt thích"
}, },

View File

@ -111,7 +111,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld 条回复</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -130,7 +130,7 @@
"show_user_profile": "查看用户个人资料", "show_user_profile": "查看用户个人资料",
"content_warning": "内容警告", "content_warning": "内容警告",
"media_content_warning": "点击任意位置显示", "media_content_warning": "点击任意位置显示",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "点击以显示",
"poll": { "poll": {
"vote": "投票", "vote": "投票",
"closed": "已关闭" "closed": "已关闭"
@ -143,10 +143,10 @@
"unfavorite": "取消喜欢", "unfavorite": "取消喜欢",
"menu": "菜单", "menu": "菜单",
"hide": "隐藏", "hide": "隐藏",
"show_image": "Show image", "show_image": "显示图片",
"show_gif": "Show GIF", "show_gif": "显示 GIF",
"show_video_player": "Show video player", "show_video_player": "显示视频播放器",
"tap_then_hold_to_show_menu": "Tap then hold to show menu" "tap_then_hold_to_show_menu": "长按以显示菜单"
}, },
"tag": { "tag": {
"url": "URL", "url": "URL",
@ -447,10 +447,10 @@
} }
}, },
"accessibility": { "accessibility": {
"show_avatar_image": "Show avatar image", "show_avatar_image": "显示头像",
"edit_avatar_image": "Edit avatar image", "edit_avatar_image": "编辑头像",
"show_banner_image": "Show banner image", "show_banner_image": "显示顶部横幅图片",
"double_tap_to_open_the_list": "Double tap to open the list" "double_tap_to_open_the_list": "双击打开列表"
} }
}, },
"follower": { "follower": {
@ -492,6 +492,14 @@
"clear": "清除" "clear": "清除"
} }
}, },
"discovery": {
"tabs": {
"posts": "帖子",
"hashtags": "话题",
"news": "新闻",
"for_you": "为你推荐"
}
},
"favorite": { "favorite": {
"title": "你的喜欢" "title": "你的喜欢"
}, },
@ -553,7 +561,7 @@
"disable_avatar_animation": "禁用动画头像", "disable_avatar_animation": "禁用动画头像",
"disable_emoji_animation": "禁用动画表情", "disable_emoji_animation": "禁用动画表情",
"using_default_browser": "使用默认浏览器打开链接", "using_default_browser": "使用默认浏览器打开链接",
"open_links_in_mastodon": "Open links in Mastodon" "open_links_in_mastodon": "在 Mastodon 中打开链接"
}, },
"boring_zone": { "boring_zone": {
"title": "The Boring Zone", "title": "The Boring Zone",

View File

@ -492,6 +492,14 @@
"clear": "Clear" "clear": "Clear"
} }
}, },
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"
}, },

View File

@ -129,6 +129,7 @@
"show_post": "Show Post", "show_post": "Show Post",
"show_user_profile": "Show user profile", "show_user_profile": "Show user profile",
"content_warning": "Content Warning", "content_warning": "Content Warning",
"sensitive_content": "Sensitive Content",
"media_content_warning": "Tap anywhere to reveal", "media_content_warning": "Tap anywhere to reveal",
"tap_to_reveal": "Tap to reveal", "tap_to_reveal": "Tap to reveal",
"poll": { "poll": {
@ -498,7 +499,8 @@
"hashtags": "Hashtags", "hashtags": "Hashtags",
"news": "News", "news": "News",
"for_you": "For You" "for_you": "For You"
} },
"intro": "These are the posts gaining traction in your corner of Mastodon."
}, },
"favorite": { "favorite": {
"title": "Your Favorites" "title": "Your Favorites"

View File

@ -115,9 +115,7 @@
DB0009A626AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; settings = {ATTRIBUTES = (no_codegen, ); }; }; DB0009A626AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; settings = {ATTRIBUTES = (no_codegen, ); }; };
DB0009A726AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; }; DB0009A726AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; };
DB00CA972632DDB600A54956 /* CommonOSLog in Frameworks */ = {isa = PBXBuildFile; productRef = DB00CA962632DDB600A54956 /* CommonOSLog */; }; DB00CA972632DDB600A54956 /* CommonOSLog in Frameworks */ = {isa = PBXBuildFile; productRef = DB00CA962632DDB600A54956 /* CommonOSLog */; };
DB0140BD25C40D7500F9F3CF /* CommonOSLog in Frameworks */ = {isa = PBXBuildFile; productRef = DB0140BC25C40D7500F9F3CF /* CommonOSLog */; };
DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0140CE25C42AEE00F9F3CF /* OSLog.swift */; }; DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0140CE25C42AEE00F9F3CF /* OSLog.swift */; };
DB01E23326A98F0900C3965B /* MastodonMeta in Frameworks */ = {isa = PBXBuildFile; productRef = DB01E23226A98F0900C3965B /* MastodonMeta */; };
DB01E23526A98F0900C3965B /* MetaTextKit in Frameworks */ = {isa = PBXBuildFile; productRef = DB01E23426A98F0900C3965B /* MetaTextKit */; }; DB01E23526A98F0900C3965B /* MetaTextKit in Frameworks */ = {isa = PBXBuildFile; productRef = DB01E23426A98F0900C3965B /* MetaTextKit */; };
DB023D26279FFB0A005AC798 /* ShareActivityProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB023D25279FFB0A005AC798 /* ShareActivityProvider.swift */; }; DB023D26279FFB0A005AC798 /* ShareActivityProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB023D25279FFB0A005AC798 /* ShareActivityProvider.swift */; };
DB023D2827A0FABD005AC798 /* NotificationTableViewCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB023D2727A0FABD005AC798 /* NotificationTableViewCellDelegate.swift */; }; DB023D2827A0FABD005AC798 /* NotificationTableViewCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB023D2727A0FABD005AC798 /* NotificationTableViewCellDelegate.swift */; };
@ -130,6 +128,8 @@
DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB029E94266A20430062874E /* MastodonAuthenticationController.swift */; }; DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB029E94266A20430062874E /* MastodonAuthenticationController.swift */; };
DB02CDAB26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift */; }; DB02CDAB26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift */; };
DB02CDBF2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDBE2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift */; }; DB02CDBF2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDBE2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift */; };
DB02EA0B280D180D00E751C5 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = DB02EA0A280D180D00E751C5 /* KeychainAccess */; };
DB02EA0D280D184B00E751C5 /* CommonOSLog in Frameworks */ = {isa = PBXBuildFile; productRef = DB02EA0C280D184B00E751C5 /* CommonOSLog */; };
DB03A793272A7E5700EE37C5 /* SidebarListHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A792272A7E5700EE37C5 /* SidebarListHeaderView.swift */; }; DB03A793272A7E5700EE37C5 /* SidebarListHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A792272A7E5700EE37C5 /* SidebarListHeaderView.swift */; };
DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A794272A981400EE37C5 /* ContentSplitViewController.swift */; }; DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A794272A981400EE37C5 /* ContentSplitViewController.swift */; };
DB03F7F32689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03F7F22689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift */; }; DB03F7F32689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03F7F22689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift */; };
@ -148,6 +148,7 @@
DB0618072785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618062785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift */; }; DB0618072785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618062785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift */; };
DB06180A2785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618092785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift */; }; DB06180A2785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618092785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift */; };
DB084B5725CBC56C00F898ED /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB084B5625CBC56C00F898ED /* Status.swift */; }; DB084B5725CBC56C00F898ED /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB084B5625CBC56C00F898ED /* Status.swift */; };
DB0A322E280EE9FD001729D2 /* DiscoveryIntroBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */; };
DB0AC6FC25CD02E600D75117 /* APIService+Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */; }; DB0AC6FC25CD02E600D75117 /* APIService+Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */; };
DB0C946526A6FD4D0088FB11 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB0C946426A6FD4D0088FB11 /* AlamofireImage */; }; DB0C946526A6FD4D0088FB11 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB0C946426A6FD4D0088FB11 /* AlamofireImage */; };
DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */; }; DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */; };
@ -347,7 +348,6 @@
DB6804872637CD4C00430867 /* AppShared.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DB68047F2637CD4C00430867 /* AppShared.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; DB6804872637CD4C00430867 /* AppShared.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DB68047F2637CD4C00430867 /* AppShared.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
DB6804D12637CE4700430867 /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6804D02637CE4700430867 /* UserDefaults.swift */; }; DB6804D12637CE4700430867 /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6804D02637CE4700430867 /* UserDefaults.swift */; };
DB6804FD2637CFEC00430867 /* AppSecret.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6804FC2637CFEC00430867 /* AppSecret.swift */; }; DB6804FD2637CFEC00430867 /* AppSecret.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6804FC2637CFEC00430867 /* AppSecret.swift */; };
DB6805102637D0F800430867 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = DB68050F2637D0F800430867 /* KeychainAccess */; };
DB68586425E619B700F0A850 /* NSKeyValueObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68586325E619B700F0A850 /* NSKeyValueObservation.swift */; }; DB68586425E619B700F0A850 /* NSKeyValueObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68586325E619B700F0A850 /* NSKeyValueObservation.swift */; };
DB68A04A25E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68A04925E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift */; }; DB68A04A25E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68A04925E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift */; };
DB68A05D25E9055900CFDF14 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DB68A05C25E9055900CFDF14 /* Settings.bundle */; }; DB68A05D25E9055900CFDF14 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DB68A05C25E9055900CFDF14 /* Settings.bundle */; };
@ -871,6 +871,7 @@
DB0618062785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonRegisterViewModel+Diffable.swift"; sourceTree = "<group>"; }; DB0618062785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonRegisterViewModel+Diffable.swift"; sourceTree = "<group>"; };
DB0618092785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonRegisterAvatarTableViewCell.swift; sourceTree = "<group>"; }; DB0618092785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonRegisterAvatarTableViewCell.swift; sourceTree = "<group>"; };
DB084B5625CBC56C00F898ED /* Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = "<group>"; }; DB084B5625CBC56C00F898ED /* Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = "<group>"; };
DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryIntroBannerView.swift; sourceTree = "<group>"; };
DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Instance.swift"; sourceTree = "<group>"; }; DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Instance.swift"; sourceTree = "<group>"; };
DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAvatarButton.swift; sourceTree = "<group>"; }; DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAvatarButton.swift; sourceTree = "<group>"; };
DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListCollectionViewCell.swift; sourceTree = "<group>"; }; DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListCollectionViewCell.swift; sourceTree = "<group>"; };
@ -1372,7 +1373,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
DB0140BD25C40D7500F9F3CF /* CommonOSLog in Frameworks */,
DB9A487E2603456B008B817C /* UITextView+Placeholder in Frameworks */, DB9A487E2603456B008B817C /* UITextView+Placeholder in Frameworks */,
2D939AC825EE14620076FA61 /* CropViewController in Frameworks */, 2D939AC825EE14620076FA61 /* CropViewController in Frameworks */,
DBB525082611EAC0002F1F29 /* Tabman in Frameworks */, DBB525082611EAC0002F1F29 /* Tabman in Frameworks */,
@ -1382,10 +1382,10 @@
DBAC6483267D0B21007FE9FD /* DifferenceKit in Frameworks */, DBAC6483267D0B21007FE9FD /* DifferenceKit in Frameworks */,
DB552D4F26BBD10C00E481F6 /* OrderedCollections in Frameworks */, DB552D4F26BBD10C00E481F6 /* OrderedCollections in Frameworks */,
2D61336925C18A4F00CAE157 /* AlamofireNetworkActivityIndicator in Frameworks */, 2D61336925C18A4F00CAE157 /* AlamofireNetworkActivityIndicator in Frameworks */,
DB01E23326A98F0900C3965B /* MastodonMeta in Frameworks */,
DBAC64A1267E6D02007FE9FD /* Fuzi in Frameworks */, DBAC64A1267E6D02007FE9FD /* Fuzi in Frameworks */,
DB3D0FF325BAA61700EAA174 /* AlamofireImage in Frameworks */, DB3D0FF325BAA61700EAA174 /* AlamofireImage in Frameworks */,
DBAC649E267DFE43007FE9FD /* DiffableDataSources in Frameworks */, DBAC649E267DFE43007FE9FD /* DiffableDataSources in Frameworks */,
DB02EA0D280D184B00E751C5 /* CommonOSLog in Frameworks */,
2D5981BA25E4D7F8000FB903 /* ThirdPartyMailer in Frameworks */, 2D5981BA25E4D7F8000FB903 /* ThirdPartyMailer in Frameworks */,
87FFDA5D898A5C42ADCB35E7 /* Pods_Mastodon.framework in Frameworks */, 87FFDA5D898A5C42ADCB35E7 /* Pods_Mastodon.framework in Frameworks */,
DBF7A0FC26830C33004176A2 /* FPSIndicator in Frameworks */, DBF7A0FC26830C33004176A2 /* FPSIndicator in Frameworks */,
@ -1415,7 +1415,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
DB6805102637D0F800430867 /* KeychainAccess in Frameworks */, DB02EA0B280D180D00E751C5 /* KeychainAccess in Frameworks */,
EE93E8E8F9E0C39EAAEBD92F /* Pods_AppShared.framework in Frameworks */, EE93E8E8F9E0C39EAAEBD92F /* Pods_AppShared.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -2025,6 +2025,14 @@
path = CoreDataStack; path = CoreDataStack;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
DB0A322F280EEA00001729D2 /* View */ = {
isa = PBXGroup;
children = (
DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */,
);
path = View;
sourceTree = "<group>";
};
DB0C947826A7FE950088FB11 /* Button */ = { DB0C947826A7FE950088FB11 /* Button */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -3110,6 +3118,7 @@
DBDFF1912805544800557A48 /* Discovery */ = { DBDFF1912805544800557A48 /* Discovery */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
DB0A322F280EEA00001729D2 /* View */,
DBDFF19828055A0900557A48 /* Posts */, DBDFF19828055A0900557A48 /* Posts */,
DB3E6FDE2806A41200B035AE /* Hashtags */, DB3E6FDE2806A41200B035AE /* Hashtags */,
DB3E6FED2806D7FC00B035AE /* News */, DB3E6FED2806D7FC00B035AE /* News */,
@ -3303,7 +3312,6 @@
DB3D0FF225BAA61700EAA174 /* AlamofireImage */, DB3D0FF225BAA61700EAA174 /* AlamofireImage */,
5D526FE125BE9AC400460CB9 /* MastodonSDK */, 5D526FE125BE9AC400460CB9 /* MastodonSDK */,
2D61336825C18A4F00CAE157 /* AlamofireNetworkActivityIndicator */, 2D61336825C18A4F00CAE157 /* AlamofireNetworkActivityIndicator */,
DB0140BC25C40D7500F9F3CF /* CommonOSLog */,
2D5981B925E4D7F8000FB903 /* ThirdPartyMailer */, 2D5981B925E4D7F8000FB903 /* ThirdPartyMailer */,
2D939AC725EE14620076FA61 /* CropViewController */, 2D939AC725EE14620076FA61 /* CropViewController */,
DB9A487D2603456B008B817C /* UITextView+Placeholder */, DB9A487D2603456B008B817C /* UITextView+Placeholder */,
@ -3312,10 +3320,10 @@
DBAC649D267DFE43007FE9FD /* DiffableDataSources */, DBAC649D267DFE43007FE9FD /* DiffableDataSources */,
DBAC64A0267E6D02007FE9FD /* Fuzi */, DBAC64A0267E6D02007FE9FD /* Fuzi */,
DBF7A0FB26830C33004176A2 /* FPSIndicator */, DBF7A0FB26830C33004176A2 /* FPSIndicator */,
DB01E23226A98F0900C3965B /* MastodonMeta */,
DB01E23426A98F0900C3965B /* MetaTextKit */, DB01E23426A98F0900C3965B /* MetaTextKit */,
DB552D4E26BBD10C00E481F6 /* OrderedCollections */, DB552D4E26BBD10C00E481F6 /* OrderedCollections */,
DBA5A52E26F07ED800CACBAA /* PanModal */, DBA5A52E26F07ED800CACBAA /* PanModal */,
DB02EA0C280D184B00E751C5 /* CommonOSLog */,
); );
productName = Mastodon; productName = Mastodon;
productReference = DB427DD225BAA00100D1B89D /* Mastodon.app */; productReference = DB427DD225BAA00100D1B89D /* Mastodon.app */;
@ -3376,7 +3384,7 @@
); );
name = AppShared; name = AppShared;
packageProductDependencies = ( packageProductDependencies = (
DB68050F2637D0F800430867 /* KeychainAccess */, DB02EA0A280D180D00E751C5 /* KeychainAccess */,
); );
productName = AppShared; productName = AppShared;
productReference = DB68047F2637CD4C00430867 /* AppShared.framework */; productReference = DB68047F2637CD4C00430867 /* AppShared.framework */;
@ -4088,6 +4096,7 @@
DB8AF55D25C138B7002E6C99 /* UIViewController.swift in Sources */, DB8AF55D25C138B7002E6C99 /* UIViewController.swift in Sources */,
DB7F48452620241000796008 /* ProfileHeaderViewModel.swift in Sources */, DB7F48452620241000796008 /* ProfileHeaderViewModel.swift in Sources */,
DB647C5926F1EA2700F7F82C /* WizardPreference.swift in Sources */, DB647C5926F1EA2700F7F82C /* WizardPreference.swift in Sources */,
DB0A322E280EE9FD001729D2 /* DiscoveryIntroBannerView.swift in Sources */,
2D3F9E0425DFA133004262D9 /* UITapGestureRecognizer.swift in Sources */, 2D3F9E0425DFA133004262D9 /* UITapGestureRecognizer.swift in Sources */,
5DDDF1992617447F00311060 /* Mastodon+Entity+Tag.swift in Sources */, 5DDDF1992617447F00311060 /* Mastodon+Entity+Tag.swift in Sources */,
5B90C45F262599800002E742 /* SettingsToggleTableViewCell.swift in Sources */, 5B90C45F262599800002E742 /* SettingsToggleTableViewCell.swift in Sources */,
@ -4728,7 +4737,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements; CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets"; DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist; INFOPLIST_FILE = Mastodon/Info.plist;
@ -4757,7 +4766,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements; CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets"; DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist; INFOPLIST_FILE = Mastodon/Info.plist;
@ -4865,11 +4874,11 @@
APPLICATION_EXTENSION_API_ONLY = YES; APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 110; DYLIB_CURRENT_VERSION = 113;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist; INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -4896,11 +4905,11 @@
APPLICATION_EXTENSION_API_ONLY = YES; APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 110; DYLIB_CURRENT_VERSION = 113;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist; INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -4925,7 +4934,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements; CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist; INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -4950,7 +4959,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements; CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist; INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -4975,7 +4984,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist; INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -5000,7 +5009,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist; INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -5086,7 +5095,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements; CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets"; DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist; INFOPLIST_FILE = Mastodon/Info.plist;
@ -5153,11 +5162,11 @@
APPLICATION_EXTENSION_API_ONLY = YES; APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 110; DYLIB_CURRENT_VERSION = 113;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist; INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -5182,7 +5191,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements; CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist; INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -5206,7 +5215,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist; INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -5231,7 +5240,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements; CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist; INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -5256,7 +5265,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements; CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist; INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -5280,7 +5289,7 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements; CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110; CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P; DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist; INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -5421,7 +5430,7 @@
repositoryURL = "https://github.com/TwidereProject/MetaTextKit.git"; repositoryURL = "https://github.com/TwidereProject/MetaTextKit.git";
requirement = { requirement = {
kind = exactVersion; kind = exactVersion;
version = 2.2.1; version = 2.2.2;
}; };
}; };
DB0E2D2C26833FF600865C3C /* XCRemoteSwiftPackageReference "Nuke-FLAnimatedImage-Plugin" */ = { DB0E2D2C26833FF600865C3C /* XCRemoteSwiftPackageReference "Nuke-FLAnimatedImage-Plugin" */ = {
@ -5539,21 +5548,21 @@
package = DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "CommonOSLog" */; package = DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "CommonOSLog" */;
productName = CommonOSLog; productName = CommonOSLog;
}; };
DB0140BC25C40D7500F9F3CF /* CommonOSLog */ = {
isa = XCSwiftPackageProductDependency;
package = DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "CommonOSLog" */;
productName = CommonOSLog;
};
DB01E23226A98F0900C3965B /* MastodonMeta */ = {
isa = XCSwiftPackageProductDependency;
package = DB01E23126A98F0900C3965B /* XCRemoteSwiftPackageReference "MetaTextKit" */;
productName = MastodonMeta;
};
DB01E23426A98F0900C3965B /* MetaTextKit */ = { DB01E23426A98F0900C3965B /* MetaTextKit */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = DB01E23126A98F0900C3965B /* XCRemoteSwiftPackageReference "MetaTextKit" */; package = DB01E23126A98F0900C3965B /* XCRemoteSwiftPackageReference "MetaTextKit" */;
productName = MetaTextKit; productName = MetaTextKit;
}; };
DB02EA0A280D180D00E751C5 /* KeychainAccess */ = {
isa = XCSwiftPackageProductDependency;
package = DB6804722637CC1200430867 /* XCRemoteSwiftPackageReference "KeychainAccess" */;
productName = KeychainAccess;
};
DB02EA0C280D184B00E751C5 /* CommonOSLog */ = {
isa = XCSwiftPackageProductDependency;
package = DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "CommonOSLog" */;
productName = CommonOSLog;
};
DB0C946426A6FD4D0088FB11 /* AlamofireImage */ = { DB0C946426A6FD4D0088FB11 /* AlamofireImage */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */; package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */;
@ -5573,11 +5582,6 @@
package = DB552D4D26BBD10C00E481F6 /* XCRemoteSwiftPackageReference "swift-collections" */; package = DB552D4D26BBD10C00E481F6 /* XCRemoteSwiftPackageReference "swift-collections" */;
productName = OrderedCollections; productName = OrderedCollections;
}; };
DB68050F2637D0F800430867 /* KeychainAccess */ = {
isa = XCSwiftPackageProductDependency;
package = DB6804722637CC1200430867 /* XCRemoteSwiftPackageReference "KeychainAccess" */;
productName = KeychainAccess;
};
DB6D9F41263527CE008423CD /* AlamofireImage */ = { DB6D9F41263527CE008423CD /* AlamofireImage */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */; package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */;

View File

@ -73,7 +73,6 @@
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
enableAddressSanitizer = "YES"
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
@ -90,13 +89,6 @@
ReferencedContainer = "container:Mastodon.xcodeproj"> ReferencedContainer = "container:Mastodon.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<AdditionalOptions>
<AdditionalOption
key = "NSZombieEnabled"
value = "YES"
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"

View File

@ -109,7 +109,7 @@
<key>MastodonIntent.xcscheme_^#shared#^_</key> <key>MastodonIntent.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>33</integer> <integer>30</integer>
</dict> </dict>
<key>MastodonIntents.xcscheme_^#shared#^_</key> <key>MastodonIntents.xcscheme_^#shared#^_</key>
<dict> <dict>
@ -124,12 +124,12 @@
<key>NotificationService.xcscheme_^#shared#^_</key> <key>NotificationService.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>32</integer> <integer>31</integer>
</dict> </dict>
<key>ShareActionExtension.xcscheme_^#shared#^_</key> <key>ShareActionExtension.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>31</integer> <integer>23</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>

View File

@ -6,8 +6,8 @@
"repositoryURL": "https://github.com/Alamofire/Alamofire.git", "repositoryURL": "https://github.com/Alamofire/Alamofire.git",
"state": { "state": {
"branch": null, "branch": null,
"revision": "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864", "revision": "354dda32d89fc8cd4f5c46487f64957d355f53d8",
"version": "5.5.0" "version": "5.6.1"
} }
}, },
{ {
@ -55,6 +55,15 @@
"version": "1.2.0" "version": "1.2.0"
} }
}, },
{
"package": "FaviconFinder",
"repositoryURL": "https://github.com/will-lumley/FaviconFinder.git",
"state": {
"branch": null,
"revision": "1f74844f77f79b95c0bb0130b3a87d4f340e6d3a",
"version": "3.3.0"
}
},
{ {
"package": "FLAnimatedImage", "package": "FLAnimatedImage",
"repositoryURL": "https://github.com/Flipboard/FLAnimatedImage.git", "repositoryURL": "https://github.com/Flipboard/FLAnimatedImage.git",
@ -96,8 +105,8 @@
"repositoryURL": "https://github.com/TwidereProject/MetaTextKit.git", "repositoryURL": "https://github.com/TwidereProject/MetaTextKit.git",
"state": { "state": {
"branch": null, "branch": null,
"revision": "3ea336d3de7938dc112084c596a646e697b0feee", "revision": "8074400b3819ef0395550082e6e8e960ef22e1f3",
"version": "2.2.1" "version": "2.2.2"
} }
}, },
{ {
@ -105,8 +114,8 @@
"repositoryURL": "https://github.com/kean/Nuke.git", "repositoryURL": "https://github.com/kean/Nuke.git",
"state": { "state": {
"branch": null, "branch": null,
"revision": "0db18dd34998cca18e9a28bcee136f84518007a0", "revision": "78fa963b8491fc520791d8c2a509f1b8593d8aae",
"version": "10.4.1" "version": "10.7.1"
} }
}, },
{ {
@ -141,8 +150,8 @@
"repositoryURL": "https://github.com/SDWebImage/SDWebImage.git", "repositoryURL": "https://github.com/SDWebImage/SDWebImage.git",
"state": { "state": {
"branch": null, "branch": null,
"revision": "2c53f531f1bedd253f55d85105409c28ed4a922c", "revision": "2e63d0061da449ad0ed130768d05dceb1496de44",
"version": "5.12.3" "version": "5.12.5"
} }
}, },
{ {
@ -172,13 +181,22 @@
"version": "1.0.0" "version": "1.0.0"
} }
}, },
{
"package": "SwiftSoup",
"repositoryURL": "https://github.com/scinfu/SwiftSoup.git",
"state": {
"branch": null,
"revision": "41e7c263fb8c277e980ebcb9b0b5f6031d3d4886",
"version": "2.4.2"
}
},
{ {
"package": "Introspect", "package": "Introspect",
"repositoryURL": "https://github.com/siteline/SwiftUI-Introspect.git", "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect.git",
"state": { "state": {
"branch": null, "branch": null,
"revision": "2e09be8af614401bc9f87d40093ec19ce56ccaf2", "revision": "f2616860a41f9d9932da412a8978fec79c06fe24",
"version": "0.1.3" "version": "0.1.4"
} }
}, },
{ {

View File

@ -52,13 +52,16 @@ extension DiscoverySection {
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ProfileCardTableViewCell.self), for: indexPath) as! ProfileCardTableViewCell let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ProfileCardTableViewCell.self), for: indexPath) as! ProfileCardTableViewCell
context.managedObjectContext.performAndWait { context.managedObjectContext.performAndWait {
guard let user = record.object(in: context.managedObjectContext) else { return } guard let user = record.object(in: context.managedObjectContext) else { return }
cell.profileCardView.configure(user: user) cell.configure(
tableView: tableView,
user: user,
profileCardTableViewCellDelegate: configuration.profileCardTableViewCellDelegate
)
} }
context.authenticationService.activeMastodonAuthentication context.authenticationService.activeMastodonAuthentication
.map { $0?.user } .map { $0?.user }
.assign(to: \.me, on: cell.profileCardView.viewModel.relationshipViewModel) .assign(to: \.me, on: cell.profileCardView.viewModel.relationshipViewModel)
.store(in: &cell.disposeBag) .store(in: &cell.disposeBag)
cell.delegate = configuration.profileCardTableViewCellDelegate
return cell return cell
case .bottomLoader: case .bottomLoader:
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell

View File

@ -43,7 +43,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>110</string> <string>113</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>LSApplicationQueriesSchemes</key> <key>LSApplicationQueriesSchemes</key>

View File

@ -286,24 +286,8 @@ extension DataSourceFacade {
try await dependency.context.managedObjectContext.perform { try await dependency.context.managedObjectContext.perform {
guard let _status = status.object(in: dependency.context.managedObjectContext) else { return } guard let _status = status.object(in: dependency.context.managedObjectContext) else { return }
let status = _status.reblog ?? _status let status = _status.reblog ?? _status
status.update(isSensitiveToggled: !status.isSensitiveToggled)
let allToggled = status.isContentSensitiveToggled && status.isMediaSensitiveToggled
status.update(isContentSensitiveToggled: !allToggled)
status.update(isMediaSensitiveToggled: !allToggled)
} }
} }
// static func responseToToggleMediaSensitiveAction(
// dependency: NeedsDependency,
// status: ManagedObjectRecord<Status>
// ) async throws {
// try await dependency.context.managedObjectContext.perform {
// guard let _status = status.object(in: dependency.context.managedObjectContext) else { return }
// let status = _status.reblog ?? _status
//
// status.update(isMediaSensitiveToggled: !status.isMediaSensitiveToggled)
// }
// }
} }

View File

@ -135,7 +135,7 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider & Med
let status = _status.reblog ?? _status let status = _status.reblog ?? _status
return NotificationMediaTransitionContext( return NotificationMediaTransitionContext(
status: .init(objectID: status.objectID), status: .init(objectID: status.objectID),
needsToggleMediaSensitive: status.isMediaSensitiveToggled ? !status.sensitive : status.sensitive needsToggleMediaSensitive: status.isSensitiveToggled ? !status.sensitive : status.sensitive
) )
} }
@ -187,7 +187,7 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider & Med
let status = _status.reblog ?? _status let status = _status.reblog ?? _status
return NotificationMediaTransitionContext( return NotificationMediaTransitionContext(
status: .init(objectID: status.objectID), status: .init(objectID: status.objectID),
needsToggleMediaSensitive: status.isMediaSensitiveToggled ? !status.sensitive : status.sensitive needsToggleMediaSensitive: status.isMediaSensitive ? !status.isSensitiveToggled : false
) )
} }

View File

@ -143,12 +143,7 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider & MediaPrev
return return
} }
let managedObjectContext = self.context.managedObjectContext let needsToggleMediaSensitive = await !statusView.viewModel.isMediaReveal
let needsToggleMediaSensitive: Bool = try await managedObjectContext.perform {
guard let _status = status.object(in: managedObjectContext) else { return false }
let status = _status.reblog ?? _status
return status.isMediaSensitiveToggled ? !status.sensitive : status.sensitive
}
guard !needsToggleMediaSensitive else { guard !needsToggleMediaSensitive else {
try await DataSourceFacade.responseToToggleSensitiveAction( try await DataSourceFacade.responseToToggleSensitiveAction(

View File

@ -8,6 +8,7 @@
import os.log import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonUI
final class DiscoveryPostsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class DiscoveryPostsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {
@ -31,6 +32,8 @@ final class DiscoveryPostsViewController: UIViewController, NeedsDependency, Med
}() }()
let refreshControl = UIRefreshControl() let refreshControl = UIRefreshControl()
let discoveryIntroBannerView = DiscoveryIntroBannerView()
deinit { deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
@ -60,6 +63,21 @@ extension DiscoveryPostsViewController {
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
]) ])
discoveryIntroBannerView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(discoveryIntroBannerView)
NSLayoutConstraint.activate([
discoveryIntroBannerView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor),
discoveryIntroBannerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
discoveryIntroBannerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
discoveryIntroBannerView.delegate = self
discoveryIntroBannerView.isHidden = UserDefaults.shared.discoveryIntroBannerNeedsHidden
UserDefaults.shared.publisher(for: \.discoveryIntroBannerNeedsHidden)
.receive(on: DispatchQueue.main)
.assign(to: \.isHidden, on: discoveryIntroBannerView)
.store(in: &disposeBag)
tableView.delegate = self tableView.delegate = self
viewModel.setupDiffableDataSource( viewModel.setupDiffableDataSource(
@ -146,3 +164,10 @@ extension DiscoveryPostsViewController: ScrollViewContainer {
tableView tableView
} }
} }
// MARK: - DiscoveryIntroBannerViewDelegate
extension DiscoveryPostsViewController: DiscoveryIntroBannerViewDelegate {
func discoveryIntroBannerView(_ bannerView: DiscoveryIntroBannerView, closeButtonDidPressed button: UIButton) {
UserDefaults.shared.discoveryIntroBannerNeedsHidden = true
}
}

View File

@ -0,0 +1,101 @@
//
// DiscoveryIntroBannerView.swift
// Mastodon
//
// Created by MainasuK on 2022-4-19.
//
import os.log
import UIKit
import Combine
import MastodonAsset
public protocol DiscoveryIntroBannerViewDelegate: AnyObject {
func discoveryIntroBannerView(_ bannerView: DiscoveryIntroBannerView, closeButtonDidPressed button: UIButton)
}
public final class DiscoveryIntroBannerView: UIView {
let logger = Logger(subsystem: "DiscoveryIntroBannerView", category: "View")
var _disposeBag = Set<AnyCancellable>()
public weak var delegate: DiscoveryIntroBannerViewDelegate?
let label: UILabel = {
let label = UILabel()
label.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 16, weight: .regular))
label.textColor = Asset.Colors.Label.primary.color
label.text = "These are the posts gaining traction in your corner of Mastodon." // TODO: i18n
label.numberOfLines = 0
return label
}()
let closeButton: HitTestExpandedButton = {
let button = HitTestExpandedButton(type: .system)
button.setImage(UIImage(systemName: "xmark.circle.fill"), for: .normal)
button.tintColor = Asset.Colors.Label.secondary.color
return button
}()
public override init(frame: CGRect) {
super.init(frame: frame)
_init()
}
public required init?(coder: NSCoder) {
super.init(coder: coder)
_init()
}
}
extension DiscoveryIntroBannerView {
private func _init() {
preservesSuperviewLayoutMargins = true
setupAppearance(theme: ThemeService.shared.currentTheme.value)
ThemeService.shared.currentTheme
.receive(on: DispatchQueue.main)
.sink { [weak self] theme in
guard let self = self else { return }
self.setupAppearance(theme: theme)
}
.store(in: &_disposeBag)
closeButton.translatesAutoresizingMaskIntoConstraints = false
addSubview(closeButton)
NSLayoutConstraint.activate([
closeButton.topAnchor.constraint(equalTo: topAnchor, constant: 16).priority(.required - 1),
layoutMarginsGuide.trailingAnchor.constraint(equalTo: closeButton.trailingAnchor),
closeButton.heightAnchor.constraint(equalToConstant: 20).priority(.required - 1),
closeButton.widthAnchor.constraint(equalToConstant: 20).priority(.required - 1),
])
label.translatesAutoresizingMaskIntoConstraints = false
addSubview(label)
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: topAnchor, constant: 16).priority(.required - 1),
label.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor),
closeButton.leadingAnchor.constraint(equalTo: label.trailingAnchor, constant: 10),
bottomAnchor.constraint(equalTo: label.bottomAnchor, constant: 16).priority(.required - 1),
])
closeButton.addTarget(self, action: #selector(DiscoveryIntroBannerView.closeButtonDidPressed(_:)), for: .touchUpInside)
}
}
extension DiscoveryIntroBannerView {
@objc private func closeButtonDidPressed(_ sender: UIButton) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
delegate?.discoveryIntroBannerView(self, closeButtonDidPressed: sender)
}
}
extension DiscoveryIntroBannerView {
private func setupAppearance(theme: Theme) {
backgroundColor = theme.systemBackgroundColor
}
}

View File

@ -39,6 +39,8 @@ final class NotificationTimelineViewController: UIViewController, NeedsDependenc
return tableView return tableView
}() }()
let cellFrameCache = NSCache<NSNumber, NSValue>()
deinit { deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
} }
@ -122,6 +124,16 @@ extension NotificationTimelineViewController {
} }
// MARK: - CellFrameCacheContainer
extension NotificationTimelineViewController: CellFrameCacheContainer {
func keyForCache(tableView: UITableView, indexPath: IndexPath) -> NSNumber? {
guard let diffableDataSource = viewModel.diffableDataSource else { return nil }
guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return nil }
let key = NSNumber(value: item.hashValue)
return key
}
}
extension NotificationTimelineViewController { extension NotificationTimelineViewController {
@objc private func refreshControlValueChanged(_ sender: UIRefreshControl) { @objc private func refreshControlValueChanged(_ sender: UIRefreshControl) {
@ -162,6 +174,13 @@ extension NotificationTimelineViewController: UITableViewDelegate, AutoGenerateT
// sourcery:end // sourcery:end
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
guard let frame = retrieveCellFrame(tableView: tableView, indexPath: indexPath) else {
return 300
}
return ceil(frame.height)
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard let item = viewModel.diffableDataSource?.itemIdentifier(for: indexPath) else { guard let item = viewModel.diffableDataSource?.itemIdentifier(for: indexPath) else {
return return
@ -172,6 +191,10 @@ extension NotificationTimelineViewController: UITableViewDelegate, AutoGenerateT
await viewModel.loadMore(item: item) await viewModel.loadMore(item: item)
} }
} }
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cacheCellFrame(tableView: tableView, didEndDisplaying: cell, forRowAt: indexPath)
}
} }

View File

@ -12,6 +12,7 @@ import GameController
import AuthenticationServices import AuthenticationServices
import MastodonAsset import MastodonAsset
import MastodonLocalization import MastodonLocalization
import MastodonUI
final class MastodonPickServerViewController: UIViewController, NeedsDependency { final class MastodonPickServerViewController: UIViewController, NeedsDependency {
@ -144,6 +145,13 @@ extension MastodonPickServerViewController {
pickServerServerSectionTableHeaderViewDelegate: self, pickServerServerSectionTableHeaderViewDelegate: self,
pickServerCellDelegate: self pickServerCellDelegate: self
) )
KeyboardResponderService
.configure(
scrollView: tableView,
layoutNeedsUpdate: viewModel.viewDidAppear.eraseToAnyPublisher()
)
.store(in: &disposeBag)
viewModel viewModel
.selectedServer .selectedServer
@ -238,6 +246,7 @@ extension MastodonPickServerViewController {
super.viewDidAppear(animated) super.viewDidAppear(animated)
tableView.flashScrollIndicators() tableView.flashScrollIndicators()
viewModel.viewDidAppear.send()
} }
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
@ -416,28 +425,6 @@ extension MastodonPickServerViewController: UITableViewDelegate {
viewModel.selectedServer.send(nil) viewModel.selectedServer.send(nil)
} }
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard let diffableDataSource = viewModel.diffableDataSource else { return }
guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return }
switch item {
// case .categoryPicker:
// guard let cell = cell as? PickServerCategoriesCell else { return }
// guard let diffableDataSource = cell.diffableDataSource else { return }
// let snapshot = diffableDataSource.snapshot()
//
// let item = viewModel.selectCategoryItem.value
// guard let section = snapshot.indexOfSection(.main),
// let row = snapshot.indexOfItem(item) else { return }
// cell.collectionView.selectItem(at: IndexPath(item: row, section: section), animated: false, scrollPosition: .centeredHorizontally)
// case .search:
// guard let cell = cell as? PickServerSearchCell else { return }
// cell.searchTextField.text = viewModel.searchText.value
default:
break
}
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
guard let diffableDataSource = viewModel.diffableDataSource else { return nil } guard let diffableDataSource = viewModel.diffableDataSource else { return nil }
let snapshot = diffableDataSource.snapshot() let snapshot = diffableDataSource.snapshot()

View File

@ -45,7 +45,8 @@ class MastodonPickServerViewModel: NSObject {
let indexedServers = CurrentValueSubject<[Mastodon.Entity.Server], Never>([]) let indexedServers = CurrentValueSubject<[Mastodon.Entity.Server], Never>([])
let unindexedServers = CurrentValueSubject<[Mastodon.Entity.Server]?, Never>([]) // set nil when loading let unindexedServers = CurrentValueSubject<[Mastodon.Entity.Server]?, Never>([]) // set nil when loading
let viewWillAppear = PassthroughSubject<Void, Never>() let viewWillAppear = PassthroughSubject<Void, Never>()
let viewDidAppear = CurrentValueSubject<Void, Never>(Void())
// output // output
var diffableDataSource: UITableViewDiffableDataSource<PickServerSection, PickServerItem>? var diffableDataSource: UITableViewDiffableDataSource<PickServerSection, PickServerItem>?
private(set) lazy var loadIndexedServerStateMachine: GKStateMachine = { private(set) lazy var loadIndexedServerStateMachine: GKStateMachine = {

View File

@ -185,12 +185,12 @@ extension PickServerServerSectionTableHeaderView {
override func accessibilityElementCount() -> Int { override func accessibilityElementCount() -> Int {
guard let diffableDataSource = diffableDataSource else { return 0 } guard let diffableDataSource = diffableDataSource else { return 0 }
return diffableDataSource.snapshot().itemIdentifiers.count return diffableDataSource.snapshot().itemIdentifiers.count + 1
} }
override func accessibilityElement(at index: Int) -> Any? { override func accessibilityElement(at index: Int) -> Any? {
guard let item = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) else { return nil } if let item = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) { return item }
return item return searchTextField
} }
} }

View File

@ -15,7 +15,7 @@ import MastodonLocalization
final class HeightFixedSearchBar: UISearchBar { final class HeightFixedSearchBar: UISearchBar {
override var intrinsicContentSize: CGSize { override var intrinsicContentSize: CGSize {
return CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude) return CGSize(width: CGFloat.greatestFiniteMagnitude, height: 36)
} }
} }
@ -179,14 +179,14 @@ extension SearchViewController: UISearchControllerDelegate {
//extension SearchViewController: UICollectionViewDelegate { //extension SearchViewController: UICollectionViewDelegate {
// func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { // func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): select item at: \(indexPath.debugDescription)") // logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): select item at: \(indexPath.debugDescription)")
// //
// defer { // defer {
// collectionView.deselectItem(at: indexPath, animated: true) // collectionView.deselectItem(at: indexPath, animated: true)
// } // }
// //
// guard let diffableDataSource = viewModel.diffableDataSource else { return } // guard let diffableDataSource = viewModel.diffableDataSource else { return }
// guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return } // guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return }
// //
// switch item { // switch item {
// case .trend(let hashtag): // case .trend(let hashtag):
// let viewModel = HashtagTimelineViewModel(context: context, hashtag: hashtag.name) // let viewModel = HashtagTimelineViewModel(context: context, hashtag: hashtag.name)

View File

@ -62,14 +62,14 @@ extension MediaView {
{ {
let placeholder = UIImage.placeholder(color: .systemGray6) let placeholder = UIImage.placeholder(color: .systemGray6)
let request = URLRequest(url: url) let request = URLRequest(url: url)
ImageDownloader.default.download(request) { response in ImageDownloader.default.download(request, completion: { response in
switch response.result { switch response.result {
case .success(let image): case .success(let image):
configuration.previewImage = image configuration.previewImage = image
case .failure(let error): case .failure:
configuration.previewImage = placeholder configuration.previewImage = placeholder
} }
} })
} }
if let assetURL = configuration.assetURL, if let assetURL = configuration.assetURL,
@ -84,7 +84,7 @@ extension MediaView {
.store(in: &configuration.blurhashImageDisposeBag) .store(in: &configuration.blurhashImageDisposeBag)
} }
configuration.isReveal = status.sensitive ? status.isMediaSensitiveToggled : true configuration.isReveal = status.isMediaSensitive ? status.isSensitiveToggled : true
return configuration return configuration
} }

View File

@ -156,7 +156,6 @@ extension StatusView {
.map { _ in author.avatarImageURL() } .map { _ in author.avatarImageURL() }
.assign(to: \.authorAvatarImageURL, on: viewModel) .assign(to: \.authorAvatarImageURL, on: viewModel)
.store(in: &disposeBag) .store(in: &disposeBag)
// author name // author name
Publishers.CombineLatest( Publishers.CombineLatest(
author.publisher(for: \.displayName), author.publisher(for: \.displayName),
@ -268,25 +267,19 @@ extension StatusView {
.assign(to: \.visibility, on: viewModel) .assign(to: \.visibility, on: viewModel)
.store(in: &disposeBag) .store(in: &disposeBag)
// sensitive // sensitive
status.publisher(for: \.isContentSensitiveToggled) viewModel.isContentSensitive = status.isContentSensitive
.assign(to: \.isContentSensitiveToggled, on: viewModel) status.publisher(for: \.isSensitiveToggled)
.assign(to: \.isSensitiveToggled, on: viewModel)
.store(in: &disposeBag) .store(in: &disposeBag)
// viewModel.source = status.source
} }
private func configureMedia(status: Status) { private func configureMedia(status: Status) {
let status = status.reblog ?? status let status = status.reblog ?? status
viewModel.isMediaSensitive = status.sensitive && !status.attachments.isEmpty // some servers set media sensitive even empty attachments viewModel.isMediaSensitive = status.isMediaSensitive
let configurations = MediaView.configuration(status: status) let configurations = MediaView.configuration(status: status)
viewModel.mediaViewConfigurations = configurations viewModel.mediaViewConfigurations = configurations
status.publisher(for: \.isMediaSensitiveToggled)
.assign(to: \.isMediaSensitiveToggled, on: viewModel)
.store(in: &disposeBag)
} }
private func configurePoll(status: Status) { private func configurePoll(status: Status) {

View File

@ -61,7 +61,7 @@ extension StatusTableViewCell {
statusView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 16), statusView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 16),
containerViewLeadingLayoutConstraint, containerViewLeadingLayoutConstraint,
containerViewTrailingLayoutConstraint, containerViewTrailingLayoutConstraint,
statusView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), contentView.bottomAnchor.constraint(equalTo: statusView.bottomAnchor, constant: 10),
]) ])
statusView.setup(style: .inline) statusView.setup(style: .inline)
updateContainerViewMarginConstraints() updateContainerViewMarginConstraints()

View File

@ -112,7 +112,7 @@ extension StatusThreadRootTableViewCell {
statusView.statusMetricView statusView.statusMetricView
] ]
if !statusView.viewModel.isSensitive { if !statusView.viewModel.isMediaSensitive {
elements.removeAll(where: { $0 === statusView.contentSensitiveeToggleButton }) elements.removeAll(where: { $0 === statusView.contentSensitiveeToggleButton })
} }

View File

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.3.1</string> <string>1.3.1</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>110</string> <string>113</string>
<key>NSExtension</key> <key>NSExtension</key>
<dict> <dict>
<key>NSExtensionAttributes</key> <key>NSExtensionAttributes</key>

View File

@ -32,12 +32,13 @@ let package = Package(
.package(url: "https://github.com/apple/swift-nio.git", from: "1.0.0"), .package(url: "https://github.com/apple/swift-nio.git", from: "1.0.0"),
.package(url: "https://github.com/kean/Nuke.git", from: "10.3.1"), .package(url: "https://github.com/kean/Nuke.git", from: "10.3.1"),
.package(url: "https://github.com/Flipboard/FLAnimatedImage.git", from: "1.0.0"), .package(url: "https://github.com/Flipboard/FLAnimatedImage.git", from: "1.0.0"),
.package(url: "https://github.com/TwidereProject/MetaTextKit.git", .exact("2.2.1")), .package(url: "https://github.com/TwidereProject/MetaTextKit.git", .exact("2.2.2")),
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.4.0"), .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.4.0"),
.package(url: "https://github.com/Alamofire/AlamofireImage.git", from: "4.1.0"), .package(url: "https://github.com/Alamofire/AlamofireImage.git", from: "4.1.0"),
.package(name: "NukeFLAnimatedImagePlugin", url: "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", from: "8.0.0"), .package(name: "NukeFLAnimatedImagePlugin", url: "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", from: "8.0.0"),
.package(name: "UITextView+Placeholder", url: "https://github.com/MainasuK/UITextView-Placeholder.git", from: "1.4.1"), .package(name: "UITextView+Placeholder", url: "https://github.com/MainasuK/UITextView-Placeholder.git", from: "1.4.1"),
.package(name: "Introspect", url: "https://github.com/siteline/SwiftUI-Introspect.git", from: "0.1.3") .package(name: "Introspect", url: "https://github.com/siteline/SwiftUI-Introspect.git", from: "0.1.3"),
.package(name: "FaviconFinder", url: "https://github.com/will-lumley/FaviconFinder.git", from: "3.2.2"),
], ],
targets: [ targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets are the basic building blocks of a package. A target can define a module or a test suite.
@ -94,8 +95,8 @@ let package = Package(
.product(name: "Alamofire", package: "Alamofire"), .product(name: "Alamofire", package: "Alamofire"),
.product(name: "AlamofireImage", package: "AlamofireImage"), .product(name: "AlamofireImage", package: "AlamofireImage"),
.product(name: "MetaTextKit", package: "MetaTextKit"), .product(name: "MetaTextKit", package: "MetaTextKit"),
.product(name: "MastodonMeta", package: "MetaTextKit"),
.product(name: "FLAnimatedImage", package: "FLAnimatedImage"), .product(name: "FLAnimatedImage", package: "FLAnimatedImage"),
.product(name: "FaviconFinder", package: "FaviconFinder"),
] ]
), ),
.testTarget( .testTarget(

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="19574" systemVersion="21D62" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="20086" systemVersion="21E258" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<entity name="Application" representedClassName="CoreDataStack.Application" syncable="YES"> <entity name="Application" representedClassName="CoreDataStack.Application" syncable="YES">
<attribute name="identifier" optional="YES" attributeType="UUID" usesScalarValueType="NO"/> <attribute name="identifier" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
<attribute name="name" attributeType="String"/> <attribute name="name" attributeType="String"/>
@ -185,8 +185,7 @@
<attribute name="identifier" attributeType="String"/> <attribute name="identifier" attributeType="String"/>
<attribute name="inReplyToAccountID" optional="YES" attributeType="String"/> <attribute name="inReplyToAccountID" optional="YES" attributeType="String"/>
<attribute name="inReplyToID" optional="YES" attributeType="String"/> <attribute name="inReplyToID" optional="YES" attributeType="String"/>
<attribute name="isContentSensitiveToggled" transient="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/> <attribute name="isSensitiveToggled" transient="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="isMediaSensitiveToggled" transient="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="language" optional="YES" attributeType="String"/> <attribute name="language" optional="YES" attributeType="String"/>
<attribute name="mentions" optional="YES" attributeType="Binary"/> <attribute name="mentions" optional="YES" attributeType="Binary"/>
<attribute name="reblogsCount" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/> <attribute name="reblogsCount" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
@ -262,7 +261,7 @@
<element name="PrivateNote" positionX="0" positionY="0" width="128" height="89"/> <element name="PrivateNote" positionX="0" positionY="0" width="128" height="89"/>
<element name="SearchHistory" positionX="0" positionY="0" width="128" height="149"/> <element name="SearchHistory" positionX="0" positionY="0" width="128" height="149"/>
<element name="Setting" positionX="72" positionY="162" width="128" height="164"/> <element name="Setting" positionX="72" positionY="162" width="128" height="164"/>
<element name="Status" positionX="0" positionY="0" width="128" height="629"/> <element name="Status" positionX="0" positionY="0" width="128" height="614"/>
<element name="Subscription" positionX="81" positionY="171" width="128" height="179"/> <element name="Subscription" positionX="81" positionY="171" width="128" height="179"/>
<element name="SubscriptionAlerts" positionX="72" positionY="162" width="128" height="164"/> <element name="SubscriptionAlerts" positionX="72" positionY="162" width="128" height="164"/>
<element name="Tag" positionX="0" positionY="0" width="128" height="149"/> <element name="Tag" positionX="0" positionY="0" width="128" height="149"/>

View File

@ -42,9 +42,7 @@ public final class Status: NSManagedObject {
@NSManaged public private(set) var spoilerText: String? @NSManaged public private(set) var spoilerText: String?
// sourcery: autoUpdatableObject // sourcery: autoUpdatableObject
@NSManaged public private(set) var isContentSensitiveToggled: Bool @NSManaged public private(set) var isSensitiveToggled: Bool
// sourcery: autoUpdatableObject
@NSManaged public private(set) var isMediaSensitiveToggled: Bool
@NSManaged public private(set) var application: Application? @NSManaged public private(set) var application: Application?
@ -432,14 +430,9 @@ extension Status: AutoUpdatableObject {
self.spoilerText = spoilerText self.spoilerText = spoilerText
} }
} }
public func update(isContentSensitiveToggled: Bool) { public func update(isSensitiveToggled: Bool) {
if self.isContentSensitiveToggled != isContentSensitiveToggled { if self.isSensitiveToggled != isSensitiveToggled {
self.isContentSensitiveToggled = isContentSensitiveToggled self.isSensitiveToggled = isSensitiveToggled
}
}
public func update(isMediaSensitiveToggled: Bool) {
if self.isMediaSensitiveToggled != isMediaSensitiveToggled {
self.isMediaSensitiveToggled = isMediaSensitiveToggled
} }
} }
public func update(reblogsCount: Int64) { public func update(reblogsCount: Int64) {

View File

@ -0,0 +1,19 @@
//
// Preference+Discovery.swift
//
//
// Created by MainasuK on 2022-4-19.
//
import Foundation
extension UserDefaults {
@objc public dynamic var discoveryIntroBannerNeedsHidden: Bool {
get {
return bool(forKey: #function)
}
set { self[#function] = newValue }
}
}

View File

@ -543,6 +543,18 @@ public enum L10n {
public static let title = L10n.tr("Localizable", "Scene.ConfirmEmail.OpenEmailApp.Title") public static let title = L10n.tr("Localizable", "Scene.ConfirmEmail.OpenEmailApp.Title")
} }
} }
public enum Discovery {
public enum Tabs {
/// For You
public static let forYou = L10n.tr("Localizable", "Scene.Discovery.Tabs.ForYou")
/// Hashtags
public static let hashtags = L10n.tr("Localizable", "Scene.Discovery.Tabs.Hashtags")
/// News
public static let news = L10n.tr("Localizable", "Scene.Discovery.Tabs.News")
/// Posts
public static let posts = L10n.tr("Localizable", "Scene.Discovery.Tabs.Posts")
}
}
public enum Favorite { public enum Favorite {
/// Your Favorites /// Your Favorites
public static let title = L10n.tr("Localizable", "Scene.Favorite.Title") public static let title = L10n.tr("Localizable", "Scene.Favorite.Title")

View File

@ -201,6 +201,10 @@
"Scene.ConfirmEmail.Subtitle" = "لقد أرسلنا للتو بريد إلكتروني إلى %@، "Scene.ConfirmEmail.Subtitle" = "لقد أرسلنا للتو بريد إلكتروني إلى %@،
انقر على الرابط لتأكيد حسابك."; انقر على الرابط لتأكيد حسابك.";
"Scene.ConfirmEmail.Title" = "شيءٌ أخير."; "Scene.ConfirmEmail.Title" = "شيءٌ أخير.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "الوسوم";
"Scene.Discovery.Tabs.News" = "الأخبار";
"Scene.Discovery.Tabs.Posts" = "المنشورات";
"Scene.Favorite.Title" = "مُفضَّلَتُك"; "Scene.Favorite.Title" = "مُفضَّلَتُك";
"Scene.Follower.Footer" = "لا يُمكِن عَرض المُتابِعين مِنَ الخوادم الأُخرى."; "Scene.Follower.Footer" = "لا يُمكِن عَرض المُتابِعين مِنَ الخوادم الأُخرى.";
"Scene.Following.Footer" = "لا يُمكِن عَرض المُتابَعات مِنَ الخوادم الأُخرى."; "Scene.Following.Footer" = "لا يُمكِن عَرض المُتابَعات مِنَ الخوادم الأُخرى.";

View File

@ -471,15 +471,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ سنة</string> <string>مُنذُ %ldع</string>
<key>two</key> <key>two</key>
<string>مُنذُ سنتين</string> <string>مُنذُ %ldع</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld سنين</string> <string>مُنذُ %ldع</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld سنةً</string> <string>مُنذُ %ldع</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld سنة</string> <string>مُنذُ %ldع</string>
</dict> </dict>
</dict> </dict>
<key>date.month.ago.abbr</key> <key>date.month.ago.abbr</key>
@ -495,15 +495,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ شهر</string> <string>مُنذُ %ldش</string>
<key>two</key> <key>two</key>
<string>مُنذُ شهرين</string> <string>مُنذُ %ldش</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld أشهُر</string> <string>مُنذُ %ldش</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld شهرًا</string> <string>مُنذُ %ldش</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld شهر</string> <string>مُنذُ %ldش</string>
</dict> </dict>
</dict> </dict>
<key>date.day.ago.abbr</key> <key>date.day.ago.abbr</key>
@ -519,15 +519,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ يوم</string> <string>مُنذُ %ldي</string>
<key>two</key> <key>two</key>
<string>مُنذُ يومين</string> <string>مُنذُ %ldي</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld أيام</string> <string>مُنذُ %ldي</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld يومًا</string> <string>مُنذُ %ldي</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld يوم</string> <string>مُنذُ %ldي</string>
</dict> </dict>
</dict> </dict>
<key>date.hour.ago.abbr</key> <key>date.hour.ago.abbr</key>
@ -543,15 +543,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ ساعة</string> <string>مُنذُ %ldس</string>
<key>two</key> <key>two</key>
<string>مُنذُ ساعتين</string> <string>مُنذُ %ldس</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld ساعات</string> <string>مُنذُ %ldس</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld ساعةًَ</string> <string>مُنذُ %ldس</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld ساعة</string> <string>مُنذُ %ldس</string>
</dict> </dict>
</dict> </dict>
<key>date.minute.ago.abbr</key> <key>date.minute.ago.abbr</key>
@ -567,15 +567,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ دقيقة</string> <string>مُنذُ %ldد</string>
<key>two</key> <key>two</key>
<string>مُنذُ دقيقتان</string> <string>مُنذُ %ldد</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld دقائق</string> <string>مُنذُ %ldد</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld دقيقةً</string> <string>مُنذُ %ldد</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld دقيقة</string> <string>مُنذُ %ldد</string>
</dict> </dict>
</dict> </dict>
<key>date.second.ago.abbr</key> <key>date.second.ago.abbr</key>
@ -591,15 +591,15 @@
<key>zero</key> <key>zero</key>
<string>مُنذُ لَحظة</string> <string>مُنذُ لَحظة</string>
<key>one</key> <key>one</key>
<string>مُنذُ ثانية</string> <string>مُنذُ %ldث</string>
<key>two</key> <key>two</key>
<string>مُنذُ ثانيتين</string> <string>مُنذُ %ldث</string>
<key>few</key> <key>few</key>
<string>مُنذُ %ld ثوان</string> <string>مُنذُ %ldث</string>
<key>many</key> <key>many</key>
<string>مُنذُ %ld ثانية</string> <string>مُنذُ %ldث</string>
<key>other</key> <key>other</key>
<string>مُنذُ %ld ثانية</string> <string>مُنذُ %ldث</string>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -5,7 +5,7 @@
"Common.Alerts.Common.PleaseTryAgain" = "Si us plau intenta-ho de nou."; "Common.Alerts.Common.PleaseTryAgain" = "Si us plau intenta-ho de nou.";
"Common.Alerts.Common.PleaseTryAgainLater" = "Si us plau, prova-ho més tard."; "Common.Alerts.Common.PleaseTryAgainLater" = "Si us plau, prova-ho més tard.";
"Common.Alerts.DeletePost.Message" = "Estàs segur que vols suprimir aquesta publicació?"; "Common.Alerts.DeletePost.Message" = "Estàs segur que vols suprimir aquesta publicació?";
"Common.Alerts.DeletePost.Title" = "Estàs segur que vols suprimir aquesta publicació?"; "Common.Alerts.DeletePost.Title" = "Esborrar Publicació";
"Common.Alerts.DiscardPostContent.Message" = "Confirma per a descartar el contingut de la publicació composta."; "Common.Alerts.DiscardPostContent.Message" = "Confirma per a descartar el contingut de la publicació composta.";
"Common.Alerts.DiscardPostContent.Title" = "Descarta l'esborrany"; "Common.Alerts.DiscardPostContent.Title" = "Descarta l'esborrany";
"Common.Alerts.EditProfileFailure.Message" = "No es pot editar el perfil. Si us plau torna-ho a provar."; "Common.Alerts.EditProfileFailure.Message" = "No es pot editar el perfil. Si us plau torna-ho a provar.";
@ -16,7 +16,7 @@
Comprova la teva connexió a Internet."; Comprova la teva connexió a Internet.";
"Common.Alerts.PublishPostFailure.Title" = "Error de Publicació"; "Common.Alerts.PublishPostFailure.Title" = "Error de Publicació";
"Common.Alerts.SavePhotoFailure.Message" = "Activa el permís d'accés a la biblioteca de fotos per desar-la."; "Common.Alerts.SavePhotoFailure.Message" = "Activa el permís d'accés a la biblioteca de fotos per desar-la.";
"Common.Alerts.SavePhotoFailure.Title" = "Desa l'Error de la Foto"; "Common.Alerts.SavePhotoFailure.Title" = "Error al Desar la Foto";
"Common.Alerts.ServerError.Title" = "Error del Servidor"; "Common.Alerts.ServerError.Title" = "Error del Servidor";
"Common.Alerts.SignOut.Confirm" = "Tancar Sessió"; "Common.Alerts.SignOut.Confirm" = "Tancar Sessió";
"Common.Alerts.SignOut.Message" = "Estàs segur que vols tancar la sessió?"; "Common.Alerts.SignOut.Message" = "Estàs segur que vols tancar la sessió?";
@ -36,7 +36,7 @@ Comprova la teva connexió a Internet.";
"Common.Controls.Actions.Discard" = "Descarta"; "Common.Controls.Actions.Discard" = "Descarta";
"Common.Controls.Actions.Done" = "Fet"; "Common.Controls.Actions.Done" = "Fet";
"Common.Controls.Actions.Edit" = "Edita"; "Common.Controls.Actions.Edit" = "Edita";
"Common.Controls.Actions.FindPeople" = "Busca persones per seguir"; "Common.Controls.Actions.FindPeople" = "Busca persones a seguir";
"Common.Controls.Actions.ManuallySearch" = "Cerca manualment a canvi"; "Common.Controls.Actions.ManuallySearch" = "Cerca manualment a canvi";
"Common.Controls.Actions.Next" = "Següent"; "Common.Controls.Actions.Next" = "Següent";
"Common.Controls.Actions.Ok" = "D'acord"; "Common.Controls.Actions.Ok" = "D'acord";
@ -81,18 +81,18 @@ Comprova la teva connexió a Internet.";
"Common.Controls.Keyboard.Common.OpenSettings" = "Obre la configuració"; "Common.Controls.Keyboard.Common.OpenSettings" = "Obre la configuració";
"Common.Controls.Keyboard.Common.ShowFavorites" = "Mostra els Favorits"; "Common.Controls.Keyboard.Common.ShowFavorites" = "Mostra els Favorits";
"Common.Controls.Keyboard.Common.SwitchToTab" = "Canviar a %@"; "Common.Controls.Keyboard.Common.SwitchToTab" = "Canviar a %@";
"Common.Controls.Keyboard.SegmentedControl.NextSection" = "Secció següent"; "Common.Controls.Keyboard.SegmentedControl.NextSection" = "Secció Següent";
"Common.Controls.Keyboard.SegmentedControl.PreviousSection" = "Secció anterior"; "Common.Controls.Keyboard.SegmentedControl.PreviousSection" = "Secció Anterior";
"Common.Controls.Keyboard.Timeline.NextStatus" = "Publicació següent"; "Common.Controls.Keyboard.Timeline.NextStatus" = "Publicació següent";
"Common.Controls.Keyboard.Timeline.OpenAuthorProfile" = "Obre el perfil de l'autor"; "Common.Controls.Keyboard.Timeline.OpenAuthorProfile" = "Obre el Perfil de l'Autor";
"Common.Controls.Keyboard.Timeline.OpenRebloggerProfile" = "Obre el perfil del impulsor"; "Common.Controls.Keyboard.Timeline.OpenRebloggerProfile" = "Obre el Perfil del Impulsor";
"Common.Controls.Keyboard.Timeline.OpenStatus" = "Obre la publicació"; "Common.Controls.Keyboard.Timeline.OpenStatus" = "Obre la publicació";
"Common.Controls.Keyboard.Timeline.PreviewImage" = "Vista prèvia de l'Imatge"; "Common.Controls.Keyboard.Timeline.PreviewImage" = "Vista prèvia de l'Imatge";
"Common.Controls.Keyboard.Timeline.PreviousStatus" = "Publicació anterior"; "Common.Controls.Keyboard.Timeline.PreviousStatus" = "Publicació anterior";
"Common.Controls.Keyboard.Timeline.ReplyStatus" = "Respon a la publicació"; "Common.Controls.Keyboard.Timeline.ReplyStatus" = "Respon a la Publicació";
"Common.Controls.Keyboard.Timeline.ToggleContentWarning" = "Commuta l'Avís de Contingut"; "Common.Controls.Keyboard.Timeline.ToggleContentWarning" = "Commuta l'Avís de Contingut";
"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Commuta el Favorit de la publicació"; "Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Commuta el Favorit de la Publicació";
"Common.Controls.Keyboard.Timeline.ToggleReblog" = "Commuta l'impuls de la publicació"; "Common.Controls.Keyboard.Timeline.ToggleReblog" = "Commuta l'Impuls de la Publicació";
"Common.Controls.Status.Actions.Favorite" = "Favorit"; "Common.Controls.Status.Actions.Favorite" = "Favorit";
"Common.Controls.Status.Actions.Hide" = "Amaga"; "Common.Controls.Status.Actions.Hide" = "Amaga";
"Common.Controls.Status.Actions.Menu" = "Menú"; "Common.Controls.Status.Actions.Menu" = "Menú";
@ -105,10 +105,10 @@ Comprova la teva connexió a Internet.";
"Common.Controls.Status.Actions.Unfavorite" = "Desfer Favorit"; "Common.Controls.Status.Actions.Unfavorite" = "Desfer Favorit";
"Common.Controls.Status.Actions.Unreblog" = "Desfer l'impuls"; "Common.Controls.Status.Actions.Unreblog" = "Desfer l'impuls";
"Common.Controls.Status.ContentWarning" = "Advertència de Contingut"; "Common.Controls.Status.ContentWarning" = "Advertència de Contingut";
"Common.Controls.Status.MediaContentWarning" = "Toca qualsevol lloc per mostrar"; "Common.Controls.Status.MediaContentWarning" = "Toca qualsevol lloc per a mostrar";
"Common.Controls.Status.Poll.Closed" = "Finalitzada"; "Common.Controls.Status.Poll.Closed" = "Finalitzada";
"Common.Controls.Status.Poll.Vote" = "Vota"; "Common.Controls.Status.Poll.Vote" = "Vota";
"Common.Controls.Status.ShowPost" = "Mostra la publicació"; "Common.Controls.Status.ShowPost" = "Mostra la Publicació";
"Common.Controls.Status.ShowUserProfile" = "Mostra el perfil de l'usuari"; "Common.Controls.Status.ShowUserProfile" = "Mostra el perfil de l'usuari";
"Common.Controls.Status.Tag.Email" = "Correu electrònic"; "Common.Controls.Status.Tag.Email" = "Correu electrònic";
"Common.Controls.Status.Tag.Emoji" = "Emoji"; "Common.Controls.Status.Tag.Emoji" = "Emoji";
@ -129,7 +129,7 @@ Comprova la teva connexió a Internet.";
"Common.Controls.Tabs.Search" = "Cerca"; "Common.Controls.Tabs.Search" = "Cerca";
"Common.Controls.Timeline.Filtered" = "Filtrat"; "Common.Controls.Timeline.Filtered" = "Filtrat";
"Common.Controls.Timeline.Header.BlockedWarning" = "No pots veure el perfil d'aquest usuari "Common.Controls.Timeline.Header.BlockedWarning" = "No pots veure el perfil d'aquest usuari
fins que et desbloquegi."; fins que et desbloquegi.";
"Common.Controls.Timeline.Header.BlockingWarning" = "No pots veure el perfil d'aquest usuari "Common.Controls.Timeline.Header.BlockingWarning" = "No pots veure el perfil d'aquest usuari
fins que el desbloquegis. fins que el desbloquegis.
El teu perfil els sembla així."; El teu perfil els sembla així.";
@ -141,8 +141,8 @@ El teu perfil els sembla així.";
fins que el desbloquegis. fins que el desbloquegis.
El teu perfil els sembla així."; El teu perfil els sembla així.";
"Common.Controls.Timeline.Header.UserSuspendedWarning" = "El compte de %@ ha estat suspès."; "Common.Controls.Timeline.Header.UserSuspendedWarning" = "El compte de %@ ha estat suspès.";
"Common.Controls.Timeline.Loader.LoadMissingPosts" = "Carrega les publicacions que falten"; "Common.Controls.Timeline.Loader.LoadMissingPosts" = "Carrega les publicacions faltants";
"Common.Controls.Timeline.Loader.LoadingMissingPosts" = "Carregant les publicacions que falten..."; "Common.Controls.Timeline.Loader.LoadingMissingPosts" = "Carregant les publicacions faltants...";
"Common.Controls.Timeline.Loader.ShowMoreReplies" = "Mostra més respostes"; "Common.Controls.Timeline.Loader.ShowMoreReplies" = "Mostra més respostes";
"Common.Controls.Timeline.Timestamp.Now" = "Ara"; "Common.Controls.Timeline.Timestamp.Now" = "Ara";
"Scene.AccountList.AddAccount" = "Afegir compte"; "Scene.AccountList.AddAccount" = "Afegir compte";
@ -198,9 +198,12 @@ carregat a Mastodon.";
"Scene.ConfirmEmail.OpenEmailApp.Mail" = "Correu electrònic"; "Scene.ConfirmEmail.OpenEmailApp.Mail" = "Correu electrònic";
"Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Obre el Client de Correu electrònic"; "Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Obre el Client de Correu electrònic";
"Scene.ConfirmEmail.OpenEmailApp.Title" = "Comprova la teva safata d'entrada."; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Comprova la teva safata d'entrada.";
"Scene.ConfirmEmail.Subtitle" = "Acabem d'enviar un correu electrònic a %@, "Scene.ConfirmEmail.Subtitle" = "Toca l'enllaç del correu electrònic que t'hem enviat per a confirmar el teu compte.";
toca l'enllaç per a confirmar el teu compte.";
"Scene.ConfirmEmail.Title" = "Una última cosa."; "Scene.ConfirmEmail.Title" = "Una última cosa.";
"Scene.Discovery.Tabs.ForYou" = "Per a tu";
"Scene.Discovery.Tabs.Hashtags" = "Etiquetes";
"Scene.Discovery.Tabs.News" = "Notícies";
"Scene.Discovery.Tabs.Posts" = "Publicacions";
"Scene.Favorite.Title" = "Els teus Favorits"; "Scene.Favorite.Title" = "Els teus Favorits";
"Scene.Follower.Footer" = "Els seguidors d'altres servidors no son mostrats."; "Scene.Follower.Footer" = "Els seguidors d'altres servidors no son mostrats.";
"Scene.Following.Footer" = "Els seguits d'altres servidors no son mostrats."; "Scene.Following.Footer" = "Els seguits d'altres servidors no son mostrats.";
@ -263,7 +266,7 @@ toca l'enllaç per a confirmar el teu compte.";
"Scene.Register.Error.Reason.Unreachable" = "%@ sembla que no existeix"; "Scene.Register.Error.Reason.Unreachable" = "%@ sembla que no existeix";
"Scene.Register.Error.Special.EmailInvalid" = "Aquesta no és una adreça de correu electrònic vàlida"; "Scene.Register.Error.Special.EmailInvalid" = "Aquesta no és una adreça de correu electrònic vàlida";
"Scene.Register.Error.Special.PasswordTooShort" = "La contrasenya és massa curta (ha de tenir 8 caràcters com a mínim)"; "Scene.Register.Error.Special.PasswordTooShort" = "La contrasenya és massa curta (ha de tenir 8 caràcters com a mínim)";
"Scene.Register.Error.Special.UsernameInvalid" = "El nom d'usuari només ha de contenir caràcters alfanumèrics i guions baixos"; "Scene.Register.Error.Special.UsernameInvalid" = "El nom d'usuari ha de contenir només caràcters alfanumèrics i guions baixos";
"Scene.Register.Error.Special.UsernameTooLong" = "El nom d'usuari és massa llarg (no pot ser més llarg de 30 caràcters)"; "Scene.Register.Error.Special.UsernameTooLong" = "El nom d'usuari és massa llarg (no pot ser més llarg de 30 caràcters)";
"Scene.Register.Input.Avatar.Delete" = "Suprimeix"; "Scene.Register.Input.Avatar.Delete" = "Suprimeix";
"Scene.Register.Input.DisplayName.Placeholder" = "nom visible"; "Scene.Register.Input.DisplayName.Placeholder" = "nom visible";
@ -272,7 +275,7 @@ toca l'enllaç per a confirmar el teu compte.";
"Scene.Register.Input.Password.Accessibility.Checked" = "verificat"; "Scene.Register.Input.Password.Accessibility.Checked" = "verificat";
"Scene.Register.Input.Password.Accessibility.Unchecked" = "no verificat"; "Scene.Register.Input.Password.Accessibility.Unchecked" = "no verificat";
"Scene.Register.Input.Password.CharacterLimit" = "8 caràcters"; "Scene.Register.Input.Password.CharacterLimit" = "8 caràcters";
"Scene.Register.Input.Password.Hint" = "La teva contrasenya ha de tenir com a mínim buit caràcters"; "Scene.Register.Input.Password.Hint" = "La teva contrasenya ha de tenir com a mínim vuit caràcters";
"Scene.Register.Input.Password.Placeholder" = "contrasenya"; "Scene.Register.Input.Password.Placeholder" = "contrasenya";
"Scene.Register.Input.Password.Require" = "La teva contrasenya com a mínim necessita:"; "Scene.Register.Input.Password.Require" = "La teva contrasenya com a mínim necessita:";
"Scene.Register.Input.Username.DuplicatePrompt" = "Aquest nom d'usuari ja està en ús."; "Scene.Register.Input.Username.DuplicatePrompt" = "Aquest nom d'usuari ja està en ús.";
@ -331,8 +334,7 @@ toca l'enllaç per a confirmar el teu compte.";
"Scene.ServerPicker.Label.Users" = "USUARIS"; "Scene.ServerPicker.Label.Users" = "USUARIS";
"Scene.ServerPicker.Subtitle" = "Tria una comunitat segons els teus interessos, regió o una de propòsit general."; "Scene.ServerPicker.Subtitle" = "Tria una comunitat segons els teus interessos, regió o una de propòsit general.";
"Scene.ServerPicker.SubtitleExtend" = "Tria una comunitat segons els teus interessos, regió o una de propòsit general. Cada comunitat és operada per una organització totalment independent o individualment."; "Scene.ServerPicker.SubtitleExtend" = "Tria una comunitat segons els teus interessos, regió o una de propòsit general. Cada comunitat és operada per una organització totalment independent o individualment.";
"Scene.ServerPicker.Title" = "Tria un servidor, "Scene.ServerPicker.Title" = "Mastodon està fet d'usuaris en diferents comunitats.";
qualsevol servidor.";
"Scene.ServerRules.Button.Confirm" = "Hi estic d'acord"; "Scene.ServerRules.Button.Confirm" = "Hi estic d'acord";
"Scene.ServerRules.PrivacyPolicy" = "política de privadesa"; "Scene.ServerRules.PrivacyPolicy" = "política de privadesa";
"Scene.ServerRules.Prompt" = "Al continuar, estàs subjecte als termes de servei i a la política de privacitat de %@."; "Scene.ServerRules.Prompt" = "Al continuar, estàs subjecte als termes de servei i a la política de privacitat de %@.";
@ -362,7 +364,7 @@ qualsevol servidor.";
"Scene.Settings.Section.Notifications.Trigger.Anyone" = "algú"; "Scene.Settings.Section.Notifications.Trigger.Anyone" = "algú";
"Scene.Settings.Section.Notifications.Trigger.Follow" = "a qualsevol que segueixi"; "Scene.Settings.Section.Notifications.Trigger.Follow" = "a qualsevol que segueixi";
"Scene.Settings.Section.Notifications.Trigger.Follower" = "un seguidor"; "Scene.Settings.Section.Notifications.Trigger.Follower" = "un seguidor";
"Scene.Settings.Section.Notifications.Trigger.Noone" = "algú"; "Scene.Settings.Section.Notifications.Trigger.Noone" = "ningú";
"Scene.Settings.Section.Notifications.Trigger.Title" = "Notifica'm quan"; "Scene.Settings.Section.Notifications.Trigger.Title" = "Notifica'm quan";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Desactiva avatars animats"; "Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Desactiva avatars animats";
"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Desactiva emojis animats"; "Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Desactiva emojis animats";

View File

@ -98,10 +98,10 @@ Bitte überprüfe deine Internetverbindung.";
"Common.Controls.Status.Actions.Menu" = "Menü"; "Common.Controls.Status.Actions.Menu" = "Menü";
"Common.Controls.Status.Actions.Reblog" = "Teilen"; "Common.Controls.Status.Actions.Reblog" = "Teilen";
"Common.Controls.Status.Actions.Reply" = "Antworten"; "Common.Controls.Status.Actions.Reply" = "Antworten";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF"; "Common.Controls.Status.Actions.ShowGif" = "GIF anzeigen";
"Common.Controls.Status.Actions.ShowImage" = "Show image"; "Common.Controls.Status.Actions.ShowImage" = "Bild anzeigen";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Zeige Video-Player";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu"; "Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Halte gedrückt um das Menü anzuzeigen";
"Common.Controls.Status.Actions.Unfavorite" = "Aus Favoriten entfernen"; "Common.Controls.Status.Actions.Unfavorite" = "Aus Favoriten entfernen";
"Common.Controls.Status.Actions.Unreblog" = "Nicht mehr teilen"; "Common.Controls.Status.Actions.Unreblog" = "Nicht mehr teilen";
"Common.Controls.Status.ContentWarning" = "Inhaltswarnung"; "Common.Controls.Status.ContentWarning" = "Inhaltswarnung";
@ -116,7 +116,7 @@ Bitte überprüfe deine Internetverbindung.";
"Common.Controls.Status.Tag.Link" = "Link"; "Common.Controls.Status.Tag.Link" = "Link";
"Common.Controls.Status.Tag.Mention" = "Erwähnung"; "Common.Controls.Status.Tag.Mention" = "Erwähnung";
"Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.Tag.Url" = "URL";
"Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.TapToReveal" = "Zum Anzeigen tippen";
"Common.Controls.Status.UserReblogged" = "%@ teilte"; "Common.Controls.Status.UserReblogged" = "%@ teilte";
"Common.Controls.Status.UserRepliedTo" = "Antwortet auf %@"; "Common.Controls.Status.UserRepliedTo" = "Antwortet auf %@";
"Common.Controls.Status.Visibility.Direct" = "Nur erwähnte Benutzer können diesen Beitrag sehen."; "Common.Controls.Status.Visibility.Direct" = "Nur erwähnte Benutzer können diesen Beitrag sehen.";
@ -201,6 +201,10 @@ kann nicht auf Mastodon hochgeladen werden.";
"Scene.ConfirmEmail.Subtitle" = "Wir haben gerade eine E-Mail an %@ gesendet, "Scene.ConfirmEmail.Subtitle" = "Wir haben gerade eine E-Mail an %@ gesendet,
tippe darin auf den Link, um Dein Konto zu bestätigen."; tippe darin auf den Link, um Dein Konto zu bestätigen.";
"Scene.ConfirmEmail.Title" = "Noch eine letzte Sache."; "Scene.ConfirmEmail.Title" = "Noch eine letzte Sache.";
"Scene.Discovery.Tabs.ForYou" = "Für dich";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "Nachrichten";
"Scene.Discovery.Tabs.Posts" = "Beiträge";
"Scene.Favorite.Title" = "Deine Favoriten"; "Scene.Favorite.Title" = "Deine Favoriten";
"Scene.Follower.Footer" = "Follower von anderen Servern werden nicht angezeigt."; "Scene.Follower.Footer" = "Follower von anderen Servern werden nicht angezeigt.";
"Scene.Following.Footer" = "Wem das Konto folgt wird von anderen Servern werden nicht angezeigt."; "Scene.Following.Footer" = "Wem das Konto folgt wird von anderen Servern werden nicht angezeigt.";
@ -222,10 +226,10 @@ tippe darin auf den Link, um Dein Konto zu bestätigen.";
"Scene.Preview.Keyboard.ClosePreview" = "Vorschau schließen"; "Scene.Preview.Keyboard.ClosePreview" = "Vorschau schließen";
"Scene.Preview.Keyboard.ShowNext" = "Nächstes anzeigen"; "Scene.Preview.Keyboard.ShowNext" = "Nächstes anzeigen";
"Scene.Preview.Keyboard.ShowPrevious" = "Vorheriges anzeigen"; "Scene.Preview.Keyboard.ShowPrevious" = "Vorheriges anzeigen";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list"; "Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Doppeltippen, um die Liste zu öffnen";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.EditAvatarImage" = "Profilbild bearbeiten";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Profilbild anzeigen";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Bannerbild anzeigen";
"Scene.Profile.Dashboard.Followers" = "Folger"; "Scene.Profile.Dashboard.Followers" = "Folger";
"Scene.Profile.Dashboard.Following" = "Gefolgte"; "Scene.Profile.Dashboard.Following" = "Gefolgte";
"Scene.Profile.Dashboard.Posts" = "Beiträge"; "Scene.Profile.Dashboard.Posts" = "Beiträge";
@ -366,7 +370,7 @@ beliebigen Server.";
"Scene.Settings.Section.Notifications.Trigger.Title" = "Benachrichtige mich, wenn"; "Scene.Settings.Section.Notifications.Trigger.Title" = "Benachrichtige mich, wenn";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Animierte Profilbilder deaktivieren"; "Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Animierte Profilbilder deaktivieren";
"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Animierte Emojis deaktivieren"; "Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Animierte Emojis deaktivieren";
"Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Open links in Mastodon"; "Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Links in Mastodon öffnen";
"Scene.Settings.Section.Preference.Title" = "Präferenzen"; "Scene.Settings.Section.Preference.Title" = "Präferenzen";
"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Vollständig dunkler Dunkelmodus"; "Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Vollständig dunkler Dunkelmodus";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Standardbrowser zum Öffnen von Links verwenden"; "Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Standardbrowser zum Öffnen von Links verwenden";

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>1 Antwort</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld Antworten</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -200,6 +200,10 @@ uploaded to Mastodon.";
"Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox.";
"Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account."; "Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account.";
"Scene.ConfirmEmail.Title" = "One last thing."; "Scene.ConfirmEmail.Title" = "One last thing.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Your Favorites"; "Scene.Favorite.Title" = "Your Favorites";
"Scene.Follower.Footer" = "Followers from other servers are not displayed."; "Scene.Follower.Footer" = "Followers from other servers are not displayed.";
"Scene.Following.Footer" = "Follows from other servers are not displayed."; "Scene.Following.Footer" = "Follows from other servers are not displayed.";

View File

@ -5,7 +5,7 @@
"Common.Alerts.Common.PleaseTryAgain" = "Por favor, intentá de nuevo."; "Common.Alerts.Common.PleaseTryAgain" = "Por favor, intentá de nuevo.";
"Common.Alerts.Common.PleaseTryAgainLater" = "Por favor, intentá de nuevo más tarde."; "Common.Alerts.Common.PleaseTryAgainLater" = "Por favor, intentá de nuevo más tarde.";
"Common.Alerts.DeletePost.Message" = "¿Estás seguro que querés eliminar este mensaje?"; "Common.Alerts.DeletePost.Message" = "¿Estás seguro que querés eliminar este mensaje?";
"Common.Alerts.DeletePost.Title" = "¿Estás seguro que querés eliminar este mensaje?"; "Common.Alerts.DeletePost.Title" = "Eliminar mensaje";
"Common.Alerts.DiscardPostContent.Message" = "Confirmá para descartar el contenido del mensaje redactado."; "Common.Alerts.DiscardPostContent.Message" = "Confirmá para descartar el contenido del mensaje redactado.";
"Common.Alerts.DiscardPostContent.Title" = "Descartar borrador"; "Common.Alerts.DiscardPostContent.Title" = "Descartar borrador";
"Common.Alerts.EditProfileFailure.Message" = "No se pudo editar el perfil. Por favor, intentá de nuevo."; "Common.Alerts.EditProfileFailure.Message" = "No se pudo editar el perfil. Por favor, intentá de nuevo.";
@ -201,6 +201,10 @@ y no se puede subir a Mastodon.";
"Scene.ConfirmEmail.Subtitle" = "Acabamos de enviar un correo electrónico a %@, "Scene.ConfirmEmail.Subtitle" = "Acabamos de enviar un correo electrónico a %@,
pulsá en el enlace para confirmar tu cuenta."; pulsá en el enlace para confirmar tu cuenta.";
"Scene.ConfirmEmail.Title" = "Una última cosa."; "Scene.ConfirmEmail.Title" = "Una última cosa.";
"Scene.Discovery.Tabs.ForYou" = "Para vos";
"Scene.Discovery.Tabs.Hashtags" = "Etiquetas";
"Scene.Discovery.Tabs.News" = "Novedades";
"Scene.Discovery.Tabs.Posts" = "Mensajes";
"Scene.Favorite.Title" = "Tus favoritos"; "Scene.Favorite.Title" = "Tus favoritos";
"Scene.Follower.Footer" = "No se muestran los seguidores de otros servidores."; "Scene.Follower.Footer" = "No se muestran los seguidores de otros servidores.";
"Scene.Following.Footer" = "No se muestran las cuentas de otros servidores que seguís."; "Scene.Following.Footer" = "No se muestran las cuentas de otros servidores que seguís.";

View File

@ -201,6 +201,10 @@ subirse a Mastodon.";
"Scene.ConfirmEmail.Subtitle" = "Te acabamos de enviar un correo a %@, "Scene.ConfirmEmail.Subtitle" = "Te acabamos de enviar un correo a %@,
pulsa en el enlace para confirmar tu cuenta."; pulsa en el enlace para confirmar tu cuenta.";
"Scene.ConfirmEmail.Title" = "Una última cosa."; "Scene.ConfirmEmail.Title" = "Una última cosa.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Tus Favoritos"; "Scene.Favorite.Title" = "Tus Favoritos";
"Scene.Follower.Footer" = "No se muestran los seguidores de otros servidores."; "Scene.Follower.Footer" = "No se muestran los seguidores de otros servidores.";
"Scene.Following.Footer" = "No se muestran los seguidos de otros servidores."; "Scene.Following.Footer" = "No se muestran los seguidos de otros servidores.";

View File

@ -98,10 +98,10 @@ Egiaztatu Interneteko konexioa.";
"Common.Controls.Status.Actions.Menu" = "Menua"; "Common.Controls.Status.Actions.Menu" = "Menua";
"Common.Controls.Status.Actions.Reblog" = "Bultzada"; "Common.Controls.Status.Actions.Reblog" = "Bultzada";
"Common.Controls.Status.Actions.Reply" = "Erantzun"; "Common.Controls.Status.Actions.Reply" = "Erantzun";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF"; "Common.Controls.Status.Actions.ShowGif" = "Erakutsi GIFa";
"Common.Controls.Status.Actions.ShowImage" = "Show image"; "Common.Controls.Status.Actions.ShowImage" = "Erakutsi irudia";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Erakutsi bideo-erreproduzigailua";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu"; "Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Sakatu eta eutsi menua erakusteko";
"Common.Controls.Status.Actions.Unfavorite" = "Kendu gogokoa"; "Common.Controls.Status.Actions.Unfavorite" = "Kendu gogokoa";
"Common.Controls.Status.Actions.Unreblog" = "Desegin bultzada"; "Common.Controls.Status.Actions.Unreblog" = "Desegin bultzada";
"Common.Controls.Status.ContentWarning" = "Edukiaren abisua"; "Common.Controls.Status.ContentWarning" = "Edukiaren abisua";
@ -116,7 +116,7 @@ Egiaztatu Interneteko konexioa.";
"Common.Controls.Status.Tag.Link" = "Esteka"; "Common.Controls.Status.Tag.Link" = "Esteka";
"Common.Controls.Status.Tag.Mention" = "Aipatu"; "Common.Controls.Status.Tag.Mention" = "Aipatu";
"Common.Controls.Status.Tag.Url" = "URLa"; "Common.Controls.Status.Tag.Url" = "URLa";
"Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.TapToReveal" = "Sakatu erakusteko";
"Common.Controls.Status.UserReblogged" = "%@ erabiltzaileak bultzada eman dio"; "Common.Controls.Status.UserReblogged" = "%@ erabiltzaileak bultzada eman dio";
"Common.Controls.Status.UserRepliedTo" = "%@(r)i erantzuten"; "Common.Controls.Status.UserRepliedTo" = "%@(r)i erantzuten";
"Common.Controls.Status.Visibility.Direct" = "Aipatutako erabiltzaileek soilik ikus dezakete bidalketa hau."; "Common.Controls.Status.Visibility.Direct" = "Aipatutako erabiltzaileek soilik ikus dezakete bidalketa hau.";
@ -201,6 +201,10 @@ Mastodonera igo.";
"Scene.ConfirmEmail.Subtitle" = "Eposta bat bidali dizugu %@ helbidera, "Scene.ConfirmEmail.Subtitle" = "Eposta bat bidali dizugu %@ helbidera,
sakatu kontua berresteko esteka."; sakatu kontua berresteko esteka.";
"Scene.ConfirmEmail.Title" = "Eta azkenik..."; "Scene.ConfirmEmail.Title" = "Eta azkenik...";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Zure gogokoak"; "Scene.Favorite.Title" = "Zure gogokoak";
"Scene.Follower.Footer" = "Beste zerbitzarietako jarraitzaileak ez dira bistaratzen."; "Scene.Follower.Footer" = "Beste zerbitzarietako jarraitzaileak ez dira bistaratzen.";
"Scene.Following.Footer" = "Beste zerbitzarietan jarraitutakoak ez dira bistaratzen."; "Scene.Following.Footer" = "Beste zerbitzarietan jarraitutakoak ez dira bistaratzen.";
@ -211,21 +215,21 @@ sakatu kontua berresteko esteka.";
"Scene.HomeTimeline.Title" = "Hasiera"; "Scene.HomeTimeline.Title" = "Hasiera";
"Scene.Notification.Keyobard.ShowEverything" = "Erakutsi guztia"; "Scene.Notification.Keyobard.ShowEverything" = "Erakutsi guztia";
"Scene.Notification.Keyobard.ShowMentions" = "Erakutsi aipamenak"; "Scene.Notification.Keyobard.ShowMentions" = "Erakutsi aipamenak";
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "erabiltzaileak zure bidalketa gogoko du"; "Scene.Notification.NotificationDescription.FavoritedYourPost" = "(e)k zure bidalketa gogoko du";
"Scene.Notification.NotificationDescription.FollowedYou" = "zu jarraitzen hasi da"; "Scene.Notification.NotificationDescription.FollowedYou" = "zu jarraitzen hasi da";
"Scene.Notification.NotificationDescription.MentionedYou" = "erabiltzaileak aipatu zaitu"; "Scene.Notification.NotificationDescription.MentionedYou" = "erabiltzaileak aipatu zaitu";
"Scene.Notification.NotificationDescription.PollHasEnded" = "inkesta amaitu da"; "Scene.Notification.NotificationDescription.PollHasEnded" = "inkesta amaitu da";
"Scene.Notification.NotificationDescription.RebloggedYourPost" = "erabiltzaileak bultzada eman dio zure bidalketari"; "Scene.Notification.NotificationDescription.RebloggedYourPost" = "(e)k bultzada eman dio zure bidalketari";
"Scene.Notification.NotificationDescription.RequestToFollowYou" = "erabiltzaileak zu jarraitzea eskatu du"; "Scene.Notification.NotificationDescription.RequestToFollowYou" = "erabiltzaileak zu jarraitzea eskatu du";
"Scene.Notification.Title.Everything" = "Dena"; "Scene.Notification.Title.Everything" = "Dena";
"Scene.Notification.Title.Mentions" = "Aipamenak"; "Scene.Notification.Title.Mentions" = "Aipamenak";
"Scene.Preview.Keyboard.ClosePreview" = "Itxi aurrebista"; "Scene.Preview.Keyboard.ClosePreview" = "Itxi aurrebista";
"Scene.Preview.Keyboard.ShowNext" = "Erakutsi hurrengoa"; "Scene.Preview.Keyboard.ShowNext" = "Erakutsi hurrengoa";
"Scene.Preview.Keyboard.ShowPrevious" = "Erakutsi aurrekoa"; "Scene.Preview.Keyboard.ShowPrevious" = "Erakutsi aurrekoa";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list"; "Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Sakatu birritan zerrenda irekitzeko";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.EditAvatarImage" = "Editatu abatarra";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Erakutsi abatarra";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Erakutsi banner irudia";
"Scene.Profile.Dashboard.Followers" = "jarraitzaile"; "Scene.Profile.Dashboard.Followers" = "jarraitzaile";
"Scene.Profile.Dashboard.Following" = "jarraitzen"; "Scene.Profile.Dashboard.Following" = "jarraitzen";
"Scene.Profile.Dashboard.Posts" = "bidalketa"; "Scene.Profile.Dashboard.Posts" = "bidalketa";
@ -366,7 +370,7 @@ edozein zerbitzari.";
"Scene.Settings.Section.Notifications.Trigger.Title" = "Noiz jakinarazi:"; "Scene.Settings.Section.Notifications.Trigger.Title" = "Noiz jakinarazi:";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Desgaitu abatar animatuak"; "Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Desgaitu abatar animatuak";
"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Desgaitu emoji animatuak"; "Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Desgaitu emoji animatuak";
"Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Open links in Mastodon"; "Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Ireki estekak Mastodonen";
"Scene.Settings.Section.Preference.Title" = "Hobespenak"; "Scene.Settings.Section.Preference.Title" = "Hobespenak";
"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Benetako modu beltz iluna"; "Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Benetako modu beltz iluna";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Erabili nabigatzaile lehenetsia estekak irekitzeko"; "Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Erabili nabigatzaile lehenetsia estekak irekitzeko";

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>Erantzun bat</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld erantzun</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -98,9 +98,9 @@ Veuillez vérifier votre accès à Internet.";
"Common.Controls.Status.Actions.Menu" = "Menu"; "Common.Controls.Status.Actions.Menu" = "Menu";
"Common.Controls.Status.Actions.Reblog" = "Rebloguer"; "Common.Controls.Status.Actions.Reblog" = "Rebloguer";
"Common.Controls.Status.Actions.Reply" = "Répondre"; "Common.Controls.Status.Actions.Reply" = "Répondre";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF"; "Common.Controls.Status.Actions.ShowGif" = "Afficher le GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image"; "Common.Controls.Status.Actions.ShowImage" = "Afficher limage";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Afficher le lecteur vidéo";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu"; "Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu";
"Common.Controls.Status.Actions.Unfavorite" = "Retirer des favoris"; "Common.Controls.Status.Actions.Unfavorite" = "Retirer des favoris";
"Common.Controls.Status.Actions.Unreblog" = "Annuler le reblog"; "Common.Controls.Status.Actions.Unreblog" = "Annuler le reblog";
@ -116,7 +116,7 @@ Veuillez vérifier votre accès à Internet.";
"Common.Controls.Status.Tag.Link" = "Lien"; "Common.Controls.Status.Tag.Link" = "Lien";
"Common.Controls.Status.Tag.Mention" = "Mention"; "Common.Controls.Status.Tag.Mention" = "Mention";
"Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.Tag.Url" = "URL";
"Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.TapToReveal" = "Appuyer pour afficher";
"Common.Controls.Status.UserReblogged" = "%@ a reblogué"; "Common.Controls.Status.UserReblogged" = "%@ a reblogué";
"Common.Controls.Status.UserRepliedTo" = "À répondu à %@"; "Common.Controls.Status.UserRepliedTo" = "À répondu à %@";
"Common.Controls.Status.Visibility.Direct" = "Seul·e lutilisateur·rice mentionnée peut voir ce message."; "Common.Controls.Status.Visibility.Direct" = "Seul·e lutilisateur·rice mentionnée peut voir ce message.";
@ -201,6 +201,10 @@ téléversé sur Mastodon.";
"Scene.ConfirmEmail.Subtitle" = "Nous venons denvoyer un courriel à %@, "Scene.ConfirmEmail.Subtitle" = "Nous venons denvoyer un courriel à %@,
tapotez le lien pour confirmer votre compte."; tapotez le lien pour confirmer votre compte.";
"Scene.ConfirmEmail.Title" = "Une dernière chose."; "Scene.ConfirmEmail.Title" = "Une dernière chose.";
"Scene.Discovery.Tabs.ForYou" = "Pour vous";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "Actualité";
"Scene.Discovery.Tabs.Posts" = "Messages";
"Scene.Favorite.Title" = "Vos favoris"; "Scene.Favorite.Title" = "Vos favoris";
"Scene.Follower.Footer" = "Les abonné·e·s issus des autres serveurs ne sont pas affiché·e·s."; "Scene.Follower.Footer" = "Les abonné·e·s issus des autres serveurs ne sont pas affiché·e·s.";
"Scene.Following.Footer" = "Les abonnés issus des autres serveurs ne sont pas affichés."; "Scene.Following.Footer" = "Les abonnés issus des autres serveurs ne sont pas affichés.";
@ -222,10 +226,10 @@ tapotez le lien pour confirmer votre compte.";
"Scene.Preview.Keyboard.ClosePreview" = "Fermer l'aperçu"; "Scene.Preview.Keyboard.ClosePreview" = "Fermer l'aperçu";
"Scene.Preview.Keyboard.ShowNext" = "Afficher le suivant"; "Scene.Preview.Keyboard.ShowNext" = "Afficher le suivant";
"Scene.Preview.Keyboard.ShowPrevious" = "Afficher le précédent"; "Scene.Preview.Keyboard.ShowPrevious" = "Afficher le précédent";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list"; "Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Appuyer deux fois pour ouvrir la liste";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.EditAvatarImage" = "Modifier lavatar";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Afficher lavatar";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Afficher limage de la bannière";
"Scene.Profile.Dashboard.Followers" = "abonnés"; "Scene.Profile.Dashboard.Followers" = "abonnés";
"Scene.Profile.Dashboard.Following" = "abonnements"; "Scene.Profile.Dashboard.Following" = "abonnements";
"Scene.Profile.Dashboard.Posts" = "publications"; "Scene.Profile.Dashboard.Posts" = "publications";
@ -366,7 +370,7 @@ n'importe quel serveur.";
"Scene.Settings.Section.Notifications.Trigger.Title" = "Me notifier lorsque"; "Scene.Settings.Section.Notifications.Trigger.Title" = "Me notifier lorsque";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Désactiver les avatars animés"; "Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Désactiver les avatars animés";
"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Désactiver les émojis animées"; "Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Désactiver les émojis animées";
"Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Open links in Mastodon"; "Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Ouvrir les liens dans Mastodon";
"Scene.Settings.Section.Preference.Title" = "Préférences"; "Scene.Settings.Section.Preference.Title" = "Préférences";
"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Vrai mode sombre"; "Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Vrai mode sombre";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Utiliser le navigateur par défaut pour ouvrir les liens"; "Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Utiliser le navigateur par défaut pour ouvrir les liens";

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>1 réponse</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld réponses</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -201,6 +201,10 @@ a luchdadh suas gu Mastodon.";
"Scene.ConfirmEmail.Subtitle" = "Tha sinn air post-d a chur gu %@, "Scene.ConfirmEmail.Subtitle" = "Tha sinn air post-d a chur gu %@,
thoir gnogag air a chunntas a dhearbhadh a chunntais agad."; thoir gnogag air a chunntas a dhearbhadh a chunntais agad.";
"Scene.ConfirmEmail.Title" = "Aon rud eile."; "Scene.ConfirmEmail.Title" = "Aon rud eile.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Na h-annsachdan agad"; "Scene.Favorite.Title" = "Na h-annsachdan agad";
"Scene.Follower.Footer" = "Cha dèid luchd-leantainn o fhrithealaichean eile a shealltainn."; "Scene.Follower.Footer" = "Cha dèid luchd-leantainn o fhrithealaichean eile a shealltainn.";
"Scene.Following.Footer" = "Cha dèid cò air a leanas tu air frithealaichean eile a shealltainn."; "Scene.Following.Footer" = "Cha dèid cò air a leanas tu air frithealaichean eile a shealltainn.";

View File

@ -195,6 +195,10 @@
"Scene.ConfirmEmail.OpenEmailApp.Title" = "メールを確認"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "メールを確認";
"Scene.ConfirmEmail.Subtitle" = "先程 %@ にメールを送信しました。リンクをタップしてアカウントを確認してください。"; "Scene.ConfirmEmail.Subtitle" = "先程 %@ にメールを送信しました。リンクをタップしてアカウントを確認してください。";
"Scene.ConfirmEmail.Title" = "さいごにもうひとつ。"; "Scene.ConfirmEmail.Title" = "さいごにもうひとつ。";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "お気に入り"; "Scene.Favorite.Title" = "お気に入り";
"Scene.Follower.Footer" = "他のサーバーからのフォロワーは表示されません。"; "Scene.Follower.Footer" = "他のサーバーからのフォロワーは表示されません。";
"Scene.Following.Footer" = "他のサーバーにいるフォローは表示されません。"; "Scene.Following.Footer" = "他のサーバーにいるフォローは表示されません。";

View File

@ -200,6 +200,10 @@ Ad d-yettwasali ɣef Mastodon.";
"Scene.ConfirmEmail.OpenEmailApp.Title" = "Sefqed Tanaka-inek."; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Sefqed Tanaka-inek.";
"Scene.ConfirmEmail.Subtitle" = "Sit ɣef useɣwen i ak-n-uznen i wakken ad tesneqdeḍ amiḍan-ik."; "Scene.ConfirmEmail.Subtitle" = "Sit ɣef useɣwen i ak-n-uznen i wakken ad tesneqdeḍ amiḍan-ik.";
"Scene.ConfirmEmail.Title" = "Taɣawsa taneggarut."; "Scene.ConfirmEmail.Title" = "Taɣawsa taneggarut.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Ismenyifen-ik·im"; "Scene.Favorite.Title" = "Ismenyifen-ik·im";
"Scene.Follower.Footer" = "Ineḍfaren seg yiqeddacen-nniḍen ur d-ttwaskanen ara."; "Scene.Follower.Footer" = "Ineḍfaren seg yiqeddacen-nniḍen ur d-ttwaskanen ara.";
"Scene.Following.Footer" = "Ineḍfaren seg yiqeddacen-nniḍen ur d-ttwaskanen ara."; "Scene.Following.Footer" = "Ineḍfaren seg yiqeddacen-nniḍen ur d-ttwaskanen ara.";

View File

@ -201,6 +201,10 @@ Profîla te ji wan ra wiha xuya dike.";
"Scene.ConfirmEmail.Subtitle" = "Me tenê e-nameyek ji %@ re şand, "Scene.ConfirmEmail.Subtitle" = "Me tenê e-nameyek ji %@ re şand,
girêdanê bitikne da ku ajimêra xwe bidî piştrastkirin."; girêdanê bitikne da ku ajimêra xwe bidî piştrastkirin.";
"Scene.ConfirmEmail.Title" = "Tiştekî dawî."; "Scene.ConfirmEmail.Title" = "Tiştekî dawî.";
"Scene.Discovery.Tabs.ForYou" = "Ji bo te";
"Scene.Discovery.Tabs.Hashtags" = "Hashtag";
"Scene.Discovery.Tabs.News" = "Nûçe";
"Scene.Discovery.Tabs.Posts" = "Şandî";
"Scene.Favorite.Title" = "Bijarteyên te"; "Scene.Favorite.Title" = "Bijarteyên te";
"Scene.Follower.Footer" = "Şopîner ji rajekerên din nayê dîtin."; "Scene.Follower.Footer" = "Şopîner ji rajekerên din nayê dîtin.";
"Scene.Following.Footer" = "Şopandin ji rajekerên din nayê dîtin."; "Scene.Following.Footer" = "Şopandin ji rajekerên din nayê dîtin.";

View File

@ -195,6 +195,10 @@ Uw profiel ziet er zo uit voor hen.";
"Scene.ConfirmEmail.Subtitle" = "We hebben een e-mail gestuurd naar %@, "Scene.ConfirmEmail.Subtitle" = "We hebben een e-mail gestuurd naar %@,
klik op de link om uw account te bevestigen."; klik op de link om uw account te bevestigen.";
"Scene.ConfirmEmail.Title" = "Nog één ding."; "Scene.ConfirmEmail.Title" = "Nog één ding.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Uw favorieten"; "Scene.Favorite.Title" = "Uw favorieten";
"Scene.Follower.Footer" = "Followers from other servers are not displayed."; "Scene.Follower.Footer" = "Followers from other servers are not displayed.";
"Scene.Following.Footer" = "Follows from other servers are not displayed."; "Scene.Following.Footer" = "Follows from other servers are not displayed.";

View File

@ -4,7 +4,7 @@
"Common.Alerts.CleanCache.Title" = "Очистка кэша"; "Common.Alerts.CleanCache.Title" = "Очистка кэша";
"Common.Alerts.Common.PleaseTryAgain" = "Пожалуйста, попробуйте ещё раз."; "Common.Alerts.Common.PleaseTryAgain" = "Пожалуйста, попробуйте ещё раз.";
"Common.Alerts.Common.PleaseTryAgainLater" = "Пожалуйста, попробуйте позже."; "Common.Alerts.Common.PleaseTryAgainLater" = "Пожалуйста, попробуйте позже.";
"Common.Alerts.DeletePost.Message" = "Are you sure you want to delete this post?"; "Common.Alerts.DeletePost.Message" = "Вы уверены, что хотите удалить этот пост?";
"Common.Alerts.DeletePost.Title" = "Вы уверены, что хотите удалить этот пост?"; "Common.Alerts.DeletePost.Title" = "Вы уверены, что хотите удалить этот пост?";
"Common.Alerts.DiscardPostContent.Message" = "Вы действительно хотите удалить набранное содержимое поста?"; "Common.Alerts.DiscardPostContent.Message" = "Вы действительно хотите удалить набранное содержимое поста?";
"Common.Alerts.DiscardPostContent.Title" = "Удалить черновик"; "Common.Alerts.DiscardPostContent.Title" = "Удалить черновик";
@ -69,7 +69,7 @@
"Common.Controls.Friendship.Follow" = "Подписаться"; "Common.Controls.Friendship.Follow" = "Подписаться";
"Common.Controls.Friendship.Following" = "В подписках"; "Common.Controls.Friendship.Following" = "В подписках";
"Common.Controls.Friendship.Mute" = "Игнорировать"; "Common.Controls.Friendship.Mute" = "Игнорировать";
"Common.Controls.Friendship.MuteUser" = "Добавить %@ в игнорируемые"; "Common.Controls.Friendship.MuteUser" = "Игнорировать %@";
"Common.Controls.Friendship.Muted" = "В игнорируемых"; "Common.Controls.Friendship.Muted" = "В игнорируемых";
"Common.Controls.Friendship.Pending" = "Отправлен"; "Common.Controls.Friendship.Pending" = "Отправлен";
"Common.Controls.Friendship.Request" = "Отправить запрос"; "Common.Controls.Friendship.Request" = "Отправить запрос";
@ -94,14 +94,14 @@
"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Добавить или убрать из избранного"; "Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Добавить или убрать из избранного";
"Common.Controls.Keyboard.Timeline.ToggleReblog" = "Продвинуть или убрать продвижение"; "Common.Controls.Keyboard.Timeline.ToggleReblog" = "Продвинуть или убрать продвижение";
"Common.Controls.Status.Actions.Favorite" = "Добавить в избранное"; "Common.Controls.Status.Actions.Favorite" = "Добавить в избранное";
"Common.Controls.Status.Actions.Hide" = "Hide"; "Common.Controls.Status.Actions.Hide" = "Скрыть";
"Common.Controls.Status.Actions.Menu" = "Меню"; "Common.Controls.Status.Actions.Menu" = "Меню";
"Common.Controls.Status.Actions.Reblog" = "Продвинуть"; "Common.Controls.Status.Actions.Reblog" = "Продвинуть";
"Common.Controls.Status.Actions.Reply" = "Ответить"; "Common.Controls.Status.Actions.Reply" = "Ответить";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF"; "Common.Controls.Status.Actions.ShowGif" = "Показать GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image"; "Common.Controls.Status.Actions.ShowImage" = "Показать изображение";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Показать видеопроигрыватель";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu"; "Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Нажмите и удерживайте, чтобы показать меню";
"Common.Controls.Status.Actions.Unfavorite" = "Убрать из избранного"; "Common.Controls.Status.Actions.Unfavorite" = "Убрать из избранного";
"Common.Controls.Status.Actions.Unreblog" = "Убрать продвижение"; "Common.Controls.Status.Actions.Unreblog" = "Убрать продвижение";
"Common.Controls.Status.ContentWarning" = "Предупреждение о содержании"; "Common.Controls.Status.ContentWarning" = "Предупреждение о содержании";
@ -116,7 +116,7 @@
"Common.Controls.Status.Tag.Link" = "Ссылка"; "Common.Controls.Status.Tag.Link" = "Ссылка";
"Common.Controls.Status.Tag.Mention" = "Упоминание"; "Common.Controls.Status.Tag.Mention" = "Упоминание";
"Common.Controls.Status.Tag.Url" = "Ссылка"; "Common.Controls.Status.Tag.Url" = "Ссылка";
"Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.TapToReveal" = "Нажмите, чтобы показать";
"Common.Controls.Status.UserReblogged" = "%@ продвинул(а)"; "Common.Controls.Status.UserReblogged" = "%@ продвинул(а)";
"Common.Controls.Status.UserRepliedTo" = "Ответил(а) %@"; "Common.Controls.Status.UserRepliedTo" = "Ответил(а) %@";
"Common.Controls.Status.Visibility.Direct" = "Only mentioned user can see this post."; "Common.Controls.Status.Visibility.Direct" = "Only mentioned user can see this post.";
@ -198,7 +198,7 @@
"Scene.Compose.Visibility.Public" = "Публичный"; "Scene.Compose.Visibility.Public" = "Публичный";
"Scene.Compose.Visibility.Unlisted" = "Скрытый"; "Scene.Compose.Visibility.Unlisted" = "Скрытый";
"Scene.ConfirmEmail.Button.OpenEmailApp" = "Открыть приложение почты"; "Scene.ConfirmEmail.Button.OpenEmailApp" = "Открыть приложение почты";
"Scene.ConfirmEmail.Button.Resend" = "Resend"; "Scene.ConfirmEmail.Button.Resend" = "Отправить заново";
"Scene.ConfirmEmail.DontReceiveEmail.Description" = "Проверьте, правильно ли указан ваш e-mail адрес, а также папку «спам», если ещё не сделали этого."; "Scene.ConfirmEmail.DontReceiveEmail.Description" = "Проверьте, правильно ли указан ваш e-mail адрес, а также папку «спам», если ещё не сделали этого.";
"Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "Отправить ещё раз"; "Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "Отправить ещё раз";
"Scene.ConfirmEmail.DontReceiveEmail.Title" = "Проверьте свой e-mail адрес"; "Scene.ConfirmEmail.DontReceiveEmail.Title" = "Проверьте свой e-mail адрес";
@ -211,6 +211,10 @@
Нажмите на ссылку в нём, чтобы Нажмите на ссылку в нём, чтобы
подтвердить свою учётную запись."; подтвердить свою учётную запись.";
"Scene.ConfirmEmail.Title" = "И ещё кое-что."; "Scene.ConfirmEmail.Title" = "И ещё кое-что.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Ваше избранное"; "Scene.Favorite.Title" = "Ваше избранное";
"Scene.Follower.Footer" = "Followers from other servers are not displayed."; "Scene.Follower.Footer" = "Followers from other servers are not displayed.";
"Scene.Following.Footer" = "Follows from other servers are not displayed."; "Scene.Following.Footer" = "Follows from other servers are not displayed.";
@ -253,7 +257,7 @@
"Scene.Profile.SegmentedControl.About" = "About"; "Scene.Profile.SegmentedControl.About" = "About";
"Scene.Profile.SegmentedControl.Media" = "Медиа"; "Scene.Profile.SegmentedControl.Media" = "Медиа";
"Scene.Profile.SegmentedControl.Posts" = "Посты"; "Scene.Profile.SegmentedControl.Posts" = "Посты";
"Scene.Profile.SegmentedControl.PostsAndReplies" = "Posts and Replies"; "Scene.Profile.SegmentedControl.PostsAndReplies" = "Посты и ответы";
"Scene.Profile.SegmentedControl.Replies" = "Ответы"; "Scene.Profile.SegmentedControl.Replies" = "Ответы";
"Scene.Register.Error.Item.Agreement" = "Соглашение"; "Scene.Register.Error.Item.Agreement" = "Соглашение";
"Scene.Register.Error.Item.Email" = "E-mail"; "Scene.Register.Error.Item.Email" = "E-mail";
@ -298,7 +302,7 @@
"Scene.Report.Step2" = "Шаг 2 из 2"; "Scene.Report.Step2" = "Шаг 2 из 2";
"Scene.Report.TextPlaceholder" = "Дополнительные комментарии"; "Scene.Report.TextPlaceholder" = "Дополнительные комментарии";
"Scene.Report.Title" = "Пожаловаться на %@"; "Scene.Report.Title" = "Пожаловаться на %@";
"Scene.Report.TitleReport" = "Report"; "Scene.Report.TitleReport" = "Жалоба";
"Scene.Search.Recommend.Accounts.Description" = "Возможно, вы захотите подписаться на эти профили"; "Scene.Search.Recommend.Accounts.Description" = "Возможно, вы захотите подписаться на эти профили";
"Scene.Search.Recommend.Accounts.Follow" = "Подписаться"; "Scene.Search.Recommend.Accounts.Follow" = "Подписаться";
"Scene.Search.Recommend.Accounts.Title" = "Вам может понравится"; "Scene.Search.Recommend.Accounts.Title" = "Вам может понравится";
@ -376,7 +380,7 @@
"Scene.Settings.Section.Notifications.Trigger.Title" = "Уведомлять меня, когда"; "Scene.Settings.Section.Notifications.Trigger.Title" = "Уведомлять меня, когда";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Отключить анимацию аватарок"; "Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Отключить анимацию аватарок";
"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Отключить анимацию эмодзи"; "Scene.Settings.Section.Preference.DisableEmojiAnimation" = "Отключить анимацию эмодзи";
"Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Open links in Mastodon"; "Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Открывать ссылки в Мастодоне";
"Scene.Settings.Section.Preference.Title" = "Предпочтения"; "Scene.Settings.Section.Preference.Title" = "Предпочтения";
"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Полноценно чёрный режим"; "Scene.Settings.Section.Preference.TrueBlackDarkMode" = "Полноценно чёрный режим";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Использовать браузер по умолчанию для открытия ссылок"; "Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Использовать браузер по умолчанию для открытия ссылок";
@ -388,10 +392,10 @@
"Scene.SuggestionAccount.Title" = "Подпишитесь на людей"; "Scene.SuggestionAccount.Title" = "Подпишитесь на людей";
"Scene.Thread.BackTitle" = "Пост"; "Scene.Thread.BackTitle" = "Пост";
"Scene.Thread.Title" = "Пост %@"; "Scene.Thread.Title" = "Пост %@";
"Scene.Welcome.GetStarted" = "Get Started"; "Scene.Welcome.GetStarted" = "Присоединиться";
"Scene.Welcome.LogIn" = "Вход"; "Scene.Welcome.LogIn" = "Вход";
"Scene.Welcome.Slogan" = "Социальная сеть "Scene.Welcome.Slogan" = "Социальная сеть
под вашим контролем."; под вашим контролем.";
"Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard";
"Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button.";
"Scene.Wizard.NewInMastodon" = "New in Mastodon"; "Scene.Wizard.NewInMastodon" = "Новое в Мастодоне";

View File

@ -200,6 +200,10 @@ uploaded to Mastodon.";
"Scene.ConfirmEmail.OpenEmailApp.Title" = "Tarkasta postilaatikkosi."; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Tarkasta postilaatikkosi.";
"Scene.ConfirmEmail.Subtitle" = "Lähetimme juuri sähköpostin osoitteeseen %@, napauta siinä olevaa linkkiä vahvistaaksesi tilisi."; "Scene.ConfirmEmail.Subtitle" = "Lähetimme juuri sähköpostin osoitteeseen %@, napauta siinä olevaa linkkiä vahvistaaksesi tilisi.";
"Scene.ConfirmEmail.Title" = "Viimeinen asia."; "Scene.ConfirmEmail.Title" = "Viimeinen asia.";
"Scene.Discovery.Tabs.ForYou" = "For You";
"Scene.Discovery.Tabs.Hashtags" = "Hashtags";
"Scene.Discovery.Tabs.News" = "News";
"Scene.Discovery.Tabs.Posts" = "Posts";
"Scene.Favorite.Title" = "Omat suosikit"; "Scene.Favorite.Title" = "Omat suosikit";
"Scene.Follower.Footer" = "Seuraajia muilta palvelimilta ei näytetä."; "Scene.Follower.Footer" = "Seuraajia muilta palvelimilta ei näytetä.";
"Scene.Following.Footer" = "Seurauksia muilta palvelimilta ei näytetä."; "Scene.Following.Footer" = "Seurauksia muilta palvelimilta ei näytetä.";

View File

@ -98,10 +98,10 @@
"Common.Controls.Status.Actions.Menu" = "เมนู"; "Common.Controls.Status.Actions.Menu" = "เมนู";
"Common.Controls.Status.Actions.Reblog" = "ดัน"; "Common.Controls.Status.Actions.Reblog" = "ดัน";
"Common.Controls.Status.Actions.Reply" = "ตอบกลับ"; "Common.Controls.Status.Actions.Reply" = "ตอบกลับ";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF"; "Common.Controls.Status.Actions.ShowGif" = "แสดง GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image"; "Common.Controls.Status.Actions.ShowImage" = "แสดงภาพ";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "แสดงตัวเล่นวิดีโอ";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu"; "Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "แตะค้างไว้เพื่อแสดงเมนู";
"Common.Controls.Status.Actions.Unfavorite" = "เลิกชื่นชอบ"; "Common.Controls.Status.Actions.Unfavorite" = "เลิกชื่นชอบ";
"Common.Controls.Status.Actions.Unreblog" = "เลิกทำการดัน"; "Common.Controls.Status.Actions.Unreblog" = "เลิกทำการดัน";
"Common.Controls.Status.ContentWarning" = "คำเตือนเนื้อหา"; "Common.Controls.Status.ContentWarning" = "คำเตือนเนื้อหา";
@ -116,7 +116,7 @@
"Common.Controls.Status.Tag.Link" = "ลิงก์"; "Common.Controls.Status.Tag.Link" = "ลิงก์";
"Common.Controls.Status.Tag.Mention" = "กล่าวถึง"; "Common.Controls.Status.Tag.Mention" = "กล่าวถึง";
"Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.Tag.Url" = "URL";
"Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.TapToReveal" = "แตะเพื่อเปิดเผย";
"Common.Controls.Status.UserReblogged" = "%@ ได้ดัน"; "Common.Controls.Status.UserReblogged" = "%@ ได้ดัน";
"Common.Controls.Status.UserRepliedTo" = "ตอบกลับ %@"; "Common.Controls.Status.UserRepliedTo" = "ตอบกลับ %@";
"Common.Controls.Status.Visibility.Direct" = "เฉพาะผู้ใช้ที่กล่าวถึงเท่านั้นที่สามารถเห็นโพสต์นี้"; "Common.Controls.Status.Visibility.Direct" = "เฉพาะผู้ใช้ที่กล่าวถึงเท่านั้นที่สามารถเห็นโพสต์นี้";
@ -200,6 +200,10 @@
"Scene.ConfirmEmail.OpenEmailApp.Title" = "ตรวจสอบกล่องขาเข้าของคุณ"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "ตรวจสอบกล่องขาเข้าของคุณ";
"Scene.ConfirmEmail.Subtitle" = "แตะลิงก์ที่เราส่งอีเมลถึงคุณเพื่อยืนยันบัญชีของคุณ"; "Scene.ConfirmEmail.Subtitle" = "แตะลิงก์ที่เราส่งอีเมลถึงคุณเพื่อยืนยันบัญชีของคุณ";
"Scene.ConfirmEmail.Title" = "หนึ่งสิ่งสุดท้าย"; "Scene.ConfirmEmail.Title" = "หนึ่งสิ่งสุดท้าย";
"Scene.Discovery.Tabs.ForYou" = "สำหรับคุณ";
"Scene.Discovery.Tabs.Hashtags" = "แฮชแท็ก";
"Scene.Discovery.Tabs.News" = "ข่าว";
"Scene.Discovery.Tabs.Posts" = "โพสต์";
"Scene.Favorite.Title" = "รายการโปรดของคุณ"; "Scene.Favorite.Title" = "รายการโปรดของคุณ";
"Scene.Follower.Footer" = "ไม่ได้แสดงผู้ติดตามจากเซิร์ฟเวอร์อื่น ๆ"; "Scene.Follower.Footer" = "ไม่ได้แสดงผู้ติดตามจากเซิร์ฟเวอร์อื่น ๆ";
"Scene.Following.Footer" = "ไม่ได้แสดงการติดตามจากเซิร์ฟเวอร์อื่น ๆ"; "Scene.Following.Footer" = "ไม่ได้แสดงการติดตามจากเซิร์ฟเวอร์อื่น ๆ";
@ -221,10 +225,10 @@
"Scene.Preview.Keyboard.ClosePreview" = "ปิดตัวอย่าง"; "Scene.Preview.Keyboard.ClosePreview" = "ปิดตัวอย่าง";
"Scene.Preview.Keyboard.ShowNext" = "แสดงถัดไป"; "Scene.Preview.Keyboard.ShowNext" = "แสดงถัดไป";
"Scene.Preview.Keyboard.ShowPrevious" = "แสดงก่อนหน้า"; "Scene.Preview.Keyboard.ShowPrevious" = "แสดงก่อนหน้า";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list"; "Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "แตะสองครั้งเพื่อเปิดรายการ";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.EditAvatarImage" = "แก้ไขภาพประจำตัว";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "แสดงภาพประจำตัว";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; "Scene.Profile.Accessibility.ShowBannerImage" = "แสดงภาพแบนเนอร์";
"Scene.Profile.Dashboard.Followers" = "ผู้ติดตาม"; "Scene.Profile.Dashboard.Followers" = "ผู้ติดตาม";
"Scene.Profile.Dashboard.Following" = "กำลังติดตาม"; "Scene.Profile.Dashboard.Following" = "กำลังติดตาม";
"Scene.Profile.Dashboard.Posts" = "โพสต์"; "Scene.Profile.Dashboard.Posts" = "โพสต์";
@ -364,7 +368,7 @@
"Scene.Settings.Section.Notifications.Trigger.Title" = "แจ้งเตือนฉันเมื่อ"; "Scene.Settings.Section.Notifications.Trigger.Title" = "แจ้งเตือนฉันเมื่อ";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "ปิดใช้งานภาพประจำตัวแบบเคลื่อนไหว"; "Scene.Settings.Section.Preference.DisableAvatarAnimation" = "ปิดใช้งานภาพประจำตัวแบบเคลื่อนไหว";
"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "ปิดใช้งานอีโมจิแบบเคลื่อนไหว"; "Scene.Settings.Section.Preference.DisableEmojiAnimation" = "ปิดใช้งานอีโมจิแบบเคลื่อนไหว";
"Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Open links in Mastodon"; "Scene.Settings.Section.Preference.OpenLinksInMastodon" = "เปิดลิงก์ใน Mastodon";
"Scene.Settings.Section.Preference.Title" = "การกำหนดลักษณะ"; "Scene.Settings.Section.Preference.Title" = "การกำหนดลักษณะ";
"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "โหมดมืดดำสนิท"; "Scene.Settings.Section.Preference.TrueBlackDarkMode" = "โหมดมืดดำสนิท";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "ใช้เบราว์เซอร์เริ่มต้นเพื่อเปิดลิงก์"; "Scene.Settings.Section.Preference.UsingDefaultBrowser" = "ใช้เบราว์เซอร์เริ่มต้นเพื่อเปิดลิงก์";

View File

@ -111,7 +111,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld การตอบกลับ</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -8,8 +8,8 @@
"Common.Alerts.DeletePost.Title" = "Xóa tút"; "Common.Alerts.DeletePost.Title" = "Xóa tút";
"Common.Alerts.DiscardPostContent.Message" = "Xác nhận bỏ qua nội dung tút đã viết."; "Common.Alerts.DiscardPostContent.Message" = "Xác nhận bỏ qua nội dung tút đã viết.";
"Common.Alerts.DiscardPostContent.Title" = "Hủy bản nháp"; "Common.Alerts.DiscardPostContent.Title" = "Hủy bản nháp";
"Common.Alerts.EditProfileFailure.Message" = "Không thể chỉnh sửa trang cá nhân. Vui lòng thử lại."; "Common.Alerts.EditProfileFailure.Message" = "Không thể chỉnh sửa hồ sơ. Vui lòng thử lại.";
"Common.Alerts.EditProfileFailure.Title" = "Lỗi chỉnh sửa trang cá nhân"; "Common.Alerts.EditProfileFailure.Title" = "Lỗi chỉnh sửa hồ sơ";
"Common.Alerts.PublishPostFailure.AttachmentsMessage.MoreThanOneVideo" = "Không thể đính kèm nhiều video."; "Common.Alerts.PublishPostFailure.AttachmentsMessage.MoreThanOneVideo" = "Không thể đính kèm nhiều video.";
"Common.Alerts.PublishPostFailure.AttachmentsMessage.VideoAttachWithPhoto" = "Không thể đính kèm video cùng với hình ảnh."; "Common.Alerts.PublishPostFailure.AttachmentsMessage.VideoAttachWithPhoto" = "Không thể đính kèm video cùng với hình ảnh.";
"Common.Alerts.PublishPostFailure.Message" = "Không thể đăng tút. "Common.Alerts.PublishPostFailure.Message" = "Không thể đăng tút.
@ -109,7 +109,7 @@ Vui lòng kiểm tra kết nối mạng.";
"Common.Controls.Status.Poll.Closed" = "Kết thúc"; "Common.Controls.Status.Poll.Closed" = "Kết thúc";
"Common.Controls.Status.Poll.Vote" = "Bình chọn"; "Common.Controls.Status.Poll.Vote" = "Bình chọn";
"Common.Controls.Status.ShowPost" = "Xem tút"; "Common.Controls.Status.ShowPost" = "Xem tút";
"Common.Controls.Status.ShowUserProfile" = "Xem trang cá nhân"; "Common.Controls.Status.ShowUserProfile" = "Xem trang hồ sơ";
"Common.Controls.Status.Tag.Email" = "Email"; "Common.Controls.Status.Tag.Email" = "Email";
"Common.Controls.Status.Tag.Emoji" = "Emoji"; "Common.Controls.Status.Tag.Emoji" = "Emoji";
"Common.Controls.Status.Tag.Hashtag" = "Hashtag"; "Common.Controls.Status.Tag.Hashtag" = "Hashtag";
@ -125,7 +125,7 @@ Vui lòng kiểm tra kết nối mạng.";
"Common.Controls.Status.Visibility.Unlisted" = "Ai cũng thấy tút này nhưng không hiện trên bảng tin máy chủ."; "Common.Controls.Status.Visibility.Unlisted" = "Ai cũng thấy tút này nhưng không hiện trên bảng tin máy chủ.";
"Common.Controls.Tabs.Home" = "Bảng tin"; "Common.Controls.Tabs.Home" = "Bảng tin";
"Common.Controls.Tabs.Notification" = "Thông báo"; "Common.Controls.Tabs.Notification" = "Thông báo";
"Common.Controls.Tabs.Profile" = "Trang cá nhân"; "Common.Controls.Tabs.Profile" = "Trang hồ sơ";
"Common.Controls.Tabs.Search" = "Tìm kiếm"; "Common.Controls.Tabs.Search" = "Tìm kiếm";
"Common.Controls.Timeline.Filtered" = "Bộ lọc"; "Common.Controls.Timeline.Filtered" = "Bộ lọc";
"Common.Controls.Timeline.Header.BlockedWarning" = "Bạn không thể xem trang người này "Common.Controls.Timeline.Header.BlockedWarning" = "Bạn không thể xem trang người này
@ -200,6 +200,10 @@ tải lên Mastodon.";
"Scene.ConfirmEmail.OpenEmailApp.Title" = "Kiểm tra hộp thư của bạn."; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Kiểm tra hộp thư của bạn.";
"Scene.ConfirmEmail.Subtitle" = "Nhấn vào liên kết chúng tôi gửi qua email để xác thực tài khoản."; "Scene.ConfirmEmail.Subtitle" = "Nhấn vào liên kết chúng tôi gửi qua email để xác thực tài khoản.";
"Scene.ConfirmEmail.Title" = "Còn điều này nữa."; "Scene.ConfirmEmail.Title" = "Còn điều này nữa.";
"Scene.Discovery.Tabs.ForYou" = "Dành cho bạn";
"Scene.Discovery.Tabs.Hashtags" = "Hashtag";
"Scene.Discovery.Tabs.News" = "Tin tức";
"Scene.Discovery.Tabs.Posts" = "Tút";
"Scene.Favorite.Title" = "Lượt thích"; "Scene.Favorite.Title" = "Lượt thích";
"Scene.Follower.Footer" = "Không hiển thị người theo dõi từ máy chủ khác."; "Scene.Follower.Footer" = "Không hiển thị người theo dõi từ máy chủ khác.";
"Scene.Following.Footer" = "Không hiển thị người bạn theo dõi từ máy chủ khác."; "Scene.Following.Footer" = "Không hiển thị người bạn theo dõi từ máy chủ khác.";

View File

@ -98,10 +98,10 @@
"Common.Controls.Status.Actions.Menu" = "菜单"; "Common.Controls.Status.Actions.Menu" = "菜单";
"Common.Controls.Status.Actions.Reblog" = "转发"; "Common.Controls.Status.Actions.Reblog" = "转发";
"Common.Controls.Status.Actions.Reply" = "回复"; "Common.Controls.Status.Actions.Reply" = "回复";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF"; "Common.Controls.Status.Actions.ShowGif" = "显示 GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image"; "Common.Controls.Status.Actions.ShowImage" = "显示图片";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "显示视频播放器";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu"; "Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "长按以显示菜单";
"Common.Controls.Status.Actions.Unfavorite" = "取消喜欢"; "Common.Controls.Status.Actions.Unfavorite" = "取消喜欢";
"Common.Controls.Status.Actions.Unreblog" = "取消转发"; "Common.Controls.Status.Actions.Unreblog" = "取消转发";
"Common.Controls.Status.ContentWarning" = "内容警告"; "Common.Controls.Status.ContentWarning" = "内容警告";
@ -116,7 +116,7 @@
"Common.Controls.Status.Tag.Link" = "链接"; "Common.Controls.Status.Tag.Link" = "链接";
"Common.Controls.Status.Tag.Mention" = "提及"; "Common.Controls.Status.Tag.Mention" = "提及";
"Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.Tag.Url" = "URL";
"Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.TapToReveal" = "点击以显示";
"Common.Controls.Status.UserReblogged" = "%@ 转发"; "Common.Controls.Status.UserReblogged" = "%@ 转发";
"Common.Controls.Status.UserRepliedTo" = "回复给 %@"; "Common.Controls.Status.UserRepliedTo" = "回复给 %@";
"Common.Controls.Status.Visibility.Direct" = "只有提到的用户才能看到此帖子。"; "Common.Controls.Status.Visibility.Direct" = "只有提到的用户才能看到此帖子。";
@ -201,6 +201,10 @@
"Scene.ConfirmEmail.Subtitle" = "我们刚刚向 %@ 发送了一封电子邮件, "Scene.ConfirmEmail.Subtitle" = "我们刚刚向 %@ 发送了一封电子邮件,
点击链接确认你的帐户。"; 点击链接确认你的帐户。";
"Scene.ConfirmEmail.Title" = "最后一件事。"; "Scene.ConfirmEmail.Title" = "最后一件事。";
"Scene.Discovery.Tabs.ForYou" = "为你推荐";
"Scene.Discovery.Tabs.Hashtags" = "话题";
"Scene.Discovery.Tabs.News" = "新闻";
"Scene.Discovery.Tabs.Posts" = "帖子";
"Scene.Favorite.Title" = "你的喜欢"; "Scene.Favorite.Title" = "你的喜欢";
"Scene.Follower.Footer" = "不会显示来自其它服务器的关注者"; "Scene.Follower.Footer" = "不会显示来自其它服务器的关注者";
"Scene.Following.Footer" = "不会显示来自其它服务器的关注"; "Scene.Following.Footer" = "不会显示来自其它服务器的关注";
@ -222,10 +226,10 @@
"Scene.Preview.Keyboard.ClosePreview" = "关闭预览"; "Scene.Preview.Keyboard.ClosePreview" = "关闭预览";
"Scene.Preview.Keyboard.ShowNext" = "显示下一个"; "Scene.Preview.Keyboard.ShowNext" = "显示下一个";
"Scene.Preview.Keyboard.ShowPrevious" = "显示前一个"; "Scene.Preview.Keyboard.ShowPrevious" = "显示前一个";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list"; "Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "双击打开列表";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.EditAvatarImage" = "编辑头像";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "显示头像";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; "Scene.Profile.Accessibility.ShowBannerImage" = "显示顶部横幅图片";
"Scene.Profile.Dashboard.Followers" = "关注者"; "Scene.Profile.Dashboard.Followers" = "关注者";
"Scene.Profile.Dashboard.Following" = "正在关注"; "Scene.Profile.Dashboard.Following" = "正在关注";
"Scene.Profile.Dashboard.Posts" = "帖子"; "Scene.Profile.Dashboard.Posts" = "帖子";
@ -366,7 +370,7 @@
"Scene.Settings.Section.Notifications.Trigger.Title" = "提示通知来自"; "Scene.Settings.Section.Notifications.Trigger.Title" = "提示通知来自";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "禁用动画头像"; "Scene.Settings.Section.Preference.DisableAvatarAnimation" = "禁用动画头像";
"Scene.Settings.Section.Preference.DisableEmojiAnimation" = "禁用动画表情"; "Scene.Settings.Section.Preference.DisableEmojiAnimation" = "禁用动画表情";
"Scene.Settings.Section.Preference.OpenLinksInMastodon" = "Open links in Mastodon"; "Scene.Settings.Section.Preference.OpenLinksInMastodon" = "在 Mastodon 中打开链接";
"Scene.Settings.Section.Preference.Title" = "偏好"; "Scene.Settings.Section.Preference.Title" = "偏好";
"Scene.Settings.Section.Preference.TrueBlackDarkMode" = "纯黑模式"; "Scene.Settings.Section.Preference.TrueBlackDarkMode" = "纯黑模式";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "使用默认浏览器打开链接"; "Scene.Settings.Section.Preference.UsingDefaultBrowser" = "使用默认浏览器打开链接";

View File

@ -111,7 +111,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld 条回复</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -0,0 +1,28 @@
//
// MastodonStatus.swift
//
//
// Created by MainasuK on 2022-4-18.
//
import Foundation
import CoreDataStack
extension Status {
// mark content sensitive when status contains spoilerText
public var isContentSensitive: Bool {
if let spoilerText = spoilerText, !spoilerText.isEmpty {
return true
} else {
return false
}
}
// mark media sensitive when `isContentSensitive` or media marked sensitive
public var isMediaSensitive: Bool {
// some servers set media sensitive even empty attachments
return isContentSensitive || (sensitive && !attachments.isEmpty)
}
}

View File

@ -48,22 +48,7 @@ public final class MediaGridContainerView: UIView {
return mediaViews return mediaViews
}() }()
let contentWarningOverlay = ContentWarningOverlayView()
// let sensitiveToggleButtonBlurVisualEffectView: UIVisualEffectView = {
// let visualEffectView = UIVisualEffectView(effect: ContentWarningOverlayView.blurVisualEffect)
// visualEffectView.layer.masksToBounds = true
// visualEffectView.layer.cornerRadius = MediaGridContainerView.sensitiveToggleButtonSize.width / 2
// visualEffectView.layer.cornerCurve = .continuous
// return visualEffectView
// }()
// let sensitiveToggleButtonVibrancyVisualEffectView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: ContentWarningOverlayView.blurVisualEffect))
// let sensitiveToggleButton: HitTestExpandedButton = {
// let button = HitTestExpandedButton(type: .system)
// button.contentEdgeInsets = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)
// button.imageView?.contentMode = .scaleAspectFit
// button.setImage(UIImage(systemName: "eye.slash.fill"), for: .normal)
// return button
// }()
public override init(frame: CGRect) { public override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
@ -86,7 +71,8 @@ public final class MediaGridContainerView: UIView {
extension MediaGridContainerView { extension MediaGridContainerView {
private func _init() { private func _init() {
// sensitiveToggleButton.addTarget(self, action: #selector(MediaGridContainerView.sensitiveToggleButtonDidPressed(_:)), for: .touchUpInside) contentWarningOverlay.isUserInteractionEnabled = false
contentWarningOverlay.isHidden = true
} }
} }
@ -112,8 +98,8 @@ extension MediaGridContainerView {
let mediaView = _mediaViews[0] let mediaView = _mediaViews[0]
layout.layout(in: self, mediaView: mediaView) layout.layout(in: self, mediaView: mediaView)
// layoutSensitiveToggleButton() layoutContentWarningOverlay()
// bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView) bringSubviewToFront(contentWarningOverlay)
return mediaView return mediaView
} }
@ -124,8 +110,8 @@ extension MediaGridContainerView {
let mediaViews = Array(_mediaViews[0..<layout.count]) let mediaViews = Array(_mediaViews[0..<layout.count])
layout.layout(in: self, mediaViews: mediaViews) layout.layout(in: self, mediaViews: mediaViews)
// layoutSensitiveToggleButton() layoutContentWarningOverlay()
// bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView) bringSubviewToFront(contentWarningOverlay)
return mediaViews return mediaViews
} }
@ -147,34 +133,16 @@ extension MediaGridContainerView {
} }
extension MediaGridContainerView { extension MediaGridContainerView {
// private func layoutSensitiveToggleButton() { private func layoutContentWarningOverlay() {
// sensitiveToggleButtonBlurVisualEffectView.translatesAutoresizingMaskIntoConstraints = false contentWarningOverlay.translatesAutoresizingMaskIntoConstraints = false
// addSubview(sensitiveToggleButtonBlurVisualEffectView) addSubview(contentWarningOverlay)
// NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
// sensitiveToggleButtonBlurVisualEffectView.topAnchor.constraint(equalTo: topAnchor, constant: 16), contentWarningOverlay.topAnchor.constraint(equalTo: topAnchor),
// trailingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.trailingAnchor, constant: 16), contentWarningOverlay.leadingAnchor.constraint(equalTo: leadingAnchor),
// ]) contentWarningOverlay.trailingAnchor.constraint(equalTo: trailingAnchor),
// contentWarningOverlay.bottomAnchor.constraint(equalTo: bottomAnchor),
// sensitiveToggleButtonVibrancyVisualEffectView.translatesAutoresizingMaskIntoConstraints = false ])
// sensitiveToggleButtonBlurVisualEffectView.contentView.addSubview(sensitiveToggleButtonVibrancyVisualEffectView) }
// NSLayoutConstraint.activate([
// sensitiveToggleButtonVibrancyVisualEffectView.topAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.topAnchor),
// sensitiveToggleButtonVibrancyVisualEffectView.leadingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.leadingAnchor),
// sensitiveToggleButtonVibrancyVisualEffectView.trailingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.trailingAnchor),
// sensitiveToggleButtonVibrancyVisualEffectView.bottomAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.bottomAnchor),
// ])
//
// sensitiveToggleButton.translatesAutoresizingMaskIntoConstraints = false
// sensitiveToggleButtonVibrancyVisualEffectView.contentView.addSubview(sensitiveToggleButton)
// NSLayoutConstraint.activate([
// sensitiveToggleButton.topAnchor.constraint(equalTo: sensitiveToggleButtonVibrancyVisualEffectView.contentView.topAnchor),
// sensitiveToggleButton.leadingAnchor.constraint(equalTo: sensitiveToggleButtonVibrancyVisualEffectView.contentView.leadingAnchor),
// sensitiveToggleButtonVibrancyVisualEffectView.contentView.trailingAnchor.constraint(equalTo: sensitiveToggleButton.trailingAnchor),
// sensitiveToggleButtonVibrancyVisualEffectView.contentView.bottomAnchor.constraint(equalTo: sensitiveToggleButton.bottomAnchor),
// sensitiveToggleButton.widthAnchor.constraint(equalToConstant: MediaGridContainerView.sensitiveToggleButtonSize.width).priority(.required - 1),
// sensitiveToggleButton.heightAnchor.constraint(equalToConstant: MediaGridContainerView.sensitiveToggleButtonSize.height).priority(.required - 1),
// ])
// }
} }
extension MediaGridContainerView { extension MediaGridContainerView {

View File

@ -9,9 +9,28 @@ import UIKit
import MastodonSDK import MastodonSDK
import MastodonLocalization import MastodonLocalization
import AlamofireImage import AlamofireImage
import FaviconFinder
extension NewsView { extension NewsView {
public func configure(link: Mastodon.Entity.Link) { public func configure(link: Mastodon.Entity.Link) {
let faviconPlaceholder = UIImage(systemName: "network")
providerFaviconImageView.image = faviconPlaceholder
if let url = URL(string: link.url) {
let token = providerFaviconImageView.tag
FaviconFinder(url: url).downloadFavicon { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let favicon):
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
guard self.providerFaviconImageView.tag == token else { return }
self.providerFaviconImageView.image = favicon.image
}
case .failure:
break
}
}
}
providerNameLabel.text = link.providerName providerNameLabel.text = link.providerName
headlineLabel.text = link.title headlineLabel.text = link.title
footnoteLabel.text = L10n.Plural.peopleTalking(link.talkingPeopleCount ?? 0) footnoteLabel.text = L10n.Plural.peopleTalking(link.talkingPeopleCount ?? 0)

View File

@ -12,6 +12,15 @@ public final class NewsView: UIView {
let container = UIStackView() let container = UIStackView()
let providerFaviconImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFit
imageView.layer.masksToBounds = true
imageView.layer.cornerRadius = 2
imageView.layer.cornerCurve = .continuous
return imageView
}()
let providerNameLabel: UILabel = { let providerNameLabel: UILabel = {
let label = UILabel() let label = UILabel()
label.font = UIFontMetrics(forTextStyle: .footnote).scaledFont(for: .systemFont(ofSize: 13, weight: .semibold)) label.font = UIFontMetrics(forTextStyle: .footnote).scaledFont(for: .systemFont(ofSize: 13, weight: .semibold))
@ -37,6 +46,7 @@ public final class NewsView: UIView {
let imageView = MediaView() let imageView = MediaView()
public func prepareForReuse() { public func prepareForReuse() {
providerFaviconImageView.tag = (0..<Int.max).randomElement() ?? -1
imageView.prepareForReuse() imageView.prepareForReuse()
} }
@ -72,13 +82,28 @@ extension NewsView {
textContainer.spacing = 4 textContainer.spacing = 4
container.addArrangedSubview(textContainer) container.addArrangedSubview(textContainer)
// providerContainer: H - [ providerFavIconImageView | providerNameLabel | (spacer) ] // providerContainer: H - [ providerFaviconImageView | providerNameLabel | (spacer) ]
let providerContainer = UIStackView() let providerContainer = UIStackView()
providerContainer.axis = .horizontal providerContainer.axis = .horizontal
providerContainer.spacing = 4
textContainer.addArrangedSubview(providerContainer) textContainer.addArrangedSubview(providerContainer)
providerFaviconImageView.translatesAutoresizingMaskIntoConstraints = false
providerContainer.addArrangedSubview(providerFaviconImageView)
providerContainer.addArrangedSubview(providerNameLabel) providerContainer.addArrangedSubview(providerNameLabel)
NSLayoutConstraint.activate([
providerFaviconImageView.heightAnchor.constraint(equalTo: providerNameLabel.heightAnchor, multiplier: 1.0).priority(.required - 10),
providerFaviconImageView.widthAnchor.constraint(equalTo: providerNameLabel.heightAnchor, multiplier: 1.0).priority(.required - 10),
])
// low priority for intrinsic size hugging
providerFaviconImageView.setContentHuggingPriority(.defaultLow - 10, for: .vertical)
providerFaviconImageView.setContentHuggingPriority(.defaultLow - 10, for: .horizontal)
// high priority but lower then layout constraint for size compression
providerFaviconImageView.setContentCompressionResistancePriority(.required - 11, for: .vertical)
providerFaviconImageView.setContentCompressionResistancePriority(.required - 11, for: .horizontal)
providerNameLabel.setContentCompressionResistancePriority(.required - 1, for: .vertical)
providerNameLabel.setContentHuggingPriority(.required - 1, for: .vertical)
// headlineLabel // headlineLabel
textContainer.addArrangedSubview(headlineLabel) textContainer.addArrangedSubview(headlineLabel)
let spacer = UIView() let spacer = UIView()

View File

@ -42,6 +42,8 @@ extension ProfileCardView {
@Published public var isBlocking = false @Published public var isBlocking = false
@Published public var isBlockedBy = false @Published public var isBlockedBy = false
@Published public var groupedAccessibilityLabel = ""
init() { init() {
backgroundColor = ThemeService.shared.currentTheme.value.systemBackgroundColor backgroundColor = ThemeService.shared.currentTheme.value.systemBackgroundColor
Publishers.CombineLatest( Publishers.CombineLatest(
@ -75,6 +77,7 @@ extension ProfileCardView.ViewModel {
bindBio(view: view) bindBio(view: view)
bindRelationship(view: view) bindRelationship(view: view)
bindDashboard(view: view) bindDashboard(view: view)
bindAccessibility(view: view)
} }
private func bindAppearacne(view: ProfileCardView) { private func bindAppearacne(view: ProfileCardView) {
@ -185,4 +188,27 @@ extension ProfileCardView.ViewModel {
} }
.store(in: &disposeBag) .store(in: &disposeBag)
} }
private func bindAccessibility(view: ProfileCardView) {
let authorAccessibilityLabel = Publishers.CombineLatest(
$authorName,
$bioContent
)
.map { authorName, bioContent -> String? in
var strings: [String?] = []
strings.append(authorName?.string)
strings.append(bioContent?.string)
return strings.compactMap { $0 }.joined(separator: ", ")
}
authorAccessibilityLabel
.map { $0 ?? "" }
.assign(to: &$groupedAccessibilityLabel)
$groupedAccessibilityLabel
.sink { accessibilityLabel in
view.accessibilityLabel = accessibilityLabel
}
.store(in: &disposeBag)
}
} }

View File

@ -46,6 +46,8 @@ public final class ProfileCardView: UIView {
// author username // author username
public let authorUsernameLabel = MetaLabel(style: .profileCardUsername) public let authorUsernameLabel = MetaLabel(style: .profileCardUsername)
// bio
let bioMetaTextAdaptiveMarginContainerView = AdaptiveMarginContainerView()
let bioMetaText: MetaText = { let bioMetaText: MetaText = {
let metaText = MetaText() let metaText = MetaText()
metaText.textView.backgroundColor = .clear metaText.textView.backgroundColor = .clear
@ -78,6 +80,9 @@ public final class ProfileCardView: UIView {
return metaText return metaText
}() }()
let infoContainerAdaptiveMarginContainerView = AdaptiveMarginContainerView()
let infoContainer = UIStackView()
let statusDashboardView = ProfileStatusDashboardView() let statusDashboardView = ProfileStatusDashboardView()
let relationshipActionButtonShadowContainer = ShadowBackgroundContainer() let relationshipActionButtonShadowContainer = ShadowBackgroundContainer()
@ -179,7 +184,7 @@ extension ProfileCardView {
avatarButtonBackgroundView.layer.masksToBounds = true avatarButtonBackgroundView.layer.masksToBounds = true
avatarButtonBackgroundView.layer.cornerCurve = .continuous avatarButtonBackgroundView.layer.cornerCurve = .continuous
avatarButtonBackgroundView.layer.cornerRadius = 12 avatarButtonBackgroundView.layer.cornerRadius = 12 + 1
avatarButtonBackgroundView.translatesAutoresizingMaskIntoConstraints = false avatarButtonBackgroundView.translatesAutoresizingMaskIntoConstraints = false
authorContainer.insertSubview(avatarButtonBackgroundView, belowSubview: avatarButton) authorContainer.insertSubview(avatarButtonBackgroundView, belowSubview: avatarButton)
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
@ -192,31 +197,36 @@ extension ProfileCardView {
// authorInfoContainer: V - [ authorNameLabel | authorUsernameLabel ] // authorInfoContainer: V - [ authorNameLabel | authorUsernameLabel ]
let authorInfoContainer = UIStackView() let authorInfoContainer = UIStackView()
authorInfoContainer.axis = .vertical authorInfoContainer.axis = .vertical
authorInfoContainer.spacing = 2 // authorInfoContainer.spacing = 2
authorContainer.addArrangedSubview(authorInfoContainer) authorContainer.addArrangedSubview(authorInfoContainer)
authorInfoContainer.addArrangedSubview(authorNameLabel) authorInfoContainer.addArrangedSubview(authorNameLabel)
authorInfoContainer.addArrangedSubview(authorUsernameLabel) authorInfoContainer.addArrangedSubview(authorUsernameLabel)
// bioMetaText // bioMetaText
let bioMetaTextAdaptiveMarginContainerView = AdaptiveMarginContainerView()
bioMetaTextAdaptiveMarginContainerView.contentView = bioMetaText.textView bioMetaTextAdaptiveMarginContainerView.contentView = bioMetaText.textView
bioMetaTextAdaptiveMarginContainerView.margin = ProfileCardView.contentMargin bioMetaTextAdaptiveMarginContainerView.margin = ProfileCardView.contentMargin
bioMetaText.textView.setContentHuggingPriority(.required - 1, for: .vertical)
bioMetaText.textView.setContentCompressionResistancePriority(.required - 1, for: .vertical)
container.addArrangedSubview(bioMetaTextAdaptiveMarginContainerView) container.addArrangedSubview(bioMetaTextAdaptiveMarginContainerView)
container.setCustomSpacing(16, after: bioMetaTextAdaptiveMarginContainerView) container.setCustomSpacing(16, after: bioMetaTextAdaptiveMarginContainerView)
// infoContainer: H - [ statusDashboardView | (spacer) | relationshipActionButton ] // infoContainer: H - [ statusDashboardView | (spacer) | relationshipActionButton ]
let infoContainer = UIStackView()
infoContainer.axis = .horizontal infoContainer.axis = .horizontal
let infoContainerAdaptiveMarginContainerView = AdaptiveMarginContainerView() infoContainer.spacing = 8
infoContainerAdaptiveMarginContainerView.contentView = infoContainer infoContainerAdaptiveMarginContainerView.contentView = infoContainer
infoContainerAdaptiveMarginContainerView.margin = ProfileCardView.contentMargin infoContainerAdaptiveMarginContainerView.margin = ProfileCardView.contentMargin
container.addArrangedSubview(infoContainerAdaptiveMarginContainerView) container.addArrangedSubview(infoContainerAdaptiveMarginContainerView)
infoContainer.addArrangedSubview(statusDashboardView)
infoContainer.addArrangedSubview(UIView())
let relationshipActionButtonShadowContainer = ShadowBackgroundContainer()
infoContainer.addArrangedSubview(relationshipActionButtonShadowContainer)
infoContainer.addArrangedSubview(statusDashboardView)
let infoContainerSpacer = UIView()
infoContainer.addArrangedSubview(UIView())
infoContainerSpacer.setContentHuggingPriority(.defaultLow - 100, for: .vertical)
infoContainerSpacer.setContentHuggingPriority(.defaultLow - 100, for: .horizontal)
let relationshipActionButtonShadowContainer = ShadowBackgroundContainer()
relationshipActionButtonShadowContainer.translatesAutoresizingMaskIntoConstraints = false
infoContainer.addArrangedSubview(relationshipActionButtonShadowContainer)
relationshipActionButton.translatesAutoresizingMaskIntoConstraints = false relationshipActionButton.translatesAutoresizingMaskIntoConstraints = false
relationshipActionButtonShadowContainer.addSubview(relationshipActionButton) relationshipActionButtonShadowContainer.addSubview(relationshipActionButton)
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
@ -224,15 +234,15 @@ extension ProfileCardView {
relationshipActionButton.leadingAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.leadingAnchor), relationshipActionButton.leadingAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.leadingAnchor),
relationshipActionButton.trailingAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.trailingAnchor), relationshipActionButton.trailingAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.trailingAnchor),
relationshipActionButton.bottomAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.bottomAnchor), relationshipActionButton.bottomAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.bottomAnchor),
relationshipActionButton.widthAnchor.constraint(greaterThanOrEqualToConstant: ProfileCardView.friendshipActionButtonSize.width).priority(.required - 1), relationshipActionButtonShadowContainer.widthAnchor.constraint(greaterThanOrEqualToConstant: ProfileCardView.friendshipActionButtonSize.width).priority(.required - 1),
relationshipActionButton.heightAnchor.constraint(equalToConstant: ProfileCardView.friendshipActionButtonSize.height).priority(.defaultHigh), relationshipActionButtonShadowContainer.heightAnchor.constraint(equalToConstant: ProfileCardView.friendshipActionButtonSize.height).priority(.required - 1),
]) ])
let bottomPadding = UIView() let bottomPadding = UIView()
bottomPadding.translatesAutoresizingMaskIntoConstraints = false bottomPadding.translatesAutoresizingMaskIntoConstraints = false
container.addArrangedSubview(bottomPadding) container.addArrangedSubview(bottomPadding)
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
bottomPadding.heightAnchor.constraint(equalToConstant: 16) bottomPadding.heightAnchor.constraint(equalToConstant: 16).priority(.required - 10),
]) ])
relationshipActionButton.addTarget(self, action: #selector(ProfileCardView.relationshipActionButtonDidPressed(_:)), for: .touchUpInside) relationshipActionButton.addTarget(self, action: #selector(ProfileCardView.relationshipActionButtonDidPressed(_:)), for: .touchUpInside)
@ -243,7 +253,27 @@ extension ProfileCardView {
viewModel.userInterfaceStyle = traitCollection.userInterfaceStyle viewModel.userInterfaceStyle = traitCollection.userInterfaceStyle
} }
public override func layoutSubviews() {
updateInfoContainerLayout()
super.layoutSubviews()
}
}
extension ProfileCardView {
public func setupLayoutFrame(_ rect: CGRect) {
frame.size.width = rect.width
bioMetaTextAdaptiveMarginContainerView.frame.size.width = frame.width
bioMetaTextAdaptiveMarginContainerView.contentView?.frame.size.width = frame.width - 2 * bioMetaTextAdaptiveMarginContainerView.margin
infoContainerAdaptiveMarginContainerView.frame.size.width = frame.width
infoContainerAdaptiveMarginContainerView.contentView?.frame.size.width = frame.width - 2 * infoContainerAdaptiveMarginContainerView.margin
}
private func updateInfoContainerLayout() {
let isCompactAdaptive = bounds.width < 350
infoContainer.axis = isCompactAdaptive ? .vertical : .horizontal
}
} }
extension ProfileCardView { extension ProfileCardView {

View File

@ -74,11 +74,9 @@ extension StatusView {
// Sensitive // Sensitive
@Published public var isContentSensitive: Bool = false @Published public var isContentSensitive: Bool = false
@Published public var isContentSensitiveToggled: Bool = false
@Published public var isMediaSensitive: Bool = false @Published public var isMediaSensitive: Bool = false
@Published public var isMediaSensitiveToggled: Bool = false @Published public var isSensitiveToggled = false
@Published public var isSensitive: Bool = false // isContentSensitive || isMediaSensitive
@Published public var isContentReveal: Bool = true @Published public var isContentReveal: Bool = true
@Published public var isMediaReveal: Bool = true @Published public var isMediaReveal: Bool = true
@ -130,9 +128,8 @@ extension StatusView {
authorAvatarImageURL = nil authorAvatarImageURL = nil
isContentSensitive = false isContentSensitive = false
isContentSensitiveToggled = false
isMediaSensitive = false isMediaSensitive = false
isMediaSensitiveToggled = false isSensitiveToggled = false
activeFilters = [] activeFilters = []
filterContext = nil filterContext = nil
@ -161,28 +158,18 @@ extension StatusView {
$spoilerContent $spoilerContent
.map { $0 != nil } .map { $0 != nil }
.assign(to: &$isContentSensitive) .assign(to: &$isContentSensitive)
// isSensitive // isReveal
Publishers.CombineLatest( Publishers.CombineLatest3(
$isContentSensitive, $isContentSensitive,
$isMediaSensitive
)
.map { $0 || $1 }
.assign(to: &$isSensitive)
// $isContentReveal
Publishers.CombineLatest(
$isContentSensitive,
$isContentSensitiveToggled
)
.map { $0 ? $1 : true }
.assign(to: &$isContentReveal)
// $isMediaReveal
Publishers.CombineLatest(
$isMediaSensitive, $isMediaSensitive,
$isMediaSensitiveToggled $isSensitiveToggled
) )
.map { $1 ? !$0 : $0 } .sink { [weak self] isContentSensitive, isMediaSensitive, isSensitiveToggled in
.map { !$0 } guard let self = self else { return }
.assign(to: &$isMediaReveal) self.isContentReveal = isContentSensitive ? isSensitiveToggled : true
self.isMediaReveal = isMediaSensitive ? isSensitiveToggled : true
}
.store(in: &disposeBag)
} }
} }
} }
@ -326,29 +313,22 @@ extension StatusView.ViewModel {
} }
.store(in: &disposeBag) .store(in: &disposeBag)
$isSensitive $isMediaSensitive
.sink { isSensitive in .sink { isSensitive in
guard isSensitive else { return } guard isSensitive else { return }
statusView.setContentSensitiveeToggleButtonDisplay() statusView.setContentSensitiveeToggleButtonDisplay()
} }
.store(in: &disposeBag) .store(in: &disposeBag)
// There are 2 conditions: $isSensitiveToggled
// 1. The content may non-sensitive with sensitive media .sink { isSensitiveToggled in
// 2. The content and media both senstivie // The button indicator go-to state for button action direction
Publishers.CombineLatest( // eye: when media is hidden
$isContentSensitiveToggled, // eye-slash: when media display
$isMediaSensitiveToggled let image = isSensitiveToggled ? UIImage(systemName: "eye.slash.fill") : UIImage(systemName: "eye.fill")
) statusView.contentSensitiveeToggleButton.setImage(image, for: .normal)
.map { $0 || $1 } }
.sink { isSensitiveToggled in .store(in: &disposeBag)
// The button indicator go-to state for button action direction
// eye: when media is hidden
// eye-slash: when media display
let image = isSensitiveToggled ? UIImage(systemName: "eye.slash.fill") : UIImage(systemName: "eye.fill")
statusView.contentSensitiveeToggleButton.setImage(image, for: .normal)
}
.store(in: &disposeBag)
} }
private func bindMedia(statusView: StatusView) { private func bindMedia(statusView: StatusView) {
@ -405,6 +385,7 @@ extension StatusView.ViewModel {
$isMediaReveal $isMediaReveal
.sink { isMediaReveal in .sink { isMediaReveal in
statusView.mediaGridContainerView.contentWarningOverlay.isHidden = isMediaReveal
statusView.mediaGridContainerView.viewModel.isSensitiveToggleButtonDisplay = isMediaReveal statusView.mediaGridContainerView.viewModel.isSensitiveToggleButtonDisplay = isMediaReveal
} }
.store(in: &disposeBag) .store(in: &disposeBag)

View File

@ -508,6 +508,7 @@ extension StatusView.Style {
// status content // status content
statusView.contentContainer.addArrangedSubview(statusView.contentMetaText.textView) statusView.contentContainer.addArrangedSubview(statusView.contentMetaText.textView)
statusView.containerStackView.setCustomSpacing(16, after: statusView.contentMetaText.textView)
statusView.spoilerOverlayView.translatesAutoresizingMaskIntoConstraints = false statusView.spoilerOverlayView.translatesAutoresizingMaskIntoConstraints = false
statusView.containerStackView.addSubview(statusView.spoilerOverlayView) statusView.containerStackView.addSubview(statusView.spoilerOverlayView)

View File

@ -114,7 +114,7 @@ extension ActionToolbarContainer {
container.addArrangedSubview(favoriteButton) container.addArrangedSubview(favoriteButton)
container.addArrangedSubview(shareButton) container.addArrangedSubview(shareButton)
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
replyButton.heightAnchor.constraint(equalToConstant: 44).priority(.defaultHigh), replyButton.heightAnchor.constraint(equalToConstant: 36).priority(.defaultHigh),
replyButton.heightAnchor.constraint(equalTo: reblogButton.heightAnchor).priority(.defaultHigh), replyButton.heightAnchor.constraint(equalTo: reblogButton.heightAnchor).priority(.defaultHigh),
replyButton.heightAnchor.constraint(equalTo: favoriteButton.heightAnchor).priority(.defaultHigh), replyButton.heightAnchor.constraint(equalTo: favoriteButton.heightAnchor).priority(.defaultHigh),
replyButton.heightAnchor.constraint(equalTo: shareButton.heightAnchor).priority(.defaultHigh), replyButton.heightAnchor.constraint(equalTo: shareButton.heightAnchor).priority(.defaultHigh),

View File

@ -7,28 +7,24 @@
import os.log import os.log
import UIKit import UIKit
import MastodonLocalization
public protocol ContentWarningOverlayViewDelegate: AnyObject {
func contentWarningOverlayViewDidPressed(_ contentWarningOverlayView: ContentWarningOverlayView)
}
public final class ContentWarningOverlayView: UIView { public final class ContentWarningOverlayView: UIView {
public static let blurVisualEffect = UIBlurEffect(style: .systemUltraThinMaterial)
let logger = Logger(subsystem: "ContentWarningOverlayView", category: "View") let logger = Logger(subsystem: "ContentWarningOverlayView", category: "View")
public weak var delegate: ContentWarningOverlayViewDelegate? let hintLabel: UILabel = {
let label = UILabel()
public let blurVisualEffectView = UIVisualEffectView(effect: ContentWarningOverlayView.blurVisualEffect) label.font = .systemFont(ofSize: 18, weight: .regular)
public let vibrancyVisualEffectView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: ContentWarningOverlayView.blurVisualEffect)) label.text = L10n.Common.Controls.Status.tapToReveal
// let alertImageView: UIImageView = { label.textAlignment = .center
// let imageView = UIImageView() label.textColor = .white.withAlphaComponent(0.7)
// imageView.image = Asset.Indices.exclamationmarkTriangleLarge.image.withRenderingMode(.alwaysTemplate) label.layer.shadowOpacity = 0.3
// return imageView label.layer.shadowOffset = CGSize(width: 0, height: 2)
// }() label.layer.shadowRadius = 2
label.layer.shadowColor = UIColor.black.cgColor
public let tapGestureRecognizer = UITapGestureRecognizer.singleTapGestureRecognizer return label
}()
override init(frame: CGRect) { override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
@ -44,40 +40,12 @@ public final class ContentWarningOverlayView: UIView {
extension ContentWarningOverlayView { extension ContentWarningOverlayView {
private func _init() { private func _init() {
// overlay hintLabel.translatesAutoresizingMaskIntoConstraints = false
blurVisualEffectView.translatesAutoresizingMaskIntoConstraints = false addSubview(hintLabel)
addSubview(blurVisualEffectView)
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
blurVisualEffectView.topAnchor.constraint(equalTo: topAnchor), hintLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8),
blurVisualEffectView.leadingAnchor.constraint(equalTo: leadingAnchor), trailingAnchor.constraint(equalTo: hintLabel.trailingAnchor, constant: 8),
blurVisualEffectView.trailingAnchor.constraint(equalTo: trailingAnchor), centerYAnchor.constraint(equalTo: hintLabel.centerYAnchor, constant: 10),
blurVisualEffectView.bottomAnchor.constraint(equalTo: bottomAnchor),
]) ])
vibrancyVisualEffectView.translatesAutoresizingMaskIntoConstraints = false
blurVisualEffectView.contentView.addSubview(vibrancyVisualEffectView)
NSLayoutConstraint.activate([
vibrancyVisualEffectView.topAnchor.constraint(equalTo: blurVisualEffectView.contentView.topAnchor),
vibrancyVisualEffectView.leadingAnchor.constraint(equalTo: blurVisualEffectView.contentView.leadingAnchor),
vibrancyVisualEffectView.trailingAnchor.constraint(equalTo: blurVisualEffectView.contentView.trailingAnchor),
vibrancyVisualEffectView.bottomAnchor.constraint(equalTo: blurVisualEffectView.contentView.bottomAnchor),
])
// alertImageView.translatesAutoresizingMaskIntoConstraints = false
// vibrancyVisualEffectView.contentView.addSubview(alertImageView)
// NSLayoutConstraint.activate([
// alertImageView.centerXAnchor.constraint(equalTo: vibrancyVisualEffectView.contentView.centerXAnchor),
// alertImageView.centerYAnchor.constraint(equalTo: vibrancyVisualEffectView.contentView.centerYAnchor),
// ])
tapGestureRecognizer.addTarget(self, action: #selector(ContentWarningOverlayView.tapGestureRecognizerHandler(_:)))
addGestureRecognizer(tapGestureRecognizer)
}
}
extension ContentWarningOverlayView {
@objc private func tapGestureRecognizerHandler(_ sender: UITapGestureRecognizer) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
delegate?.contentWarningOverlayViewDidPressed(self)
} }
} }

Some files were not shown because too many files have changed in this diff Show More