mirror of
https://github.com/mastodon/mastodon-ios
synced 2025-04-11 22:58:02 +02:00
Merge pull request #460 from mastodon/feature/notification-friendship
Add interaction for follow request
This commit is contained in:
commit
f2245ba738
@ -15,8 +15,8 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>140</string>
|
||||
<string>143</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "أظْهِر كُلَّ شَيء",
|
||||
"show_mentions": "أظْهِر الإشارَات"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Mostrar-ho tot",
|
||||
"show_mentions": "Mostrar Mencions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "هەموو شتێک نیشان بدە",
|
||||
"show_mentions": "ئاماژەکان نیشان بدە"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Alles anzeigen",
|
||||
"show_mentions": "Erwähnungen anzeigen"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Mostrar todo",
|
||||
"show_mentions": "Mostrar menciones"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Aceptar",
|
||||
"accepted": "Aceptada",
|
||||
"reject": "rechazar",
|
||||
"rejected": "Rechazada"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -72,9 +72,9 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>one</key>
|
||||
<string>Followed by %1$@, and another mutual</string>
|
||||
<string>Seguido por %1$@ y otro mutuo</string>
|
||||
<key>other</key>
|
||||
<string>Followed by %1$@, and %ld mutuals</string>
|
||||
<string>Seguido por %1$@ y %ld mutuos</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.metric_formatted.post</key>
|
||||
|
@ -129,7 +129,7 @@
|
||||
"show_post": "Mostrar Publicación",
|
||||
"show_user_profile": "Mostrar perfil del usuario",
|
||||
"content_warning": "Advertencia de Contenido",
|
||||
"sensitive_content": "Sensitive Content",
|
||||
"sensitive_content": "Contenido sensible",
|
||||
"media_content_warning": "Pulsa en cualquier sitio para mostrar",
|
||||
"tap_to_reveal": "Tocar para revelar",
|
||||
"poll": {
|
||||
@ -241,7 +241,7 @@
|
||||
},
|
||||
"input": {
|
||||
"placeholder": "Encuentra un servidor o únete al tuyo propio...",
|
||||
"search_servers_or_enter_url": "Search servers or enter URL"
|
||||
"search_servers_or_enter_url": "Buscar servidores o introducir la URL"
|
||||
},
|
||||
"empty_state": {
|
||||
"finding_servers": "Encontrando servidores disponibles...",
|
||||
@ -251,7 +251,7 @@
|
||||
},
|
||||
"register": {
|
||||
"title": "Háblanos de ti.",
|
||||
"lets_get_you_set_up_on_domain": "Let’s get you set up on %s",
|
||||
"lets_get_you_set_up_on_domain": "Deja que te preparemos en %s",
|
||||
"input": {
|
||||
"avatar": {
|
||||
"delete": "Borrar"
|
||||
@ -322,7 +322,7 @@
|
||||
"confirm_email": {
|
||||
"title": "Una última cosa.",
|
||||
"subtitle": "Te acabamos de enviar un correo a %s,\npulsa en el enlace para confirmar tu cuenta.",
|
||||
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we emailed to you to verify your account",
|
||||
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Toca el enlace que te enviamos por correo electrónico para verificar tu cuenta",
|
||||
"button": {
|
||||
"open_email_app": "Abrir Aplicación de Correo Electrónico",
|
||||
"resend": "Reenviar"
|
||||
@ -347,8 +347,8 @@
|
||||
"published": "¡Publicado!",
|
||||
"Publishing": "Publicación en curso...",
|
||||
"accessibility": {
|
||||
"logo_label": "Logo Button",
|
||||
"logo_hint": "Tap to scroll to top and tap again to previous location"
|
||||
"logo_label": "Botón del logo",
|
||||
"logo_hint": "Toca para desplazarte hacia arriba y toca de nuevo para la localización anterior"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -418,7 +418,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"header": {
|
||||
"follows_you": "Follows You"
|
||||
"follows_you": "Te sigue"
|
||||
},
|
||||
"dashboard": {
|
||||
"posts": "publicaciones",
|
||||
@ -465,22 +465,22 @@
|
||||
}
|
||||
},
|
||||
"follower": {
|
||||
"title": "follower",
|
||||
"title": "seguidor",
|
||||
"footer": "No se muestran los seguidores de otros servidores."
|
||||
},
|
||||
"following": {
|
||||
"title": "following",
|
||||
"title": "siguiendo",
|
||||
"footer": "No se muestran los seguidos de otros servidores."
|
||||
},
|
||||
"familiarFollowers": {
|
||||
"title": "Followers you familiar",
|
||||
"followed_by_names": "Followed by %s"
|
||||
"title": "Seguidores que conoces",
|
||||
"followed_by_names": "Seguido por %s"
|
||||
},
|
||||
"favorited_by": {
|
||||
"title": "Favorited By"
|
||||
"title": "Hecho favorito por"
|
||||
},
|
||||
"reblogged_by": {
|
||||
"title": "Reblogged By"
|
||||
"title": "Reblogueado por"
|
||||
},
|
||||
"search": {
|
||||
"title": "Buscar",
|
||||
@ -520,10 +520,10 @@
|
||||
"posts": "Publicaciones",
|
||||
"hashtags": "Etiquetas",
|
||||
"news": "Noticias",
|
||||
"community": "Community",
|
||||
"community": "Comunidad",
|
||||
"for_you": "Para Ti"
|
||||
},
|
||||
"intro": "These are the posts gaining traction in your corner of Mastodon."
|
||||
"intro": "Estas son las publicaciones que están ganando tracción en tu rincón de Mastodon."
|
||||
},
|
||||
"favorite": {
|
||||
"title": "Tus Favoritos"
|
||||
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Mostrar Todo",
|
||||
"show_mentions": "Mostrar Menciones"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
@ -620,46 +626,46 @@
|
||||
"text_placeholder": "Escribe o pega comentarios adicionales",
|
||||
"reported": "REPORTADO",
|
||||
"step_one": {
|
||||
"step_1_of_4": "Step 1 of 4",
|
||||
"whats_wrong_with_this_post": "What's wrong with this post?",
|
||||
"whats_wrong_with_this_account": "What's wrong with this account?",
|
||||
"whats_wrong_with_this_username": "What's wrong with %s?",
|
||||
"select_the_best_match": "Select the best match",
|
||||
"i_dont_like_it": "I don’t like it",
|
||||
"it_is_not_something_you_want_to_see": "It is not something you want to see",
|
||||
"its_spam": "It’s spam",
|
||||
"malicious_links_fake_engagement_or_repetetive_replies": "Malicious links, fake engagement, or repetetive replies",
|
||||
"it_violates_server_rules": "It violates server rules",
|
||||
"you_are_aware_that_it_breaks_specific_rules": "You are aware that it breaks specific rules",
|
||||
"its_something_else": "It’s something else",
|
||||
"the_issue_does_not_fit_into_other_categories": "The issue does not fit into other categories"
|
||||
"step_1_of_4": "Paso 1 de 4",
|
||||
"whats_wrong_with_this_post": "¿Qué hay de malo con esta publicación?",
|
||||
"whats_wrong_with_this_account": "¿Qué hay de malo con esta cuenta?",
|
||||
"whats_wrong_with_this_username": "¿Qué hay de malo con %s?",
|
||||
"select_the_best_match": "Selecciona la mejor opción",
|
||||
"i_dont_like_it": "No me gusta",
|
||||
"it_is_not_something_you_want_to_see": "No es algo que quieras ver",
|
||||
"its_spam": "Es spam",
|
||||
"malicious_links_fake_engagement_or_repetetive_replies": "Enlaces maliciosos, compromisos falsos o respuestas repetitivas",
|
||||
"it_violates_server_rules": "Viola las reglas del servidor",
|
||||
"you_are_aware_that_it_breaks_specific_rules": "Eres consciente de que infringe las normas específicas",
|
||||
"its_something_else": "Es algo más",
|
||||
"the_issue_does_not_fit_into_other_categories": "El problema no encaja en otras categorías"
|
||||
},
|
||||
"step_two": {
|
||||
"step_2_of_4": "Step 2 of 4",
|
||||
"which_rules_are_being_violated": "Which rules are being violated?",
|
||||
"select_all_that_apply": "Select all that apply",
|
||||
"i_just_don’t_like_it": "I just don’t like it"
|
||||
"step_2_of_4": "Paso 2 de 4",
|
||||
"which_rules_are_being_violated": "¿Qué normas se están violando?",
|
||||
"select_all_that_apply": "Selecciona todos los que correspondan",
|
||||
"i_just_don’t_like_it": "Solamente no me gusta"
|
||||
},
|
||||
"step_three": {
|
||||
"step_3_of_4": "Step 3 of 4",
|
||||
"are_there_any_posts_that_back_up_this_report": "Are there any posts that back up this report?",
|
||||
"select_all_that_apply": "Select all that apply"
|
||||
"step_3_of_4": "Paso 3 de 4",
|
||||
"are_there_any_posts_that_back_up_this_report": "¿Hay alguna publicación que respalde este informe?",
|
||||
"select_all_that_apply": "Selecciona todos los que correspondan"
|
||||
},
|
||||
"step_four": {
|
||||
"step_4_of_4": "Step 4 of 4",
|
||||
"is_there_anything_else_we_should_know": "Is there anything else we should know?"
|
||||
"step_4_of_4": "Paso 4 de 4",
|
||||
"is_there_anything_else_we_should_know": "¿Hay algo más que deberíamos saber?"
|
||||
},
|
||||
"step_final": {
|
||||
"dont_want_to_see_this": "Don’t want to see this?",
|
||||
"when_you_see_something_you_dont_like_on_mastodon_you_can_remove_the_person_from_your_experience.": "When you see something you don’t like on Mastodon, you can remove the person from your experience.",
|
||||
"unfollow": "Unfollow",
|
||||
"unfollowed": "Unfollowed",
|
||||
"unfollow_user": "Unfollow %s",
|
||||
"mute_user": "Mute %s",
|
||||
"you_wont_see_their_posts_or_reblogs_in_your_home_feed_they_wont_know_they_ve_been_muted": "You won’t see their posts or reblogs in your home feed. They won’t know they’ve been muted.",
|
||||
"block_user": "Block %s",
|
||||
"they_will_no_longer_be_able_to_follow_or_see_your_posts_but_they_can_see_if_theyve_been_blocked": "They will no longer be able to follow or see your posts, but they can see if they’ve been blocked.",
|
||||
"while_we_review_this_you_can_take_action_against_user": "While we review this, you can take action against %s"
|
||||
"dont_want_to_see_this": "¿No quieres ver esto?",
|
||||
"when_you_see_something_you_dont_like_on_mastodon_you_can_remove_the_person_from_your_experience.": "Cuando veas algo que no te gusta en Mastodon, puedes quitar a la persona de tu experiencia.",
|
||||
"unfollow": "Dejar de seguir",
|
||||
"unfollowed": "Ha dejado de seguirte",
|
||||
"unfollow_user": "Dejar de seguir a %s",
|
||||
"mute_user": "Silenciar a %s",
|
||||
"you_wont_see_their_posts_or_reblogs_in_your_home_feed_they_wont_know_they_ve_been_muted": "No verás sus publicaciones o reblogueos en tu línea temporal. No sabrán que han sido silenciados.",
|
||||
"block_user": "Bloquear a %s",
|
||||
"they_will_no_longer_be_able_to_follow_or_see_your_posts_but_they_can_see_if_theyve_been_blocked": "Ya no podrán ser capaces de seguirte o ver tus publicaciones, pero pueden ver si han sido bloqueados.",
|
||||
"while_we_review_this_you_can_take_action_against_user": "Mientras revisamos esto, puedes tomar medidas contra %s"
|
||||
}
|
||||
},
|
||||
"preview": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Erakutsi guztia",
|
||||
"show_mentions": "Erakutsi aipamenak"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Näytä kaikki",
|
||||
"show_mentions": "Näytä maininnat"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -418,7 +418,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"header": {
|
||||
"follows_you": "Follows You"
|
||||
"follows_you": "Vous suit"
|
||||
},
|
||||
"dashboard": {
|
||||
"posts": "publications",
|
||||
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Tout Afficher",
|
||||
"show_mentions": "Afficher les mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Seall a h-uile càil",
|
||||
"show_mentions": "Seall na h-iomraidhean"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Mostrar Todo",
|
||||
"show_mentions": "Mostrar mencións"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Tampilkan Segalanya",
|
||||
"show_mentions": "Tampilkan Sebutan"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Mostra Tutto",
|
||||
"show_mentions": "Mostra Menzioni"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accetta",
|
||||
"accepted": "Richiesta accettata",
|
||||
"reject": "rifiuta",
|
||||
"rejected": "Richiesta rifiutata"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -92,7 +92,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld media</string>
|
||||
<string>%ld件のメディア</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.post</key>
|
||||
@ -106,7 +106,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld posts</string>
|
||||
<string>%ld件の投稿</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.favorite</key>
|
||||
@ -148,7 +148,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld replies</string>
|
||||
<string>%ld件の返信</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.vote</key>
|
||||
@ -176,7 +176,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld voters</string>
|
||||
<string>%ld人の投票</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.people_talking</key>
|
||||
@ -316,7 +316,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld 年前</string>
|
||||
<string>%ld年前</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>date.month.ago.abbr</key>
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "すべて見る",
|
||||
"show_mentions": "メンションを見る"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Sken yal taɣawsa",
|
||||
"show_mentions": "Sken tisedmirin"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Her tiştî nîşan bide",
|
||||
"show_mentions": "Qalkirinan nîşan bike"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Alles weergeven",
|
||||
"show_mentions": "Vermeldingen weergeven"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Show Everything",
|
||||
"show_mentions": "Show Mentions"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Показать все",
|
||||
"show_mentions": "Показать упоминания"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Visa allt",
|
||||
"show_mentions": "Visa omnämningar"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -418,7 +418,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"header": {
|
||||
"follows_you": "Follows You"
|
||||
"follows_you": "ติดตามคุณ"
|
||||
},
|
||||
"dashboard": {
|
||||
"posts": "โพสต์",
|
||||
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "แสดงทุกอย่าง",
|
||||
"show_mentions": "แสดงการกล่าวถึง"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Her Şeyi Göster",
|
||||
"show_mentions": "Bahsetmeleri Göster"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "Hiện mọi thứ",
|
||||
"show_mentions": "Hiện lượt nhắc"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "显示全部",
|
||||
"show_mentions": "显示提及"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "接受",
|
||||
"accepted": "已接受",
|
||||
"reject": "拒绝",
|
||||
"rejected": "已拒绝"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -544,6 +544,12 @@
|
||||
"keyobard": {
|
||||
"show_everything": "顯示全部",
|
||||
"show_mentions": "顯示提及"
|
||||
},
|
||||
"follow_request": {
|
||||
"accept": "Accept",
|
||||
"accepted": "Accepted",
|
||||
"reject": "reject",
|
||||
"rejected": "Rejected"
|
||||
}
|
||||
},
|
||||
"thread": {
|
||||
|
@ -4850,7 +4850,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = Mastodon/Info.plist;
|
||||
@ -4880,7 +4880,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = Mastodon/Info.plist;
|
||||
@ -4988,11 +4988,11 @@
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 140;
|
||||
DYLIB_CURRENT_VERSION = 143;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AppShared/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
@ -5019,11 +5019,11 @@
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 140;
|
||||
DYLIB_CURRENT_VERSION = 143;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AppShared/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
@ -5114,7 +5114,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = Mastodon/Info.plist;
|
||||
@ -5182,11 +5182,11 @@
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 140;
|
||||
DYLIB_CURRENT_VERSION = 143;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AppShared/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
@ -5211,7 +5211,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5234,7 +5234,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = ShareActionExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5258,7 +5258,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = MastodonIntent/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5282,7 +5282,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = MastodonIntent/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5306,7 +5306,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = MastodonIntent/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5330,7 +5330,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = ShareActionExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5354,7 +5354,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = ShareActionExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5441,7 +5441,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Mastodon/Mastodon.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = Mastodon/Info.plist;
|
||||
@ -5508,11 +5508,11 @@
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 140;
|
||||
DYLIB_CURRENT_VERSION = 143;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AppShared/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
@ -5536,7 +5536,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5559,7 +5559,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = ShareActionExtension/ShareActionExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = ShareActionExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5583,7 +5583,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = MastodonIntent/MastodonIntent.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = MastodonIntent/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5607,7 +5607,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@ -5630,7 +5630,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 140;
|
||||
CURRENT_PROJECT_VERSION = 143;
|
||||
DEVELOPMENT_TEAM = 5Z4GVSS33P;
|
||||
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
|
@ -9,7 +9,7 @@
|
||||
<key>isShown</key>
|
||||
<true/>
|
||||
<key>orderHint</key>
|
||||
<integer>9</integer>
|
||||
<integer>8</integer>
|
||||
</dict>
|
||||
<key>CoreDataStack.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
@ -29,17 +29,17 @@
|
||||
<key>Mastodon - Release.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>5</integer>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
<key>Mastodon - Snapshot.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>7</integer>
|
||||
<integer>6</integer>
|
||||
</dict>
|
||||
<key>Mastodon - ar.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>8</integer>
|
||||
<integer>7</integer>
|
||||
</dict>
|
||||
<key>Mastodon - ar.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
@ -114,7 +114,7 @@
|
||||
<key>MastodonIntent.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>34</integer>
|
||||
<integer>35</integer>
|
||||
</dict>
|
||||
<key>MastodonIntents.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
@ -129,12 +129,12 @@
|
||||
<key>NotificationService.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>32</integer>
|
||||
<integer>36</integer>
|
||||
</dict>
|
||||
<key>ShareActionExtension.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>33</integer>
|
||||
<integer>37</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
|
@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
@ -30,7 +30,7 @@
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>140</string>
|
||||
<string>143</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
|
@ -14,7 +14,7 @@ extension DataSourceFacade {
|
||||
user: ManagedObjectRecord<MastodonUser>,
|
||||
authenticationBox: MastodonAuthenticationBox
|
||||
) async throws {
|
||||
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
|
||||
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
|
||||
await selectionFeedbackGenerator.selectionChanged()
|
||||
|
||||
_ = try await dependency.context.apiService.toggleBlock(
|
||||
|
@ -15,7 +15,7 @@ extension DataSourceFacade {
|
||||
status: ManagedObjectRecord<Status>,
|
||||
authenticationBox: MastodonAuthenticationBox
|
||||
) async throws {
|
||||
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
|
||||
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
|
||||
await selectionFeedbackGenerator.selectionChanged()
|
||||
|
||||
_ = try await provider.context.apiService.favorite(
|
||||
|
@ -7,6 +7,9 @@
|
||||
|
||||
import UIKit
|
||||
import CoreDataStack
|
||||
import class CoreDataStack.Notification
|
||||
import MastodonSDK
|
||||
import MastodonLocalization
|
||||
|
||||
extension DataSourceFacade {
|
||||
static func responseToUserFollowAction(
|
||||
@ -14,7 +17,7 @@ extension DataSourceFacade {
|
||||
user: ManagedObjectRecord<MastodonUser>,
|
||||
authenticationBox: MastodonAuthenticationBox
|
||||
) async throws {
|
||||
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
|
||||
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
|
||||
await selectionFeedbackGenerator.selectionChanged()
|
||||
|
||||
_ = try await dependency.context.apiService.toggleFollow(
|
||||
@ -23,3 +26,104 @@ extension DataSourceFacade {
|
||||
)
|
||||
} // end func
|
||||
}
|
||||
|
||||
extension DataSourceFacade {
|
||||
static func responseToUserFollowRequestAction(
|
||||
dependency: NeedsDependency,
|
||||
notification: ManagedObjectRecord<Notification>,
|
||||
query: Mastodon.API.Account.FollowReqeustQuery,
|
||||
authenticationBox: MastodonAuthenticationBox
|
||||
) async throws {
|
||||
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
|
||||
await selectionFeedbackGenerator.selectionChanged()
|
||||
|
||||
let managedObjectContext = dependency.context.managedObjectContext
|
||||
let _userID: MastodonUser.ID? = try await managedObjectContext.perform {
|
||||
guard let notification = notification.object(in: managedObjectContext) else { return nil }
|
||||
return notification.account.id
|
||||
}
|
||||
|
||||
guard let userID = _userID else {
|
||||
assertionFailure()
|
||||
throw APIService.APIError.implicit(.badRequest)
|
||||
}
|
||||
|
||||
let state: MastodonFollowRequestState = try await managedObjectContext.perform {
|
||||
guard let notification = notification.object(in: managedObjectContext) else { return .init(state: .none) }
|
||||
return notification.followRequestState
|
||||
}
|
||||
|
||||
guard state.state == .none else {
|
||||
return
|
||||
}
|
||||
|
||||
try? await managedObjectContext.performChanges {
|
||||
guard let notification = notification.object(in: managedObjectContext) else { return }
|
||||
switch query {
|
||||
case .accept:
|
||||
notification.transientFollowRequestState = .init(state: .isAccepting)
|
||||
case .reject:
|
||||
notification.transientFollowRequestState = .init(state: .isRejecting)
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
_ = try await dependency.context.apiService.followRequest(
|
||||
userID: userID,
|
||||
query: query,
|
||||
authenticationBox: authenticationBox
|
||||
)
|
||||
} catch {
|
||||
try? await managedObjectContext.performChanges {
|
||||
guard let notification = notification.object(in: managedObjectContext) else { return }
|
||||
notification.transientFollowRequestState = .init(state: .none)
|
||||
}
|
||||
|
||||
if let error = error as? Mastodon.API.Error {
|
||||
switch error.httpResponseStatus {
|
||||
case .notFound:
|
||||
let backgroundManagedObjectContext = dependency.context.backgroundManagedObjectContext
|
||||
try await backgroundManagedObjectContext.performChanges {
|
||||
guard let notification = notification.object(in: backgroundManagedObjectContext) else { return }
|
||||
for feed in notification.feeds {
|
||||
backgroundManagedObjectContext.delete(feed)
|
||||
}
|
||||
backgroundManagedObjectContext.delete(notification)
|
||||
}
|
||||
default:
|
||||
let alertController = await UIAlertController(for: error, title: nil, preferredStyle: .alert)
|
||||
let okAction = await UIAlertAction(title: L10n.Common.Controls.Actions.ok, style: .default)
|
||||
await alertController.addAction(okAction)
|
||||
await dependency.coordinator.present(
|
||||
scene: .alertController(alertController: alertController),
|
||||
from: nil,
|
||||
transition: .alertController(animated: true, completion: nil)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
try? await managedObjectContext.performChanges {
|
||||
guard let notification = notification.object(in: managedObjectContext) else { return }
|
||||
switch query {
|
||||
case .accept:
|
||||
notification.transientFollowRequestState = .init(state: .isAccept)
|
||||
case .reject:
|
||||
notification.transientFollowRequestState = .init(state: .isReject)
|
||||
}
|
||||
}
|
||||
|
||||
let backgroundManagedObjectContext = dependency.context.backgroundManagedObjectContext
|
||||
try? await backgroundManagedObjectContext.performChanges {
|
||||
guard let notification = notification.object(in: backgroundManagedObjectContext) else { return }
|
||||
switch query {
|
||||
case .accept:
|
||||
notification.followRequestState = .init(state: .isAccept)
|
||||
case .reject:
|
||||
notification.followRequestState = .init(state: .isReject)
|
||||
}
|
||||
}
|
||||
} // end func
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ extension DataSourceFacade {
|
||||
user: ManagedObjectRecord<MastodonUser>,
|
||||
authenticationBox: MastodonAuthenticationBox
|
||||
) async throws {
|
||||
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
|
||||
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
|
||||
await selectionFeedbackGenerator.selectionChanged()
|
||||
|
||||
_ = try await dependency.context.apiService.toggleMute(
|
||||
|
@ -15,7 +15,7 @@ extension DataSourceFacade {
|
||||
status: ManagedObjectRecord<Status>,
|
||||
authenticationBox: MastodonAuthenticationBox
|
||||
) async throws {
|
||||
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
|
||||
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
|
||||
await selectionFeedbackGenerator.selectionChanged()
|
||||
|
||||
_ = try await provider.context.apiService.reblog(
|
||||
|
@ -87,6 +87,69 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Follow Request
|
||||
extension NotificationTableViewCellDelegate where Self: DataSourceProvider {
|
||||
|
||||
func tableViewCell(
|
||||
_ cell: UITableViewCell,
|
||||
notificationView: NotificationView,
|
||||
acceptFollowRequestButtonDidPressed button: UIButton
|
||||
) {
|
||||
Task {
|
||||
let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil)
|
||||
guard let item = await item(from: source) else {
|
||||
assertionFailure()
|
||||
return
|
||||
}
|
||||
guard case let .notification(notification) = item else {
|
||||
assertionFailure("only works for status data provider")
|
||||
return
|
||||
}
|
||||
|
||||
guard let authenticationBox = context.authenticationService.activeMastodonAuthenticationBox.value else {
|
||||
return
|
||||
}
|
||||
|
||||
try await DataSourceFacade.responseToUserFollowRequestAction(
|
||||
dependency: self,
|
||||
notification: notification,
|
||||
query: .accept,
|
||||
authenticationBox: authenticationBox
|
||||
)
|
||||
} // end Task
|
||||
}
|
||||
|
||||
func tableViewCell(
|
||||
_ cell: UITableViewCell,
|
||||
notificationView: NotificationView,
|
||||
rejectFollowRequestButtonDidPressed button: UIButton
|
||||
) {
|
||||
Task {
|
||||
let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil)
|
||||
guard let item = await item(from: source) else {
|
||||
assertionFailure()
|
||||
return
|
||||
}
|
||||
guard case let .notification(notification) = item else {
|
||||
assertionFailure("only works for status data provider")
|
||||
return
|
||||
}
|
||||
|
||||
guard let authenticationBox = context.authenticationService.activeMastodonAuthenticationBox.value else {
|
||||
return
|
||||
}
|
||||
|
||||
try await DataSourceFacade.responseToUserFollowRequestAction(
|
||||
dependency: self,
|
||||
notification: notification,
|
||||
query: .reject,
|
||||
authenticationBox: authenticationBox
|
||||
)
|
||||
} // end Task
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Status Content
|
||||
extension NotificationTableViewCellDelegate where Self: DataSourceProvider {
|
||||
func tableViewCell(
|
||||
|
@ -25,6 +25,8 @@ protocol NotificationTableViewCellDelegate: AnyObject, AutoGenerateProtocolDeleg
|
||||
// sourcery:inline:NotificationTableViewCellDelegate.AutoGenerateProtocolDelegate
|
||||
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, authorAvatarButtonDidPressed button: AvatarButton)
|
||||
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action)
|
||||
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, acceptFollowRequestButtonDidPressed button: UIButton)
|
||||
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, rejectFollowRequestButtonDidPressed button: UIButton)
|
||||
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
|
||||
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
|
||||
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaView: MediaView, didSelectMediaViewAt index: Int)
|
||||
@ -49,6 +51,14 @@ extension NotificationViewDelegate where Self: NotificationViewContainerTableVie
|
||||
delegate?.tableViewCell(self, notificationView: notificationView, menuButton: button, didSelectAction: action)
|
||||
}
|
||||
|
||||
func notificationView(_ notificationView: NotificationView, acceptFollowRequestButtonDidPressed button: UIButton) {
|
||||
delegate?.tableViewCell(self, notificationView: notificationView, acceptFollowRequestButtonDidPressed: button)
|
||||
}
|
||||
|
||||
func notificationView(_ notificationView: NotificationView, rejectFollowRequestButtonDidPressed button: UIButton) {
|
||||
delegate?.tableViewCell(self, notificationView: notificationView, rejectFollowRequestButtonDidPressed: button)
|
||||
}
|
||||
|
||||
func notificationView(_ notificationView: NotificationView, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) {
|
||||
delegate?.tableViewCell(self, notificationView: notificationView, statusView: statusView, metaText: metaText, didSelectMeta: meta)
|
||||
}
|
||||
|
@ -29,6 +29,8 @@ extension NotificationView {
|
||||
|
||||
extension NotificationView {
|
||||
public func configure(notification: Notification) {
|
||||
viewModel.objects.insert(notification)
|
||||
|
||||
configureAuthor(notification: notification)
|
||||
|
||||
guard let type = MastodonNotificationType(rawValue: notification.typeRaw) else {
|
||||
@ -36,23 +38,26 @@ extension NotificationView {
|
||||
return
|
||||
}
|
||||
|
||||
if let status = notification.status {
|
||||
switch type {
|
||||
case .follow, .followRequest:
|
||||
setAuthorContainerBottomPaddingViewDisplay()
|
||||
case .mention, .status:
|
||||
switch type {
|
||||
case .follow:
|
||||
setAuthorContainerBottomPaddingViewDisplay()
|
||||
case .followRequest:
|
||||
setFollowRequestAdaptiveMarginContainerViewDisplay()
|
||||
case .mention, .status:
|
||||
if let status = notification.status {
|
||||
statusView.configure(status: status)
|
||||
setStatusViewDisplay()
|
||||
case .reblog, .favourite, .poll:
|
||||
}
|
||||
case .reblog, .favourite, .poll:
|
||||
if let status = notification.status {
|
||||
quoteStatusView.configure(status: status)
|
||||
setQuoteStatusViewDisplay()
|
||||
case ._other:
|
||||
setAuthorContainerBottomPaddingViewDisplay()
|
||||
assertionFailure()
|
||||
}
|
||||
} else {
|
||||
case ._other:
|
||||
setAuthorContainerBottomPaddingViewDisplay()
|
||||
assertionFailure()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -195,5 +200,12 @@ extension NotificationView {
|
||||
}
|
||||
.assign(to: \.isMyself, on: viewModel)
|
||||
.store(in: &disposeBag)
|
||||
// follow request state
|
||||
notification.publisher(for: \.followRequestState)
|
||||
.assign(to: \.followRequestState, on: viewModel)
|
||||
.store(in: &disposeBag)
|
||||
notification.publisher(for: \.transientFollowRequestState)
|
||||
.assign(to: \.transientFollowRequestState, on: viewModel)
|
||||
.store(in: &disposeBag)
|
||||
}
|
||||
}
|
||||
|
@ -15,91 +15,42 @@ import CommonOSLog
|
||||
import MastodonSDK
|
||||
|
||||
extension APIService {
|
||||
// func acceptFollowRequest(
|
||||
// mastodonUserID: MastodonUser.ID,
|
||||
// mastodonAuthenticationBox: MastodonAuthenticationBox
|
||||
// ) -> AnyPublisher<Mastodon.Response.Content<Mastodon.Entity.Relationship>, Error> {
|
||||
// let domain = mastodonAuthenticationBox.domain
|
||||
// let authorization = mastodonAuthenticationBox.userAuthorization
|
||||
// let requestMastodonUserID = mastodonAuthenticationBox.userID
|
||||
//
|
||||
// return Mastodon.API.Account.acceptFollowRequest(
|
||||
// session: session,
|
||||
// domain: domain,
|
||||
// userID: mastodonUserID,
|
||||
// authorization: authorization)
|
||||
// .flatMap { response -> AnyPublisher<Mastodon.Response.Content<Mastodon.Entity.Relationship>, Error> in
|
||||
// let managedObjectContext = self.backgroundManagedObjectContext
|
||||
// return managedObjectContext.performChanges {
|
||||
// let requestMastodonUserRequest = MastodonUser.sortedFetchRequest
|
||||
// requestMastodonUserRequest.predicate = MastodonUser.predicate(domain: domain, id: requestMastodonUserID)
|
||||
// requestMastodonUserRequest.fetchLimit = 1
|
||||
// guard let requestMastodonUser = managedObjectContext.safeFetch(requestMastodonUserRequest).first else { return }
|
||||
//
|
||||
// let lookUpMastodonUserRequest = MastodonUser.sortedFetchRequest
|
||||
// lookUpMastodonUserRequest.predicate = MastodonUser.predicate(domain: domain, id: mastodonUserID)
|
||||
// lookUpMastodonUserRequest.fetchLimit = 1
|
||||
// let lookUpMastodonuser = managedObjectContext.safeFetch(lookUpMastodonUserRequest).first
|
||||
//
|
||||
// if let lookUpMastodonuser = lookUpMastodonuser {
|
||||
// let entity = response.value
|
||||
// APIService.CoreData.update(user: lookUpMastodonuser, entity: entity, requestMastodonUser: requestMastodonUser, domain: domain, networkDate: response.networkDate)
|
||||
// }
|
||||
// }
|
||||
// .tryMap { result -> Mastodon.Response.Content<Mastodon.Entity.Relationship> in
|
||||
// switch result {
|
||||
// case .success:
|
||||
// return response
|
||||
// case .failure(let error):
|
||||
// throw error
|
||||
// }
|
||||
// }
|
||||
// .eraseToAnyPublisher()
|
||||
// }
|
||||
// .eraseToAnyPublisher()
|
||||
// }
|
||||
|
||||
// func rejectFollowRequest(
|
||||
// mastodonUserID: MastodonUser.ID,
|
||||
// mastodonAuthenticationBox: MastodonAuthenticationBox
|
||||
// ) -> AnyPublisher<Mastodon.Response.Content<Mastodon.Entity.Relationship>, Error> {
|
||||
// let domain = mastodonAuthenticationBox.domain
|
||||
// let authorization = mastodonAuthenticationBox.userAuthorization
|
||||
// let requestMastodonUserID = mastodonAuthenticationBox.userID
|
||||
//
|
||||
// return Mastodon.API.Account.rejectFollowRequest(
|
||||
// session: session,
|
||||
// domain: domain,
|
||||
// userID: mastodonUserID,
|
||||
// authorization: authorization)
|
||||
// .flatMap { response -> AnyPublisher<Mastodon.Response.Content<Mastodon.Entity.Relationship>, Error> in
|
||||
// let managedObjectContext = self.backgroundManagedObjectContext
|
||||
// return managedObjectContext.performChanges {
|
||||
// let requestMastodonUserRequest = MastodonUser.sortedFetchRequest
|
||||
// requestMastodonUserRequest.predicate = MastodonUser.predicate(domain: domain, id: requestMastodonUserID)
|
||||
// requestMastodonUserRequest.fetchLimit = 1
|
||||
// guard let requestMastodonUser = managedObjectContext.safeFetch(requestMastodonUserRequest).first else { return }
|
||||
//
|
||||
// let lookUpMastodonUserRequest = MastodonUser.sortedFetchRequest
|
||||
// lookUpMastodonUserRequest.predicate = MastodonUser.predicate(domain: domain, id: mastodonUserID)
|
||||
// lookUpMastodonUserRequest.fetchLimit = 1
|
||||
// let lookUpMastodonuser = managedObjectContext.safeFetch(lookUpMastodonUserRequest).first
|
||||
//
|
||||
// if let lookUpMastodonuser = lookUpMastodonuser {
|
||||
// let entity = response.value
|
||||
// APIService.CoreData.update(user: lookUpMastodonuser, entity: entity, requestMastodonUser: requestMastodonUser, domain: domain, networkDate: response.networkDate)
|
||||
// }
|
||||
// }
|
||||
// .tryMap { result -> Mastodon.Response.Content<Mastodon.Entity.Relationship> in
|
||||
// switch result {
|
||||
// case .success:
|
||||
// return response
|
||||
// case .failure(let error):
|
||||
// throw error
|
||||
// }
|
||||
// }
|
||||
// .eraseToAnyPublisher()
|
||||
// }
|
||||
// .eraseToAnyPublisher()
|
||||
// }
|
||||
func followRequest(
|
||||
userID: Mastodon.Entity.Account.ID,
|
||||
query: Mastodon.API.Account.FollowReqeustQuery,
|
||||
authenticationBox: MastodonAuthenticationBox
|
||||
) async throws -> Mastodon.Response.Content<Mastodon.Entity.Relationship> {
|
||||
let response = try await Mastodon.API.Account.followRequest(
|
||||
session: session,
|
||||
domain: authenticationBox.domain,
|
||||
userID: userID,
|
||||
query: query,
|
||||
authorization: authenticationBox.userAuthorization
|
||||
).singleOutput()
|
||||
|
||||
let managedObjectContext = self.backgroundManagedObjectContext
|
||||
try await managedObjectContext.performChanges {
|
||||
let request = MastodonUser.sortedFetchRequest
|
||||
request.predicate = MastodonUser.predicate(
|
||||
domain: authenticationBox.domain,
|
||||
id: authenticationBox.userID
|
||||
)
|
||||
request.fetchLimit = 1
|
||||
guard let user = managedObjectContext.safeFetch(request).first else { return }
|
||||
guard let me = authenticationBox.authenticationRecord.object(in: managedObjectContext)?.user else { return }
|
||||
|
||||
Persistence.MastodonUser.update(
|
||||
mastodonUser: user,
|
||||
context: Persistence.MastodonUser.RelationshipContext(
|
||||
entity: response.value,
|
||||
me: me,
|
||||
networkDate: response.networkDate
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
return response
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>140</string>
|
||||
<string>143</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionAttributes</key>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="20086" systemVersion="21E258" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
|
||||
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="20086" systemVersion="21F79" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
|
||||
<entity name="Application" representedClassName="CoreDataStack.Application" syncable="YES">
|
||||
<attribute name="identifier" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
|
||||
<attribute name="name" attributeType="String"/>
|
||||
@ -113,7 +113,9 @@
|
||||
<entity name="Notification" representedClassName="CoreDataStack.Notification" syncable="YES">
|
||||
<attribute name="createAt" attributeType="Date" usesScalarValueType="NO"/>
|
||||
<attribute name="domain" attributeType="String"/>
|
||||
<attribute name="followRequestState" optional="YES" attributeType="Binary"/>
|
||||
<attribute name="id" attributeType="String"/>
|
||||
<attribute name="transientFollowRequestState" optional="YES" transient="YES" attributeType="Binary"/>
|
||||
<attribute name="typeRaw" attributeType="String"/>
|
||||
<attribute name="updatedAt" attributeType="Date" usesScalarValueType="NO"/>
|
||||
<attribute name="userID" attributeType="String"/>
|
||||
@ -255,7 +257,7 @@
|
||||
<element name="Instance" positionX="45" positionY="162" width="128" height="104"/>
|
||||
<element name="MastodonAuthentication" positionX="0" positionY="0" width="128" height="224"/>
|
||||
<element name="MastodonUser" positionX="0" positionY="0" width="128" height="734"/>
|
||||
<element name="Notification" positionX="9" positionY="162" width="128" height="164"/>
|
||||
<element name="Notification" positionX="9" positionY="162" width="128" height="194"/>
|
||||
<element name="Poll" positionX="0" positionY="0" width="128" height="224"/>
|
||||
<element name="PollOption" positionX="0" positionY="0" width="128" height="149"/>
|
||||
<element name="PrivateNote" positionX="0" positionY="0" width="128" height="89"/>
|
||||
|
@ -36,6 +36,58 @@ public final class Notification: NSManagedObject {
|
||||
|
||||
}
|
||||
|
||||
extension Notification {
|
||||
// sourcery: autoUpdatableObject
|
||||
@objc public var followRequestState: MastodonFollowRequestState {
|
||||
get {
|
||||
let keyPath = #keyPath(Notification.followRequestState)
|
||||
willAccessValue(forKey: keyPath)
|
||||
let _data = primitiveValue(forKey: keyPath) as? Data
|
||||
didAccessValue(forKey: keyPath)
|
||||
do {
|
||||
guard let data = _data, !data.isEmpty else { return .init(state: .none) }
|
||||
let state = try JSONDecoder().decode(MastodonFollowRequestState.self, from: data)
|
||||
return state
|
||||
} catch {
|
||||
assertionFailure(error.localizedDescription)
|
||||
return .init(state: .none)
|
||||
}
|
||||
}
|
||||
set {
|
||||
let keyPath = #keyPath(Notification.followRequestState)
|
||||
let data = try? JSONEncoder().encode(newValue)
|
||||
willChangeValue(forKey: keyPath)
|
||||
setPrimitiveValue(data, forKey: keyPath)
|
||||
didChangeValue(forKey: keyPath)
|
||||
}
|
||||
}
|
||||
|
||||
// sourcery: autoUpdatableObject
|
||||
@objc public var transientFollowRequestState: MastodonFollowRequestState {
|
||||
get {
|
||||
let keyPath = #keyPath(Notification.transientFollowRequestState)
|
||||
willAccessValue(forKey: keyPath)
|
||||
let _data = primitiveValue(forKey: keyPath) as? Data
|
||||
didAccessValue(forKey: keyPath)
|
||||
do {
|
||||
guard let data = _data else { return .init(state: .none) }
|
||||
let state = try JSONDecoder().decode(MastodonFollowRequestState.self, from: data)
|
||||
return state
|
||||
} catch {
|
||||
assertionFailure(error.localizedDescription)
|
||||
return .init(state: .none)
|
||||
}
|
||||
}
|
||||
set {
|
||||
let keyPath = #keyPath(Notification.transientFollowRequestState)
|
||||
let data = try? JSONEncoder().encode(newValue)
|
||||
willChangeValue(forKey: keyPath)
|
||||
setPrimitiveValue(data, forKey: keyPath)
|
||||
didChangeValue(forKey: keyPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension Notification: FeedIndexable { }
|
||||
|
||||
extension Notification {
|
||||
@ -197,6 +249,16 @@ extension Notification: AutoUpdatableObject {
|
||||
self.updatedAt = updatedAt
|
||||
}
|
||||
}
|
||||
public func update(followRequestState: MastodonFollowRequestState) {
|
||||
if self.followRequestState != followRequestState {
|
||||
self.followRequestState = followRequestState
|
||||
}
|
||||
}
|
||||
public func update(transientFollowRequestState: MastodonFollowRequestState) {
|
||||
if self.transientFollowRequestState != transientFollowRequestState {
|
||||
self.transientFollowRequestState = transientFollowRequestState
|
||||
}
|
||||
}
|
||||
// sourcery:end
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,28 @@
|
||||
//
|
||||
// MastodonFollowRequestState.swift
|
||||
//
|
||||
//
|
||||
// Created by MainasuK on 2022-6-29.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
public final class MastodonFollowRequestState: NSObject, Codable {
|
||||
public let state: State
|
||||
|
||||
public init(
|
||||
state: State
|
||||
) {
|
||||
self.state = state
|
||||
}
|
||||
}
|
||||
|
||||
extension MastodonFollowRequestState {
|
||||
public enum State: String, Codable {
|
||||
case none
|
||||
case isAccepting
|
||||
case isAccept
|
||||
case isRejecting
|
||||
case isReject
|
||||
}
|
||||
}
|
@ -21,7 +21,7 @@ public enum MastodonNotificationType: RawRepresentable {
|
||||
public init?(rawValue: String) {
|
||||
switch rawValue {
|
||||
case "follow": self = .follow
|
||||
case "followRequest": self = .followRequest
|
||||
case "follow_request": self = .followRequest
|
||||
case "mention": self = .mention
|
||||
case "reblog": self = .reblog
|
||||
case "favourite": self = .favourite
|
||||
@ -34,7 +34,7 @@ public enum MastodonNotificationType: RawRepresentable {
|
||||
public var rawValue: String {
|
||||
switch self {
|
||||
case .follow: return "follow"
|
||||
case .followRequest: return "followRequest"
|
||||
case .followRequest: return "follow_request"
|
||||
case .mention: return "mention"
|
||||
case .reblog: return "reblog"
|
||||
case .favourite: return "favourite"
|
||||
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"provides-namespace" : true
|
||||
}
|
||||
}
|
15
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/checkmark.imageset/Contents.json
vendored
Normal file
15
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/checkmark.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "checkmark.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
76
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/checkmark.imageset/checkmark.pdf
vendored
Normal file
76
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/checkmark.imageset/checkmark.pdf
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 3.250000 5.105469 cm
|
||||
0.129412 0.129412 0.129412 scn
|
||||
1.280330 5.924861 m
|
||||
0.987437 6.217754 0.512563 6.217754 0.219670 5.924861 c
|
||||
-0.073223 5.631968 -0.073223 5.157095 0.219670 4.864202 c
|
||||
4.719670 0.364201 l
|
||||
5.012563 0.071307 5.487436 0.071307 5.780330 0.364201 c
|
||||
16.780331 11.364201 l
|
||||
17.073223 11.657094 17.073223 12.131968 16.780331 12.424861 c
|
||||
16.487438 12.717754 16.012562 12.717754 15.719669 12.424861 c
|
||||
5.250000 1.955191 l
|
||||
1.280330 5.924861 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
523
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000000613 00000 n
|
||||
0000000635 00000 n
|
||||
0000000808 00000 n
|
||||
0000000882 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
941
|
||||
%%EOF
|
15
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/xmark.imageset/Contents.json
vendored
Normal file
15
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/xmark.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "xmark.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
89
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/xmark.imageset/xmark.pdf
vendored
Normal file
89
MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Editing/xmark.imageset/xmark.pdf
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< >>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<< /Length 3 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.250000 4.105469 cm
|
||||
0.129412 0.129412 0.129412 scn
|
||||
0.147052 15.340743 m
|
||||
0.219670 15.424861 l
|
||||
0.485936 15.691128 0.902600 15.715334 1.196212 15.497479 c
|
||||
1.280330 15.424861 l
|
||||
7.750000 8.955531 l
|
||||
14.219669 15.424861 l
|
||||
14.512563 15.717754 14.987437 15.717754 15.280331 15.424861 c
|
||||
15.573224 15.131968 15.573224 14.657094 15.280331 14.364201 c
|
||||
8.811000 7.894531 l
|
||||
15.280331 1.424862 l
|
||||
15.546597 1.158595 15.570804 0.741932 15.352949 0.448320 c
|
||||
15.280331 0.364201 l
|
||||
15.014064 0.097934 14.597401 0.073728 14.303789 0.291582 c
|
||||
14.219669 0.364201 l
|
||||
7.750000 6.833531 l
|
||||
1.280330 0.364201 l
|
||||
0.987437 0.071307 0.512563 0.071307 0.219670 0.364201 c
|
||||
-0.073223 0.657094 -0.073223 1.131968 0.219670 1.424862 c
|
||||
6.689000 7.894531 l
|
||||
0.219670 14.364201 l
|
||||
-0.046597 14.630467 -0.070803 15.047132 0.147052 15.340743 c
|
||||
0.219670 15.424861 l
|
||||
0.147052 15.340743 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
914
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
|
||||
/Resources 1 0 R
|
||||
/Contents 2 0 R
|
||||
/Parent 5 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Kids [ 4 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<< /Pages 5 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000034 00000 n
|
||||
0000001004 00000 n
|
||||
0000001026 00000 n
|
||||
0000001199 00000 n
|
||||
0000001273 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 6 0 R
|
||||
/Size 7
|
||||
>>
|
||||
startxref
|
||||
1332
|
||||
%%EOF
|
@ -94,6 +94,10 @@ public enum Asset {
|
||||
public enum Connectivity {
|
||||
public static let photoFillSplit = ImageAsset(name: "Connectivity/photo.fill.split")
|
||||
}
|
||||
public enum Editing {
|
||||
public static let checkmark = ImageAsset(name: "Editing/checkmark")
|
||||
public static let xmark = ImageAsset(name: "Editing/xmark")
|
||||
}
|
||||
public enum Human {
|
||||
public static let eyeCircleFill = ImageAsset(name: "Human/eye.circle.fill")
|
||||
public static let eyeSlashCircleFill = ImageAsset(name: "Human/eye.slash.circle.fill")
|
||||
|
@ -612,6 +612,16 @@ public enum L10n {
|
||||
}
|
||||
}
|
||||
public enum Notification {
|
||||
public enum FollowRequest {
|
||||
/// Accept
|
||||
public static let accept = L10n.tr("Localizable", "Scene.Notification.FollowRequest.Accept")
|
||||
/// Accepted
|
||||
public static let accepted = L10n.tr("Localizable", "Scene.Notification.FollowRequest.Accepted")
|
||||
/// reject
|
||||
public static let reject = L10n.tr("Localizable", "Scene.Notification.FollowRequest.Reject")
|
||||
/// Rejected
|
||||
public static let rejected = L10n.tr("Localizable", "Scene.Notification.FollowRequest.Rejected")
|
||||
}
|
||||
public enum Keyobard {
|
||||
/// Show Everything
|
||||
public static let showEverything = L10n.tr("Localizable", "Scene.Notification.Keyobard.ShowEverything")
|
||||
|
@ -223,6 +223,10 @@
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "تمَّ النَّشر!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "يَجري نَشر المُشارَكَة...";
|
||||
"Scene.HomeTimeline.Title" = "الرَّئِيسَة";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "أظْهِر كُلَّ شَيء";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "أظْهِر الإشارَات";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "فَضَّلَ مَنشُورَك";
|
||||
|
@ -223,6 +223,10 @@ carregat a Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Publicat!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "S'està publicant...";
|
||||
"Scene.HomeTimeline.Title" = "Inici";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Mostrar-ho tot";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Mostrar Mencions";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "ha afavorit la teva publicació";
|
||||
|
@ -222,6 +222,10 @@
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "بڵاوکرایەوە!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "پۆستەکە بڵاو دەکرێتەوە...";
|
||||
"Scene.HomeTimeline.Title" = "ماڵەوە";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "هەموو شتێک نیشان بدە";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "ئاماژەکان نیشان بدە";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "پۆستەکەتی بەدڵ بوو";
|
||||
|
@ -223,6 +223,10 @@ kann nicht auf Mastodon hochgeladen werden.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Veröffentlicht!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Beitrag wird veröffentlicht...";
|
||||
"Scene.HomeTimeline.Title" = "Startseite";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Alles anzeigen";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Erwähnungen anzeigen";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "hat deinen Beitrag favorisiert";
|
||||
|
@ -223,6 +223,10 @@ uploaded to Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Published!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Publishing post...";
|
||||
"Scene.HomeTimeline.Title" = "Home";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Show Everything";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Show Mentions";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "favorited your post";
|
||||
|
@ -108,7 +108,7 @@ Por favor, revise su conexión a internet.";
|
||||
"Common.Controls.Status.MediaContentWarning" = "Pulsa en cualquier sitio para mostrar";
|
||||
"Common.Controls.Status.Poll.Closed" = "Cerrado";
|
||||
"Common.Controls.Status.Poll.Vote" = "Vota";
|
||||
"Common.Controls.Status.SensitiveContent" = "Sensitive Content";
|
||||
"Common.Controls.Status.SensitiveContent" = "Contenido sensible";
|
||||
"Common.Controls.Status.ShowPost" = "Mostrar Publicación";
|
||||
"Common.Controls.Status.ShowUserProfile" = "Mostrar perfil del usuario";
|
||||
"Common.Controls.Status.Tag.Email" = "E-mail";
|
||||
@ -201,29 +201,33 @@ subirse a Mastodon.";
|
||||
"Scene.ConfirmEmail.OpenEmailApp.Title" = "Revisa tu bandeja de entrada.";
|
||||
"Scene.ConfirmEmail.Subtitle" = "Te acabamos de enviar un correo a %@,
|
||||
pulsa en el enlace para confirmar tu cuenta.";
|
||||
"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we emailed to you to verify your account";
|
||||
"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Toca el enlace que te enviamos por correo electrónico para verificar tu cuenta";
|
||||
"Scene.ConfirmEmail.Title" = "Una última cosa.";
|
||||
"Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon.";
|
||||
"Scene.Discovery.Tabs.Community" = "Community";
|
||||
"Scene.Discovery.Intro" = "Estas son las publicaciones que están ganando tracción en tu rincón de Mastodon.";
|
||||
"Scene.Discovery.Tabs.Community" = "Comunidad";
|
||||
"Scene.Discovery.Tabs.ForYou" = "Para Ti";
|
||||
"Scene.Discovery.Tabs.Hashtags" = "Etiquetas";
|
||||
"Scene.Discovery.Tabs.News" = "Noticias";
|
||||
"Scene.Discovery.Tabs.Posts" = "Publicaciones";
|
||||
"Scene.Familiarfollowers.FollowedByNames" = "Followed by %@";
|
||||
"Scene.Familiarfollowers.Title" = "Followers you familiar";
|
||||
"Scene.Familiarfollowers.FollowedByNames" = "Seguido por %@";
|
||||
"Scene.Familiarfollowers.Title" = "Seguidores que conoces";
|
||||
"Scene.Favorite.Title" = "Tus Favoritos";
|
||||
"Scene.FavoritedBy.Title" = "Favorited By";
|
||||
"Scene.FavoritedBy.Title" = "Hecho favorito por";
|
||||
"Scene.Follower.Footer" = "No se muestran los seguidores de otros servidores.";
|
||||
"Scene.Follower.Title" = "follower";
|
||||
"Scene.Follower.Title" = "seguidor";
|
||||
"Scene.Following.Footer" = "No se muestran los seguidos de otros servidores.";
|
||||
"Scene.Following.Title" = "following";
|
||||
"Scene.HomeTimeline.NavigationBarState.Accessibility.LogoHint" = "Tap to scroll to top and tap again to previous location";
|
||||
"Scene.HomeTimeline.NavigationBarState.Accessibility.LogoLabel" = "Logo Button";
|
||||
"Scene.Following.Title" = "siguiendo";
|
||||
"Scene.HomeTimeline.NavigationBarState.Accessibility.LogoHint" = "Toca para desplazarte hacia arriba y toca de nuevo para la localización anterior";
|
||||
"Scene.HomeTimeline.NavigationBarState.Accessibility.LogoLabel" = "Botón del logo";
|
||||
"Scene.HomeTimeline.NavigationBarState.NewPosts" = "Ver nuevas publicaciones";
|
||||
"Scene.HomeTimeline.NavigationBarState.Offline" = "Sin Conexión";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "¡Publicado!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Publicación en curso...";
|
||||
"Scene.HomeTimeline.Title" = "Inicio";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Mostrar Todo";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Mostrar Menciones";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "ha marcado como favorita tu publicación";
|
||||
@ -247,7 +251,7 @@ pulsa en el enlace para confirmar tu cuenta.";
|
||||
"Scene.Profile.Fields.AddRow" = "Añadir Fila";
|
||||
"Scene.Profile.Fields.Placeholder.Content" = "Contenido";
|
||||
"Scene.Profile.Fields.Placeholder.Label" = "Nombre para el campo";
|
||||
"Scene.Profile.Header.FollowsYou" = "Follows You";
|
||||
"Scene.Profile.Header.FollowsYou" = "Te sigue";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Confirmar para bloquear a %@";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Bloquear cuenta";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Message" = "Confirmar para silenciar %@";
|
||||
@ -261,7 +265,7 @@ pulsa en el enlace para confirmar tu cuenta.";
|
||||
"Scene.Profile.SegmentedControl.Posts" = "Publicaciones";
|
||||
"Scene.Profile.SegmentedControl.PostsAndReplies" = "Publicaciones y respuestas";
|
||||
"Scene.Profile.SegmentedControl.Replies" = "Respuestas";
|
||||
"Scene.RebloggedBy.Title" = "Reblogged By";
|
||||
"Scene.RebloggedBy.Title" = "Reblogueado por";
|
||||
"Scene.Register.Error.Item.Agreement" = "Aceptación";
|
||||
"Scene.Register.Error.Item.Email" = "Correo electrónico";
|
||||
"Scene.Register.Error.Item.Locale" = "Idioma";
|
||||
@ -294,7 +298,7 @@ pulsa en el enlace para confirmar tu cuenta.";
|
||||
"Scene.Register.Input.Password.Require" = "Tu contraseña debe contener como mínimo:";
|
||||
"Scene.Register.Input.Username.DuplicatePrompt" = "Este nombre de usuario ya está en uso.";
|
||||
"Scene.Register.Input.Username.Placeholder" = "nombre de usuario";
|
||||
"Scene.Register.LetsGetYouSetUpOnDomain" = "Let’s get you set up on %@";
|
||||
"Scene.Register.LetsGetYouSetUpOnDomain" = "Deja que te preparemos en %@";
|
||||
"Scene.Register.Title" = "Háblanos de ti.";
|
||||
"Scene.Report.Content1" = "¿Hay alguna otra publicación que te gustaría añadir al reporte?";
|
||||
"Scene.Report.Content2" = "¿Hay algo que los moderadores deberían saber acerca de este reporte?";
|
||||
@ -304,38 +308,38 @@ pulsa en el enlace para confirmar tu cuenta.";
|
||||
"Scene.Report.SkipToSend" = "Enviar sin comentarios";
|
||||
"Scene.Report.Step1" = "Paso 1 de 2";
|
||||
"Scene.Report.Step2" = "Paso 2 de 2";
|
||||
"Scene.Report.StepFinal.BlockUser" = "Block %@";
|
||||
"Scene.Report.StepFinal.DontWantToSeeThis" = "Don’t want to see this?";
|
||||
"Scene.Report.StepFinal.MuteUser" = "Mute %@";
|
||||
"Scene.Report.StepFinal.TheyWillNoLongerBeAbleToFollowOrSeeYourPostsButTheyCanSeeIfTheyveBeenBlocked" = "They will no longer be able to follow or see your posts, but they can see if they’ve been blocked.";
|
||||
"Scene.Report.StepFinal.Unfollow" = "Unfollow";
|
||||
"Scene.Report.StepFinal.UnfollowUser" = "Unfollow %@";
|
||||
"Scene.Report.StepFinal.Unfollowed" = "Unfollowed";
|
||||
"Scene.Report.StepFinal.WhenYouSeeSomethingYouDontLikeOnMastodonYouCanRemoveThePersonFromYourExperience." = "When you see something you don’t like on Mastodon, you can remove the person from your experience.";
|
||||
"Scene.Report.StepFinal.WhileWeReviewThisYouCanTakeActionAgainstUser" = "While we review this, you can take action against %@";
|
||||
"Scene.Report.StepFinal.YouWontSeeTheirPostsOrReblogsInYourHomeFeedTheyWontKnowTheyVeBeenMuted" = "You won’t see their posts or reblogs in your home feed. They won’t know they’ve been muted.";
|
||||
"Scene.Report.StepFour.IsThereAnythingElseWeShouldKnow" = "Is there anything else we should know?";
|
||||
"Scene.Report.StepFour.Step4Of4" = "Step 4 of 4";
|
||||
"Scene.Report.StepOne.IDontLikeIt" = "I don’t like it";
|
||||
"Scene.Report.StepOne.ItIsNotSomethingYouWantToSee" = "It is not something you want to see";
|
||||
"Scene.Report.StepOne.ItViolatesServerRules" = "It violates server rules";
|
||||
"Scene.Report.StepOne.ItsSomethingElse" = "It’s something else";
|
||||
"Scene.Report.StepOne.ItsSpam" = "It’s spam";
|
||||
"Scene.Report.StepOne.MaliciousLinksFakeEngagementOrRepetetiveReplies" = "Malicious links, fake engagement, or repetetive replies";
|
||||
"Scene.Report.StepOne.SelectTheBestMatch" = "Select the best match";
|
||||
"Scene.Report.StepOne.Step1Of4" = "Step 1 of 4";
|
||||
"Scene.Report.StepOne.TheIssueDoesNotFitIntoOtherCategories" = "The issue does not fit into other categories";
|
||||
"Scene.Report.StepOne.WhatsWrongWithThisAccount" = "What's wrong with this account?";
|
||||
"Scene.Report.StepOne.WhatsWrongWithThisPost" = "What's wrong with this post?";
|
||||
"Scene.Report.StepOne.WhatsWrongWithThisUsername" = "What's wrong with %@?";
|
||||
"Scene.Report.StepOne.YouAreAwareThatItBreaksSpecificRules" = "You are aware that it breaks specific rules";
|
||||
"Scene.Report.StepThree.AreThereAnyPostsThatBackUpThisReport" = "Are there any posts that back up this report?";
|
||||
"Scene.Report.StepThree.SelectAllThatApply" = "Select all that apply";
|
||||
"Scene.Report.StepThree.Step3Of4" = "Step 3 of 4";
|
||||
"Scene.Report.StepTwo.IJustDon’tLikeIt" = "I just don’t like it";
|
||||
"Scene.Report.StepTwo.SelectAllThatApply" = "Select all that apply";
|
||||
"Scene.Report.StepTwo.Step2Of4" = "Step 2 of 4";
|
||||
"Scene.Report.StepTwo.WhichRulesAreBeingViolated" = "Which rules are being violated?";
|
||||
"Scene.Report.StepFinal.BlockUser" = "Bloquear a %@";
|
||||
"Scene.Report.StepFinal.DontWantToSeeThis" = "¿No quieres ver esto?";
|
||||
"Scene.Report.StepFinal.MuteUser" = "Silenciar a %@";
|
||||
"Scene.Report.StepFinal.TheyWillNoLongerBeAbleToFollowOrSeeYourPostsButTheyCanSeeIfTheyveBeenBlocked" = "Ya no podrán ser capaces de seguirte o ver tus publicaciones, pero pueden ver si han sido bloqueados.";
|
||||
"Scene.Report.StepFinal.Unfollow" = "Dejar de seguir";
|
||||
"Scene.Report.StepFinal.UnfollowUser" = "Dejar de seguir a %@";
|
||||
"Scene.Report.StepFinal.Unfollowed" = "Ha dejado de seguirte";
|
||||
"Scene.Report.StepFinal.WhenYouSeeSomethingYouDontLikeOnMastodonYouCanRemoveThePersonFromYourExperience." = "Cuando veas algo que no te gusta en Mastodon, puedes quitar a la persona de tu experiencia.";
|
||||
"Scene.Report.StepFinal.WhileWeReviewThisYouCanTakeActionAgainstUser" = "Mientras revisamos esto, puedes tomar medidas contra %@";
|
||||
"Scene.Report.StepFinal.YouWontSeeTheirPostsOrReblogsInYourHomeFeedTheyWontKnowTheyVeBeenMuted" = "No verás sus publicaciones o reblogueos en tu línea temporal. No sabrán que han sido silenciados.";
|
||||
"Scene.Report.StepFour.IsThereAnythingElseWeShouldKnow" = "¿Hay algo más que deberíamos saber?";
|
||||
"Scene.Report.StepFour.Step4Of4" = "Paso 4 de 4";
|
||||
"Scene.Report.StepOne.IDontLikeIt" = "No me gusta";
|
||||
"Scene.Report.StepOne.ItIsNotSomethingYouWantToSee" = "No es algo que quieras ver";
|
||||
"Scene.Report.StepOne.ItViolatesServerRules" = "Viola las reglas del servidor";
|
||||
"Scene.Report.StepOne.ItsSomethingElse" = "Es algo más";
|
||||
"Scene.Report.StepOne.ItsSpam" = "Es spam";
|
||||
"Scene.Report.StepOne.MaliciousLinksFakeEngagementOrRepetetiveReplies" = "Enlaces maliciosos, compromisos falsos o respuestas repetitivas";
|
||||
"Scene.Report.StepOne.SelectTheBestMatch" = "Selecciona la mejor opción";
|
||||
"Scene.Report.StepOne.Step1Of4" = "Paso 1 de 4";
|
||||
"Scene.Report.StepOne.TheIssueDoesNotFitIntoOtherCategories" = "El problema no encaja en otras categorías";
|
||||
"Scene.Report.StepOne.WhatsWrongWithThisAccount" = "¿Qué hay de malo con esta cuenta?";
|
||||
"Scene.Report.StepOne.WhatsWrongWithThisPost" = "¿Qué hay de malo con esta publicación?";
|
||||
"Scene.Report.StepOne.WhatsWrongWithThisUsername" = "¿Qué hay de malo con %@?";
|
||||
"Scene.Report.StepOne.YouAreAwareThatItBreaksSpecificRules" = "Eres consciente de que infringe las normas específicas";
|
||||
"Scene.Report.StepThree.AreThereAnyPostsThatBackUpThisReport" = "¿Hay alguna publicación que respalde este informe?";
|
||||
"Scene.Report.StepThree.SelectAllThatApply" = "Selecciona todos los que correspondan";
|
||||
"Scene.Report.StepThree.Step3Of4" = "Paso 3 de 4";
|
||||
"Scene.Report.StepTwo.IJustDon’tLikeIt" = "Solamente no me gusta";
|
||||
"Scene.Report.StepTwo.SelectAllThatApply" = "Selecciona todos los que correspondan";
|
||||
"Scene.Report.StepTwo.Step2Of4" = "Paso 2 de 4";
|
||||
"Scene.Report.StepTwo.WhichRulesAreBeingViolated" = "¿Qué normas se están violando?";
|
||||
"Scene.Report.TextPlaceholder" = "Escribe o pega comentarios adicionales";
|
||||
"Scene.Report.Title" = "Reportar %@";
|
||||
"Scene.Report.TitleReport" = "Reportar";
|
||||
@ -376,7 +380,7 @@ pulsa en el enlace para confirmar tu cuenta.";
|
||||
"Scene.ServerPicker.EmptyState.FindingServers" = "Encontrando servidores disponibles...";
|
||||
"Scene.ServerPicker.EmptyState.NoResults" = "Sin resultados";
|
||||
"Scene.ServerPicker.Input.Placeholder" = "Encuentra un servidor o únete al tuyo propio...";
|
||||
"Scene.ServerPicker.Input.SearchServersOrEnterUrl" = "Search servers or enter URL";
|
||||
"Scene.ServerPicker.Input.SearchServersOrEnterUrl" = "Buscar servidores o introducir la URL";
|
||||
"Scene.ServerPicker.Label.Category" = "CATEGORÍA";
|
||||
"Scene.ServerPicker.Label.Language" = "IDIOMA";
|
||||
"Scene.ServerPicker.Label.Users" = "USUARIOS";
|
||||
|
@ -72,9 +72,9 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>one</key>
|
||||
<string>Followed by %1$@, and another mutual</string>
|
||||
<string>Seguido por %1$@ y otro mutuo</string>
|
||||
<key>other</key>
|
||||
<string>Followed by %1$@, and %ld mutuals</string>
|
||||
<string>Seguido por %1$@ y %ld mutuos</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.metric_formatted.post</key>
|
||||
|
@ -223,6 +223,10 @@ Mastodonera igo.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Argitaratua!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Bidalketa argitaratzen...";
|
||||
"Scene.HomeTimeline.Title" = "Hasiera";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Erakutsi guztia";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Erakutsi aipamenak";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "(e)k zure bidalketa gogoko du";
|
||||
|
@ -223,6 +223,10 @@ uploaded to Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Julkaistu!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Julkaistaan julkaisua...";
|
||||
"Scene.HomeTimeline.Title" = "Koti";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Näytä kaikki";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Näytä maininnat";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "favorited your post";
|
||||
|
@ -223,6 +223,10 @@ téléversé sur Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Publié!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Publication en cours ...";
|
||||
"Scene.HomeTimeline.Title" = "Accueil";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Tout Afficher";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Afficher les mentions";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "a ajouté votre message à ses favoris";
|
||||
@ -246,7 +250,7 @@ téléversé sur Mastodon.";
|
||||
"Scene.Profile.Fields.AddRow" = "Ajouter une rangée";
|
||||
"Scene.Profile.Fields.Placeholder.Content" = "Contenu";
|
||||
"Scene.Profile.Fields.Placeholder.Label" = "Étiquette";
|
||||
"Scene.Profile.Header.FollowsYou" = "Follows You";
|
||||
"Scene.Profile.Header.FollowsYou" = "Vous suit";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Confirmer le blocage de %@";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Bloquer le compte";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Message" = "Êtes-vous sûr de vouloir mettre en sourdine %@";
|
||||
|
@ -224,6 +224,10 @@ thoir gnogag air a’ chunntas a dhearbhadh a’ chunntais agad.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Chaidh fhoillseachadh!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "A’ foillseachadh a’ phuist…";
|
||||
"Scene.HomeTimeline.Title" = "Dachaigh";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Seall a h-uile càil";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Seall na h-iomraidhean";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "– is annsa leotha am post agad";
|
||||
|
@ -223,6 +223,10 @@ ser subido a Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Publicado!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Publicando...";
|
||||
"Scene.HomeTimeline.Title" = "Inicio";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Mostrar Todo";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Mostrar mencións";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "marcou a túa publicación como favorita";
|
||||
|
@ -223,6 +223,10 @@ caricato su Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Pubblicato!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Pubblicazione post...";
|
||||
"Scene.HomeTimeline.Title" = "Inizio";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accetta";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Richiesta accettata";
|
||||
"Scene.Notification.FollowRequest.Reject" = "rifiuta";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Richiesta rifiutata";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Mostra Tutto";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Mostra Menzioni";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "ha apprezzato il tuo post";
|
||||
|
@ -218,6 +218,10 @@
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "投稿しました!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "投稿中...";
|
||||
"Scene.HomeTimeline.Title" = "ホーム";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "すべて見る";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "メンションを見る";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "さんがあなたの投稿をお気に入りに登録しました";
|
||||
|
@ -92,7 +92,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld media</string>
|
||||
<string>%ld件のメディア</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.post</key>
|
||||
@ -106,7 +106,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld posts</string>
|
||||
<string>%ld件の投稿</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.favorite</key>
|
||||
@ -148,7 +148,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld replies</string>
|
||||
<string>%ld件の返信</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.count.vote</key>
|
||||
@ -176,7 +176,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld voters</string>
|
||||
<string>%ld人の投票</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>plural.people_talking</key>
|
||||
@ -316,7 +316,7 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>ld</string>
|
||||
<key>other</key>
|
||||
<string>%ld 年前</string>
|
||||
<string>%ld年前</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>date.month.ago.abbr</key>
|
||||
|
@ -223,6 +223,10 @@ Ad d-yettwasali ɣef Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Yettwasuffeɣ!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Asuffeɣ tasuffeɣt...";
|
||||
"Scene.HomeTimeline.Title" = "Agejdan";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Sken yal taɣawsa";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Sken tisedmirin";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "yesmenyef tasuffeɣt-ik·im";
|
||||
|
@ -224,6 +224,10 @@ girêdanê bitikne da ku ajimêra xwe bidî piştrastkirin.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Hate weşandin!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Şandî tê weşandin...";
|
||||
"Scene.HomeTimeline.Title" = "Serrûpel";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Her tiştî nîşan bide";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Qalkirinan nîşan bike";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "şandiya te hez kir";
|
||||
|
@ -218,6 +218,10 @@ klik op de link om uw account te bevestigen.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Gepubliceerd!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Bericht publiceren...";
|
||||
"Scene.HomeTimeline.Title" = "Start";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Alles weergeven";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Vermeldingen weergeven";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "heeft je bericht als favoriet gemrkeerd";
|
||||
|
@ -234,6 +234,10 @@
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Опубликовано!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Публикуем пост...";
|
||||
"Scene.HomeTimeline.Title" = "Главная";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Показать все";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Показать упоминания";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "favorited your post";
|
||||
|
@ -223,6 +223,10 @@ laddas upp till Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Publicerat!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Publicerar inlägget...";
|
||||
"Scene.HomeTimeline.Title" = "Hem";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Visa allt";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Visa omnämningar";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "favoriserade ditt inlägg";
|
||||
|
@ -223,6 +223,10 @@
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "เผยแพร่แล้ว!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "กำลังเผยแพร่โพสต์...";
|
||||
"Scene.HomeTimeline.Title" = "หน้าแรก";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "แสดงทุกอย่าง";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "แสดงการกล่าวถึง";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "ได้ชื่นชอบโพสต์ของคุณ";
|
||||
@ -246,7 +250,7 @@
|
||||
"Scene.Profile.Fields.AddRow" = "เพิ่มแถว";
|
||||
"Scene.Profile.Fields.Placeholder.Content" = "เนื้อหา";
|
||||
"Scene.Profile.Fields.Placeholder.Label" = "ป้ายชื่อ";
|
||||
"Scene.Profile.Header.FollowsYou" = "Follows You";
|
||||
"Scene.Profile.Header.FollowsYou" = "ติดตามคุณ";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "ยืนยันเพื่อปิดกั้น %@";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "ปิดกั้นบัญชี";
|
||||
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Message" = "ยืนยันเพื่อซ่อน %@";
|
||||
|
@ -222,6 +222,10 @@ yüklenemiyor.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Yayınlandı!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Gönderi yayınlanıyor...";
|
||||
"Scene.HomeTimeline.Title" = "Ana Sayfa";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Her Şeyi Göster";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Bahsetmeleri Göster";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "gönderini favoriledi";
|
||||
|
@ -223,6 +223,10 @@ tải lên Mastodon.";
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "Đã đăng!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "Đang đăng tút...";
|
||||
"Scene.HomeTimeline.Title" = "Bảng tin";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "Hiện mọi thứ";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "Hiện lượt nhắc";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "thích tút của bạn";
|
||||
|
@ -223,6 +223,10 @@
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "已发送";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "正在发送...";
|
||||
"Scene.HomeTimeline.Title" = "主页";
|
||||
"Scene.Notification.FollowRequest.Accept" = "接受";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "已接受";
|
||||
"Scene.Notification.FollowRequest.Reject" = "拒绝";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "已拒绝";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "显示全部";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "显示提及";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "喜欢了你的帖子";
|
||||
|
@ -218,6 +218,10 @@
|
||||
"Scene.HomeTimeline.NavigationBarState.Published" = "嘟出去!";
|
||||
"Scene.HomeTimeline.NavigationBarState.Publishing" = "發表嘟文...";
|
||||
"Scene.HomeTimeline.Title" = "首頁";
|
||||
"Scene.Notification.FollowRequest.Accept" = "Accept";
|
||||
"Scene.Notification.FollowRequest.Accepted" = "Accepted";
|
||||
"Scene.Notification.FollowRequest.Reject" = "reject";
|
||||
"Scene.Notification.FollowRequest.Rejected" = "Rejected";
|
||||
"Scene.Notification.Keyobard.ShowEverything" = "顯示全部";
|
||||
"Scene.Notification.Keyobard.ShowMentions" = "顯示提及";
|
||||
"Scene.Notification.NotificationDescription.FavoritedYourPost" = "最愛了您的嘟文";
|
||||
|
@ -89,3 +89,37 @@ extension Mastodon.API.Account {
|
||||
.eraseToAnyPublisher()
|
||||
}
|
||||
}
|
||||
|
||||
extension Mastodon.API.Account {
|
||||
|
||||
public enum FollowReqeustQuery {
|
||||
case accept
|
||||
case reject
|
||||
}
|
||||
|
||||
public static func followRequest(
|
||||
session: URLSession,
|
||||
domain: String,
|
||||
userID: Mastodon.Entity.Account.ID,
|
||||
query: FollowReqeustQuery,
|
||||
authorization: Mastodon.API.OAuth.Authorization
|
||||
) -> AnyPublisher<Mastodon.Response.Content<Mastodon.Entity.Relationship>, Error> {
|
||||
switch query {
|
||||
case .accept:
|
||||
return acceptFollowRequest(
|
||||
session: session,
|
||||
domain: domain,
|
||||
userID: userID,
|
||||
authorization: authorization
|
||||
)
|
||||
case .reject:
|
||||
return rejectFollowRequest(
|
||||
session: session,
|
||||
domain: domain,
|
||||
userID: userID,
|
||||
authorization: authorization
|
||||
)
|
||||
} // end switch
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,10 +13,13 @@ import MastodonSDK
|
||||
import MastodonAsset
|
||||
import MastodonLocalization
|
||||
import MastodonExtension
|
||||
import CoreData
|
||||
import CoreDataStack
|
||||
|
||||
extension NotificationView {
|
||||
public final class ViewModel: ObservableObject {
|
||||
public var disposeBag = Set<AnyCancellable>()
|
||||
public var objects = Set<NSManagedObject>()
|
||||
|
||||
let logger = Logger(subsystem: "NotificationView", category: "ViewModel")
|
||||
|
||||
@ -35,11 +38,13 @@ extension NotificationView {
|
||||
|
||||
@Published public var timestamp: Date?
|
||||
|
||||
@Published public var followRequestState = MastodonFollowRequestState(state: .none)
|
||||
@Published public var transientFollowRequestState = MastodonFollowRequestState(state: .none)
|
||||
|
||||
let timestampUpdatePublisher = Timer.publish(every: 1.0, on: .main, in: .common)
|
||||
.autoconnect()
|
||||
.share()
|
||||
.eraseToAnyPublisher()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,6 +52,7 @@ extension NotificationView.ViewModel {
|
||||
func bind(notificationView: NotificationView) {
|
||||
bindAuthor(notificationView: notificationView)
|
||||
bindAuthorMenu(notificationView: notificationView)
|
||||
bindFollowRequest(notificationView: notificationView)
|
||||
|
||||
$userIdentifier
|
||||
.assign(to: \.userIdentifier, on: notificationView.statusView.viewModel)
|
||||
@ -146,4 +152,54 @@ extension NotificationView.ViewModel {
|
||||
}
|
||||
.store(in: &disposeBag)
|
||||
}
|
||||
|
||||
private func bindFollowRequest(notificationView: NotificationView) {
|
||||
Publishers.CombineLatest(
|
||||
$followRequestState,
|
||||
$transientFollowRequestState
|
||||
)
|
||||
.sink { followRequestState, transientFollowRequestState in
|
||||
switch followRequestState.state {
|
||||
case .isAccept:
|
||||
notificationView.rejectFollowRequestButtonShadowBackgroundContainer.isHidden = true
|
||||
notificationView.acceptFollowRequestButton.isUserInteractionEnabled = false
|
||||
notificationView.acceptFollowRequestButton.setImage(nil, for: .normal)
|
||||
notificationView.acceptFollowRequestButton.setTitle(L10n.Scene.Notification.FollowRequest.accepted, for: .normal)
|
||||
case .isReject:
|
||||
notificationView.acceptFollowRequestButtonShadowBackgroundContainer.isHidden = true
|
||||
notificationView.rejectFollowRequestButton.isUserInteractionEnabled = false
|
||||
notificationView.rejectFollowRequestButton.setImage(nil, for: .normal)
|
||||
notificationView.rejectFollowRequestButton.setTitle(L10n.Scene.Notification.FollowRequest.rejected, for: .normal)
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
let state = transientFollowRequestState.state
|
||||
if state == .isAccepting {
|
||||
notificationView.acceptFollowRequestActivityIndicatorView.startAnimating()
|
||||
notificationView.acceptFollowRequestButton.tintColor = .clear
|
||||
} else {
|
||||
notificationView.acceptFollowRequestActivityIndicatorView.stopAnimating()
|
||||
notificationView.acceptFollowRequestButton.tintColor = .white
|
||||
}
|
||||
if state == .isRejecting {
|
||||
notificationView.rejectFollowRequestActivityIndicatorView.startAnimating()
|
||||
notificationView.rejectFollowRequestButton.tintColor = .clear
|
||||
} else {
|
||||
notificationView.rejectFollowRequestActivityIndicatorView.stopAnimating()
|
||||
notificationView.rejectFollowRequestButton.tintColor = .white
|
||||
}
|
||||
|
||||
UIView.animate(withDuration: 0.3) {
|
||||
if state == .isAccept {
|
||||
notificationView.rejectFollowRequestButtonShadowBackgroundContainer.isHidden = true
|
||||
}
|
||||
if state == .isReject {
|
||||
notificationView.acceptFollowRequestButtonShadowBackgroundContainer.isHidden = true
|
||||
}
|
||||
}
|
||||
}
|
||||
.store(in: &disposeBag)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,6 +17,9 @@ public protocol NotificationViewDelegate: AnyObject {
|
||||
func notificationView(_ notificationView: NotificationView, authorAvatarButtonDidPressed button: AvatarButton)
|
||||
func notificationView(_ notificationView: NotificationView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action)
|
||||
|
||||
func notificationView(_ notificationView: NotificationView, acceptFollowRequestButtonDidPressed button: UIButton)
|
||||
func notificationView(_ notificationView: NotificationView, rejectFollowRequestButtonDidPressed button: UIButton)
|
||||
|
||||
func notificationView(_ notificationView: NotificationView, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
|
||||
func notificationView(_ notificationView: NotificationView, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
|
||||
func notificationView(_ notificationView: NotificationView, statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaView: MediaView, didSelectMediaViewAt index: Int)
|
||||
@ -101,6 +104,50 @@ public final class NotificationView: UIView {
|
||||
// notification type indicator imageView
|
||||
public let notificationTypeIndicatorLabel = MetaLabel(style: .notificationTitle)
|
||||
|
||||
// follow request
|
||||
let followRequestAdaptiveMarginContainerView = AdaptiveMarginContainerView()
|
||||
let followRequestContainerView = UIStackView()
|
||||
|
||||
let acceptFollowRequestButtonShadowBackgroundContainer = ShadowBackgroundContainer()
|
||||
private(set) lazy var acceptFollowRequestButton: UIButton = {
|
||||
let button = UIButton()
|
||||
button.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .semibold)
|
||||
button.setImage(Asset.Editing.checkmark.image.withRenderingMode(.alwaysTemplate), for: .normal)
|
||||
button.imageView?.contentMode = .scaleAspectFit
|
||||
button.setBackgroundImage(.placeholder(color: .systemGreen), for: .normal)
|
||||
button.tintColor = .white
|
||||
button.layer.masksToBounds = true
|
||||
button.layer.cornerCurve = .continuous
|
||||
button.layer.cornerRadius = 4
|
||||
button.accessibilityLabel = L10n.Scene.Notification.FollowRequest.accept
|
||||
acceptFollowRequestButtonShadowBackgroundContainer.cornerRadius = 4
|
||||
acceptFollowRequestButtonShadowBackgroundContainer.shadowAlpha = 0.1
|
||||
button.addTarget(self, action: #selector(NotificationView.acceptFollowRequestButtonDidPressed(_:)), for: .touchUpInside)
|
||||
return button
|
||||
}()
|
||||
let acceptFollowRequestActivityIndicatorView = UIActivityIndicatorView(style: .medium)
|
||||
|
||||
let rejectFollowRequestButtonShadowBackgroundContainer = ShadowBackgroundContainer()
|
||||
private(set) lazy var rejectFollowRequestButton: UIButton = {
|
||||
let button = UIButton()
|
||||
button.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .semibold)
|
||||
button.setImage(Asset.Editing.xmark.image.withRenderingMode(.alwaysTemplate), for: .normal)
|
||||
button.imageView?.contentMode = .scaleAspectFit
|
||||
button.imageEdgeInsets = UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2) // tweak xmark size
|
||||
button.setBackgroundImage(.placeholder(color: .systemRed), for: .normal)
|
||||
button.tintColor = .white
|
||||
button.layer.masksToBounds = true
|
||||
button.layer.cornerCurve = .continuous
|
||||
button.layer.cornerRadius = 4
|
||||
button.accessibilityLabel = L10n.Scene.Notification.FollowRequest.reject
|
||||
rejectFollowRequestButtonShadowBackgroundContainer.cornerRadius = 4
|
||||
rejectFollowRequestButtonShadowBackgroundContainer.shadowAlpha = 0.1
|
||||
button.addTarget(self, action: #selector(NotificationView.rejectFollowRequestButtonDidPressed(_:)), for: .touchUpInside)
|
||||
return button
|
||||
}()
|
||||
let rejectFollowRequestActivityIndicatorView = UIActivityIndicatorView(style: .medium)
|
||||
|
||||
// status
|
||||
public let statusView = StatusView()
|
||||
|
||||
public let quoteStatusViewContainerView = UIView()
|
||||
@ -110,11 +157,20 @@ public final class NotificationView: UIView {
|
||||
public func prepareForReuse() {
|
||||
disposeBag.removeAll()
|
||||
|
||||
viewModel.objects.removeAll()
|
||||
viewModel.authorAvatarImageURL = nil
|
||||
avatarButton.avatarImageView.cancelTask()
|
||||
|
||||
authorContainerViewBottomPaddingView.isHidden = true
|
||||
|
||||
followRequestAdaptiveMarginContainerView.isHidden = true
|
||||
acceptFollowRequestButtonShadowBackgroundContainer.isHidden = false
|
||||
rejectFollowRequestButtonShadowBackgroundContainer.isHidden = false
|
||||
acceptFollowRequestActivityIndicatorView.stopAnimating()
|
||||
rejectFollowRequestActivityIndicatorView.stopAnimating()
|
||||
acceptFollowRequestButton.isUserInteractionEnabled = true
|
||||
rejectFollowRequestButton.isUserInteractionEnabled = true
|
||||
|
||||
statusView.isHidden = true
|
||||
statusView.prepareForReuse()
|
||||
|
||||
@ -222,6 +278,58 @@ extension NotificationView {
|
||||
])
|
||||
authorContainerViewBottomPaddingView.isHidden = true
|
||||
|
||||
// follow reqeust
|
||||
followRequestAdaptiveMarginContainerView.contentView = followRequestContainerView
|
||||
followRequestAdaptiveMarginContainerView.margin = StatusView.containerLayoutMargin
|
||||
containerStackView.addArrangedSubview(followRequestAdaptiveMarginContainerView)
|
||||
|
||||
acceptFollowRequestButton.translatesAutoresizingMaskIntoConstraints = false
|
||||
acceptFollowRequestButtonShadowBackgroundContainer.addSubview(acceptFollowRequestButton)
|
||||
NSLayoutConstraint.activate([
|
||||
acceptFollowRequestButton.topAnchor.constraint(equalTo: acceptFollowRequestButtonShadowBackgroundContainer.topAnchor),
|
||||
acceptFollowRequestButton.leadingAnchor.constraint(equalTo: acceptFollowRequestButtonShadowBackgroundContainer.leadingAnchor),
|
||||
acceptFollowRequestButton.trailingAnchor.constraint(equalTo: acceptFollowRequestButtonShadowBackgroundContainer.trailingAnchor),
|
||||
acceptFollowRequestButton.bottomAnchor.constraint(equalTo: acceptFollowRequestButtonShadowBackgroundContainer.bottomAnchor),
|
||||
])
|
||||
|
||||
rejectFollowRequestButton.translatesAutoresizingMaskIntoConstraints = false
|
||||
rejectFollowRequestButtonShadowBackgroundContainer.addSubview(rejectFollowRequestButton)
|
||||
NSLayoutConstraint.activate([
|
||||
rejectFollowRequestButton.topAnchor.constraint(equalTo: rejectFollowRequestButtonShadowBackgroundContainer.topAnchor),
|
||||
rejectFollowRequestButton.leadingAnchor.constraint(equalTo: rejectFollowRequestButtonShadowBackgroundContainer.leadingAnchor),
|
||||
rejectFollowRequestButton.trailingAnchor.constraint(equalTo: rejectFollowRequestButtonShadowBackgroundContainer.trailingAnchor),
|
||||
rejectFollowRequestButton.bottomAnchor.constraint(equalTo: rejectFollowRequestButtonShadowBackgroundContainer.bottomAnchor),
|
||||
])
|
||||
|
||||
followRequestContainerView.axis = .horizontal
|
||||
followRequestContainerView.distribution = .fillEqually
|
||||
followRequestContainerView.spacing = 8
|
||||
followRequestContainerView.isLayoutMarginsRelativeArrangement = true
|
||||
followRequestContainerView.layoutMargins = UIEdgeInsets(top: 0, left: 0, bottom: 16, right: 0) // set bottom padding
|
||||
followRequestContainerView.addArrangedSubview(acceptFollowRequestButtonShadowBackgroundContainer)
|
||||
followRequestContainerView.addArrangedSubview(rejectFollowRequestButtonShadowBackgroundContainer)
|
||||
followRequestAdaptiveMarginContainerView.isHidden = true
|
||||
|
||||
acceptFollowRequestActivityIndicatorView.translatesAutoresizingMaskIntoConstraints = false
|
||||
acceptFollowRequestButton.addSubview(acceptFollowRequestActivityIndicatorView)
|
||||
NSLayoutConstraint.activate([
|
||||
acceptFollowRequestActivityIndicatorView.centerXAnchor.constraint(equalTo: acceptFollowRequestButton.centerXAnchor),
|
||||
acceptFollowRequestActivityIndicatorView.centerYAnchor.constraint(equalTo: acceptFollowRequestButton.centerYAnchor),
|
||||
])
|
||||
acceptFollowRequestActivityIndicatorView.color = .white
|
||||
acceptFollowRequestActivityIndicatorView.hidesWhenStopped = true
|
||||
acceptFollowRequestActivityIndicatorView.stopAnimating()
|
||||
|
||||
rejectFollowRequestActivityIndicatorView.translatesAutoresizingMaskIntoConstraints = false
|
||||
rejectFollowRequestButton.addSubview(rejectFollowRequestActivityIndicatorView)
|
||||
NSLayoutConstraint.activate([
|
||||
rejectFollowRequestActivityIndicatorView.centerXAnchor.constraint(equalTo: rejectFollowRequestButton.centerXAnchor),
|
||||
rejectFollowRequestActivityIndicatorView.centerYAnchor.constraint(equalTo: rejectFollowRequestButton.centerYAnchor),
|
||||
])
|
||||
rejectFollowRequestActivityIndicatorView.color = .white
|
||||
acceptFollowRequestActivityIndicatorView.hidesWhenStopped = true
|
||||
rejectFollowRequestActivityIndicatorView.stopAnimating()
|
||||
|
||||
// statusView
|
||||
containerStackView.addArrangedSubview(statusView)
|
||||
statusView.setup(style: .notification)
|
||||
@ -271,10 +379,22 @@ extension NotificationView {
|
||||
}
|
||||
|
||||
extension NotificationView {
|
||||
|
||||
@objc private func avatarButtonDidPressed(_ sender: UIButton) {
|
||||
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
|
||||
delegate?.notificationView(self, authorAvatarButtonDidPressed: avatarButton)
|
||||
}
|
||||
|
||||
@objc private func acceptFollowRequestButtonDidPressed(_ sender: UIButton) {
|
||||
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
|
||||
delegate?.notificationView(self, acceptFollowRequestButtonDidPressed: sender)
|
||||
}
|
||||
|
||||
@objc private func rejectFollowRequestButtonDidPressed(_ sender: UIButton) {
|
||||
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
|
||||
delegate?.notificationView(self, rejectFollowRequestButtonDidPressed: sender)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension NotificationView {
|
||||
@ -282,6 +402,10 @@ extension NotificationView {
|
||||
public func setAuthorContainerBottomPaddingViewDisplay() {
|
||||
authorContainerViewBottomPaddingView.isHidden = false
|
||||
}
|
||||
|
||||
public func setFollowRequestAdaptiveMarginContainerViewDisplay() {
|
||||
followRequestAdaptiveMarginContainerView.isHidden = false
|
||||
}
|
||||
|
||||
public func setStatusViewDisplay() {
|
||||
statusView.isHidden = false
|
||||
|
@ -15,8 +15,8 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>140</string>
|
||||
<string>143</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -15,8 +15,8 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>140</string>
|
||||
<string>143</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>140</string>
|
||||
<string>143</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
|
@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>140</string>
|
||||
<string>143</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionAttributes</key>
|
||||
|
Loading…
x
Reference in New Issue
Block a user