diff --git a/AppShared/Info.plist b/AppShared/Info.plist index 66a4b22f5..920eaff87 100644 --- a/AppShared/Info.plist +++ b/AppShared/Info.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.3.1 CFBundleVersion - 110 + 113 diff --git a/Localization/StringsConvertor/Intents/input/it_IT/Intents.strings b/Localization/StringsConvertor/Intents/input/it_IT/Intents.strings index 6877490ba..d26aef14b 100644 --- a/Localization/StringsConvertor/Intents/input/it_IT/Intents.strings +++ b/Localization/StringsConvertor/Intents/input/it_IT/Intents.strings @@ -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. "; diff --git a/Localization/StringsConvertor/Intents/input/it_IT/Intents.stringsdict b/Localization/StringsConvertor/Intents/input/it_IT/Intents.stringsdict index 18422c772..75d98a9e1 100644 --- a/Localization/StringsConvertor/Intents/input/it_IT/Intents.stringsdict +++ b/Localization/StringsConvertor/Intents/input/it_IT/Intents.stringsdict @@ -5,7 +5,7 @@ There are ${count} options matching ‘${content}’. - 2 NSStringLocalizedFormatKey - There are %#@count_option@ matching ‘${content}’. + Ci sono %#@count_option@ corrispondenti a «${content}». count_option NSStringFormatSpecTypeKey @@ -13,15 +13,15 @@ NSStringFormatValueTypeKey %ld one - 1 option + 1 opzione other - %ld options + %ld opzioni There are ${count} options matching ‘${visibility}’. NSStringLocalizedFormatKey - There are %#@count_option@ matching ‘${visibility}’. + Ci sono %#@count_option@ corrispondenti a «${visibility}». count_option NSStringFormatSpecTypeKey @@ -29,9 +29,9 @@ NSStringFormatValueTypeKey %ld one - 1 option + 1 opzione other - %ld options + %ld opzioni diff --git a/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict b/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict index 32782f1c0..c2f641720 100644 --- a/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict +++ b/Localization/StringsConvertor/input/ar_SA/Localizable.stringsdict @@ -471,15 +471,15 @@ zero مُنذُ لَحظة one - مُنذُ سنة + مُنذُ %ldع two - مُنذُ سنتين + مُنذُ %ldع few - مُنذُ %ld سنين + مُنذُ %ldع many - مُنذُ %ld سنةً + مُنذُ %ldع other - مُنذُ %ld سنة + مُنذُ %ldع date.month.ago.abbr @@ -495,15 +495,15 @@ zero مُنذُ لَحظة one - مُنذُ شهر + مُنذُ %ldش two - مُنذُ شهرين + مُنذُ %ldش few - مُنذُ %ld أشهُر + مُنذُ %ldش many - مُنذُ %ld شهرًا + مُنذُ %ldش other - مُنذُ %ld شهر + مُنذُ %ldش date.day.ago.abbr @@ -519,15 +519,15 @@ zero مُنذُ لَحظة one - مُنذُ يوم + مُنذُ %ldي two - مُنذُ يومين + مُنذُ %ldي few - مُنذُ %ld أيام + مُنذُ %ldي many - مُنذُ %ld يومًا + مُنذُ %ldي other - مُنذُ %ld يوم + مُنذُ %ldي date.hour.ago.abbr @@ -543,15 +543,15 @@ zero مُنذُ لَحظة one - مُنذُ ساعة + مُنذُ %ldس two - مُنذُ ساعتين + مُنذُ %ldس few - مُنذُ %ld ساعات + مُنذُ %ldس many - مُنذُ %ld ساعةًَ + مُنذُ %ldس other - مُنذُ %ld ساعة + مُنذُ %ldس date.minute.ago.abbr @@ -567,15 +567,15 @@ zero مُنذُ لَحظة one - مُنذُ دقيقة + مُنذُ %ldد two - مُنذُ دقيقتان + مُنذُ %ldد few - مُنذُ %ld دقائق + مُنذُ %ldد many - مُنذُ %ld دقيقةً + مُنذُ %ldد other - مُنذُ %ld دقيقة + مُنذُ %ldد date.second.ago.abbr @@ -591,15 +591,15 @@ zero مُنذُ لَحظة one - مُنذُ ثانية + مُنذُ %ldث two - مُنذُ ثانيتين + مُنذُ %ldث few - مُنذُ %ld ثوان + مُنذُ %ldث many - مُنذُ %ld ثانية + مُنذُ %ldث other - مُنذُ %ld ثانية + مُنذُ %ldث diff --git a/Localization/StringsConvertor/input/ar_SA/app.json b/Localization/StringsConvertor/input/ar_SA/app.json index 6a6fdcd41..d9712536b 100644 --- a/Localization/StringsConvertor/input/ar_SA/app.json +++ b/Localization/StringsConvertor/input/ar_SA/app.json @@ -492,6 +492,14 @@ "clear": "مَحو" } }, + "discovery": { + "tabs": { + "posts": "المنشورات", + "hashtags": "الوسوم", + "news": "الأخبار", + "for_you": "For You" + } + }, "favorite": { "title": "مُفضَّلَتُك" }, diff --git a/Localization/StringsConvertor/input/ca_ES/app.json b/Localization/StringsConvertor/input/ca_ES/app.json index 1c73b9177..c3484260a 100644 --- a/Localization/StringsConvertor/input/ca_ES/app.json +++ b/Localization/StringsConvertor/input/ca_ES/app.json @@ -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" } }, diff --git a/Localization/StringsConvertor/input/cy_GB/app.json b/Localization/StringsConvertor/input/cy_GB/app.json index f0dc0ebf1..548c5adae 100644 --- a/Localization/StringsConvertor/input/cy_GB/app.json +++ b/Localization/StringsConvertor/input/cy_GB/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/da_DK/app.json b/Localization/StringsConvertor/input/da_DK/app.json index f0dc0ebf1..548c5adae 100644 --- a/Localization/StringsConvertor/input/da_DK/app.json +++ b/Localization/StringsConvertor/input/da_DK/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict b/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict index cd7218623..20e8b615e 100644 --- a/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict +++ b/Localization/StringsConvertor/input/de_DE/Localizable.stringsdict @@ -125,9 +125,9 @@ NSStringFormatValueTypeKey ld one - 1 reply + 1 Antwort other - %ld replies + %ld Antworten plural.count.vote diff --git a/Localization/StringsConvertor/input/de_DE/app.json b/Localization/StringsConvertor/input/de_DE/app.json index e36015953..522b3f772 100644 --- a/Localization/StringsConvertor/input/de_DE/app.json +++ b/Localization/StringsConvertor/input/de_DE/app.json @@ -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", diff --git a/Localization/StringsConvertor/input/en_US/app.json b/Localization/StringsConvertor/input/en_US/app.json index f0dc0ebf1..548c5adae 100644 --- a/Localization/StringsConvertor/input/en_US/app.json +++ b/Localization/StringsConvertor/input/en_US/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/es_AR/app.json b/Localization/StringsConvertor/input/es_AR/app.json index c90fcb35d..581ccd83c 100644 --- a/Localization/StringsConvertor/input/es_AR/app.json +++ b/Localization/StringsConvertor/input/es_AR/app.json @@ -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" }, diff --git a/Localization/StringsConvertor/input/es_ES/app.json b/Localization/StringsConvertor/input/es_ES/app.json index e9f352cb8..d4215ecb9 100644 --- a/Localization/StringsConvertor/input/es_ES/app.json +++ b/Localization/StringsConvertor/input/es_ES/app.json @@ -492,6 +492,14 @@ "clear": "Borrar" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Tus Favoritos" }, diff --git a/Localization/StringsConvertor/input/eu_ES/Localizable.stringsdict b/Localization/StringsConvertor/input/eu_ES/Localizable.stringsdict index 2069e27a3..871fb10bc 100644 --- a/Localization/StringsConvertor/input/eu_ES/Localizable.stringsdict +++ b/Localization/StringsConvertor/input/eu_ES/Localizable.stringsdict @@ -125,9 +125,9 @@ NSStringFormatValueTypeKey ld one - 1 reply + Erantzun bat other - %ld replies + %ld erantzun plural.count.vote diff --git a/Localization/StringsConvertor/input/eu_ES/app.json b/Localization/StringsConvertor/input/eu_ES/app.json index ff249acd4..8547ae263 100644 --- a/Localization/StringsConvertor/input/eu_ES/app.json +++ b/Localization/StringsConvertor/input/eu_ES/app.json @@ -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", diff --git a/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict b/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict index 93ee696f2..5c2b14978 100644 --- a/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict +++ b/Localization/StringsConvertor/input/fr_FR/Localizable.stringsdict @@ -125,9 +125,9 @@ NSStringFormatValueTypeKey ld one - 1 reply + 1 réponse other - %ld replies + %ld réponses plural.count.vote diff --git a/Localization/StringsConvertor/input/fr_FR/app.json b/Localization/StringsConvertor/input/fr_FR/app.json index 248253e98..642d2c371 100644 --- a/Localization/StringsConvertor/input/fr_FR/app.json +++ b/Localization/StringsConvertor/input/fr_FR/app.json @@ -130,7 +130,7 @@ "show_user_profile": "Montrer le profil de l’utilisateur·rice", "content_warning": "Avertissement de contenu", "media_content_warning": "Tapotez n’importe 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 l’image", + "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 l’avatar", + "edit_avatar_image": "Modifier l’avatar", + "show_banner_image": "Afficher l’image 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", diff --git a/Localization/StringsConvertor/input/gd_GB/app.json b/Localization/StringsConvertor/input/gd_GB/app.json index 236ad4735..7053105dc 100644 --- a/Localization/StringsConvertor/input/gd_GB/app.json +++ b/Localization/StringsConvertor/input/gd_GB/app.json @@ -492,6 +492,14 @@ "clear": "Falamhaich" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Na h-annsachdan agad" }, diff --git a/Localization/StringsConvertor/input/hi_IN/app.json b/Localization/StringsConvertor/input/hi_IN/app.json index a33a4f62c..846a3f66f 100644 --- a/Localization/StringsConvertor/input/hi_IN/app.json +++ b/Localization/StringsConvertor/input/hi_IN/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/id_ID/app.json b/Localization/StringsConvertor/input/id_ID/app.json index 1de960d1b..c6fe56107 100644 --- a/Localization/StringsConvertor/input/id_ID/app.json +++ b/Localization/StringsConvertor/input/id_ID/app.json @@ -492,6 +492,14 @@ "clear": "Hapus" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/it_IT/Localizable.stringsdict b/Localization/StringsConvertor/input/it_IT/Localizable.stringsdict index 48222f420..710980608 100644 --- a/Localization/StringsConvertor/input/it_IT/Localizable.stringsdict +++ b/Localization/StringsConvertor/input/it_IT/Localizable.stringsdict @@ -95,7 +95,7 @@ one 1 preferito other - %ld favorites + %ld preferiti plural.count.reblog @@ -189,9 +189,9 @@ NSStringFormatValueTypeKey ld one - 1 seguace + 1 following other - %ld following + %ld stanno seguendo plural.count.follower @@ -205,9 +205,9 @@ NSStringFormatValueTypeKey ld one - 1 follower + 1 seguace other - %ld followers + %ld seguaci date.year.left @@ -221,9 +221,9 @@ NSStringFormatValueTypeKey ld one - 1 year left + 1 anno rimasto other - %ld years left + %ld anni rimasti date.month.left @@ -237,9 +237,9 @@ NSStringFormatValueTypeKey ld one - 1 months left + 1 mese rimasto other - %ld months left + %ld mesi rimasti date.day.left @@ -253,9 +253,9 @@ NSStringFormatValueTypeKey ld one - 1 day left + 1 giorno rimasto other - %ld days left + %ld giorni rimasti date.hour.left @@ -269,9 +269,9 @@ NSStringFormatValueTypeKey ld one - 1 hour left + 1 ora rimasta other - %ld hours left + %ld ore rimaste date.minute.left @@ -285,9 +285,9 @@ NSStringFormatValueTypeKey ld one - 1 minute left + 1 minuto rimasto other - %ld minutes left + %ld minuti rimasti date.second.left @@ -301,9 +301,9 @@ NSStringFormatValueTypeKey ld one - 1 second left + 1 secondo rimasto other - %ld seconds left + %ld secondi rimasti date.year.ago.abbr @@ -317,9 +317,9 @@ NSStringFormatValueTypeKey ld one - 1y ago + 1 anno fa other - %ldy ago + %ld anni fa date.month.ago.abbr @@ -333,9 +333,9 @@ NSStringFormatValueTypeKey ld one - 1M ago + 1 mese fa other - %ldM ago + %ld mesi fa date.day.ago.abbr @@ -349,9 +349,9 @@ NSStringFormatValueTypeKey ld one - 1d ago + 1 giorno fa other - %ldd ago + %ld giorni fa date.hour.ago.abbr @@ -365,9 +365,9 @@ NSStringFormatValueTypeKey ld one - 1h ago + 1 ora fa other - %ldh ago + %ld ore fa date.minute.ago.abbr @@ -381,9 +381,9 @@ NSStringFormatValueTypeKey ld one - 1m ago + 1 minuto fa other - %ldm ago + %ld minuti fa date.second.ago.abbr @@ -397,9 +397,9 @@ NSStringFormatValueTypeKey ld one - 1s ago + 1 secondo fa other - %lds ago + %ld secondi fa diff --git a/Localization/StringsConvertor/input/it_IT/app.json b/Localization/StringsConvertor/input/it_IT/app.json index c839cbefa..240440163 100644 --- a/Localization/StringsConvertor/input/it_IT/app.json +++ b/Localization/StringsConvertor/input/it_IT/app.json @@ -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": "Let’s 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 (can’t 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 you’d like to add to the report?", - "content2": "Is there anything the moderators should know about this report?", - "report_sent_title": "Thanks for reporting, we’ll 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" } } } \ No newline at end of file diff --git a/Localization/StringsConvertor/input/ja_JP/app.json b/Localization/StringsConvertor/input/ja_JP/app.json index 5117c19fd..fb16cf4b2 100644 --- a/Localization/StringsConvertor/input/ja_JP/app.json +++ b/Localization/StringsConvertor/input/ja_JP/app.json @@ -492,6 +492,14 @@ "clear": "クリア" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "お気に入り" }, diff --git a/Localization/StringsConvertor/input/kab_KAB/app.json b/Localization/StringsConvertor/input/kab_KAB/app.json index feb257001..08de0aef7 100644 --- a/Localization/StringsConvertor/input/kab_KAB/app.json +++ b/Localization/StringsConvertor/input/kab_KAB/app.json @@ -492,6 +492,14 @@ "clear": "Sfeḍ" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Ismenyifen-ik·im" }, diff --git a/Localization/StringsConvertor/input/kmr_TR/app.json b/Localization/StringsConvertor/input/kmr_TR/app.json index ffa345778..61fb70338 100644 --- a/Localization/StringsConvertor/input/kmr_TR/app.json +++ b/Localization/StringsConvertor/input/kmr_TR/app.json @@ -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" }, diff --git a/Localization/StringsConvertor/input/ko_KR/app.json b/Localization/StringsConvertor/input/ko_KR/app.json index e75a2ae0c..ab079573e 100644 --- a/Localization/StringsConvertor/input/ko_KR/app.json +++ b/Localization/StringsConvertor/input/ko_KR/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/nl_NL/app.json b/Localization/StringsConvertor/input/nl_NL/app.json index 6d004c555..7a0e37a24 100644 --- a/Localization/StringsConvertor/input/nl_NL/app.json +++ b/Localization/StringsConvertor/input/nl_NL/app.json @@ -492,6 +492,14 @@ "clear": "Wissen" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Uw favorieten" }, diff --git a/Localization/StringsConvertor/input/pt_BR/app.json b/Localization/StringsConvertor/input/pt_BR/app.json index f0dc0ebf1..548c5adae 100644 --- a/Localization/StringsConvertor/input/pt_BR/app.json +++ b/Localization/StringsConvertor/input/pt_BR/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/pt_PT/app.json b/Localization/StringsConvertor/input/pt_PT/app.json index f0dc0ebf1..548c5adae 100644 --- a/Localization/StringsConvertor/input/pt_PT/app.json +++ b/Localization/StringsConvertor/input/pt_PT/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/ro_RO/app.json b/Localization/StringsConvertor/input/ro_RO/app.json index eeb4dc865..1b776e792 100644 --- a/Localization/StringsConvertor/input/ro_RO/app.json +++ b/Localization/StringsConvertor/input/ro_RO/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/ru_RU/app.json b/Localization/StringsConvertor/input/ru_RU/app.json index 0309c4630..ca040eeb8 100644 --- a/Localization/StringsConvertor/input/ru_RU/app.json +++ b/Localization/StringsConvertor/input/ru_RU/app.json @@ -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" } diff --git a/Localization/StringsConvertor/input/sv_FI/app.json b/Localization/StringsConvertor/input/sv_FI/app.json index 5bb7c8b70..769aadc5b 100644 --- a/Localization/StringsConvertor/input/sv_FI/app.json +++ b/Localization/StringsConvertor/input/sv_FI/app.json @@ -492,6 +492,14 @@ "clear": "Tyhjennä" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Omat suosikit" }, diff --git a/Localization/StringsConvertor/input/sv_SE/app.json b/Localization/StringsConvertor/input/sv_SE/app.json index d21203af3..f18ce2dc8 100644 --- a/Localization/StringsConvertor/input/sv_SE/app.json +++ b/Localization/StringsConvertor/input/sv_SE/app.json @@ -492,6 +492,14 @@ "clear": "Rensa" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict b/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict index 3895c3993..8ae8feb7b 100644 --- a/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict +++ b/Localization/StringsConvertor/input/th_TH/Localizable.stringsdict @@ -111,7 +111,7 @@ NSStringFormatValueTypeKey ld other - %ld replies + %ld การตอบกลับ plural.count.vote diff --git a/Localization/StringsConvertor/input/th_TH/app.json b/Localization/StringsConvertor/input/th_TH/app.json index 183f9cfc9..b771f951f 100644 --- a/Localization/StringsConvertor/input/th_TH/app.json +++ b/Localization/StringsConvertor/input/th_TH/app.json @@ -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": "โซนน่าเบื่อ", diff --git a/Localization/StringsConvertor/input/vi_VN/app.json b/Localization/StringsConvertor/input/vi_VN/app.json index eafd513bc..5aa16c958 100644 --- a/Localization/StringsConvertor/input/vi_VN/app.json +++ b/Localization/StringsConvertor/input/vi_VN/app.json @@ -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" }, diff --git a/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict b/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict index 418903836..6c2661ee5 100644 --- a/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict +++ b/Localization/StringsConvertor/input/zh_CN/Localizable.stringsdict @@ -111,7 +111,7 @@ NSStringFormatValueTypeKey ld other - %ld replies + %ld 条回复 plural.count.vote diff --git a/Localization/StringsConvertor/input/zh_CN/app.json b/Localization/StringsConvertor/input/zh_CN/app.json index e0b3e084d..db871d5a9 100644 --- a/Localization/StringsConvertor/input/zh_CN/app.json +++ b/Localization/StringsConvertor/input/zh_CN/app.json @@ -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", diff --git a/Localization/StringsConvertor/input/zh_TW/app.json b/Localization/StringsConvertor/input/zh_TW/app.json index e1e613233..909bd7c65 100644 --- a/Localization/StringsConvertor/input/zh_TW/app.json +++ b/Localization/StringsConvertor/input/zh_TW/app.json @@ -492,6 +492,14 @@ "clear": "Clear" } }, + "discovery": { + "tabs": { + "posts": "Posts", + "hashtags": "Hashtags", + "news": "News", + "for_you": "For You" + } + }, "favorite": { "title": "Your Favorites" }, diff --git a/Localization/app.json b/Localization/app.json index 548c5adae..a8fc9031f 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -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" diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 54c682956..8b212674c 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -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 = ""; }; DB0618092785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonRegisterAvatarTableViewCell.swift; sourceTree = ""; }; DB084B5625CBC56C00F898ED /* Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = ""; }; + DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryIntroBannerView.swift; sourceTree = ""; }; DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Instance.swift"; sourceTree = ""; }; DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAvatarButton.swift; sourceTree = ""; }; DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListCollectionViewCell.swift; sourceTree = ""; }; @@ -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 = ""; }; + DB0A322F280EEA00001729D2 /* View */ = { + isa = PBXGroup; + children = ( + DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */, + ); + path = View; + sourceTree = ""; + }; 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" */; diff --git a/Mastodon.xcodeproj/xcshareddata/xcschemes/Mastodon.xcscheme b/Mastodon.xcodeproj/xcshareddata/xcschemes/Mastodon.xcscheme index 048ce3cf5..488d5a2da 100644 --- a/Mastodon.xcodeproj/xcshareddata/xcschemes/Mastodon.xcscheme +++ b/Mastodon.xcodeproj/xcshareddata/xcschemes/Mastodon.xcscheme @@ -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"> - - - - MastodonIntent.xcscheme_^#shared#^_ orderHint - 33 + 30 MastodonIntents.xcscheme_^#shared#^_ @@ -124,12 +124,12 @@ NotificationService.xcscheme_^#shared#^_ orderHint - 32 + 31 ShareActionExtension.xcscheme_^#shared#^_ orderHint - 31 + 23 SuppressBuildableAutocreation diff --git a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved index 11d453883..53f6a3a4c 100644 --- a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -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" } }, { diff --git a/Mastodon/Diffiable/Discovery/DiscoverySection.swift b/Mastodon/Diffiable/Discovery/DiscoverySection.swift index 76cc9c030..cab2eb82b 100644 --- a/Mastodon/Diffiable/Discovery/DiscoverySection.swift +++ b/Mastodon/Diffiable/Discovery/DiscoverySection.swift @@ -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 diff --git a/Mastodon/Info.plist b/Mastodon/Info.plist index 88b45ec38..0bd118781 100644 --- a/Mastodon/Info.plist +++ b/Mastodon/Info.plist @@ -43,7 +43,7 @@ CFBundleVersion - 110 + 113 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/Mastodon/Protocol/Provider/DataSourceFacade+Status.swift b/Mastodon/Protocol/Provider/DataSourceFacade+Status.swift index eab85e95e..36ceb6dd6 100644 --- a/Mastodon/Protocol/Provider/DataSourceFacade+Status.swift +++ b/Mastodon/Protocol/Provider/DataSourceFacade+Status.swift @@ -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 -// ) 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) -// } -// } - } diff --git a/Mastodon/Protocol/Provider/DataSourceProvider+NotificationTableViewCellDelegate.swift b/Mastodon/Protocol/Provider/DataSourceProvider+NotificationTableViewCellDelegate.swift index 0924028ff..f6e58673b 100644 --- a/Mastodon/Protocol/Provider/DataSourceProvider+NotificationTableViewCellDelegate.swift +++ b/Mastodon/Protocol/Provider/DataSourceProvider+NotificationTableViewCellDelegate.swift @@ -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 ) } diff --git a/Mastodon/Protocol/Provider/DataSourceProvider+StatusTableViewCellDelegate.swift b/Mastodon/Protocol/Provider/DataSourceProvider+StatusTableViewCellDelegate.swift index d14b5c346..9e5838e77 100644 --- a/Mastodon/Protocol/Provider/DataSourceProvider+StatusTableViewCellDelegate.swift +++ b/Mastodon/Protocol/Provider/DataSourceProvider+StatusTableViewCellDelegate.swift @@ -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( diff --git a/Mastodon/Scene/Discovery/Posts/DiscoveryPostsViewController.swift b/Mastodon/Scene/Discovery/Posts/DiscoveryPostsViewController.swift index 30e2faf96..259b21d36 100644 --- a/Mastodon/Scene/Discovery/Posts/DiscoveryPostsViewController.swift +++ b/Mastodon/Scene/Discovery/Posts/DiscoveryPostsViewController.swift @@ -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 + } +} diff --git a/Mastodon/Scene/Discovery/View/DiscoveryIntroBannerView.swift b/Mastodon/Scene/Discovery/View/DiscoveryIntroBannerView.swift new file mode 100644 index 000000000..e3e1c4547 --- /dev/null +++ b/Mastodon/Scene/Discovery/View/DiscoveryIntroBannerView.swift @@ -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() + + 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 + } + +} diff --git a/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewController.swift b/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewController.swift index bdb4d05cb..16130251c 100644 --- a/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewController.swift +++ b/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewController.swift @@ -39,6 +39,8 @@ final class NotificationTimelineViewController: UIViewController, NeedsDependenc return tableView }() + let cellFrameCache = NSCache() + 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) + } } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 2d43faa56..b86c952a4 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -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() diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index af38b110b..59008c530 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -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() - + let viewDidAppear = CurrentValueSubject(Void()) + // output var diffableDataSource: UITableViewDiffableDataSource? private(set) lazy var loadIndexedServerStateMachine: GKStateMachine = { diff --git a/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift b/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift index b2269b9c4..894cbdbdf 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift @@ -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 } } diff --git a/Mastodon/Scene/Search/Search/SearchViewController.swift b/Mastodon/Scene/Search/Search/SearchViewController.swift index 7594eb478..982844f51 100644 --- a/Mastodon/Scene/Search/Search/SearchViewController.swift +++ b/Mastodon/Scene/Search/Search/SearchViewController.swift @@ -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) diff --git a/Mastodon/Scene/Share/View/Content/MediaView+Configuration.swift b/Mastodon/Scene/Share/View/Content/MediaView+Configuration.swift index cba1fcf6d..02f9ad5a4 100644 --- a/Mastodon/Scene/Share/View/Content/MediaView+Configuration.swift +++ b/Mastodon/Scene/Share/View/Content/MediaView+Configuration.swift @@ -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 } diff --git a/Mastodon/Scene/Share/View/Content/StatusView+Configuration.swift b/Mastodon/Scene/Share/View/Content/StatusView+Configuration.swift index 1a90c69af..ab4fea1ab 100644 --- a/Mastodon/Scene/Share/View/Content/StatusView+Configuration.swift +++ b/Mastodon/Scene/Share/View/Content/StatusView+Configuration.swift @@ -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) { diff --git a/Mastodon/Scene/Share/View/TableviewCell/StatusTableViewCell.swift b/Mastodon/Scene/Share/View/TableviewCell/StatusTableViewCell.swift index a1033f052..a3315211e 100644 --- a/Mastodon/Scene/Share/View/TableviewCell/StatusTableViewCell.swift +++ b/Mastodon/Scene/Share/View/TableviewCell/StatusTableViewCell.swift @@ -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() diff --git a/Mastodon/Scene/Share/View/TableviewCell/StatusThreadRootTableViewCell.swift b/Mastodon/Scene/Share/View/TableviewCell/StatusThreadRootTableViewCell.swift index e27cc2dd3..115175800 100644 --- a/Mastodon/Scene/Share/View/TableviewCell/StatusThreadRootTableViewCell.swift +++ b/Mastodon/Scene/Share/View/TableviewCell/StatusThreadRootTableViewCell.swift @@ -112,7 +112,7 @@ extension StatusThreadRootTableViewCell { statusView.statusMetricView ] - if !statusView.viewModel.isSensitive { + if !statusView.viewModel.isMediaSensitive { elements.removeAll(where: { $0 === statusView.contentSensitiveeToggleButton }) } diff --git a/MastodonIntent/Info.plist b/MastodonIntent/Info.plist index 797487637..0d11fe1f3 100644 --- a/MastodonIntent/Info.plist +++ b/MastodonIntent/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.3.1 CFBundleVersion - 110 + 113 NSExtension NSExtensionAttributes diff --git a/MastodonSDK/Package.swift b/MastodonSDK/Package.swift index dd562f147..8b007c2a6 100644 --- a/MastodonSDK/Package.swift +++ b/MastodonSDK/Package.swift @@ -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( diff --git a/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 3.xcdatamodel/contents b/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 3.xcdatamodel/contents index a6f0ee0ce..16a1c7c84 100644 --- a/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 3.xcdatamodel/contents +++ b/MastodonSDK/Sources/CoreDataStack/CoreData.xcdatamodeld/CoreData 3.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -185,8 +185,7 @@ - - + @@ -262,7 +261,7 @@ - + diff --git a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Status.swift b/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Status.swift index d17d1c616..0c7291913 100644 --- a/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Status.swift +++ b/MastodonSDK/Sources/CoreDataStack/Entity/Mastodon/Status.swift @@ -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) { diff --git a/MastodonSDK/Sources/MastodonCommon/Preference/Preference+Discovery.swift b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+Discovery.swift new file mode 100644 index 000000000..0c6a9c544 --- /dev/null +++ b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+Discovery.swift @@ -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 } + } + +} diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 15d786efb..f2bec6b01 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -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") diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings index f26554fe5..bf6ab09e6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings @@ -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" = "لا يُمكِن عَرض المُتابَعات مِنَ الخوادم الأُخرى."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.stringsdict index 32782f1c0..c2f641720 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.stringsdict @@ -471,15 +471,15 @@ zero مُنذُ لَحظة one - مُنذُ سنة + مُنذُ %ldع two - مُنذُ سنتين + مُنذُ %ldع few - مُنذُ %ld سنين + مُنذُ %ldع many - مُنذُ %ld سنةً + مُنذُ %ldع other - مُنذُ %ld سنة + مُنذُ %ldع date.month.ago.abbr @@ -495,15 +495,15 @@ zero مُنذُ لَحظة one - مُنذُ شهر + مُنذُ %ldش two - مُنذُ شهرين + مُنذُ %ldش few - مُنذُ %ld أشهُر + مُنذُ %ldش many - مُنذُ %ld شهرًا + مُنذُ %ldش other - مُنذُ %ld شهر + مُنذُ %ldش date.day.ago.abbr @@ -519,15 +519,15 @@ zero مُنذُ لَحظة one - مُنذُ يوم + مُنذُ %ldي two - مُنذُ يومين + مُنذُ %ldي few - مُنذُ %ld أيام + مُنذُ %ldي many - مُنذُ %ld يومًا + مُنذُ %ldي other - مُنذُ %ld يوم + مُنذُ %ldي date.hour.ago.abbr @@ -543,15 +543,15 @@ zero مُنذُ لَحظة one - مُنذُ ساعة + مُنذُ %ldس two - مُنذُ ساعتين + مُنذُ %ldس few - مُنذُ %ld ساعات + مُنذُ %ldس many - مُنذُ %ld ساعةًَ + مُنذُ %ldس other - مُنذُ %ld ساعة + مُنذُ %ldس date.minute.ago.abbr @@ -567,15 +567,15 @@ zero مُنذُ لَحظة one - مُنذُ دقيقة + مُنذُ %ldد two - مُنذُ دقيقتان + مُنذُ %ldد few - مُنذُ %ld دقائق + مُنذُ %ldد many - مُنذُ %ld دقيقةً + مُنذُ %ldد other - مُنذُ %ld دقيقة + مُنذُ %ldد date.second.ago.abbr @@ -591,15 +591,15 @@ zero مُنذُ لَحظة one - مُنذُ ثانية + مُنذُ %ldث two - مُنذُ ثانيتين + مُنذُ %ldث few - مُنذُ %ld ثوان + مُنذُ %ldث many - مُنذُ %ld ثانية + مُنذُ %ldث other - مُنذُ %ld ثانية + مُنذُ %ldث diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings index 0cb63f34b..4e10ce165 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings @@ -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"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings index 325b1e949..06f5eedff 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings @@ -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"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.stringsdict index cd7218623..20e8b615e 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.stringsdict @@ -125,9 +125,9 @@ NSStringFormatValueTypeKey ld one - 1 reply + 1 Antwort other - %ld replies + %ld Antworten plural.count.vote diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 285c185bc..4edf4702f 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/es-419.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/es-419.lproj/Localizable.strings index f3670fb6b..0782206f4 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/es-419.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/es-419.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings index 4cbebb3e5..544a0b86c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.strings index 341f4862a..42b3bfb6c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.strings @@ -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"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.stringsdict index 2069e27a3..871fb10bc 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/eu-ES.lproj/Localizable.stringsdict @@ -125,9 +125,9 @@ NSStringFormatValueTypeKey ld one - 1 reply + Erantzun bat other - %ld replies + %ld erantzun plural.count.vote diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings index 69aa3172a..0ed3a271a 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings @@ -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 l’image"; +"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 l’utilisateur·rice mentionnée peut voir ce message."; @@ -201,6 +201,10 @@ téléversé sur Mastodon."; "Scene.ConfirmEmail.Subtitle" = "Nous venons d’envoyer 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 l’avatar"; +"Scene.Profile.Accessibility.ShowAvatarImage" = "Afficher l’avatar"; +"Scene.Profile.Accessibility.ShowBannerImage" = "Afficher l’image 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"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.stringsdict index 93ee696f2..5c2b14978 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.stringsdict @@ -125,9 +125,9 @@ NSStringFormatValueTypeKey ld one - 1 reply + 1 réponse other - %ld replies + %ld réponses plural.count.vote diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/gd-GB.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/gd-GB.lproj/Localizable.strings index 9e4ab6029..91bc13736 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/gd-GB.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/gd-GB.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings index a8164db9d..339e23f1c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings @@ -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" = "他のサーバーにいるフォローは表示されません。"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings index 55b8a3a62..792cf3681 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings index 608163f4e..dcc8dae64 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings index 6a19a4bf6..31148373f 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings index 6913d753f..d7ed34c30 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings @@ -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"; \ No newline at end of file +"Scene.Wizard.NewInMastodon" = "Новое в Мастодоне"; \ No newline at end of file diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/sv_FI.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/sv_FI.lproj/Localizable.strings index 07d5aa5e7..434303e3d 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/sv_FI.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/sv_FI.lproj/Localizable.strings @@ -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ä."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings index de50842f2..5dfb5134a 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings @@ -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" = "ใช้เบราว์เซอร์เริ่มต้นเพื่อเปิดลิงก์"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.stringsdict index 3895c3993..8ae8feb7b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.stringsdict @@ -111,7 +111,7 @@ NSStringFormatValueTypeKey ld other - %ld replies + %ld การตอบกลับ plural.count.vote diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings index 95eef33b0..407c4f9cb 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings @@ -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."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings index f4a90541d..f9ec487c4 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings @@ -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" = "使用默认浏览器打开链接"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.stringsdict index 418903836..6c2661ee5 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.stringsdict @@ -111,7 +111,7 @@ NSStringFormatValueTypeKey ld other - %ld replies + %ld 条回复 plural.count.vote diff --git a/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonStatus.swift b/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonStatus.swift new file mode 100644 index 000000000..b7d33712f --- /dev/null +++ b/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonStatus.swift @@ -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) + } + +} diff --git a/MastodonSDK/Sources/MastodonUI/View/Container/MediaGridContainerView.swift b/MastodonSDK/Sources/MastodonUI/View/Container/MediaGridContainerView.swift index cb9c53f35..e3359fb58 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Container/MediaGridContainerView.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Container/MediaGridContainerView.swift @@ -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.. 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) + } } diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView.swift b/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView.swift index eb500b7c4..07f441500 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView.swift @@ -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 { diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift index 67cefa475..44f7bb9ab 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift @@ -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) diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView.swift b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView.swift index eb3a69354..7b96fe0b5 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView.swift @@ -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) diff --git a/MastodonSDK/Sources/MastodonUI/View/Control/ActionToolbarContainer.swift b/MastodonSDK/Sources/MastodonUI/View/Control/ActionToolbarContainer.swift index 449254d20..c3a9b96f3 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Control/ActionToolbarContainer.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Control/ActionToolbarContainer.swift @@ -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), diff --git a/MastodonSDK/Sources/MastodonUI/View/Control/ContentWarningOverlayView.swift b/MastodonSDK/Sources/MastodonUI/View/Control/ContentWarningOverlayView.swift index d559e4e04..70be5bbc2 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Control/ContentWarningOverlayView.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Control/ContentWarningOverlayView.swift @@ -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) } } diff --git a/MastodonSDK/Sources/MastodonUI/View/Control/ProfileStatusDashboardView.swift b/MastodonSDK/Sources/MastodonUI/View/Control/ProfileStatusDashboardView.swift index 7d8e4fbcd..a45e8ef6a 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Control/ProfileStatusDashboardView.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Control/ProfileStatusDashboardView.swift @@ -55,7 +55,7 @@ extension ProfileStatusDashboardView { containerStackView.heightAnchor.constraint(equalToConstant: 44).priority(.defaultHigh), ]) - let spacing: CGFloat = UIView.isZoomedMode ? 4 : 16 + let spacing: CGFloat = UIView.isZoomedMode ? 4 : 12 containerStackView.spacing = spacing containerStackView.axis = .horizontal containerStackView.distribution = .fillEqually @@ -75,9 +75,9 @@ extension ProfileStatusDashboardView { tapGestureRecognizer.addTarget(self, action: #selector(ProfileStatusDashboardView.tapGestureRecognizerHandler(_:))) meterView.addGestureRecognizer(tapGestureRecognizer) } - - followingDashboardMeterView.accessibilityHint = "Double tap to open the list" // TODO: i18n - followersDashboardMeterView.accessibilityHint = "Double tap to open the list" + + followingDashboardMeterView.accessibilityHint = L10n.Scene.Profile.Accessibility.doubleTapToOpenTheList + followersDashboardMeterView.accessibilityHint = L10n.Scene.Profile.Accessibility.doubleTapToOpenTheList } } diff --git a/MastodonSDK/Sources/MastodonUI/View/TableViewCell/NewsTableViewCell.swift b/MastodonSDK/Sources/MastodonUI/View/TableViewCell/NewsTableViewCell.swift index 3515000f9..f0b2aec8f 100644 --- a/MastodonSDK/Sources/MastodonUI/View/TableViewCell/NewsTableViewCell.swift +++ b/MastodonSDK/Sources/MastodonUI/View/TableViewCell/NewsTableViewCell.swift @@ -51,6 +51,11 @@ extension NewsTableViewCell { separatorLine.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), separatorLine.heightAnchor.constraint(equalToConstant: UIView.separatorLineHeight(of: contentView)), ]) + + isAccessibilityElement = true + accessibilityElements = [ + newsView + ] } } diff --git a/MastodonSDK/Sources/MastodonUI/View/TableViewCell/ProfileCardTableViewCell+Configuration.swift b/MastodonSDK/Sources/MastodonUI/View/TableViewCell/ProfileCardTableViewCell+Configuration.swift new file mode 100644 index 000000000..061af0f48 --- /dev/null +++ b/MastodonSDK/Sources/MastodonUI/View/TableViewCell/ProfileCardTableViewCell+Configuration.swift @@ -0,0 +1,30 @@ +// +// ProfileCardTableViewCell+Configuration.swift +// +// +// Created by MainasuK on 2022-4-19. +// + +import UIKit +import CoreDataStack + +extension ProfileCardTableViewCell { + + public func configure( + tableView: UITableView, + user: MastodonUser, + profileCardTableViewCellDelegate: ProfileCardTableViewCellDelegate? + ) { + if profileCardView.frame == .zero { + // set content view width + assert(layoutMarginsGuide.layoutFrame.width > .zero) + shadowBackgroundContainer.frame.size.width = layoutMarginsGuide.layoutFrame.width + profileCardView.setupLayoutFrame(layoutMarginsGuide.layoutFrame) + logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): did layout for new cell") + } + + profileCardView.configure(user: user) + delegate = profileCardTableViewCellDelegate + } + +} diff --git a/MastodonSDK/Sources/MastodonUI/View/TableViewCell/ProfileCardTableViewCell.swift b/MastodonSDK/Sources/MastodonUI/View/TableViewCell/ProfileCardTableViewCell.swift index d3c8f223c..aff7b6feb 100644 --- a/MastodonSDK/Sources/MastodonUI/View/TableViewCell/ProfileCardTableViewCell.swift +++ b/MastodonSDK/Sources/MastodonUI/View/TableViewCell/ProfileCardTableViewCell.swift @@ -5,6 +5,7 @@ // Created by MainasuK on 2022-4-14. // +import os.log import UIKit import Combine @@ -14,9 +15,13 @@ public protocol ProfileCardTableViewCellDelegate: AnyObject { public final class ProfileCardTableViewCell: UITableViewCell { + let logger = Logger(subsystem: "ProfileCardTableViewCell", category: "Cell") + public weak var delegate: ProfileCardTableViewCellDelegate? public var disposeBag = Set() + public let shadowBackgroundContainer = ShadowBackgroundContainer() + public let profileCardView: ProfileCardView = { let profileCardView = ProfileCardView() profileCardView.layer.masksToBounds = true @@ -49,15 +54,14 @@ extension ProfileCardTableViewCell { private func _init() { selectionStyle = .none - let shadowBackgroundContainer = ShadowBackgroundContainer() shadowBackgroundContainer.cornerRadius = 6 shadowBackgroundContainer.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(shadowBackgroundContainer) NSLayoutConstraint.activate([ - shadowBackgroundContainer.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10), + shadowBackgroundContainer.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).priority(.required - 1), shadowBackgroundContainer.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor), shadowBackgroundContainer.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor), - contentView.bottomAnchor.constraint(equalTo: shadowBackgroundContainer.bottomAnchor, constant: 10), + contentView.bottomAnchor.constraint(equalTo: shadowBackgroundContainer.bottomAnchor, constant: 10).priority(.required - 1), ]) profileCardView.translatesAutoresizingMaskIntoConstraints = false @@ -70,6 +74,12 @@ extension ProfileCardTableViewCell { ]) profileCardView.delegate = self + + profileCardView.isAccessibilityElement = true + accessibilityElements = [ + profileCardView, + profileCardView.relationshipActionButton + ] } } diff --git a/MastodonTests/Info.plist b/MastodonTests/Info.plist index 66a4b22f5..920eaff87 100644 --- a/MastodonTests/Info.plist +++ b/MastodonTests/Info.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.3.1 CFBundleVersion - 110 + 113 diff --git a/MastodonUITests/Info.plist b/MastodonUITests/Info.plist index 66a4b22f5..920eaff87 100644 --- a/MastodonUITests/Info.plist +++ b/MastodonUITests/Info.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.3.1 CFBundleVersion - 110 + 113 diff --git a/NotificationService/Info.plist b/NotificationService/Info.plist index 7301c57de..fa92e4a24 100644 --- a/NotificationService/Info.plist +++ b/NotificationService/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.3.1 CFBundleVersion - 110 + 113 NSExtension NSExtensionPointIdentifier diff --git a/ShareActionExtension/Info.plist b/ShareActionExtension/Info.plist index 856818817..9ee97c1e1 100644 --- a/ShareActionExtension/Info.plist +++ b/ShareActionExtension/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.3.1 CFBundleVersion - 110 + 113 NSExtension NSExtensionAttributes