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>
<string>1.3.1</string>
<key>CFBundleVersion</key>
<string>110</string>
<string>113</string>
</dict>
</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}";
"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";
"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>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${content}.</string>
<string>Ci sono %#@count_option@ corrispondenti a «${content}».</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -13,15 +13,15 @@
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 option</string>
<string>1 opzione</string>
<key>other</key>
<string>%ld options</string>
<string>%ld opzioni</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${visibility}.</string>
<string>Ci sono %#@count_option@ corrispondenti a «${visibility}».</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -29,9 +29,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 option</string>
<string>1 opzione</string>
<key>other</key>
<string>%ld options</string>
<string>%ld opzioni</string>
</dict>
</dict>
</dict>

View File

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

View File

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

View File

@ -41,11 +41,11 @@
"block_entire_domain": "Bloquejar Domini"
},
"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."
},
"delete_post": {
"title": "Estàs segur que vols suprimir aquesta publicació?",
"title": "Esborrar Publicació",
"message": "Estàs segur que vols suprimir aquesta publicació?"
},
"clean_cache": {
@ -83,7 +83,7 @@
"share_post": "Compartir Publicació",
"open_in_safari": "Obrir a Safari",
"open_in_browser": "Obre al navegador",
"find_people": "Busca persones per seguir",
"find_people": "Busca persones a seguir",
"manually_search": "Cerca manualment a canvi",
"skip": "Omet",
"reply": "Respon",
@ -110,26 +110,26 @@
"previous_status": "Publicació anterior",
"next_status": "Publicació següent",
"open_status": "Obre la publicació",
"open_author_profile": "Obre el perfil de l'autor",
"open_reblogger_profile": "Obre el perfil del impulsor",
"reply_status": "Respon a la publicació",
"toggle_reblog": "Commuta l'impuls de la publicació",
"toggle_favorite": "Commuta el Favorit de la publicació",
"open_author_profile": "Obre el Perfil de l'Autor",
"open_reblogger_profile": "Obre el Perfil del Impulsor",
"reply_status": "Respon a la Publicació",
"toggle_reblog": "Commuta l'Impuls de la Publicació",
"toggle_favorite": "Commuta el Favorit de la Publicació",
"toggle_content_warning": "Commuta l'Avís de Contingut",
"preview_image": "Vista prèvia de l'Imatge"
},
"segmented_control": {
"previous_section": "Secció anterior",
"next_section": "Secció següent"
"previous_section": "Secció Anterior",
"next_section": "Secció Següent"
}
},
"status": {
"user_reblogged": "%s ha impulsat",
"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",
"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",
"poll": {
"vote": "Vota",
@ -187,15 +187,15 @@
"now": "Ara"
},
"loader": {
"load_missing_posts": "Carrega les publicacions que falten",
"loading_missing_posts": "Carregant les publicacions que falten...",
"load_missing_posts": "Carrega les publicacions faltants",
"loading_missing_posts": "Carregant les publicacions faltants...",
"show_more_replies": "Mostra més respostes"
},
"header": {
"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í.",
"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.",
"suspended_warning": "Aquest usuari ha estat suspès.",
"user_suspended_warning": "El compte de %s ha estat suspès."
@ -210,7 +210,7 @@
"log_in": "Inicia sessió"
},
"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_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": {
@ -271,7 +271,7 @@
"checked": "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": {
"registration_user_invite_request": "Perquè vols unir-te?"
@ -299,7 +299,7 @@
"inclusion": "%s no és un valor suportat"
},
"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)",
"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)"
@ -318,7 +318,7 @@
},
"confirm_email": {
"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": {
"open_email_app": "Obre l'aplicació de correu",
"resend": "Reenvia"
@ -492,6 +492,14 @@
"clear": "Neteja"
}
},
"discovery": {
"tabs": {
"posts": "Publicacions",
"hashtags": "Etiquetes",
"news": "Notícies",
"for_you": "Per a tu"
}
},
"favorite": {
"title": "Els teus Favorits"
},
@ -543,7 +551,7 @@
"anyone": "algú",
"follower": "un seguidor",
"follow": "a qualsevol que segueixi",
"noone": "algú",
"noone": "ningú",
"title": "Notifica'm quan"
}
},

View File

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

View File

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

View File

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

View File

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

View File

@ -492,6 +492,14 @@
"clear": "Clear"
}
},
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"for_you": "For You"
}
},
"favorite": {
"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."
},
"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?"
},
"clean_cache": {
@ -492,6 +492,14 @@
"clear": "Limpiar"
}
},
"discovery": {
"tabs": {
"posts": "Mensajes",
"hashtags": "Etiquetas",
"news": "Novedades",
"for_you": "Para vos"
}
},
"favorite": {
"title": "Tus favoritos"
},

View File

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

View File

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

View File

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

View File

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

View File

@ -130,7 +130,7 @@
"show_user_profile": "Montrer le profil de lutilisateur·rice",
"content_warning": "Avertissement de contenu",
"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": {
"vote": "Voter",
"closed": "Fermé"
@ -143,9 +143,9 @@
"unfavorite": "Retirer des favoris",
"menu": "Menu",
"hide": "Cacher",
"show_image": "Show image",
"show_gif": "Show GIF",
"show_video_player": "Show video player",
"show_image": "Afficher limage",
"show_gif": "Afficher le GIF",
"show_video_player": "Afficher le lecteur vidéo",
"tap_then_hold_to_show_menu": "Tap then hold to show menu"
},
"tag": {
@ -447,10 +447,10 @@
}
},
"accessibility": {
"show_avatar_image": "Show avatar image",
"edit_avatar_image": "Edit avatar image",
"show_banner_image": "Show banner image",
"double_tap_to_open_the_list": "Double tap to open the list"
"show_avatar_image": "Afficher lavatar",
"edit_avatar_image": "Modifier lavatar",
"show_banner_image": "Afficher limage de la bannière",
"double_tap_to_open_the_list": "Appuyer deux fois pour ouvrir la liste"
}
},
"follower": {
@ -492,6 +492,14 @@
"clear": "Effacer"
}
},
"discovery": {
"tabs": {
"posts": "Messages",
"hashtags": "Hashtags",
"news": "Actualité",
"for_you": "Pour vous"
}
},
"favorite": {
"title": "Vos favoris"
},
@ -553,7 +561,7 @@
"disable_avatar_animation": "Désactiver les avatars animés",
"disable_emoji_animation": "Désactiver les émojis animées",
"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": {
"title": "La zone ennuyante",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -115,9 +115,7 @@
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 */; };
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 */; };
DB01E23326A98F0900C3965B /* MastodonMeta in Frameworks */ = {isa = PBXBuildFile; productRef = DB01E23226A98F0900C3965B /* MastodonMeta */; };
DB01E23526A98F0900C3965B /* MetaTextKit in Frameworks */ = {isa = PBXBuildFile; productRef = DB01E23426A98F0900C3965B /* MetaTextKit */; };
DB023D26279FFB0A005AC798 /* ShareActivityProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB023D25279FFB0A005AC798 /* ShareActivityProvider.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 */; };
DB02CDAB26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.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 */; };
DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A794272A981400EE37C5 /* ContentSplitViewController.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 */; };
DB06180A2785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618092785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.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 */; };
DB0C946526A6FD4D0088FB11 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB0C946426A6FD4D0088FB11 /* AlamofireImage */; };
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, ); }; };
DB6804D12637CE4700430867 /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6804D02637CE4700430867 /* UserDefaults.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 */; };
DB68A04A25E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68A04925E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift */; };
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>"; };
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>"; };
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>"; };
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>"; };
@ -1372,7 +1373,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DB0140BD25C40D7500F9F3CF /* CommonOSLog in Frameworks */,
DB9A487E2603456B008B817C /* UITextView+Placeholder in Frameworks */,
2D939AC825EE14620076FA61 /* CropViewController in Frameworks */,
DBB525082611EAC0002F1F29 /* Tabman in Frameworks */,
@ -1382,10 +1382,10 @@
DBAC6483267D0B21007FE9FD /* DifferenceKit in Frameworks */,
DB552D4F26BBD10C00E481F6 /* OrderedCollections in Frameworks */,
2D61336925C18A4F00CAE157 /* AlamofireNetworkActivityIndicator in Frameworks */,
DB01E23326A98F0900C3965B /* MastodonMeta in Frameworks */,
DBAC64A1267E6D02007FE9FD /* Fuzi in Frameworks */,
DB3D0FF325BAA61700EAA174 /* AlamofireImage in Frameworks */,
DBAC649E267DFE43007FE9FD /* DiffableDataSources in Frameworks */,
DB02EA0D280D184B00E751C5 /* CommonOSLog in Frameworks */,
2D5981BA25E4D7F8000FB903 /* ThirdPartyMailer in Frameworks */,
87FFDA5D898A5C42ADCB35E7 /* Pods_Mastodon.framework in Frameworks */,
DBF7A0FC26830C33004176A2 /* FPSIndicator in Frameworks */,
@ -1415,7 +1415,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DB6805102637D0F800430867 /* KeychainAccess in Frameworks */,
DB02EA0B280D180D00E751C5 /* KeychainAccess in Frameworks */,
EE93E8E8F9E0C39EAAEBD92F /* Pods_AppShared.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -2025,6 +2025,14 @@
path = CoreDataStack;
sourceTree = "<group>";
};
DB0A322F280EEA00001729D2 /* View */ = {
isa = PBXGroup;
children = (
DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */,
);
path = View;
sourceTree = "<group>";
};
DB0C947826A7FE950088FB11 /* Button */ = {
isa = PBXGroup;
children = (
@ -3110,6 +3118,7 @@
DBDFF1912805544800557A48 /* Discovery */ = {
isa = PBXGroup;
children = (
DB0A322F280EEA00001729D2 /* View */,
DBDFF19828055A0900557A48 /* Posts */,
DB3E6FDE2806A41200B035AE /* Hashtags */,
DB3E6FED2806D7FC00B035AE /* News */,
@ -3303,7 +3312,6 @@
DB3D0FF225BAA61700EAA174 /* AlamofireImage */,
5D526FE125BE9AC400460CB9 /* MastodonSDK */,
2D61336825C18A4F00CAE157 /* AlamofireNetworkActivityIndicator */,
DB0140BC25C40D7500F9F3CF /* CommonOSLog */,
2D5981B925E4D7F8000FB903 /* ThirdPartyMailer */,
2D939AC725EE14620076FA61 /* CropViewController */,
DB9A487D2603456B008B817C /* UITextView+Placeholder */,
@ -3312,10 +3320,10 @@
DBAC649D267DFE43007FE9FD /* DiffableDataSources */,
DBAC64A0267E6D02007FE9FD /* Fuzi */,
DBF7A0FB26830C33004176A2 /* FPSIndicator */,
DB01E23226A98F0900C3965B /* MastodonMeta */,
DB01E23426A98F0900C3965B /* MetaTextKit */,
DB552D4E26BBD10C00E481F6 /* OrderedCollections */,
DBA5A52E26F07ED800CACBAA /* PanModal */,
DB02EA0C280D184B00E751C5 /* CommonOSLog */,
);
productName = Mastodon;
productReference = DB427DD225BAA00100D1B89D /* Mastodon.app */;
@ -3376,7 +3384,7 @@
);
name = AppShared;
packageProductDependencies = (
DB68050F2637D0F800430867 /* KeychainAccess */,
DB02EA0A280D180D00E751C5 /* KeychainAccess */,
);
productName = AppShared;
productReference = DB68047F2637CD4C00430867 /* AppShared.framework */;
@ -4088,6 +4096,7 @@
DB8AF55D25C138B7002E6C99 /* UIViewController.swift in Sources */,
DB7F48452620241000796008 /* ProfileHeaderViewModel.swift in Sources */,
DB647C5926F1EA2700F7F82C /* WizardPreference.swift in Sources */,
DB0A322E280EE9FD001729D2 /* DiscoveryIntroBannerView.swift in Sources */,
2D3F9E0425DFA133004262D9 /* UITapGestureRecognizer.swift in Sources */,
5DDDF1992617447F00311060 /* Mastodon+Entity+Tag.swift in Sources */,
5B90C45F262599800002E742 /* SettingsToggleTableViewCell.swift in Sources */,
@ -4728,7 +4737,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
@ -4757,7 +4766,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
@ -4865,11 +4874,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 110;
DYLIB_CURRENT_VERSION = 113;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -4896,11 +4905,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 110;
DYLIB_CURRENT_VERSION = 113;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -4925,7 +4934,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -4950,7 +4959,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -4975,7 +4984,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -5000,7 +5009,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -5086,7 +5095,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
@ -5153,11 +5162,11 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 110;
DYLIB_CURRENT_VERSION = 113;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = AppShared/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -5182,7 +5191,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -5206,7 +5215,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = ShareActionExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -5231,7 +5240,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = MastodonIntent/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -5256,7 +5265,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -5280,7 +5289,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 110;
CURRENT_PROJECT_VERSION = 113;
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = NotificationService/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -5421,7 +5430,7 @@
repositoryURL = "https://github.com/TwidereProject/MetaTextKit.git";
requirement = {
kind = exactVersion;
version = 2.2.1;
version = 2.2.2;
};
};
DB0E2D2C26833FF600865C3C /* XCRemoteSwiftPackageReference "Nuke-FLAnimatedImage-Plugin" */ = {
@ -5539,21 +5548,21 @@
package = DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "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 */ = {
isa = XCSwiftPackageProductDependency;
package = DB01E23126A98F0900C3965B /* XCRemoteSwiftPackageReference "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 */ = {
isa = XCSwiftPackageProductDependency;
package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */;
@ -5573,11 +5582,6 @@
package = DB552D4D26BBD10C00E481F6 /* XCRemoteSwiftPackageReference "swift-collections" */;
productName = OrderedCollections;
};
DB68050F2637D0F800430867 /* KeychainAccess */ = {
isa = XCSwiftPackageProductDependency;
package = DB6804722637CC1200430867 /* XCRemoteSwiftPackageReference "KeychainAccess" */;
productName = KeychainAccess;
};
DB6D9F41263527CE008423CD /* AlamofireImage */ = {
isa = XCSwiftPackageProductDependency;
package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */;

View File

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

View File

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

View File

@ -6,8 +6,8 @@
"repositoryURL": "https://github.com/Alamofire/Alamofire.git",
"state": {
"branch": null,
"revision": "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864",
"version": "5.5.0"
"revision": "354dda32d89fc8cd4f5c46487f64957d355f53d8",
"version": "5.6.1"
}
},
{
@ -55,6 +55,15 @@
"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",
"repositoryURL": "https://github.com/Flipboard/FLAnimatedImage.git",
@ -96,8 +105,8 @@
"repositoryURL": "https://github.com/TwidereProject/MetaTextKit.git",
"state": {
"branch": null,
"revision": "3ea336d3de7938dc112084c596a646e697b0feee",
"version": "2.2.1"
"revision": "8074400b3819ef0395550082e6e8e960ef22e1f3",
"version": "2.2.2"
}
},
{
@ -105,8 +114,8 @@
"repositoryURL": "https://github.com/kean/Nuke.git",
"state": {
"branch": null,
"revision": "0db18dd34998cca18e9a28bcee136f84518007a0",
"version": "10.4.1"
"revision": "78fa963b8491fc520791d8c2a509f1b8593d8aae",
"version": "10.7.1"
}
},
{
@ -141,8 +150,8 @@
"repositoryURL": "https://github.com/SDWebImage/SDWebImage.git",
"state": {
"branch": null,
"revision": "2c53f531f1bedd253f55d85105409c28ed4a922c",
"version": "5.12.3"
"revision": "2e63d0061da449ad0ed130768d05dceb1496de44",
"version": "5.12.5"
}
},
{
@ -172,13 +181,22 @@
"version": "1.0.0"
}
},
{
"package": "SwiftSoup",
"repositoryURL": "https://github.com/scinfu/SwiftSoup.git",
"state": {
"branch": null,
"revision": "41e7c263fb8c277e980ebcb9b0b5f6031d3d4886",
"version": "2.4.2"
}
},
{
"package": "Introspect",
"repositoryURL": "https://github.com/siteline/SwiftUI-Introspect.git",
"state": {
"branch": null,
"revision": "2e09be8af614401bc9f87d40093ec19ce56ccaf2",
"version": "0.1.3"
"revision": "f2616860a41f9d9932da412a8978fec79c06fe24",
"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
context.managedObjectContext.performAndWait {
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
.map { $0?.user }
.assign(to: \.me, on: cell.profileCardView.viewModel.relationshipViewModel)
.store(in: &cell.disposeBag)
cell.delegate = configuration.profileCardTableViewCellDelegate
return cell
case .bottomLoader:
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell

View File

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

View File

@ -286,24 +286,8 @@ extension DataSourceFacade {
try await dependency.context.managedObjectContext.perform {
guard let _status = status.object(in: dependency.context.managedObjectContext) else { return }
let status = _status.reblog ?? _status
let allToggled = status.isContentSensitiveToggled && status.isMediaSensitiveToggled
status.update(isContentSensitiveToggled: !allToggled)
status.update(isMediaSensitiveToggled: !allToggled)
status.update(isSensitiveToggled: !status.isSensitiveToggled)
}
}
// 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
return NotificationMediaTransitionContext(
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
return NotificationMediaTransitionContext(
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
}
let managedObjectContext = self.context.managedObjectContext
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
}
let needsToggleMediaSensitive = await !statusView.viewModel.isMediaReveal
guard !needsToggleMediaSensitive else {
try await DataSourceFacade.responseToToggleSensitiveAction(

View File

@ -8,6 +8,7 @@
import os.log
import UIKit
import Combine
import MastodonUI
final class DiscoveryPostsViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {
@ -31,6 +32,8 @@ final class DiscoveryPostsViewController: UIViewController, NeedsDependency, Med
}()
let refreshControl = UIRefreshControl()
let discoveryIntroBannerView = DiscoveryIntroBannerView()
deinit {
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.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
viewModel.setupDiffableDataSource(
@ -146,3 +164,10 @@ extension DiscoveryPostsViewController: ScrollViewContainer {
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
}()
let cellFrameCache = NSCache<NSNumber, NSValue>()
deinit {
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 {
@objc private func refreshControlValueChanged(_ sender: UIRefreshControl) {
@ -162,6 +174,13 @@ extension NotificationTimelineViewController: UITableViewDelegate, AutoGenerateT
// 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) {
guard let item = viewModel.diffableDataSource?.itemIdentifier(for: indexPath) else {
return
@ -172,6 +191,10 @@ extension NotificationTimelineViewController: UITableViewDelegate, AutoGenerateT
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 MastodonAsset
import MastodonLocalization
import MastodonUI
final class MastodonPickServerViewController: UIViewController, NeedsDependency {
@ -144,6 +145,13 @@ extension MastodonPickServerViewController {
pickServerServerSectionTableHeaderViewDelegate: self,
pickServerCellDelegate: self
)
KeyboardResponderService
.configure(
scrollView: tableView,
layoutNeedsUpdate: viewModel.viewDidAppear.eraseToAnyPublisher()
)
.store(in: &disposeBag)
viewModel
.selectedServer
@ -238,6 +246,7 @@ extension MastodonPickServerViewController {
super.viewDidAppear(animated)
tableView.flashScrollIndicators()
viewModel.viewDidAppear.send()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
@ -416,28 +425,6 @@ extension MastodonPickServerViewController: UITableViewDelegate {
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? {
guard let diffableDataSource = viewModel.diffableDataSource else { return nil }
let snapshot = diffableDataSource.snapshot()

View File

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

View File

@ -185,12 +185,12 @@ extension PickServerServerSectionTableHeaderView {
override func accessibilityElementCount() -> Int {
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? {
guard let item = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) else { return nil }
return item
if let item = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) { return item }
return searchTextField
}
}

View File

@ -15,7 +15,7 @@ import MastodonLocalization
final class HeightFixedSearchBar: UISearchBar {
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 {
// 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)")
//
//
// defer {
// collectionView.deselectItem(at: indexPath, animated: true)
// }
//
//
// guard let diffableDataSource = viewModel.diffableDataSource else { return }
// guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return }
//
//
// switch item {
// case .trend(let hashtag):
// let viewModel = HashtagTimelineViewModel(context: context, hashtag: hashtag.name)

View File

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

View File

@ -156,7 +156,6 @@ extension StatusView {
.map { _ in author.avatarImageURL() }
.assign(to: \.authorAvatarImageURL, on: viewModel)
.store(in: &disposeBag)
// author name
Publishers.CombineLatest(
author.publisher(for: \.displayName),
@ -268,25 +267,19 @@ extension StatusView {
.assign(to: \.visibility, on: viewModel)
.store(in: &disposeBag)
// sensitive
status.publisher(for: \.isContentSensitiveToggled)
.assign(to: \.isContentSensitiveToggled, on: viewModel)
viewModel.isContentSensitive = status.isContentSensitive
status.publisher(for: \.isSensitiveToggled)
.assign(to: \.isSensitiveToggled, on: viewModel)
.store(in: &disposeBag)
// viewModel.source = status.source
}
private func configureMedia(status: 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)
viewModel.mediaViewConfigurations = configurations
status.publisher(for: \.isMediaSensitiveToggled)
.assign(to: \.isMediaSensitiveToggled, on: viewModel)
.store(in: &disposeBag)
}
private func configurePoll(status: Status) {

View File

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

View File

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

View File

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>1.3.1</string>
<key>CFBundleVersion</key>
<string>110</string>
<string>113</string>
<key>NSExtension</key>
<dict>
<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/kean/Nuke.git", from: "10.3.1"),
.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/AlamofireImage.git", from: "4.1.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: "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 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: "AlamofireImage", package: "AlamofireImage"),
.product(name: "MetaTextKit", package: "MetaTextKit"),
.product(name: "MastodonMeta", package: "MetaTextKit"),
.product(name: "FLAnimatedImage", package: "FLAnimatedImage"),
.product(name: "FaviconFinder", package: "FaviconFinder"),
]
),
.testTarget(

View File

@ -1,5 +1,5 @@
<?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">
<attribute name="identifier" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
<attribute name="name" attributeType="String"/>
@ -185,8 +185,7 @@
<attribute name="identifier" attributeType="String"/>
<attribute name="inReplyToAccountID" optional="YES" attributeType="String"/>
<attribute name="inReplyToID" optional="YES" attributeType="String"/>
<attribute name="isContentSensitiveToggled" transient="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="isMediaSensitiveToggled" transient="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="isSensitiveToggled" transient="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="language" optional="YES" attributeType="String"/>
<attribute name="mentions" optional="YES" attributeType="Binary"/>
<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="SearchHistory" positionX="0" positionY="0" width="128" height="149"/>
<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="SubscriptionAlerts" positionX="72" positionY="162" width="128" height="164"/>
<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?
// sourcery: autoUpdatableObject
@NSManaged public private(set) var isContentSensitiveToggled: Bool
// sourcery: autoUpdatableObject
@NSManaged public private(set) var isMediaSensitiveToggled: Bool
@NSManaged public private(set) var isSensitiveToggled: Bool
@NSManaged public private(set) var application: Application?
@ -432,14 +430,9 @@ extension Status: AutoUpdatableObject {
self.spoilerText = spoilerText
}
}
public func update(isContentSensitiveToggled: Bool) {
if self.isContentSensitiveToggled != isContentSensitiveToggled {
self.isContentSensitiveToggled = isContentSensitiveToggled
}
}
public func update(isMediaSensitiveToggled: Bool) {
if self.isMediaSensitiveToggled != isMediaSensitiveToggled {
self.isMediaSensitiveToggled = isMediaSensitiveToggled
public func update(isSensitiveToggled: Bool) {
if self.isSensitiveToggled != isSensitiveToggled {
self.isSensitiveToggled = isSensitiveToggled
}
}
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 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 {
/// Your Favorites
public static let title = L10n.tr("Localizable", "Scene.Favorite.Title")

View File

@ -201,6 +201,10 @@
"Scene.ConfirmEmail.Subtitle" = "لقد أرسلنا للتو بريد إلكتروني إلى %@،
انقر على الرابط لتأكيد حسابك.";
"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.Follower.Footer" = "لا يُمكِن عَرض المُتابِعين مِنَ الخوادم الأُخرى.";
"Scene.Following.Footer" = "لا يُمكِن عَرض المُتابَعات مِنَ الخوادم الأُخرى.";

View File

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

View File

@ -5,7 +5,7 @@
"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.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.Title" = "Descarta l'esborrany";
"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.";
"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.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.SignOut.Confirm" = "Tancar 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.Done" = "Fet";
"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.Next" = "Següent";
"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.ShowFavorites" = "Mostra els Favorits";
"Common.Controls.Keyboard.Common.SwitchToTab" = "Canviar a %@";
"Common.Controls.Keyboard.SegmentedControl.NextSection" = "Secció següent";
"Common.Controls.Keyboard.SegmentedControl.PreviousSection" = "Secció anterior";
"Common.Controls.Keyboard.SegmentedControl.NextSection" = "Secció Següent";
"Common.Controls.Keyboard.SegmentedControl.PreviousSection" = "Secció Anterior";
"Common.Controls.Keyboard.Timeline.NextStatus" = "Publicació següent";
"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.OpenAuthorProfile" = "Obre el Perfil de l'Autor";
"Common.Controls.Keyboard.Timeline.OpenRebloggerProfile" = "Obre el Perfil del Impulsor";
"Common.Controls.Keyboard.Timeline.OpenStatus" = "Obre la publicació";
"Common.Controls.Keyboard.Timeline.PreviewImage" = "Vista prèvia de l'Imatge";
"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.ToggleFavorite" = "Commuta el Favorit de la publicació";
"Common.Controls.Keyboard.Timeline.ToggleReblog" = "Commuta l'impuls 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.Status.Actions.Favorite" = "Favorit";
"Common.Controls.Status.Actions.Hide" = "Amaga";
"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.Unreblog" = "Desfer l'impuls";
"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.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.Tag.Email" = "Correu electrònic";
"Common.Controls.Status.Tag.Emoji" = "Emoji";
@ -129,7 +129,7 @@ Comprova la teva connexió a Internet.";
"Common.Controls.Tabs.Search" = "Cerca";
"Common.Controls.Timeline.Filtered" = "Filtrat";
"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
fins que el desbloquegis.
El teu perfil els sembla així.";
@ -141,8 +141,8 @@ El teu perfil els sembla així.";
fins que el desbloquegis.
El teu perfil els sembla així.";
"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.LoadingMissingPosts" = "Carregant les publicacions que falten...";
"Common.Controls.Timeline.Loader.LoadMissingPosts" = "Carrega les publicacions faltants";
"Common.Controls.Timeline.Loader.LoadingMissingPosts" = "Carregant les publicacions faltants...";
"Common.Controls.Timeline.Loader.ShowMoreReplies" = "Mostra més respostes";
"Common.Controls.Timeline.Timestamp.Now" = "Ara";
"Scene.AccountList.AddAccount" = "Afegir compte";
@ -198,9 +198,12 @@ carregat a Mastodon.";
"Scene.ConfirmEmail.OpenEmailApp.Mail" = "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.Subtitle" = "Acabem d'enviar un correu electrònic a %@,
toca l'enllaç per a confirmar el teu compte.";
"Scene.ConfirmEmail.Subtitle" = "Toca l'enllaç del correu electrònic que t'hem enviat per a confirmar el teu compte.";
"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.Follower.Footer" = "Els seguidors 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.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.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.Input.Avatar.Delete" = "Suprimeix";
"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.Unchecked" = "no verificat";
"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.Require" = "La teva contrasenya com a mínim necessita:";
"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.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.Title" = "Tria un servidor,
qualsevol servidor.";
"Scene.ServerPicker.Title" = "Mastodon està fet d'usuaris en diferents comunitats.";
"Scene.ServerRules.Button.Confirm" = "Hi estic d'acord";
"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 %@.";
@ -362,7 +364,7 @@ qualsevol servidor.";
"Scene.Settings.Section.Notifications.Trigger.Anyone" = "algú";
"Scene.Settings.Section.Notifications.Trigger.Follow" = "a qualsevol que segueixi";
"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.Preference.DisableAvatarAnimation" = "Desactiva avatars 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.Reblog" = "Teilen";
"Common.Controls.Status.Actions.Reply" = "Antworten";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu";
"Common.Controls.Status.Actions.ShowGif" = "GIF anzeigen";
"Common.Controls.Status.Actions.ShowImage" = "Bild anzeigen";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Zeige Video-Player";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Halte gedrückt um das Menü anzuzeigen";
"Common.Controls.Status.Actions.Unfavorite" = "Aus Favoriten entfernen";
"Common.Controls.Status.Actions.Unreblog" = "Nicht mehr teilen";
"Common.Controls.Status.ContentWarning" = "Inhaltswarnung";
@ -116,7 +116,7 @@ Bitte überprüfe deine Internetverbindung.";
"Common.Controls.Status.Tag.Link" = "Link";
"Common.Controls.Status.Tag.Mention" = "Erwähnung";
"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.UserRepliedTo" = "Antwortet auf %@";
"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,
tippe darin auf den Link, um Dein Konto zu bestätigen.";
"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.Follower.Footer" = "Follower 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.ShowNext" = "Nächstes anzeigen";
"Scene.Preview.Keyboard.ShowPrevious" = "Vorheriges anzeigen";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Doppeltippen, um die Liste zu öffnen";
"Scene.Profile.Accessibility.EditAvatarImage" = "Profilbild bearbeiten";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Profilbild anzeigen";
"Scene.Profile.Accessibility.ShowBannerImage" = "Bannerbild anzeigen";
"Scene.Profile.Dashboard.Followers" = "Folger";
"Scene.Profile.Dashboard.Following" = "Gefolgte";
"Scene.Profile.Dashboard.Posts" = "Beiträge";
@ -366,7 +370,7 @@ beliebigen Server.";
"Scene.Settings.Section.Notifications.Trigger.Title" = "Benachrichtige mich, wenn";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Animierte Profilbilder 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.TrueBlackDarkMode" = "Vollständig dunkler Dunkelmodus";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Standardbrowser zum Öffnen von Links verwenden";

View File

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

View File

@ -200,6 +200,10 @@ uploaded to Mastodon.";
"Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox.";
"Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account.";
"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.Follower.Footer" = "Followers 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.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.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.Title" = "Descartar borrador";
"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 %@,
pulsá en el enlace para confirmar tu cuenta.";
"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.Follower.Footer" = "No se muestran los seguidores de otros servidores.";
"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 %@,
pulsa en el enlace para confirmar tu cuenta.";
"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.Follower.Footer" = "No se muestran los seguidores 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.Reblog" = "Bultzada";
"Common.Controls.Status.Actions.Reply" = "Erantzun";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu";
"Common.Controls.Status.Actions.ShowGif" = "Erakutsi GIFa";
"Common.Controls.Status.Actions.ShowImage" = "Erakutsi irudia";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Erakutsi bideo-erreproduzigailua";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Sakatu eta eutsi menua erakusteko";
"Common.Controls.Status.Actions.Unfavorite" = "Kendu gogokoa";
"Common.Controls.Status.Actions.Unreblog" = "Desegin bultzada";
"Common.Controls.Status.ContentWarning" = "Edukiaren abisua";
@ -116,7 +116,7 @@ Egiaztatu Interneteko konexioa.";
"Common.Controls.Status.Tag.Link" = "Esteka";
"Common.Controls.Status.Tag.Mention" = "Aipatu";
"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.UserRepliedTo" = "%@(r)i erantzuten";
"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,
sakatu kontua berresteko esteka.";
"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.Follower.Footer" = "Beste zerbitzarietako jarraitzaileak 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.Notification.Keyobard.ShowEverything" = "Erakutsi guztia";
"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.MentionedYou" = "erabiltzaileak aipatu zaitu";
"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.Title.Everything" = "Dena";
"Scene.Notification.Title.Mentions" = "Aipamenak";
"Scene.Preview.Keyboard.ClosePreview" = "Itxi aurrebista";
"Scene.Preview.Keyboard.ShowNext" = "Erakutsi hurrengoa";
"Scene.Preview.Keyboard.ShowPrevious" = "Erakutsi aurrekoa";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Sakatu birritan zerrenda irekitzeko";
"Scene.Profile.Accessibility.EditAvatarImage" = "Editatu abatarra";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Erakutsi abatarra";
"Scene.Profile.Accessibility.ShowBannerImage" = "Erakutsi banner irudia";
"Scene.Profile.Dashboard.Followers" = "jarraitzaile";
"Scene.Profile.Dashboard.Following" = "jarraitzen";
"Scene.Profile.Dashboard.Posts" = "bidalketa";
@ -366,7 +370,7 @@ edozein zerbitzari.";
"Scene.Settings.Section.Notifications.Trigger.Title" = "Noiz jakinarazi:";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Desgaitu abatar 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.TrueBlackDarkMode" = "Benetako modu beltz iluna";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Erabili nabigatzaile lehenetsia estekak irekitzeko";

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>one</key>
<string>1 reply</string>
<string>Erantzun bat</string>
<key>other</key>
<string>%ld replies</string>
<string>%ld erantzun</string>
</dict>
</dict>
<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.Reblog" = "Rebloguer";
"Common.Controls.Status.Actions.Reply" = "Répondre";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player";
"Common.Controls.Status.Actions.ShowGif" = "Afficher le GIF";
"Common.Controls.Status.Actions.ShowImage" = "Afficher limage";
"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.Unfavorite" = "Retirer des favoris";
"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.Mention" = "Mention";
"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.UserRepliedTo" = "À répondu à %@";
"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 à %@,
tapotez le lien pour confirmer votre compte.";
"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.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.";
@ -222,10 +226,10 @@ tapotez le lien pour confirmer votre compte.";
"Scene.Preview.Keyboard.ClosePreview" = "Fermer l'aperçu";
"Scene.Preview.Keyboard.ShowNext" = "Afficher le suivant";
"Scene.Preview.Keyboard.ShowPrevious" = "Afficher le précédent";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Appuyer deux fois pour ouvrir la liste";
"Scene.Profile.Accessibility.EditAvatarImage" = "Modifier lavatar";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Afficher lavatar";
"Scene.Profile.Accessibility.ShowBannerImage" = "Afficher limage de la bannière";
"Scene.Profile.Dashboard.Followers" = "abonnés";
"Scene.Profile.Dashboard.Following" = "abonnements";
"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.Preference.DisableAvatarAnimation" = "Désactiver les avatars animés";
"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.TrueBlackDarkMode" = "Vrai mode sombre";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Utiliser le navigateur par défaut pour ouvrir les liens";

View File

@ -125,9 +125,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>one</key>
<string>1 reply</string>
<string>1 réponse</string>
<key>other</key>
<string>%ld replies</string>
<string>%ld réponses</string>
</dict>
</dict>
<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 %@,
thoir gnogag air a chunntas a dhearbhadh a chunntais agad.";
"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.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.";

View File

@ -195,6 +195,10 @@
"Scene.ConfirmEmail.OpenEmailApp.Title" = "メールを確認";
"Scene.ConfirmEmail.Subtitle" = "先程 %@ にメールを送信しました。リンクをタップしてアカウントを確認してください。";
"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.Follower.Footer" = "他のサーバーからのフォロワーは表示されません。";
"Scene.Following.Footer" = "他のサーバーにいるフォローは表示されません。";

View File

@ -200,6 +200,10 @@ Ad d-yettwasali ɣef Mastodon.";
"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.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.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.";

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,
girêdanê bitikne da ku ajimêra xwe bidî piştrastkirin.";
"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.Follower.Footer" = "Şopîner 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 %@,
klik op de link om uw account te bevestigen.";
"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.Follower.Footer" = "Followers 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.Common.PleaseTryAgain" = "Пожалуйста, попробуйте ещё раз.";
"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.DiscardPostContent.Message" = "Вы действительно хотите удалить набранное содержимое поста?";
"Common.Alerts.DiscardPostContent.Title" = "Удалить черновик";
@ -69,7 +69,7 @@
"Common.Controls.Friendship.Follow" = "Подписаться";
"Common.Controls.Friendship.Following" = "В подписках";
"Common.Controls.Friendship.Mute" = "Игнорировать";
"Common.Controls.Friendship.MuteUser" = "Добавить %@ в игнорируемые";
"Common.Controls.Friendship.MuteUser" = "Игнорировать %@";
"Common.Controls.Friendship.Muted" = "В игнорируемых";
"Common.Controls.Friendship.Pending" = "Отправлен";
"Common.Controls.Friendship.Request" = "Отправить запрос";
@ -94,14 +94,14 @@
"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Добавить или убрать из избранного";
"Common.Controls.Keyboard.Timeline.ToggleReblog" = "Продвинуть или убрать продвижение";
"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.Reblog" = "Продвинуть";
"Common.Controls.Status.Actions.Reply" = "Ответить";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu";
"Common.Controls.Status.Actions.ShowGif" = "Показать GIF";
"Common.Controls.Status.Actions.ShowImage" = "Показать изображение";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Показать видеопроигрыватель";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Нажмите и удерживайте, чтобы показать меню";
"Common.Controls.Status.Actions.Unfavorite" = "Убрать из избранного";
"Common.Controls.Status.Actions.Unreblog" = "Убрать продвижение";
"Common.Controls.Status.ContentWarning" = "Предупреждение о содержании";
@ -116,7 +116,7 @@
"Common.Controls.Status.Tag.Link" = "Ссылка";
"Common.Controls.Status.Tag.Mention" = "Упоминание";
"Common.Controls.Status.Tag.Url" = "Ссылка";
"Common.Controls.Status.TapToReveal" = "Tap to reveal";
"Common.Controls.Status.TapToReveal" = "Нажмите, чтобы показать";
"Common.Controls.Status.UserReblogged" = "%@ продвинул(а)";
"Common.Controls.Status.UserRepliedTo" = "Ответил(а) %@";
"Common.Controls.Status.Visibility.Direct" = "Only mentioned user can see this post.";
@ -198,7 +198,7 @@
"Scene.Compose.Visibility.Public" = "Публичный";
"Scene.Compose.Visibility.Unlisted" = "Скрытый";
"Scene.ConfirmEmail.Button.OpenEmailApp" = "Открыть приложение почты";
"Scene.ConfirmEmail.Button.Resend" = "Resend";
"Scene.ConfirmEmail.Button.Resend" = "Отправить заново";
"Scene.ConfirmEmail.DontReceiveEmail.Description" = "Проверьте, правильно ли указан ваш e-mail адрес, а также папку «спам», если ещё не сделали этого.";
"Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "Отправить ещё раз";
"Scene.ConfirmEmail.DontReceiveEmail.Title" = "Проверьте свой e-mail адрес";
@ -211,6 +211,10 @@
Нажмите на ссылку в нём, чтобы
подтвердить свою учётную запись.";
"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.Follower.Footer" = "Followers 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.Media" = "Медиа";
"Scene.Profile.SegmentedControl.Posts" = "Посты";
"Scene.Profile.SegmentedControl.PostsAndReplies" = "Posts and Replies";
"Scene.Profile.SegmentedControl.PostsAndReplies" = "Посты и ответы";
"Scene.Profile.SegmentedControl.Replies" = "Ответы";
"Scene.Register.Error.Item.Agreement" = "Соглашение";
"Scene.Register.Error.Item.Email" = "E-mail";
@ -298,7 +302,7 @@
"Scene.Report.Step2" = "Шаг 2 из 2";
"Scene.Report.TextPlaceholder" = "Дополнительные комментарии";
"Scene.Report.Title" = "Пожаловаться на %@";
"Scene.Report.TitleReport" = "Report";
"Scene.Report.TitleReport" = "Жалоба";
"Scene.Search.Recommend.Accounts.Description" = "Возможно, вы захотите подписаться на эти профили";
"Scene.Search.Recommend.Accounts.Follow" = "Подписаться";
"Scene.Search.Recommend.Accounts.Title" = "Вам может понравится";
@ -376,7 +380,7 @@
"Scene.Settings.Section.Notifications.Trigger.Title" = "Уведомлять меня, когда";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "Отключить анимацию аватарок";
"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.TrueBlackDarkMode" = "Полноценно чёрный режим";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Использовать браузер по умолчанию для открытия ссылок";
@ -388,10 +392,10 @@
"Scene.SuggestionAccount.Title" = "Подпишитесь на людей";
"Scene.Thread.BackTitle" = "Пост";
"Scene.Thread.Title" = "Пост %@";
"Scene.Welcome.GetStarted" = "Get Started";
"Scene.Welcome.GetStarted" = "Присоединиться";
"Scene.Welcome.LogIn" = "Вход";
"Scene.Welcome.Slogan" = "Социальная сеть
под вашим контролем.";
"Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard";
"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.Subtitle" = "Lähetimme juuri sähköpostin osoitteeseen %@, napauta siinä olevaa linkkiä vahvistaaksesi tilisi.";
"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.Follower.Footer" = "Seuraajia 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.Reblog" = "ดัน";
"Common.Controls.Status.Actions.Reply" = "ตอบกลับ";
"Common.Controls.Status.Actions.ShowGif" = "Show GIF";
"Common.Controls.Status.Actions.ShowImage" = "Show image";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "Show video player";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "Tap then hold to show menu";
"Common.Controls.Status.Actions.ShowGif" = "แสดง GIF";
"Common.Controls.Status.Actions.ShowImage" = "แสดงภาพ";
"Common.Controls.Status.Actions.ShowVideoPlayer" = "แสดงตัวเล่นวิดีโอ";
"Common.Controls.Status.Actions.TapThenHoldToShowMenu" = "แตะค้างไว้เพื่อแสดงเมนู";
"Common.Controls.Status.Actions.Unfavorite" = "เลิกชื่นชอบ";
"Common.Controls.Status.Actions.Unreblog" = "เลิกทำการดัน";
"Common.Controls.Status.ContentWarning" = "คำเตือนเนื้อหา";
@ -116,7 +116,7 @@
"Common.Controls.Status.Tag.Link" = "ลิงก์";
"Common.Controls.Status.Tag.Mention" = "กล่าวถึง";
"Common.Controls.Status.Tag.Url" = "URL";
"Common.Controls.Status.TapToReveal" = "Tap to reveal";
"Common.Controls.Status.TapToReveal" = "แตะเพื่อเปิดเผย";
"Common.Controls.Status.UserReblogged" = "%@ ได้ดัน";
"Common.Controls.Status.UserRepliedTo" = "ตอบกลับ %@";
"Common.Controls.Status.Visibility.Direct" = "เฉพาะผู้ใช้ที่กล่าวถึงเท่านั้นที่สามารถเห็นโพสต์นี้";
@ -200,6 +200,10 @@
"Scene.ConfirmEmail.OpenEmailApp.Title" = "ตรวจสอบกล่องขาเข้าของคุณ";
"Scene.ConfirmEmail.Subtitle" = "แตะลิงก์ที่เราส่งอีเมลถึงคุณเพื่อยืนยันบัญชีของคุณ";
"Scene.ConfirmEmail.Title" = "หนึ่งสิ่งสุดท้าย";
"Scene.Discovery.Tabs.ForYou" = "สำหรับคุณ";
"Scene.Discovery.Tabs.Hashtags" = "แฮชแท็ก";
"Scene.Discovery.Tabs.News" = "ข่าว";
"Scene.Discovery.Tabs.Posts" = "โพสต์";
"Scene.Favorite.Title" = "รายการโปรดของคุณ";
"Scene.Follower.Footer" = "ไม่ได้แสดงผู้ติดตามจากเซิร์ฟเวอร์อื่น ๆ";
"Scene.Following.Footer" = "ไม่ได้แสดงการติดตามจากเซิร์ฟเวอร์อื่น ๆ";
@ -221,10 +225,10 @@
"Scene.Preview.Keyboard.ClosePreview" = "ปิดตัวอย่าง";
"Scene.Preview.Keyboard.ShowNext" = "แสดงถัดไป";
"Scene.Preview.Keyboard.ShowPrevious" = "แสดงก่อนหน้า";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list";
"Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image";
"Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image";
"Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image";
"Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "แตะสองครั้งเพื่อเปิดรายการ";
"Scene.Profile.Accessibility.EditAvatarImage" = "แก้ไขภาพประจำตัว";
"Scene.Profile.Accessibility.ShowAvatarImage" = "แสดงภาพประจำตัว";
"Scene.Profile.Accessibility.ShowBannerImage" = "แสดงภาพแบนเนอร์";
"Scene.Profile.Dashboard.Followers" = "ผู้ติดตาม";
"Scene.Profile.Dashboard.Following" = "กำลังติดตาม";
"Scene.Profile.Dashboard.Posts" = "โพสต์";
@ -364,7 +368,7 @@
"Scene.Settings.Section.Notifications.Trigger.Title" = "แจ้งเตือนฉันเมื่อ";
"Scene.Settings.Section.Preference.DisableAvatarAnimation" = "ปิดใช้งานภาพประจำตัวแบบเคลื่อนไหว";
"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.TrueBlackDarkMode" = "โหมดมืดดำสนิท";
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "ใช้เบราว์เซอร์เริ่มต้นเพื่อเปิดลิงก์";

View File

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

View File

@ -8,8 +8,8 @@
"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.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.Title" = "Lỗi chỉnh sửa trang cá nhân";
"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 hồ sơ";
"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.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.Vote" = "Bình chọn";
"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.Emoji" = "Emoji";
"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.Tabs.Home" = "Bảng tin";
"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.Timeline.Filtered" = "Bộ lọc";
"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.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.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.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.";

View File

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

View File

@ -111,7 +111,7 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>other</key>
<string>%ld replies</string>
<string>%ld 条回复</string>
</dict>
</dict>
<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
}()
// 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
// }()
let contentWarningOverlay = ContentWarningOverlayView()
public override init(frame: CGRect) {
super.init(frame: frame)
@ -86,7 +71,8 @@ public final class MediaGridContainerView: UIView {
extension MediaGridContainerView {
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]
layout.layout(in: self, mediaView: mediaView)
// layoutSensitiveToggleButton()
// bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView)
layoutContentWarningOverlay()
bringSubviewToFront(contentWarningOverlay)
return mediaView
}
@ -124,8 +110,8 @@ extension MediaGridContainerView {
let mediaViews = Array(_mediaViews[0..<layout.count])
layout.layout(in: self, mediaViews: mediaViews)
// layoutSensitiveToggleButton()
// bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView)
layoutContentWarningOverlay()
bringSubviewToFront(contentWarningOverlay)
return mediaViews
}
@ -147,34 +133,16 @@ extension MediaGridContainerView {
}
extension MediaGridContainerView {
// private func layoutSensitiveToggleButton() {
// sensitiveToggleButtonBlurVisualEffectView.translatesAutoresizingMaskIntoConstraints = false
// addSubview(sensitiveToggleButtonBlurVisualEffectView)
// NSLayoutConstraint.activate([
// sensitiveToggleButtonBlurVisualEffectView.topAnchor.constraint(equalTo: topAnchor, constant: 16),
// trailingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.trailingAnchor, constant: 16),
// ])
//
// 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),
// ])
// }
private func layoutContentWarningOverlay() {
contentWarningOverlay.translatesAutoresizingMaskIntoConstraints = false
addSubview(contentWarningOverlay)
NSLayoutConstraint.activate([
contentWarningOverlay.topAnchor.constraint(equalTo: topAnchor),
contentWarningOverlay.leadingAnchor.constraint(equalTo: leadingAnchor),
contentWarningOverlay.trailingAnchor.constraint(equalTo: trailingAnchor),
contentWarningOverlay.bottomAnchor.constraint(equalTo: bottomAnchor),
])
}
}
extension MediaGridContainerView {

View File

@ -9,9 +9,28 @@ import UIKit
import MastodonSDK
import MastodonLocalization
import AlamofireImage
import FaviconFinder
extension NewsView {
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
headlineLabel.text = link.title
footnoteLabel.text = L10n.Plural.peopleTalking(link.talkingPeopleCount ?? 0)

View File

@ -12,6 +12,15 @@ public final class NewsView: UIView {
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 label = UILabel()
label.font = UIFontMetrics(forTextStyle: .footnote).scaledFont(for: .systemFont(ofSize: 13, weight: .semibold))
@ -37,6 +46,7 @@ public final class NewsView: UIView {
let imageView = MediaView()
public func prepareForReuse() {
providerFaviconImageView.tag = (0..<Int.max).randomElement() ?? -1
imageView.prepareForReuse()
}
@ -72,13 +82,28 @@ extension NewsView {
textContainer.spacing = 4
container.addArrangedSubview(textContainer)
// providerContainer: H - [ providerFavIconImageView | providerNameLabel | (spacer) ]
// providerContainer: H - [ providerFaviconImageView | providerNameLabel | (spacer) ]
let providerContainer = UIStackView()
providerContainer.axis = .horizontal
providerContainer.spacing = 4
textContainer.addArrangedSubview(providerContainer)
providerFaviconImageView.translatesAutoresizingMaskIntoConstraints = false
providerContainer.addArrangedSubview(providerFaviconImageView)
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
textContainer.addArrangedSubview(headlineLabel)
let spacer = UIView()

View File

@ -42,6 +42,8 @@ extension ProfileCardView {
@Published public var isBlocking = false
@Published public var isBlockedBy = false
@Published public var groupedAccessibilityLabel = ""
init() {
backgroundColor = ThemeService.shared.currentTheme.value.systemBackgroundColor
Publishers.CombineLatest(
@ -75,6 +77,7 @@ extension ProfileCardView.ViewModel {
bindBio(view: view)
bindRelationship(view: view)
bindDashboard(view: view)
bindAccessibility(view: view)
}
private func bindAppearacne(view: ProfileCardView) {
@ -185,4 +188,27 @@ extension ProfileCardView.ViewModel {
}
.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
public let authorUsernameLabel = MetaLabel(style: .profileCardUsername)
// bio
let bioMetaTextAdaptiveMarginContainerView = AdaptiveMarginContainerView()
let bioMetaText: MetaText = {
let metaText = MetaText()
metaText.textView.backgroundColor = .clear
@ -78,6 +80,9 @@ public final class ProfileCardView: UIView {
return metaText
}()
let infoContainerAdaptiveMarginContainerView = AdaptiveMarginContainerView()
let infoContainer = UIStackView()
let statusDashboardView = ProfileStatusDashboardView()
let relationshipActionButtonShadowContainer = ShadowBackgroundContainer()
@ -179,7 +184,7 @@ extension ProfileCardView {
avatarButtonBackgroundView.layer.masksToBounds = true
avatarButtonBackgroundView.layer.cornerCurve = .continuous
avatarButtonBackgroundView.layer.cornerRadius = 12
avatarButtonBackgroundView.layer.cornerRadius = 12 + 1
avatarButtonBackgroundView.translatesAutoresizingMaskIntoConstraints = false
authorContainer.insertSubview(avatarButtonBackgroundView, belowSubview: avatarButton)
NSLayoutConstraint.activate([
@ -192,31 +197,36 @@ extension ProfileCardView {
// authorInfoContainer: V - [ authorNameLabel | authorUsernameLabel ]
let authorInfoContainer = UIStackView()
authorInfoContainer.axis = .vertical
authorInfoContainer.spacing = 2
// authorInfoContainer.spacing = 2
authorContainer.addArrangedSubview(authorInfoContainer)
authorInfoContainer.addArrangedSubview(authorNameLabel)
authorInfoContainer.addArrangedSubview(authorUsernameLabel)
// bioMetaText
let bioMetaTextAdaptiveMarginContainerView = AdaptiveMarginContainerView()
bioMetaTextAdaptiveMarginContainerView.contentView = bioMetaText.textView
bioMetaTextAdaptiveMarginContainerView.margin = ProfileCardView.contentMargin
bioMetaText.textView.setContentHuggingPriority(.required - 1, for: .vertical)
bioMetaText.textView.setContentCompressionResistancePriority(.required - 1, for: .vertical)
container.addArrangedSubview(bioMetaTextAdaptiveMarginContainerView)
container.setCustomSpacing(16, after: bioMetaTextAdaptiveMarginContainerView)
// infoContainer: H - [ statusDashboardView | (spacer) | relationshipActionButton ]
let infoContainer = UIStackView()
infoContainer.axis = .horizontal
let infoContainerAdaptiveMarginContainerView = AdaptiveMarginContainerView()
infoContainer.spacing = 8
infoContainerAdaptiveMarginContainerView.contentView = infoContainer
infoContainerAdaptiveMarginContainerView.margin = ProfileCardView.contentMargin
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
relationshipActionButtonShadowContainer.addSubview(relationshipActionButton)
NSLayoutConstraint.activate([
@ -224,15 +234,15 @@ extension ProfileCardView {
relationshipActionButton.leadingAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.leadingAnchor),
relationshipActionButton.trailingAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.trailingAnchor),
relationshipActionButton.bottomAnchor.constraint(equalTo: relationshipActionButtonShadowContainer.bottomAnchor),
relationshipActionButton.widthAnchor.constraint(greaterThanOrEqualToConstant: ProfileCardView.friendshipActionButtonSize.width).priority(.required - 1),
relationshipActionButton.heightAnchor.constraint(equalToConstant: ProfileCardView.friendshipActionButtonSize.height).priority(.defaultHigh),
relationshipActionButtonShadowContainer.widthAnchor.constraint(greaterThanOrEqualToConstant: ProfileCardView.friendshipActionButtonSize.width).priority(.required - 1),
relationshipActionButtonShadowContainer.heightAnchor.constraint(equalToConstant: ProfileCardView.friendshipActionButtonSize.height).priority(.required - 1),
])
let bottomPadding = UIView()
bottomPadding.translatesAutoresizingMaskIntoConstraints = false
container.addArrangedSubview(bottomPadding)
NSLayoutConstraint.activate([
bottomPadding.heightAnchor.constraint(equalToConstant: 16)
bottomPadding.heightAnchor.constraint(equalToConstant: 16).priority(.required - 10),
])
relationshipActionButton.addTarget(self, action: #selector(ProfileCardView.relationshipActionButtonDidPressed(_:)), for: .touchUpInside)
@ -243,7 +253,27 @@ extension ProfileCardView {
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 {

View File

@ -74,11 +74,9 @@ extension StatusView {
// Sensitive
@Published public var isContentSensitive: Bool = false
@Published public var isContentSensitiveToggled: Bool = false
@Published public var isMediaSensitive: Bool = false
@Published public var isMediaSensitiveToggled: Bool = false
@Published public var isSensitive: Bool = false // isContentSensitive || isMediaSensitive
@Published public var isSensitiveToggled = false
@Published public var isContentReveal: Bool = true
@Published public var isMediaReveal: Bool = true
@ -130,9 +128,8 @@ extension StatusView {
authorAvatarImageURL = nil
isContentSensitive = false
isContentSensitiveToggled = false
isMediaSensitive = false
isMediaSensitiveToggled = false
isSensitiveToggled = false
activeFilters = []
filterContext = nil
@ -161,28 +158,18 @@ extension StatusView {
$spoilerContent
.map { $0 != nil }
.assign(to: &$isContentSensitive)
// isSensitive
Publishers.CombineLatest(
// isReveal
Publishers.CombineLatest3(
$isContentSensitive,
$isMediaSensitive
)
.map { $0 || $1 }
.assign(to: &$isSensitive)
// $isContentReveal
Publishers.CombineLatest(
$isContentSensitive,
$isContentSensitiveToggled
)
.map { $0 ? $1 : true }
.assign(to: &$isContentReveal)
// $isMediaReveal
Publishers.CombineLatest(
$isMediaSensitive,
$isMediaSensitiveToggled
$isSensitiveToggled
)
.map { $1 ? !$0 : $0 }
.map { !$0 }
.assign(to: &$isMediaReveal)
.sink { [weak self] isContentSensitive, isMediaSensitive, isSensitiveToggled in
guard let self = self else { return }
self.isContentReveal = isContentSensitive ? isSensitiveToggled : true
self.isMediaReveal = isMediaSensitive ? isSensitiveToggled : true
}
.store(in: &disposeBag)
}
}
}
@ -326,29 +313,22 @@ extension StatusView.ViewModel {
}
.store(in: &disposeBag)
$isSensitive
$isMediaSensitive
.sink { isSensitive in
guard isSensitive else { return }
statusView.setContentSensitiveeToggleButtonDisplay()
}
.store(in: &disposeBag)
// There are 2 conditions:
// 1. The content may non-sensitive with sensitive media
// 2. The content and media both senstivie
Publishers.CombineLatest(
$isContentSensitiveToggled,
$isMediaSensitiveToggled
)
.map { $0 || $1 }
.sink { isSensitiveToggled in
// 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)
$isSensitiveToggled
.sink { isSensitiveToggled in
// 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) {
@ -405,6 +385,7 @@ extension StatusView.ViewModel {
$isMediaReveal
.sink { isMediaReveal in
statusView.mediaGridContainerView.contentWarningOverlay.isHidden = isMediaReveal
statusView.mediaGridContainerView.viewModel.isSensitiveToggleButtonDisplay = isMediaReveal
}
.store(in: &disposeBag)

View File

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

View File

@ -114,7 +114,7 @@ extension ActionToolbarContainer {
container.addArrangedSubview(favoriteButton)
container.addArrangedSubview(shareButton)
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: favoriteButton.heightAnchor).priority(.defaultHigh),
replyButton.heightAnchor.constraint(equalTo: shareButton.heightAnchor).priority(.defaultHigh),

View File

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