Merge branch 'develop' into Issue_732

This commit is contained in:
Marcus Kida 2023-01-06 13:55:19 +01:00
commit 61465a8f9f
No known key found for this signature in database
GPG Key ID: 19FF64E08013CA40
154 changed files with 1973 additions and 1371 deletions

48
.github/ISSUE_TEMPLATE/feature.yml vendored Normal file
View File

@ -0,0 +1,48 @@
---
name: 🛠️ Feature Request
description: Suggest an idea to help us improve
title: "[Feature]: "
labels:
- "feature_request"
body:
- type: markdown
attributes:
value: |
**Thanks :heart: for taking the time to fill out this feature request report!**
We kindly ask that you search to see if an issue [already exists](https://github.com/mastodon/mastodon-ios/issues?q=is%3Aissue+sort%3Acreated-desc+) for your feature.
We are also happy to accept contributions from our users. For more details see [here](https://github.com/mastodon/mastodon-ios/blob/develop/Documentation/CONTRIBUTING.md).
- type: textarea
attributes:
label: Description
description: |
A clear and concise description of the feature you're interested in.
validations:
required: true
- type: textarea
attributes:
label: Suggested Solution
description: |
Describe the solution you'd like. A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
attributes:
label: Alternatives
description: |
Describe alternatives you've considered.
A clear and concise description of any alternative solutions or features you've considered.
validations:
required: false
- type: textarea
attributes:
label: Additional Context
description: |
Add any other context about the problem here.
validations:
required: false

7
.gitignore vendored
View File

@ -125,4 +125,9 @@ Localization/StringsConvertor/output
.DS_Store
env/**/**
!env/.env
!env/.env
## Ruby ###
vendor/
.bundle/

View File

@ -14,7 +14,7 @@ GEM
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
arkana (1.2.0)
arkana (1.3.0)
colorize (~> 0.8)
dotenv (~> 2.7)
yaml (~> 0.2)
@ -63,7 +63,7 @@ GEM
concurrent-ruby (1.1.10)
dotenv (2.8.1)
escape (0.0.4)
ethon (0.15.0)
ethon (0.16.0)
ffi (>= 1.15.0)
ffi (1.15.5)
fourflusher (2.3.1)
@ -96,7 +96,7 @@ GEM
xcpretty (0.3.0)
rouge (~> 2.0.7)
yaml (0.2.0)
zeitwerk (2.6.3)
zeitwerk (2.6.6)
PLATFORMS
arm64-darwin-21
@ -111,4 +111,4 @@ DEPENDENCIES
xcpretty
BUNDLED WITH
2.3.17
2.3.26

View File

@ -71,7 +71,7 @@
<key>a11y.plural.count.characters_left</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@character_count@ left</string>
<string>%#@character_count@</string>
<key>character_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -79,15 +79,15 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>no characters</string>
<string>no characters left</string>
<key>one</key>
<string>1 character</string>
<string>1 character left</string>
<key>few</key>
<string>%ld characters</string>
<string>%ld characters left</string>
<key>many</key>
<string>%ld characters</string>
<string>%ld characters left</string>
<key>other</key>
<string>%ld characters</string>
<string>%ld characters left</string>
</dict>
</dict>
<key>plural.count.followed_by_and_mutual</key>

View File

@ -25,7 +25,7 @@
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${visibility}.</string>
<string>Existuje %#@count_option@ odpovídající „${visibility}“.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>

View File

@ -1,51 +1,51 @@
"16wxgf" = "Post on Mastodon";
"16wxgf" = "Publicē Mastodon";
"751xkl" = "Text Content";
"751xkl" = "Teksta Saturu";
"CsR7G2" = "Post on Mastodon";
"CsR7G2" = "Publicē Mastodon";
"HZSGTr" = "What content to post?";
"HZSGTr" = "Kādu saturu publicēt?";
"HdGikU" = "Posting failed";
"HdGikU" = "Publicēšana neizdevās";
"KDNTJ4" = "Failure Reason";
"KDNTJ4" = "Neizdošanās Iemesls";
"RHxKOw" = "Send Post with text content";
"RHxKOw" = "Sūtīt Ziņu ar teksta saturu";
"RxSqsb" = "Ziņa";
"WCIR3D" = "Post ${content} on Mastodon";
"WCIR3D" = "Publicēt ${content} Mastodon";
"ZKJSNu" = "Post";
"ZKJSNu" = "Ziņa";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Visibility";
"ZbSjzC" = "Redzamība";
"Zo4jgJ" = "Post Visibility";
"Zo4jgJ" = "Ziņu Redzamība";
"apSxMG-dYQ5NN" = "There are ${count} options matching Public.";
"apSxMG-dYQ5NN" = "Ir ${count} opcijas, kas atbilst “Publisks”.";
"apSxMG-ehFLjY" = "There are ${count} options matching Followers Only.";
"apSxMG-ehFLjY" = "Ir ${count} opcijas, kas atbilst “Tikai Sekotājiem”.";
"ayoYEb-dYQ5NN" = "${content}, Public";
"ayoYEb-dYQ5NN" = "${content}, Publisks";
"ayoYEb-ehFLjY" = "${content}, Followers Only";
"ayoYEb-ehFLjY" = "${content}, Tikai Sekotājiem";
"dUyuGg" = "Post on Mastodon";
"dUyuGg" = "Publicē Mastodon";
"dYQ5NN" = "Publisks";
"ehFLjY" = "Tikai sekotājiem";
"gfePDu" = "Posting failed. ${failureReason}";
"gfePDu" = "Publicēšana neizdevās. ${failureReason}";
"k7dbKQ" = "Post was sent successfully.";
"k7dbKQ" = "Ziņa tika veiksmīgi nosūtīta.";
"oGiqmY-dYQ5NN" = "Just to confirm, you wanted Public?";
"oGiqmY-dYQ5NN" = "Tikai apstiprinājumam, tu vēlējies \"Publisks\"?";
"oGiqmY-ehFLjY" = "Just to confirm, you wanted Followers Only?";
"oGiqmY-ehFLjY" = "Tikai apstiprinājumam, tu vēlējies \"Tikai Sekotājiem\"?";
"rM6dvp" = "URL";
"ryJLwG" = "Post was sent successfully. ";
"ryJLwG" = "Ziņa tika veiksmīgi nosūtīta. ";

View File

@ -5,7 +5,7 @@
<key>There are ${count} options matching ${content}. - 2</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${content}.</string>
<string>Ir %#@count_option@, kas atbilst “${content}”.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -13,17 +13,17 @@
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>zero</key>
<string>%ld options</string>
<string>%ld opciju</string>
<key>one</key>
<string>1 option</string>
<string>1 opcija</string>
<key>other</key>
<string>%ld options</string>
<string>%ld opcijas</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${visibility}.</string>
<string>Ir %#@count_option@, kas atbilst “${visibility}”.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -31,11 +31,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>zero</key>
<string>%ld options</string>
<string>%ld izvēles</string>
<key>one</key>
<string>1 option</string>
<string>1 izvēle</string>
<key>other</key>
<string>%ld options</string>
<string>%ld izvēles</string>
</dict>
</dict>
</dict>

View File

@ -71,7 +71,7 @@
<key>a11y.plural.count.characters_left</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@character_count@ left</string>
<string>%#@character_count@</string>
<key>character_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -79,15 +79,15 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>no characters</string>
<string>no characters left</string>
<key>one</key>
<string>1 character</string>
<string>1 character left</string>
<key>few</key>
<string>%ld characters</string>
<string>%ld characters left</string>
<key>many</key>
<string>%ld characters</string>
<string>%ld characters left</string>
<key>other</key>
<string>%ld characters</string>
<string>%ld characters left</string>
</dict>
</dict>
<key>plural.count.followed_by_and_mutual</key>

View File

@ -187,6 +187,12 @@
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"show_original": "Shown Original"
},
"media": {
"accessibility_label": "%s, attachment %d of %d",
"expand_image_hint": "Expands the image. Double-tap and hold to show actions",
"expand_gif_hint": "Expands the GIF. Double-tap and hold to show actions",
"expand_video_hint": "Shows the video player. Double-tap and hold to show actions"
}
},
"friendship": {
@ -379,7 +385,7 @@
"published": "Published!",
"Publishing": "Publishing post...",
"accessibility": {
"logo_label": "Logo Button",
"logo_label": "Mastodon",
"logo_hint": "Tap to scroll to top and tap again to previous location"
}
}

View File

@ -463,9 +463,12 @@
"follows_you": "Te sigue"
},
"dashboard": {
"posts": "publicacions",
"following": "seguindo",
"followers": "seguidores"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -99,8 +99,8 @@
"settings": "الإعدادات",
"delete": "حذف",
"translate_post": {
"title": "Translate from %s",
"unknown_language": "Unknown"
"title": "الترجَمَة مِن %s",
"unknown_language": "غير مَعرُوفة"
}
},
"tabs": {
@ -142,7 +142,7 @@
"sensitive_content": "مُحتَوى حَسَّاس",
"media_content_warning": "اُنقُر لِلكَشف",
"tap_to_reveal": "اُنقُر لِلكَشف",
"load_embed": "Load Embed",
"load_embed": "تحميل المُضمَن",
"link_via_user": "%s via %s",
"poll": {
"vote": "صَوِّت",
@ -165,7 +165,7 @@
"show_image": "أظْهِرِ الصُّورَة",
"show_gif": "أظْهِر GIF",
"show_video_player": "أظْهِر مُشَغِّلَ المَقاطِعِ المَرئِيَّة",
"share_link_in_post": "Share Link in Post",
"share_link_in_post": "مُشارَكَة الرابِط فِي مَنشور",
"tap_then_hold_to_show_menu": "اُنقُر مُطَوَّلًا لِإظْهَارِ القائِمَة"
},
"tag": {
@ -183,9 +183,9 @@
"direct": "المُستخدمِونَ المُشارِ إليهم فَقَطْ مَن يُمكِنُهُم رُؤيَةُ هَذَا المَنشُور."
},
"translation": {
"translated_from": "Translated from %s using %s",
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"translated_from": "الترجَمَة مِن %s بِاستِخدَام %s",
"unknown_language": "غير مَعرُوفة",
"unknown_provider": "غير مَعرُوف",
"show_original": "Shown Original"
}
},
@ -463,9 +463,12 @@
"follows_you": "يُتابِعُك"
},
"dashboard": {
"posts": "مَنشورات",
"following": "مُتابَع",
"followers": "مُتابِع"
"my_posts": "مَنشورات",
"my_following": "مُتابَعُون",
"my_followers": "مُتابِعُون",
"other_posts": "مَنشورات",
"other_following": "مُتابَعُون",
"other_followers": "مُتابِعُون"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "Només l'usuari mencionat pot veure aquesta publicació."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Traduït del %s fent servir %s",
"unknown_language": "Desconegut",
"unknown_provider": "Unknown",
"unknown_provider": "Desconegut",
"show_original": "Mostra l'original"
}
},
@ -463,9 +463,12 @@
"follows_you": "Et segueix"
},
"dashboard": {
"posts": "tuts",
"following": "seguint",
"followers": "seguidors"
"my_posts": "tuts",
"my_following": "seguint",
"my_followers": "seguidors",
"other_posts": "tuts",
"other_following": "seguint",
"other_followers": "seguidors"
},
"fields": {
"joined": "S'hi va unir",

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "پۆستەکان",
"following": "شوێنکەوتن",
"followers": "شوێنکەوتوو"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -65,7 +65,7 @@
<key>a11y.plural.count.characters_left</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@character_count@ left</string>
<string>%#@character_count@ zbývá</string>
<key>character_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>

View File

@ -53,8 +53,8 @@
"message": "Úspěšně vyčištěno %s mezipaměti."
},
"translation_failed": {
"title": "Note",
"message": "Translation failed. Maybe the administrator has not enabled translations on this server or this server is running an older version of Mastodon where translations are not yet supported.",
"title": "Poznámka",
"message": "Překlad se nezdařil. Správce možná nepovolil překlad na tomto serveru nebo tento server používá starší verzi Mastodonu, kde překlady ještě nejsou podporovány.",
"button": "OK"
}
},
@ -83,7 +83,7 @@
"sign_up": "Vytvořit účet",
"see_more": "Zobrazit více",
"preview": "Náhled",
"copy": "Copy",
"copy": "Kopírovat",
"share": "Sdílet",
"share_user": "Sdílet %s",
"share_post": "Sdílet příspěvek",
@ -99,13 +99,13 @@
"settings": "Nastavení",
"delete": "Smazat",
"translate_post": {
"title": "Translate from %s",
"unknown_language": "Unknown"
"title": "Přeložit z %s",
"unknown_language": "Neznámý"
}
},
"tabs": {
"home": "Domů",
"search_and_explore": "Search and Explore",
"search_and_explore": "Hledat a zkoumat",
"notifications": "Oznámení",
"profile": "Profil"
},
@ -124,7 +124,7 @@
"open_reblogger_profile": "Otevřít rebloggerův profil",
"reply_status": "Odpovědět na příspěvek",
"toggle_reblog": "Přepnout Reblog na příspěvku",
"toggle_favorite": "Toggle Favorite on Post",
"toggle_favorite": "Přepnout Oblíbené na příspěvku",
"toggle_content_warning": "Přepnout varování obsahu",
"preview_image": "Náhled obrázku"
},
@ -142,8 +142,8 @@
"sensitive_content": "Citlivý obsah",
"media_content_warning": "Klepnutím kdekoli zobrazíte",
"tap_to_reveal": "Klepnutím zobrazit",
"load_embed": "Load Embed",
"link_via_user": "%s via %s",
"load_embed": "Načíst vložené",
"link_via_user": "%s přes %s",
"poll": {
"vote": "Hlasovat",
"closed": "Uzavřeno"
@ -165,7 +165,7 @@
"show_image": "Zobrazit obrázek",
"show_gif": "Zobrazit GIF",
"show_video_player": "Zobrazit video přehrávač",
"share_link_in_post": "Share Link in Post",
"share_link_in_post": "Sdílet odkaz v příspěvku",
"tap_then_hold_to_show_menu": "Klepnutím podržte pro zobrazení nabídky"
},
"tag": {
@ -183,10 +183,10 @@
"direct": "Pouze zmíněný uživatel může vidět tento příspěvek."
},
"translation": {
"translated_from": "Translated from %s using %s",
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"show_original": "Shown Original"
"translated_from": "Přeloženo z %s pomocí %s",
"unknown_language": "Neznámý",
"unknown_provider": "Neznámý",
"show_original": "Zobrazit originál"
}
},
"friendship": {
@ -463,12 +463,15 @@
"follows_you": "Sleduje vás"
},
"dashboard": {
"posts": "příspěvky",
"following": "sledování",
"followers": "sledující"
"my_posts": "příspěvky",
"my_following": "sledování",
"my_followers": "sledující",
"other_posts": "příspěvky",
"other_following": "sledování",
"other_followers": "sledující"
},
"fields": {
"joined": "Joined",
"joined": "Připojen/a",
"add_row": "Přidat řádek",
"placeholder": {
"label": "Označení",

View File

@ -53,9 +53,9 @@
"message": "Cliriwyd storfa %s yn llwyddiannus."
},
"translation_failed": {
"title": "Note",
"message": "Translation failed. Maybe the administrator has not enabled translations on this server or this server is running an older version of Mastodon where translations are not yet supported.",
"button": "OK"
"title": "Nodyn",
"message": "Methwyd cyfieithu. Efallai nad yw'r gweinyddwr wedi galluogi cyfieithiadau ar y gweinydd hwn neu mae'r gweinydd hwn yn rhedeg fersiwn hŷn o Mastodon lle nad yw cyfieithiadau ar gael eto.",
"button": "Iawn"
}
},
"controls": {
@ -83,7 +83,7 @@
"sign_up": "Creu cyfrif",
"see_more": "Gweld Mwy",
"preview": "Rhagolwg",
"copy": "Copy",
"copy": "Copïo",
"share": "Rhannu",
"share_user": "Rhannu %s",
"share_post": "Rhannu Tŵt",
@ -99,8 +99,8 @@
"settings": "Gosodiadau",
"delete": "Dileu",
"translate_post": {
"title": "Translate from %s",
"unknown_language": "Unknown"
"title": "Cyfieithu o %s",
"unknown_language": "Anhysbys"
}
},
"tabs": {
@ -142,8 +142,8 @@
"sensitive_content": "Cynnwys Sensitif",
"media_content_warning": "Tapiwch unrhywle i weld",
"tap_to_reveal": "Tapiwch i weld",
"load_embed": "Load Embed",
"link_via_user": "%s via %s",
"load_embed": "Llwytho Planiad",
"link_via_user": "%s trwy %s",
"poll": {
"vote": "Pleidleisio",
"closed": "Wedi cau"
@ -165,7 +165,7 @@
"show_image": "Dangos llun",
"show_gif": "Dangos GIF",
"show_video_player": "Dangos chwaraewr fideo",
"share_link_in_post": "Share Link in Post",
"share_link_in_post": "Rhannu'r Ddolen yn y Postiad",
"tap_then_hold_to_show_menu": "Tapiwch a gwasgu i gael y ddewislen"
},
"tag": {
@ -183,10 +183,10 @@
"direct": "Dim ond y ddefnyddiwr â soniwyd sy'n gallu gweld y post hwn."
},
"translation": {
"translated_from": "Translated from %s using %s",
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"show_original": "Shown Original"
"translated_from": "Cyfieithwyd o %s gan ddefnyddio %s",
"unknown_language": "Anhysbys",
"unknown_provider": "Anhysbys",
"show_original": "Dangos y Gwreiddiol"
}
},
"friendship": {
@ -463,12 +463,15 @@
"follows_you": "Yn eich dilyn"
},
"dashboard": {
"posts": "postiadau",
"following": "yn dilyn",
"followers": "dilynwyr"
"my_posts": "postiadu",
"my_following": "yn dilyn",
"my_followers": "dilynwyr",
"other_posts": "postiadu",
"other_following": "yn dilyn",
"other_followers": "dilynwyr"
},
"fields": {
"joined": "Joined",
"joined": "Ymunwyd",
"add_row": "Ychwanegu Rhes",
"placeholder": {
"label": "Label",

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "Nur erwähnte Benutzer können diesen Beitrag sehen."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Übersetzt von %s mit %s",
"unknown_language": "Unbekannt",
"unknown_provider": "Unknown",
"unknown_provider": "Unbekannt",
"show_original": "Original anzeigen"
}
},
@ -463,9 +463,12 @@
"follows_you": "Folgt dir"
},
"dashboard": {
"posts": "Beiträge",
"following": "Gefolgte",
"followers": "Folgende"
"my_posts": "Beiträge",
"my_following": "folge ich",
"my_followers": "followers",
"other_posts": "Beiträge",
"other_following": "folge ich",
"other_followers": "followers"
},
"fields": {
"joined": "Beigetreten",

View File

@ -463,12 +463,15 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Liitytty",
"joined": "Joined",
"add_row": "Add Row",
"placeholder": {
"label": "Label",

View File

@ -463,12 +463,15 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Liitytty",
"joined": "Joined",
"add_row": "Add Row",
"placeholder": {
"label": "Label",

View File

@ -183,9 +183,9 @@
"direct": "Sólo el usuario mencionado puede ver este mensaje."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Traducido desde el %s vía %s",
"unknown_language": "Desconocido",
"unknown_provider": "Unknown",
"unknown_provider": "Desconocido",
"show_original": "Mostrar original"
}
},
@ -463,9 +463,12 @@
"follows_you": "Te sigue"
},
"dashboard": {
"posts": "mensajes",
"following": "siguiendo",
"followers": "seguidores"
"my_posts": "mensajes",
"my_following": "siguiendo",
"my_followers": "seguidores",
"other_posts": "mensajes",
"other_following": "siguiendo",
"other_followers": "seguidores"
},
"fields": {
"joined": "En este servidor desde",

View File

@ -183,9 +183,9 @@
"direct": "Sólo el usuario mencionado puede ver este mensaje."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Traducido desde %s usando %s",
"unknown_language": "Desconocido",
"unknown_provider": "Unknown",
"unknown_provider": "Desconocido",
"show_original": "Mostrar Original"
}
},
@ -463,12 +463,15 @@
"follows_you": "Te sigue"
},
"dashboard": {
"posts": "publicaciones",
"following": "siguiendo",
"followers": "seguidores"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",
"joined": "Se unió",
"add_row": "Añadir Fila",
"placeholder": {
"label": "Nombre para el campo",

View File

@ -463,9 +463,12 @@
"follows_you": "Jarraitzen zaitu"
},
"dashboard": {
"posts": "bidalketa",
"following": "jarraitzen",
"followers": "jarraitzaile"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "Only mentioned user can see this post."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Käännetty kielestä %s palvelulla %s",
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"unknown_provider": "Tuntematon",
"show_original": "Shown Original"
}
},
@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "julkaisut",
"following": "seurataan",
"followers": "seuraajat"
"my_posts": "julkaisut",
"my_following": "seurattavat",
"my_followers": "seuraajat",
"other_posts": "julkaisut",
"other_following": "seurattavat",
"other_followers": "seuraajat"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "Seul·e lutilisateur·rice mentionnée peut voir ce message."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Traduit de %s en utilisant %s",
"unknown_language": "Inconnu",
"unknown_provider": "Unknown",
"unknown_provider": "Inconnu",
"show_original": "Afficher loriginal"
}
},
@ -463,9 +463,12 @@
"follows_you": "Vous suit"
},
"dashboard": {
"posts": "publications",
"following": "abonnements",
"followers": "abonnés"
"my_posts": "messages",
"my_following": "abonnement",
"my_followers": "abonnés",
"other_posts": "publications",
"other_following": "abonnement",
"other_followers": "abonnés"
},
"fields": {
"joined": "Ici depuis",

View File

@ -463,9 +463,12 @@
"follows_you": "Gad leantainn"
},
"dashboard": {
"posts": "postaichean",
"following": "a leantainn",
"followers": "luchd-leantainn"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "Só a usuaria mencionada pode ver a publicación."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Traducido do %s usando %s",
"unknown_language": "Descoñecido",
"unknown_provider": "Unknown",
"unknown_provider": "Descoñecido",
"show_original": "Mostrar o orixinal"
}
},
@ -463,9 +463,12 @@
"follows_you": "Séguete"
},
"dashboard": {
"posts": "publicacións",
"following": "seguindo",
"followers": "seguidoras"
"my_posts": "publicacións",
"my_following": "seguindo",
"my_followers": "seguidoras",
"other_posts": "publicacións",
"other_following": "seguindo",
"other_followers": "seguidoras"
},
"fields": {
"joined": "Uniuse",

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Mengikutimu"
},
"dashboard": {
"posts": "postingan",
"following": "mengikuti",
"followers": "pengikut"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Bergabung",

View File

@ -142,7 +142,7 @@
"sensitive_content": "Viðkvæmt efni",
"media_content_warning": "Ýttu hvar sem er til að birta",
"tap_to_reveal": "Ýttu til að birta",
"load_embed": "Load Embed",
"load_embed": "Hlaða inn ívöfnu",
"link_via_user": "%s með %s",
"poll": {
"vote": "Greiða atkvæði",
@ -183,9 +183,9 @@
"direct": "Einungis notendur sem minnst er á geta séð þessa færslu."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Þýtt úr %s með %s",
"unknown_language": "Óþekkt",
"unknown_provider": "Unknown",
"unknown_provider": "Óþekkt",
"show_original": "Birta upprunalegt"
}
},
@ -463,9 +463,12 @@
"follows_you": "Fylgist með þér"
},
"dashboard": {
"posts": "færslur",
"following": "fylgist með",
"followers": "fylgjendur"
"my_posts": "færslur",
"my_following": "er fylgst með",
"my_followers": "fylgjendur",
"other_posts": "færslur",
"other_following": "er fylgst með",
"other_followers": "fylgjendur"
},
"fields": {
"joined": "Gerðist þátttakandi",

View File

@ -183,9 +183,9 @@
"direct": "Solo l'utente menzionato può vedere questo post."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Tradotto da %s utilizzando %s",
"unknown_language": "Sconosciuto",
"unknown_provider": "Unknown",
"unknown_provider": "Sconosciuto",
"show_original": "Mostra l'originale"
}
},
@ -463,9 +463,12 @@
"follows_you": "Ti segue"
},
"dashboard": {
"posts": "post",
"following": "seguendo",
"followers": "seguaci"
"my_posts": "post",
"my_following": "seguendo",
"my_followers": "seguaci",
"other_posts": "post",
"other_following": "seguendo",
"other_followers": "seguaci"
},
"fields": {
"joined": "Profilo iscritto",

View File

@ -463,9 +463,12 @@
"follows_you": "フォローされています"
},
"dashboard": {
"posts": "投稿",
"following": "フォロー",
"followers": "フォロワー"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Yeṭṭafaṛ-ik•im"
},
"dashboard": {
"posts": "tisuffaɣ",
"following": "iṭafaṛ",
"followers": "imeḍfaren"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -83,7 +83,7 @@
"sign_up": "Ajimêr biafirîne",
"see_more": "Bêtir bibîne",
"preview": "Pêşdîtin",
"copy": "Copy",
"copy": "Jê bigire",
"share": "Parve bike",
"share_user": "%s parve bike",
"share_post": "Şandiyê parve bike",
@ -99,7 +99,7 @@
"settings": "Sazkarî",
"delete": "Jê bibe",
"translate_post": {
"title": "Ji %s hate wergerandin",
"title": "Ji %s wergerîne",
"unknown_language": "Nenas"
}
},
@ -143,7 +143,7 @@
"media_content_warning": "Ji bo eşkerekirinê li derekî bitikîne",
"tap_to_reveal": "Ji bo dîtinê bitikîne",
"load_embed": "Load Embed",
"link_via_user": "%s via %s",
"link_via_user": "%s bi riya %s",
"poll": {
"vote": "Deng bide",
"closed": "Girtî"
@ -165,7 +165,7 @@
"show_image": "Wêneyê nîşan bide",
"show_gif": "GIF nîşan bide",
"show_video_player": "Lêdera vîdyoyê nîşan bide",
"share_link_in_post": "Share Link in Post",
"share_link_in_post": "Girêdanê di şandiyê de parve bike",
"tap_then_hold_to_show_menu": "Ji bo nîşandana menuyê dirêj bitikîne"
},
"tag": {
@ -183,9 +183,9 @@
"direct": "Tenê bikarhênerê qalkirî dikare vê şandiyê bibîne."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Hate wergerandin ji %s bi riya %s",
"unknown_language": "Nenas",
"unknown_provider": "Unknown",
"unknown_provider": "Nenas",
"show_original": "A resen nîşan bide"
}
},
@ -463,9 +463,12 @@
"follows_you": "Te dişopîne"
},
"dashboard": {
"posts": "şandî",
"following": "dişopîne",
"followers": "şopîner"
"my_posts": "şandî",
"my_following": "dişopîne",
"my_followers": "şopîner",
"other_posts": "şandî",
"other_following": "dişopîne",
"other_followers": "şopîner"
},
"fields": {
"joined": "Dîroka tevlîbûnê",

View File

@ -183,9 +183,9 @@
"direct": "Only mentioned user can see this post."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "%s에서 %s를 사용해 번역됨",
"unknown_language": "알 수 없음",
"unknown_provider": "Unknown",
"unknown_provider": "알 수 없음",
"show_original": "원본 보기"
}
},
@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "게시물",
"following": "팔로잉",
"followers": "팔로워"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "가입일",

View File

@ -13,17 +13,17 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld unread notifications</string>
<string>%ld nelasītu paziņojumu</string>
<key>one</key>
<string>1 unread notification</string>
<string>1 nelasīts paziņojums</string>
<key>other</key>
<string>%ld unread notifications</string>
<string>%ld nelasīti paziņojumi</string>
</dict>
</dict>
<key>a11y.plural.count.input_limit_exceeds</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Input limit exceeds %#@character_count@</string>
<string>Ievades ierobežojums pārsniedz %#@character_count@</string>
<key>character_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -31,17 +31,17 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld characters</string>
<string>%ld rakstzīmju</string>
<key>one</key>
<string>1 character</string>
<string>1 rakstzīme</string>
<key>other</key>
<string>%ld characters</string>
<string>%ld rakstzīmes</string>
</dict>
</dict>
<key>a11y.plural.count.input_limit_remains</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Input limit remains %#@character_count@</string>
<string>Ievades ierobežojums paliek %#@character_count@</string>
<key>character_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -49,17 +49,17 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld characters</string>
<string>%ld rakstzīmju</string>
<key>one</key>
<string>1 character</string>
<string>1 rakstzīme</string>
<key>other</key>
<string>%ld characters</string>
<string>%ld rakstzīmes</string>
</dict>
</dict>
<key>a11y.plural.count.characters_left</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@character_count@ left</string>
<string>%#@character_count@ palikušas</string>
<key>character_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -67,11 +67,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld characters</string>
<string>%ld rakstzīmju</string>
<key>one</key>
<string>1 character</string>
<string>1 rakstzīme</string>
<key>other</key>
<string>%ld characters</string>
<string>%ld rakstzīmes</string>
</dict>
</dict>
<key>plural.count.followed_by_and_mutual</key>
@ -98,11 +98,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>Followed by %1$@, and %ld mutuals</string>
<string>Seko %1$@ un %ld kopīgi</string>
<key>one</key>
<string>Followed by %1$@, and another mutual</string>
<string>Seko %1$@ un vēl viens kopīgs</string>
<key>other</key>
<string>Followed by %1$@, and %ld mutuals</string>
<string>Seko %1$@ un %ld kopīgi</string>
</dict>
</dict>
<key>plural.count.metric_formatted.post</key>
@ -116,11 +116,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>posts</string>
<string>ziņu</string>
<key>one</key>
<string>post</string>
<string>ziņa</string>
<key>other</key>
<string>posts</string>
<string>ziņas</string>
</dict>
</dict>
<key>plural.count.media</key>
@ -134,11 +134,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld media</string>
<string>%ld multivide</string>
<key>one</key>
<string>1 media</string>
<string>1 multivide</string>
<key>other</key>
<string>%ld media</string>
<string>%ld multivide</string>
</dict>
</dict>
<key>plural.count.post</key>
@ -152,11 +152,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld posts</string>
<string>%ld ziņu</string>
<key>one</key>
<string>1 post</string>
<string>1 ziņa</string>
<key>other</key>
<string>%ld posts</string>
<string>%ld ziņas</string>
</dict>
</dict>
<key>plural.count.favorite</key>
@ -170,11 +170,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld favorites</string>
<string>%ld iecienītu</string>
<key>one</key>
<string>1 favorite</string>
<string>1 iecienīts</string>
<key>other</key>
<string>%ld favorites</string>
<string>%ld iecienīti</string>
</dict>
</dict>
<key>plural.count.reblog</key>
@ -188,11 +188,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld reblogs</string>
<string>%ld reblogu</string>
<key>one</key>
<string>1 reblog</string>
<string>1 reblogs</string>
<key>other</key>
<string>%ld reblogs</string>
<string>%ld reblogi</string>
</dict>
</dict>
<key>plural.count.reply</key>
@ -206,11 +206,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld replies</string>
<string>%ld atbilžu</string>
<key>one</key>
<string>1 reply</string>
<string>1 atbilde</string>
<key>other</key>
<string>%ld replies</string>
<string>%ld atbildes</string>
</dict>
</dict>
<key>plural.count.vote</key>
@ -224,11 +224,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld votes</string>
<string>%ld balsu</string>
<key>one</key>
<string>1 vote</string>
<string>1 balss</string>
<key>other</key>
<string>%ld votes</string>
<string>%ld balsis</string>
</dict>
</dict>
<key>plural.count.voter</key>
@ -242,11 +242,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld voters</string>
<string>%ld balsotāju</string>
<key>one</key>
<string>1 voter</string>
<string>1 balsotājs</string>
<key>other</key>
<string>%ld voters</string>
<string>%ld balsotāji</string>
</dict>
</dict>
<key>plural.people_talking</key>
@ -260,11 +260,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld people talking</string>
<string>%ld cilvēku apspriež</string>
<key>one</key>
<string>1 people talking</string>
<string>1 cilvēks apspriež</string>
<key>other</key>
<string>%ld people talking</string>
<string>%ld cilvēki apspriež</string>
</dict>
</dict>
<key>plural.count.following</key>
@ -278,11 +278,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld following</string>
<string>%ld sekotāju</string>
<key>one</key>
<string>1 following</string>
<string>1 sekotājs</string>
<key>other</key>
<string>%ld following</string>
<string>%ld sekotāji</string>
</dict>
</dict>
<key>plural.count.follower</key>
@ -296,11 +296,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld followers</string>
<string>%ld sekotāju</string>
<key>one</key>
<string>1 follower</string>
<string>1 sekotājs</string>
<key>other</key>
<string>%ld followers</string>
<string>%ld sekotāji</string>
</dict>
</dict>
<key>date.year.left</key>
@ -314,11 +314,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld years left</string>
<string>palicis %ld gadu</string>
<key>one</key>
<string>1 year left</string>
<string>palicis 1 gads</string>
<key>other</key>
<string>%ld years left</string>
<string>palikuši %ld gadi</string>
</dict>
</dict>
<key>date.month.left</key>
@ -332,11 +332,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld months left</string>
<string>palicis %ld mēnešu</string>
<key>one</key>
<string>1 months left</string>
<string>palicis 1 mēnesis</string>
<key>other</key>
<string>%ld months left</string>
<string>palikuši %ld mēneši</string>
</dict>
</dict>
<key>date.day.left</key>
@ -350,11 +350,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld days left</string>
<string>palikušas %ld dienas</string>
<key>one</key>
<string>1 day left</string>
<string>palikusi 1 diena</string>
<key>other</key>
<string>%ld days left</string>
<string>palikušas %ld dienas</string>
</dict>
</dict>
<key>date.hour.left</key>
@ -368,11 +368,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld hours left</string>
<string>atlikušas %ld stundas</string>
<key>one</key>
<string>1 hour left</string>
<string>atlikusi 1 stunda</string>
<key>other</key>
<string>%ld hours left</string>
<string>atlikušas %ld stundas</string>
</dict>
</dict>
<key>date.minute.left</key>
@ -386,11 +386,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld minutes left</string>
<string>atlikušas %ld minūtes</string>
<key>one</key>
<string>1 minute left</string>
<string>atlikusi 1 minūte</string>
<key>other</key>
<string>%ld minutes left</string>
<string>atlikušas %ld minūtes</string>
</dict>
</dict>
<key>date.second.left</key>
@ -404,11 +404,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ld seconds left</string>
<string>atlikušas %ld sekundes</string>
<key>one</key>
<string>1 second left</string>
<string>atlikusi 1 sekunde</string>
<key>other</key>
<string>%ld seconds left</string>
<string>atlikušas %ld sekundes</string>
</dict>
</dict>
<key>date.year.ago.abbr</key>
@ -422,11 +422,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ldy ago</string>
<string>pirms %ld g.</string>
<key>one</key>
<string>1y ago</string>
<string>pirms 1 g.</string>
<key>other</key>
<string>%ldy ago</string>
<string>pirms %ld g.</string>
</dict>
</dict>
<key>date.month.ago.abbr</key>
@ -440,11 +440,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ldM ago</string>
<string>pirms %ld M.</string>
<key>one</key>
<string>1M ago</string>
<string>pirms 1 M.</string>
<key>other</key>
<string>%ldM ago</string>
<string>pirms %ld M.</string>
</dict>
</dict>
<key>date.day.ago.abbr</key>
@ -458,11 +458,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ldd ago</string>
<string>pirms %ld d.</string>
<key>one</key>
<string>1d ago</string>
<string>pirms 1 d.</string>
<key>other</key>
<string>%ldd ago</string>
<string>pirms %ld d.</string>
</dict>
</dict>
<key>date.hour.ago.abbr</key>
@ -476,11 +476,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ldh ago</string>
<string>pirms %ld st.</string>
<key>one</key>
<string>1h ago</string>
<string>pirms 1 st.</string>
<key>other</key>
<string>%ldh ago</string>
<string>pirms %ld st.</string>
</dict>
</dict>
<key>date.minute.ago.abbr</key>
@ -494,11 +494,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%ldm ago</string>
<string>pirms %ld m.</string>
<key>one</key>
<string>1m ago</string>
<string>pirms 1 m.</string>
<key>other</key>
<string>%ldm ago</string>
<string>pirms %ld m.</string>
</dict>
</dict>
<key>date.second.ago.abbr</key>
@ -512,11 +512,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>%lds ago</string>
<string>pirms %ld s.</string>
<key>one</key>
<string>1s ago</string>
<string>pirms 1 s.</string>
<key>other</key>
<string>%lds ago</string>
<string>pirms %ld s.</string>
</dict>
</dict>
</dict>

View File

@ -121,9 +121,9 @@
"next_status": "Nākamā Ziņa",
"open_status": "Atvērt Ziņu",
"open_author_profile": "Atvērt Autora Profilu",
"open_reblogger_profile": "Atvērt Pārpublicētāja Profilu",
"open_reblogger_profile": "Atvērt Reblogotāja Profilu",
"reply_status": "Atbildēt uz Ziņu",
"toggle_reblog": "Pārslēgt Atbilde uz Ziņu",
"toggle_reblog": "Pārslēgt Reblogs uz Ziņu",
"toggle_favorite": "Pārslēgt Izlasi uz Ziņas",
"toggle_content_warning": "Pārslēgt Satura Brīdinājumu",
"preview_image": "Priekšskata attēls"
@ -134,7 +134,7 @@
}
},
"status": {
"user_reblogged": "%s pārpublicēja",
"user_reblogged": "%s reblogoja",
"user_replied_to": "Atbildēja %s",
"show_post": "Parādīt Ziņu",
"show_user_profile": "Parādīt lietotāja profilu",
@ -157,36 +157,36 @@
"actions": {
"reply": "Atbildēt",
"reblog": "Reblogot",
"unreblog": "Atsaukt pārpublicēšanu",
"unreblog": "Atsaukt reblogu",
"favorite": "Izlase",
"unfavorite": "Izņemt no izlases",
"menu": "Izvēlne",
"hide": "Slēpt",
"show_image": "Rādīt attēlu",
"show_gif": "Rādīt GIF",
"show_video_player": "Show video player",
"share_link_in_post": "Share Link in Post",
"tap_then_hold_to_show_menu": "Tap then hold to show menu"
"show_video_player": "Rādīt video atskaņotāju",
"share_link_in_post": "Kopīgot Saiti Ziņā",
"tap_then_hold_to_show_menu": "Pieskaries un turi, lai parādītu izvēlni"
},
"tag": {
"url": "URL",
"mention": "Pieminēt",
"link": "Saite",
"hashtag": "Hashtag",
"hashtag": "Tēmturis",
"email": "E-pasts",
"emoji": "Emocijzīmes"
},
"visibility": {
"unlisted": "Everyone can see this post but not display in the public timeline.",
"private": "Only their followers can see this post.",
"private_from_me": "Only my followers can see this post.",
"direct": "Only mentioned user can see this post."
"unlisted": "Ikviens var redzēt šo ziņu, bet to nevar parādīt publiskajā laikrindā.",
"private": "Šo ziņu var redzēt tikai viņu sekotāji.",
"private_from_me": "Šo ziņu var redzēt tikai mani sekotāji.",
"direct": "Šo ziņu var redzēt tikai minētais lietotājs."
},
"translation": {
"translated_from": "Translated from %s using %s",
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"show_original": "Shown Original"
"translated_from": "Tulkots no %s, izmantojot %s",
"unknown_language": "Nezināms",
"unknown_provider": "Nezināms",
"show_original": "Parādīts Oriģināls"
}
},
"friendship": {
@ -205,9 +205,9 @@
"unmute": "Noņemt apklusinājumu",
"unmute_user": "Noņemt apklusinājumu @%s",
"muted": "Apklusināts",
"edit_info": "Edit Info",
"show_reblogs": "Show Reblogs",
"hide_reblogs": "Hide Reblogs"
"edit_info": "Rediģēt",
"show_reblogs": "Rādīt Reblogus",
"hide_reblogs": "Paslēpt Reblogus"
},
"timeline": {
"filtered": "Filtrēts",
@ -215,48 +215,48 @@
"now": "Tagad"
},
"loader": {
"load_missing_posts": "Load missing posts",
"loading_missing_posts": "Loading missing posts...",
"load_missing_posts": "Ielādēt trūkstošās ziņas",
"loading_missing_posts": "Ielādē trūkstošās ziņas...",
"show_more_replies": "Rādīt vairāk atbildes"
},
"header": {
"no_status_found": "No Post Found",
"blocking_warning": "You cant view this user's profile\nuntil you unblock them.\nYour profile looks like this to them.",
"user_blocking_warning": "You cant view %ss profile\nuntil you unblock them.\nYour profile looks like this to them.",
"blocked_warning": "You cant view this users profile\nuntil they unblock you.",
"user_blocked_warning": "You cant view %ss profile\nuntil they unblock you.",
"suspended_warning": "This user has been suspended.",
"user_suspended_warning": "%ss account has been suspended."
"no_status_found": "Nav Atrastu Ziņu",
"blocking_warning": "Tu nevari skatīt šī lietotāja profilu,\nlīdz tu tos atbloķē.\nTavs profils viņiem izskatās šādi.",
"user_blocking_warning": "Tu nevari skatīt %s profilu,\nlīdz tu tos atbloķē.\nTavs profils viņiem izskatās šādi.",
"blocked_warning": "Tu nevari skatīt šī lietotāja profilu\nlīdz tie tevi atbloķē.",
"user_blocked_warning": "Tu nevari skatīt %s profilu,\nlīdz tie tevi atbloķē.",
"suspended_warning": "Šī lietotāja darbība ir apturēta.",
"user_suspended_warning": "%s konta darbība ir apturēta."
}
}
}
},
"scene": {
"welcome": {
"slogan": "Social networking\nback in your hands.",
"get_started": "Get Started",
"slogan": "Sociālie tīkli\natpakaļ tavās rokās.",
"get_started": "Sāc",
"log_in": "Pieteikties"
},
"login": {
"title": "Welcome back",
"subtitle": "Log you in on the server you created your account on.",
"title": "Laipni lūdzam atpakaļ",
"subtitle": "Piesakies serverī, kurā izveidoji savu kontu.",
"server_search_field": {
"placeholder": "Enter URL or search for your server"
"placeholder": "Ievadi URL vai meklē savu serveri"
}
},
"server_picker": {
"title": "Mastodon is made of users in different servers.",
"subtitle": "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers.",
"title": "Mastodon veido lietotāji dažādos serveros.",
"subtitle": "Izvēlieties serveri, pamatojoties uz savu reģionu, interesēm vai vispārīgu mērķi. Tu joprojām vari tērzēt ar jebkuru Mastodon lietotāju neatkarīgi no taviem serveriem.",
"button": {
"category": {
"all": "Visi",
"all_accessiblity_description": "Katekorija: Visi",
"academia": "academia",
"activism": "activism",
"academia": "akadēmija",
"activism": "aktīvisms",
"food": "ēdiens",
"furry": "furry",
"furry": "pūkains",
"games": "spēles",
"general": "general",
"general": "galvenais",
"journalism": "žurnālisms",
"lgbt": "lgbt",
"regional": "regionāli",
@ -273,17 +273,17 @@
"category": "KATEGORIJA"
},
"input": {
"search_servers_or_enter_url": "Search communities or enter URL"
"search_servers_or_enter_url": "Meklēt kopienas vai ievadīt URL"
},
"empty_state": {
"finding_servers": "Finding available servers...",
"bad_network": "Something went wrong while loading the data. Check your internet connection.",
"finding_servers": "Meklē piejamos serverus...",
"bad_network": "Ielādējot datus, radās problēma. Pārbaudi interneta savienojumu.",
"no_results": "Nav rezultātu"
}
},
"register": {
"title": "Lets get you set up on %s",
"lets_get_you_set_up_on_domain": "Lets get you set up on %s",
"title": "Ļauj tevi iestatīt %s",
"lets_get_you_set_up_on_domain": "Ļauj tevi iestatīt %s",
"input": {
"avatar": {
"delete": "Dzēst"
@ -300,7 +300,7 @@
},
"password": {
"placeholder": "parole",
"require": "Your password needs at least:",
"require": "Tavai parolei ir nepieciešams vismaz:",
"character_limit": "8 rakstzīmes",
"accessibility": {
"checked": "atzīmēts",
@ -322,29 +322,29 @@
"reason": "Iemesls"
},
"reason": {
"blocked": "%s contains a disallowed email provider",
"blocked": "%s satur neatļautu e-pasta pakalpojumu sniedzēju",
"unreachable": "%s šķiet, ka neeksistē",
"taken": "%s jau tiek izmantots",
"reserved": "%s is a reserved keyword",
"accepted": "%s must be accepted",
"reserved": "%s ir rezervēts atslēgvārds",
"accepted": "%s jābūt apstiprinātām",
"blank": "%s ir obligāts",
"invalid": "%s ir nederīgs",
"too_long": "%s ir pārāk garaš",
"too_short": "%s ir pārāk īs",
"inclusion": "%s is not a supported value"
"inclusion": "%s nav atbalstīta vērtība"
},
"special": {
"username_invalid": "Username must only contain alphanumeric characters and underscores",
"username_too_long": "Username is too long (cant be longer than 30 characters)",
"email_invalid": "This is not a valid email address",
"password_too_short": "Password is too short (must be at least 8 characters)"
"username_invalid": "Lietotājvārdā drīkst būt tikai burtciparu rakstzīmes un zemsvītras",
"username_too_long": "Lietotājvārds ir par garu (nedrīkst būt garāks par 30 rakstzīmēm)",
"email_invalid": "Šī nav derīga e-pasta adrese",
"password_too_short": "Parole ir pārāk īsa (jābūt vismaz 8 rakstzīmēm)"
}
}
},
"server_rules": {
"title": "Some ground rules.",
"subtitle": "These are set and enforced by the %s moderators.",
"prompt": "By continuing, youre subject to the terms of service and privacy policy for %s.",
"title": "Daži pamatnoteikumi.",
"subtitle": "Tos iestata un ievieš %s moderatori.",
"prompt": "Turpinot, uz tevi attiecas %s pakalpojumu sniegšanas noteikumi un konfidencialitātes politika.",
"terms_of_service": "pakalpojuma noteikumi",
"privacy_policy": "privātuma nosacījumi",
"button": {
@ -352,45 +352,45 @@
}
},
"confirm_email": {
"title": "One last thing.",
"subtitle": "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",
"title": "Pēdējā lieta.",
"subtitle": "Pieskaries saitei, ko nosūtījām tev pa e-pastu, lai verificētu savu kontu.",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Pieskaries saitei, ko nosūtījām tev pa e-pastu, lai verificētu savu kontu",
"button": {
"open_email_app": "Open Email App",
"open_email_app": "Atvērt E-pasta Lietotni",
"resend": "Nosūtīt atkārtoti"
},
"dont_receive_email": {
"title": "Pārbaudi savu e-pastu",
"description": "Check if your email address is correct as well as your junk folder if you havent.",
"description": "Pārbaudi, vai tava e-pasta adrese ir pareiza, kā arī savu mēstuļu mapi, ja tā nav.",
"resend_email": "Atkārtoti nosūtīt e-pastu"
},
"open_email_app": {
"title": "Check your inbox.",
"description": "We just sent you an email. Check your junk folder if you havent.",
"mail": "Mail",
"open_email_client": "Open Email Client"
"title": "Pārbaudi savu iesūtni.",
"description": "Mēs tikko nosūtījām tev e-pastu. Pārbaudi savu mēstuļu mapi, ja neesi to saņēmis.",
"mail": "Pasts",
"open_email_client": "Atvērt E-pasta Klientu"
}
},
"home_timeline": {
"title": "Home",
"title": "Sākums",
"navigation_bar_state": {
"offline": "Offline",
"new_posts": "See new posts",
"published": "Published!",
"Publishing": "Publishing post...",
"offline": "Bezsaistē",
"new_posts": "Skatīt jaunās ziņas",
"published": "Publicēts!",
"Publishing": "Publicē ziņu...",
"accessibility": {
"logo_label": "Logo Button",
"logo_hint": "Tap to scroll to top and tap again to previous location"
"logo_label": "Logotipa Poga",
"logo_hint": "Pieskaries, lai ritinātu uz augšu, un vēlreiz pieskaries iepriekšējai atrašanās vietai"
}
}
},
"suggestion_account": {
"title": "Find People to Follow",
"follow_explain": "When you follow someone, youll see their posts in your home feed."
"title": "Atrodi Cilvēkus kam Sekot",
"follow_explain": "Kad seko kādam, tu redzēsi viņu ziņas savā mājas plūsmā."
},
"compose": {
"title": {
"new_post": "New Post",
"new_post": "Jauna Ziņa",
"new_reply": "Jauna atbilde"
},
"media_selection": {
@ -398,36 +398,36 @@
"photo_library": "Attēlu krātuve",
"browse": "Pārlūkot"
},
"content_input_placeholder": "Type or paste whats on your mind",
"content_input_placeholder": "Ieraksti vai ielīmē to, ko domā",
"compose_action": "Publicēt",
"replying_to_user": "replying to %s",
"replying_to_user": "atbildot uz %s",
"attachment": {
"photo": "attēls",
"video": "video",
"attachment_broken": "This %s is broken and cant be\nuploaded to Mastodon.",
"description_photo": "Describe the photo for the visually-impaired...",
"description_video": "Describe the video for the visually-impaired...",
"load_failed": "Load Failed",
"upload_failed": "Upload Failed",
"can_not_recognize_this_media_attachment": "Can not recognize this media attachment",
"attachment_too_large": "Attachment too large",
"compressing_state": "Compressing...",
"server_processing_state": "Server Processing..."
"attachment_broken": "Šis %s ir salauzts un nevar tikt augšuplādēts Mastodon.",
"description_photo": "Apraksti fotoattēlu vājredzīgajiem...",
"description_video": "Apraksti video vājredzīgajiem...",
"load_failed": "Ielāde Neizdevās",
"upload_failed": "Augšupielāde Neizdevās",
"can_not_recognize_this_media_attachment": "Nevar atpazīt šo multivides pielikumu",
"attachment_too_large": "Pārāk liels pielikums",
"compressing_state": "Saspiež...",
"server_processing_state": "Notiek servera apstrāde..."
},
"poll": {
"duration_time": "Duration: %s",
"duration_time": "Ilgums: %s",
"thirty_minutes": "30 minūtes",
"one_hour": "1 Stunda",
"six_hours": "6 stundas",
"one_day": "1 Diena",
"three_days": "3 Dienas",
"seven_days": "7 Dienas",
"option_number": "Option %ld",
"the_poll_is_invalid": "The poll is invalid",
"the_poll_has_empty_option": "The poll has empty option"
"option_number": "Izvēle %ld",
"the_poll_is_invalid": "Aptauja nav derīga",
"the_poll_has_empty_option": "Aptaujai ir tukša opcija"
},
"content_warning": {
"placeholder": "Write an accurate warning here..."
"placeholder": "Uzraksti šeit precīzu brīdinājumu..."
},
"visibility": {
"public": "Publisks",
@ -436,26 +436,26 @@
"direct": "Tikai cilvēki, kurus es pieminu"
},
"auto_complete": {
"space_to_add": "Space to add"
"space_to_add": "Vieta, ko pievienot"
},
"accessibility": {
"append_attachment": "Pievienot pielikumu",
"append_poll": "Pievienot aptauju",
"remove_poll": "Noņemt aptauju",
"custom_emoji_picker": "Custom Emoji Picker",
"enable_content_warning": "Enable Content Warning",
"disable_content_warning": "Disable Content Warning",
"post_visibility_menu": "Post Visibility Menu",
"post_options": "Post Options",
"posting_as": "Posting as %s"
"custom_emoji_picker": "Pielāgoto Emocijzīmju Atlasītājs",
"enable_content_warning": "Iespējot Satura Brīdinājumu",
"disable_content_warning": "Atspējot Satura Brīdinājumu",
"post_visibility_menu": "Ziņu Redzamības Izvēlne",
"post_options": "Ziņas Iespējas",
"posting_as": "Publicēt kā %s"
},
"keyboard": {
"discard_post": "Discard Post",
"publish_post": "Publish Post",
"toggle_poll": "Toggle Poll",
"toggle_content_warning": "Toggle Content Warning",
"discard_post": "Izmest Ziņu",
"publish_post": "Publicēt Ziņu",
"toggle_poll": "Pārslēgt Aptauju",
"toggle_content_warning": "Pārslēgt Satura Brīdinājumu",
"append_attachment_entry": "Pievienot pielikumu - %s",
"select_visibility_entry": "Select Visibility - %s"
"select_visibility_entry": "Atlasīt Redzamību  %s"
}
},
"profile": {
@ -463,24 +463,27 @@
"follows_you": "Seko tev"
},
"dashboard": {
"posts": "posts",
"following": "seko",
"followers": "sekottāji"
"my_posts": "ziņas",
"my_following": "seko",
"my_followers": "sekotāji",
"other_posts": "ziņas",
"other_following": "seko",
"other_followers": "sekotāji"
},
"fields": {
"joined": "Joined",
"joined": "Pievienojās",
"add_row": "Pievienot rindu",
"placeholder": {
"label": "Label",
"label": "Marķējums",
"content": "Saturs"
},
"verified": {
"short": "Verified on %s",
"long": "Ownership of this link was checked on %s"
"short": "Pārbaudīts %s",
"long": "Šīs saites piederība tika pārbaudīta %s"
}
},
"segmented_control": {
"posts": "Posts",
"posts": "Ziņas",
"replies": "Atbildes",
"posts_and_replies": "Ziņas un atbildes",
"media": "Multivide",
@ -488,97 +491,97 @@
},
"relationship_action_alert": {
"confirm_mute_user": {
"title": "Mute Account",
"message": "Confirm to mute %s"
"title": "Izslēgt Kontu",
"message": "Apstiprināt, lai izslēgtu %s skaņu"
},
"confirm_unmute_user": {
"title": "Unmute Account",
"message": "Confirm to unmute %s"
"title": "Ieslēgt Kontu",
"message": "Apstiprināt, lai ieslēgtu %s skaņu"
},
"confirm_block_user": {
"title": "Bloķēts kontu",
"message": "Confirm to block %s"
"message": "Apstiprināt, lai bloķētu %s"
},
"confirm_unblock_user": {
"title": "Atbloķēt kontu",
"message": "Apstiprini lai atbloķētu %s"
},
"confirm_show_reblogs": {
"title": "Show Reblogs",
"message": "Confirm to show reblogs"
"title": "Rādīt Reblogus",
"message": "Apstiprināt, lai rādītu reblogus"
},
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
"title": "Paslēpt Reblogus",
"message": "Apstiprināt, lai slēptu reblogus"
}
},
"accessibility": {
"show_avatar_image": "Show avatar image",
"edit_avatar_image": "Edit avatar image",
"show_banner_image": "Show banner image",
"double_tap_to_open_the_list": "Double tap to open the list"
"show_avatar_image": "Rādīt avatara attēlu",
"edit_avatar_image": "Rediģēt avatara attēlu",
"show_banner_image": "Rādīt bannera attēlu",
"double_tap_to_open_the_list": "Dubultskāriens, lai atvērtu sarakstu"
}
},
"follower": {
"title": "sekottājs",
"footer": "Followers from other servers are not displayed."
"footer": "Sekotāji no citiem serveriem netiek rādīti."
},
"following": {
"title": "seko",
"footer": "Follows from other servers are not displayed."
"footer": "Sekojumi no citiem serveriem netiek rādīti."
},
"familiarFollowers": {
"title": "Followers you familiar",
"followed_by_names": "Followed by %s"
"title": "Tev pazīstamie sekotāji",
"followed_by_names": "Seko %s"
},
"favorited_by": {
"title": "Favorited By"
"title": "Pievienoja izlasei"
},
"reblogged_by": {
"title": "Reblogged By"
"title": "Reblogoja"
},
"search": {
"title": "Meklēt",
"search_bar": {
"placeholder": "Search hashtags and users",
"placeholder": "Meklēt tēmturus un lietotājus",
"cancel": "Atcelt"
},
"recommend": {
"button_text": "Skatīt visu",
"hash_tag": {
"title": "Trending on Mastodon",
"description": "Hashtags that are getting quite a bit of attention",
"people_talking": "%s people are talking"
"title": "Tendences vietnē Mastodon",
"description": "Tēmturi, kuriem tiek pievērsta diezgan liela uzmanība",
"people_talking": "%s cilvēki apspriež"
},
"accounts": {
"title": "Accounts you might like",
"description": "You may like to follow these accounts",
"follow": "Follow"
"title": "Konti, kuri tev varētu patikt",
"description": "Iespējams, tu vēlēsies sekot šiem kontiem",
"follow": "Sekot"
}
},
"searching": {
"segment": {
"all": "All",
"people": "People",
"hashtags": "Hashtags",
"posts": "Posts"
"all": "Visi",
"people": "Cilvēki",
"hashtags": "Tēmturi",
"posts": "Ziņas"
},
"empty_state": {
"no_results": "No results"
"no_results": "Nav rezultātu"
},
"recent_search": "Recent searches",
"clear": "Clear"
"recent_search": "Nesen meklētais",
"clear": "Notīrīt"
}
},
"discovery": {
"tabs": {
"posts": "Ziņas",
"hashtags": "Hashtags",
"hashtags": "Tēmturi",
"news": "Ziņas",
"community": "Community",
"community": "Kopiena",
"for_you": "Priekš tevis"
},
"intro": "These are the posts gaining traction in your corner of Mastodon."
"intro": "Šīs ir ziņas, kas iekaro tavu Mastodon stūrīti."
},
"favorite": {
"title": "Tava izlase"
@ -589,16 +592,16 @@
"Mentions": "Pieminējumi"
},
"notification_description": {
"followed_you": "followed you",
"favorited_your_post": "favorited your post",
"reblogged_your_post": "reblogged your post",
"followed_you": "tev sekoja",
"favorited_your_post": "izcēla tavu ziņu",
"reblogged_your_post": "reblogoja tavu ziņu",
"mentioned_you": "pieminēja tevi",
"request_to_follow_you": "request to follow you",
"request_to_follow_you": "lūgums tev sekot",
"poll_has_ended": "balsošana beidzās"
},
"keyobard": {
"show_everything": "Parādīt man visu",
"show_mentions": "Show Mentions"
"show_mentions": "Rādīt Pieminējumus"
},
"follow_request": {
"accept": "Pieņemt",
@ -609,7 +612,7 @@
},
"thread": {
"back_title": "Ziņa",
"title": "Post from %s"
"title": "Ziņa no %s"
},
"settings": {
"title": "Iestatījumi",
@ -622,42 +625,42 @@
},
"look_and_feel": {
"title": "Izskats",
"use_system": "Use System",
"use_system": "Lietot Sistēmas",
"really_dark": "Ļoti tumšs",
"sorta_dark": "Itkā tumšs",
"light": "Gaišs"
},
"notifications": {
"title": "Paziņojumi",
"favorites": "Favorites my post",
"favorites": "Izceļ manu ziņu",
"follows": "Seko man",
"boosts": "Reblogs my post",
"boosts": "Reblogo manu ziņu",
"mentions": "Pieminējumi",
"trigger": {
"anyone": "jebkurš",
"follower": "sekottājs",
"follow": "anyone I follow",
"follow": "jebkurš, kam sekoju",
"noone": "neviens",
"title": "Notify me when"
"title": "Paziņot man, kad"
}
},
"preference": {
"title": "Uzstādījumi",
"true_black_dark_mode": "True black dark mode",
"disable_avatar_animation": "Disable animated avatars",
"disable_emoji_animation": "Disable animated emojis",
"using_default_browser": "Use default browser to open links",
"open_links_in_mastodon": "Open links in Mastodon"
"true_black_dark_mode": "Īsti melns tumšais režīms",
"disable_avatar_animation": "Atspējot animētos avatarus",
"disable_emoji_animation": "Atspējot animētās emocijzīmes",
"using_default_browser": "Saišu atvēršana noklusētajā pārlūkā",
"open_links_in_mastodon": "Atvērt saites Mastodon"
},
"boring_zone": {
"title": "The Boring Zone",
"title": "Garlaicīgā zona",
"account_settings": "Konta iestatījumi",
"terms": "Pakalpojuma noteikumi",
"privacy": "Privātuma politika"
},
"spicy_zone": {
"title": "The Spicy Zone",
"clear": "Clear Media Cache",
"title": "Pikantā zona",
"clear": "Notīrīt Multivides Kešatmiņu",
"signout": "Iziet"
}
},
@ -665,7 +668,7 @@
"mastodon_description": "Mastodon ir atvērtā koda programmatūra. Tu vari ziņot par problēmām GitHub %s (%s)"
},
"keyboard": {
"close_settings_window": "Close Settings Window"
"close_settings_window": "Aizvērt Iestatījumu Logu"
}
},
"report": {
@ -673,24 +676,24 @@
"title": "Ziņot %s",
"step1": "1. solis no 2",
"step2": "2. solis no 2",
"content1": "Are there any other posts youd like to add to the report?",
"content2": "Is there anything the moderators should know about this report?",
"report_sent_title": "Thanks for reporting, well look into this.",
"content1": "Vai ir vēl kādas ziņas, kuras vēlies pievienot pārskatam?",
"content2": "Vai moderatoriem ir kaut kas jāzina par šo ziņojumu?",
"report_sent_title": "Paldies, ka ziņoji, mēs to izskatīsim.",
"send": "Nosūtīt Sūdzību",
"skip_to_send": "Sūtīt bez komentāra",
"text_placeholder": "Type or paste additional comments",
"reported": "REPORTED",
"text_placeholder": "Ieraksti vai ielīmē papildu komentārus",
"reported": "ZIŅOTS",
"step_one": {
"step_1_of_4": "1. solis no 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?",
"whats_wrong_with_this_post": "Kas vainas šim ierakstam?",
"whats_wrong_with_this_account": "Kas vainas šim kontam?",
"whats_wrong_with_this_username": "Kas vainas %s?",
"select_the_best_match": "Izvēlieties labāko atbilstību",
"i_dont_like_it": "Man tas nepatīk",
"it_is_not_something_you_want_to_see": "Tas nav kaut kas, ko tu vēlies redzēt",
"its_spam": "Tas ir spams",
"malicious_links_fake_engagement_or_repetetive_replies": "Malicious links, fake engagement, or repetetive replies",
"it_violates_server_rules": "It violates server rules",
"malicious_links_fake_engagement_or_repetetive_replies": "Ļaunprātīgas saites, viltus iesaistīšana vai atkārtotas atbildes",
"it_violates_server_rules": "Tas pārkāpj servera noteikumus",
"you_are_aware_that_it_breaks_specific_rules": "Tu zini, ka tas pārkāpj īpašus noteikumus",
"its_something_else": "Tas ir kaut kas cits",
"the_issue_does_not_fit_into_other_categories": "Šis jautājums neietilpst citās kategorijās"
@ -699,7 +702,7 @@
"step_2_of_4": "2. solis no 4",
"which_rules_are_being_violated": "Kuri noteikumi tiek pārkāpti?",
"select_all_that_apply": "Atlasi visus atbilstošos",
"i_just_dont_like_it": "I just dont like it"
"i_just_dont_like_it": "Man vienkārši tas nepatīk"
},
"step_three": {
"step_3_of_4": "3. solis no 4",
@ -712,47 +715,47 @@
},
"step_final": {
"dont_want_to_see_this": "Vai nevēlies to redzēt?",
"when_you_see_something_you_dont_like_on_mastodon_you_can_remove_the_person_from_your_experience.": "When you see something you dont like on Mastodon, you can remove the person from your experience.",
"when_you_see_something_you_dont_like_on_mastodon_you_can_remove_the_person_from_your_experience.": "Kad pakalpojumā Mastodon redzi kaut ko, kas tev nepatīk, tu vari noņemt šo personu no savas pieredzes.",
"unfollow": "Atsekot",
"unfollowed": "Atsekoja",
"unfollow_user": "Atsekot %s",
"mute_user": "Apklusināt %s",
"you_wont_see_their_posts_or_reblogs_in_your_home_feed_they_wont_know_they_ve_been_muted": "You wont see their posts or reblogs in your home feed. They wont know theyve been muted.",
"you_wont_see_their_posts_or_reblogs_in_your_home_feed_they_wont_know_they_ve_been_muted": "Tu neredzēsi viņu ziņas vai reblogus savā mājas plūsmā. Viņi nezinās, ka ir izslēgti.",
"block_user": "Bloķēt %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 theyve been blocked.",
"they_will_no_longer_be_able_to_follow_or_see_your_posts_but_they_can_see_if_theyve_been_blocked": "Viņi vairs nevarēs sekot tavām ziņām vai redzēt tās, taču varēs redzēt, vai viņi ir bloķēti.",
"while_we_review_this_you_can_take_action_against_user": "Kamēr mēs to izskatām, tu vari veikt darbības pret @%s"
}
},
"preview": {
"keyboard": {
"close_preview": "Close Preview",
"show_next": "Show Next",
"show_previous": "Show Previous"
"close_preview": "Aizvērt Priekšskatījumu",
"show_next": "Rādīt Nākamo",
"show_previous": "Rādīt Iepriekšējo"
}
},
"account_list": {
"tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
"dismiss_account_switcher": "Dismiss Account Switcher",
"tab_bar_hint": "Pašreizējais atlasītais profils: %s. Veic dubultskārienu un pēc tam turi, lai parādītu konta pārslēdzēju",
"dismiss_account_switcher": "Noraidīt Konta Pārslēdzēju",
"add_account": "Pievienot kontu"
},
"wizard": {
"new_in_mastodon": "New in Mastodon",
"multiple_account_switch_intro_description": "Switch between multiple accounts by holding the profile button.",
"accessibility_hint": "Double tap to dismiss this wizard"
"new_in_mastodon": "Jaunums Mastodonā",
"multiple_account_switch_intro_description": "Pārslēdzies starp vairākiem kontiem, turot nospiestu profila pogu.",
"accessibility_hint": "Veic dubultskārienu, lai noraidītu šo vedni"
},
"bookmark": {
"title": "Bookmarks"
"title": "Grāmatzīmes"
},
"followed_tags": {
"title": "Followed Tags",
"title": "Sekotie Tēmturi",
"header": {
"posts": "posts",
"participants": "participants",
"posts_today": "posts today"
"posts": "ziņas",
"participants": "dalībnieki",
"posts_today": "ziņas šodien"
},
"actions": {
"follow": "Follow",
"unfollow": "Unfollow"
"follow": "Sekot",
"unfollow": "Atsekot"
}
}
}

View File

@ -1,6 +1,6 @@
{
"NSCameraUsageDescription": "Used to take photo for post status",
"NSPhotoLibraryAddUsageDescription": "Used to save photo into the Photo Library",
"NewPostShortcutItemTitle": "New Post",
"SearchShortcutItemTitle": "Search"
"NSCameraUsageDescription": "Izmanto, lai fotografētu ziņas statusu",
"NSPhotoLibraryAddUsageDescription": "Izmanto, lai saglabātu fotoattēlu Photo Library",
"NewPostShortcutItemTitle": "Jauna Ziņa",
"SearchShortcutItemTitle": "Meklēt"
}

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Volgt jou"
},
"dashboard": {
"posts": "berichten",
"following": "volgend",
"followers": "volgers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Segue você"
},
"dashboard": {
"posts": "toots",
"following": "seguindo",
"followers": "seguidores"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Подписан(а) на вас"
},
"dashboard": {
"posts": "посты",
"following": "подписки",
"followers": "подписчики"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Follows You"
},
"dashboard": {
"posts": "posts",
"following": "following",
"followers": "followers"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "Samo omenjeni uporabnik lahko vidi to objavo."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Prevedeno iz %s s pomočjo %s",
"unknown_language": "Neznano",
"unknown_provider": "Unknown",
"unknown_provider": "Neznano",
"show_original": "Pokaži izvirnik"
}
},
@ -463,12 +463,15 @@
"follows_you": "Vam sledi"
},
"dashboard": {
"posts": "Objave",
"following": "sledi",
"followers": "sledilcev"
"my_posts": "objav",
"my_following": "sledi",
"my_followers": "sledilcev",
"other_posts": "objav",
"other_following": "sledi",
"other_followers": "sledilcev"
},
"fields": {
"joined": "Joined",
"joined": "Pridružen_a",
"add_row": "Dodaj vrstico",
"placeholder": {
"label": "Oznaka",

View File

@ -183,9 +183,9 @@
"direct": "Endast omnämnda användare kan se detta inlägg."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Översatt från %s med %s",
"unknown_language": "Okänt",
"unknown_provider": "Unknown",
"unknown_provider": "Okänd",
"show_original": "Visa original"
}
},
@ -463,9 +463,12 @@
"follows_you": "Följer dig"
},
"dashboard": {
"posts": "inlägg",
"following": "följer",
"followers": "följare"
"my_posts": "inlägg",
"my_following": "följer",
"my_followers": "följare",
"other_posts": "inlägg",
"other_following": "följer",
"other_followers": "följare"
},
"fields": {
"joined": "Gick med",

View File

@ -183,9 +183,9 @@
"direct": "เฉพาะผู้ใช้ที่กล่าวถึงเท่านั้นที่สามารถเห็นโพสต์นี้"
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "แปลจาก %s โดยใช้ %s",
"unknown_language": "ไม่รู้จัก",
"unknown_provider": "Unknown",
"unknown_provider": "ไม่รู้จัก",
"show_original": "แสดงดั้งเดิมอยู่"
}
},
@ -463,12 +463,15 @@
"follows_you": "ติดตามคุณ"
},
"dashboard": {
"posts": "โพสต์",
"following": "กำลังติดตาม",
"followers": "ผู้ติดตาม"
"my_posts": "โพสต์",
"my_following": "กำลังติดตาม",
"my_followers": "ผู้ติดตาม",
"other_posts": "โพสต์",
"other_following": "กำลังติดตาม",
"other_followers": "ผู้ติดตาม"
},
"fields": {
"joined": "Joined",
"joined": "เข้าร่วมเมื่อ",
"add_row": "เพิ่มแถว",
"placeholder": {
"label": "ป้ายชื่อ",

View File

@ -463,9 +463,12 @@
"follows_you": "Seni takip ediyor"
},
"dashboard": {
"posts": "gönderiler",
"following": "takip ediliyor",
"followers": "takipçi"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -463,9 +463,12 @@
"follows_you": "Підписаний(-на) на вас"
},
"dashboard": {
"posts": "дописів",
"following": "підписаний",
"followers": "підписників"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "Chỉ người được nhắc đến có thể thấy tút."
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "Dịch từ %s bằng %s",
"unknown_language": "Không xác định",
"unknown_provider": "Unknown",
"unknown_provider": "Không biết",
"show_original": "Bản gốc"
}
},
@ -463,9 +463,12 @@
"follows_you": "Đang theo dõi bạn"
},
"dashboard": {
"posts": "tút",
"following": "theo dõi",
"followers": "người theo dõi"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Đã tham gia",

View File

@ -463,9 +463,12 @@
"follows_you": "关注了你"
},
"dashboard": {
"posts": "帖子",
"following": "正在关注",
"followers": "关注者"
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers"
},
"fields": {
"joined": "Joined",

View File

@ -183,9 +183,9 @@
"direct": "只有被提及的使用者能看到此嘟文。"
},
"translation": {
"translated_from": "Translated from %s using %s",
"translated_from": "透過 %s 翻譯 %s",
"unknown_language": "未知",
"unknown_provider": "Unknown",
"unknown_provider": "未知",
"show_original": "顯示原文"
}
},
@ -463,9 +463,12 @@
"follows_you": "跟隨了您"
},
"dashboard": {
"posts": "嘟文",
"following": "跟隨中",
"followers": "跟隨者"
"my_posts": "嘟文",
"my_following": "正在跟隨",
"my_followers": "跟隨者",
"other_posts": "嘟文",
"other_following": "正在跟隨",
"other_followers": "跟隨者"
},
"fields": {
"joined": "加入時間",

View File

@ -187,6 +187,12 @@
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"show_original": "Shown Original"
},
"media": {
"accessibility_label": "%s, attachment %d of %d",
"expand_image_hint": "Expands the image. Double-tap and hold to show actions",
"expand_gif_hint": "Expands the GIF. Double-tap and hold to show actions",
"expand_video_hint": "Shows the video player. Double-tap and hold to show actions"
}
},
"friendship": {
@ -379,7 +385,7 @@
"published": "Published!",
"Publishing": "Publishing post...",
"accessibility": {
"logo_label": "Logo Button",
"logo_label": "Mastodon",
"logo_hint": "Tap to scroll to top and tap again to previous location"
}
}

View File

@ -75,6 +75,11 @@
2DAC9E46262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DAC9E45262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift */; };
2DCB73FD2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DCB73FC2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift */; };
2DE0FACE2615F7AD00CDF649 /* RecommendAccountSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE0FACD2615F7AD00CDF649 /* RecommendAccountSection.swift */; };
357FEEAF29523D470021C9DC /* MastodonSDKDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 357FEEAE29523D470021C9DC /* MastodonSDKDynamic */; };
357FEEB029523D470021C9DC /* MastodonSDKDynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 357FEEAE29523D470021C9DC /* MastodonSDKDynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
357FEEB229523D510021C9DC /* MastodonSDKDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 357FEEB129523D510021C9DC /* MastodonSDKDynamic */; };
357FEEB629523D5C0021C9DC /* MastodonSDKDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 357FEEB529523D5C0021C9DC /* MastodonSDKDynamic */; };
357FEEBA29523D660021C9DC /* MastodonSDKDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 357FEEB929523D660021C9DC /* MastodonSDKDynamic */; };
5B24BBDA262DB14800A9381B /* ReportViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B24BBD7262DB14800A9381B /* ReportViewModel.swift */; };
5B24BBDB262DB14800A9381B /* ReportStatusViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B24BBD8262DB14800A9381B /* ReportStatusViewModel+Diffable.swift */; };
5B90C45E262599800002E742 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C456262599800002E742 /* SettingsViewModel.swift */; };
@ -96,9 +101,14 @@
62FD27D12893707600B205C5 /* BookmarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FD27D02893707600B205C5 /* BookmarkViewController.swift */; };
62FD27D32893707B00B205C5 /* BookmarkViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FD27D22893707B00B205C5 /* BookmarkViewController+DataSourceProvider.swift */; };
62FD27D52893708A00B205C5 /* BookmarkViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FD27D42893708A00B205C5 /* BookmarkViewModel+Diffable.swift */; };
855149C8295F1C5F00943D96 /* UIInterfaceOrientationMask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855149C7295F1C5F00943D96 /* UIInterfaceOrientationMask.swift */; };
855149CA29606D6400943D96 /* PortraitAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855149C929606D6400943D96 /* PortraitAlertController.swift */; };
85904C02293BC0EB0011C817 /* ImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85904C01293BC0EB0011C817 /* ImageProvider.swift */; };
85904C04293BC1940011C817 /* URLActivityItemWithMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85904C03293BC1940011C817 /* URLActivityItemWithMetadata.swift */; };
85BC11B32932414900E191CD /* AltViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85BC11B22932414900E191CD /* AltViewController.swift */; };
87FFDA5D898A5C42ADCB35E7 /* Pods_Mastodon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A4ABE34829701A4496C5BB64 /* Pods_Mastodon.framework */; };
9E44C7202967AD17004B2A72 /* MastodonSDKDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */; };
9E44C7222967AD17004B2A72 /* MastodonSDKDynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
C24C97032922F30500BAE8CB /* RefreshControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24C97022922F30500BAE8CB /* RefreshControl.swift */; };
D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; };
D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; };
@ -129,7 +139,6 @@
DB0618032785A7100030EE79 /* RegisterSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618022785A7100030EE79 /* RegisterSection.swift */; };
DB0618052785A73D0030EE79 /* RegisterItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618042785A73D0030EE79 /* RegisterItem.swift */; };
DB0A322E280EE9FD001729D2 /* DiscoveryIntroBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */; };
DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */; };
DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */; };
DB0EF72E26FDB24F00347686 /* SidebarListContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0EF72D26FDB24F00347686 /* SidebarListContentView.swift */; };
DB0F8150264D1E2500F2A12B /* PickServerLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0F814F264D1E2500F2A12B /* PickServerLoaderTableViewCell.swift */; };
@ -169,10 +178,6 @@
DB1FD44425F26CCC004CFCFC /* PickServerSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1FD44325F26CCC004CFCFC /* PickServerSection.swift */; };
DB1FD45025F26FA1004CFCFC /* MastodonPickServerViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1FD44F25F26FA1004CFCFC /* MastodonPickServerViewModel+Diffable.swift */; };
DB1FD45A25F27898004CFCFC /* CategoryPickerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1FD45925F27898004CFCFC /* CategoryPickerItem.swift */; };
DB22C92228E700A10082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92128E700A10082A9E9 /* MastodonSDK */; };
DB22C92428E700A80082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92328E700A80082A9E9 /* MastodonSDK */; };
DB22C92628E700AF0082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92528E700AF0082A9E9 /* MastodonSDK */; };
DB22C92828E700B70082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92728E700B70082A9E9 /* MastodonSDK */; };
DB2B3ABC25E37E15007045F9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DB2B3ABE25E37E15007045F9 /* InfoPlist.strings */; };
DB2F073525E8ECF000957B2D /* AuthenticationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2F073325E8ECF000957B2D /* AuthenticationViewModel.swift */; };
DB2FF510260B113300ADA9FE /* ComposeStatusPollExpiresOptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2FF50F260B113300ADA9FE /* ComposeStatusPollExpiresOptionCollectionViewCell.swift */; };
@ -306,8 +311,6 @@
DB72602725E36A6F00235243 /* MastodonServerRulesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB72602625E36A6F00235243 /* MastodonServerRulesViewModel.swift */; };
DB7274F4273BB9B200577D95 /* ListBatchFetchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7274F3273BB9B200577D95 /* ListBatchFetchViewModel.swift */; };
DB73B490261F030A002E9E9F /* SafariActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73B48F261F030A002E9E9F /* SafariActivity.swift */; };
DB73BF4927140BA300781945 /* UICollectionViewDiffableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */; };
DB73BF4B27140C0800781945 /* UITableViewDiffableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */; };
DB75BF1E263C1C1B00EDBF1F /* CustomScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB75BF1D263C1C1B00EDBF1F /* CustomScheduler.swift */; };
DB789A0B25F9F2950071ACA0 /* ComposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB789A0A25F9F2950071ACA0 /* ComposeViewController.swift */; };
DB789A1225F9F2CC0071ACA0 /* ComposeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB789A1125F9F2CC0071ACA0 /* ComposeViewModel.swift */; };
@ -486,12 +489,24 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9E44C7212967AD17004B2A72 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
9E44C7222967AD17004B2A72 /* MastodonSDKDynamic in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
DB89BA0825C10FD0008580ED /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
357FEEB029523D470021C9DC /* MastodonSDKDynamic in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@ -618,8 +633,11 @@
7CB58D292DA7ACEF179A9050 /* Pods-Mastodon.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon.profile.xcconfig"; path = "Target Support Files/Pods-Mastodon/Pods-Mastodon.profile.xcconfig"; sourceTree = "<group>"; };
7CEFFAE9AF9284B13C0A758D /* Pods-MastodonTests.asdk - debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MastodonTests.asdk - debug.xcconfig"; path = "Target Support Files/Pods-MastodonTests/Pods-MastodonTests.asdk - debug.xcconfig"; sourceTree = "<group>"; };
819CEC9DCAD8E8E7BD85A7BB /* Pods-Mastodon.asdk.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon.asdk.xcconfig"; path = "Target Support Files/Pods-Mastodon/Pods-Mastodon.asdk.xcconfig"; sourceTree = "<group>"; };
855149C7295F1C5F00943D96 /* UIInterfaceOrientationMask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIInterfaceOrientationMask.swift; sourceTree = "<group>"; };
855149C929606D6400943D96 /* PortraitAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortraitAlertController.swift; sourceTree = "<group>"; };
85904C01293BC0EB0011C817 /* ImageProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageProvider.swift; sourceTree = "<group>"; };
85904C03293BC1940011C817 /* URLActivityItemWithMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLActivityItemWithMetadata.swift; sourceTree = "<group>"; };
85BC11B22932414900E191CD /* AltViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AltViewController.swift; sourceTree = "<group>"; };
8850E70A1D5FF51432E43653 /* Pods-Mastodon-MastodonUITests.asdk - release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon-MastodonUITests.asdk - release.xcconfig"; path = "Target Support Files/Pods-Mastodon-MastodonUITests/Pods-Mastodon-MastodonUITests.asdk - release.xcconfig"; sourceTree = "<group>"; };
8E79CCBE51FBC3F7FE8CF49F /* Pods-MastodonTests.release snapshot.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MastodonTests.release snapshot.xcconfig"; path = "Target Support Files/Pods-MastodonTests/Pods-MastodonTests.release snapshot.xcconfig"; sourceTree = "<group>"; };
8ED8C4B1F1BA2DCFF2926BB1 /* Pods-Mastodon-NotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon-NotificationService.debug.xcconfig"; path = "Target Support Files/Pods-Mastodon-NotificationService/Pods-Mastodon-NotificationService.debug.xcconfig"; sourceTree = "<group>"; };
@ -667,7 +685,6 @@
DB0618042785A73D0030EE79 /* RegisterItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterItem.swift; sourceTree = "<group>"; };
DB0618062785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonRegisterViewModel+Diffable.swift"; sourceTree = "<group>"; };
DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryIntroBannerView.swift; sourceTree = "<group>"; };
DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAvatarButton.swift; sourceTree = "<group>"; };
DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListCollectionViewCell.swift; sourceTree = "<group>"; };
DB0EF72D26FDB24F00347686 /* SidebarListContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListContentView.swift; sourceTree = "<group>"; };
DB0F814E264CFFD300F2A12B /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@ -879,8 +896,6 @@
DB72602625E36A6F00235243 /* MastodonServerRulesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonServerRulesViewModel.swift; sourceTree = "<group>"; };
DB7274F3273BB9B200577D95 /* ListBatchFetchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListBatchFetchViewModel.swift; sourceTree = "<group>"; };
DB73B48F261F030A002E9E9F /* SafariActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariActivity.swift; sourceTree = "<group>"; };
DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UICollectionViewDiffableDataSource.swift; sourceTree = "<group>"; };
DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewDiffableDataSource.swift; sourceTree = "<group>"; };
DB75BF1D263C1C1B00EDBF1F /* CustomScheduler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomScheduler.swift; sourceTree = "<group>"; };
DB789A0A25F9F2950071ACA0 /* ComposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeViewController.swift; sourceTree = "<group>"; };
DB789A1125F9F2CC0071ACA0 /* ComposeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeViewModel.swift; sourceTree = "<group>"; };
@ -1085,7 +1100,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DB22C92428E700A80082A9E9 /* MastodonSDK in Frameworks */,
357FEEAF29523D470021C9DC /* MastodonSDKDynamic in Frameworks */,
DBF96326262EC0A6001D8D25 /* AuthenticationServices.framework in Frameworks */,
87FFDA5D898A5C42ADCB35E7 /* Pods_Mastodon.framework in Frameworks */,
);
@ -1095,6 +1110,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9E44C7202967AD17004B2A72 /* MastodonSDKDynamic in Frameworks */,
5E44BF88AD33646E64727BCF /* Pods_MastodonTests.framework in Frameworks */,
5E0DEC05797A7E6933788DDB /* Pods_MastodonTests.framework in Frameworks */,
);
@ -1112,7 +1128,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DB22C92828E700B70082A9E9 /* MastodonSDK in Frameworks */,
357FEEBA29523D660021C9DC /* MastodonSDKDynamic in Frameworks */,
DB8FABC726AEC7B2008E5AF4 /* Intents.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -1121,7 +1137,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DB22C92628E700AF0082A9E9 /* MastodonSDK in Frameworks */,
357FEEB629523D5C0021C9DC /* MastodonSDKDynamic in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1129,7 +1145,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DB22C92228E700A10082A9E9 /* MastodonSDK in Frameworks */,
357FEEB229523D510021C9DC /* MastodonSDKDynamic in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1635,14 +1651,6 @@
path = View;
sourceTree = "<group>";
};
DB0C947826A7FE950088FB11 /* Button */ = {
isa = PBXGroup;
children = (
DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */,
);
path = Button;
sourceTree = "<group>";
};
DB0EF72C26FDB1D600347686 /* View */ = {
isa = PBXGroup;
children = (
@ -1975,6 +1983,7 @@
DB6180F026391CAB0018D199 /* Image */,
DB6180E1263919780018D199 /* Paging */,
DB6180DC263918E30018D199 /* MediaPreviewViewController.swift */,
85BC11B22932414900E191CD /* AltViewController.swift */,
DB6180F926391F2E0018D199 /* MediaPreviewViewModel.swift */,
);
path = MediaPreview;
@ -2282,9 +2291,8 @@
DB9E0D6E25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift */,
2AE244472927831100BDBF7C /* UIImage+SFSymbols.swift */,
DBCC3B2F261440A50045B23D /* UITabBarController.swift */,
DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */,
DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */,
2A1FE47D2938C11200784BF1 /* Collection+IsNotEmpty.swift */,
855149C7295F1C5F00943D96 /* UIInterfaceOrientationMask.swift */,
);
path = Extension;
sourceTree = "<group>";
@ -2393,7 +2401,6 @@
isa = PBXGroup;
children = (
DB63F765279A5E5600455B82 /* NotificationTimeline */,
DB0C947826A7FE950088FB11 /* Button */,
2D35237F26256F470031AF25 /* Cell */,
DB9D6BF725E4F5690051B173 /* NotificationViewController.swift */,
2D607AD726242FC500B70763 /* NotificationViewModel.swift */,
@ -2555,6 +2562,7 @@
DBF3B7402733EB9400E21627 /* MastodonLocalCode.swift */,
85904C01293BC0EB0011C817 /* ImageProvider.swift */,
85904C03293BC1940011C817 /* URLActivityItemWithMetadata.swift */,
855149C929606D6400943D96 /* PortraitAlertController.swift */,
);
path = Helper;
sourceTree = "<group>";
@ -2755,7 +2763,7 @@
);
name = Mastodon;
packageProductDependencies = (
DB22C92328E700A80082A9E9 /* MastodonSDK */,
357FEEAE29523D470021C9DC /* MastodonSDKDynamic */,
);
productName = Mastodon;
productReference = DB427DD225BAA00100D1B89D /* Mastodon.app */;
@ -2769,6 +2777,7 @@
DB427DE425BAA00100D1B89D /* Sources */,
DB427DE525BAA00100D1B89D /* Frameworks */,
DB427DE625BAA00100D1B89D /* Resources */,
9E44C7212967AD17004B2A72 /* Embed Frameworks */,
);
buildRules = (
);
@ -2776,6 +2785,9 @@
DB427DEA25BAA00100D1B89D /* PBXTargetDependency */,
);
name = MastodonTests;
packageProductDependencies = (
9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */,
);
productName = MastodonTests;
productReference = DB427DE825BAA00100D1B89D /* MastodonTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
@ -2814,7 +2826,7 @@
);
name = MastodonIntent;
packageProductDependencies = (
DB22C92728E700B70082A9E9 /* MastodonSDK */,
357FEEB929523D660021C9DC /* MastodonSDKDynamic */,
);
productName = MastodonIntent;
productReference = DB8FABC626AEC7B2008E5AF4 /* MastodonIntent.appex */;
@ -2834,7 +2846,7 @@
);
name = ShareActionExtension;
packageProductDependencies = (
DB22C92528E700AF0082A9E9 /* MastodonSDK */,
357FEEB529523D5C0021C9DC /* MastodonSDKDynamic */,
);
productName = ShareActionExtension;
productReference = DBC6461226A170AB00B0E31B /* ShareActionExtension.appex */;
@ -2854,7 +2866,7 @@
);
name = NotificationService;
packageProductDependencies = (
DB22C92128E700A10082A9E9 /* MastodonSDK */,
357FEEB129523D510021C9DC /* MastodonSDKDynamic */,
);
productName = NotificationService;
productReference = DBF8AE13263293E400C9C23C /* NotificationService.appex */;
@ -3197,6 +3209,7 @@
DB1E347825F519300079D7DF /* PickServerItem.swift in Sources */,
DB336F3F278E668C0031E64B /* StatusTableViewCell+ViewModel.swift in Sources */,
DB63F764279A5E3C00455B82 /* NotificationTimelineViewController.swift in Sources */,
855149C8295F1C5F00943D96 /* UIInterfaceOrientationMask.swift in Sources */,
DBA5A53126F08EF000CACBAA /* DragIndicatorView.swift in Sources */,
DB1FD45A25F27898004CFCFC /* CategoryPickerItem.swift in Sources */,
DB6180F626391D580018D199 /* MediaPreviewableViewController.swift in Sources */,
@ -3274,7 +3287,6 @@
DB603113279EBEBA00A935FE /* DataSourceFacade+Block.swift in Sources */,
DB63F777279A9A2A00455B82 /* NotificationView+Configuration.swift in Sources */,
DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */,
DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */,
5B90C461262599800002E742 /* SettingsLinkTableViewCell.swift in Sources */,
DB6180DD263918E30018D199 /* MediaPreviewViewController.swift in Sources */,
DBE3CDEC261C6B2900430CC6 /* FavoriteViewController.swift in Sources */,
@ -3316,7 +3328,6 @@
DB5B729E273113F300081888 /* FollowingListViewModel+State.swift in Sources */,
DBF9814C265E339500E4BA07 /* ProfileFieldAddEntryCollectionViewCell.swift in Sources */,
DB63F76227996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift in Sources */,
DB73BF4927140BA300781945 /* UICollectionViewDiffableDataSource.swift in Sources */,
DBA5E7AB263BD3F5004598BB /* TimelineTableViewCellContextMenuConfiguration.swift in Sources */,
DB73B490261F030A002E9E9F /* SafariActivity.swift in Sources */,
2AE244482927831100BDBF7C /* UIImage+SFSymbols.swift in Sources */,
@ -3406,7 +3417,6 @@
DB1E346825F518E20079D7DF /* CategoryPickerSection.swift in Sources */,
DB7274F4273BB9B200577D95 /* ListBatchFetchViewModel.swift in Sources */,
DB0618052785A73D0030EE79 /* RegisterItem.swift in Sources */,
DB73BF4B27140C0800781945 /* UITableViewDiffableDataSource.swift in Sources */,
DBB525642612C988002F1F29 /* MeProfileViewModel.swift in Sources */,
DB3EA8EF281B837000598866 /* DiscoveryCommunityViewController+DataSourceProvider.swift in Sources */,
DB6B74EF272FB55000C70B6E /* FollowerListViewController.swift in Sources */,
@ -3535,6 +3545,7 @@
DB9D6BFF25E4F5940051B173 /* ProfileViewController.swift in Sources */,
2D4AD8A226316CD200613EFC /* SelectedAccountSection.swift in Sources */,
DB3EA8F1281B9EF600598866 /* DiscoveryCommunityViewModel+Diffable.swift in Sources */,
85BC11B32932414900E191CD /* AltViewController.swift in Sources */,
DB63F775279A997D00455B82 /* NotificationTableViewCell+ViewModel.swift in Sources */,
DB98EB5927B109890082E365 /* ReportSupplementaryViewController.swift in Sources */,
DB0617EB277EF3820030EE79 /* GradientBorderView.swift in Sources */,
@ -3543,6 +3554,7 @@
DBEFCD7D282A2A3B00C0ABEA /* ReportServerRulesViewController.swift in Sources */,
DBB525362611ECEB002F1F29 /* UserTimelineViewController.swift in Sources */,
DB98EB4927B0F0CD0082E365 /* ReportStatusTableViewCell.swift in Sources */,
855149CA29606D6400943D96 /* PortraitAlertController.swift in Sources */,
DBF3B7412733EB9400E21627 /* MastodonLocalCode.swift in Sources */,
DB98EB6527B216500082E365 /* ReportResultViewModel.swift in Sources */,
DB4F096A269EDAD200D62E92 /* SearchResultViewModel+State.swift in Sources */,
@ -3827,7 +3839,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INTENTS_CODEGEN_LANGUAGE = Swift;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@ -3885,7 +3897,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INTENTS_CODEGEN_LANGUAGE = Swift;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
@ -3908,6 +3920,7 @@
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -3936,7 +3949,9 @@
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
EXCLUDED_SOURCE_FILE_NAMES = "Mastodon/Resources/Preview\\ Assets.xcassets";
INFOPLIST_FILE = Mastodon/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -3967,6 +3982,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mastodon.app/Mastodon";
@ -3988,6 +4006,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mastodon.app/Mastodon";
@ -4008,6 +4029,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = Mastodon;
@ -4028,6 +4052,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = Mastodon;
@ -4087,7 +4114,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INTENTS_CODEGEN_LANGUAGE = Swift;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@ -4110,6 +4137,7 @@
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -4141,6 +4169,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mastodon.app/Mastodon";
@ -4161,6 +4192,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = Mastodon;
@ -4369,7 +4403,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INTENTS_CODEGEN_LANGUAGE = Swift;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
@ -4393,6 +4427,7 @@
DEVELOPMENT_ASSET_PATHS = "Mastodon/Resources/Preview\\ Assets.xcassets";
DEVELOPMENT_TEAM = 5Z4GVSS33P;
INFOPLIST_FILE = Mastodon/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -4423,6 +4458,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Mastodon.app/Mastodon";
@ -4443,6 +4481,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.MastodonUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = Mastodon;
@ -4642,21 +4683,25 @@
/* End XCConfigurationList section */
/* Begin XCSwiftPackageProductDependency section */
DB22C92128E700A10082A9E9 /* MastodonSDK */ = {
357FEEAE29523D470021C9DC /* MastodonSDKDynamic */ = {
isa = XCSwiftPackageProductDependency;
productName = MastodonSDK;
productName = MastodonSDKDynamic;
};
DB22C92328E700A80082A9E9 /* MastodonSDK */ = {
357FEEB129523D510021C9DC /* MastodonSDKDynamic */ = {
isa = XCSwiftPackageProductDependency;
productName = MastodonSDK;
productName = MastodonSDKDynamic;
};
DB22C92528E700AF0082A9E9 /* MastodonSDK */ = {
357FEEB529523D5C0021C9DC /* MastodonSDKDynamic */ = {
isa = XCSwiftPackageProductDependency;
productName = MastodonSDK;
productName = MastodonSDKDynamic;
};
DB22C92728E700B70082A9E9 /* MastodonSDK */ = {
357FEEB929523D660021C9DC /* MastodonSDKDynamic */ = {
isa = XCSwiftPackageProductDependency;
productName = MastodonSDK;
productName = MastodonSDKDynamic;
};
9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */ = {
isa = XCSwiftPackageProductDependency;
productName = MastodonSDKDynamic;
};
/* End XCSwiftPackageProductDependency section */
};

View File

@ -5,8 +5,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/Alamofire/Alamofire.git",
"state" : {
"revision" : "354dda32d89fc8cd4f5c46487f64957d355f53d8",
"version" : "5.6.1"
"revision" : "8dd85aee02e39dd280c75eef88ffdb86eed4b07b",
"version" : "5.6.2"
}
},
{
@ -41,8 +41,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/Flipboard/FLAnimatedImage.git",
"state" : {
"revision" : "e7f9fd4681ae41bf6f3056db08af4f401d61da52",
"version" : "1.0.16"
"revision" : "d4f07b6f164d53c1212c3e54d6460738b1981e9f",
"version" : "1.0.17"
}
},
{
@ -104,8 +104,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/kean/Nuke.git",
"state" : {
"revision" : "0ea7545b5c918285aacc044dc75048625c8257cc",
"version" : "10.8.0"
"revision" : "a002b7fd786f2df2ed4333fe73a9727499fd9d97",
"version" : "10.11.2"
}
},
{
@ -122,8 +122,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/uias/Pageboy",
"state" : {
"revision" : "34ecb6e7c4e0e07494960ab2f7cc9a02293915a6",
"version" : "3.6.2"
"revision" : "af8fa81788b893205e1ff42ddd88c5b0b315d7c5",
"version" : "3.7.0"
}
},
{
@ -140,8 +140,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImage.git",
"state" : {
"revision" : "2e63d0061da449ad0ed130768d05dceb1496de44",
"version" : "5.12.5"
"revision" : "3312bf5e67b52fbce7c3caf431b0cda721a9f7bb",
"version" : "5.14.2"
}
},
{
@ -185,8 +185,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/scinfu/SwiftSoup.git",
"state" : {
"revision" : "41e7c263fb8c277e980ebcb9b0b5f6031d3d4886",
"version" : "2.4.2"
"revision" : "6778575285177365cbad3e5b8a72f2a20583cfec",
"version" : "2.4.3"
}
},
{

View File

@ -77,7 +77,7 @@ extension PickServerSection {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.12
let valueAttributedString = NSAttributedString(
string: parseUsersCount(server.totalUsers),
string: server.totalUsers.asAbbreviatedCountString(),
attributes: [
.paragraphStyle: paragraphStyle
]
@ -125,17 +125,6 @@ extension PickServerSection {
}
.store(in: &cell.disposeBag)
}
private static func parseUsersCount(_ usersCount: Int) -> String {
switch usersCount {
case 0..<1000:
return "\(usersCount)"
default:
let usersCountInThousand = Float(usersCount) / 1000.0
return String(format: "%.1fK", usersCountInThousand)
}
}
}
extension PickServerSection {

View File

@ -228,11 +228,7 @@ extension StatusSection {
}
var _snapshot = NSDiffableDataSourceSnapshot<PollSection, PollItem>()
_snapshot.appendSections([.main])
if #available(iOS 15.0, *) {
statusView.pollTableViewDiffableDataSource?.applySnapshotUsingReloadData(_snapshot)
} else {
statusView.pollTableViewDiffableDataSource?.apply(_snapshot, animatingDifferences: false)
}
statusView.pollTableViewDiffableDataSource?.applySnapshotUsingReloadData(_snapshot)
}
}

View File

@ -1,40 +0,0 @@
//
// UICollectionViewDiffableDataSource.swift
// Mastodon
//
// Created by Cirno MainasuK on 2021-10-11.
//
import UIKit
// ref: https://www.jessesquires.com/blog/2021/07/08/diffable-data-source-behavior-changes-and-reconfiguring-cells-in-ios-15/
extension UICollectionViewDiffableDataSource {
func reloadData(
snapshot: NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType>,
completion: (() -> Void)? = nil
) {
if #available(iOS 15.0, *) {
self.applySnapshotUsingReloadData(snapshot, completion: completion)
} else {
self.apply(snapshot, animatingDifferences: false, completion: completion)
}
}
func applySnapshot(
_ snapshot: NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType>,
animated: Bool,
completion: (() -> Void)? = nil) {
if #available(iOS 15.0, *) {
self.apply(snapshot, animatingDifferences: animated, completion: completion)
} else {
if animated {
self.apply(snapshot, animatingDifferences: true, completion: completion)
} else {
UIView.performWithoutAnimation {
self.apply(snapshot, animatingDifferences: true, completion: completion)
}
}
}
}
}

View File

@ -0,0 +1,14 @@
//
// UIInterfaceOrientationMask.swift
// Mastodon
//
// Created by Jed Fox on 2022-12-30.
//
import UIKit
extension UIInterfaceOrientationMask {
public static var portraitOnPhone: Self {
return UIDevice.current.userInterfaceIdiom == .phone ? .portrait : .all
}
}

View File

@ -1,40 +0,0 @@
//
// UITableViewDiffableDataSource.swift
// Mastodon
//
// Created by Cirno MainasuK on 2021-10-11.
//
import UIKit
// ref: https://www.jessesquires.com/blog/2021/07/08/diffable-data-source-behavior-changes-and-reconfiguring-cells-in-ios-15/
extension UITableViewDiffableDataSource {
func reloadData(
snapshot: NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType>,
completion: (() -> Void)? = nil
) {
if #available(iOS 15.0, *) {
self.applySnapshotUsingReloadData(snapshot, completion: completion)
} else {
self.apply(snapshot, animatingDifferences: false, completion: completion)
}
}
func applySnapshot(
_ snapshot: NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType>,
animated: Bool,
completion: (() -> Void)? = nil) {
if #available(iOS 15.0, *) {
self.apply(snapshot, animatingDifferences: animated, completion: completion)
} else {
if animated {
self.apply(snapshot, animatingDifferences: true, completion: completion)
} else {
UIView.performWithoutAnimation {
self.apply(snapshot, animatingDifferences: true, completion: completion)
}
}
}
}
}

View File

@ -1,4 +1,4 @@
// Generated using Sourcery 1.6.1 https://github.com/krzysztofzablocki/Sourcery
// Generated using Sourcery 1.9.0 https://github.com/krzysztofzablocki/Sourcery
// DO NOT EDIT
// sourcery:inline:DiscoveryCommunityViewController.AutoGenerateTableViewDelegate

View File

@ -0,0 +1,14 @@
//
// PortraitAlertController.swift
// Mastodon
//
// Created by Jed Fox on 2022-12-31.
//
import UIKit
class PortraitAlertController: UIAlertController {
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.portraitOnPhone
}
}

View File

@ -49,6 +49,9 @@ final class AccountListViewController: UIViewController, NeedsDependency {
return tableView
}()
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.portraitOnPhone
}
}
// MARK: - PanModalPresentable

View File

@ -129,7 +129,7 @@ extension ComposeViewController {
extension ComposeViewController {
private func showDismissConfirmAlertController() {
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
let alertController = PortraitAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
let discardAction = UIAlertAction(title: L10n.Common.Controls.Actions.discard, style: .destructive) { [weak self] _ in
guard let self = self else { return }
self.dismiss(animated: true, completion: nil)

View File

@ -59,7 +59,7 @@ extension DiscoveryCommunityViewModel {
}
}
diffableDataSource.applySnapshot(snapshot, animated: false)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}

View File

@ -41,7 +41,7 @@ extension DiscoveryForYouViewModel {
let items = records.map { DiscoveryItem.user($0) }
snapshot.appendItems(items, toSection: .forYou)
diffableDataSource.applySnapshot(snapshot, animated: false)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}

View File

@ -52,7 +52,7 @@ extension DiscoveryNewsViewModel {
}
}
diffableDataSource.applySnapshot(snapshot, animated: false)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}

View File

@ -59,7 +59,7 @@ extension DiscoveryPostsViewModel {
}
}
diffableDataSource.applySnapshot(snapshot, animated: false)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}

View File

@ -131,17 +131,13 @@ extension HomeTimelineViewModel {
snapshot: NSDiffableDataSourceSnapshot<StatusSection, StatusItem>,
animatingDifferences: Bool
) async {
diffableDataSource?.apply(snapshot, animatingDifferences: animatingDifferences)
await diffableDataSource?.apply(snapshot, animatingDifferences: animatingDifferences)
}
@MainActor func updateSnapshotUsingReloadData(
snapshot: NSDiffableDataSourceSnapshot<StatusSection, StatusItem>
) {
if #available(iOS 15.0, *) {
self.diffableDataSource?.applySnapshotUsingReloadData(snapshot)
} else {
diffableDataSource?.applySnapshot(snapshot, animated: false, completion: nil)
}
self.diffableDataSource?.applySnapshotUsingReloadData(snapshot)
}
struct Difference<T> {

View File

@ -14,7 +14,6 @@ import CoreData
import CoreDataStack
import GameplayKit
import AlamofireImage
import DateToolsSwift
import MastodonCore
import MastodonUI
@ -149,12 +148,7 @@ extension HomeTimelineViewModel {
}
// reconfigure item
if #available(iOS 15.0, *) {
snapshot.reconfigureItems([item])
} else {
// Fallback on earlier versions
snapshot.reloadItems([item])
}
snapshot.reconfigureItems([item])
await updateSnapshotUsingReloadData(snapshot: snapshot)
// fetch data
@ -177,15 +171,10 @@ extension HomeTimelineViewModel {
}
// reconfigure item again
if #available(iOS 15.0, *) {
snapshot.reconfigureItems([item])
} else {
// Fallback on earlier versions
snapshot.reloadItems([item])
}
snapshot.reconfigureItems([item])
await updateSnapshotUsingReloadData(snapshot: snapshot)
}
}
// MARK: - SuggestionAccountViewModelDelegate

View File

@ -103,8 +103,8 @@ extension HomeTimelineNavigationBarTitleView {
logoButton.setImage(Asset.Asset.mastodonTextLogo.image.withRenderingMode(.alwaysTemplate), for: .normal)
logoButton.contentMode = .center
logoButton.isHidden = false
logoButton.accessibilityLabel = "Logo Button" // TODO :i18n
logoButton.accessibilityHint = "Tap to scroll to top and tap again to previous location"
logoButton.accessibilityLabel = L10n.Scene.HomeTimeline.NavigationBarState.Accessibility.logoLabel // TODO :i18n
logoButton.accessibilityHint = L10n.Scene.HomeTimeline.NavigationBarState.Accessibility.logoHint
case .newPostButton:
configureButton(
title: L10n.Scene.HomeTimeline.NavigationBarState.newPosts,

View File

@ -0,0 +1,92 @@
//
// AltViewController.swift
// Mastodon
//
// Created by Jed Fox on 2022-11-26.
//
import SwiftUI
class AltViewController: UIViewController {
let textView = {
let textView: UITextView
if #available(iOS 16, *) {
// TODO: update code below to use TextKit 2 when dropping iOS 15 support
textView = UITextView(usingTextLayoutManager: false)
} else {
textView = UITextView()
}
textView.textContainer.maximumNumberOfLines = 0
textView.textContainer.lineBreakMode = .byWordWrapping
textView.font = .preferredFont(forTextStyle: .callout)
textView.isScrollEnabled = true
textView.backgroundColor = .clear
textView.isOpaque = false
textView.isEditable = false
textView.tintColor = .white
textView.textContainerInset = UIEdgeInsets(top: 12, left: 8, bottom: 8, right: 8)
textView.contentInsetAdjustmentBehavior = .always
textView.verticalScrollIndicatorInsets.bottom = 4
return textView
}()
init(alt: String, sourceView: UIView?) {
textView.text = alt
super.init(nibName: nil, bundle: nil)
self.modalPresentationStyle = .popover
self.popoverPresentationController?.delegate = self
self.popoverPresentationController?.permittedArrowDirections = .up
self.popoverPresentationController?.sourceView = sourceView
self.overrideUserInterfaceStyle = .dark
}
@MainActor required dynamic init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
super.loadView()
view.translatesAutoresizingMaskIntoConstraints = false
}
override func viewDidLoad() {
super.viewDidLoad()
textView.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .systemBackground
view.addSubview(textView)
textView.pinToParent()
NSLayoutConstraint.activate([
textView.widthAnchor.constraint(lessThanOrEqualToConstant: 400),
])
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
UIView.performWithoutAnimation {
let size = textView.layoutManager.boundingRect(forGlyphRange: NSMakeRange(0, (textView.textStorage.string as NSString).length), in: textView.textContainer).size
preferredContentSize = CGSize(
width: size.width + (8 + textView.textContainer.lineFragmentPadding) * 2,
height: size.height + 12 + (textView.textContainer.lineFragmentPadding) * 2
)
}
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
textView.font = .preferredFont(forTextStyle: .callout)
}
}
// MARK: UIPopoverPresentationControllerDelegate
extension AltViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
.none
}
}

View File

@ -68,30 +68,21 @@ extension MediaPreviewImageViewController {
let previewImageViewContextMenuInteraction = UIContextMenuInteraction(delegate: self)
previewImageView.addInteraction(previewImageViewContextMenuInteraction)
switch viewModel.item {
case .remote(let imageContext):
previewImageView.imageView.accessibilityLabel = imageContext.altText
if let thumbnail = imageContext.thumbnail {
previewImageView.imageView.image = thumbnail
previewImageView.setup(image: thumbnail, container: self.previewImageView, forceUpdate: true)
}
previewImageView.imageView.setImage(
url: imageContext.assetURL,
placeholder: imageContext.thumbnail,
scaleToSize: nil
) { [weak self] image in
guard let self = self else { return }
guard let image = image else { return }
self.previewImageView.setup(image: image, container: self.previewImageView, forceUpdate: true)
}
case .local(let imageContext):
let image = imageContext.image
previewImageView.imageView.image = image
previewImageView.setup(image: image, container: previewImageView, forceUpdate: true)
previewImageView.imageView.accessibilityLabel = viewModel.item.altText
if let thumbnail = viewModel.item.thumbnail {
previewImageView.imageView.image = thumbnail
previewImageView.setup(image: thumbnail, container: self.previewImageView, forceUpdate: true)
}
previewImageView.imageView.setImage(
url: viewModel.item.assetURL,
placeholder: viewModel.item.thumbnail,
scaleToSize: nil
) { [weak self] image in
guard let self = self else { return }
guard let image = image else { return }
self.previewImageView.setup(image: image, container: self.previewImageView, forceUpdate: true)
}
}

View File

@ -30,19 +30,10 @@ class MediaPreviewImageViewModel {
extension MediaPreviewImageViewModel {
public enum ImagePreviewItem {
case remote(RemoteImageContext)
case local(LocalImageContext)
}
public struct RemoteImageContext {
public struct ImagePreviewItem {
let assetURL: URL?
let thumbnail: UIImage?
let altText: String?
}
public struct LocalImageContext {
let image: UIImage
}
}

View File

@ -16,8 +16,6 @@ import MastodonLocalization
final class MediaPreviewViewController: UIViewController, NeedsDependency {
static let closeButtonSize = CGSize(width: 30, height: 30)
weak var context: AppContext! { willSet { precondition(!isViewLoaded) } }
weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } }
@ -26,24 +24,23 @@ final class MediaPreviewViewController: UIViewController, NeedsDependency {
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .systemMaterial))
let pagingViewController = MediaPreviewPagingViewController()
let closeButtonBackground: UIVisualEffectView = {
let backgroundView = UIVisualEffectView(effect: UIBlurEffect(style: .systemUltraThinMaterial))
backgroundView.alpha = 0.9
backgroundView.layer.masksToBounds = true
backgroundView.layer.cornerRadius = MediaPreviewViewController.closeButtonSize.width * 0.5
return backgroundView
let topToolbar: UIStackView = {
let stackView = TouchTransparentStackView()
stackView.axis = .horizontal
stackView.distribution = .equalSpacing
stackView.alignment = .fill
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
let closeButtonBackgroundVisualEffectView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: UIBlurEffect(style: .systemUltraThinMaterial)))
let closeButton: UIButton = {
let button = HighlightDimmableButton()
button.expandEdgeInsets = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10)
button.imageView?.tintColor = .label
let closeButton = HUDButton { button in
button.setImage(UIImage(systemName: "xmark", withConfiguration: UIImage.SymbolConfiguration(pointSize: 16, weight: .bold))!, for: .normal)
return button
}()
}
let altButton = HUDButton { button in
button.setTitle("ALT", for: .normal)
}
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
@ -67,35 +64,30 @@ extension MediaPreviewViewController {
visualEffectView.contentView.addSubview(pagingViewController.view)
visualEffectView.pinTo(to: pagingViewController.view)
pagingViewController.didMove(toParent: self)
closeButtonBackground.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(closeButtonBackground)
NSLayoutConstraint.activate([
closeButtonBackground.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor, constant: 12),
closeButtonBackground.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor)
])
closeButtonBackgroundVisualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
closeButtonBackground.contentView.addSubview(closeButtonBackgroundVisualEffectView)
closeButton.translatesAutoresizingMaskIntoConstraints = false
closeButtonBackgroundVisualEffectView.contentView.addSubview(closeButton)
view.addSubview(topToolbar)
NSLayoutConstraint.activate([
closeButton.topAnchor.constraint(equalTo: closeButtonBackgroundVisualEffectView.topAnchor),
closeButton.leadingAnchor.constraint(equalTo: closeButtonBackgroundVisualEffectView.leadingAnchor),
closeButtonBackgroundVisualEffectView.trailingAnchor.constraint(equalTo: closeButton.trailingAnchor),
closeButtonBackgroundVisualEffectView.bottomAnchor.constraint(equalTo: closeButton.bottomAnchor),
closeButton.heightAnchor.constraint(equalToConstant: MediaPreviewViewController.closeButtonSize.height).priority(.defaultHigh),
closeButton.widthAnchor.constraint(equalToConstant: MediaPreviewViewController.closeButtonSize.width).priority(.defaultHigh),
topToolbar.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor, constant: 12),
topToolbar.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor),
topToolbar.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor),
])
topToolbar.addArrangedSubview(closeButton)
NSLayoutConstraint.activate([
closeButton.widthAnchor.constraint(equalToConstant: HUDButton.height).priority(.defaultHigh),
])
topToolbar.addArrangedSubview(altButton)
viewModel.mediaPreviewImageViewControllerDelegate = self
pagingViewController.interPageSpacing = 10
pagingViewController.delegate = self
pagingViewController.dataSource = viewModel
closeButton.addTarget(self, action: #selector(MediaPreviewViewController.closeButtonPressed(_:)), for: .touchUpInside)
closeButton.button.addTarget(self, action: #selector(MediaPreviewViewController.closeButtonPressed(_:)), for: .touchUpInside)
altButton.button.addTarget(self, action: #selector(MediaPreviewViewController.altButtonPressed(_:)), for: .touchUpInside)
// bind view model
viewModel.$currentPage
.receive(on: DispatchQueue.main)
@ -126,20 +118,34 @@ extension MediaPreviewViewController {
let attachment = previewContext.attachments[index]
return attachment.kind == .video // not hide buttno for audio
}()
self.closeButtonBackground.isHidden = needsHideCloseButton
self.closeButton.isHidden = needsHideCloseButton
default:
break
}
}
.store(in: &disposeBag)
viewModel.$altText
.receive(on: DispatchQueue.main)
.sink { [weak self] altText in
guard let self else { return }
UIView.animate(withDuration: 0.3) {
if altText == nil {
self.altButton.alpha = 0
} else {
self.altButton.alpha = 1
}
}
}
.store(in: &disposeBag)
viewModel.$showingChrome
.receive(on: DispatchQueue.main)
.removeDuplicates()
.sink { [weak self] showingChrome in
UIView.animate(withDuration: 0.3) {
self?.setNeedsStatusBarAppearanceUpdate()
self?.closeButtonBackground.alpha = showingChrome ? 1 : 0
self?.topToolbar.alpha = showingChrome ? 1 : 0
}
}
.store(in: &disposeBag)
@ -165,15 +171,23 @@ extension MediaPreviewViewController {
!viewModel.showingChrome
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.all
}
}
extension MediaPreviewViewController {
@objc private func closeButtonPressed(_ sender: UIButton) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
dismiss(animated: true, completion: nil)
}
@objc private func altButtonPressed(_ sender: UIButton) {
guard let alt = viewModel.altText else { return }
present(AltViewController(alt: alt, sourceView: sender), animated: true)
}
}
// MARK: - MediaPreviewingViewController
@ -270,19 +284,8 @@ extension MediaPreviewViewController: MediaPreviewImageViewControllerDelegate {
) {
switch action {
case .savePhoto:
let _savePublisher: AnyPublisher<Void, Error>? = {
switch viewController.viewModel.item {
case .remote(let previewContext):
guard let assetURL = previewContext.assetURL else { return nil }
return context.photoLibraryService.save(imageSource: .url(assetURL))
case .local(let previewContext):
return context.photoLibraryService.save(imageSource: .image(previewContext.image))
}
}()
guard let savePublisher = _savePublisher else {
return
}
savePublisher
guard let assetURL = viewController.viewModel.item.assetURL else { return }
context.photoLibraryService.save(imageSource: .url(assetURL))
.sink { [weak self] completion in
guard let self = self else { return }
switch completion {
@ -306,20 +309,9 @@ extension MediaPreviewViewController: MediaPreviewImageViewControllerDelegate {
}
.store(in: &context.disposeBag)
case .copyPhoto:
let _copyPublisher: AnyPublisher<Void, Error>? = {
switch viewController.viewModel.item {
case .remote(let previewContext):
guard let assetURL = previewContext.assetURL else { return nil }
return context.photoLibraryService.copy(imageSource: .url(assetURL))
case .local(let previewContext):
return context.photoLibraryService.copy(imageSource: .image(previewContext.image))
}
}()
guard let copyPublisher = _copyPublisher else {
return
}
guard let assetURL = viewController.viewModel.item.assetURL else { return }
copyPublisher
context.photoLibraryService.copy(imageSource: .url(assetURL))
.sink { completion in
switch completion {
case .failure(let error):
@ -338,13 +330,8 @@ extension MediaPreviewViewController: MediaPreviewImageViewControllerDelegate {
let activityViewController = UIActivityViewController(
activityItems: {
var activityItems: [Any] = []
switch viewController.viewModel.item {
case .remote(let previewContext):
if let assetURL = previewContext.assetURL {
activityItems.append(assetURL)
}
case .local(let previewContext):
activityItems.append(previewContext.image)
if let assetURL = viewController.viewModel.item.assetURL {
activityItems.append(assetURL)
}
return activityItems
}(),
@ -359,12 +346,12 @@ extension MediaPreviewViewController: MediaPreviewImageViewControllerDelegate {
extension MediaPreviewViewController {
var closeKeyCommand: UIKeyCommand {
func closeKeyCommand(input: String) -> UIKeyCommand {
UIKeyCommand(
title: L10n.Scene.Preview.Keyboard.closePreview,
image: nil,
action: #selector(MediaPreviewViewController.closePreviewKeyCommandHandler(_:)),
input: "i",
input: input,
modifierFlags: [],
propertyList: nil,
alternates: [],
@ -408,7 +395,8 @@ extension MediaPreviewViewController {
override var keyCommands: [UIKeyCommand] {
return [
closeKeyCommand,
closeKeyCommand(input: UIKeyCommand.inputEscape),
closeKeyCommand(input: "i"),
showNextKeyCommand,
showPreviousKeyCommand,
]

View File

@ -27,9 +27,10 @@ final class MediaPreviewViewModel: NSObject {
@Published var currentPage: Int
@Published var showingChrome = true
@Published var altText: String?
// output
let viewControllers: [UIViewController]
let viewControllers: [MediaPreviewPage]
private var disposeBag: Set<AnyCancellable> = []
@ -42,8 +43,11 @@ final class MediaPreviewViewModel: NSObject {
self.item = item
var currentPage = 0
var viewControllers: [MediaPreviewPage] = []
var getAltText = { (page: Int) -> String? in nil }
switch item {
case .attachment(let previewContext):
getAltText = { previewContext.attachments[$0].altDescription }
currentPage = previewContext.initialIndex
for (i, attachment) in previewContext.attachments.enumerated() {
switch attachment.kind {
@ -51,11 +55,11 @@ final class MediaPreviewViewModel: NSObject {
let viewController = MediaPreviewImageViewController()
let viewModel = MediaPreviewImageViewModel(
context: context,
item: .remote(.init(
item: .init(
assetURL: attachment.assetURL.flatMap { URL(string: $0) },
thumbnail: previewContext.thumbnail(at: i),
altText: attachment.altDescription
))
)
)
viewController.viewModel = viewModel
viewControllers.append(viewController)
@ -65,7 +69,8 @@ final class MediaPreviewViewModel: NSObject {
context: context,
item: .gif(.init(
assetURL: attachment.assetURL.flatMap { URL(string: $0) },
previewURL: attachment.previewURL.flatMap { URL(string: $0) }
previewURL: attachment.previewURL.flatMap { URL(string: $0) },
altText: attachment.altDescription
))
)
viewController.viewModel = viewModel
@ -76,7 +81,8 @@ final class MediaPreviewViewModel: NSObject {
context: context,
item: .video(.init(
assetURL: attachment.assetURL.flatMap { URL(string: $0) },
previewURL: attachment.previewURL.flatMap { URL(string: $0) }
previewURL: attachment.previewURL.flatMap { URL(string: $0) },
altText: attachment.altDescription
))
)
viewController.viewModel = viewModel
@ -87,11 +93,11 @@ final class MediaPreviewViewModel: NSObject {
let viewController = MediaPreviewImageViewController()
let viewModel = MediaPreviewImageViewModel(
context: context,
item: .remote(.init(
item: .init(
assetURL: previewContext.assetURL.flatMap { URL(string: $0) },
thumbnail: previewContext.thumbnail,
altText: nil
))
)
)
viewController.viewModel = viewModel
viewControllers.append(viewController)
@ -99,11 +105,11 @@ final class MediaPreviewViewModel: NSObject {
let viewController = MediaPreviewImageViewController()
let viewModel = MediaPreviewImageViewModel(
context: context,
item: .remote(.init(
item: .init(
assetURL: previewContext.assetURL.flatMap { URL(string: $0) },
thumbnail: previewContext.thumbnail,
altText: nil
))
)
)
viewController.viewModel = viewModel
viewControllers.append(viewController)
@ -114,6 +120,10 @@ final class MediaPreviewViewModel: NSObject {
self.transitionItem = transitionItem
super.init()
self.$currentPage
.map(getAltText)
.assign(to: &$altText)
for viewController in viewControllers {
self.$showingChrome
.sink { [weak viewController] showingChrome in

View File

@ -130,12 +130,14 @@ extension MediaPreviewVideoViewModel {
struct RemoteVideoContext {
let assetURL: URL?
let previewURL: URL?
let altText: String?
// let thumbnail: UIImage?
}
struct RemoteGIFContext {
let assetURL: URL?
let previewURL: URL?
let altText: String?
}
}

View File

@ -1,86 +0,0 @@
//
// NotificationAvatarButton.swift
// Mastodon
//
// Created by MainasuK Cirno on 2021-7-21.
//
import UIKit
import FLAnimatedImage
import MastodonUI
final class NotificationAvatarButton: AvatarButton {
// Size fixed
static let containerSize = CGSize(width: 35, height: 35)
static let badgeImageViewSize = CGSize(width: 24, height: 24)
static let badgeImageMaskSize = CGSize(width: badgeImageViewSize.width + 4, height: badgeImageViewSize.height + 4)
let badgeImageView: UIImageView = {
let imageView = RoundedImageView()
imageView.contentMode = .center
imageView.isOpaque = true
imageView.layer.shouldRasterize = true
imageView.layer.rasterizationScale = UIScreen.main.scale
return imageView
}()
override func _init() {
super._init()
size = CGSize(width: 35, height: 35)
let path: CGPath = {
let path = CGMutablePath()
path.addRect(CGRect(origin: .zero, size: NotificationAvatarButton.containerSize))
let x: CGFloat = {
if UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft {
return -0.5 * NotificationAvatarButton.badgeImageMaskSize.width
} else {
return NotificationAvatarButton.containerSize.width - 0.5 * NotificationAvatarButton.badgeImageMaskSize.width
}
}()
path.addPath(UIBezierPath(
ovalIn: CGRect(
x: x,
y: NotificationAvatarButton.containerSize.height - 0.5 * NotificationAvatarButton.badgeImageMaskSize.width,
width: NotificationAvatarButton.badgeImageMaskSize.width,
height: NotificationAvatarButton.badgeImageMaskSize.height
)
).cgPath)
return path
}()
let maskShapeLayer = CAShapeLayer()
maskShapeLayer.backgroundColor = UIColor.black.cgColor
maskShapeLayer.fillRule = .evenOdd
maskShapeLayer.path = path
avatarImageView.layer.mask = maskShapeLayer
badgeImageView.translatesAutoresizingMaskIntoConstraints = false
addSubview(badgeImageView)
NSLayoutConstraint.activate([
badgeImageView.centerXAnchor.constraint(equalTo: trailingAnchor),
badgeImageView.centerYAnchor.constraint(equalTo: bottomAnchor),
badgeImageView.widthAnchor.constraint(equalToConstant: NotificationAvatarButton.badgeImageViewSize.width).priority(.required - 1),
badgeImageView.heightAnchor.constraint(equalToConstant: NotificationAvatarButton.badgeImageViewSize.height).priority(.required - 1),
])
}
override func updateAppearance() {
super.updateAppearance()
badgeImageView.alpha = primaryActionState.contains(.highlighted) ? 0.6 : 1.0
}
}
final class RoundedImageView: UIImageView {
override func layoutSubviews() {
super.layoutSubviews()
layer.masksToBounds = true
layer.cornerRadius = bounds.width / 2
layer.cornerCurve = .circular
}
}

View File

@ -111,17 +111,13 @@ extension NotificationTimelineViewModel {
snapshot: NSDiffableDataSourceSnapshot<NotificationSection, NotificationItem>,
animatingDifferences: Bool
) async {
diffableDataSource?.apply(snapshot, animatingDifferences: animatingDifferences)
await diffableDataSource?.apply(snapshot, animatingDifferences: animatingDifferences)
}
@MainActor func updateSnapshotUsingReloadData(
snapshot: NSDiffableDataSourceSnapshot<NotificationSection, NotificationItem>
) async {
if #available(iOS 15.0, *) {
await self.diffableDataSource?.applySnapshotUsingReloadData(snapshot)
} else {
diffableDataSource?.applySnapshot(snapshot, animated: false, completion: nil)
}
await self.diffableDataSource?.applySnapshotUsingReloadData(snapshot)
}
}

View File

@ -271,7 +271,7 @@ extension MastodonLoginViewController: MastodonLoginViewModelDelegate {
snapshot.appendSections([MastodonLoginViewSection.servers])
snapshot.appendItems(viewModel.filteredServers)
dataSource?.applySnapshot(snapshot, animated: false)
dataSource?.apply(snapshot, animatingDifferences: false)
OperationQueue.main.addOperation {
let numberOfResults = viewModel.filteredServers.count

View File

@ -43,11 +43,7 @@ final class MastodonPickServerViewController: UIViewController, NeedsDependency
tableView.separatorStyle = .none
tableView.backgroundColor = .clear
tableView.keyboardDismissMode = .onDrag
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = .leastNonzeroMagnitude
} else {
// Fallback on earlier versions
}
tableView.sectionHeaderTopPadding = .leastNonzeroMagnitude
return tableView
}()

View File

@ -24,7 +24,7 @@ extension MastodonPickServerViewModel {
sectionHeaderSnapshot.appendSections([.main])
sectionHeaderSnapshot.appendItems(categoryPickerItems, toSection: .main)
serverSectionHeaderView.delegate = pickServerServerSectionTableHeaderViewDelegate
serverSectionHeaderView.diffableDataSource?.applySnapshot(sectionHeaderSnapshot, animated: false) { [weak self] in
serverSectionHeaderView.diffableDataSource?.apply(sectionHeaderSnapshot, animatingDifferences: false) { [weak self] in
guard let self = self else { return }
guard let indexPath = self.serverSectionHeaderView.diffableDataSource?.indexPath(for: .all) else { return }
self.serverSectionHeaderView.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: .centeredHorizontally)

View File

@ -55,19 +55,10 @@ struct MastodonRegisterView: View {
// Delete
if viewModel.avatarImage != nil {
Divider()
if #available(iOS 15.0, *) {
Button(role: .destructive) {
viewModel.avatarMediaMenuActionPublisher.send(.delete)
} label: {
Label(L10n.Scene.Register.Input.Avatar.delete, systemImage: "delete.left")
}
} else {
// Fallback on earlier ve rsions
Button {
viewModel.avatarMediaMenuActionPublisher.send(.delete)
} label: {
Label(L10n.Scene.Register.Input.Avatar.delete, systemImage: "delete.left")
}
Button(role: .destructive) {
viewModel.avatarMediaMenuActionPublisher.send(.delete)
} label: {
Label(L10n.Scene.Register.Input.Avatar.delete, systemImage: "delete.left")
}
}
} label: {

View File

@ -37,11 +37,7 @@ final class MastodonServerRulesViewController: UIViewController, NeedsDependency
tableView.separatorStyle = .none
tableView.backgroundColor = .clear
tableView.keyboardDismissMode = .onDrag
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
} else {
// Fallback on earlier versions
}
tableView.sectionHeaderTopPadding = 0
return tableView
}()

View File

@ -21,6 +21,6 @@ extension MastodonServerRulesViewModel {
return ServerRuleItem.rule(ruleContext)
}
snapshot.appendItems(ruleItems, toSection: .rules)
diffableDataSource?.applySnapshot(snapshot, animated: false, completion: nil)
diffableDataSource?.apply(snapshot, animatingDifferences: false)
}
}

View File

@ -25,9 +25,8 @@ extension OnboardingNavigationController {
updateBorderViewDisplay()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.portraitOnPhone
}
}

View File

@ -66,11 +66,7 @@ extension OnboardingViewControllerAppearance {
navigationItem.standardAppearance = barAppearance
navigationItem.compactAppearance = barAppearance
navigationItem.scrollEdgeAppearance = barAppearance
if #available(iOS 15.0, *) {
navigationItem.compactScrollEdgeAppearance = barAppearance
} else {
// Fallback on earlier versions
}
navigationItem.compactScrollEdgeAppearance = barAppearance
}
func setupNavigationBarBackgroundView() {

View File

@ -336,11 +336,7 @@ extension WelcomeViewController: OnboardingViewControllerAppearance {
navigationItem.standardAppearance = barAppearance
navigationItem.compactAppearance = barAppearance
navigationItem.scrollEdgeAppearance = barAppearance
if #available(iOS 15.0, *) {
navigationItem.compactScrollEdgeAppearance = barAppearance
} else {
// Fallback on earlier versions
}
navigationItem.compactScrollEdgeAppearance = barAppearance
}
}

View File

@ -59,7 +59,7 @@ extension BookmarkViewModel {
}
}
diffableDataSource.applySnapshot(snapshot, animated: false)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}

View File

@ -59,7 +59,7 @@ extension FavoriteViewModel {
}
}
diffableDataSource.applySnapshot(snapshot, animated: false)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}

View File

@ -47,7 +47,7 @@ final class FollowedTagsViewModel: NSObject {
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
snapshot.appendSections([.main])
snapshot.appendItems(records.map {.hashtag($0) })
self.diffableDataSource?.applySnapshot(snapshot, animated: true)
self.diffableDataSource?.apply(snapshot, animatingDifferences: true)
}
.store(in: &disposeBag)
}

View File

@ -27,12 +27,7 @@ extension FollowerListViewModel {
var snapshot = NSDiffableDataSourceSnapshot<UserSection, UserItem>()
snapshot.appendSections([.main])
snapshot.appendItems([.bottomLoader], toSection: .main)
if #available(iOS 15.0, *) {
diffableDataSource?.applySnapshotUsingReloadData(snapshot, completion: nil)
} else {
// Fallback on earlier versions
diffableDataSource?.apply(snapshot, animatingDifferences: false)
}
diffableDataSource?.applySnapshotUsingReloadData(snapshot, completion: nil)
userFetchedResultsController.$records
.receive(on: DispatchQueue.main)

View File

@ -28,13 +28,8 @@ extension FollowingListViewModel {
var snapshot = NSDiffableDataSourceSnapshot<UserSection, UserItem>()
snapshot.appendSections([.main])
snapshot.appendItems([.bottomLoader], toSection: .main)
if #available(iOS 15.0, *) {
diffableDataSource?.applySnapshotUsingReloadData(snapshot, completion: nil)
} else {
// Fallback on earlier versions
diffableDataSource?.apply(snapshot, animatingDifferences: false)
}
diffableDataSource?.applySnapshotUsingReloadData(snapshot)
userFetchedResultsController.$records
.receive(on: DispatchQueue.main)
.sink { [weak self] records in

View File

@ -150,7 +150,9 @@ extension ProfileHeaderView.ViewModel {
// username
$acct
.map { acct in acct.flatMap { "@" + $0 } ?? " " }
.assign(to: \.text, on: view.usernameLabel)
.sink(receiveValue: { acct in
view.usernameButton.setTitle(acct, for: .normal)
})
.store(in: &disposeBag)
// bio
Publishers.CombineLatest4(

View File

@ -28,7 +28,6 @@ final class ProfileHeaderView: UIView {
static let avatarImageViewSize = CGSize(width: 98, height: 98)
static let avatarImageViewCornerRadius: CGFloat = 25
static let avatarImageViewBorderColor = UIColor.white
static let avatarImageViewBorderWidth: CGFloat = 2
static let friendshipActionButtonSize = CGSize(width: 108, height: 34)
static let bannerImageViewPlaceholderColor = UIColor.systemGray
@ -90,7 +89,6 @@ final class ProfileHeaderView: UIView {
view.layer.masksToBounds = true
view.layer.cornerRadius = ProfileHeaderView.avatarImageViewCornerRadius
view.layer.cornerCurve = .continuous
view.layer.borderColor = ProfileHeaderView.avatarImageViewBorderColor.cgColor
view.layer.borderWidth = ProfileHeaderView.avatarImageViewBorderWidth
return view
}()
@ -174,15 +172,26 @@ final class ProfileHeaderView: UIView {
textField.autocapitalizationType = .none
return textField
}()
let usernameLabel: UILabel = {
let label = UILabel()
label.font = UIFontMetrics(forTextStyle: .callout).scaledFont(for: .systemFont(ofSize: 16, weight: .regular))
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
label.textColor = Asset.Colors.Label.secondary.color
label.text = "@alice"
return label
private lazy var usernameButtonMenu: UIMenu = {
UIMenu(children: [
UIAction(title: L10n.Common.Controls.Actions.copy, image: UIImage(systemName: "doc.on.doc"), handler: { [weak self] _ in
UIPasteboard.general.string = self?.usernameButton.title(for: .normal)
})
])
}()
lazy var usernameButton: UIButton = {
let button = UIButton()
button.setTitle("@alice", for: .normal)
button.titleLabel?.font = UIFontMetrics(forTextStyle: .callout).scaledFont(for: .systemFont(ofSize: 16, weight: .regular))
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.minimumScaleFactor = 0.5
button.setTitleColor(Asset.Colors.Label.secondary.color, for: .normal)
button.menu = usernameButtonMenu
button.showsMenuAsPrimaryAction = true
button.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
return button
}()
let statusDashboardView = ProfileStatusDashboardView()
@ -242,12 +251,13 @@ final class ProfileHeaderView: UIView {
extension ProfileHeaderView {
private func _init() {
backgroundColor = ThemeService.shared.currentTheme.value.systemBackgroundColor
ThemeService.shared.currentTheme
let currentTheme = ThemeService.shared.currentTheme
setColors(from: currentTheme.value)
currentTheme
.receive(on: DispatchQueue.main)
.sink { [weak self] theme in
guard let self = self else { return }
self.backgroundColor = theme.systemBackgroundColor
self?.setColors(from: theme)
}
.store(in: &_disposeBag)
@ -322,10 +332,10 @@ extension ProfileHeaderView {
avatarButton.translatesAutoresizingMaskIntoConstraints = false
avatarImageViewBackgroundView.addSubview(avatarButton)
NSLayoutConstraint.activate([
avatarButton.topAnchor.constraint(equalTo: avatarImageViewBackgroundView.topAnchor, constant: 0.5 * ProfileHeaderView.avatarImageViewBorderWidth),
avatarButton.leadingAnchor.constraint(equalTo: avatarImageViewBackgroundView.leadingAnchor, constant: 0.5 * ProfileHeaderView.avatarImageViewBorderWidth),
avatarImageViewBackgroundView.trailingAnchor.constraint(equalTo: avatarButton.trailingAnchor, constant: 0.5 * ProfileHeaderView.avatarImageViewBorderWidth),
avatarImageViewBackgroundView.bottomAnchor.constraint(equalTo: avatarButton.bottomAnchor, constant: 0.5 * ProfileHeaderView.avatarImageViewBorderWidth),
avatarButton.topAnchor.constraint(equalTo: avatarImageViewBackgroundView.topAnchor, constant: ProfileHeaderView.avatarImageViewBorderWidth),
avatarButton.leadingAnchor.constraint(equalTo: avatarImageViewBackgroundView.leadingAnchor, constant: ProfileHeaderView.avatarImageViewBorderWidth),
avatarImageViewBackgroundView.trailingAnchor.constraint(equalTo: avatarButton.trailingAnchor, constant: ProfileHeaderView.avatarImageViewBorderWidth),
avatarImageViewBackgroundView.bottomAnchor.constraint(equalTo: avatarButton.bottomAnchor, constant: ProfileHeaderView.avatarImageViewBorderWidth),
avatarButton.widthAnchor.constraint(equalToConstant: ProfileHeaderView.avatarImageViewSize.width).priority(.required - 1),
avatarButton.heightAnchor.constraint(equalToConstant: ProfileHeaderView.avatarImageViewSize.height).priority(.required - 1),
])
@ -418,7 +428,11 @@ extension ProfileHeaderView {
// nameMetaText.textView.setContentHuggingPriority(, for: <#T##NSLayoutConstraint.Axis#>)
nameContainerStackView.addArrangedSubview(displayNameStackView)
nameContainerStackView.addArrangedSubview(usernameLabel)
nameContainerStackView.addArrangedSubview(usernameButton)
NSLayoutConstraint.activate([
usernameButton.heightAnchor.constraint(greaterThanOrEqualToConstant: 20)
])
authorContainer.addArrangedSubview(nameContainerStackView)
authorContainer.addArrangedSubview(UIView())
@ -453,6 +467,12 @@ extension ProfileHeaderView {
updateLayoutMargins()
}
private func setColors(from theme: Theme) {
backgroundColor = theme.systemBackgroundColor
avatarButton.backgroundColor = theme.secondarySystemBackgroundColor
avatarImageViewBackgroundView.layer.borderColor = theme.systemBackgroundColor.cgColor
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)

View File

@ -28,6 +28,7 @@ final class RemoteProfileViewModel: ProfileViewModel {
)
}
.retry(3)
.receive(on: DispatchQueue.main)
.sink { completion in
switch completion {
case .failure(let error):
@ -89,4 +90,41 @@ final class RemoteProfileViewModel: ProfileViewModel {
} // end Task
}
init(context: AppContext, authContext: AuthContext, acct: String) {
super.init(context: context, authContext: authContext, optionalMastodonUser: nil)
let domain = authContext.mastodonAuthenticationBox.domain
let authorization = authContext.mastodonAuthenticationBox.userAuthorization
Just(acct)
.asyncMap { acct in
try await context.apiService.accountSearch(
domain: domain,
query: .init(acct: acct),
authorization: authorization
)
}
.retry(3)
.receive(on: DispatchQueue.main)
.sink { completion in
switch completion {
case .failure(let error):
// TODO: handle error
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: remote user %s fetch failed: %s", ((#file as NSString).lastPathComponent), #line, #function, acct, error.localizedDescription)
case .finished:
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: remote user %s fetched", ((#file as NSString).lastPathComponent), #line, #function, acct)
}
} receiveValue: { [weak self] response in
guard let self = self else { return }
let managedObjectContext = context.managedObjectContext
let request = MastodonUser.sortedFetchRequest
request.fetchLimit = 1
request.predicate = MastodonUser.predicate(domain: domain, id: response.value.id)
guard let mastodonUser = managedObjectContext.safeFetch(request).first else {
assertionFailure()
return
}
self.user = mastodonUser
}
.store(in: &disposeBag)
}
}

View File

@ -83,7 +83,7 @@ extension UserTimelineViewModel {
}
}
diffableDataSource.applySnapshot(snapshot, animated: false)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}

View File

@ -28,13 +28,8 @@ extension UserListViewModel {
var snapshot = NSDiffableDataSourceSnapshot<UserSection, UserItem>()
snapshot.appendSections([.main])
snapshot.appendItems([.bottomLoader], toSection: .main)
if #available(iOS 15.0, *) {
diffableDataSource?.applySnapshotUsingReloadData(snapshot, completion: nil)
} else {
// Fallback on earlier versions
diffableDataSource?.apply(snapshot, animatingDifferences: false)
}
diffableDataSource?.applySnapshotUsingReloadData(snapshot)
// trigger initial loading
stateMachine.enter(UserListViewModel.State.Reloading.self)

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