Merge branch 'develop' into performance_experiments

This commit is contained in:
Marcus Kida 2023-09-22 10:11:31 +02:00
commit dcfe13ac36
No known key found for this signature in database
GPG Key ID: 19FF64E08013CA40
211 changed files with 6088 additions and 5127 deletions

View File

@ -1,4 +1,4 @@
"16wxgf" = "النَّشرُ عَلَى مَاستودُون"; "16wxgf" = "النَّشرُ عَلَى ماستدون";
"751xkl" = "محتوى نصي"; "751xkl" = "محتوى نصي";
@ -32,7 +32,7 @@
"ayoYEb-ehFLjY" = "${content}، المُتابِعُون فقط"; "ayoYEb-ehFLjY" = "${content}، المُتابِعُون فقط";
"dUyuGg" = "النَّشرُ عَلَى مَاستودُون"; "dUyuGg" = "النَّشرُ عَلَى ماستدون";
"dYQ5NN" = "لِلعَامَّة"; "dYQ5NN" = "لِلعَامَّة";

View File

@ -1,51 +1,51 @@
"16wxgf" = "Post on Mastodon"; "16wxgf" = "Ανάρτηση στο Mastodon";
"751xkl" = "Text Content"; "751xkl" = "Περιεχόμενο Κειμένου";
"CsR7G2" = "Post on Mastodon"; "CsR7G2" = "Ανάρτηση στο Mastodon";
"HZSGTr" = "What content to post?"; "HZSGTr" = "Τι περιεχόμενο θα αναρτήσεις;";
"HdGikU" = "Posting failed"; "HdGikU" = "Αποτυχία δημοσίευσης";
"KDNTJ4" = "Failure Reason"; "KDNTJ4" = "Λόγος Αποτυχίας";
"RHxKOw" = "Send Post with text content"; "RHxKOw" = "Αποστολή ανάρτησης με περιεχόμενο κειμένου";
"RxSqsb" = "Post"; "RxSqsb" = "Ανάρτηση";
"WCIR3D" = "Post ${content} on Mastodon"; "WCIR3D" = "Ανάρτηση ${content} στο Mastodon";
"ZKJSNu" = "Post"; "ZKJSNu" = "Ανάρτηση";
"ZS1XaK" = "${content}"; "ZS1XaK" = "${content}";
"ZbSjzC" = "Visibility"; "ZbSjzC" = "Ορατότητα";
"Zo4jgJ" = "Post Visibility"; "Zo4jgJ" = "Ορατότητα Ανάρτησης";
"apSxMG-dYQ5NN" = "There are ${count} options matching Public."; "apSxMG-dYQ5NN" = "Υπάρχουν ${count} επιλογές που ταιριάζουν στο «Δημόσιο».";
"apSxMG-ehFLjY" = "There are ${count} options matching Followers Only."; "apSxMG-ehFLjY" = "Υπάρχουν ${count} επιλογές που ταιριάζουν στο «Μόνο για Ακόλουθους».";
"ayoYEb-dYQ5NN" = "${content}, Public"; "ayoYEb-dYQ5NN" = "${content}, Δημόσιο";
"ayoYEb-ehFLjY" = "${content}, Followers Only"; "ayoYEb-ehFLjY" = "${content}, Μόνο Ακόλουθοι";
"dUyuGg" = "Post on Mastodon"; "dUyuGg" = "Ανάρτηση στο Mastodon";
"dYQ5NN" = "Public"; "dYQ5NN" = "Δημόσιο";
"ehFLjY" = "Followers Only"; "ehFLjY" = "Μόνο Ακόλουθοι";
"gfePDu" = "Posting failed. ${failureReason}"; "gfePDu" = "Αποτυχία ανάρτησης. ${failureReason}";
"k7dbKQ" = "Post was sent successfully."; "k7dbKQ" = "Η ανάρτηση στάλθηκε με επιτυχία.";
"oGiqmY-dYQ5NN" = "Just to confirm, you wanted Public?"; "oGiqmY-dYQ5NN" = "Απλά για να επιβεβαίωση, θες «Δημόσιο»;";
"oGiqmY-ehFLjY" = "Just to confirm, you wanted Followers Only?"; "oGiqmY-ehFLjY" = "Απλά για επιβεβαίωση, θες «Μόνο Ακόλουθοι»;";
"rM6dvp" = "URL"; "rM6dvp" = "URL";
"ryJLwG" = "Post was sent successfully. "; "ryJLwG" = "Η ανάρτηση στάλθηκε με επιτυχία. ";

View File

@ -5,7 +5,7 @@
<key>There are ${count} options matching ${content}. - 2</key> <key>There are ${count} options matching ${content}. - 2</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${content}.</string> <string>Υπάρχουν %#@count_option@ που ταιριάζουν με το ${content}.</string>
<key>count_option</key> <key>count_option</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -13,15 +13,15 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>%ld</string> <string>%ld</string>
<key>one</key> <key>one</key>
<string>1 option</string> <string>1 επιλογή</string>
<key>other</key> <key>other</key>
<string>%ld options</string> <string>%ld επιλογές</string>
</dict> </dict>
</dict> </dict>
<key>There are ${count} options matching ${visibility}.</key> <key>There are ${count} options matching ${visibility}.</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${visibility}.</string> <string>Υπάρχουν %#@count_option@ που ταιριάζουν με το ${visibility}.</string>
<key>count_option</key> <key>count_option</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -29,9 +29,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>%ld</string> <string>%ld</string>
<key>one</key> <key>one</key>
<string>1 option</string> <string>1 επιλογή</string>
<key>other</key> <key>other</key>
<string>%ld options</string> <string>%ld επιλογές</string>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -53,7 +53,7 @@ extension Parser {
].joined() ].joined()
let value = [ let value = [
"\"", "\"",
pair.value.replacingOccurrences(of: "%s", with: "%@"), pair.value.replacingOccurrences(of: "%s", with: "%@").replacingOccurrences(of: "\"", with: "\\\""),
"\"" "\""
].joined() ].joined()
let line = [ let line = [

View File

@ -75,6 +75,7 @@ private func map(language: String) -> String? {
case "tr.lproj": return "tr" // Turkish case "tr.lproj": return "tr" // Turkish
case "vi.lproj": return "vi" // Vietnamese case "vi.lproj": return "vi" // Vietnamese
case "el.lproj": return "el" // Greek case "el.lproj": return "el" // Greek
case "be.lproj": return "be" // Belarussian
default: return nil default: return nil
} }
} }

View File

@ -15,10 +15,6 @@
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,8 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -215,7 +214,6 @@
"title": "Edit History", "title": "Edit History",
"original_post": "Original Post · %s" "original_post": "Original Post · %s"
} }
}, },
"friendship": { "friendship": {
"follow": "Follow", "follow": "Follow",
@ -267,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -283,9 +281,9 @@
}, },
"a11y": { "a11y": {
"what_is_mastodon": { "what_is_mastodon": {
"title": "What is Mastodon?" "title": "What is Mastodon?"
} }
} }
} }
}, },
"login": { "login": {
@ -464,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -652,16 +650,20 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
}, "no_user": {
"title": "No User Account Found",
"message": "There's no Useraccount \"%s\" on %s"
}
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Voto fallido", "title": "Voto fallido",
"poll_ended": "La enquesta ha rematau" "poll_ended": "La enquesta ha rematau"
}, },
"discard_post_content": {
"title": "Descartar borrador",
"message": "Confirma pa descartar lo conteniu d'a publicación."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Error de publicación", "title": "Error de publicación",
"message": "No s'ha puesto publicar la publicación. Per favor, revise la suya connexión a internet.", "message": "No s'ha puesto publicar la publicación. Per favor, revise la suya connexión a internet.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Inicio", "home": "Inicio",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Iniciar sesión", "log_in": "Iniciar sesión",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Troba Chent a la quala Seguir", "title": "Popular on Mastodon",
"follow_explain": "Quan sigas a belún veyerás las suyas publicacions en a tuya pachina d'inicio." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Tot", "people": "People matching \"%s\"",
"people": "Chent", "profile": "Go to @%s@%s",
"hashtags": "Etiquetas", "url": "Open URL in Mastodon",
"posts": "Publicacions" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Sin resultaus" "no_results": "Sin resultaus"
}, },
"recent_search": "Busquedas recients", "recent_search": "Busquedas recients",
"clear_all": "Clear all",
"clear": "Borrar" "clear": "Borrar"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "إخفاقٌ فِي التَّصويت", "title": "إخفاقٌ فِي التَّصويت",
"poll_ended": "اِنتَهَى اِستِطلاعُ الرَّأي" "poll_ended": "اِنتَهَى اِستِطلاعُ الرَّأي"
}, },
"discard_post_content": {
"title": "التخلص من المسودة",
"message": "أكِّد للتخلص مِن مُحتوى مَنشور مؤلَّف."
},
"publish_post_failure": { "publish_post_failure": {
"title": "إخفاق في عمليَّة النشر", "title": "إخفاق في عمليَّة النشر",
"message": "فَشَلَ نَشر المَنشور.\nيُرجى التحقق من اتصالك بالإنترنت.", "message": "فَشَلَ نَشر المَنشور.\nيُرجى التحقق من اتصالك بالإنترنت.",
@ -54,7 +50,7 @@
}, },
"translation_failed": { "translation_failed": {
"title": "مُلاحظة", "title": "مُلاحظة",
"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.", "message": "فشلت الترجمة. ربما لم يتمكن مدير الخادم من تفعيل الترجمات على هذا الخادم أو هذا الخادم يقوم بتشغيل نسخة قديمة من ماستدون حيث الترجمات غير مدعومة بعد.",
"button": "حسنًا" "button": "حسنًا"
} }
}, },
@ -101,7 +97,11 @@
"title": "الترجَمَة مِن %s", "title": "الترجَمَة مِن %s",
"unknown_language": "غير مَعرُوفة" "unknown_language": "غير مَعرُوفة"
}, },
"edit_post": "Edit" "edit_post": "تعديل",
"bookmark": "إضافة إلى الفواصل المرجعية",
"remove_bookmark": "إزالة الفاصلة المرجعية",
"follow": "متابعة %s",
"unfollow": "ألغِ متابعة %s"
}, },
"tabs": { "tabs": {
"home": "الرَّئِيسَة", "home": "الرَّئِيسَة",
@ -109,8 +109,8 @@
"notifications": "الإشعارات", "notifications": "الإشعارات",
"profile": "المِلَفُّ التَّعريفِيّ", "profile": "المِلَفُّ التَّعريفِيّ",
"a11y": { "a11y": {
"search": "Search", "search": "البحث",
"explore": "Explore" "explore": "استكشف"
} }
}, },
"keyboard": { "keyboard": {
@ -147,7 +147,7 @@
"media_content_warning": "اُنقُر لِلكَشف", "media_content_warning": "اُنقُر لِلكَشف",
"tap_to_reveal": "اُنقُر لِلكَشف", "tap_to_reveal": "اُنقُر لِلكَشف",
"load_embed": "تحميل المُضمَن", "load_embed": "تحميل المُضمَن",
"link_via_user": "%s via %s", "link_via_user": "%s عبر %s",
"poll": { "poll": {
"vote": "صَوِّت", "vote": "صَوِّت",
"closed": "انتهى" "closed": "انتهى"
@ -172,8 +172,8 @@
"share_link_in_post": "مُشارَكَة الرابِط فِي مَنشور", "share_link_in_post": "مُشارَكَة الرابِط فِي مَنشور",
"tap_then_hold_to_show_menu": "اُنقُر مُطَوَّلًا لِإظْهَارِ القائِمَة", "tap_then_hold_to_show_menu": "اُنقُر مُطَوَّلًا لِإظْهَارِ القائِمَة",
"a11y_labels": { "a11y_labels": {
"reblog": "Re-blog", "reblog": "إعادة التدوين",
"unreblog": "Undo re-blog" "unreblog": "التراجع عن إعادة التدوين"
} }
}, },
"tag": { "tag": {
@ -194,25 +194,25 @@
"translated_from": "الترجَمَة مِن %s بِاستِخدَام %s", "translated_from": "الترجَمَة مِن %s بِاستِخدَام %s",
"unknown_language": "غير مَعرُوفة", "unknown_language": "غير مَعرُوفة",
"unknown_provider": "غير مَعرُوف", "unknown_provider": "غير مَعرُوف",
"show_original": "Show Original" "show_original": "إظهار الأصل"
}, },
"media": { "media": {
"accessibility_label": "%s, attachment %d of %d", "accessibility_label": "%s، مرفق %d من %d",
"expand_image_hint": "Expands the image. Double-tap and hold to show actions", "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_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" "expand_video_hint": "Shows the video player. Double-tap and hold to show actions"
}, },
"posted_via_application": "%s via %s", "posted_via_application": "%s عبر %s",
"buttons": { "buttons": {
"reblogs_title": "Reblogs", "reblogs_title": "المعاد تدوينها",
"favorites_title": "Favorites", "favorites_title": "المفضلة",
"edit_history_title": "Edit History", "edit_history_title": "سِجِلّ التعديلات",
"edit_history_detail": "Last edit %s" "edit_history_detail": "آخر تعديل %s"
}, },
"edited_at_timestamp_prefix": "Edited %s", "edited_at_timestamp_prefix": "عُدّل في %s",
"edit_history": { "edit_history": {
"title": "Edit History", "title": "سِجِلّ التعديلات",
"original_post": "Original Post · %s" "original_post": "المنشور الأصلي · %s"
} }
}, },
"friendship": { "friendship": {
@ -257,47 +257,47 @@
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "رابط غير متحقق منه",
"followers_count": "%@ followers" "followers_count": "%@ متابعين"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "تسجيلُ الدخول", "log_in": "تسجيلُ الدخول",
"learn_more": "Learn more", "learn_more": "تعلم المزيد",
"join_default_server": "Join mastodon.social", "join_default_server": "انضم إلى %@",
"pick_server": "Pick another server", "pick_server": "اختر خادمًا آخر",
"separator": { "separator": {
"or": "or" "or": "أو"
}, },
"education": { "education": {
"mastodon": { "mastodon": {
"title": "Welcome to Mastodon", "title": "أهلًا بك على ماستدون",
"description": "Mastodon is a decentralized social network, meaning no single company controls it. Its made up of many independently-run servers, all connected together." "description": "ماستدون شبكة اجتماعية لامركزية، بمعنى أنه ليس هناك شركة واحدة تتحكم فيها. وهي تتألف من العديد من الخوادم التي تدار بشكل مستقل، وجميعها متصلة معا."
}, },
"servers": { "servers": {
"title": "What are servers?", "title": "ما هي الخوادم؟",
"description": "Every Mastodon account is hosted on a server — each with its own values, rules, & admins. No matter which one you pick, you can follow and interact with people on any server." "description": "تتم استضافة كل حساب ماستدون على خادم - ولكل منها قيمه وقواعده ومسؤوليه الخاصين. بغض النظر عن الشخص الذي تختاره ، يمكنك متابعة الأشخاص والتفاعل معهم على أي خادم."
}, },
"a11y": { "a11y": {
"what_is_mastodon": { "what_is_mastodon": {
"title": "What is Mastodon?" "title": "ما هو ماستدون؟"
} }
} }
} }
}, },
"login": { "login": {
"title": "Welcome back", "title": "مرحباً بك مجددًا",
"subtitle": "سَجِّل دُخولَكَ إلى الخادِم الَّذي أنشأتَ حِسابَكَ فيه.", "subtitle": "سَجِّل دُخولَكَ إلى الخادِم الَّذي أنشأتَ حِسابَكَ فيه.",
"server_search_field": { "server_search_field": {
"placeholder": "أدخِل عُنوانَ URL أو اِبحَث عَنِ الخادِمِ الخاصّ بِك" "placeholder": "أدخِل عُنوانَ URL أو اِبحَث عَنِ الخادِمِ الخاصّ بِك"
} }
}, },
"server_picker": { "server_picker": {
"title": "Pick Server", "title": "اختر خادمًا",
"button": { "button": {
"language": "Language", "language": "اللغة",
"signup_speed": "Sign-up Speed", "signup_speed": "سرعة التسجيل",
"category": { "category": {
"all": "الكُل", "all": "الكُل",
"all_accessiblity_description": "الفِئَة: الكُل", "all_accessiblity_description": "الفِئَة: الكُل",
@ -331,31 +331,31 @@
"no_results": "لا توجد نتائج" "no_results": "لا توجد نتائج"
}, },
"signup_speed": { "signup_speed": {
"all": "All", "all": "الكل",
"instant": "Instant Sign-up", "instant": "تسجيل فوري",
"manually_reviewed": "Manual Review" "manually_reviewed": "مراجعة يدوية"
}, },
"language": { "language": {
"all": "All" "all": "الكل"
}, },
"search": { "search": {
"placeholder": "Search name or URL" "placeholder": "البحث عن اسم أو رابط تشعّبي URL"
}, },
"no_server_selected_hint": "Well pick a server based on your language if you continue without making a selection." "no_server_selected_hint": "سوف نختار خادماً بناءً على لغتك إذا قمت بالمتابعة دون إجراء إختيار."
}, },
"privacy": { "privacy": {
"title": "Privacy", "title": "الخصوصية",
"description": "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your servers privacy policy.", "description": "على الرغم من أن تطبيق ماستدون لا يجمع أي بيانات، فإن الخادم الذي قمت بالتسجيل من خلاله قد تكون له سياسة مختلفة. خذ دقيقة للمراجعة والموافقة على سياسة خصوصية تطبيق ماستدون وسياسة الخصوصية الخاصة بخادمك.",
"policy": { "policy": {
"ios": "Privacy Policy - Mastodon for iOS", "ios": "سياسة الخصوصية - ماستدون لنظام التشغيل iOS",
"server": "Privacy Policy - %s" "server": "سياسة الخصوصية - %s"
}, },
"button": { "button": {
"confirm": "I Agree" "confirm": "أوافق"
} }
}, },
"register": { "register": {
"title": "Create Account", "title": "إنشاء حساب",
"input": { "input": {
"avatar": { "avatar": {
"delete": "حذف" "delete": "حذف"
@ -363,7 +363,7 @@
"username": { "username": {
"placeholder": "اِسمُ مُستَخدِم", "placeholder": "اِسمُ مُستَخدِم",
"duplicate_prompt": "اِسم المُستَخدِم هذا مأخوذٌ بالفعل.", "duplicate_prompt": "اِسم المُستَخدِم هذا مأخوذٌ بالفعل.",
"suggestion": "amazing_%@" "suggestion": "مذهل_%@"
}, },
"display_name": { "display_name": {
"placeholder": "اِسمُ عَرض" "placeholder": "اِسمُ عَرض"
@ -373,7 +373,7 @@
}, },
"password": { "password": {
"placeholder": "رمز سري", "placeholder": "رمز سري",
"confirmation_placeholder": "Confirm Password", "confirmation_placeholder": "أكّد كلمة السر",
"require": "رمز المرور الخاص بك يجب أن يحتوي على الأقل:", "require": "رمز المرور الخاص بك يجب أن يحتوي على الأقل:",
"character_limit": "ثمانيةُ خانات", "character_limit": "ثمانيةُ خانات",
"accessibility": { "accessibility": {
@ -398,7 +398,7 @@
"reason": { "reason": {
"blocked": "يحتوي %s على موفِّر خدمة بريد إلكتروني غير مسموح به", "blocked": "يحتوي %s على موفِّر خدمة بريد إلكتروني غير مسموح به",
"unreachable": "يبدوا أنَّ %s غير موجود", "unreachable": "يبدوا أنَّ %s غير موجود",
"taken": "%s is already taken. How about:", "taken": "%s مأخوذ بالفعل. ماذا عن:",
"reserved": "إنَّ %s عبارة عن كلمة مفتاحيَّة محجوزة", "reserved": "إنَّ %s عبارة عن كلمة مفتاحيَّة محجوزة",
"accepted": "يجب أن يُقبل %s", "accepted": "يجب أن يُقبل %s",
"blank": "%s مَطلوب", "blank": "%s مَطلوب",
@ -422,30 +422,30 @@
"terms_of_service": "شُرُوط الخِدمَة", "terms_of_service": "شُرُوط الخِدمَة",
"privacy_policy": "سِياسَة الخُصُوصيَّة", "privacy_policy": "سِياسَة الخُصُوصيَّة",
"button": { "button": {
"confirm": "I Agree" "confirm": "أوافق"
} }
}, },
"confirm_email": { "confirm_email": {
"title": "Check Your Inbox", "title": "تحقَّق من بريدك الوارِد",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.", "tap_the_link_we_emailed_to_you_to_verify_your_account": "اضغط على الرابط الذي أرسلناه إليك للتحقق من %@. سننتظر هنا.",
"button": { "button": {
"resend": "إعادَةُ الإرسال" "resend": "إعادَةُ الإرسال"
}, },
"dont_receive_email": { "dont_receive_email": {
"title": "Check your Email", "title": "تحقق من بريدك الإلكتروني",
"description": "تحقق ممَّ إذا كان عنوان بريدك الإلكتروني صحيحًا، وكذلك تأكد مِن مجلد البريد غير الهام إذا لم تكن قد فعلت ذلك.", "description": "تحقق ممَّ إذا كان عنوان بريدك الإلكتروني صحيحًا، وكذلك تأكد مِن مجلد البريد غير الهام إذا لم تكن قد فعلت ذلك.",
"resend_email": "إعادة إرسال البريد الإلكتروني" "resend_email": "إعادة إرسال البريد الإلكتروني"
}, },
"open_email_app": { "open_email_app": {
"title": "Check your Inbox.", "title": "تحقَّق من بريدك الوارِد.",
"description": "لقد أرسلنا لك بريدًا إلكترونيًا للتو. تحقق من مجلد البريد غير الهام الخاص بك إذا لم تكن قد فعلت ذلك.", "description": "لقد أرسلنا لك بريدًا إلكترونيًا للتو. تحقق من مجلد البريد غير الهام الخاص بك إذا لم تكن قد فعلت ذلك.",
"mail": "البريد", "mail": "البريد",
"open_email_client": "فتح عميل البريد الإلكتروني" "open_email_client": "فتح عميل البريد الإلكتروني"
}, },
"didnt_get_link": { "didnt_get_link": {
"prefix": "Didnt get a link?", "prefix": "ألم تحصل على رابط؟",
"resend_in": "Resend (%@)", "resend_in": "إعادة إرسال (%@)",
"resend_now": "Resend now." "resend_now": "أعد الإرسال الآن."
} }
}, },
"home_timeline": { "home_timeline": {
@ -456,20 +456,20 @@
"published": "تمَّ النَّشر!", "published": "تمَّ النَّشر!",
"Publishing": "يَجري نَشر المُشارَكَة...", "Publishing": "يَجري نَشر المُشارَكَة...",
"accessibility": { "accessibility": {
"logo_label": "Mastodon", "logo_label": "ماستدون",
"logo_hint": "اُنقُر لِلتمريرِ لأعلى واُنقُر مَرّةً أُخرَى لِلذَّهابِ إلَى المَوقِعِ السَّابِق" "logo_hint": "اُنقُر لِلتمريرِ لأعلى واُنقُر مَرّةً أُخرَى لِلذَّهابِ إلَى المَوقِعِ السَّابِق"
} }
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "ابحث عن أشخاص لمتابعتهم", "title": "رائج على ماستدون",
"follow_explain": "عِندَ مُتابَعَتِكَ لأحدِهِم، سَوف تَرى مَنشوراته في تغذيَتِكَ الرئيسة." "follow_all": "اتبع الكل"
}, },
"compose": { "compose": {
"title": { "title": {
"new_post": "مَنشُورٌ جَديد", "new_post": "مَنشُورٌ جَديد",
"new_reply": "رَدٌّ جديد", "new_reply": "رَدٌّ جديد",
"edit_post": "Edit Post" "edit_post": "تعديل المنشور"
}, },
"media_selection": { "media_selection": {
"camera": "اِلتِقاطُ صُورَة", "camera": "اِلتِقاطُ صُورَة",
@ -493,7 +493,7 @@
"server_processing_state": "مُعالجة الخادم جارِيَة..." "server_processing_state": "مُعالجة الخادم جارِيَة..."
}, },
"poll": { "poll": {
"title": "Poll", "title": "استطلاع رأي",
"duration_time": "المُدَّة: %s", "duration_time": "المُدَّة: %s",
"thirty_minutes": "ثلاثون دقيقة", "thirty_minutes": "ثلاثون دقيقة",
"one_hour": "ساعةٌ واحدة", "one_hour": "ساعةٌ واحدة",
@ -504,10 +504,10 @@
"option_number": "الخيار %ld", "option_number": "الخيار %ld",
"the_poll_is_invalid": "الاِستِطلاعُ غيرُ صالِح", "the_poll_is_invalid": "الاِستِطلاعُ غيرُ صالِح",
"the_poll_has_empty_option": "يوجَدُ خِيارٌ فارِغٌ فِي الاِستِطلاع", "the_poll_has_empty_option": "يوجَدُ خِيارٌ فارِغٌ فِي الاِستِطلاع",
"add_option": "Add Option", "add_option": "إضافة خيار",
"remove_option": "Remove Option", "remove_option": "إزالة الخيار",
"move_up": "Move Up", "move_up": "أنقله إلى أعلى",
"move_down": "Move Down" "move_down": "أنقله إلى أسفل"
}, },
"content_warning": { "content_warning": {
"placeholder": "اكتب تَحذيرًا دَقيقًا هُنا..." "placeholder": "اكتب تَحذيرًا دَقيقًا هُنا..."
@ -541,10 +541,10 @@
"select_visibility_entry": "اختر مدى الظهور - %s" "select_visibility_entry": "اختر مدى الظهور - %s"
}, },
"language": { "language": {
"title": "Post Language", "title": "لغة النشر",
"suggested": "Suggested", "suggested": "المقترحَة",
"recent": "Recent", "recent": "الأخيرة",
"other": "Other Language…" "other": "لغات أخرى…"
} }
}, },
"profile": { "profile": {
@ -558,10 +558,10 @@
"other_posts": "مَنشورات", "other_posts": "مَنشورات",
"other_following": "مُتابَعُون", "other_following": "مُتابَعُون",
"other_followers": "مُتابِعُون", "other_followers": "مُتابِعُون",
"familiar_followers": "mutuals" "familiar_followers": "متابعة متبادلة"
}, },
"fields": { "fields": {
"joined": "Joined", "joined": "انضم في",
"add_row": "إضافة صف", "add_row": "إضافة صف",
"placeholder": { "placeholder": {
"label": "التسمية", "label": "التسمية",
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "الكُل", "people": "People matching \"%s\"",
"people": "أشخاص", "profile": "Go to @%s@%s",
"hashtags": "وُسُوم", "url": "Open URL in Mastodon",
"posts": "مَنشُورات" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "لا تُوجَدُ نتائِج" "no_results": "لا تُوجَدُ نتائِج"
}, },
"recent_search": "عَمَليَّاُت البَحثِ الأخيرَة", "recent_search": "عَمَليَّاُت البَحثِ الأخيرَة",
"clear_all": "Clear all",
"clear": "مَحو" "clear": "مَحو"
} }
}, },
@ -674,7 +674,7 @@
"intro": "هَذِهِ هِيَ المَنشُوراتُ الَّتي تَكْتَسِبُ شَعبِيَّةً فِي الرُّكنِ الخاصِّ بِكَ مِن مَاستُودون." "intro": "هَذِهِ هِيَ المَنشُوراتُ الَّتي تَكْتَسِبُ شَعبِيَّةً فِي الرُّكنِ الخاصِّ بِكَ مِن مَاستُودون."
}, },
"favorite": { "favorite": {
"title": "Favorites" "title": "المفضلة"
}, },
"notification": { "notification": {
"title": { "title": {
@ -739,7 +739,7 @@
"disable_avatar_animation": "تَعطيلُ الصوَرِ الرمزيَّةِ المُتحرِّكَة", "disable_avatar_animation": "تَعطيلُ الصوَرِ الرمزيَّةِ المُتحرِّكَة",
"disable_emoji_animation": "تَعطيلُ الرُموزِ التَّعبيريَّةِ المُتحرِّكَة", "disable_emoji_animation": "تَعطيلُ الرُموزِ التَّعبيريَّةِ المُتحرِّكَة",
"using_default_browser": "اِستِخدامُ المُتصفِّحِ الاِفتراضي لِفتحِ الرَّوابِط", "using_default_browser": "اِستِخدامُ المُتصفِّحِ الاِفتراضي لِفتحِ الرَّوابِط",
"open_links_in_mastodon": "فَتحُ الرَّوابِطِ فِي مَاستودُون" "open_links_in_mastodon": "فَتحُ الرَّوابِطِ فِي مَاستدون"
}, },
"boring_zone": { "boring_zone": {
"title": "المنطِقَةُ المُملَّة", "title": "المنطِقَةُ المُملَّة",
@ -845,37 +845,37 @@
}, },
"extension": { "extension": {
"open_in": { "open_in": {
"invalid_link_error": "This doesn't seem to be a valid Mastodon link." "invalid_link_error": "لا يبدو أن هذا رابط ماستدون صالح."
} }
}, },
"widget": { "widget": {
"common": { "common": {
"unsupported_widget_family": "Sorry but this Widget family is unsupported.", "unsupported_widget_family": "Sorry but this Widget family is unsupported.",
"user_not_logged_in": "Please open Mastodon to log in to an Account." "user_not_logged_in": "الرجاء فتح ماستدون لتسجيل الدخول إلى حساب."
}, },
"followers_count": { "followers_count": {
"configuration_display_name": "Followers", "configuration_display_name": "المتابِعون",
"configuration_description": "Show number of followers.", "configuration_description": "إظهار عدد المتابعين.",
"title": "FOLLOWERS", "title": "المتابِعون",
"followers_today": "%s followers today" "followers_today": "%s followers today"
}, },
"multiple_followers": { "multiple_followers": {
"configuration_display_name": "Multiple followers", "configuration_display_name": "متابعين متعددين",
"configuration_description": "Show number of followers for multiple accounts.", "configuration_description": "إظهار عدد المتابعين لحسابات متعددة.",
"mock_user": { "mock_user": {
"display_name": "Another follower", "display_name": "متابع آخر",
"account_name": "another@follower.social" "account_name": "another@follower.social"
} }
}, },
"latest_followers": { "latest_followers": {
"configuration_display_name": "Latest followers", "configuration_display_name": "أحدث المتابعين",
"configuration_description": "Show latest followers.", "configuration_description": "إظهار أحدث المتابِعين.",
"title": "Latest followers", "title": "أحدث المتابعين",
"last_update": "Last update: %s" "last_update": "آخر تحديث: %s"
}, },
"hashtag": { "hashtag": {
"configuration": { "configuration": {
"display_name": "Hashtag", "display_name": "وسم",
"description": "Shows a recent post with the selected hashtag." "description": "Shows a recent post with the selected hashtag."
}, },
"not_found": { "not_found": {

View File

@ -15,10 +15,6 @@
"title": "Памылка пры галасаванні", "title": "Памылка пры галасаванні",
"poll_ended": "Апытанне завяршылася" "poll_ended": "Апытанне завяршылася"
}, },
"discard_post_content": {
"title": "Скасаваць чарнавік",
"message": "Пацвердзіце, каб скасаваць змесціва допісу."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Памылка пры публікацыі", "title": "Памылка пры публікацыі",
"message": "Не ўдалося апублікаваць допіс.\nПраверце злучэнне з інтэрнэтам.", "message": "Не ўдалося апублікаваць допіс.\nПраверце злучэнне з інтэрнэтам.",
@ -101,7 +97,11 @@
"title": "Перакласці з %s", "title": "Перакласці з %s",
"unknown_language": "Невядомая" "unknown_language": "Невядомая"
}, },
"edit_post": "Рэдагаваць" "edit_post": "Рэдагаваць",
"bookmark": "Закладка",
"remove_bookmark": "Выдаліць закладку",
"follow": "Падпісацца на %s",
"unfollow": "Адпісацца ад %s"
}, },
"tabs": { "tabs": {
"home": "Галоўная", "home": "Галоўная",
@ -257,16 +257,16 @@
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "Няма спраўджанай спасылкі",
"followers_count": "%@ followers" "followers_count": "%@ падпісчыкаў"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "Увайсці", "log_in": "Увайсці",
"learn_more": "Даведацца больш", "learn_more": "Даведацца больш",
"join_default_server": "Далучайцеся да mastodon.social", "join_default_server": "Далучыцца да %@",
"pick_server": "Pick another server", "pick_server": "Выбраць іншы сервер",
"separator": { "separator": {
"or": "або" "or": "або"
}, },
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Знайсці людзей, каб падпісацца", "title": "Папулярна ў Mastodon",
"follow_explain": "Калі вы падпішацеся на кагосьці, вы ўбачыце яго допісы ў сваёй хатняй стужцы." "follow_all": "Падпісацца на ўсіх"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Усе", "people": "People matching \"%s\"",
"people": "Людзі", "profile": "Go to @%s@%s",
"hashtags": "Хэштэгі", "url": "Open URL in Mastodon",
"posts": "Допісы" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Няма вынікаў" "no_results": "Няма вынікаў"
}, },
"recent_search": "Нядаўнія запыты", "recent_search": "Нядаўнія запыты",
"clear_all": "Clear all",
"clear": "Ачысціць" "clear": "Ачысціць"
} }
}, },
@ -875,18 +875,18 @@
}, },
"hashtag": { "hashtag": {
"configuration": { "configuration": {
"display_name": "Hashtag", "display_name": "Хэштэг",
"description": "Shows a recent post with the selected hashtag." "description": "Паказвае нядаўні допіс з выбраным хэштэгам."
}, },
"not_found": { "not_found": {
"account_name": "John Mastodon", "account_name": "Джон Мастадон",
"account": "@johnMastodon@no-such.account", "account": "@johnMastodon@no-such.account",
"content": "Sorry, we couldnt find any posts with the hashtag <a>#%@</a>. Please try a <a>#DifferentHashtag</a> or check the widget settings." "content": "На жаль, мы не змаглі знайсці допісы з хэштэгам <a>#%@</a>. Калі ласка, паспрабуйце <a>#ІншыХэштэг</a> або праверце налады віджэта."
}, },
"placeholder": { "placeholder": {
"account_name": "John Mastodon", "account_name": "Джон Мастадон",
"account": "@johnMastodon@no-such.account", "account": "@johnMastodon@no-such.account",
"content": "This is how a post with a <a>#hashtag</a> would look. Pick whichever <a>#hashtag</a> you want in the widget settings." "content": "Вось як будзе выглядаць допіс з <a>#хэштэгам</a>. Выберыце любы <a>#хэштэг</a> у наладах віджэта."
} }
} }
} }

View File

@ -15,10 +15,6 @@
"title": "Error en votar", "title": "Error en votar",
"poll_ended": "L'enquesta ha finalitzat" "poll_ended": "L'enquesta ha finalitzat"
}, },
"discard_post_content": {
"title": "Descarta l'esborrany",
"message": "Confirma per a descartar el contingut del tut."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Error en publicar", "title": "Error en publicar",
"message": "No s'ha pogut enviar la publicació.\nComprova la connexió a Internet.", "message": "No s'ha pogut enviar la publicació.\nComprova la connexió a Internet.",
@ -49,8 +45,8 @@
"message": "Segur que vols eliminar aquesta publicació?" "message": "Segur que vols eliminar aquesta publicació?"
}, },
"clean_cache": { "clean_cache": {
"title": "Neteja la memòria cau", "title": "Esborra la memòria cau",
"message": "S'ha netejat correctament la memòria cau de %s." "message": "S'han esborrat %s de memòria cau."
}, },
"translation_failed": { "translation_failed": {
"title": "Nota", "title": "Nota",
@ -89,19 +85,23 @@
"open_in_safari": "Obrir a Safari", "open_in_safari": "Obrir a Safari",
"open_in_browser": "Obre al navegador", "open_in_browser": "Obre al navegador",
"find_people": "Busca persones a seguir", "find_people": "Busca persones a seguir",
"manually_search": "Cerca manualment a canvi", "manually_search": "Millor cerca manualment",
"skip": "Omet", "skip": "Omet",
"reply": "Respon", "reply": "Respon",
"report_user": "Informa sobre %s", "report_user": "Denuncia %s",
"block_domain": "Bloqueja %s", "block_domain": "Bloca %s",
"unblock_domain": "Desbloca %s", "unblock_domain": "Desbloca %s",
"settings": "Configuració", "settings": "Configuració",
"delete": "Suprimeix", "delete": "Suprimeix",
"translate_post": { "translate_post": {
"title": "Traduït del %s", "title": "Tradueix del: %s",
"unknown_language": "Desconegut" "unknown_language": "Desconegut"
}, },
"edit_post": "Edita" "edit_post": "Edita",
"bookmark": "Marcador",
"remove_bookmark": "Elimina el marcador",
"follow": "Segueix a %s",
"unfollow": "Deixa de seguir %s"
}, },
"tabs": { "tabs": {
"home": "Inici", "home": "Inici",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Inicia sessió", "log_in": "Inicia sessió",
"learn_more": "Més informació", "learn_more": "Més informació",
"join_default_server": "Uneix-te a mastodon.social", "join_default_server": "Uneix-te a %@",
"pick_server": "Tria un altre servidor", "pick_server": "Tria un altre servidor",
"separator": { "separator": {
"or": "o" "or": "o"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Cerca Persones a Seguir", "title": "Popular a Mastodon",
"follow_explain": "Quan segueixes algú, veuràs els seus tuts a Inici." "follow_all": "Seguir a tothom"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Tuts coincidents amb \"%s\"",
"all": "Tots", "people": "Perfils coincidents amb \"%s\"",
"people": "Gent", "profile": "Vés a @%s@%s",
"hashtags": "Etiquetes", "url": "Obre l'enllaç a Mastodon",
"posts": "Tuts" "hashtag": "Vés a #%s",
},
"empty_state": { "empty_state": {
"no_results": "No hi ha resultats" "no_results": "No hi ha resultats"
}, },
"recent_search": "Cerques recents", "recent_search": "Cerques recents",
"clear_all": "Esborra-ho tot",
"clear": "Neteja" "clear": "Neteja"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "نەتوانرا دەنگ بدرێت", "title": "نەتوانرا دەنگ بدرێت",
"poll_ended": "دەنگدانەکە کۆتایی هاتووە" "poll_ended": "دەنگدانەکە کۆتایی هاتووە"
}, },
"discard_post_content": {
"title": "ڕەشنووس هەڵمەگرە",
"message": "دڵنیا ببەوە بۆ وازهێنان لە ناوەڕۆکەت."
},
"publish_post_failure": { "publish_post_failure": {
"title": "نەتوانرا پۆستەکە بکرێت", "title": "نەتوانرا پۆستەکە بکرێت",
"message": "نەتوانرا پۆستەکە بکرێت.\nتکایە لە بەردەستبوونی هێڵی ئینتەرنێت دڵنیا بە.", "message": "نەتوانرا پۆستەکە بکرێت.\nتکایە لە بەردەستبوونی هێڵی ئینتەرنێت دڵنیا بە.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "ماڵەوە", "home": "ماڵەوە",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "بچۆ ژوورەوە", "log_in": "بچۆ ژوورەوە",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "خەڵک بدۆزەوە", "title": "Popular on Mastodon",
"follow_explain": "کاتێک شوێنی یەکێک دەکەویت، پۆستەکانی دێتە بەردەمت." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "هەمووی", "people": "People matching \"%s\"",
"people": "خەڵک", "profile": "Go to @%s@%s",
"hashtags": "هاشتاگ", "url": "Open URL in Mastodon",
"posts": "پۆست" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "هیچ ئەنجامێک نەدۆزرایەوە" "no_results": "هیچ ئەنجامێک نەدۆزرایەوە"
}, },
"recent_search": "گەڕانەکانی پێشترت", "recent_search": "گەڕانەکانی پێشترت",
"clear_all": "Clear all",
"clear": "بیانسڕەوە" "clear": "بیانسڕەوە"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Selhání hlasování", "title": "Selhání hlasování",
"poll_ended": "Anketa skončila" "poll_ended": "Anketa skončila"
}, },
"discard_post_content": {
"title": "Zahodit koncept",
"message": "Potvrďte odstranění obsahu složeného příspěvku."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publikování selhalo", "title": "Publikování selhalo",
"message": "Nepodařilo se publikovat příspěvek.\nZkontrolujte prosím připojení k internetu.", "message": "Nepodařilo se publikovat příspěvek.\nZkontrolujte prosím připojení k internetu.",
@ -101,7 +97,11 @@
"title": "Přeložit z %s", "title": "Přeložit z %s",
"unknown_language": "Neznámý" "unknown_language": "Neznámý"
}, },
"edit_post": "Upravit" "edit_post": "Upravit",
"bookmark": "Záložka",
"remove_bookmark": "Odstranit záložku",
"follow": "Sledovat %s",
"unfollow": "Přestat sledovat %s"
}, },
"tabs": { "tabs": {
"home": "Domů", "home": "Domů",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Přihlásit se", "log_in": "Přihlásit se",
"learn_more": "Zjistit více", "learn_more": "Zjistit více",
"join_default_server": "Join mastodon.social", "join_default_server": "Připojit se k %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Najít lidi pro sledování", "title": "Popular on Mastodon",
"follow_explain": "Když někoho sledujete, uvidíte jejich příspěvky ve vašem domovském kanálu." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Vše", "people": "People matching \"%s\"",
"people": "Lidé", "profile": "Go to @%s@%s",
"hashtags": "Hashtagy", "url": "Open URL in Mastodon",
"posts": "Příspěvky" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Žádné výsledky" "no_results": "Žádné výsledky"
}, },
"recent_search": "Nedávná hledání", "recent_search": "Nedávná hledání",
"clear_all": "Clear all",
"clear": "Vymazat" "clear": "Vymazat"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Gwall Pleidleisio", "title": "Gwall Pleidleisio",
"poll_ended": "Mae'r pôl wedi dod i ben" "poll_ended": "Mae'r pôl wedi dod i ben"
}, },
"discard_post_content": {
"title": "Dileu Drafft",
"message": "Cadarnhau i ddileu post drafft."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Gwall Cyhoeddi", "title": "Gwall Cyhoeddi",
"message": "Gwall wrth gyhoeddi'r tŵt.\nGwiriwch eich cysylltiad i'r rhyngrhwyd.", "message": "Gwall wrth gyhoeddi'r tŵt.\nGwiriwch eich cysylltiad i'r rhyngrhwyd.",
@ -101,7 +97,11 @@
"title": "Cyfieithu o %s", "title": "Cyfieithu o %s",
"unknown_language": "Anhysbys" "unknown_language": "Anhysbys"
}, },
"edit_post": "Golygu" "edit_post": "Golygu",
"bookmark": "Bookmark",
"remove_bookmark": "Dileu Llyfrnod",
"follow": "Dilyn %s",
"unfollow": "Dad-ddilyn %s"
}, },
"tabs": { "tabs": {
"home": "Hafan", "home": "Hafan",
@ -209,7 +209,7 @@
"edit_history_title": "Edit History", "edit_history_title": "Edit History",
"edit_history_detail": "Last edit %s" "edit_history_detail": "Last edit %s"
}, },
"edited_at_timestamp_prefix": "Edited %s", "edited_at_timestamp_prefix": "Wedi'i olygu %s",
"edit_history": { "edit_history": {
"title": "Edit History", "title": "Edit History",
"original_post": "Original Post · %s" "original_post": "Original Post · %s"
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Mewngofnodi", "log_in": "Mewngofnodi",
"learn_more": "Dysgu mwy", "learn_more": "Dysgu mwy",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -287,7 +287,7 @@
} }
}, },
"login": { "login": {
"title": "Welcome back", "title": "Croeso nôl",
"subtitle": "Mewngofnodi ar y gweinydd y rydych chi wedi creu cyfrif arno.", "subtitle": "Mewngofnodi ar y gweinydd y rydych chi wedi creu cyfrif arno.",
"server_search_field": { "server_search_field": {
"placeholder": "Mewnosod URL neu chwilio am eich gweinydd" "placeholder": "Mewnosod URL neu chwilio am eich gweinydd"
@ -336,7 +336,7 @@
"manually_reviewed": "Manual Review" "manually_reviewed": "Manual Review"
}, },
"language": { "language": {
"all": "All" "all": "Popeth"
}, },
"search": { "search": {
"placeholder": "Search name or URL" "placeholder": "Search name or URL"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Chwilio a Dilyn Pobl", "title": "Popular on Mastodon",
"follow_explain": "Ar ôl ichi ddilyn rhywun, byddwch yn gweld eu postiadau yn eich ffrwd hafan." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -543,7 +543,7 @@
"language": { "language": {
"title": "Post Language", "title": "Post Language",
"suggested": "Suggested", "suggested": "Suggested",
"recent": "Recent", "recent": "Diweddar",
"other": "Other Language…" "other": "Other Language…"
} }
}, },
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Popeth", "people": "People matching \"%s\"",
"people": "Pobl", "profile": "Go to @%s@%s",
"hashtags": "Hashnodau", "url": "Open URL in Mastodon",
"posts": "Postiadau" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Dim canlyniadau" "no_results": "Dim canlyniadau"
}, },
"recent_search": "Chwiliadau diweddar", "recent_search": "Chwiliadau diweddar",
"clear_all": "Clear all",
"clear": "Clirio" "clear": "Clirio"
} }
}, },
@ -674,7 +674,7 @@
"intro": "Dyma'r postiadau sy'n denu tipyn o sylw yn eich cŵr Mastodon." "intro": "Dyma'r postiadau sy'n denu tipyn o sylw yn eich cŵr Mastodon."
}, },
"favorite": { "favorite": {
"title": "Favorites" "title": "Ffefrynnau"
}, },
"notification": { "notification": {
"title": { "title": {
@ -854,7 +854,7 @@
"user_not_logged_in": "Please open Mastodon to log in to an Account." "user_not_logged_in": "Please open Mastodon to log in to an Account."
}, },
"followers_count": { "followers_count": {
"configuration_display_name": "Followers", "configuration_display_name": "Dilynwyr",
"configuration_description": "Show number of followers.", "configuration_description": "Show number of followers.",
"title": "FOLLOWERS", "title": "FOLLOWERS",
"followers_today": "%s followers today" "followers_today": "%s followers today"
@ -875,17 +875,17 @@
}, },
"hashtag": { "hashtag": {
"configuration": { "configuration": {
"display_name": "Hashtag", "display_name": "Hashnod",
"description": "Shows a recent post with the selected hashtag." "description": "Shows a recent post with the selected hashtag."
}, },
"not_found": { "not_found": {
"account_name": "John Mastodon", "account_name": "Ieuan Mastodon",
"account": "@johnMastodon@no-such.account", "account": "@ieuanMastodon@dim-cyfrif-or.fath",
"content": "Sorry, we couldnt find any posts with the hashtag <a>#%@</a>. Please try a <a>#DifferentHashtag</a> or check the widget settings." "content": "Sorry, we couldnt find any posts with the hashtag <a>#%@</a>. Please try a <a>#DifferentHashtag</a> or check the widget settings."
}, },
"placeholder": { "placeholder": {
"account_name": "John Mastodon", "account_name": "Ieuan Mastodon",
"account": "@johnMastodon@no-such.account", "account": "@ieuanMastodon@dim-cyfrif-or.fath",
"content": "This is how a post with a <a>#hashtag</a> would look. Pick whichever <a>#hashtag</a> you want in the widget settings." "content": "This is how a post with a <a>#hashtag</a> would look. Pick whichever <a>#hashtag</a> you want in the widget settings."
} }
} }

View File

@ -2,23 +2,19 @@
"common": { "common": {
"alerts": { "alerts": {
"common": { "common": {
"please_try_again": "Please try again.", "please_try_again": "Prøv venligst igen.",
"please_try_again_later": "Please try again later." "please_try_again_later": "Prøv venligst igen senere."
}, },
"sign_up_failure": { "sign_up_failure": {
"title": "Sign Up Failure" "title": "Tilmeldingsfejl"
}, },
"server_error": { "server_error": {
"title": "Server Error" "title": "Serverfejl"
}, },
"vote_failure": { "vote_failure": {
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Fehler bei Abstimmung", "title": "Fehler bei Abstimmung",
"poll_ended": "Die Umfrage ist beendet" "poll_ended": "Die Umfrage ist beendet"
}, },
"discard_post_content": {
"title": "Entwurf verwerfen",
"message": "Bestätige, um den Beitrag zu verwerfen."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Fehler bei Veröffentlichung", "title": "Fehler bei Veröffentlichung",
"message": "Fehler beim Veröffentlichen des Beitrags.\nBitte überprüfe deine Internetverbindung.", "message": "Fehler beim Veröffentlichen des Beitrags.\nBitte überprüfe deine Internetverbindung.",
@ -101,7 +97,11 @@
"title": "Von %s übersetzen", "title": "Von %s übersetzen",
"unknown_language": "Unbekannt" "unknown_language": "Unbekannt"
}, },
"edit_post": "Bearbeiten" "edit_post": "Bearbeiten",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Startseite", "home": "Startseite",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Anmelden", "log_in": "Anmelden",
"learn_more": "Mehr erfahren", "learn_more": "Mehr erfahren",
"join_default_server": "mastodon.social beitreten", "join_default_server": "Join %@",
"pick_server": "Einen anderen Server auswählen", "pick_server": "Einen anderen Server auswählen",
"separator": { "separator": {
"or": "oder" "or": "oder"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Finde Personen zum Folgen", "title": "Popular on Mastodon",
"follow_explain": "Sobald du anderen folgst, siehst du deren Beiträge in deinem Home-Feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Alles", "people": "People matching \"%s\"",
"people": "Personen", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Beiträge" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Keine Ergebnisse" "no_results": "Keine Ergebnisse"
}, },
"recent_search": "Zuletzt gesucht", "recent_search": "Zuletzt gesucht",
"clear_all": "Clear all",
"clear": "Zurücksetzen" "clear": "Zurücksetzen"
} }
}, },

View File

@ -13,15 +13,15 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 unread notification</string> <string>1 μη αναγνωσμένη ειδοποίηση</string>
<key>other</key> <key>other</key>
<string>%ld unread notifications</string> <string>%ld μη αναγνωσμένες ειδοποιήσεις</string>
</dict> </dict>
</dict> </dict>
<key>a11y.plural.count.input_limit_exceeds</key> <key>a11y.plural.count.input_limit_exceeds</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>Input limit exceeds %#@character_count@</string> <string>Το όριο εισόδου υπερβαίνει το %#@character_count@</string>
<key>character_count</key> <key>character_count</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -29,15 +29,15 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 character</string> <string>1 χαρακτήρας</string>
<key>other</key> <key>other</key>
<string>%ld characters</string> <string>%ld χαρακτήρες</string>
</dict> </dict>
</dict> </dict>
<key>a11y.plural.count.input_limit_remains</key> <key>a11y.plural.count.input_limit_remains</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>Input limit remains %#@character_count@</string> <string>Το όριο εισόδου παραμένει %#@character_count@</string>
<key>character_count</key> <key>character_count</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -45,9 +45,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 character</string> <string>1 χαρακτήρας</string>
<key>other</key> <key>other</key>
<string>%ld characters</string> <string>%ld χαρακτήρες</string>
</dict> </dict>
</dict> </dict>
<key>a11y.plural.count.characters_left</key> <key>a11y.plural.count.characters_left</key>
@ -61,9 +61,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 character left</string> <string>απομένει 1 χαρακτήρας</string>
<key>other</key> <key>other</key>
<string>%ld characters left</string> <string>απομένουν %ld χαρακτήρες</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.followed_by_and_mutual</key> <key>plural.count.followed_by_and_mutual</key>
@ -88,9 +88,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>Followed by %1$@, and another mutual</string> <string>Ακολουθείται από %1$@ και έναν ακόμα κοινό</string>
<key>other</key> <key>other</key>
<string>Followed by %1$@, and %ld mutuals</string> <string>Ακολουθείται από %1$@, και %ld κοινούς</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.metric_formatted.post</key> <key>plural.count.metric_formatted.post</key>
@ -104,9 +104,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>post</string> <string>ανάρτηση</string>
<key>other</key> <key>other</key>
<string>posts</string> <string>αναρτήσεις</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.media</key> <key>plural.count.media</key>
@ -120,9 +120,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 media</string> <string>1 πολυμέσο</string>
<key>other</key> <key>other</key>
<string>%ld media</string> <string>%ld πολυμέσα</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.post</key> <key>plural.count.post</key>
@ -136,9 +136,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 post</string> <string>1 ανάρτηση</string>
<key>other</key> <key>other</key>
<string>%ld posts</string> <string>%ld αναρτήσεις</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.favorite</key> <key>plural.count.favorite</key>
@ -152,9 +152,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 favorite</string> <string>1 αγαπημένο</string>
<key>other</key> <key>other</key>
<string>%ld favorites</string> <string>%ld αγαπημένα</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.reblog</key> <key>plural.count.reblog</key>
@ -168,9 +168,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reblog</string> <string>1 αναδημοσίευση</string>
<key>other</key> <key>other</key>
<string>%ld reblogs</string> <string>%ld αναδημοσιεύσεις</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.reblog_a11y</key> <key>plural.count.reblog_a11y</key>
@ -184,9 +184,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 re-blog</string> <string>1 αναδημοσίευση</string>
<key>other</key> <key>other</key>
<string>%ld re-blogs</string> <string>%ld αναδημοσιεύσεις</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.reply</key> <key>plural.count.reply</key>
@ -200,9 +200,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>1 απάντηση</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld απαντήσεις</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>
@ -216,9 +216,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 vote</string> <string>1 ψήφος</string>
<key>other</key> <key>other</key>
<string>%ld votes</string> <string>%ld ψήφοι</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.voter</key> <key>plural.count.voter</key>
@ -232,9 +232,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 voter</string> <string>1 ψηφοφόρος</string>
<key>other</key> <key>other</key>
<string>%ld voters</string> <string>%ld ψηφοφόροι</string>
</dict> </dict>
</dict> </dict>
<key>plural.people_talking</key> <key>plural.people_talking</key>
@ -248,9 +248,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 people talking</string> <string>1 άτομο που μιλάει</string>
<key>other</key> <key>other</key>
<string>%ld people talking</string> <string>%ld άτομα μιλούν</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.following</key> <key>plural.count.following</key>
@ -264,9 +264,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 following</string> <string>1 ακολουθεί</string>
<key>other</key> <key>other</key>
<string>%ld following</string> <string>%ld ακολουθούν</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.follower</key> <key>plural.count.follower</key>
@ -280,9 +280,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 follower</string> <string>1 ακόλουθος</string>
<key>other</key> <key>other</key>
<string>%ld followers</string> <string>%ld ακόλουθοι</string>
</dict> </dict>
</dict> </dict>
<key>date.year.left</key> <key>date.year.left</key>
@ -296,9 +296,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 year left</string> <string>Απομένει 1 χρόνος</string>
<key>other</key> <key>other</key>
<string>%ld years left</string> <string>Απομένουν %ld χρόνια</string>
</dict> </dict>
</dict> </dict>
<key>date.month.left</key> <key>date.month.left</key>
@ -312,9 +312,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 months left</string> <string>Απομένει 1 μήνας</string>
<key>other</key> <key>other</key>
<string>%ld months left</string> <string>Απομένουν %ld μήνες</string>
</dict> </dict>
</dict> </dict>
<key>date.day.left</key> <key>date.day.left</key>
@ -328,9 +328,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 day left</string> <string>Απομένει 1 ημέρα</string>
<key>other</key> <key>other</key>
<string>%ld days left</string> <string>απομένουν %ld ημέρες</string>
</dict> </dict>
</dict> </dict>
<key>date.hour.left</key> <key>date.hour.left</key>
@ -344,9 +344,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 hour left</string> <string>απομένει 1 ώρα</string>
<key>other</key> <key>other</key>
<string>%ld hours left</string> <string>απομένουν %ld ώρες</string>
</dict> </dict>
</dict> </dict>
<key>date.minute.left</key> <key>date.minute.left</key>
@ -360,9 +360,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 minute left</string> <string>απομένει 1 λεπτό</string>
<key>other</key> <key>other</key>
<string>%ld minutes left</string> <string>Απομένουν %ld λεπτά</string>
</dict> </dict>
</dict> </dict>
<key>date.second.left</key> <key>date.second.left</key>
@ -376,9 +376,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 second left</string> <string>απομένει 1 δευτερόλεπτο</string>
<key>other</key> <key>other</key>
<string>%ld seconds left</string> <string>Απομένουν %ld δευτερόλεπτα</string>
</dict> </dict>
</dict> </dict>
<key>date.year.ago.abbr</key> <key>date.year.ago.abbr</key>
@ -392,9 +392,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1y ago</string> <string>1χρ πριν</string>
<key>other</key> <key>other</key>
<string>%ldy ago</string> <string>%ldχρ πριν</string>
</dict> </dict>
</dict> </dict>
<key>date.month.ago.abbr</key> <key>date.month.ago.abbr</key>
@ -408,9 +408,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1M ago</string> <string>1μην πριν</string>
<key>other</key> <key>other</key>
<string>%ldM ago</string> <string>%ldμην πριν</string>
</dict> </dict>
</dict> </dict>
<key>date.day.ago.abbr</key> <key>date.day.ago.abbr</key>
@ -424,9 +424,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1d ago</string> <string>%1ημ πριν</string>
<key>other</key> <key>other</key>
<string>%ldd ago</string> <string>%ldημ πριν</string>
</dict> </dict>
</dict> </dict>
<key>date.hour.ago.abbr</key> <key>date.hour.ago.abbr</key>
@ -440,9 +440,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1h ago</string> <string>1ώ πριν</string>
<key>other</key> <key>other</key>
<string>%ldh ago</string> <string>%ldώ πριν</string>
</dict> </dict>
</dict> </dict>
<key>date.minute.ago.abbr</key> <key>date.minute.ago.abbr</key>
@ -456,9 +456,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1m ago</string> <string>1λ πριν</string>
<key>other</key> <key>other</key>
<string>%ldm ago</string> <string>%ldλ πριν</string>
</dict> </dict>
</dict> </dict>
<key>date.second.ago.abbr</key> <key>date.second.ago.abbr</key>
@ -472,9 +472,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1s ago</string> <string>1δλ πριν</string>
<key>other</key> <key>other</key>
<string>%lds ago</string> <string>%ldδλ πριν</string>
</dict> </dict>
</dict> </dict>
</dict> </dict>

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"NSCameraUsageDescription": "Used to take photo for post status", "NSCameraUsageDescription": "Χρησιμοποιείται για λήψη φωτογραφίας για την κατάσταση της ανάρτησης",
"NSPhotoLibraryAddUsageDescription": "Used to save photo into the Photo Library", "NSPhotoLibraryAddUsageDescription": "Χρησιμοποιείται για αποθήκευση φωτογραφιών στις Φωτογραφίες",
"NewPostShortcutItemTitle": "New Post", "NewPostShortcutItemTitle": "Νέα Ανάρτηση",
"SearchShortcutItemTitle": "Search" "SearchShortcutItemTitle": "Αναζήτηση"
} }

View File

@ -15,10 +15,6 @@
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Error al votar", "title": "Error al votar",
"poll_ended": "La encuesta finalizó" "poll_ended": "La encuesta finalizó"
}, },
"discard_post_content": {
"title": "Descartar borrador",
"message": "Confirmá para descartar el contenido del mensaje redactado."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Error al enviar el mensaje", "title": "Error al enviar el mensaje",
"message": "Error al enviar en mensaje.\nPor favor, revisá tu conexión a Internet.", "message": "Error al enviar en mensaje.\nPor favor, revisá tu conexión a Internet.",
@ -101,7 +97,11 @@
"title": "Traducido desde el %s", "title": "Traducido desde el %s",
"unknown_language": "Desconocido" "unknown_language": "Desconocido"
}, },
"edit_post": "Editar" "edit_post": "Editar",
"bookmark": "Marcar",
"remove_bookmark": "Quitar marcador",
"follow": "Seguir a %s",
"unfollow": "Dejar de seguir a %s"
}, },
"tabs": { "tabs": {
"home": "Principal", "home": "Principal",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Iniciar sesión", "log_in": "Iniciar sesión",
"learn_more": "Aprendé más", "learn_more": "Aprendé más",
"join_default_server": "Unite a mastodon.social", "join_default_server": "Unite a %@",
"pick_server": "Elegí otro servidor", "pick_server": "Elegí otro servidor",
"separator": { "separator": {
"or": "o" "or": "o"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Encontrá cuentas para seguir", "title": "Popular en Mastodon",
"follow_explain": "Cuando sigás una cuenta, verás sus mensajes en tu línea temporal principal." "follow_all": "Seguir a todos"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Mensajes que coinciden con %s\"",
"all": "Todo", "people": "Personas que coinciden con \"%s\"",
"people": "Cuentas", "profile": "Ir a @%s@%s",
"hashtags": "Etiquetas", "url": "Abrir dirección web en Mastodon",
"posts": "Mensajes" "hashtag": "Ir a %s",
},
"empty_state": { "empty_state": {
"no_results": "No hay resultados" "no_results": "No hay resultados"
}, },
"recent_search": "Búsquedas recientes", "recent_search": "Búsquedas recientes",
"clear_all": "Limpiar todo",
"clear": "Limpiar" "clear": "Limpiar"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Voto fallido", "title": "Voto fallido",
"poll_ended": "La encuesta ha terminado" "poll_ended": "La encuesta ha terminado"
}, },
"discard_post_content": {
"title": "Descartar borrador",
"message": "Confirma para descartar el contenido de la publicación."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Error de publicación", "title": "Error de publicación",
"message": "No se pudo publicar la publicación.\nPor favor, revise su conexión a internet.", "message": "No se pudo publicar la publicación.\nPor favor, revise su conexión a internet.",
@ -101,7 +97,11 @@
"title": "Traducir desde %s", "title": "Traducir desde %s",
"unknown_language": "Desconocido" "unknown_language": "Desconocido"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Inicio", "home": "Inicio",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Iniciar sesión", "log_in": "Iniciar sesión",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Encuentra Gente a la que Seguir", "title": "Popular on Mastodon",
"follow_explain": "Cuando sigas a alguien verás sus publicaciones en tu página de inicio." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Todo", "people": "People matching \"%s\"",
"people": "Gente", "profile": "Go to @%s@%s",
"hashtags": "Etiquetas", "url": "Open URL in Mastodon",
"posts": "Publicaciones" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Sin resultados" "no_results": "Sin resultados"
}, },
"recent_search": "Búsquedas recientes", "recent_search": "Búsquedas recientes",
"clear_all": "Clear all",
"clear": "Borrar" "clear": "Borrar"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Hutsegitea botoa ematean", "title": "Hutsegitea botoa ematean",
"poll_ended": "Inkesta amaitu da" "poll_ended": "Inkesta amaitu da"
}, },
"discard_post_content": {
"title": "Baztertu zirriborroa",
"message": "Berretsi idatzitako bidalketaren edukia baztertzea."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Hutsegitea argitaratzean", "title": "Hutsegitea argitaratzean",
"message": "Huts egin du bidalketa argitaratzean.\nEgiaztatu Interneteko konexioa.", "message": "Huts egin du bidalketa argitaratzean.\nEgiaztatu Interneteko konexioa.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Hasiera", "home": "Hasiera",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Hasi saioa", "log_in": "Hasi saioa",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Bilatu jarraitzeko jendea", "title": "Popular on Mastodon",
"follow_explain": "Norbait jarraitzen duzunean, bere bidalketak zure hasierako denbora-lerroan agertuko zaizkizu." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Guztiak", "people": "People matching \"%s\"",
"people": "Jendea", "profile": "Go to @%s@%s",
"hashtags": "Traolak", "url": "Open URL in Mastodon",
"posts": "Bidalketak" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Emaitzarik ez" "no_results": "Emaitzarik ez"
}, },
"recent_search": "Azken bilaketak", "recent_search": "Azken bilaketak",
"clear_all": "Clear all",
"clear": "Garbitu" "clear": "Garbitu"
} }
}, },

View File

@ -88,9 +88,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>Followed by %1$@, and another mutual</string> <string>%1$@ seuraajaa, joista yhteistä</string>
<key>other</key> <key>other</key>
<string>Followed by %1$@, and %ld mutuals</string> <string>%1$@ seuraajaa, joista %ld yhteistä</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.metric_formatted.post</key> <key>plural.count.metric_formatted.post</key>
@ -120,9 +120,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 media</string> <string>Yksi media</string>
<key>other</key> <key>other</key>
<string>%ld media</string> <string>%ld mediaa</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.post</key> <key>plural.count.post</key>
@ -200,9 +200,9 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 reply</string> <string>Yksi vastaus</string>
<key>other</key> <key>other</key>
<string>%ld replies</string> <string>%ld vastausta</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.vote</key> <key>plural.count.vote</key>

View File

@ -12,18 +12,14 @@
"title": "Palvelinvirhe" "title": "Palvelinvirhe"
}, },
"vote_failure": { "vote_failure": {
"title": "Vote Failure", "title": "Äänestys epäonnistui",
"poll_ended": "Kysely on päättynyt" "poll_ended": "Kysely on päättynyt"
}, },
"discard_post_content": {
"title": "Hylkää luonnos",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Julkaiseminen epäonnistui", "title": "Julkaiseminen epäonnistui",
"message": "Julkaisun julkaiseminen epäonnistui.\nTarkista internet-yhteytesi.", "message": "Julkaisun julkaiseminen epäonnistui.\nTarkista internet-yhteytesi.",
"attachments_message": { "attachments_message": {
"video_attach_with_photo": "Cannot attach a video to a post that already contains images.", "video_attach_with_photo": "Videota ei voi liittää tilapäivitykseen, joka sisältää jo kuvia.",
"more_than_one_video": "Ei voi liittä yhtä videota enempää." "more_than_one_video": "Ei voi liittä yhtä videota enempää."
} }
}, },
@ -37,24 +33,24 @@
"confirm": "Kirjaudu ulos" "confirm": "Kirjaudu ulos"
}, },
"block_domain": { "block_domain": {
"title": "Are you really, really sure you want to block the entire %s? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain and any of your followers from that domain will be removed.", "title": "Haluatko aivan varmasti estää palvelun %s täysin? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimenpide. Et näe kyseisen palvelun sisältöä julkisilla aikajanoilla tai ilmoituksissa. Tälle palvelulle kuuluvat seuraajasi poistetaan.",
"block_entire_domain": "Estä verkkotunnus" "block_entire_domain": "Estä verkkotunnus"
}, },
"save_photo_failure": { "save_photo_failure": {
"title": "Kuvan tallentaminen epäonnistui", "title": "Kuvan tallentaminen epäonnistui",
"message": "Please enable the photo library access permission to save the photo." "message": "Myönnä kuvakirjaston käyttöoikeus tallentaaksesi kuvan."
}, },
"delete_post": { "delete_post": {
"title": "Haluatko varmasti poistaa tämän julkaisun?", "title": "Haluatko varmasti poistaa tämän julkaisun?",
"message": "Are you sure you want to delete this post?" "message": "Haluatko varmasti poistaa julkaisun?"
}, },
"clean_cache": { "clean_cache": {
"title": "Puhdista välimuisti", "title": "Puhdista välimuisti",
"message": "%s välimuisti tyhjennetty onnistuneesti." "message": "%s välimuisti tyhjennetty onnistuneesti."
}, },
"translation_failed": { "translation_failed": {
"title": "Note", "title": "Huomautus",
"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.", "message": "Käännös epäonnistui. Ehkä palvelimen ylläpito ei ole ottanut käännösominaisuutta käyttöön tai se käyttää Mastodonin vanhempaa versiota, joka ei vielä tue käännöksiä.",
"button": "OK" "button": "OK"
} }
}, },
@ -101,7 +97,11 @@
"title": "Käännetty kielestä %s", "title": "Käännetty kielestä %s",
"unknown_language": "Tuntematon" "unknown_language": "Tuntematon"
}, },
"edit_post": "Muokkaa" "edit_post": "Muokkaa",
"bookmark": "Kirjanmerkki",
"remove_bookmark": "Poista kirjanmerkki",
"follow": "Seuraa käyttäjää %s",
"unfollow": "Lopeta käyttäjän %s seuraaminen"
}, },
"tabs": { "tabs": {
"home": "Koti", "home": "Koti",
@ -185,10 +185,10 @@
"emoji": "Emoji" "emoji": "Emoji"
}, },
"visibility": { "visibility": {
"unlisted": "Everyone can see this post but not display in the public timeline.", "unlisted": "Kaikki voivat nähdä julkaisun, mutta sitä ei näytetä julkisella aikajanalla.",
"private": "Only their followers can see this post.", "private": "Vain heidän seuraajansa voivat nähdä julkaisun.",
"private_from_me": "Only my followers can see this post.", "private_from_me": "Vain omat seuraajat voivat nähdä julkaisun.",
"direct": "Only mentioned user can see this post." "direct": "Vain mainittu käyttäjä voi nähdä julkaisun."
}, },
"translation": { "translation": {
"translated_from": "Käännetty kielestä %s palvelulla %s", "translated_from": "Käännetty kielestä %s palvelulla %s",
@ -257,16 +257,16 @@
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "Ei todennettua linkkiä",
"followers_count": "%@ followers" "followers_count": "%@ seuraajaa"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "Kirjaudu sisään", "log_in": "Kirjaudu sisään",
"learn_more": "Lue lisää", "learn_more": "Lue lisää",
"join_default_server": "Liity mastodon.social-palvelimelle", "join_default_server": "Liity palvelimelle %@",
"pick_server": "Pick another server", "pick_server": "Valitse eri palvelin",
"separator": { "separator": {
"or": "tai" "or": "tai"
}, },
@ -288,9 +288,9 @@
}, },
"login": { "login": {
"title": "Tervetuloa takaisin", "title": "Tervetuloa takaisin",
"subtitle": "Log you in on the server you created your account on.", "subtitle": "Kirjaudu palvelimelle, jolla loit tilisi.",
"server_search_field": { "server_search_field": {
"placeholder": "Enter URL or search for your server" "placeholder": "Syötä URL-osoite tai etsi palvelintasi"
} }
}, },
"server_picker": { "server_picker": {
@ -323,7 +323,7 @@
"category": "KATEGORIA" "category": "KATEGORIA"
}, },
"input": { "input": {
"search_servers_or_enter_url": "Search communities or enter URL" "search_servers_or_enter_url": "Etsi yhteisöjä tai syötä URL-osoite"
}, },
"empty_state": { "empty_state": {
"finding_servers": "Etsistään saatavilla olevia palvelimia...", "finding_servers": "Etsistään saatavilla olevia palvelimia...",
@ -374,7 +374,7 @@
"password": { "password": {
"placeholder": "salasana", "placeholder": "salasana",
"confirmation_placeholder": "Vahvista salasana", "confirmation_placeholder": "Vahvista salasana",
"require": "Your password needs at least:", "require": "Salasanasi on oltava ainakin:",
"character_limit": "8 merkkiä", "character_limit": "8 merkkiä",
"accessibility": { "accessibility": {
"checked": "tarkastettu", "checked": "tarkastettu",
@ -457,13 +457,13 @@
"Publishing": "Julkaistaan julkaisua...", "Publishing": "Julkaistaan julkaisua...",
"accessibility": { "accessibility": {
"logo_label": "Mastodon", "logo_label": "Mastodon",
"logo_hint": "Tap to scroll to top and tap again to previous location" "logo_hint": "Siirry ylös napautuksella ja edelliseen napauttamalla uudestaan"
} }
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Löydä tilejä seurattavaksi", "title": "Suosittua Mastodonissa",
"follow_explain": "Kun seuraat jotakuta, näet hänen julkaisunsa kotisyötteessäsi." "follow_all": "Seuraa kaikkia"
}, },
"compose": { "compose": {
"title": { "title": {
@ -482,15 +482,15 @@
"attachment": { "attachment": {
"photo": "kuva", "photo": "kuva",
"video": "video", "video": "video",
"attachment_broken": "This %s is broken and cant be\nuploaded to Mastodon.", "attachment_broken": "Tämä %s on viallinen, eikä sitä voida\nkopioida Mastodoniin.",
"description_photo": "Kuvaile kuva näkövammaisille...", "description_photo": "Kuvaile kuva näkövammaisille...",
"description_video": "Kuvaile video näkövammaisille...", "description_video": "Kuvaile video näkövammaisille...",
"load_failed": "Load Failed", "load_failed": "Lataus epäonnistui",
"upload_failed": "Upload Failed", "upload_failed": "Lähetys epäonnistui",
"can_not_recognize_this_media_attachment": "Can not recognize this media attachment", "can_not_recognize_this_media_attachment": "Medialiitettä ei tunnisteta",
"attachment_too_large": "Attachment too large", "attachment_too_large": "Liite on liian suuri",
"compressing_state": "Pakataan...", "compressing_state": "Pakataan...",
"server_processing_state": "Server Processing..." "server_processing_state": "Palvelin käsittelee..."
}, },
"poll": { "poll": {
"title": "Kysely", "title": "Kysely",
@ -502,8 +502,8 @@
"three_days": "3 päivää", "three_days": "3 päivää",
"seven_days": "7 päivää", "seven_days": "7 päivää",
"option_number": "Vaihtoehto %ld", "option_number": "Vaihtoehto %ld",
"the_poll_is_invalid": "The poll is invalid", "the_poll_is_invalid": "Kysely on virheellinen",
"the_poll_has_empty_option": "The poll has empty option", "the_poll_has_empty_option": "Kyselyssä on tyhjä vaihtoehto",
"add_option": "Lisää vaihtoehto", "add_option": "Lisää vaihtoehto",
"remove_option": "Poista vaihtoehto", "remove_option": "Poista vaihtoehto",
"move_up": "Siirrä ylemmäs", "move_up": "Siirrä ylemmäs",
@ -519,7 +519,7 @@
"direct": "Vain mainitsemani tilit" "direct": "Vain mainitsemani tilit"
}, },
"auto_complete": { "auto_complete": {
"space_to_add": "Space to add" "space_to_add": "Lisättävä tila"
}, },
"accessibility": { "accessibility": {
"append_attachment": "Lisää liite", "append_attachment": "Lisää liite",
@ -529,8 +529,8 @@
"enable_content_warning": "Ota sisältövaroitus käyttöön", "enable_content_warning": "Ota sisältövaroitus käyttöön",
"disable_content_warning": "Poista sisältövaroitus käytöstä", "disable_content_warning": "Poista sisältövaroitus käytöstä",
"post_visibility_menu": "Julkaisun näkyvyysvalikko", "post_visibility_menu": "Julkaisun näkyvyysvalikko",
"post_options": "Post Options", "post_options": "Julkaisun valinnat",
"posting_as": "Posting as %s" "posting_as": "Julkaistaan tunnuksella %s"
}, },
"keyboard": { "keyboard": {
"discard_post": "Hylkää julkaisu", "discard_post": "Hylkää julkaisu",
@ -549,7 +549,7 @@
}, },
"profile": { "profile": {
"header": { "header": {
"follows_you": "Follows You" "follows_you": "Seuraa sinua"
}, },
"dashboard": { "dashboard": {
"my_posts": "julkaisut", "my_posts": "julkaisut",
@ -561,22 +561,22 @@
"familiar_followers": "yhteiset" "familiar_followers": "yhteiset"
}, },
"fields": { "fields": {
"joined": "Joined", "joined": "Liittynyt",
"add_row": "Lisää rivi", "add_row": "Lisää rivi",
"placeholder": { "placeholder": {
"label": "Nimi", "label": "Nimi",
"content": "Sisältö" "content": "Sisältö"
}, },
"verified": { "verified": {
"short": "Verified on %s", "short": "Vahvistettu %s",
"long": "Ownership of this link was checked on %s" "long": "Linkin omistajuus on tarkastettu %s"
} }
}, },
"segmented_control": { "segmented_control": {
"posts": "Julkaisut", "posts": "Julkaisut",
"replies": "Vastaukset", "replies": "Vastaukset",
"posts_and_replies": "Posts and Replies", "posts_and_replies": "Julkaisut ja vastaukset",
"media": "Media", "media": "Mediat",
"about": "Tietoja" "about": "Tietoja"
}, },
"relationship_action_alert": { "relationship_action_alert": {
@ -590,11 +590,11 @@
}, },
"confirm_block_user": { "confirm_block_user": {
"title": "Estä tili", "title": "Estä tili",
"message": "Confirm to block %s" "message": "Vahvista käyttäjän %s esto"
}, },
"confirm_unblock_user": { "confirm_unblock_user": {
"title": "Unblock Account", "title": "Poista tilin esto",
"message": "Confirm to unblock %s" "message": "Vahvista tilin %s eston poisto"
}, },
"confirm_show_reblogs": { "confirm_show_reblogs": {
"title": "Show Reblogs", "title": "Show Reblogs",
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Kaikki", "people": "People matching \"%s\"",
"people": "Tilit", "profile": "Avaa profiilii @%s@%s",
"hashtags": "Hashtagit", "url": "Avaa URL Mastodonissa",
"posts": "Julkaisut" "hashtag": "Siirry #%s",
},
"empty_state": { "empty_state": {
"no_results": "Ei hakutuloksia" "no_results": "Ei hakutuloksia"
}, },
"recent_search": "Viimeaikaiset", "recent_search": "Viimeaikaiset",
"clear_all": "Tyhjennä kaikki",
"clear": "Tyhjennä" "clear": "Tyhjennä"
} }
}, },
@ -716,13 +716,13 @@
"look_and_feel": { "look_and_feel": {
"title": "Look and Feel", "title": "Look and Feel",
"use_system": "Use System", "use_system": "Use System",
"really_dark": "Really Dark", "really_dark": "Erittäin tumma",
"sorta_dark": "Sorta Dark", "sorta_dark": "Tummahko",
"light": "Light" "light": "Vaalea"
}, },
"notifications": { "notifications": {
"title": "Ilmoitukset", "title": "Ilmoitukset",
"favorites": "Favorites my post", "favorites": "Lisää julkaisuni suosikkeihinsa",
"follows": "Seuraa minua", "follows": "Seuraa minua",
"boosts": "Omien julkaisujen edelleen jaot", "boosts": "Omien julkaisujen edelleen jaot",
"mentions": "Mainitsee minut", "mentions": "Mainitsee minut",
@ -739,7 +739,7 @@
"disable_avatar_animation": "Poista käytöstä animoidut avatarit", "disable_avatar_animation": "Poista käytöstä animoidut avatarit",
"disable_emoji_animation": "Poista käytöstä animoidut emojit", "disable_emoji_animation": "Poista käytöstä animoidut emojit",
"using_default_browser": "Käytä oletusselainta linkkien avaamiseen", "using_default_browser": "Käytä oletusselainta linkkien avaamiseen",
"open_links_in_mastodon": "Open links in Mastodon" "open_links_in_mastodon": "Avaa linkit Mastodonissa"
}, },
"boring_zone": { "boring_zone": {
"title": "Tylsä alue", "title": "Tylsä alue",
@ -761,58 +761,58 @@
} }
}, },
"report": { "report": {
"title_report": "Report", "title_report": "Raportoi",
"title": "Ilmianna %s", "title": "Ilmianna %s",
"step1": "Vaihe 1/2", "step1": "Vaihe 1/2",
"step2": "Vaihe 2/2", "step2": "Vaihe 2/2",
"content1": "Onko julkaisuja, joita haluaisit lisätä ilmiantoon?", "content1": "Onko julkaisuja, joita haluaisit lisätä ilmiantoon?",
"content2": "Onko valvojien syytä tietää tästä ilmiannosta?", "content2": "Onko valvojien syytä tietää tästä ilmiannosta?",
"report_sent_title": "Thanks for reporting, well look into this.", "report_sent_title": "Kiitos ilmoituksesta, tutkimme asiaa.",
"send": "Lähetä ilmianto", "send": "Lähetä ilmianto",
"skip_to_send": "Lähetä ilman kommentteja", "skip_to_send": "Lähetä ilman kommentteja",
"text_placeholder": "Kirjoita tai liitä lisäkommentteja", "text_placeholder": "Kirjoita tai liitä lisäkommentteja",
"reported": "REPORTED", "reported": "ILMOITETTU",
"step_one": { "step_one": {
"step_1_of_4": "Step 1 of 4", "step_1_of_4": "Vaihe 1/4",
"whats_wrong_with_this_post": "What's wrong with this post?", "whats_wrong_with_this_post": "Mitä vikaa tässä julkaisussa on?",
"whats_wrong_with_this_account": "What's wrong with this account?", "whats_wrong_with_this_account": "Mitä vikaa tässä tilissä on?",
"whats_wrong_with_this_username": "What's wrong with %s?", "whats_wrong_with_this_username": "Mitä vikaa käyttäjässä %s on?",
"select_the_best_match": "Select the best match", "select_the_best_match": "Valitse sopivin",
"i_dont_like_it": "I dont like it", "i_dont_like_it": "En pidä siitä",
"it_is_not_something_you_want_to_see": "It is not something you want to see", "it_is_not_something_you_want_to_see": "Tätä ei halua nähdä",
"its_spam": "Its spam", "its_spam": "Se on roskapostia",
"malicious_links_fake_engagement_or_repetetive_replies": "Malicious links, fake engagement, or repetetive replies", "malicious_links_fake_engagement_or_repetetive_replies": "Haitallisia linkkejä, valheellinen osanotto tai toistuvia vastauksia",
"it_violates_server_rules": "It violates server rules", "it_violates_server_rules": "Se rikkoo palvelimen sääntöjä",
"you_are_aware_that_it_breaks_specific_rules": "You are aware that it breaks specific rules", "you_are_aware_that_it_breaks_specific_rules": "Tiedät sen rikkovan tiettyjä sääntöjä",
"its_something_else": "Its something else", "its_something_else": "Jotain muuta",
"the_issue_does_not_fit_into_other_categories": "The issue does not fit into other categories" "the_issue_does_not_fit_into_other_categories": "Ongelma ei sovi muihin kategorioihin"
}, },
"step_two": { "step_two": {
"step_2_of_4": "Step 2 of 4", "step_2_of_4": "Vaihe 2/4",
"which_rules_are_being_violated": "Which rules are being violated?", "which_rules_are_being_violated": "Mitä sääntöjä rikotaan?",
"select_all_that_apply": "Select all that apply", "select_all_that_apply": "Valitse kaikki sopivat",
"i_just_dont_like_it": "I just dont like it" "i_just_dont_like_it": "En vain pidä siitä"
}, },
"step_three": { "step_three": {
"step_3_of_4": "Step 3 of 4", "step_3_of_4": "Vaihe 3/4",
"are_there_any_posts_that_back_up_this_report": "Are there any posts that back up this report?", "are_there_any_posts_that_back_up_this_report": "Onko raporttia tukevia julkaisuja?",
"select_all_that_apply": "Select all that apply" "select_all_that_apply": "Valitse kaikki sopivat"
}, },
"step_four": { "step_four": {
"step_4_of_4": "Step 4 of 4", "step_4_of_4": "Vaihe 4/4",
"is_there_anything_else_we_should_know": "Is there anything else we should know?" "is_there_anything_else_we_should_know": "Pitäisikö meidän tietää jotain muuta?"
}, },
"step_final": { "step_final": {
"dont_want_to_see_this": "Dont want to see this?", "dont_want_to_see_this": "Etkö halua nähdä tä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.": "Kun näet Mastodonissa jotain sellaista, josta et pidä, voit sulkea käyttäjän käyttökokemuksesi ulkopuolelle.",
"unfollow": "Unfollow", "unfollow": "Lopeta seuraaminen",
"unfollowed": "Unfollowed", "unfollowed": "Seuraaminen lopetettiin",
"unfollow_user": "Unfollow %s", "unfollow_user": "Lopeta käyttäjän %s seuraaminen",
"mute_user": "Mute %s", "mute_user": "Mykistä %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": "Et näe heidän julkaisujaan tai jatkojulkaisujaan kotisyötteessäsi. He eivät tiedä sinun mykistäneen heidät.",
"block_user": "Block %s", "block_user": "Estä %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": "He eivät enää voi seurata tai nähdä julkaisujasi, eivätkä myöskään tiedä sinun estäneen heidät.",
"while_we_review_this_you_can_take_action_against_user": "While we review this, you can take action against %s" "while_we_review_this_you_can_take_action_against_user": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimenpiteisiin käyttäjää %s vastaan"
} }
}, },
"preview": { "preview": {
@ -828,18 +828,18 @@
"add_account": "Lisää tili" "add_account": "Lisää tili"
}, },
"bookmark": { "bookmark": {
"title": "Bookmarks" "title": "Kirjanmerkit"
}, },
"followed_tags": { "followed_tags": {
"title": "Followed Tags", "title": "Seuratut tunnisteet",
"header": { "header": {
"posts": "posts", "posts": "julkaisua",
"participants": "participants", "participants": "osallistujaa",
"posts_today": "posts today" "posts_today": "julkaisua tänään"
}, },
"actions": { "actions": {
"follow": "Follow", "follow": "Seuraa",
"unfollow": "Unfollow" "unfollow": "Lopeta seuraaminen"
} }
} }
}, },
@ -875,18 +875,18 @@
}, },
"hashtag": { "hashtag": {
"configuration": { "configuration": {
"display_name": "Hashtag", "display_name": "Aihetunniste",
"description": "Shows a recent post with the selected hashtag." "description": "Näyttää hiljattaisen julkaisun valitusta aihetunnisteesta."
}, },
"not_found": { "not_found": {
"account_name": "John Mastodon", "account_name": "Mikko Mastodon",
"account": "@johnMastodon@no-such.account", "account": "@mikkoMastodon@ei-sellaista.tiliä",
"content": "Sorry, we couldnt find any posts with the hashtag <a>#%@</a>. Please try a <a>#DifferentHashtag</a> or check the widget settings." "content": "Valitettavasti emme löytäneet yhtään julkaisua aihetunnisteella <a>#%@</a>. Kokeile <a>#DifferentHashtag</a> tai tarkista widgetin asetukset."
}, },
"placeholder": { "placeholder": {
"account_name": "John Mastodon", "account_name": "Mikko Mastodon",
"account": "@johnMastodon@no-such.account", "account": "@mikkoMastodon@ei-sellaista.tiliä",
"content": "This is how a post with a <a>#hashtag</a> would look. Pick whichever <a>#hashtag</a> you want in the widget settings." "content": "Tältä aihetunnisteen <a>#aihetunniste</a> julkaisu näyttäisi. Valitse mikä tahansa <a>#aihetunniste</a> widgetin asetuksista."
} }
} }
} }

View File

@ -186,7 +186,7 @@
<key>one</key> <key>one</key>
<string>1 reblog</string> <string>1 reblog</string>
<key>other</key> <key>other</key>
<string>%ld re-blogs</string> <string>%ld reblogs</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.reply</key> <key>plural.count.reply</key>

View File

@ -15,10 +15,6 @@
"title": "Échec du vote", "title": "Échec du vote",
"poll_ended": "Le sondage est terminé" "poll_ended": "Le sondage est terminé"
}, },
"discard_post_content": {
"title": "Abandonner le brouillon",
"message": "Confirmez pour abandonner le contenu de votre message."
},
"publish_post_failure": { "publish_post_failure": {
"title": "La publication a échoué", "title": "La publication a échoué",
"message": "La publication a échoué.\nVeuillez vérifier votre accès à Internet.", "message": "La publication a échoué.\nVeuillez vérifier votre accès à Internet.",
@ -101,7 +97,11 @@
"title": "Traduit depuis %s", "title": "Traduit depuis %s",
"unknown_language": "Inconnu" "unknown_language": "Inconnu"
}, },
"edit_post": "Éditer" "edit_post": "Éditer",
"bookmark": "Ajouter aux signets",
"remove_bookmark": "Supprimer le signet",
"follow": "Sabonner à %s",
"unfollow": "Se désabonner de %s"
}, },
"tabs": { "tabs": {
"home": "Accueil", "home": "Accueil",
@ -206,12 +206,12 @@
"buttons": { "buttons": {
"reblogs_title": "Reblogs", "reblogs_title": "Reblogs",
"favorites_title": "Favoris", "favorites_title": "Favoris",
"edit_history_title": "Modifier l'historique", "edit_history_title": "Historique des modifications",
"edit_history_detail": "Dernière modification %s" "edit_history_detail": "Dernière modification %s"
}, },
"edited_at_timestamp_prefix": "Édité %s", "edited_at_timestamp_prefix": "Édité %s",
"edit_history": { "edit_history": {
"title": "Modifier l'historique", "title": "Historique des modifications",
"original_post": "Message original · %s" "original_post": "Message original · %s"
} }
}, },
@ -258,14 +258,14 @@
}, },
"user_list": { "user_list": {
"no_verified_link": "Lien non vérifié", "no_verified_link": "Lien non vérifié",
"followers_count": "%@ abonnés" "followers_count": "%@ abonné·e·s"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "Se connecter", "log_in": "Se connecter",
"learn_more": "En savoir plus", "learn_more": "En savoir plus",
"join_default_server": "Rejoindre mastodon.social", "join_default_server": "Rejoindre %@",
"pick_server": "Trouver un autre serveur", "pick_server": "Trouver un autre serveur",
"separator": { "separator": {
"or": "ou" "or": "ou"
@ -344,7 +344,7 @@
"no_server_selected_hint": "Nous choisirons un serveur basé sur votre langue si vous continuez sans en choisir un." "no_server_selected_hint": "Nous choisirons un serveur basé sur votre langue si vous continuez sans en choisir un."
}, },
"privacy": { "privacy": {
"title": "Confidentialité", "title": "Vie privée",
"description": "Bien que lapplication Mastodon ne collecte aucune donnée, le serveur auquel vous vous inscrivez peut avoir une politique différente. Prenez une minute pour examiner et accepter la politique de confidentialité de lapplication Mastodon ainsi que celle de votre serveur.", "description": "Bien que lapplication Mastodon ne collecte aucune donnée, le serveur auquel vous vous inscrivez peut avoir une politique différente. Prenez une minute pour examiner et accepter la politique de confidentialité de lapplication Mastodon ainsi que celle de votre serveur.",
"policy": { "policy": {
"ios": "Politique de confidentialité - Mastodon pour iOS", "ios": "Politique de confidentialité - Mastodon pour iOS",
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Trouver des personnes à suivre", "title": "Populaire sur Mastodon",
"follow_explain": "Quand vous suivez quelqu'un, vous verrez leurs messages dans votre flux daccueil." "follow_all": "Tout suivre"
}, },
"compose": { "compose": {
"title": { "title": {
@ -515,7 +515,7 @@
"visibility": { "visibility": {
"public": "Public", "public": "Public",
"unlisted": "Non listé", "unlisted": "Non listé",
"private": "Abonnés seulement", "private": "Abonné·e·s seulement",
"direct": "Seulement les personnes que je mentionne" "direct": "Seulement les personnes que je mentionne"
}, },
"auto_complete": { "auto_complete": {
@ -553,11 +553,11 @@
}, },
"dashboard": { "dashboard": {
"my_posts": "messages", "my_posts": "messages",
"my_following": "abonnement", "my_following": "abonnements",
"my_followers": "abonnés", "my_followers": "abonné·e·s",
"other_posts": "publications", "other_posts": "publications",
"other_following": "abonnement", "other_following": "abonnement",
"other_followers": "abonnés", "other_followers": "abonné·e·s",
"familiar_followers": "mutuel" "familiar_followers": "mutuel"
}, },
"fields": { "fields": {
@ -617,7 +617,7 @@
"footer": "Les abonné·e·s issus des autres serveurs ne sont pas affiché·e·s." "footer": "Les abonné·e·s issus des autres serveurs ne sont pas affiché·e·s."
}, },
"following": { "following": {
"title": "abonnement", "title": "abonnements",
"footer": "Les abonnés issus des autres serveurs ne sont pas affichés." "footer": "Les abonnés issus des autres serveurs ne sont pas affichés."
}, },
"familiarFollowers": { "familiarFollowers": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Tout", "people": "People matching \"%s\"",
"people": "Personnes", "profile": "Aller à @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Publications" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Aucun résultat" "no_results": "Aucun résultat"
}, },
"recent_search": "Recherches récentes", "recent_search": "Recherches récentes",
"clear_all": "Effacer tout",
"clear": "Effacer" "clear": "Effacer"
} }
}, },
@ -682,7 +682,7 @@
"Mentions": "Mentions" "Mentions": "Mentions"
}, },
"notification_description": { "notification_description": {
"followed_you": "sest abonné à vous", "followed_you": "sest abonné·e à vous",
"favorited_your_post": "a ajouté votre message à ses favoris", "favorited_your_post": "a ajouté votre message à ses favoris",
"reblogged_your_post": "a partagé votre message", "reblogged_your_post": "a partagé votre message",
"mentioned_you": "vous a mentionné", "mentioned_you": "vous a mentionné",
@ -728,7 +728,7 @@
"mentions": "Me mentionne", "mentions": "Me mentionne",
"trigger": { "trigger": {
"anyone": "nimporte qui", "anyone": "nimporte qui",
"follower": "un abonné", "follower": "un·e abonné·e",
"follow": "toute personne que je suis", "follow": "toute personne que je suis",
"noone": "personne", "noone": "personne",
"title": "Me notifier lorsque" "title": "Me notifier lorsque"
@ -856,21 +856,21 @@
"followers_count": { "followers_count": {
"configuration_display_name": "Abonné·e·s", "configuration_display_name": "Abonné·e·s",
"configuration_description": "Afficher le nombre d'abonnés.", "configuration_description": "Afficher le nombre d'abonnés.",
"title": "ABONNES", "title": "ABONNÉ·E·S",
"followers_today": "%s abonnés aujourd'hui" "followers_today": "%s abonné·e·s aujourd'hui"
}, },
"multiple_followers": { "multiple_followers": {
"configuration_display_name": "Abonnés multiples", "configuration_display_name": "Abonné·e·s multiples",
"configuration_description": "Afficher le nombre d'abonnés pour plusieurs comptes.", "configuration_description": "Afficher le nombre d'abonnés pour plusieurs comptes.",
"mock_user": { "mock_user": {
"display_name": "Autres abonnés", "display_name": "Autres abonné·e·s",
"account_name": "another@follower.social" "account_name": "another@follower.social"
} }
}, },
"latest_followers": { "latest_followers": {
"configuration_display_name": "Derniers abonnés", "configuration_display_name": "Derniers abonné·e·s",
"configuration_description": "Afficher les derniers abonnés.", "configuration_description": "Afficher les derniers abonnés.",
"title": "Derniers abonnés", "title": "Derniers abonné·e·s",
"last_update": "Dernière mise à jour: %s" "last_update": "Dernière mise à jour: %s"
}, },
"hashtag": { "hashtag": {

View File

@ -15,10 +15,6 @@
"title": "Dhfhàillig leis a bhòt", "title": "Dhfhàillig leis a bhòt",
"poll_ended": "Thàinig an cunntas-bheachd gu crìoch" "poll_ended": "Thàinig an cunntas-bheachd gu crìoch"
}, },
"discard_post_content": {
"title": "Tilg air falbh an dreachd",
"message": "Dearbh tilgeil air falbh susbaint a phuist a sgrìobh thu."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Dhfhàillig leis an fhoillseachadh", "title": "Dhfhàillig leis an fhoillseachadh",
"message": "Cha deach leinn am post fhoillseachadh.\nThoir sùil air a cheangal agad ris an eadar-lìon.", "message": "Cha deach leinn am post fhoillseachadh.\nThoir sùil air a cheangal agad ris an eadar-lìon.",
@ -88,7 +84,7 @@
"share_post": "Co-roinn am post", "share_post": "Co-roinn am post",
"open_in_safari": "Fosgail ann an Safari", "open_in_safari": "Fosgail ann an Safari",
"open_in_browser": "Fosgail sa bhrabhsair", "open_in_browser": "Fosgail sa bhrabhsair",
"find_people": "Lorg daoine a leanas tu", "find_people": "Lorg daoine gus an leantainn",
"manually_search": "Lorg a làimh na àite", "manually_search": "Lorg a làimh na àite",
"skip": "Leum thairis air", "skip": "Leum thairis air",
"reply": "Freagair", "reply": "Freagair",
@ -101,7 +97,11 @@
"title": "Eadar-theangaich o: %s", "title": "Eadar-theangaich o: %s",
"unknown_language": "Chan eil fhios" "unknown_language": "Chan eil fhios"
}, },
"edit_post": "Deasaich" "edit_post": "Deasaich",
"bookmark": "Comharra-lìn",
"remove_bookmark": "Thoir air falbh an comharra-lìn",
"follow": "Lean %s",
"unfollow": "Na lean %s tuilleadh"
}, },
"tabs": { "tabs": {
"home": "Dachaigh", "home": "Dachaigh",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Clàraich a-steach", "log_in": "Clàraich a-steach",
"learn_more": "Barrachd fiosrachaidh", "learn_more": "Barrachd fiosrachaidh",
"join_default_server": "Faigh ballrachd air mastodon.social", "join_default_server": "Faigh ballrachd aig %@",
"pick_server": "Tagh frithealaiche eile", "pick_server": "Tagh frithealaiche eile",
"separator": { "separator": {
"or": "no" "or": "no"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Lorg daoine a leanas tu", "title": "Fèillmhor air Mastodon",
"follow_explain": "Nuair a leanas tu cuideigin, chì thu na puist aca air inbhir na dachaigh agad." "follow_all": "Lean na h-uile"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Na h-uile", "people": "People matching \"%s\"",
"people": "Daoine", "profile": "Go to @%s@%s",
"hashtags": "Tagaichean hais", "url": "Open URL in Mastodon",
"posts": "Postaichean" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Gun toradh" "no_results": "Gun toradh"
}, },
"recent_search": "Na lorg thu o chionn goirid", "recent_search": "Na lorg thu o chionn goirid",
"clear_all": "Clear all",
"clear": "Falamhaich" "clear": "Falamhaich"
} }
}, },
@ -784,7 +784,7 @@
"malicious_links_fake_engagement_or_repetetive_replies": "Ceanglaichean droch-rùnach, conaltradh fuadain no an dearbh fhreagairt a-rithist s a-rithist", "malicious_links_fake_engagement_or_repetetive_replies": "Ceanglaichean droch-rùnach, conaltradh fuadain no an dearbh fhreagairt a-rithist s a-rithist",
"it_violates_server_rules": "Tha e a briseadh riaghailtean an fhrithealaiche", "it_violates_server_rules": "Tha e a briseadh riaghailtean an fhrithealaiche",
"you_are_aware_that_it_breaks_specific_rules": "Mhothaich thu gu bheil e a briseadh riaghailtean sònraichte", "you_are_aware_that_it_breaks_specific_rules": "Mhothaich thu gu bheil e a briseadh riaghailtean sònraichte",
"its_something_else": "S rud eile a tha ann", "its_something_else": "S e rud eile a tha ann",
"the_issue_does_not_fit_into_other_categories": "Chan eil na roinnean-seòrsa eile iomchaidh dhan chùis" "the_issue_does_not_fit_into_other_categories": "Chan eil na roinnean-seòrsa eile iomchaidh dhan chùis"
}, },
"step_two": { "step_two": {

View File

@ -15,10 +15,6 @@
"title": "Fallou a votación", "title": "Fallou a votación",
"poll_ended": "A enquisa rematou" "poll_ended": "A enquisa rematou"
}, },
"discard_post_content": {
"title": "Descartar Borrador",
"message": "Confirma que queres descartar o contido do borrador."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Fallou a publicación", "title": "Fallou a publicación",
"message": "Fallou a publicación.\nComproba a conexión a internet.", "message": "Fallou a publicación.\nComproba a conexión a internet.",
@ -101,7 +97,11 @@
"title": "Traducido do %s", "title": "Traducido do %s",
"unknown_language": "Descoñecido" "unknown_language": "Descoñecido"
}, },
"edit_post": "Editar" "edit_post": "Editar",
"bookmark": "Marcar",
"remove_bookmark": "Eliminar Marcador",
"follow": "Segue a %s",
"unfollow": "Deixa de seguir a %s"
}, },
"tabs": { "tabs": {
"home": "Inicio", "home": "Inicio",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Acceder", "log_in": "Acceder",
"learn_more": "Saber máis", "learn_more": "Saber máis",
"join_default_server": "Únete a mastodon.social", "join_default_server": "Únete a %@",
"pick_server": "Elixe outro servidor", "pick_server": "Elixe outro servidor",
"separator": { "separator": {
"or": "ou" "or": "ou"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Atopar persoas para seguir", "title": "Popular en Mastodon",
"follow_explain": "Cando sigas a alguén verás as súas publicacións na cronoloxía de inicio." "follow_all": "Seguir a todas"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Todo", "people": "People matching \"%s\"",
"people": "Persoas", "profile": "Go to @%s@%s",
"hashtags": "Cancelos", "url": "Open URL in Mastodon",
"posts": "Publicacións" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Sen resultados" "no_results": "Sen resultados"
}, },
"recent_search": "Buscas recentes", "recent_search": "Buscas recentes",
"clear_all": "Clear all",
"clear": "Limpar" "clear": "Limpar"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Gagal Voting", "title": "Gagal Voting",
"poll_ended": "Japat telah berakhir" "poll_ended": "Japat telah berakhir"
}, },
"discard_post_content": {
"title": "Hapus Draf",
"message": "Konfirmasi untuk mengabaikan postingan yang dibuat."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Gagal Mempublikasikan", "title": "Gagal Mempublikasikan",
"message": "Gagal mempublikasikan postingan.\nMohon periksa koneksi Internet Anda.", "message": "Gagal mempublikasikan postingan.\nMohon periksa koneksi Internet Anda.",
@ -101,7 +97,11 @@
"title": "Terjemahkan dari %s", "title": "Terjemahkan dari %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Beranda", "home": "Beranda",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Login", "log_in": "Login",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Temukan Orang untuk Diikuti", "title": "Popular on Mastodon",
"follow_explain": "Ketika Anda mengikuti seseorang, Anda akan melihat postingan mereka di beranda Anda." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Semua", "people": "People matching \"%s\"",
"people": "Orang", "profile": "Go to @%s@%s",
"hashtags": "Tagar", "url": "Open URL in Mastodon",
"posts": "Postingan" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Tidak ada hasil" "no_results": "Tidak ada hasil"
}, },
"recent_search": "Pencarian terbaru", "recent_search": "Pencarian terbaru",
"clear_all": "Clear all",
"clear": "Hapus" "clear": "Hapus"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Greiðsla atkvæðis mistókst", "title": "Greiðsla atkvæðis mistókst",
"poll_ended": "Könnuninni er lokið" "poll_ended": "Könnuninni er lokið"
}, },
"discard_post_content": {
"title": "Henda drögum",
"message": "Staðfestu til að henda efni úr saminni færslu."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Mistókst að birta", "title": "Mistókst að birta",
"message": "Mistókst að birta færsluna.\nAthugaðu nettenginguna þína.", "message": "Mistókst að birta færsluna.\nAthugaðu nettenginguna þína.",
@ -101,7 +97,11 @@
"title": "Þýða úr %s", "title": "Þýða úr %s",
"unknown_language": "Óþekkt" "unknown_language": "Óþekkt"
}, },
"edit_post": "Breyta" "edit_post": "Breyta",
"bookmark": "Bókamerki",
"remove_bookmark": "Fjarlægja bókamerki",
"follow": "Fylgjast með %s",
"unfollow": "Hætta að fylgjast með %s"
}, },
"tabs": { "tabs": {
"home": "Heim", "home": "Heim",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Skrá inn", "log_in": "Skrá inn",
"learn_more": "Kanna nánar", "learn_more": "Kanna nánar",
"join_default_server": "Taka þátt á mastodon.social", "join_default_server": "Taka þátt í %@",
"pick_server": "Veldu annan netþjón", "pick_server": "Veldu annan netþjón",
"separator": { "separator": {
"or": "eða" "or": "eða"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Finndu fólk til að fylgjast með", "title": "Vinsælt á Mastodon",
"follow_explain": "Þegar þú fylgist með einhverjum, muntu sjá færslur frá viðkomandi á streyminu þínu." "follow_all": "Fylgjast með öllum"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Allt", "people": "People matching \"%s\"",
"people": "Fólk", "profile": "Go to @%s@%s",
"hashtags": "Myllumerki", "url": "Open URL in Mastodon",
"posts": "Færslur" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Engar niðurstöður" "no_results": "Engar niðurstöður"
}, },
"recent_search": "Nýlegar leitir", "recent_search": "Nýlegar leitir",
"clear_all": "Hreinsa allt",
"clear": "Hreinsa" "clear": "Hreinsa"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Voto fallito", "title": "Voto fallito",
"poll_ended": "Il sondaggio è terminato" "poll_ended": "Il sondaggio è terminato"
}, },
"discard_post_content": {
"title": "Elimina bozza",
"message": "Confermare di scartare il contenuto del post composto."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Pubblicazione fallita", "title": "Pubblicazione fallita",
"message": "Pubblicazione del post fallita.\nPer favore verifica la tua connessione internet.", "message": "Pubblicazione del post fallita.\nPer favore verifica la tua connessione internet.",
@ -101,7 +97,11 @@
"title": "Traduci da %s", "title": "Traduci da %s",
"unknown_language": "Sconosciuto" "unknown_language": "Sconosciuto"
}, },
"edit_post": "Modifica" "edit_post": "Modifica",
"bookmark": "Segnalibro",
"remove_bookmark": "Rimuovi il segnalibro",
"follow": "Segui %s",
"unfollow": "Smetti di seguire %s"
}, },
"tabs": { "tabs": {
"home": "Inizio", "home": "Inizio",
@ -146,7 +146,7 @@
"sensitive_content": "Contenuto sensibile", "sensitive_content": "Contenuto sensibile",
"media_content_warning": "Tocca ovunque per rivelare", "media_content_warning": "Tocca ovunque per rivelare",
"tap_to_reveal": "Tocca per rivelare", "tap_to_reveal": "Tocca per rivelare",
"load_embed": "Carica Incorpora", "load_embed": "Carica l'incorporato",
"link_via_user": "%s tramite %s", "link_via_user": "%s tramite %s",
"poll": { "poll": {
"vote": "Vota", "vote": "Vota",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Accedi", "log_in": "Accedi",
"learn_more": "Scopri di più", "learn_more": "Scopri di più",
"join_default_server": "Unisciti a mastodon.social", "join_default_server": "Unisciti a %@",
"pick_server": "Scegli un altro server", "pick_server": "Scegli un altro server",
"separator": { "separator": {
"or": "o" "or": "o"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Trova alcune persone da seguire", "title": "Popolare su Mastodon",
"follow_explain": "Quando segui qualcuno, vedrai i loro post nella tua home feed." "follow_all": "Segui tutti"
}, },
"compose": { "compose": {
"title": { "title": {
@ -613,7 +613,7 @@
} }
}, },
"follower": { "follower": {
"title": "seguace", "title": "seguaci",
"footer": "I seguaci da altri server non vengono visualizzati." "footer": "I seguaci da altri server non vengono visualizzati."
}, },
"following": { "following": {
@ -625,7 +625,7 @@
"followed_by_names": "Seguito da %s" "followed_by_names": "Seguito da %s"
}, },
"favorited_by": { "favorited_by": {
"title": "Preferito Da" "title": "Preferito da"
}, },
"reblogged_by": { "reblogged_by": {
"title": "Condiviso Da" "title": "Condiviso Da"
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Tutto", "people": "People matching \"%s\"",
"people": "Persone", "profile": "Vai a @%s@%s",
"hashtags": "Hashtags", "url": "Apri l'URL su Mastodon",
"posts": "Post" "hashtag": "Vai a #%s",
},
"empty_state": { "empty_state": {
"no_results": "Nessun risultato" "no_results": "Nessun risultato"
}, },
"recent_search": "Ricerche recenti", "recent_search": "Ricerche recenti",
"clear_all": "Cancella tutto",
"clear": "Cancella" "clear": "Cancella"
} }
}, },
@ -831,7 +831,7 @@
"title": "Segnalibri" "title": "Segnalibri"
}, },
"followed_tags": { "followed_tags": {
"title": "Etichette seguite", "title": "Hashtag seguiti",
"header": { "header": {
"posts": "post", "posts": "post",
"participants": "partecipanti", "participants": "partecipanti",

View File

@ -15,10 +15,6 @@
"title": "投票の失敗", "title": "投票の失敗",
"poll_ended": "投票は終了しました" "poll_ended": "投票は終了しました"
}, },
"discard_post_content": {
"title": "投稿を破棄しますか?",
"message": "この操作は取り消しできません。下書きは失われます。"
},
"publish_post_failure": { "publish_post_failure": {
"title": "失敗", "title": "失敗",
"message": "投稿に失敗しました。\nインターネットに接続されているか確認してください。", "message": "投稿に失敗しました。\nインターネットに接続されているか確認してください。",
@ -101,7 +97,11 @@
"title": "%sから翻訳", "title": "%sから翻訳",
"unknown_language": "不明" "unknown_language": "不明"
}, },
"edit_post": "編集" "edit_post": "編集",
"bookmark": "ブックマーク",
"remove_bookmark": "ブックマークから削除",
"follow": "%sをフォロー",
"unfollow": "%sをフォロー解除"
}, },
"tabs": { "tabs": {
"home": "ホーム", "home": "ホーム",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "ログイン", "log_in": "ログイン",
"learn_more": "詳しく学ぶ", "learn_more": "詳しく学ぶ",
"join_default_server": "mastodon.social に登録", "join_default_server": "%@ に登録",
"pick_server": "ほかのサーバーをさがす", "pick_server": "ほかのサーバーをさがす",
"separator": { "separator": {
"or": "または" "or": "または"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "フォローする人を探す", "title": "人気のアカウント",
"follow_explain": "誰かをフォローすると、その人の投稿がタイムラインに表示されるようになります。" "follow_all": "すべてフォロー"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "すべて", "people": "People matching \"%s\"",
"people": "人々", "profile": "Go to @%s@%s",
"hashtags": "ハッシュタグ", "url": "Open URL in Mastodon",
"posts": "投稿" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "なし" "no_results": "なし"
}, },
"recent_search": "最近の検索", "recent_search": "最近の検索",
"clear_all": "Clear all",
"clear": "クリア" "clear": "クリア"
} }
}, },
@ -886,7 +886,7 @@
"placeholder": { "placeholder": {
"account_name": "John Mastodon", "account_name": "John Mastodon",
"account": "@johnMastodon@no-such.account", "account": "@johnMastodon@no-such.account",
"content": "This is how a post with a <a>#hashtag</a> would look. Pick whichever <a>#hashtag</a> you want in the widget settings." "content": "<a>#ハッシュタグ</a> 投稿のサンプルです。検索する <a>#ハッシュタグ</a> はウィジェットの設定で指定できます。"
} }
} }
} }

View File

@ -15,10 +15,6 @@
"title": "Tuccḍa deg ufran", "title": "Tuccḍa deg ufran",
"poll_ended": "Tafrant tfuk" "poll_ended": "Tafrant tfuk"
}, },
"discard_post_content": {
"title": "Kkes arewway",
"message": "Sentem i wakken ad yettusefsax ugbur n tsuffeɣt."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Yecceḍ usuffeɣ", "title": "Yecceḍ usuffeɣ",
"message": "Yecceḍ usuffeɣ n tsuffeɣt.\nMa ulac aɣilif, senqed tuqqna-inek internet.", "message": "Yecceḍ usuffeɣ n tsuffeɣt.\nMa ulac aɣilif, senqed tuqqna-inek internet.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Agejdan", "home": "Agejdan",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Qqen", "log_in": "Qqen",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Af imdanen ara tḍefreḍ", "title": "Popular on Mastodon",
"follow_explain": "Mi ara teṭṭafareḍ albaɛḍ, ad twaliḍ tisuffaɣ-is deg usuddem-inek agejdan." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Akk", "people": "People matching \"%s\"",
"people": "Imdanen", "profile": "Go to @%s@%s",
"hashtags": "Ihacṭagen", "url": "Open URL in Mastodon",
"posts": "Tisuffaɣ" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Ulac igemmaḍ" "no_results": "Ulac igemmaḍ"
}, },
"recent_search": "Inadiyen imaynuten", "recent_search": "Inadiyen imaynuten",
"clear_all": "Clear all",
"clear": "Sfeḍ" "clear": "Sfeḍ"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Dengdayîn têkçû", "title": "Dengdayîn têkçû",
"poll_ended": "Rapirsîya qediya" "poll_ended": "Rapirsîya qediya"
}, },
"discard_post_content": {
"title": "Reşnivîsê paşguh bike",
"message": "Bipejrîne ku naveroka şandiyê ya hatiye nivîsandin paşguh bikî."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Weşandin têkçû", "title": "Weşandin têkçû",
"message": "Weşandina şandiyê têkçû.\nJkx girêdana înternetê xwe kontrol bike.", "message": "Weşandina şandiyê têkçû.\nJkx girêdana înternetê xwe kontrol bike.",
@ -101,7 +97,11 @@
"title": "Ji %s wergerîne", "title": "Ji %s wergerîne",
"unknown_language": "Nenas" "unknown_language": "Nenas"
}, },
"edit_post": "Serrast bike" "edit_post": "Serrast bike",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Serrûpel", "home": "Serrûpel",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Têkeve", "log_in": "Têkeve",
"learn_more": "Bêtir fêr bibe", "learn_more": "Bêtir fêr bibe",
"join_default_server": "Tevlî mastodon.social bibe", "join_default_server": "Join %@",
"pick_server": "Rajekarek din hilbijêre", "pick_server": "Rajekarek din hilbijêre",
"separator": { "separator": {
"or": "an jî" "or": "an jî"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Kesên bo ku bişopînî bibîne", "title": "Popular on Mastodon",
"follow_explain": "Gava tu kesekî dişopînî, tu yê şandiyê wan di serrûpelê de bibîne." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Hemû", "people": "People matching \"%s\"",
"people": "Mirov", "profile": "Go to @%s@%s",
"hashtags": "Hashtag", "url": "Open URL in Mastodon",
"posts": "Şandî" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Encam tune" "no_results": "Encam tune"
}, },
"recent_search": "Lêgerînên dawî", "recent_search": "Lêgerînên dawî",
"clear_all": "Clear all",
"clear": "Pak bike" "clear": "Pak bike"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "투표 실패", "title": "투표 실패",
"poll_ended": "투표가 끝났습니다" "poll_ended": "투표가 끝났습니다"
}, },
"discard_post_content": {
"title": "초안 버리기",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "게시 실패", "title": "게시 실패",
"message": "글을 게시하는데 실패했습니다.\n인터넷 연결을 확인해 주세요.", "message": "글을 게시하는데 실패했습니다.\n인터넷 연결을 확인해 주세요.",
@ -101,7 +97,11 @@
"title": "%s에서 번역됨", "title": "%s에서 번역됨",
"unknown_language": "알 수 없음" "unknown_language": "알 수 없음"
}, },
"edit_post": "수정" "edit_post": "수정",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "홈", "home": "홈",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "로그인", "log_in": "로그인",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "전부", "people": "People matching \"%s\"",
"people": "사람", "profile": "Go to @%s@%s",
"hashtags": "해시태그", "url": "Open URL in Mastodon",
"posts": "게시물" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "결과가 없습니다" "no_results": "결과가 없습니다"
}, },
"recent_search": "최근 검색", "recent_search": "최근 검색",
"clear_all": "Clear all",
"clear": "모두 지우기" "clear": "모두 지우기"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Balsošanas Neveiksme", "title": "Balsošanas Neveiksme",
"poll_ended": "Aptauja ir noslēgusies" "poll_ended": "Aptauja ir noslēgusies"
}, },
"discard_post_content": {
"title": "Atmest malnrakstu",
"message": "Apstiprini, lai atmestu izveidotās ziņas saturu."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publicēšanas Neveiksme", "title": "Publicēšanas Neveiksme",
"message": "Neizdevās publicēt ziņu.\nLūdzu, pārbaudi savu interneta savienojumu.", "message": "Neizdevās publicēt ziņu.\nLūdzu, pārbaudi savu interneta savienojumu.",
@ -101,7 +97,11 @@
"title": "Tulkot no %s", "title": "Tulkot no %s",
"unknown_language": "Nezināms" "unknown_language": "Nezināms"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Sākums", "home": "Sākums",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Pieteikties", "log_in": "Pieteikties",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Atrodi Cilvēkus kam Sekot", "title": "Popular on Mastodon",
"follow_explain": "Kad seko kādam, tu redzēsi viņu ziņas savā mājas plūsmā." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Visi", "people": "People matching \"%s\"",
"people": "Cilvēki", "profile": "Go to @%s@%s",
"hashtags": "Tēmturi", "url": "Open URL in Mastodon",
"posts": "Ziņas" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Nav rezultātu" "no_results": "Nav rezultātu"
}, },
"recent_search": "Nesen meklētais", "recent_search": "Nesen meklētais",
"clear_all": "Clear all",
"clear": "Notīrīt" "clear": "Notīrīt"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "မဲပေးမှု မအောင်မြင်ခြင်း", "title": "မဲပေးမှု မအောင်မြင်ခြင်း",
"poll_ended": "စစ်တမ်းကောက်မှု ပြီးဆုံးပါပြီ" "poll_ended": "စစ်တမ်းကောက်မှု ပြီးဆုံးပါပြီ"
}, },
"discard_post_content": {
"title": "မူကြမ်းကို ပယ်ဖျက်ပါ",
"message": "ရေးသားထားသောမူကြမ်းကို ပယ်ဖျက်ရန် အတည်ပြုပါ"
},
"publish_post_failure": { "publish_post_failure": {
"title": "ပို့စ်တင်ခြင်း မအောင်မြင်မှု", "title": "ပို့စ်တင်ခြင်း မအောင်မြင်မှု",
"message": "ပို့စ်တင်ခြင်း မအောင်မြင်ပါ၊ သင်၏ အင်တာနက်ချိတ်ဆက်မှုကို စစ်ဆေးပါ။", "message": "ပို့စ်တင်ခြင်း မအောင်မြင်ပါ၊ သင်၏ အင်တာနက်ချိတ်ဆက်မှုကို စစ်ဆေးပါ။",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "အိမ်", "home": "အိမ်",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "လော့ခ်အင်ဝင်ရန်", "log_in": "လော့ခ်အင်ဝင်ရန်",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Stemmen Mislukt", "title": "Stemmen Mislukt",
"poll_ended": "De peiling is beëindigd" "poll_ended": "De peiling is beëindigd"
}, },
"discard_post_content": {
"title": "Verwijder concept",
"message": "Bevestig het verwijderen van het conceptbericht."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publicatiefout", "title": "Publicatiefout",
"message": "Het publiceren van het bericht is mislukt. Controleer je internetverbinding.", "message": "Het publiceren van het bericht is mislukt. Controleer je internetverbinding.",
@ -101,7 +97,11 @@
"title": "Vertaald uit het %s", "title": "Vertaald uit het %s",
"unknown_language": "Onbekend" "unknown_language": "Onbekend"
}, },
"edit_post": "Bewerken" "edit_post": "Bewerken",
"bookmark": "Bladwijzer toevoegen",
"remove_bookmark": "Bladwijzer verwijderen",
"follow": "Volg %s",
"unfollow": "Ontvolg %s"
}, },
"tabs": { "tabs": {
"home": "Start", "home": "Start",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Inloggen", "log_in": "Inloggen",
"learn_more": "Meer leren", "learn_more": "Meer leren",
"join_default_server": "Registreren op mastodon.social", "join_default_server": "Join %@",
"pick_server": "Kies een andere server", "pick_server": "Kies een andere server",
"separator": { "separator": {
"or": "of" "or": "of"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Zoek mensen om te volgen", "title": "Populair op Mastodon",
"follow_explain": "Wanneer je iemand volgt, zie je hun berichten op jouw starttijdlijn." "follow_all": "Iedereen volgen"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Alles", "people": "People matching \"%s\"",
"people": "Gebruikers", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Berichten" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Geen resultaten" "no_results": "Geen resultaten"
}, },
"recent_search": "Recente zoekopdrachten", "recent_search": "Recente zoekopdrachten",
"clear_all": "Clear all",
"clear": "Wissen" "clear": "Wissen"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Niepowodzenie głosowania", "title": "Niepowodzenie głosowania",
"poll_ended": "Ankieta zakończyła się" "poll_ended": "Ankieta zakończyła się"
}, },
"discard_post_content": {
"title": "Anuluj wersje roboczą",
"message": "Potwierdź odrzucenie treści posta."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Błąd publikowania", "title": "Błąd publikowania",
"message": "Nie udało się opublikować posta.\nSprawdź swoje połączenie internetowe.", "message": "Nie udało się opublikować posta.\nSprawdź swoje połączenie internetowe.",
@ -101,7 +97,11 @@
"title": "Przetłumacz z %s", "title": "Przetłumacz z %s",
"unknown_language": "Nieznany" "unknown_language": "Nieznany"
}, },
"edit_post": "Edytuj" "edit_post": "Edytuj",
"bookmark": "Zakładka",
"remove_bookmark": "Usuń zakładkę",
"follow": "Obserwuj %s",
"unfollow": "Przestań obserwować %s"
}, },
"tabs": { "tabs": {
"home": "Strona główna", "home": "Strona główna",
@ -202,7 +202,7 @@
"expand_gif_hint": "Rozszerza GIF. Podwójne dotknięcie i przytrzymaj, aby pokazać akcje", "expand_gif_hint": "Rozszerza GIF. Podwójne dotknięcie i przytrzymaj, aby pokazać akcje",
"expand_video_hint": "Pokazuje odtwarzacz wideo. Dwukrotnie stuknij i przytrzymaj aby pokazać akcje" "expand_video_hint": "Pokazuje odtwarzacz wideo. Dwukrotnie stuknij i przytrzymaj aby pokazać akcje"
}, },
"posted_via_application": "%s via %s", "posted_via_application": "%s przez %s",
"buttons": { "buttons": {
"reblogs_title": "Reblogs", "reblogs_title": "Reblogs",
"favorites_title": "Ulubione", "favorites_title": "Ulubione",
@ -250,34 +250,34 @@
"blocking_warning": "Nie możesz wyświetlić profilu tego użytkownika\ndopóki nie odblokujesz go.\nTwój profil wygląda tak dla nich.", "blocking_warning": "Nie możesz wyświetlić profilu tego użytkownika\ndopóki nie odblokujesz go.\nTwój profil wygląda tak dla nich.",
"user_blocking_warning": "Nie możesz wyświetlić profilu %s\ndopóki nie odblokujesz go.\nTwój profil wygląda tak dla nich.", "user_blocking_warning": "Nie możesz wyświetlić profilu %s\ndopóki nie odblokujesz go.\nTwój profil wygląda tak dla nich.",
"blocked_warning": "Nie możesz zobaczyć profilu tego użytkownika\n dopóki nie odblokują Cię.", "blocked_warning": "Nie możesz zobaczyć profilu tego użytkownika\n dopóki nie odblokują Cię.",
"user_blocked_warning": "You cant view %ss profile\nuntil they unblock you.", "user_blocked_warning": "Nie możesz zobaczyć profilu %s dopóki Cię nie odblokuje.",
"suspended_warning": "Ten użytkownik został zawieszony.", "suspended_warning": "Ten użytkownik został zawieszony.",
"user_suspended_warning": "Konto %s zostało zawieszone." "user_suspended_warning": "Konto %s zostało zawieszone."
} }
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "Niezweryfikowany link",
"followers_count": "%@ followers" "followers_count": "%@ obserwujących"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "Zaloguj się", "log_in": "Zaloguj się",
"learn_more": "Learn more", "learn_more": "Dowiedz się więcej",
"join_default_server": "Join mastodon.social", "join_default_server": "Dołącz do %@",
"pick_server": "Pick another server", "pick_server": "Wybierz inną instancję",
"separator": { "separator": {
"or": "or" "or": "lub"
}, },
"education": { "education": {
"mastodon": { "mastodon": {
"title": "Welcome to Mastodon", "title": "Witaj na Mastodonie",
"description": "Mastodon is a decentralized social network, meaning no single company controls it. Its made up of many independently-run servers, all connected together." "description": "Mastodon to zdecentralizowana sieć społecznościowa, co oznacza że żadna firma nie może nią kontrolować w całości. Składa się z wielu niezależnych od siebie serwerów, które się ze sobą komunikują."
}, },
"servers": { "servers": {
"title": "What are servers?", "title": "Czym są serwery?",
"description": "Every Mastodon account is hosted on a server — each with its own values, rules, & admins. No matter which one you pick, you can follow and interact with people on any server." "description": "Każde konto na Mastodonie jest hostowane na instancjach, które wyróżniają się wartościami, zasadami i administracją. Nieważne, jaką wybierzesz - i tak będziesz mógł/mogła kontaktować się nawet z tymi spoza Twojej instancji."
}, },
"a11y": { "a11y": {
"what_is_mastodon": { "what_is_mastodon": {
@ -287,7 +287,7 @@
} }
}, },
"login": { "login": {
"title": "Welcome back", "title": "Witaj ponownie",
"subtitle": "Zaloguj się na serwerze, na którym utworzyłeś swoje konto.", "subtitle": "Zaloguj się na serwerze, na którym utworzyłeś swoje konto.",
"server_search_field": { "server_search_field": {
"placeholder": "Wprowadź adres URL lub wyszukaj swój serwer" "placeholder": "Wprowadź adres URL lub wyszukaj swój serwer"
@ -300,55 +300,55 @@
"signup_speed": "Szybkość rejestracji", "signup_speed": "Szybkość rejestracji",
"category": { "category": {
"all": "Wszystkie", "all": "Wszystkie",
"all_accessiblity_description": "Category: All", "all_accessiblity_description": "Kategoria: Wszystkie",
"academia": "academia", "academia": "środowiska akademickie",
"activism": "activism", "activism": "aktywizm",
"food": "food", "food": "jedzenie",
"furry": "furry", "furry": "„futrzaki”",
"games": "games", "games": "gry",
"general": "general", "general": "ogólne",
"journalism": "journalism", "journalism": "dziennikarstwo",
"lgbt": "lgbt", "lgbt": "LGBT",
"regional": "regional", "regional": "regionalne",
"art": "art", "art": "sztuka",
"music": "music", "music": "muzyka",
"tech": "tech" "tech": "technologia"
}, },
"see_less": "See Less", "see_less": "Zobacz mniej",
"see_more": "See More" "see_more": "Zobacz więcej"
}, },
"label": { "label": {
"language": "LANGUAGE", "language": "JĘZYK",
"users": "USERS", "users": "UŻYTKOWNICY",
"category": "CATEGORY" "category": "KATEGORIA"
}, },
"input": { "input": {
"search_servers_or_enter_url": "Search communities or enter URL" "search_servers_or_enter_url": "Szukaj społeczności lub wprowadź adres URL"
}, },
"empty_state": { "empty_state": {
"finding_servers": "Finding available servers...", "finding_servers": "Szukanie dostępnych instancji...",
"bad_network": "Something went wrong while loading the data. Check your internet connection.", "bad_network": "Coś poszło nie tak podczas ładowania danych. Sprawdź swoje połączenie internetowe.",
"no_results": "No results" "no_results": "Brak wyników"
}, },
"signup_speed": { "signup_speed": {
"all": "All", "all": "Wszystko",
"instant": "Instant Sign-up", "instant": "Natychmiastowa rejestracja",
"manually_reviewed": "Manual Review" "manually_reviewed": "Ręczne sprawdzenie"
}, },
"language": { "language": {
"all": "All" "all": "Wszystko"
}, },
"search": { "search": {
"placeholder": "Search name or URL" "placeholder": "Nazwa serwera lub jego adres URL"
}, },
"no_server_selected_hint": "Well pick a server based on your language if you continue without making a selection." "no_server_selected_hint": "Wybierzemy Tobie instancję opartą na Twoim języku, jeżeli kontynuujesz bez żadnego wyboru."
}, },
"privacy": { "privacy": {
"title": "Privacy", "title": "Prywatność",
"description": "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your servers privacy policy.", "description": "Choć aplikacja Mastodona nie zbiera żadnych danych na Twój temat, serwer na którym się rejestrujesz może działać zgodnie z inną polityką. Poświęć chwilę na przejrzenie i akceptację polityki prywatności aplikacji Mastodona oraz Twojego serwera.",
"policy": { "policy": {
"ios": "Privacy Policy - Mastodon for iOS", "ios": "Polityka prywatności - Mastodon dla iOS",
"server": "Privacy Policy - %s" "server": "Polityka Prywatności - %s"
}, },
"button": { "button": {
"confirm": "I Agree" "confirm": "I Agree"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -478,27 +478,27 @@
}, },
"content_input_placeholder": "Type or paste whats on your mind", "content_input_placeholder": "Type or paste whats on your mind",
"compose_action": "Publish", "compose_action": "Publish",
"replying_to_user": "replying to %s", "replying_to_user": "odpowiadanie %s",
"attachment": { "attachment": {
"photo": "photo", "photo": "zdjęcie",
"video": "video", "video": "film",
"attachment_broken": "This %s is broken and cant be\nuploaded to Mastodon.", "attachment_broken": "Ten %s jest uszkodzony i nie może zostać\nprzesłany do Mastodona.",
"description_photo": "Describe the photo for the visually-impaired...", "description_photo": "Describe the photo for the visually-impaired...",
"description_video": "Describe the video for the visually-impaired...", "description_video": "Describe the video for the visually-impaired...",
"load_failed": "Load Failed", "load_failed": "Załadowanie nie powiodło się",
"upload_failed": "Upload Failed", "upload_failed": "Nie udało się przesłać",
"can_not_recognize_this_media_attachment": "Can not recognize this media attachment", "can_not_recognize_this_media_attachment": "Nie można rozpoznać tego załącznika",
"attachment_too_large": "Attachment too large", "attachment_too_large": "Załącznik jest zbyt duży",
"compressing_state": "Compressing...", "compressing_state": "Kompresja...",
"server_processing_state": "Server Processing..." "server_processing_state": "Przetwarzanie..."
}, },
"poll": { "poll": {
"title": "Poll", "title": "Ankieta",
"duration_time": "Duration: %s", "duration_time": "Czas trwania: %s",
"thirty_minutes": "30 minutes", "thirty_minutes": "30 minutach",
"one_hour": "1 Hour", "one_hour": "Godzinie",
"six_hours": "6 Hours", "six_hours": "6 Godzinach",
"one_day": "1 Day", "one_day": "Dobie",
"three_days": "3 Days", "three_days": "3 Days",
"seven_days": "7 Days", "seven_days": "7 Days",
"option_number": "Option %ld", "option_number": "Option %ld",
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Falha ao votar", "title": "Falha ao votar",
"poll_ended": "Essa enquete terminou" "poll_ended": "Essa enquete terminou"
}, },
"discard_post_content": {
"title": "Deletar Rascunho",
"message": "Confirme para descartar o conteúdo da publicação composta."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Falha ao publicar", "title": "Falha ao publicar",
"message": "Falha ao publicar o post.\nPor favor verifique a sua conexão de internet.", "message": "Falha ao publicar o post.\nPor favor verifique a sua conexão de internet.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Início", "home": "Início",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Entrar", "log_in": "Entrar",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Encontre pessoas para seguir", "title": "Popular on Mastodon",
"follow_explain": "Ao seguir alguém, você verá as publicações dessa pessoa na sua página inicial." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Todos", "people": "People matching \"%s\"",
"people": "Pessoas", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Toots" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Sem resultados" "no_results": "Sem resultados"
}, },
"recent_search": "Pesquisas recentes", "recent_search": "Pesquisas recentes",
"clear_all": "Clear all",
"clear": "Limpar" "clear": "Limpar"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Erro na votação", "title": "Erro na votação",
"poll_ended": "Esta sondagem está fechada" "poll_ended": "Esta sondagem está fechada"
}, },
"discard_post_content": {
"title": "Descartar rascunho",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Falha ao publicar", "title": "Falha ao publicar",
"message": "Falha na publicação.\nPor favor verifique a sua ligação à Internet.", "message": "Falha na publicação.\nPor favor verifique a sua ligação à Internet.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Etiquetas", "url": "Open URL in Mastodon",
"posts": "Publicações" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Eșec la vot", "title": "Eșec la vot",
"poll_ended": "Sondajul tău s-a încheiat" "poll_ended": "Sondajul tău s-a încheiat"
}, },
"discard_post_content": {
"title": "Șterge Schită",
"message": "Confirmă renunțarea la conținutul postării."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Eșec la publicare", "title": "Eșec la publicare",
"message": "Datele nu au putut fi încărcate. Te rugăm să-ți verifici conexiunea la internet.", "message": "Datele nu au putut fi încărcate. Te rugăm să-ți verifici conexiunea la internet.",
@ -101,7 +97,11 @@
"title": "Traduceți din %s", "title": "Traduceți din %s",
"unknown_language": "Necunoscut" "unknown_language": "Necunoscut"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Acasă", "home": "Acasă",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Не удалось проголосовать", "title": "Не удалось проголосовать",
"poll_ended": "Опрос уже завершился" "poll_ended": "Опрос уже завершился"
}, },
"discard_post_content": {
"title": "Удалить черновик",
"message": "Вы действительно хотите удалить набранное содержимое поста?"
},
"publish_post_failure": { "publish_post_failure": {
"title": "Ошибка публикации", "title": "Ошибка публикации",
"message": "Не удалось опубликовать пост.\nПожалуйста, проверьте подключение к интернету.", "message": "Не удалось опубликовать пост.\nПожалуйста, проверьте подключение к интернету.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Главная", "home": "Главная",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Вход", "log_in": "Вход",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Подпишитесь на людей", "title": "Popular on Mastodon",
"follow_explain": "Посты людей, на которых вы подписались, будут видны на главной странице." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Всё", "people": "People matching \"%s\"",
"people": "Люди", "profile": "Go to @%s@%s",
"hashtags": "Хэштеги", "url": "Open URL in Mastodon",
"posts": "Посты" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Нет результатов" "no_results": "Нет результатов"
}, },
"recent_search": "Последние запросы", "recent_search": "Последние запросы",
"clear_all": "Clear all",
"clear": "Очистить" "clear": "Очистить"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,7 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "පිවිසෙන්න", "log_in": "පිවිසෙන්න",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Find People to Follow", "title": "Popular on Mastodon",
"follow_explain": "When you follow someone, youll see their posts in your home feed." "follow_all": "Follow all"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "සියල්ල", "people": "People matching \"%s\"",
"people": "මිනිසුන්", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "ප්‍රතිඵල නැත" "no_results": "ප්‍රතිඵල නැත"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "මකන්න" "clear": "මකන්න"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Napaka glasovanja", "title": "Napaka glasovanja",
"poll_ended": "Anketa je zaključena" "poll_ended": "Anketa je zaključena"
}, },
"discard_post_content": {
"title": "Zavrzi osnutek",
"message": "Potrdite za opustitev sestavljene vsebine objave."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Spodletela objava", "title": "Spodletela objava",
"message": "Objava je spodletela.\nPreverite svojo internetno povezavo.", "message": "Objava je spodletela.\nPreverite svojo internetno povezavo.",
@ -101,7 +97,11 @@
"title": "Prevedi iz: %s", "title": "Prevedi iz: %s",
"unknown_language": "Neznano" "unknown_language": "Neznano"
}, },
"edit_post": "Uredi" "edit_post": "Uredi",
"bookmark": "Zaznamek",
"remove_bookmark": "Odstrani zaznamek",
"follow": "Sledi %s",
"unfollow": "Prenehaj slediti %s"
}, },
"tabs": { "tabs": {
"home": "Domov", "home": "Domov",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Prijava", "log_in": "Prijava",
"learn_more": "Več o tem", "learn_more": "Več o tem",
"join_default_server": "Pridruži se mastodon.social", "join_default_server": "Pridruži se %@",
"pick_server": "Izberi drug strežnik", "pick_server": "Izberi drug strežnik",
"separator": { "separator": {
"or": "ali" "or": "ali"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Poiščite osebe, ki jim želite slediti", "title": "Priljubljeno na Mastodonu",
"follow_explain": "Ko nekomu sledite, vidite njihove objave v svojem domačem viru." "follow_all": "Sledi vsem"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Vse", "people": "People matching \"%s\"",
"people": "Ljudje", "profile": "Go to @%s@%s",
"hashtags": "Ključniki", "url": "Open URL in Mastodon",
"posts": "Objave" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Ni rezultatov" "no_results": "Ni rezultatov"
}, },
"recent_search": "Nedavna iskanja", "recent_search": "Nedavna iskanja",
"clear_all": "Clear all",
"clear": "Počisti" "clear": "Počisti"
} }
}, },

View File

@ -344,7 +344,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>%ld timme kvar</string> <string>1 timme kvar</string>
<key>other</key> <key>other</key>
<string>%ld timmar kvar</string> <string>%ld timmar kvar</string>
</dict> </dict>
@ -360,7 +360,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>%ld minut kvar</string> <string>1 minut kvar</string>
<key>other</key> <key>other</key>
<string>%ld minuter kvar</string> <string>%ld minuter kvar</string>
</dict> </dict>

View File

@ -15,10 +15,6 @@
"title": "Röstning misslyckades", "title": "Röstning misslyckades",
"poll_ended": "Omröstningen har avslutats" "poll_ended": "Omröstningen har avslutats"
}, },
"discard_post_content": {
"title": "Släng utkast",
"message": "Bekräfta för att slänga inläggsutkast."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publicering misslyckades", "title": "Publicering misslyckades",
"message": "Det gick inte att publicera inlägget.\nKontrollera din internetanslutning.", "message": "Det gick inte att publicera inlägget.\nKontrollera din internetanslutning.",
@ -101,7 +97,11 @@
"title": "Översätt från %s", "title": "Översätt från %s",
"unknown_language": "Okänt" "unknown_language": "Okänt"
}, },
"edit_post": "Redigera" "edit_post": "Redigera",
"bookmark": "Bokmärk",
"remove_bookmark": "Ta bort bokmärke",
"follow": "Följ %s",
"unfollow": "Avfölj %s"
}, },
"tabs": { "tabs": {
"home": "Hem", "home": "Hem",
@ -109,8 +109,8 @@
"notifications": "Notiser", "notifications": "Notiser",
"profile": "Profil", "profile": "Profil",
"a11y": { "a11y": {
"search": "Search", "search": "Sök",
"explore": "Explore" "explore": "Utforska"
} }
}, },
"keyboard": { "keyboard": {
@ -194,7 +194,7 @@
"translated_from": "Översatt från %s med %s", "translated_from": "Översatt från %s med %s",
"unknown_language": "Okänt", "unknown_language": "Okänt",
"unknown_provider": "Okänd", "unknown_provider": "Okänd",
"show_original": "Show Original" "show_original": "Visa original"
}, },
"media": { "media": {
"accessibility_label": "%s, bilaga %d av %d", "accessibility_label": "%s, bilaga %d av %d",
@ -209,7 +209,7 @@
"edit_history_title": "Edit History", "edit_history_title": "Edit History",
"edit_history_detail": "Last edit %s" "edit_history_detail": "Last edit %s"
}, },
"edited_at_timestamp_prefix": "Edited %s", "edited_at_timestamp_prefix": "Ändrad %s",
"edit_history": { "edit_history": {
"title": "Edit History", "title": "Edit History",
"original_post": "Original Post · %s" "original_post": "Original Post · %s"
@ -257,7 +257,7 @@
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "Ingen verifierad länk",
"followers_count": "%@ följare" "followers_count": "%@ följare"
} }
}, },
@ -265,36 +265,36 @@
"welcome": { "welcome": {
"log_in": "Logga in", "log_in": "Logga in",
"learn_more": "Läs mer", "learn_more": "Läs mer",
"join_default_server": "Join mastodon.social", "join_default_server": "Gå med %@",
"pick_server": "Pick another server", "pick_server": "Hitta en annan server",
"separator": { "separator": {
"or": "or" "or": "eller"
}, },
"education": { "education": {
"mastodon": { "mastodon": {
"title": "Welcome to Mastodon", "title": "Välkommen till Mastodon",
"description": "Mastodon is a decentralized social network, meaning no single company controls it. Its made up of many independently-run servers, all connected together." "description": "Mastodon är ett decentraliserat socialt nätverk, vilket innebär att inget enskilt företag kontrollerar det. Det består av många oberoende servrar, alla sammankopplade."
}, },
"servers": { "servers": {
"title": "What are servers?", "title": "Vad är servrar?",
"description": "Every Mastodon account is hosted on a server — each with its own values, rules, & admins. No matter which one you pick, you can follow and interact with people on any server." "description": "Varje Mastodon-konto finns på en server — var och en med sina värderingar, regler och administratörer. Oavsett vilken du väljer kan du följa och interagera med människor på vilken server som helst."
}, },
"a11y": { "a11y": {
"what_is_mastodon": { "what_is_mastodon": {
"title": "What is Mastodon?" "title": "Vad är Mastodon?"
} }
} }
} }
}, },
"login": { "login": {
"title": "Welcome back", "title": "Välkommen tillbaka",
"subtitle": "Logga in på servern där du skapade ditt konto.", "subtitle": "Logga in på servern där du skapade ditt konto.",
"server_search_field": { "server_search_field": {
"placeholder": "Ange URL eller sök efter din server" "placeholder": "Ange URL eller sök efter din server"
} }
}, },
"server_picker": { "server_picker": {
"title": "Pick Server", "title": "Välj server",
"button": { "button": {
"language": "Språk", "language": "Språk",
"signup_speed": "Sign-up Speed", "signup_speed": "Sign-up Speed",
@ -331,27 +331,27 @@
"no_results": "Inga resultat" "no_results": "Inga resultat"
}, },
"signup_speed": { "signup_speed": {
"all": "All", "all": "Allt",
"instant": "Instant Sign-up", "instant": "Instant Sign-up",
"manually_reviewed": "Manual Review" "manually_reviewed": "Manuell granskning"
}, },
"language": { "language": {
"all": "All" "all": "All"
}, },
"search": { "search": {
"placeholder": "Search name or URL" "placeholder": "Sök namn eller URL"
}, },
"no_server_selected_hint": "Well pick a server based on your language if you continue without making a selection." "no_server_selected_hint": "Vi kommer att välja en server baserat på ditt språk om du fortsätter utan att göra ett val."
}, },
"privacy": { "privacy": {
"title": "Privacy", "title": "Integritet",
"description": "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your servers privacy policy.", "description": "Även om Mastodon-appen inte samlar in någon data kan servern du registrerar dig genom ha en annan policy. Ta en stund till att granska och godkänna Mastodon-appens sekretesspolicy och din servers sekretesspolicy.",
"policy": { "policy": {
"ios": "Integritetspolicy - Mastodon för iOS", "ios": "Integritetspolicy - Mastodon för iOS",
"server": "Integritetspolicy - %s" "server": "Integritetspolicy - %s"
}, },
"button": { "button": {
"confirm": "I Agree" "confirm": "Jag godkänner"
} }
}, },
"register": { "register": {
@ -373,7 +373,7 @@
}, },
"password": { "password": {
"placeholder": "lösenord", "placeholder": "lösenord",
"confirmation_placeholder": "Confirm Password", "confirmation_placeholder": "Bekräfta lösenord",
"require": "Ditt lösenord behöver minst:", "require": "Ditt lösenord behöver minst:",
"character_limit": "8 tecken", "character_limit": "8 tecken",
"accessibility": { "accessibility": {
@ -398,7 +398,7 @@
"reason": { "reason": {
"blocked": "%s innehåller en icke tillåten e-postleverantör", "blocked": "%s innehåller en icke tillåten e-postleverantör",
"unreachable": "%s verkar inte existera", "unreachable": "%s verkar inte existera",
"taken": "%s is already taken. How about:", "taken": "%s är redan tagen. Vad sägs om:",
"reserved": "%s är ett reserverat nyckelord", "reserved": "%s är ett reserverat nyckelord",
"accepted": "%s måste godkännas", "accepted": "%s måste godkännas",
"blank": "%s krävs", "blank": "%s krävs",
@ -422,12 +422,12 @@
"terms_of_service": "användarvillkor", "terms_of_service": "användarvillkor",
"privacy_policy": "integritetspolicy", "privacy_policy": "integritetspolicy",
"button": { "button": {
"confirm": "I Agree" "confirm": "Jag godkänner"
} }
}, },
"confirm_email": { "confirm_email": {
"title": "Check Your Inbox", "title": "Kolla din inkorg",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.", "tap_the_link_we_emailed_to_you_to_verify_your_account": "Klicka på länken som vi har skickat till dig för att bekräfta %@. Vi väntar här.",
"button": { "button": {
"resend": "Skicka igen" "resend": "Skicka igen"
}, },
@ -443,8 +443,8 @@
"open_email_client": "Öppna e-postklient" "open_email_client": "Öppna e-postklient"
}, },
"didnt_get_link": { "didnt_get_link": {
"prefix": "Didnt get a link?", "prefix": "Fick du ingen länk?",
"resend_in": "Resend (%@)", "resend_in": "Skicka igen (%@)",
"resend_now": "Resend now." "resend_now": "Resend now."
} }
}, },
@ -462,14 +462,14 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Hitta personer att följa", "title": "Populärt på Mastodon",
"follow_explain": "När du följer någon, kommer du att se deras inlägg i ditt hemflöde." "follow_all": "Följ alla"
}, },
"compose": { "compose": {
"title": { "title": {
"new_post": "Nytt inlägg", "new_post": "Nytt inlägg",
"new_reply": "Nytt svar", "new_reply": "Nytt svar",
"edit_post": "Edit Post" "edit_post": "Redigera inlägg"
}, },
"media_selection": { "media_selection": {
"camera": "Ta foto", "camera": "Ta foto",
@ -504,10 +504,10 @@
"option_number": "Alternativ %ld", "option_number": "Alternativ %ld",
"the_poll_is_invalid": "Undersökningen är ogiltig", "the_poll_is_invalid": "Undersökningen är ogiltig",
"the_poll_has_empty_option": "Undersökningen har ett tomt alternativ", "the_poll_has_empty_option": "Undersökningen har ett tomt alternativ",
"add_option": "Add Option", "add_option": "Lägg till alternativ",
"remove_option": "Remove Option", "remove_option": "Remove Option",
"move_up": "Move Up", "move_up": "Flytta upp",
"move_down": "Move Down" "move_down": "Flytta ned"
}, },
"content_warning": { "content_warning": {
"placeholder": "Skriv en noggrann varning här..." "placeholder": "Skriv en noggrann varning här..."
@ -541,10 +541,10 @@
"select_visibility_entry": "Välj synlighet - %s" "select_visibility_entry": "Välj synlighet - %s"
}, },
"language": { "language": {
"title": "Post Language", "title": "Inläggsspråk",
"suggested": "Suggested", "suggested": "Suggested",
"recent": "Recent", "recent": "Senaste",
"other": "Other Language…" "other": "Andra språk…"
} }
}, },
"profile": { "profile": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Allt", "people": "People matching \"%s\"",
"people": "Personer", "profile": "Gå till @%s@%s",
"hashtags": "Hashtaggar", "url": "Öppna URL i Mastodon",
"posts": "Inlägg" "hashtag": "Gå till #%s",
},
"empty_state": { "empty_state": {
"no_results": "Inga resultat" "no_results": "Inga resultat"
}, },
"recent_search": "Senaste sökningarna", "recent_search": "Senaste sökningarna",
"clear_all": "Rensa alla",
"clear": "Rensa" "clear": "Rensa"
} }
}, },
@ -845,19 +845,19 @@
}, },
"extension": { "extension": {
"open_in": { "open_in": {
"invalid_link_error": "This doesn't seem to be a valid Mastodon link." "invalid_link_error": "Detta verkar inte vara en giltig Mastodon-länk."
} }
}, },
"widget": { "widget": {
"common": { "common": {
"unsupported_widget_family": "Sorry but this Widget family is unsupported.", "unsupported_widget_family": "Sorry but this Widget family is unsupported.",
"user_not_logged_in": "Please open Mastodon to log in to an Account." "user_not_logged_in": "Öppna Mastodon för att logga in på ett konto."
}, },
"followers_count": { "followers_count": {
"configuration_display_name": "Followers", "configuration_display_name": "Följare",
"configuration_description": "Show number of followers.", "configuration_description": "Visa antal följare.",
"title": "FOLLOWERS", "title": "FÖLJARE",
"followers_today": "%s followers today" "followers_today": "%s följare idag"
}, },
"multiple_followers": { "multiple_followers": {
"configuration_display_name": "Multiple followers", "configuration_display_name": "Multiple followers",
@ -871,7 +871,7 @@
"configuration_display_name": "Latest followers", "configuration_display_name": "Latest followers",
"configuration_description": "Show latest followers.", "configuration_description": "Show latest followers.",
"title": "Latest followers", "title": "Latest followers",
"last_update": "Last update: %s" "last_update": "Senaste uppdatering: %s"
}, },
"hashtag": { "hashtag": {
"configuration": { "configuration": {
@ -881,7 +881,7 @@
"not_found": { "not_found": {
"account_name": "John Mastodon", "account_name": "John Mastodon",
"account": "@johnMastodon@no-such.account", "account": "@johnMastodon@no-such.account",
"content": "Sorry, we couldnt find any posts with the hashtag <a>#%@</a>. Please try a <a>#DifferentHashtag</a> or check the widget settings." "content": "Ledsen, vi kunde inte hitta några inlägg med hashtaggen <a>#%@</a>. Prova en <a>#AnnanHashtagg</a> eller kontrollera widgetinställningarna."
}, },
"placeholder": { "placeholder": {
"account_name": "John Mastodon", "account_name": "John Mastodon",

View File

@ -15,10 +15,6 @@
"title": "การลงคะแนนล้มเหลว", "title": "การลงคะแนนล้มเหลว",
"poll_ended": "การสำรวจความคิดเห็นได้สิ้นสุดแล้ว" "poll_ended": "การสำรวจความคิดเห็นได้สิ้นสุดแล้ว"
}, },
"discard_post_content": {
"title": "ละทิ้งแบบร่าง",
"message": "ยืนยันเพื่อละทิ้งเนื้อหาโพสต์ที่เขียน"
},
"publish_post_failure": { "publish_post_failure": {
"title": "การเผยแพร่ล้มเหลว", "title": "การเผยแพร่ล้มเหลว",
"message": "ไม่สามารถเผยแพร่โพสต์\nโปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณ", "message": "ไม่สามารถเผยแพร่โพสต์\nโปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณ",
@ -101,7 +97,11 @@
"title": "แปลจาก %s", "title": "แปลจาก %s",
"unknown_language": "ไม่รู้จัก" "unknown_language": "ไม่รู้จัก"
}, },
"edit_post": "แก้ไข" "edit_post": "แก้ไข",
"bookmark": "เพิ่มที่คั่นหน้า",
"remove_bookmark": "เอาที่คั่นหน้าออก",
"follow": "ติดตาม %s",
"unfollow": "เลิกติดตาม %s"
}, },
"tabs": { "tabs": {
"home": "หน้าแรก", "home": "หน้าแรก",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "เข้าสู่ระบบ", "log_in": "เข้าสู่ระบบ",
"learn_more": "เรียนรู้เพิ่มเติม", "learn_more": "เรียนรู้เพิ่มเติม",
"join_default_server": "เข้าร่วม mastodon.social", "join_default_server": "เข้าร่วม %@",
"pick_server": "เลือกเซิร์ฟเวอร์อื่น", "pick_server": "เลือกเซิร์ฟเวอร์อื่น",
"separator": { "separator": {
"or": "หรือ" "or": "หรือ"
@ -341,7 +341,7 @@
"search": { "search": {
"placeholder": "ค้นหาชื่อหรือ URL" "placeholder": "ค้นหาชื่อหรือ URL"
}, },
"no_server_selected_hint": "เราจะเลือกเซิร์ฟเวอร์ตามภาษาของคุณหากคุณดำเนินการต่อโดยไม่ได้ทำการเลือก" "no_server_selected_hint": "เราจะเลือกเซิร์ฟเวอร์โดยอิงตามภาษาของคุณหากคุณดำเนินการต่อโดยไม่ได้ทำการเลือก"
}, },
"privacy": { "privacy": {
"title": "ความเป็นส่วนตัว", "title": "ความเป็นส่วนตัว",
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "ค้นหาผู้คนที่จะติดตาม", "title": "เป็นที่นิยมใน Mastodon",
"follow_explain": "เมื่อคุณติดตามใครสักคน คุณจะเห็นโพสต์ของเขาในฟีดหน้าแรกของคุณ" "follow_all": "ติดตามทั้งหมด"
}, },
"compose": { "compose": {
"title": { "title": {
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "ทั้งหมด", "people": "People matching \"%s\"",
"people": "ผู้คน", "profile": "Go to @%s@%s",
"hashtags": "แฮชแท็ก", "url": "Open URL in Mastodon",
"posts": "โพสต์" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "ไม่มีผลลัพธ์" "no_results": "ไม่มีผลลัพธ์"
}, },
"recent_search": "การค้นหาล่าสุด", "recent_search": "การค้นหาล่าสุด",
"clear_all": "Clear all",
"clear": "ล้าง" "clear": "ล้าง"
} }
}, },
@ -671,7 +671,7 @@
"community": "ชุมชน", "community": "ชุมชน",
"for_you": "สำหรับคุณ" "for_you": "สำหรับคุณ"
}, },
"intro": "นี่คือโพสต์ที่กำลังได้รับความสนใจในมุมของ Mastodon ของคุณ" "intro": "นี่คือโพสต์ที่ได้รับความสนใจในมุมของ Mastodon ของคุณ"
}, },
"favorite": { "favorite": {
"title": "รายการโปรด" "title": "รายการโปรด"
@ -834,7 +834,7 @@
"title": "แท็กที่ติดตาม", "title": "แท็กที่ติดตาม",
"header": { "header": {
"posts": "โพสต์", "posts": "โพสต์",
"participants": "ผู้เข้าร่วม", "participants": "ผู้มีส่วนร่วม",
"posts_today": "โพสต์วันนี้" "posts_today": "โพสต์วันนี้"
}, },
"actions": { "actions": {

View File

@ -61,7 +61,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 character left</string> <string>1 karakter kaldı</string>
<key>other</key> <key>other</key>
<string>%ld characters left</string> <string>%ld characters left</string>
</dict> </dict>
@ -184,7 +184,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 re-blog</string> <string>1 yeniden paylaşım</string>
<key>other</key> <key>other</key>
<string>%ld re-blogs</string> <string>%ld re-blogs</string>
</dict> </dict>

View File

@ -15,10 +15,6 @@
"title": "Oy Verme Başarısız", "title": "Oy Verme Başarısız",
"poll_ended": "Anket bitti" "poll_ended": "Anket bitti"
}, },
"discard_post_content": {
"title": "Taslağı Sil",
"message": "Yazdığın gönderiyi paylaşmadan silmek istiyor musun?"
},
"publish_post_failure": { "publish_post_failure": {
"title": "Paylaşılamadı", "title": "Paylaşılamadı",
"message": "Gönderi paylaşılamadı. Lütfen internet bağlantını kontrol et.", "message": "Gönderi paylaşılamadı. Lütfen internet bağlantını kontrol et.",
@ -55,7 +51,7 @@
"translation_failed": { "translation_failed": {
"title": "Note", "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.", "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" "button": "Tamam"
} }
}, },
"controls": { "controls": {
@ -82,7 +78,7 @@
"sign_in": "Giriş Yap", "sign_in": "Giriş Yap",
"see_more": "Daha Fazla Gör", "see_more": "Daha Fazla Gör",
"preview": "Önizleme", "preview": "Önizleme",
"copy": "Copy", "copy": "Kopyala",
"share": "Paylaş", "share": "Paylaş",
"share_user": "%s ile paylaş", "share_user": "%s ile paylaş",
"share_post": "Gönderiyi Paylaş", "share_post": "Gönderiyi Paylaş",
@ -98,10 +94,14 @@
"settings": "Ayarlar", "settings": "Ayarlar",
"delete": "Sil", "delete": "Sil",
"translate_post": { "translate_post": {
"title": "Translate from %s", "title": "%s dilinden çevrildi",
"unknown_language": "Unknown" "unknown_language": "Bilinmeyen"
}, },
"edit_post": "Edit" "edit_post": "Düzenle",
"bookmark": "Yer işareti",
"remove_bookmark": "Yer işaretini kaldır",
"follow": "%s takip et",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Ana Sayfa", "home": "Ana Sayfa",
@ -109,8 +109,8 @@
"notifications": "Bildirimler", "notifications": "Bildirimler",
"profile": "Profil", "profile": "Profil",
"a11y": { "a11y": {
"search": "Search", "search": "Ara",
"explore": "Explore" "explore": "Keşfet"
} }
}, },
"keyboard": { "keyboard": {
@ -169,11 +169,11 @@
"show_image": "Görüntüyü göster", "show_image": "Görüntüyü göster",
"show_gif": "GIF'i göster", "show_gif": "GIF'i göster",
"show_video_player": "Video oynatıcıyı göster", "show_video_player": "Video oynatıcıyı göster",
"share_link_in_post": "Share Link in Post", "share_link_in_post": "Bağlantıyı Gönderide Paylaş",
"tap_then_hold_to_show_menu": "Menüyü göstermek için dokunun ve basılı tutun", "tap_then_hold_to_show_menu": "Menüyü göstermek için dokunun ve basılı tutun",
"a11y_labels": { "a11y_labels": {
"reblog": "Re-blog", "reblog": "Yeniden paylaş",
"unreblog": "Undo re-blog" "unreblog": "Yeniden paylaşımı geri al"
} }
}, },
"tag": { "tag": {
@ -192,9 +192,9 @@
}, },
"translation": { "translation": {
"translated_from": "Translated from %s using %s", "translated_from": "Translated from %s using %s",
"unknown_language": "Unknown", "unknown_language": "Bilinmeyen",
"unknown_provider": "Unknown", "unknown_provider": "Bilinmeyen",
"show_original": "Show Original" "show_original": "Orijinali Göster"
}, },
"media": { "media": {
"accessibility_label": "%s, attachment %d of %d", "accessibility_label": "%s, attachment %d of %d",
@ -205,13 +205,13 @@
"posted_via_application": "%s via %s", "posted_via_application": "%s via %s",
"buttons": { "buttons": {
"reblogs_title": "Reblogs", "reblogs_title": "Reblogs",
"favorites_title": "Favorites", "favorites_title": "Favoriler",
"edit_history_title": "Edit History", "edit_history_title": "Düzenleme Geçmişi",
"edit_history_detail": "Last edit %s" "edit_history_detail": "Son güncelleme: %s"
}, },
"edited_at_timestamp_prefix": "Edited %s", "edited_at_timestamp_prefix": "Edited %s",
"edit_history": { "edit_history": {
"title": "Edit History", "title": "Düzenleme Geçmişi",
"original_post": "Original Post · %s" "original_post": "Original Post · %s"
} }
}, },
@ -257,22 +257,22 @@
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "Doğrulanmamış bağlantı",
"followers_count": "%@ followers" "followers_count": "%@ followers"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "Oturum Aç", "log_in": "Oturum Aç",
"learn_more": "Learn more", "learn_more": "Daha fazla bilgi edin",
"join_default_server": "Join mastodon.social", "join_default_server": "%@ katıl",
"pick_server": "Pick another server", "pick_server": "Başka sunucu seç",
"separator": { "separator": {
"or": "or" "or": "veya"
}, },
"education": { "education": {
"mastodon": { "mastodon": {
"title": "Welcome to Mastodon", "title": "Mastodon'a Hoş Geldin",
"description": "Mastodon is a decentralized social network, meaning no single company controls it. Its made up of many independently-run servers, all connected together." "description": "Mastodon is a decentralized social network, meaning no single company controls it. Its made up of many independently-run servers, all connected together."
}, },
"servers": { "servers": {
@ -281,22 +281,22 @@
}, },
"a11y": { "a11y": {
"what_is_mastodon": { "what_is_mastodon": {
"title": "What is Mastodon?" "title": "Mastodon nedir?"
} }
} }
} }
}, },
"login": { "login": {
"title": "Welcome back", "title": "Tekrar hoş geldiniz",
"subtitle": "Hesabını oluşturduğun sunucuya giriş yap.", "subtitle": "Hesabını oluşturduğun sunucuya giriş yap.",
"server_search_field": { "server_search_field": {
"placeholder": "Bir URL girin ya da sunucunuzu arayın" "placeholder": "Bir URL girin ya da sunucunuzu arayın"
} }
}, },
"server_picker": { "server_picker": {
"title": "Pick Server", "title": "Sunucu Seç",
"button": { "button": {
"language": "Language", "language": "Dil",
"signup_speed": "Sign-up Speed", "signup_speed": "Sign-up Speed",
"category": { "category": {
"all": "Tümü", "all": "Tümü",
@ -331,31 +331,31 @@
"no_results": "Sonuç yok" "no_results": "Sonuç yok"
}, },
"signup_speed": { "signup_speed": {
"all": "All", "all": "Hepsi",
"instant": "Instant Sign-up", "instant": "Instant Sign-up",
"manually_reviewed": "Manual Review" "manually_reviewed": "Manual Review"
}, },
"language": { "language": {
"all": "All" "all": "Hepsi"
}, },
"search": { "search": {
"placeholder": "Search name or URL" "placeholder": "İsim ya da bağlantı arayın"
}, },
"no_server_selected_hint": "Well pick a server based on your language if you continue without making a selection." "no_server_selected_hint": "Well pick a server based on your language if you continue without making a selection."
}, },
"privacy": { "privacy": {
"title": "Privacy", "title": "Gizlilik",
"description": "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your servers privacy policy.", "description": "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your servers privacy policy.",
"policy": { "policy": {
"ios": "Privacy Policy - Mastodon for iOS", "ios": "Gizlilik Politikası - iOS için Mastodon",
"server": "Privacy Policy - %s" "server": "Gizlilik Politikası - %s"
}, },
"button": { "button": {
"confirm": "I Agree" "confirm": "Kabul Ediyorum"
} }
}, },
"register": { "register": {
"title": "Create Account", "title": "Hesap Oluştur",
"input": { "input": {
"avatar": { "avatar": {
"delete": "Sil" "delete": "Sil"
@ -373,7 +373,7 @@
}, },
"password": { "password": {
"placeholder": "parola", "placeholder": "parola",
"confirmation_placeholder": "Confirm Password", "confirmation_placeholder": "Parolanızı Doğrulayın",
"require": "Parolanızda en azından şunlar olmalı:", "require": "Parolanızda en azından şunlar olmalı:",
"character_limit": "8 karakter", "character_limit": "8 karakter",
"accessibility": { "accessibility": {
@ -398,7 +398,7 @@
"reason": { "reason": {
"blocked": "%s izin verilmeyen bir e-posta sağlayıcı içeriyor", "blocked": "%s izin verilmeyen bir e-posta sağlayıcı içeriyor",
"unreachable": "%s mevcut değil", "unreachable": "%s mevcut değil",
"taken": "%s is already taken. How about:", "taken": "%s zaten alınmış. Buna ne dersiniz:",
"reserved": "%s rezerve edilen bir kelime", "reserved": "%s rezerve edilen bir kelime",
"accepted": "%s kabul edilmelidir", "accepted": "%s kabul edilmelidir",
"blank": "%s gerekli", "blank": "%s gerekli",
@ -422,30 +422,30 @@
"terms_of_service": "kullanım şartları", "terms_of_service": "kullanım şartları",
"privacy_policy": "gizlilik politikası", "privacy_policy": "gizlilik politikası",
"button": { "button": {
"confirm": "I Agree" "confirm": "Kabul Ediyorum"
} }
}, },
"confirm_email": { "confirm_email": {
"title": "Check Your Inbox", "title": "Gelen kutunuzu kontrol edin",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.", "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.",
"button": { "button": {
"resend": "Yeniden gönder" "resend": "Yeniden gönder"
}, },
"dont_receive_email": { "dont_receive_email": {
"title": "Check your Email", "title": "E-postanızı kontrol edin",
"description": "E-posta adresinizin doğru olup olmadığını ve doğru ise gereksiz klasörünüzü kontrol edin.", "description": "E-posta adresinizin doğru olup olmadığını ve doğru ise gereksiz klasörünüzü kontrol edin.",
"resend_email": "E-postayı Yeniden Gönder" "resend_email": "E-postayı Yeniden Gönder"
}, },
"open_email_app": { "open_email_app": {
"title": "Check your Inbox.", "title": "Gelen kutunuzu kontrol edin.",
"description": "Size bir e-posta gönderdik. Eğer e-postayı almadıysanız, gereksiz klasörünü kontrol edin.", "description": "Size bir e-posta gönderdik. Eğer e-postayı almadıysanız, gereksiz klasörünü kontrol edin.",
"mail": "Posta", "mail": "Posta",
"open_email_client": "E-posta İstemcisini Aç" "open_email_client": "E-posta İstemcisini Aç"
}, },
"didnt_get_link": { "didnt_get_link": {
"prefix": "Didnt get a link?", "prefix": "Bağlantı gelmedi mi?",
"resend_in": "Resend (%@)", "resend_in": "Resend (%@)",
"resend_now": "Resend now." "resend_now": "Yeniden gönder."
} }
}, },
"home_timeline": { "home_timeline": {
@ -462,14 +462,14 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Takip Edecek İnsanlar Bul", "title": "Mastodon'da popüler",
"follow_explain": "Birisini takip ettiğinizde, ana sayfanızda o kişinin gönderilerini görürsünüz." "follow_all": "Hepsini takip et"
}, },
"compose": { "compose": {
"title": { "title": {
"new_post": "Yeni Gönderi", "new_post": "Yeni Gönderi",
"new_reply": "Yeni Yanıt", "new_reply": "Yeni Yanıt",
"edit_post": "Edit Post" "edit_post": "Gönderiyi Düzenle"
}, },
"media_selection": { "media_selection": {
"camera": "Fotoğraf Çek", "camera": "Fotoğraf Çek",
@ -493,7 +493,7 @@
"server_processing_state": "Sunucu İşliyor..." "server_processing_state": "Sunucu İşliyor..."
}, },
"poll": { "poll": {
"title": "Poll", "title": "Anket",
"duration_time": "Süre: %s", "duration_time": "Süre: %s",
"thirty_minutes": "30 dakika", "thirty_minutes": "30 dakika",
"one_hour": "1 Saat", "one_hour": "1 Saat",
@ -504,10 +504,10 @@
"option_number": "Seçenek %ld", "option_number": "Seçenek %ld",
"the_poll_is_invalid": "Anket geçersiz", "the_poll_is_invalid": "Anket geçersiz",
"the_poll_has_empty_option": "The poll has empty option", "the_poll_has_empty_option": "The poll has empty option",
"add_option": "Add Option", "add_option": "Seçenek Ekle",
"remove_option": "Remove Option", "remove_option": "Seçeneği Kaldır",
"move_up": "Move Up", "move_up": "Yukarı Taşı",
"move_down": "Move Down" "move_down": "Aşağı Taşı"
}, },
"content_warning": { "content_warning": {
"placeholder": "Buraya kesin bir uyarı yazın..." "placeholder": "Buraya kesin bir uyarı yazın..."
@ -541,9 +541,9 @@
"select_visibility_entry": "Görünürlüğü Seç - %s" "select_visibility_entry": "Görünürlüğü Seç - %s"
}, },
"language": { "language": {
"title": "Post Language", "title": "Gönderi dili",
"suggested": "Suggested", "suggested": "Önerilen",
"recent": "Recent", "recent": "En Son",
"other": "Other Language…" "other": "Other Language…"
} }
}, },
@ -552,10 +552,10 @@
"follows_you": "Seni takip ediyor" "follows_you": "Seni takip ediyor"
}, },
"dashboard": { "dashboard": {
"my_posts": "posts", "my_posts": "gönderiler",
"my_following": "following", "my_following": "takip ediliyor",
"my_followers": "followers", "my_followers": "takipçiler",
"other_posts": "posts", "other_posts": "gönderiler",
"other_following": "following", "other_following": "following",
"other_followers": "followers", "other_followers": "followers",
"familiar_followers": "mutuals" "familiar_followers": "mutuals"
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Tümü", "people": "People matching \"%s\"",
"people": "İnsanlar", "profile": "Go to @%s@%s",
"hashtags": "Etiketler", "url": "Open URL in Mastodon",
"posts": "Gönderiler" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Sonuç yok" "no_results": "Sonuç yok"
}, },
"recent_search": "Son aramalar", "recent_search": "Son aramalar",
"clear_all": "Clear all",
"clear": "Temizle" "clear": "Temizle"
} }
}, },
@ -674,7 +674,7 @@
"intro": "Bunlar, Mastodon'un köşesinde ilgi çeken gönderilerdir." "intro": "Bunlar, Mastodon'un köşesinde ilgi çeken gönderilerdir."
}, },
"favorite": { "favorite": {
"title": "Favorites" "title": "Favoriler"
}, },
"notification": { "notification": {
"title": { "title": {
@ -854,9 +854,9 @@
"user_not_logged_in": "Please open Mastodon to log in to an Account." "user_not_logged_in": "Please open Mastodon to log in to an Account."
}, },
"followers_count": { "followers_count": {
"configuration_display_name": "Followers", "configuration_display_name": "Takipçiler",
"configuration_description": "Show number of followers.", "configuration_description": "Show number of followers.",
"title": "FOLLOWERS", "title": "TAKİPÇİLER",
"followers_today": "%s followers today" "followers_today": "%s followers today"
}, },
"multiple_followers": { "multiple_followers": {
@ -868,14 +868,14 @@
} }
}, },
"latest_followers": { "latest_followers": {
"configuration_display_name": "Latest followers", "configuration_display_name": "Son takipçiler",
"configuration_description": "Show latest followers.", "configuration_description": "Son takipçileri göster.",
"title": "Latest followers", "title": "Son takipçiler",
"last_update": "Last update: %s" "last_update": "Last update: %s"
}, },
"hashtag": { "hashtag": {
"configuration": { "configuration": {
"display_name": "Hashtag", "display_name": "Etiket",
"description": "Shows a recent post with the selected hashtag." "description": "Shows a recent post with the selected hashtag."
}, },
"not_found": { "not_found": {

View File

@ -15,7 +15,7 @@
<key>one</key> <key>one</key>
<string>1 не прочитане сповіщення</string> <string>1 не прочитане сповіщення</string>
<key>few</key> <key>few</key>
<string>%ld не прочитаних сповіщень</string> <string>%ld не прочитані сповіщення</string>
<key>many</key> <key>many</key>
<string>%ld не прочитаних сповіщень</string> <string>%ld не прочитаних сповіщень</string>
<key>other</key> <key>other</key>
@ -25,7 +25,7 @@
<key>a11y.plural.count.input_limit_exceeds</key> <key>a11y.plural.count.input_limit_exceeds</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>Перевищено ліміт вводу на %#@character_count@</string> <string>Перевищено ліміт вводу символів на %#@character_count@</string>
<key>character_count</key> <key>character_count</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -45,7 +45,7 @@
<key>a11y.plural.count.input_limit_remains</key> <key>a11y.plural.count.input_limit_remains</key>
<dict> <dict>
<key>NSStringLocalizedFormatKey</key> <key>NSStringLocalizedFormatKey</key>
<string>Залишається вхідний ліміт %#@character_count@</string> <string>Залишається ліміт вводу символів %#@character_count@</string>
<key>character_count</key> <key>character_count</key>
<dict> <dict>
<key>NSStringFormatSpecTypeKey</key> <key>NSStringFormatSpecTypeKey</key>
@ -73,13 +73,13 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 character left</string> <string>1 символ залишився</string>
<key>few</key> <key>few</key>
<string>%ld characters left</string> <string>%ld символи залишилось</string>
<key>many</key> <key>many</key>
<string>%ld characters left</string> <string>%ld символів залишилось</string>
<key>other</key> <key>other</key>
<string>%ld characters left</string> <string>%ld символів залишилось</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.followed_by_and_mutual</key> <key>plural.count.followed_by_and_mutual</key>
@ -108,7 +108,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>Читають %1$@ та інші</string> <string>Читає %1$@ та ще один</string>
<key>few</key> <key>few</key>
<string>Читають %1$@, та %ld взаємних</string> <string>Читають %1$@, та %ld взаємних</string>
<key>many</key> <key>many</key>
@ -228,13 +228,13 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>one</key> <key>one</key>
<string>1 re-blog</string> <string>1 репост</string>
<key>few</key> <key>few</key>
<string>%ld re-blogs</string> <string>%ld репости</string>
<key>many</key> <key>many</key>
<string>%ld re-blogs</string> <string>%ld репостів</string>
<key>other</key> <key>other</key>
<string>%ld re-blogs</string> <string>%ld репостів</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.reply</key> <key>plural.count.reply</key>

View File

@ -15,10 +15,6 @@
"title": "Помилка голосування", "title": "Помилка голосування",
"poll_ended": "Опитування завершено" "poll_ended": "Опитування завершено"
}, },
"discard_post_content": {
"title": "Видалити чернетку",
"message": "Підтвердьте, щоб відхилити створений вміст публікації."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Помилка публікації", "title": "Помилка публікації",
"message": "Не вдалося опублікувати допис.\nПеревірте підключення до Інтернету.", "message": "Не вдалося опублікувати допис.\nПеревірте підключення до Інтернету.",
@ -53,8 +49,8 @@
"message": "%s успішно очищено." "message": "%s успішно очищено."
}, },
"translation_failed": { "translation_failed": {
"title": "Note", "title": "Нотатка",
"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.", "message": "Не вдалося виконати переклад. Можливо, адміністратор не активував переклади на цьому сервері або цей сервер використовує стару версію Mastodon, де переклади ще не підтримуються.",
"button": "OK" "button": "OK"
} }
}, },
@ -82,7 +78,7 @@
"sign_in": "Увійти", "sign_in": "Увійти",
"see_more": "Дивіться більше", "see_more": "Дивіться більше",
"preview": "Попередній перегляд", "preview": "Попередній перегляд",
"copy": "Copy", "copy": "Копіювати",
"share": "Поділитись", "share": "Поділитись",
"share_user": "Поділитися %s", "share_user": "Поділитися %s",
"share_post": "Поділитися записом", "share_post": "Поділитися записом",
@ -98,18 +94,22 @@
"settings": "Налаштування", "settings": "Налаштування",
"delete": "Видалити", "delete": "Видалити",
"translate_post": { "translate_post": {
"title": "Translate from %s", "title": "Перекладено з %s",
"unknown_language": "Unknown" "unknown_language": "Невідомо"
}, },
"edit_post": "Edit" "edit_post": "Редагувати",
"bookmark": "Закладка",
"remove_bookmark": "Видалити Закладку",
"follow": "Стежити за %s",
"unfollow": "Не стежити за %s"
}, },
"tabs": { "tabs": {
"home": "Головна", "home": "Головна",
"search_and_explore": "Search and Explore", "search_and_explore": "Search and Explore",
"notifications": "Notifications", "notifications": "Сповіщення",
"profile": "Профіль", "profile": "Профіль",
"a11y": { "a11y": {
"search": "Search", "search": "Пошук",
"explore": "Explore" "explore": "Explore"
} }
}, },
@ -147,7 +147,7 @@
"media_content_warning": "Натисніть будь-де, щоб показати більше", "media_content_warning": "Натисніть будь-де, щоб показати більше",
"tap_to_reveal": "Натисніть, щоб відобразити", "tap_to_reveal": "Натисніть, щоб відобразити",
"load_embed": "Load Embed", "load_embed": "Load Embed",
"link_via_user": "%s via %s", "link_via_user": "%s через %s",
"poll": { "poll": {
"vote": "Проголосувати", "vote": "Проголосувати",
"closed": "Зачинено" "closed": "Зачинено"
@ -172,8 +172,8 @@
"share_link_in_post": "Share Link in Post", "share_link_in_post": "Share Link in Post",
"tap_then_hold_to_show_menu": "Натисніть та утримуйте, щоб показати меню", "tap_then_hold_to_show_menu": "Натисніть та утримуйте, щоб показати меню",
"a11y_labels": { "a11y_labels": {
"reblog": "Re-blog", "reblog": "Репост",
"unreblog": "Undo re-blog" "unreblog": "Скасувати репост"
} }
}, },
"tag": { "tag": {
@ -191,28 +191,28 @@
"direct": "Тільки згаданий користувач може бачити цю публікацію." "direct": "Тільки згаданий користувач може бачити цю публікацію."
}, },
"translation": { "translation": {
"translated_from": "Translated from %s using %s", "translated_from": "Перекладено з %s за допомогою %s",
"unknown_language": "Unknown", "unknown_language": "Невідомо",
"unknown_provider": "Unknown", "unknown_provider": "Невідомо",
"show_original": "Show Original" "show_original": "Показати оригінал"
}, },
"media": { "media": {
"accessibility_label": "%s, attachment %d of %d", "accessibility_label": "%s, вкладення %d із %d",
"expand_image_hint": "Expands the image. Double-tap and hold to show actions", "expand_image_hint": "Розгортає зображення. Двічі торкніться та утримуйте, щоб показати дії",
"expand_gif_hint": "Expands the GIF. 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" "expand_video_hint": "Показує відеоплеєр. Натисніть двічі і утримуйте, щоб показати дії"
}, },
"posted_via_application": "%s via %s", "posted_via_application": "%s через %s",
"buttons": { "buttons": {
"reblogs_title": "Reblogs", "reblogs_title": "Репости",
"favorites_title": "Favorites", "favorites_title": "Улюблені",
"edit_history_title": "Edit History", "edit_history_title": "Редагувати історію",
"edit_history_detail": "Last edit %s" "edit_history_detail": "Останнє редагування %s"
}, },
"edited_at_timestamp_prefix": "Edited %s", "edited_at_timestamp_prefix": "Відредаговано %s",
"edit_history": { "edit_history": {
"title": "Edit History", "title": "Редагувати історію",
"original_post": "Original Post · %s" "original_post": "Оригінальна публікація · %s"
} }
}, },
"friendship": { "friendship": {
@ -257,47 +257,47 @@
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "Нема підтвердженого посилання",
"followers_count": "%@ followers" "followers_count": "%@ підписників"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "Увійти", "log_in": "Увійти",
"learn_more": "Learn more", "learn_more": "Докладніше",
"join_default_server": "Join mastodon.social", "join_default_server": "Приєднатися до %@",
"pick_server": "Pick another server", "pick_server": "Обрати інший сервер",
"separator": { "separator": {
"or": "or" "or": "або"
}, },
"education": { "education": {
"mastodon": { "mastodon": {
"title": "Welcome to Mastodon", "title": "Вітаємо у Mastodon",
"description": "Mastodon is a decentralized social network, meaning no single company controls it. Its made up of many independently-run servers, all connected together." "description": "Mastodon - це децентралізована соціальна мережа, тобто жодна компанія не контролює її. У її склад входить велика кількість незалежних серверів пов'язаних між собою."
}, },
"servers": { "servers": {
"title": "What are servers?", "title": "Що таке сервери?",
"description": "Every Mastodon account is hosted on a server — each with its own values, rules, & admins. No matter which one you pick, you can follow and interact with people on any server." "description": "Кожен обліковий запис Mastodon розміщений на сервері - кожен сервер має особисті цінності, правила, й адмінів. Немає різниці, який ви оберете, ви можете слідкувати та спілкуватися з користувачами з будь-яких серверів."
}, },
"a11y": { "a11y": {
"what_is_mastodon": { "what_is_mastodon": {
"title": "What is Mastodon?" "title": "Що таке Mastodon?"
} }
} }
} }
}, },
"login": { "login": {
"title": "Welcome back", "title": "З поверненням",
"subtitle": "Увійдіть на сервері, де ви створили свій обліковий запис.", "subtitle": "Увійдіть на сервері, де ви створили свій обліковий запис.",
"server_search_field": { "server_search_field": {
"placeholder": "Введіть URL-адресу або адресу сервера" "placeholder": "Введіть URL-адресу або адресу сервера"
} }
}, },
"server_picker": { "server_picker": {
"title": "Pick Server", "title": "Оберіть сервер",
"button": { "button": {
"language": "Language", "language": "Мова",
"signup_speed": "Sign-up Speed", "signup_speed": "Швидкість реєстрації",
"category": { "category": {
"all": "Всі", "all": "Всі",
"all_accessiblity_description": "Категорія: Усі", "all_accessiblity_description": "Категорія: Усі",
@ -331,31 +331,31 @@
"no_results": "Жодних результатів" "no_results": "Жодних результатів"
}, },
"signup_speed": { "signup_speed": {
"all": "All", "all": "Всі",
"instant": "Instant Sign-up", "instant": "Миттєва реєстрація",
"manually_reviewed": "Manual Review" "manually_reviewed": "Ручна перевірка"
}, },
"language": { "language": {
"all": "All" "all": "Всі"
}, },
"search": { "search": {
"placeholder": "Search name or URL" "placeholder": "Пошук по імені або URL"
}, },
"no_server_selected_hint": "Well pick a server based on your language if you continue without making a selection." "no_server_selected_hint": "Ми підберемо сервер на основі вашої мови, якщо ви продовжите без вибору."
}, },
"privacy": { "privacy": {
"title": "Privacy", "title": "Приватність",
"description": "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your servers privacy policy.", "description": "Хоча додаток Mastodon не збирає жодних даних, сервер, на якому ви зареєструвались, може мати іншу політику. Витратьте хвилину, щоб переглянути та погодитися з політикою конфіденційності Mastodon і політикою конфіденційності Вашого сервера.",
"policy": { "policy": {
"ios": "Privacy Policy - Mastodon for iOS", "ios": "Політика конфіденційності - Mastodon для iOS",
"server": "Privacy Policy - %s" "server": "Політика конфіденційності - %s"
}, },
"button": { "button": {
"confirm": "I Agree" "confirm": "Я погоджуюся"
} }
}, },
"register": { "register": {
"title": "Create Account", "title": "Створить аккаунт",
"input": { "input": {
"avatar": { "avatar": {
"delete": "Видалити" "delete": "Видалити"
@ -373,7 +373,7 @@
}, },
"password": { "password": {
"placeholder": "пароль", "placeholder": "пароль",
"confirmation_placeholder": "Confirm Password", "confirmation_placeholder": "Підтвердіть Пароль",
"require": "Ваш пароль повинен містити як мінімум:", "require": "Ваш пароль повинен містити як мінімум:",
"character_limit": "8 символів", "character_limit": "8 символів",
"accessibility": { "accessibility": {
@ -398,7 +398,7 @@
"reason": { "reason": {
"blocked": "%s містить заборонених провайдерів email", "blocked": "%s містить заборонених провайдерів email",
"unreachable": "%s здається, не існує", "unreachable": "%s здається, не існує",
"taken": "%s is already taken. How about:", "taken": "%s вже зайняте. Як щодо:",
"reserved": "%s є зарезервованим ключовим словом", "reserved": "%s є зарезервованим ключовим словом",
"accepted": "%s має бути прийнято", "accepted": "%s має бути прийнято",
"blank": "%s необхідно", "blank": "%s необхідно",
@ -422,30 +422,30 @@
"terms_of_service": "умови використання", "terms_of_service": "умови використання",
"privacy_policy": "політика конфіденційності", "privacy_policy": "політика конфіденційності",
"button": { "button": {
"confirm": "I Agree" "confirm": "Я погоджуюся"
} }
}, },
"confirm_email": { "confirm_email": {
"title": "Check Your Inbox", "title": "Перевірте вхідні",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.", "tap_the_link_we_emailed_to_you_to_verify_your_account": "Натисніть на посилання, яке ми надіслали вам, щоб підтвердити %@. Ми чекатимемо прямо тут.",
"button": { "button": {
"resend": "Повторно надіслати" "resend": "Повторно надіслати"
}, },
"dont_receive_email": { "dont_receive_email": {
"title": "Check your Email", "title": "Перевірте свою пошту",
"description": "Перевірте правильність адреси електронної пошти, а також теку зі спамом, якщо ви ще не зробили цього.", "description": "Перевірте правильність адреси електронної пошти, а також теку зі спамом, якщо ви ще не зробили цього.",
"resend_email": "Повторно надіслати лист" "resend_email": "Повторно надіслати лист"
}, },
"open_email_app": { "open_email_app": {
"title": "Check your Inbox.", "title": "Перевірте вашу поштову скриньку.",
"description": "Ми щойно надіслали вам електронного листа. Перевірте вашу спам теку, якщо ви не зробили цього.", "description": "Ми щойно надіслали вам електронного листа. Перевірте вашу спам теку, якщо ви не зробили цього.",
"mail": "Пошта", "mail": "Пошта",
"open_email_client": "Відкрити поштового клієнта" "open_email_client": "Відкрити поштового клієнта"
}, },
"didnt_get_link": { "didnt_get_link": {
"prefix": "Didnt get a link?", "prefix": "Не отримали посилання?",
"resend_in": "Resend (%@)", "resend_in": "Надіслати повторно (%@)",
"resend_now": "Resend now." "resend_now": "Надіслати ще раз."
} }
}, },
"home_timeline": { "home_timeline": {
@ -462,14 +462,14 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Знайти людей, аби підписатися", "title": "Популярне на Mastodon",
"follow_explain": "Коли ви підпишетесь на когось, ви побачите його дописи у своїй домашній стрічці." "follow_all": "Стежити за всіма"
}, },
"compose": { "compose": {
"title": { "title": {
"new_post": "Новий допис", "new_post": "Новий допис",
"new_reply": "Нова відповідь", "new_reply": "Нова відповідь",
"edit_post": "Edit Post" "edit_post": "Редагувати допис"
}, },
"media_selection": { "media_selection": {
"camera": "Зробити фото", "camera": "Зробити фото",
@ -493,7 +493,7 @@
"server_processing_state": "Обробка сервера..." "server_processing_state": "Обробка сервера..."
}, },
"poll": { "poll": {
"title": "Poll", "title": "Опитування",
"duration_time": "Тривалість: %s", "duration_time": "Тривалість: %s",
"thirty_minutes": "30 хвилин", "thirty_minutes": "30 хвилин",
"one_hour": "1 Година", "one_hour": "1 Година",
@ -504,10 +504,10 @@
"option_number": "Параметр %ld", "option_number": "Параметр %ld",
"the_poll_is_invalid": "Неприпустимий варіант опитування", "the_poll_is_invalid": "Неприпустимий варіант опитування",
"the_poll_has_empty_option": "В опитуванні є порожній варіант", "the_poll_has_empty_option": "В опитуванні є порожній варіант",
"add_option": "Add Option", "add_option": "Додати відповідь",
"remove_option": "Remove Option", "remove_option": "Видалити відповідь",
"move_up": "Move Up", "move_up": "Вище",
"move_down": "Move Down" "move_down": "Нижче"
}, },
"content_warning": { "content_warning": {
"placeholder": "Напишіть своє попередження тут..." "placeholder": "Напишіть своє попередження тут..."
@ -541,10 +541,10 @@
"select_visibility_entry": "Оберіть видимість - %s" "select_visibility_entry": "Оберіть видимість - %s"
}, },
"language": { "language": {
"title": "Post Language", "title": "Мова допису",
"suggested": "Suggested", "suggested": "Рекомендовані",
"recent": "Recent", "recent": "Останні",
"other": "Other Language…" "other": "Інші мови…"
} }
}, },
"profile": { "profile": {
@ -552,16 +552,16 @@
"follows_you": "Підписаний(-на) на вас" "follows_you": "Підписаний(-на) на вас"
}, },
"dashboard": { "dashboard": {
"my_posts": "posts", "my_posts": "публікації",
"my_following": "following", "my_following": "following",
"my_followers": "followers", "my_followers": "підписники",
"other_posts": "posts", "other_posts": "публікації",
"other_following": "following", "other_following": "підписок",
"other_followers": "followers", "other_followers": "підписники",
"familiar_followers": "mutuals" "familiar_followers": "mutuals"
}, },
"fields": { "fields": {
"joined": "Joined", "joined": "Приєднався",
"add_row": "Додати рядок", "add_row": "Додати рядок",
"placeholder": { "placeholder": {
"label": "Позначка", "label": "Позначка",
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Всі", "people": "People matching \"%s\"",
"people": "Громада", "profile": "Go to @%s@%s",
"hashtags": "Гештеги", "url": "Open URL in Mastodon",
"posts": "Дописи" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Жодних результатів" "no_results": "Жодних результатів"
}, },
"recent_search": "Нещодавні запити", "recent_search": "Нещодавні запити",
"clear_all": "Clear all",
"clear": "Очистити" "clear": "Очистити"
} }
}, },
@ -674,7 +674,7 @@
"intro": "Ось найбільш популярні дописи серед вашого серверу Mastodon." "intro": "Ось найбільш популярні дописи серед вашого серверу Mastodon."
}, },
"favorite": { "favorite": {
"title": "Favorites" "title": "Вподобане"
}, },
"notification": { "notification": {
"title": { "title": {
@ -831,15 +831,15 @@
"title": "Закладки" "title": "Закладки"
}, },
"followed_tags": { "followed_tags": {
"title": "Followed Tags", "title": "Відстежувані мітки",
"header": { "header": {
"posts": "posts", "posts": "публікації",
"participants": "participants", "participants": "учасників",
"posts_today": "posts today" "posts_today": "публікацій сьогодні"
}, },
"actions": { "actions": {
"follow": "Follow", "follow": "Стежити",
"unfollow": "Unfollow" "unfollow": "Не стежити"
} }
} }
}, },
@ -854,28 +854,28 @@
"user_not_logged_in": "Please open Mastodon to log in to an Account." "user_not_logged_in": "Please open Mastodon to log in to an Account."
}, },
"followers_count": { "followers_count": {
"configuration_display_name": "Followers", "configuration_display_name": "Підписники",
"configuration_description": "Show number of followers.", "configuration_description": "Показати кількість підписників.",
"title": "FOLLOWERS", "title": "ПІДПИСНИКИ",
"followers_today": "%s followers today" "followers_today": "%s підписників сьогодні"
}, },
"multiple_followers": { "multiple_followers": {
"configuration_display_name": "Multiple followers", "configuration_display_name": "Multiple followers",
"configuration_description": "Show number of followers for multiple accounts.", "configuration_description": "Show number of followers for multiple accounts.",
"mock_user": { "mock_user": {
"display_name": "Another follower", "display_name": "Інший підписник",
"account_name": "another@follower.social" "account_name": "another@follower.social"
} }
}, },
"latest_followers": { "latest_followers": {
"configuration_display_name": "Latest followers", "configuration_display_name": "Останні підписники",
"configuration_description": "Show latest followers.", "configuration_description": "Показати останніх підписників.",
"title": "Latest followers", "title": "Останні підписники",
"last_update": "Last update: %s" "last_update": "Останнє оновлення: %s"
}, },
"hashtag": { "hashtag": {
"configuration": { "configuration": {
"display_name": "Hashtag", "display_name": "Хештеґ",
"description": "Shows a recent post with the selected hashtag." "description": "Shows a recent post with the selected hashtag."
}, },
"not_found": { "not_found": {
@ -886,7 +886,7 @@
"placeholder": { "placeholder": {
"account_name": "John Mastodon", "account_name": "John Mastodon",
"account": "@johnMastodon@no-such.account", "account": "@johnMastodon@no-such.account",
"content": "This is how a post with a <a>#hashtag</a> would look. Pick whichever <a>#hashtag</a> you want in the widget settings." "content": "Таким чином буде виглядати пост з позначкою <a>#hashtag</a>. Виберіть будь-який <a>#hashtag</a> у налаштуваннях віджету."
} }
} }
} }

View File

@ -15,10 +15,6 @@
"title": "Bình chọn không thành công", "title": "Bình chọn không thành công",
"poll_ended": "Cuộc bình chọn đã kết thúc" "poll_ended": "Cuộc bình chọn đã kết thúc"
}, },
"discard_post_content": {
"title": "Bỏ bản nháp",
"message": "Xác nhận bỏ qua nội dung tút đã viết."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Đăng tút không thành công", "title": "Đăng tút không thành công",
"message": "Không thể đăng tút.\nVui lòng kiểm tra kết nối mạng.", "message": "Không thể đăng tút.\nVui lòng kiểm tra kết nối mạng.",
@ -72,7 +68,7 @@
"done": "Xong", "done": "Xong",
"confirm": "Xác nhận", "confirm": "Xác nhận",
"continue": "Tiếp tục", "continue": "Tiếp tục",
"compose": "Viết tút", "compose": "Soạn tút",
"cancel": "Hủy bỏ", "cancel": "Hủy bỏ",
"discard": "Bỏ qua", "discard": "Bỏ qua",
"try_again": "Thử lại", "try_again": "Thử lại",
@ -101,10 +97,14 @@
"title": "Dịch từ %s", "title": "Dịch từ %s",
"unknown_language": "Chưa xác định" "unknown_language": "Chưa xác định"
}, },
"edit_post": "Sửa" "edit_post": "Sửa",
"bookmark": "Lưu",
"remove_bookmark": "Bỏ lưu",
"follow": "Theo dõi %s",
"unfollow": "Bỏ theo dõi %s"
}, },
"tabs": { "tabs": {
"home": "Bảng tin", "home": "Trang chính",
"search_and_explore": "Tìm và Khám Phá", "search_and_explore": "Tìm và Khám Phá",
"notifications": "Thông báo", "notifications": "Thông báo",
"profile": "Trang hồ sơ", "profile": "Trang hồ sơ",
@ -116,7 +116,7 @@
"keyboard": { "keyboard": {
"common": { "common": {
"switch_to_tab": "Chuyển thành %s", "switch_to_tab": "Chuyển thành %s",
"compose_new_post": "Viết tút mới", "compose_new_post": "Soạn tút mới",
"show_favorites": "Hiện lượt thích", "show_favorites": "Hiện lượt thích",
"open_settings": "Mở cài đặt" "open_settings": "Mở cài đặt"
}, },
@ -124,7 +124,7 @@
"previous_status": "Tút trước", "previous_status": "Tút trước",
"next_status": "Tút sau", "next_status": "Tút sau",
"open_status": "Mở tút", "open_status": "Mở tút",
"open_author_profile": "Mở trang người viết tút", "open_author_profile": "Mở trang người đăng tút",
"open_reblogger_profile": "Mở trang người đăng lại tút", "open_reblogger_profile": "Mở trang người đăng lại tút",
"reply_status": "Trả lời tút", "reply_status": "Trả lời tút",
"toggle_reblog": "Chọn đăng lại tút", "toggle_reblog": "Chọn đăng lại tút",
@ -150,7 +150,7 @@
"link_via_user": "%s bởi %s", "link_via_user": "%s bởi %s",
"poll": { "poll": {
"vote": "Bình chọn", "vote": "Bình chọn",
"closed": "Kết thúc" "closed": "Đóng"
}, },
"meta_entity": { "meta_entity": {
"url": "Link: %s", "url": "Link: %s",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Đăng nhập", "log_in": "Đăng nhập",
"learn_more": "Tìm hiểu thêm", "learn_more": "Tìm hiểu thêm",
"join_default_server": "Tham gia mastodon.social", "join_default_server": "Tham gia %@",
"pick_server": "Tìm máy chủ khác", "pick_server": "Tìm máy chủ khác",
"separator": { "separator": {
"or": "hoặc" "or": "hoặc"
@ -449,7 +449,7 @@
} }
}, },
"home_timeline": { "home_timeline": {
"title": "Bảng tin", "title": "Trang chính",
"navigation_bar_state": { "navigation_bar_state": {
"offline": "Ngoại tuyến", "offline": "Ngoại tuyến",
"new_posts": "Đọc những tút mới", "new_posts": "Đọc những tút mới",
@ -462,12 +462,12 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "Đề xuất theo dõi", "title": "Thịnh hành trên Mastodon",
"follow_explain": "Khi theo dõi ai đó, bạn sẽ thấy tút của họ trong bảng tin." "follow_all": "Theo dõi tất cả"
}, },
"compose": { "compose": {
"title": { "title": {
"new_post": "Viết tút", "new_post": "Soạn tút",
"new_reply": "Viết trả lời", "new_reply": "Viết trả lời",
"edit_post": "Sửa tút" "edit_post": "Sửa tút"
}, },
@ -644,22 +644,22 @@
"people_talking": "%s người đang thảo luận" "people_talking": "%s người đang thảo luận"
}, },
"accounts": { "accounts": {
"title": "Những người bạn có thể thích", "title": "Những người bạn có thể quen",
"description": "Bạn có thể muốn theo dõi những người này", "description": "Bạn có thể muốn theo dõi những người này",
"follow": "Theo dõi" "follow": "Theo dõi"
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "Tất cả", "people": "People matching \"%s\"",
"people": "Mọi người", "profile": "Go to @%s@%s",
"hashtags": "Hashtag", "url": "Open URL in Mastodon",
"posts": "Tút" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "Không có kết quả" "no_results": "Không có kết quả"
}, },
"recent_search": "Tìm kiếm gần đây", "recent_search": "Tìm kiếm gần đây",
"clear_all": "Clear all",
"clear": "Xóa" "clear": "Xóa"
} }
}, },
@ -727,7 +727,7 @@
"boosts": "Đăng lại tút của tôi", "boosts": "Đăng lại tút của tôi",
"mentions": "Nhắc đến tôi", "mentions": "Nhắc đến tôi",
"trigger": { "trigger": {
"anyone": "ai đó", "anyone": "bất cứ ai",
"follower": "người theo dõi tôi", "follower": "người theo dõi tôi",
"follow": "người tôi theo dõi", "follow": "người tôi theo dõi",
"noone": "không một ai", "noone": "không một ai",

View File

@ -1,6 +1,6 @@
{ {
"NSCameraUsageDescription": "Được sử dụng để chụp ảnh cho tút", "NSCameraUsageDescription": "Được sử dụng để chụp ảnh cho tút",
"NSPhotoLibraryAddUsageDescription": "Được sử dụng để lưu ảnh vào Thư viện ảnh", "NSPhotoLibraryAddUsageDescription": "Được sử dụng để lưu ảnh vào Thư viện ảnh",
"NewPostShortcutItemTitle": "Viết tút", "NewPostShortcutItemTitle": "Soạn tút",
"SearchShortcutItemTitle": "Tìm kiếm" "SearchShortcutItemTitle": "Tìm kiếm"
} }

View File

@ -162,7 +162,7 @@
<key>NSStringFormatValueTypeKey</key> <key>NSStringFormatValueTypeKey</key>
<string>ld</string> <string>ld</string>
<key>other</key> <key>other</key>
<string>%ld re-blogs</string> <string>%ld 次转发</string>
</dict> </dict>
</dict> </dict>
<key>plural.count.reply</key> <key>plural.count.reply</key>

View File

@ -15,10 +15,6 @@
"title": "投票失败", "title": "投票失败",
"poll_ended": "投票已结束" "poll_ended": "投票已结束"
}, },
"discard_post_content": {
"title": "丢弃草案",
"message": "确认要丢弃正在编辑的内容"
},
"publish_post_failure": { "publish_post_failure": {
"title": "发布失败", "title": "发布失败",
"message": "帖子发送失败。\n请检查你的网络连接。", "message": "帖子发送失败。\n请检查你的网络连接。",
@ -101,7 +97,11 @@
"title": "翻译自 %s", "title": "翻译自 %s",
"unknown_language": "未知的" "unknown_language": "未知的"
}, },
"edit_post": "编辑" "edit_post": "编辑",
"bookmark": "添加书签",
"remove_bookmark": "移除书签",
"follow": "关注 %s",
"unfollow": "不再关注 %s"
}, },
"tabs": { "tabs": {
"home": "主页", "home": "主页",
@ -205,7 +205,7 @@
"posted_via_application": "%s 通过 %s 发布", "posted_via_application": "%s 通过 %s 发布",
"buttons": { "buttons": {
"reblogs_title": "转发", "reblogs_title": "转发",
"favorites_title": "收藏", "favorites_title": "喜欢",
"edit_history_title": "编辑历史", "edit_history_title": "编辑历史",
"edit_history_detail": "编辑于:%s" "edit_history_detail": "编辑于:%s"
}, },
@ -257,15 +257,15 @@
} }
}, },
"user_list": { "user_list": {
"no_verified_link": "No verified link", "no_verified_link": "未验证链接",
"followers_count": "%@ followers" "followers_count": "%@ 名关注者"
} }
}, },
"scene": { "scene": {
"welcome": { "welcome": {
"log_in": "登录", "log_in": "登录",
"learn_more": "了解详情", "learn_more": "了解详情",
"join_default_server": "加入 mastodon.social", "join_default_server": "加入 %@",
"pick_server": "选择另一个服务器", "pick_server": "选择另一个服务器",
"separator": { "separator": {
"or": "或" "or": "或"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "查看推荐关注的用户", "title": "Mastodon上流行的",
"follow_explain": "当你关注某个人时,你将会在主页看到他们的帖子。" "follow_all": "一键关注"
}, },
"compose": { "compose": {
"title": { "title": {
@ -625,7 +625,7 @@
"followed_by_names": "%s 关注了这个账号" "followed_by_names": "%s 关注了这个账号"
}, },
"favorited_by": { "favorited_by": {
"title": "收藏者" "title": "喜欢者"
}, },
"reblogged_by": { "reblogged_by": {
"title": "转发者" "title": "转发者"
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "全部", "people": "People matching \"%s\"",
"people": "用户", "profile": "Go to @%s@%s",
"hashtags": "标签", "url": "Open URL in Mastodon",
"posts": "帖子" "hashtag": "Go to #%s",
},
"empty_state": { "empty_state": {
"no_results": "无结果" "no_results": "无结果"
}, },
"recent_search": "最近搜索", "recent_search": "最近搜索",
"clear_all": "Clear all",
"clear": "清除" "clear": "清除"
} }
}, },
@ -674,7 +674,7 @@
"intro": "这些嘟文在你的长毛象小宇宙中备受关注。" "intro": "这些嘟文在你的长毛象小宇宙中备受关注。"
}, },
"favorite": { "favorite": {
"title": "收藏" "title": "喜欢"
}, },
"notification": { "notification": {
"title": { "title": {

View File

@ -15,10 +15,6 @@
"title": "投票失敗", "title": "投票失敗",
"poll_ended": "投票已結束" "poll_ended": "投票已結束"
}, },
"discard_post_content": {
"title": "捨棄草稿",
"message": "確認放棄編寫中的嘟文內容。"
},
"publish_post_failure": { "publish_post_failure": {
"title": "發表嘟文失敗", "title": "發表嘟文失敗",
"message": "發表嘟文失敗。\n請檢查您的網路連線。", "message": "發表嘟文失敗。\n請檢查您的網路連線。",
@ -101,7 +97,11 @@
"title": "翻譯自 %s", "title": "翻譯自 %s",
"unknown_language": "未知" "unknown_language": "未知"
}, },
"edit_post": "編輯" "edit_post": "編輯",
"bookmark": "書籤",
"remove_bookmark": "移除書籤",
"follow": "跟隨 %s",
"unfollow": "取消跟隨 %s"
}, },
"tabs": { "tabs": {
"home": "首頁", "home": "首頁",
@ -265,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "登入", "log_in": "登入",
"learn_more": "了解更多", "learn_more": "了解更多",
"join_default_server": "加入 mastodon.social", "join_default_server": "加入 %@",
"pick_server": "挑選另一個伺服器", "pick_server": "挑選另一個伺服器",
"separator": { "separator": {
"or": "或" "or": "或"
@ -462,8 +462,8 @@
} }
}, },
"suggestion_account": { "suggestion_account": {
"title": "尋找一些人來跟隨", "title": "Mastodon 上之流行內容",
"follow_explain": "當您跟隨這些人時,將會看到他們的嘟文出現在您的首頁時間軸上。" "follow_all": "跟隨所有"
}, },
"compose": { "compose": {
"title": { "title": {
@ -487,7 +487,7 @@
"description_video": "為視障人士提供影片說明...", "description_video": "為視障人士提供影片說明...",
"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_state": "正在壓縮...",
"server_processing_state": "伺服器處理中..." "server_processing_state": "伺服器處理中..."
@ -650,16 +650,16 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "全部", "people": "People matching \"%s\"",
"people": "使用者", "profile": "前往 @%s@%s",
"hashtags": "主題標籤", "url": "於 Mastodon 中開啟連結",
"posts": "嘟文" "hashtag": "前往 #%s",
},
"empty_state": { "empty_state": {
"no_results": "沒有任何結果" "no_results": "沒有任何結果"
}, },
"recent_search": "最近的搜尋", "recent_search": "最近的搜尋",
"clear_all": "清除全部",
"clear": "清除" "clear": "清除"
} }
}, },

View File

@ -15,10 +15,6 @@
"title": "Vote Failure", "title": "Vote Failure",
"poll_ended": "The poll has ended" "poll_ended": "The poll has ended"
}, },
"discard_post_content": {
"title": "Discard Draft",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": { "publish_post_failure": {
"title": "Publish Failure", "title": "Publish Failure",
"message": "Failed to publish the post.\nPlease check your internet connection.", "message": "Failed to publish the post.\nPlease check your internet connection.",
@ -101,8 +97,11 @@
"title": "Translate from %s", "title": "Translate from %s",
"unknown_language": "Unknown" "unknown_language": "Unknown"
}, },
"edit_post": "Edit" "edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
}, },
"tabs": { "tabs": {
"home": "Home", "home": "Home",
@ -215,7 +214,6 @@
"title": "Edit History", "title": "Edit History",
"original_post": "Original Post · %s" "original_post": "Original Post · %s"
} }
}, },
"friendship": { "friendship": {
"follow": "Follow", "follow": "Follow",
@ -267,7 +265,7 @@
"welcome": { "welcome": {
"log_in": "Log In", "log_in": "Log In",
"learn_more": "Learn more", "learn_more": "Learn more",
"join_default_server": "Join mastodon.social", "join_default_server": "Join %@",
"pick_server": "Pick another server", "pick_server": "Pick another server",
"separator": { "separator": {
"or": "or" "or": "or"
@ -283,9 +281,9 @@
}, },
"a11y": { "a11y": {
"what_is_mastodon": { "what_is_mastodon": {
"title": "What is Mastodon?" "title": "What is Mastodon?"
} }
} }
} }
}, },
"login": { "login": {
@ -652,16 +650,20 @@
} }
}, },
"searching": { "searching": {
"segment": { "posts": "Posts matching \"%s\"",
"all": "All", "people": "People matching \"%s\"",
"people": "People", "profile": "Go to @%s@%s",
"hashtags": "Hashtags", "url": "Open URL in Mastodon",
"posts": "Posts" "hashtag": "Go to #%s",
}, "no_user": {
"title": "No User Account Found",
"message": "There's no Useraccount \"%s\" on %s"
}
"empty_state": { "empty_state": {
"no_results": "No results" "no_results": "No results"
}, },
"recent_search": "Recent searches", "recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear" "clear": "Clear"
} }
}, },

View File

@ -44,7 +44,6 @@
2A72812E297EA9D8004138C5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A72812D297EA9D8004138C5 /* Assets.xcassets */; }; 2A72812E297EA9D8004138C5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A72812D297EA9D8004138C5 /* Assets.xcassets */; };
2A728134297EA9D8004138C5 /* WidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2A728120297EA9D7004138C5 /* WidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 2A728134297EA9D8004138C5 /* WidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2A728120297EA9D7004138C5 /* WidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
2A72813F297EC762004138C5 /* WidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A72813E297EC762004138C5 /* WidgetExtension.swift */; }; 2A72813F297EC762004138C5 /* WidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A72813E297EC762004138C5 /* WidgetExtension.swift */; };
2A76F75C2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A76F75B2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift */; };
2A82294F29262EE000D2A1F7 /* AppContext+NextAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A82294E29262EE000D2A1F7 /* AppContext+NextAccount.swift */; }; 2A82294F29262EE000D2A1F7 /* AppContext+NextAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A82294E29262EE000D2A1F7 /* AppContext+NextAccount.swift */; };
2A86A14629892944007F1062 /* MultiFollowersCountIntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A86A14529892944007F1062 /* MultiFollowersCountIntentHandler.swift */; }; 2A86A14629892944007F1062 /* MultiFollowersCountIntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A86A14529892944007F1062 /* MultiFollowersCountIntentHandler.swift */; };
2A86A14929892B3A007F1062 /* MultiFollowersCountWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A86A14829892B3A007F1062 /* MultiFollowersCountWidget.swift */; }; 2A86A14929892B3A007F1062 /* MultiFollowersCountWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A86A14829892B3A007F1062 /* MultiFollowersCountWidget.swift */; };
@ -139,6 +138,9 @@
D8099078294BC8A30050219F /* PrivacyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099077294BC8A30050219F /* PrivacyTableViewController.swift */; }; D8099078294BC8A30050219F /* PrivacyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099077294BC8A30050219F /* PrivacyTableViewController.swift */; };
D809907A294BC9390050219F /* PrivacyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099079294BC9390050219F /* PrivacyTableViewCell.swift */; }; D809907A294BC9390050219F /* PrivacyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099079294BC9390050219F /* PrivacyTableViewCell.swift */; };
D809907C294D25510050219F /* PrivacyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D809907B294D25510050219F /* PrivacyViewModel.swift */; }; D809907C294D25510050219F /* PrivacyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D809907B294D25510050219F /* PrivacyViewModel.swift */; };
D81A22752AB4643200905D71 /* SearchResultsOverviewTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D81A22742AB4643200905D71 /* SearchResultsOverviewTableViewController.swift */; };
D81A22782AB4782400905D71 /* SearchResultOverviewSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = D81A22772AB4782400905D71 /* SearchResultOverviewSection.swift */; };
D81A227B2AB47B9A00905D71 /* SearchResultDefaultSectionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D81A227A2AB47B9A00905D71 /* SearchResultDefaultSectionTableViewCell.swift */; };
D8363B1629469CE200A74079 /* OnboardingNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8363B1529469CE200A74079 /* OnboardingNextView.swift */; }; D8363B1629469CE200A74079 /* OnboardingNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8363B1529469CE200A74079 /* OnboardingNextView.swift */; };
D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; }; D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; };
D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; }; D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; };
@ -148,6 +150,8 @@
D8A6AB6C291C5136003AB663 /* MastodonLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */; }; D8A6AB6C291C5136003AB663 /* MastodonLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */; };
D8BE30B32A179E26006B8270 /* SuggestionAccountTableViewFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BE30B22A179E26006B8270 /* SuggestionAccountTableViewFooter.swift */; }; D8BE30B32A179E26006B8270 /* SuggestionAccountTableViewFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BE30B22A179E26006B8270 /* SuggestionAccountTableViewFooter.swift */; };
D8BEBCB62A1B7FFD0004F475 /* SuggestionAccountTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BEBCB52A1B7FFD0004F475 /* SuggestionAccountTableViewCell+ViewModel.swift */; }; D8BEBCB62A1B7FFD0004F475 /* SuggestionAccountTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BEBCB52A1B7FFD0004F475 /* SuggestionAccountTableViewCell+ViewModel.swift */; };
D8D688F62AB869CB000F651A /* SearchResultsProfileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8D688F52AB869CB000F651A /* SearchResultsProfileTableViewCell.swift */; };
D8D688F92AB8B970000F651A /* SearchResultOverviewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8D688F82AB8B970000F651A /* SearchResultOverviewCoordinator.swift */; };
D8E5C346296DAB84007E76A7 /* DataSourceFacade+Status+History.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E5C345296DAB84007E76A7 /* DataSourceFacade+Status+History.swift */; }; D8E5C346296DAB84007E76A7 /* DataSourceFacade+Status+History.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E5C345296DAB84007E76A7 /* DataSourceFacade+Status+History.swift */; };
D8E5C349296DB8A3007E76A7 /* StatusEditHistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E5C348296DB8A3007E76A7 /* StatusEditHistoryViewController.swift */; }; D8E5C349296DB8A3007E76A7 /* StatusEditHistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E5C348296DB8A3007E76A7 /* StatusEditHistoryViewController.swift */; };
D8F0372C29D232730027DE2E /* HashtagIntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F0372B29D232730027DE2E /* HashtagIntentHandler.swift */; }; D8F0372C29D232730027DE2E /* HashtagIntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F0372B29D232730027DE2E /* HashtagIntentHandler.swift */; };
@ -194,7 +198,6 @@
DB0FCB842796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB832796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift */; }; DB0FCB842796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB832796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift */; };
DB0FCB862796BDA1006C02E2 /* SearchSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB852796BDA1006C02E2 /* SearchSection.swift */; }; DB0FCB862796BDA1006C02E2 /* SearchSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB852796BDA1006C02E2 /* SearchSection.swift */; };
DB0FCB882796BDA9006C02E2 /* SearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB872796BDA9006C02E2 /* SearchItem.swift */; }; DB0FCB882796BDA9006C02E2 /* SearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB872796BDA9006C02E2 /* SearchItem.swift */; };
DB0FCB8C2796BF8D006C02E2 /* SearchViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB8B2796BF8D006C02E2 /* SearchViewModel+Diffable.swift */; };
DB0FCB8E2796C0B7006C02E2 /* TrendCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB8D2796C0B7006C02E2 /* TrendCollectionViewCell.swift */; }; DB0FCB8E2796C0B7006C02E2 /* TrendCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB8D2796C0B7006C02E2 /* TrendCollectionViewCell.swift */; };
DB0FCB922796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB912796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift */; }; DB0FCB922796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB912796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift */; };
DB0FCB942797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */; }; DB0FCB942797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */; };
@ -253,7 +256,6 @@
DB4AA6B327BA34B6009EC082 /* CellFrameCacheContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4AA6B227BA34B6009EC082 /* CellFrameCacheContainer.swift */; }; DB4AA6B327BA34B6009EC082 /* CellFrameCacheContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4AA6B227BA34B6009EC082 /* CellFrameCacheContainer.swift */; };
DB4F0963269ED06300D62E92 /* SearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0962269ED06300D62E92 /* SearchResultViewController.swift */; }; DB4F0963269ED06300D62E92 /* SearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0962269ED06300D62E92 /* SearchResultViewController.swift */; };
DB4F0966269ED52200D62E92 /* SearchResultViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */; }; DB4F0966269ED52200D62E92 /* SearchResultViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */; };
DB4F0968269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0967269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift */; };
DB4F096A269EDAD200D62E92 /* SearchResultViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0969269EDAD200D62E92 /* SearchResultViewModel+State.swift */; }; DB4F096A269EDAD200D62E92 /* SearchResultViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0969269EDAD200D62E92 /* SearchResultViewModel+State.swift */; };
DB4F097526A037F500D62E92 /* SearchHistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */; }; DB4F097526A037F500D62E92 /* SearchHistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */; };
DB4F097B26A039FF00D62E92 /* SearchHistorySection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */; }; DB4F097B26A039FF00D62E92 /* SearchHistorySection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */; };
@ -298,7 +300,6 @@
DB63F74F2799405600455B82 /* SearchHistoryViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */; }; DB63F74F2799405600455B82 /* SearchHistoryViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */; };
DB63F752279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */; }; DB63F752279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */; };
DB63F7542799491600455B82 /* DataSourceFacade+SearchHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F7532799491600455B82 /* DataSourceFacade+SearchHistory.swift */; }; DB63F7542799491600455B82 /* DataSourceFacade+SearchHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F7532799491600455B82 /* DataSourceFacade+SearchHistory.swift */; };
DB63F75A279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F759279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift */; };
DB63F76227996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */; }; DB63F76227996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */; };
DB63F764279A5E3C00455B82 /* NotificationTimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F763279A5E3C00455B82 /* NotificationTimelineViewController.swift */; }; DB63F764279A5E3C00455B82 /* NotificationTimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F763279A5E3C00455B82 /* NotificationTimelineViewController.swift */; };
DB63F767279A5EB300455B82 /* NotificationTimelineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F766279A5EB300455B82 /* NotificationTimelineViewModel.swift */; }; DB63F767279A5EB300455B82 /* NotificationTimelineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F766279A5EB300455B82 /* NotificationTimelineViewModel.swift */; };
@ -394,7 +395,6 @@
DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */; }; DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */; };
DB9F58EF26EF491E00E7BBE9 /* AccountListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */; }; DB9F58EF26EF491E00E7BBE9 /* AccountListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */; };
DB9F58F126EF512300E7BBE9 /* AccountListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */; }; DB9F58F126EF512300E7BBE9 /* AccountListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */; };
DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */; };
DBA4B0F626C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; }; DBA4B0F626C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; };
DBA4B0F726C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; }; DBA4B0F726C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; };
DBA5A53126F08EF000CACBAA /* DragIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5A53026F08EF000CACBAA /* DragIndicatorView.swift */; }; DBA5A53126F08EF000CACBAA /* DragIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5A53026F08EF000CACBAA /* DragIndicatorView.swift */; };
@ -637,7 +637,6 @@
2A72812D297EA9D8004138C5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 2A72812D297EA9D8004138C5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
2A72812F297EA9D8004138C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 2A72812F297EA9D8004138C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
2A72813E297EC762004138C5 /* WidgetExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetExtension.swift; sourceTree = "<group>"; }; 2A72813E297EC762004138C5 /* WidgetExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetExtension.swift; sourceTree = "<group>"; };
2A76F75B2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagTimelineHeaderViewActionButton.swift; sourceTree = "<group>"; };
2A82294E29262EE000D2A1F7 /* AppContext+NextAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppContext+NextAccount.swift"; sourceTree = "<group>"; }; 2A82294E29262EE000D2A1F7 /* AppContext+NextAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppContext+NextAccount.swift"; sourceTree = "<group>"; };
2A86A14529892944007F1062 /* MultiFollowersCountIntentHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiFollowersCountIntentHandler.swift; sourceTree = "<group>"; }; 2A86A14529892944007F1062 /* MultiFollowersCountIntentHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiFollowersCountIntentHandler.swift; sourceTree = "<group>"; };
2A86A14829892B3A007F1062 /* MultiFollowersCountWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiFollowersCountWidget.swift; sourceTree = "<group>"; }; 2A86A14829892B3A007F1062 /* MultiFollowersCountWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiFollowersCountWidget.swift; sourceTree = "<group>"; };
@ -776,6 +775,13 @@
D8099077294BC8A30050219F /* PrivacyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewController.swift; sourceTree = "<group>"; }; D8099077294BC8A30050219F /* PrivacyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewController.swift; sourceTree = "<group>"; };
D8099079294BC9390050219F /* PrivacyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewCell.swift; sourceTree = "<group>"; }; D8099079294BC9390050219F /* PrivacyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewCell.swift; sourceTree = "<group>"; };
D809907B294D25510050219F /* PrivacyViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyViewModel.swift; sourceTree = "<group>"; }; D809907B294D25510050219F /* PrivacyViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyViewModel.swift; sourceTree = "<group>"; };
D81A22742AB4643200905D71 /* SearchResultsOverviewTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultsOverviewTableViewController.swift; sourceTree = "<group>"; };
D81A22772AB4782400905D71 /* SearchResultOverviewSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultOverviewSection.swift; sourceTree = "<group>"; };
D81A227A2AB47B9A00905D71 /* SearchResultDefaultSectionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultDefaultSectionTableViewCell.swift; sourceTree = "<group>"; };
D82463522A52B47B00A3DBDD /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/Intents.strings; sourceTree = "<group>"; };
D82463532A52B47B00A3DBDD /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/WidgetExtension.strings; sourceTree = "<group>"; };
D82463542A52B47B00A3DBDD /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/InfoPlist.strings; sourceTree = "<group>"; };
D82463552A52B47B00A3DBDD /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = be; path = be.lproj/Intents.stringsdict; sourceTree = "<group>"; };
D8363B1529469CE200A74079 /* OnboardingNextView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OnboardingNextView.swift; sourceTree = "<group>"; tabWidth = 4; }; D8363B1529469CE200A74079 /* OnboardingNextView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OnboardingNextView.swift; sourceTree = "<group>"; tabWidth = 4; };
D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginView.swift; sourceTree = "<group>"; }; D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginView.swift; sourceTree = "<group>"; };
D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewModel.swift; sourceTree = "<group>"; }; D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewModel.swift; sourceTree = "<group>"; };
@ -795,6 +801,8 @@
D8A6FE6629325F5900666A47 /* Localizable.stringsdict */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; path = Localizable.stringsdict; sourceTree = "<group>"; }; D8A6FE6629325F5900666A47 /* Localizable.stringsdict */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; path = Localizable.stringsdict; sourceTree = "<group>"; };
D8BE30B22A179E26006B8270 /* SuggestionAccountTableViewFooter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuggestionAccountTableViewFooter.swift; sourceTree = "<group>"; }; D8BE30B22A179E26006B8270 /* SuggestionAccountTableViewFooter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuggestionAccountTableViewFooter.swift; sourceTree = "<group>"; };
D8BEBCB52A1B7FFD0004F475 /* SuggestionAccountTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SuggestionAccountTableViewCell+ViewModel.swift"; sourceTree = "<group>"; }; D8BEBCB52A1B7FFD0004F475 /* SuggestionAccountTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SuggestionAccountTableViewCell+ViewModel.swift"; sourceTree = "<group>"; };
D8D688F52AB869CB000F651A /* SearchResultsProfileTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultsProfileTableViewCell.swift; sourceTree = "<group>"; };
D8D688F82AB8B970000F651A /* SearchResultOverviewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultOverviewCoordinator.swift; sourceTree = "<group>"; };
D8E5C345296DAB84007E76A7 /* DataSourceFacade+Status+History.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Status+History.swift"; sourceTree = "<group>"; }; D8E5C345296DAB84007E76A7 /* DataSourceFacade+Status+History.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Status+History.swift"; sourceTree = "<group>"; };
D8E5C348296DB8A3007E76A7 /* StatusEditHistoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusEditHistoryViewController.swift; sourceTree = "<group>"; }; D8E5C348296DB8A3007E76A7 /* StatusEditHistoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusEditHistoryViewController.swift; sourceTree = "<group>"; };
D8F0372B29D232730027DE2E /* HashtagIntentHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagIntentHandler.swift; sourceTree = "<group>"; }; D8F0372B29D232730027DE2E /* HashtagIntentHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagIntentHandler.swift; sourceTree = "<group>"; };
@ -843,7 +851,6 @@
DB0FCB832796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FavoriteViewController+DataSourceProvider.swift"; sourceTree = "<group>"; }; DB0FCB832796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FavoriteViewController+DataSourceProvider.swift"; sourceTree = "<group>"; };
DB0FCB852796BDA1006C02E2 /* SearchSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSection.swift; sourceTree = "<group>"; }; DB0FCB852796BDA1006C02E2 /* SearchSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSection.swift; sourceTree = "<group>"; };
DB0FCB872796BDA9006C02E2 /* SearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchItem.swift; sourceTree = "<group>"; }; DB0FCB872796BDA9006C02E2 /* SearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchItem.swift; sourceTree = "<group>"; };
DB0FCB8B2796BF8D006C02E2 /* SearchViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchViewModel+Diffable.swift"; sourceTree = "<group>"; };
DB0FCB8D2796C0B7006C02E2 /* TrendCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendCollectionViewCell.swift; sourceTree = "<group>"; }; DB0FCB8D2796C0B7006C02E2 /* TrendCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendCollectionViewCell.swift; sourceTree = "<group>"; };
DB0FCB912796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendSectionHeaderCollectionReusableView.swift; sourceTree = "<group>"; }; DB0FCB912796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendSectionHeaderCollectionReusableView.swift; sourceTree = "<group>"; };
DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchResultViewModel+Diffable.swift"; sourceTree = "<group>"; }; DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchResultViewModel+Diffable.swift"; sourceTree = "<group>"; };
@ -925,7 +932,6 @@
DB4B779626CA50BA00B087B3 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = th; path = th.lproj/Intents.stringsdict; sourceTree = "<group>"; }; DB4B779626CA50BA00B087B3 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = th; path = th.lproj/Intents.stringsdict; sourceTree = "<group>"; };
DB4F0962269ED06300D62E92 /* SearchResultViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultViewController.swift; sourceTree = "<group>"; }; DB4F0962269ED06300D62E92 /* SearchResultViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultViewController.swift; sourceTree = "<group>"; };
DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultViewModel.swift; sourceTree = "<group>"; }; DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultViewModel.swift; sourceTree = "<group>"; };
DB4F0967269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistoryTableHeaderView.swift; sourceTree = "<group>"; };
DB4F0969269EDAD200D62E92 /* SearchResultViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchResultViewModel+State.swift"; sourceTree = "<group>"; }; DB4F0969269EDAD200D62E92 /* SearchResultViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchResultViewModel+State.swift"; sourceTree = "<group>"; };
DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistoryViewModel.swift; sourceTree = "<group>"; }; DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistoryViewModel.swift; sourceTree = "<group>"; };
DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistorySection.swift; sourceTree = "<group>"; }; DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistorySection.swift; sourceTree = "<group>"; };
@ -985,7 +991,6 @@
DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryViewModel+Diffable.swift"; sourceTree = "<group>"; }; DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryViewModel+Diffable.swift"; sourceTree = "<group>"; };
DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistorySectionHeaderCollectionReusableView.swift; sourceTree = "<group>"; }; DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistorySectionHeaderCollectionReusableView.swift; sourceTree = "<group>"; };
DB63F7532799491600455B82 /* DataSourceFacade+SearchHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+SearchHistory.swift"; sourceTree = "<group>"; }; DB63F7532799491600455B82 /* DataSourceFacade+SearchHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+SearchHistory.swift"; sourceTree = "<group>"; };
DB63F759279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryUserCollectionViewCell+ViewModel.swift"; sourceTree = "<group>"; };
DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryViewController+DataSourceProvider.swift"; sourceTree = "<group>"; }; DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryViewController+DataSourceProvider.swift"; sourceTree = "<group>"; };
DB63F763279A5E3C00455B82 /* NotificationTimelineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTimelineViewController.swift; sourceTree = "<group>"; }; DB63F763279A5E3C00455B82 /* NotificationTimelineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTimelineViewController.swift; sourceTree = "<group>"; };
DB63F766279A5EB300455B82 /* NotificationTimelineViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTimelineViewModel.swift; sourceTree = "<group>"; }; DB63F766279A5EB300455B82 /* NotificationTimelineViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTimelineViewModel.swift; sourceTree = "<group>"; };
@ -1097,7 +1102,6 @@
DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewController.swift; sourceTree = "<group>"; }; DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewController.swift; sourceTree = "<group>"; };
DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListViewModel.swift; sourceTree = "<group>"; }; DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListViewModel.swift; sourceTree = "<group>"; };
DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListTableViewCell.swift; sourceTree = "<group>"; }; DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListTableViewCell.swift; sourceTree = "<group>"; };
DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeToolbarView.swift; sourceTree = "<group>"; };
DBA4B0D326BD10AC0077136E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Intents.strings"; sourceTree = "<group>"; }; DBA4B0D326BD10AC0077136E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Intents.strings"; sourceTree = "<group>"; };
DBA4B0D626BD10AD0077136E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; DBA4B0D626BD10AD0077136E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
DBA4B0D726BD10F40077136E /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Intents.strings; sourceTree = "<group>"; }; DBA4B0D726BD10F40077136E /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Intents.strings; sourceTree = "<group>"; };
@ -1315,7 +1319,6 @@
0F20220626134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift */, 0F20220626134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift */,
0F20222C261457EE000C64BF /* HashtagTimelineViewModel+State.swift */, 0F20222C261457EE000C64BF /* HashtagTimelineViewModel+State.swift */,
2A506CF5292D040100059C37 /* HashtagTimelineHeaderView.swift */, 2A506CF5292D040100059C37 /* HashtagTimelineHeaderView.swift */,
2A76F75B2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift */,
); );
path = HashtagTimeline; path = HashtagTimeline;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1791,6 +1794,26 @@
path = Privacy; path = Privacy;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D81A22732AB4641F00905D71 /* Search Results Overview */ = {
isa = PBXGroup;
children = (
D81A22792AB47B8400905D71 /* Cells */,
D81A22742AB4643200905D71 /* SearchResultsOverviewTableViewController.swift */,
D81A22772AB4782400905D71 /* SearchResultOverviewSection.swift */,
D8D688F82AB8B970000F651A /* SearchResultOverviewCoordinator.swift */,
);
path = "Search Results Overview";
sourceTree = "<group>";
};
D81A22792AB47B8400905D71 /* Cells */ = {
isa = PBXGroup;
children = (
D81A227A2AB47B9A00905D71 /* SearchResultDefaultSectionTableViewCell.swift */,
D8D688F52AB869CB000F651A /* SearchResultsProfileTableViewCell.swift */,
);
path = Cells;
sourceTree = "<group>";
};
D8A6AB68291C50F3003AB663 /* Login */ = { D8A6AB68291C50F3003AB663 /* Login */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -2097,6 +2120,8 @@
DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */, DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */,
DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */, DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */,
DB4F0969269EDAD200D62E92 /* SearchResultViewModel+State.swift */, DB4F0969269EDAD200D62E92 /* SearchResultViewModel+State.swift */,
2D198648261C0B8500F0B013 /* SearchResultSection.swift */,
2D198642261BF09500F0B013 /* SearchResultItem.swift */,
); );
path = SearchResult; path = SearchResult;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2106,10 +2131,6 @@
children = ( children = (
DB0FCB852796BDA1006C02E2 /* SearchSection.swift */, DB0FCB852796BDA1006C02E2 /* SearchSection.swift */,
DB0FCB872796BDA9006C02E2 /* SearchItem.swift */, DB0FCB872796BDA9006C02E2 /* SearchItem.swift */,
2D198648261C0B8500F0B013 /* SearchResultSection.swift */,
2D198642261BF09500F0B013 /* SearchResultItem.swift */,
DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */,
DB4F097C26A03A5B00D62E92 /* SearchHistoryItem.swift */,
); );
path = Search; path = Search;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2132,14 +2153,6 @@
path = Status; path = Status;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
DB4F098026A0475500D62E92 /* View */ = {
isa = PBXGroup;
children = (
DB4F0967269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift */,
);
path = View;
sourceTree = "<group>";
};
DB4FFC2D269EC39C00D62E92 /* Search */ = { DB4FFC2D269EC39C00D62E92 /* Search */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -2160,7 +2173,6 @@
DB55D32225FB4D320002F825 /* View */ = { DB55D32225FB4D320002F825 /* View */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */,
DB8190C52601FF0400020C08 /* AttachmentContainerView.swift */, DB8190C52601FF0400020C08 /* AttachmentContainerView.swift */,
DB9A486B26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift */, DB9A486B26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift */,
DBC7A671260C897100E57475 /* StatusContentWarningEditorView.swift */, DBC7A671260C897100E57475 /* StatusContentWarningEditorView.swift */,
@ -2279,7 +2291,6 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
DB63F74C27993F5B00455B82 /* SearchHistoryUserCollectionViewCell.swift */, DB63F74C27993F5B00455B82 /* SearchHistoryUserCollectionViewCell.swift */,
DB63F759279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift */,
DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */, DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */,
); );
path = Cell; path = Cell;
@ -2901,6 +2912,7 @@
DBF1D24F269DAF6100C1C08A /* SearchDetail */ = { DBF1D24F269DAF6100C1C08A /* SearchDetail */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D81A22732AB4641F00905D71 /* Search Results Overview */,
DB4F0964269ED06700D62E92 /* SearchResult */, DB4F0964269ED06700D62E92 /* SearchResult */,
DBF1D252269DB01700C1C08A /* SearchHistory */, DBF1D252269DB01700C1C08A /* SearchHistory */,
DBF1D24D269DAF5D00C1C08A /* SearchDetailViewController.swift */, DBF1D24D269DAF5D00C1C08A /* SearchDetailViewController.swift */,
@ -2913,11 +2925,12 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
DB63F7502799449300455B82 /* Cell */, DB63F7502799449300455B82 /* Cell */,
DB4F098026A0475500D62E92 /* View */,
DBF1D250269DB01200C1C08A /* SearchHistoryViewController.swift */, DBF1D250269DB01200C1C08A /* SearchHistoryViewController.swift */,
DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */, DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */,
DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */, DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */,
DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */, DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */,
DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */,
DB4F097C26A03A5B00D62E92 /* SearchHistoryItem.swift */,
); );
path = SearchHistory; path = SearchHistory;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2929,7 +2942,6 @@
2DE0FAC62615F5D200CDF649 /* View */, 2DE0FAC62615F5D200CDF649 /* View */,
DB9D6BE825E4F5340051B173 /* SearchViewController.swift */, DB9D6BE825E4F5340051B173 /* SearchViewController.swift */,
2D6DE3FF26141DF600A63F6A /* SearchViewModel.swift */, 2D6DE3FF26141DF600A63F6A /* SearchViewModel.swift */,
DB0FCB8B2796BF8D006C02E2 /* SearchViewModel+Diffable.swift */,
); );
path = Search; path = Search;
sourceTree = "<group>"; sourceTree = "<group>";
@ -3228,6 +3240,7 @@
cs, cs,
sl, sl,
el, el,
be,
); );
mainGroup = DB427DC925BAA00100D1B89D; mainGroup = DB427DC925BAA00100D1B89D;
packageReferences = ( packageReferences = (
@ -3539,8 +3552,8 @@
DB3E6FE02806A4ED00B035AE /* DiscoveryHashtagsViewModel.swift in Sources */, DB3E6FE02806A4ED00B035AE /* DiscoveryHashtagsViewModel.swift in Sources */,
2D38F1F725CD47AC00561493 /* HomeTimelineViewModel+LoadOldestState.swift in Sources */, 2D38F1F725CD47AC00561493 /* HomeTimelineViewModel+LoadOldestState.swift in Sources */,
DB0FCB7427956939006C02E2 /* DataSourceFacade+Status.swift in Sources */, DB0FCB7427956939006C02E2 /* DataSourceFacade+Status.swift in Sources */,
D81A22782AB4782400905D71 /* SearchResultOverviewSection.swift in Sources */,
DBB525502611ED6D002F1F29 /* ProfileHeaderView.swift in Sources */, DBB525502611ED6D002F1F29 /* ProfileHeaderView.swift in Sources */,
DB63F75A279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift in Sources */,
DB023D26279FFB0A005AC798 /* ShareActivityProvider.swift in Sources */, DB023D26279FFB0A005AC798 /* ShareActivityProvider.swift in Sources */,
5D0393962612D266007FE196 /* WebViewModel.swift in Sources */, 5D0393962612D266007FE196 /* WebViewModel.swift in Sources */,
5B24BBDA262DB14800A9381B /* ReportViewModel.swift in Sources */, 5B24BBDA262DB14800A9381B /* ReportViewModel.swift in Sources */,
@ -3588,7 +3601,6 @@
DB0FCB9C27980AB6006C02E2 /* HashtagTimelineViewController+DataSourceProvider.swift in Sources */, DB0FCB9C27980AB6006C02E2 /* HashtagTimelineViewController+DataSourceProvider.swift in Sources */,
DB63F76F279A7D1100455B82 /* NotificationTableViewCell.swift in Sources */, DB63F76F279A7D1100455B82 /* NotificationTableViewCell.swift in Sources */,
2A1BF99529F7E68400FA1BA5 /* DataSourceFacade+UserView.swift in Sources */, 2A1BF99529F7E68400FA1BA5 /* DataSourceFacade+UserView.swift in Sources */,
DB0FCB8C2796BF8D006C02E2 /* SearchViewModel+Diffable.swift in Sources */,
DBEFCD76282A143F00C0ABEA /* ReportStatusViewController.swift in Sources */, DBEFCD76282A143F00C0ABEA /* ReportStatusViewController.swift in Sources */,
DBDFF1952805561700557A48 /* DiscoveryPostsViewModel+Diffable.swift in Sources */, DBDFF1952805561700557A48 /* DiscoveryPostsViewModel+Diffable.swift in Sources */,
DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */, DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */,
@ -3693,8 +3705,8 @@
2D84350525FF858100EECE90 /* UIScrollView.swift in Sources */, 2D84350525FF858100EECE90 /* UIScrollView.swift in Sources */,
6213AF5A28939C8400BCADB6 /* BookmarkViewModel.swift in Sources */, 6213AF5A28939C8400BCADB6 /* BookmarkViewModel.swift in Sources */,
5B24BBDB262DB14800A9381B /* ReportStatusViewModel+Diffable.swift in Sources */, 5B24BBDB262DB14800A9381B /* ReportStatusViewModel+Diffable.swift in Sources */,
DB4F0968269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift in Sources */,
5DA732CC2629CEF500A92342 /* UIView+Remove.swift in Sources */, 5DA732CC2629CEF500A92342 /* UIView+Remove.swift in Sources */,
D81A22752AB4643200905D71 /* SearchResultsOverviewTableViewController.swift in Sources */,
2A506CF4292CD85800059C37 /* FollowedTagsViewController.swift in Sources */, 2A506CF4292CD85800059C37 /* FollowedTagsViewController.swift in Sources */,
DB1D843026566512000346B3 /* KeyboardPreference.swift in Sources */, DB1D843026566512000346B3 /* KeyboardPreference.swift in Sources */,
DB852D1926FAEB6B00FC9D81 /* SidebarViewController.swift in Sources */, DB852D1926FAEB6B00FC9D81 /* SidebarViewController.swift in Sources */,
@ -3791,8 +3803,10 @@
DB63F77B279ACAE500455B82 /* DataSourceFacade+Favorite.swift in Sources */, DB63F77B279ACAE500455B82 /* DataSourceFacade+Favorite.swift in Sources */,
DB9D6BF825E4F5690051B173 /* NotificationViewController.swift in Sources */, DB9D6BF825E4F5690051B173 /* NotificationViewController.swift in Sources */,
2DAC9E46262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift in Sources */, 2DAC9E46262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift in Sources */,
D8D688F92AB8B970000F651A /* SearchResultOverviewCoordinator.swift in Sources */,
DB4FFC2C269EC39600D62E92 /* SearchTransitionController.swift in Sources */, DB4FFC2C269EC39600D62E92 /* SearchTransitionController.swift in Sources */,
2A3D9B7E29A8F33A00F30313 /* StatusHistoryView.swift in Sources */, 2A3D9B7E29A8F33A00F30313 /* StatusHistoryView.swift in Sources */,
D81A227B2AB47B9A00905D71 /* SearchResultDefaultSectionTableViewCell.swift in Sources */,
6213AF5E2893A8B200BCADB6 /* DataSourceFacade+Bookmark.swift in Sources */, 6213AF5E2893A8B200BCADB6 /* DataSourceFacade+Bookmark.swift in Sources */,
DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */, DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */,
DBF156E22702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m in Sources */, DBF156E22702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m in Sources */,
@ -3831,7 +3845,6 @@
DB45FAB625CA5485005A8AC7 /* UIAlertController.swift in Sources */, DB45FAB625CA5485005A8AC7 /* UIAlertController.swift in Sources */,
DBE0821525CD382600FD6BBD /* MastodonRegisterViewController.swift in Sources */, DBE0821525CD382600FD6BBD /* MastodonRegisterViewController.swift in Sources */,
DBEFCD74282A130400C0ABEA /* ReportReasonViewModel.swift in Sources */, DBEFCD74282A130400C0ABEA /* ReportReasonViewModel.swift in Sources */,
DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */,
DBFEEC96279BDC67004F81DD /* ProfileAboutViewController.swift in Sources */, DBFEEC96279BDC67004F81DD /* ProfileAboutViewController.swift in Sources */,
DB63F74F2799405600455B82 /* SearchHistoryViewModel+Diffable.swift in Sources */, DB63F74F2799405600455B82 /* SearchHistoryViewModel+Diffable.swift in Sources */,
DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */, DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */,
@ -3862,7 +3875,6 @@
DBCC3B30261440A50045B23D /* UITabBarController.swift in Sources */, DBCC3B30261440A50045B23D /* UITabBarController.swift in Sources */,
DB3E6FE42806A5B800B035AE /* DiscoverySection.swift in Sources */, DB3E6FE42806A5B800B035AE /* DiscoverySection.swift in Sources */,
DB8190C62601FF0400020C08 /* AttachmentContainerView.swift in Sources */, DB8190C62601FF0400020C08 /* AttachmentContainerView.swift in Sources */,
2A76F75C2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift in Sources */,
DB697DDB278F4DE3004EF2F7 /* DataSourceProvider+StatusTableViewCellDelegate.swift in Sources */, DB697DDB278F4DE3004EF2F7 /* DataSourceProvider+StatusTableViewCellDelegate.swift in Sources */,
DB87D4512609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift in Sources */, DB87D4512609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift in Sources */,
DBB45B5627B39FC9002DC5A7 /* MediaPreviewVideoViewController.swift in Sources */, DBB45B5627B39FC9002DC5A7 /* MediaPreviewVideoViewController.swift in Sources */,
@ -3874,6 +3886,7 @@
DBFEEC99279BDCDE004F81DD /* ProfileAboutViewModel.swift in Sources */, DBFEEC99279BDCDE004F81DD /* ProfileAboutViewModel.swift in Sources */,
2D198649261C0B8500F0B013 /* SearchResultSection.swift in Sources */, 2D198649261C0B8500F0B013 /* SearchResultSection.swift in Sources */,
DB4F097B26A039FF00D62E92 /* SearchHistorySection.swift in Sources */, DB4F097B26A039FF00D62E92 /* SearchHistorySection.swift in Sources */,
D8D688F62AB869CB000F651A /* SearchResultsProfileTableViewCell.swift in Sources */,
2A82294F29262EE000D2A1F7 /* AppContext+NextAccount.swift in Sources */, 2A82294F29262EE000D2A1F7 /* AppContext+NextAccount.swift in Sources */,
DBB525302611EBF3002F1F29 /* ProfilePagingViewModel.swift in Sources */, DBB525302611EBF3002F1F29 /* ProfilePagingViewModel.swift in Sources */,
DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */, DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */,
@ -4046,6 +4059,7 @@
2AB501522992443C00346092 /* eu */, 2AB501522992443C00346092 /* eu */,
2AB501542992443D00346092 /* ar */, 2AB501542992443D00346092 /* ar */,
D87DC50C2A17C32F00219C5F /* el */, D87DC50C2A17C32F00219C5F /* el */,
D82463532A52B47B00A3DBDD /* be */,
); );
name = WidgetExtension.intentdefinition; name = WidgetExtension.intentdefinition;
sourceTree = "<group>"; sourceTree = "<group>";
@ -4081,6 +4095,7 @@
DB96C25D292505FE00F3B85D /* cs */, DB96C25D292505FE00F3B85D /* cs */,
DB96C260292506D600F3B85D /* sl */, DB96C260292506D600F3B85D /* sl */,
D87DC50B2A17C32E00219C5F /* el */, D87DC50B2A17C32E00219C5F /* el */,
D82463522A52B47B00A3DBDD /* be */,
); );
name = Intents.intentdefinition; name = Intents.intentdefinition;
sourceTree = "<group>"; sourceTree = "<group>";
@ -4115,6 +4130,7 @@
DB96C25E292505FF00F3B85D /* cs */, DB96C25E292505FF00F3B85D /* cs */,
DB96C261292506D700F3B85D /* sl */, DB96C261292506D700F3B85D /* sl */,
D87DC50D2A17C32F00219C5F /* el */, D87DC50D2A17C32F00219C5F /* el */,
D82463542A52B47B00A3DBDD /* be */,
); );
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";
@ -4165,6 +4181,7 @@
DB96C25F292505FF00F3B85D /* cs */, DB96C25F292505FF00F3B85D /* cs */,
DB96C262292506D700F3B85D /* sl */, DB96C262292506D700F3B85D /* sl */,
D87DC50E2A17C32F00219C5F /* el */, D87DC50E2A17C32F00219C5F /* el */,
D82463552A52B47B00A3DBDD /* be */,
); );
name = Intents.stringsdict; name = Intents.stringsdict;
sourceTree = "<group>"; sourceTree = "<group>";
@ -4567,7 +4584,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2023.10; MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -4599,7 +4616,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2023.10; MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -4786,7 +4803,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2023.10; MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -5077,7 +5094,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2023.10; MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";

View File

@ -9,10 +9,13 @@ import UIKit
import MastodonCore import MastodonCore
protocol NeedsDependency: AnyObject { protocol NeedsDependency: AnyObject {
//FIXME: Get rid of ! ~@zeitschlag
var context: AppContext! { get set } var context: AppContext! { get set }
var coordinator: SceneCoordinator! { get set } var coordinator: SceneCoordinator! { get set }
} }
typealias ViewControllerWithDependencies = NeedsDependency & UIViewController
extension UISceneSession { extension UISceneSession {
private struct AssociatedKeys { private struct AssociatedKeys {
static var sceneCoordinator = "SceneCoordinator" static var sceneCoordinator = "SceneCoordinator"

View File

@ -149,6 +149,7 @@ extension SceneCoordinator {
// search // search
case searchDetail(viewModel: SearchDetailViewModel) case searchDetail(viewModel: SearchDetailViewModel)
case searchResult(viewModel: SearchResultViewModel)
// compose // compose
case compose(viewModel: ComposeViewModel) case compose(viewModel: ComposeViewModel)
@ -371,159 +372,169 @@ private extension SceneCoordinator {
let viewController: UIViewController? let viewController: UIViewController?
switch scene { switch scene {
case .welcome: case .welcome:
let _viewController = WelcomeViewController() let _viewController = WelcomeViewController()
viewController = _viewController viewController = _viewController
case .mastodonPickServer(let viewModel): case .mastodonPickServer(let viewModel):
let _viewController = MastodonPickServerViewController() let _viewController = MastodonPickServerViewController()
_viewController.viewModel = viewModel _viewController.viewModel = viewModel
viewController = _viewController viewController = _viewController
case .mastodonRegister(let viewModel): case .mastodonRegister(let viewModel):
let _viewController = MastodonRegisterViewController() let _viewController = MastodonRegisterViewController()
_viewController.viewModel = viewModel _viewController.viewModel = viewModel
viewController = _viewController viewController = _viewController
case .mastodonServerRules(let viewModel): case .mastodonServerRules(let viewModel):
let _viewController = MastodonServerRulesViewController() let _viewController = MastodonServerRulesViewController()
_viewController.viewModel = viewModel _viewController.viewModel = viewModel
viewController = _viewController viewController = _viewController
case .mastodonConfirmEmail(let viewModel): case .mastodonConfirmEmail(let viewModel):
let _viewController = MastodonConfirmEmailViewController() let _viewController = MastodonConfirmEmailViewController()
_viewController.viewModel = viewModel _viewController.viewModel = viewModel
viewController = _viewController viewController = _viewController
case .mastodonLogin: case .mastodonLogin:
let loginViewController = MastodonLoginViewController(appContext: appContext, let loginViewController = MastodonLoginViewController(appContext: appContext,
authenticationViewModel: AuthenticationViewModel(context: appContext, coordinator: self, isAuthenticationExist: false), authenticationViewModel: AuthenticationViewModel(context: appContext, coordinator: self, isAuthenticationExist: false),
sceneCoordinator: self) sceneCoordinator: self)
loginViewController.delegate = self loginViewController.delegate = self
viewController = loginViewController viewController = loginViewController
case .mastodonPrivacyPolicies(let viewModel): case .mastodonPrivacyPolicies(let viewModel):
let privacyViewController = PrivacyTableViewController(context: appContext, coordinator: self, viewModel: viewModel) let privacyViewController = PrivacyTableViewController(context: appContext, coordinator: self, viewModel: viewModel)
viewController = privacyViewController viewController = privacyViewController
case .mastodonResendEmail(let viewModel): case .mastodonResendEmail(let viewModel):
let _viewController = MastodonResendEmailViewController() let _viewController = MastodonResendEmailViewController()
_viewController.viewModel = viewModel _viewController.viewModel = viewModel
viewController = _viewController viewController = _viewController
case .mastodonWebView(let viewModel): case .mastodonWebView(let viewModel):
let _viewController = WebViewController() let _viewController = WebViewController()
_viewController.viewModel = viewModel _viewController.viewModel = viewModel
viewController = _viewController viewController = _viewController
case .searchDetail(let viewModel):
let _viewController = SearchDetailViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .compose(let viewModel):
let _viewController = ComposeViewController(viewModel: viewModel)
viewController = _viewController
case .thread(let viewModel):
let _viewController = ThreadViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .editHistory(let viewModel):
let editHistoryViewController = StatusEditHistoryViewController(viewModel: viewModel)
viewController = editHistoryViewController
case .hashtagTimeline(let viewModel):
let _viewController = HashtagTimelineViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .accountList(let viewModel):
let _viewController = AccountListViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .profile(let viewModel):
let _viewController = ProfileViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .bookmark(let viewModel):
let _viewController = BookmarkViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .followedTags(let viewModel):
let _viewController = FollowedTagsViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .favorite(let viewModel):
let _viewController = FavoriteViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .follower(let viewModel):
let _viewController = FollowerListViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .following(let viewModel):
let _viewController = FollowingListViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .familiarFollowers(let viewModel):
let _viewController = FamiliarFollowersViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .rebloggedBy(let viewModel):
let _viewController = RebloggedByViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .favoritedBy(let viewModel):
let _viewController = FavoritedByViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .report(let viewModel):
let _viewController = ReportViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportServerRules(let viewModel):
let _viewController = ReportServerRulesViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportStatus(let viewModel):
let _viewController = ReportStatusViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportSupplementary(let viewModel):
let _viewController = ReportSupplementaryViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportResult(let viewModel):
let _viewController = ReportResultViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .suggestionAccount(let viewModel):
let _viewController = SuggestionAccountViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mediaPreview(let viewModel):
let _viewController = MediaPreviewViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .safari(let url):
guard let scheme = url.scheme?.lowercased(),
scheme == "http" || scheme == "https" else {
return nil
}
let _viewController = SFSafariViewController(url: url)
_viewController.preferredBarTintColor = ThemeService.shared.currentTheme.value.navigationBarBackgroundColor
_viewController.preferredControlTintColor = Asset.Colors.Brand.blurple.color
viewController = _viewController
case .alertController(let alertController):
if let popoverPresentationController = alertController.popoverPresentationController { case .searchDetail(let viewModel):
assert( let _viewController = SearchDetailViewController(appContext: appContext, sceneCoordinator: self, authContext: viewModel.authContext)
popoverPresentationController.sourceView != nil || _viewController.viewModel = viewModel
popoverPresentationController.sourceRect != .zero || viewController = _viewController
popoverPresentationController.barButtonItem != nil case .searchResult(let viewModel):
) let searchResultViewController = SearchResultViewController()
} searchResultViewController.context = appContext
viewController = alertController searchResultViewController.coordinator = self
case .activityViewController(let activityViewController, let sourceView, let barButtonItem): searchResultViewController.viewModel = viewModel
activityViewController.popoverPresentationController?.sourceView = sourceView viewController = searchResultViewController
activityViewController.popoverPresentationController?.barButtonItem = barButtonItem
viewController = activityViewController
case .settings(let viewModel): case .compose(let viewModel):
let _viewController = SettingsViewController() let _viewController = ComposeViewController(viewModel: viewModel)
_viewController.viewModel = viewModel viewController = _viewController
viewController = _viewController case .thread(let viewModel):
case .editStatus(let viewModel): let _viewController = ThreadViewController()
let composeViewController = ComposeViewController(viewModel: viewModel) _viewController.viewModel = viewModel
viewController = composeViewController viewController = _viewController
case .editHistory(let viewModel):
let editHistoryViewController = StatusEditHistoryViewController(viewModel: viewModel)
viewController = editHistoryViewController
case .hashtagTimeline(let viewModel):
let _viewController = HashtagTimelineViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .accountList(let viewModel):
let _viewController = AccountListViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .profile(let viewModel):
let _viewController = ProfileViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .bookmark(let viewModel):
let _viewController = BookmarkViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .followedTags(let viewModel):
let _viewController = FollowedTagsViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .favorite(let viewModel):
let _viewController = FavoriteViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .follower(let viewModel):
let _viewController = FollowerListViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .following(let viewModel):
let _viewController = FollowingListViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .familiarFollowers(let viewModel):
let _viewController = FamiliarFollowersViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .rebloggedBy(let viewModel):
let _viewController = RebloggedByViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .favoritedBy(let viewModel):
let _viewController = FavoritedByViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .report(let viewModel):
let _viewController = ReportViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportServerRules(let viewModel):
let _viewController = ReportServerRulesViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportStatus(let viewModel):
let _viewController = ReportStatusViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportSupplementary(let viewModel):
let _viewController = ReportSupplementaryViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .reportResult(let viewModel):
let _viewController = ReportResultViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .suggestionAccount(let viewModel):
let _viewController = SuggestionAccountViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mediaPreview(let viewModel):
let _viewController = MediaPreviewViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .safari(let url):
guard let scheme = url.scheme?.lowercased(),
scheme == "http" || scheme == "https" else {
return nil
}
let _viewController = SFSafariViewController(url: url)
_viewController.preferredBarTintColor = ThemeService.shared.currentTheme.value.navigationBarBackgroundColor
_viewController.preferredControlTintColor = Asset.Colors.Brand.blurple.color
viewController = _viewController
case .alertController(let alertController):
if let popoverPresentationController = alertController.popoverPresentationController {
assert(
popoverPresentationController.sourceView != nil ||
popoverPresentationController.sourceRect != .zero ||
popoverPresentationController.barButtonItem != nil
)
}
viewController = alertController
case .activityViewController(let activityViewController, let sourceView, let barButtonItem):
activityViewController.popoverPresentationController?.sourceView = sourceView
activityViewController.popoverPresentationController?.barButtonItem = barButtonItem
viewController = activityViewController
case .settings(let viewModel):
let _viewController = SettingsViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .editStatus(let viewModel):
let composeViewController = ComposeViewController(viewModel: viewModel)
viewController = composeViewController
} }
setupDependency(for: viewController as? NeedsDependency) setupDependency(for: viewController as? NeedsDependency)

View File

@ -39,30 +39,31 @@ extension UserSection {
return UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item -> UITableViewCell? in return UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item -> UITableViewCell? in
switch item { switch item {
case .user(let record): case .user(let record):
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: UserTableViewCell.self), for: indexPath) as! UserTableViewCell let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: UserTableViewCell.self), for: indexPath) as! UserTableViewCell
context.managedObjectContext.performAndWait { context.managedObjectContext.performAndWait {
guard let user = record.object(in: context.managedObjectContext) else { return } guard let user = record.object(in: context.managedObjectContext) else { return }
configure( configure(
context: context, context: context,
authContext: authContext, authContext: authContext,
tableView: tableView, tableView: tableView,
cell: cell, cell: cell,
viewModel: UserTableViewCell.ViewModel(value: .user(user), viewModel: UserTableViewCell.ViewModel(
followedUsers: authContext.mastodonAuthenticationBox.inMemoryCache.$followingUserIds.eraseToAnyPublisher(), user: user,
blockedUsers: authContext.mastodonAuthenticationBox.inMemoryCache.$blockedUserIds.eraseToAnyPublisher(), followedUsers: authContext.mastodonAuthenticationBox.inMemoryCache.$followingUserIds.eraseToAnyPublisher(),
followRequestedUsers: authContext.mastodonAuthenticationBox.inMemoryCache.$followRequestedUserIDs.eraseToAnyPublisher() blockedUsers: authContext.mastodonAuthenticationBox.inMemoryCache.$blockedUserIds.eraseToAnyPublisher(),
), followRequestedUsers: authContext.mastodonAuthenticationBox.inMemoryCache.$followRequestedUserIDs.eraseToAnyPublisher()
configuration: configuration ),
) configuration: configuration
} )
}
return cell
case .bottomLoader: return cell
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell case .bottomLoader:
cell.startAnimating() let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell
return cell cell.startAnimating()
case .bottomHeader(let text): return cell
case .bottomHeader(let text):
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineFooterTableViewCell.self), for: indexPath) as! TimelineFooterTableViewCell let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineFooterTableViewCell.self), for: indexPath) as! TimelineFooterTableViewCell
cell.messageLabel.text = text cell.messageLabel.text = text
return cell return cell

View File

@ -26,7 +26,7 @@ extension DataSourceFacade {
@MainActor @MainActor
static func coordinateToHashtagScene( static func coordinateToHashtagScene(
provider: DataSourceProvider & AuthContextProvider, provider: ViewControllerWithDependencies & AuthContextProvider,
tag: Mastodon.Entity.Tag tag: Mastodon.Entity.Tag
) async { ) async {
let hashtagTimelineViewModel = HashtagTimelineViewModel( let hashtagTimelineViewModel = HashtagTimelineViewModel(

View File

@ -33,7 +33,7 @@ extension DataSourceFacade {
@MainActor @MainActor
static func coordinateToProfileScene( static func coordinateToProfileScene(
provider: DataSourceProvider & AuthContextProvider, provider: ViewControllerWithDependencies & AuthContextProvider,
user: ManagedObjectRecord<MastodonUser> user: ManagedObjectRecord<MastodonUser>
) async { ) async {
guard let user = user.object(in: provider.context.managedObjectContext) else { guard let user = user.object(in: provider.context.managedObjectContext) else {
@ -127,227 +127,6 @@ extension DataSourceFacade {
let barButtonItem: UIBarButtonItem? let barButtonItem: UIBarButtonItem?
} }
// @MainActor
// static func createProfileActionMenu(
// dependency: NeedsDependency,
// user: ManagedObjectRecord<MastodonUser>
// ) -> UIMenu {
// var children: [UIMenuElement] = []
// let name = mastodonUser.displayNameWithFallback
//
// if let shareUser = shareUser {
// let shareAction = UIAction(
// title: L10n.Common.Controls.Actions.shareUser(name),
// image: UIImage(systemName: "square.and.arrow.up"),
// identifier: nil,
// discoverabilityTitle: nil,
// attributes: [],
// state: .off
// ) { [weak provider, weak sourceView, weak barButtonItem] _ in
// guard let provider = provider else { return }
// let activityViewController = createActivityViewControllerForMastodonUser(mastodonUser: shareUser, dependency: provider)
// provider.coordinator.present(
// scene: .activityViewController(
// activityViewController: activityViewController,
// sourceView: sourceView,
// barButtonItem: barButtonItem
// ),
// from: provider,
// transition: .activityViewControllerPresent(animated: true, completion: nil)
// )
// }
// children.append(shareAction)
// }
//
// if let shareStatus = shareStatus {
// let shareAction = UIAction(
// title: L10n.Common.Controls.Actions.sharePost,
// image: UIImage(systemName: "square.and.arrow.up"),
// identifier: nil,
// discoverabilityTitle: nil,
// attributes: [],
// state: .off
// ) { [weak provider, weak sourceView, weak barButtonItem] _ in
// guard let provider = provider else { return }
// let activityViewController = createActivityViewControllerForMastodonUser(status: shareStatus, dependency: provider)
// provider.coordinator.present(
// scene: .activityViewController(
// activityViewController: activityViewController,
// sourceView: sourceView,
// barButtonItem: barButtonItem
// ),
// from: provider,
// transition: .activityViewControllerPresent(animated: true, completion: nil)
// )
// }
// children.append(shareAction)
// }
//
// if !isMyself {
// // mute
// let muteAction = UIAction(
// title: isMuting ? L10n.Common.Controls.Friendship.unmuteUser(name) : L10n.Common.Controls.Friendship.mute,
// image: isMuting ? UIImage(systemName: "speaker") : UIImage(systemName: "speaker.slash"),
// discoverabilityTitle: isMuting ? nil : L10n.Common.Controls.Friendship.muteUser(name),
// attributes: isMuting ? [] : .destructive,
// state: .off
// ) { [weak provider, weak cell] _ in
// guard let provider = provider else { return }
//
// UserProviderFacade.toggleUserMuteRelationship(
// provider: provider,
// cell: cell
// )
// .sink { _ in
// // do nothing
// } receiveValue: { _ in
// // do nothing
// }
// .store(in: &provider.context.disposeBag)
// }
// if isMuting {
// children.append(muteAction)
// } else {
// let muteMenu = UIMenu(title: L10n.Common.Controls.Friendship.muteUser(name), image: UIImage(systemName: "speaker.slash"), options: [], children: [muteAction])
// children.append(muteMenu)
// }
// }
//
// if !isMyself {
// // block
// let blockAction = UIAction(
// title: isBlocking ? L10n.Common.Controls.Friendship.unblockUser(name) : L10n.Common.Controls.Friendship.block,
// image: isBlocking ? UIImage(systemName: "hand.raised.slash") : UIImage(systemName: "hand.raised"),
// discoverabilityTitle: isBlocking ? nil : L10n.Common.Controls.Friendship.blockUser(name),
// attributes: isBlocking ? [] : .destructive,
// state: .off
// ) { [weak provider, weak cell] _ in
// guard let provider = provider else { return }
//
// UserProviderFacade.toggleUserBlockRelationship(
// provider: provider,
// cell: cell
// )
// .sink { _ in
// // do nothing
// } receiveValue: { _ in
// // do nothing
// }
// .store(in: &provider.context.disposeBag)
// }
// if isBlocking {
// children.append(blockAction)
// } else {
// let blockMenu = UIMenu(title: L10n.Common.Controls.Friendship.blockUser(name), image: UIImage(systemName: "hand.raised"), options: [], children: [blockAction])
// children.append(blockMenu)
// }
// }
//
// if !isMyself {
// let reportAction = UIAction(
// title: L10n.Common.Controls.Actions.reportUser(name),
// image: UIImage(systemName: "flag"),
// identifier: nil,
// discoverabilityTitle: nil,
// attributes: [],
// state: .off
// ) { [weak provider] _ in
// guard let provider = provider else { return }
// guard let authenticationBox = provider.context.authenticationService.activeMastodonAuthenticationBox.value else {
// return
// }
// let viewModel = ReportViewModel(
// context: provider.context,
// domain: authenticationBox.domain,
// user: mastodonUser,
// status: nil
// )
// provider.coordinator.present(
// scene: .report(viewModel: viewModel),
// from: provider,
// transition: .modal(animated: true, completion: nil)
// )
// }
// children.append(reportAction)
// }
//
// if !isInSameDomain {
// if isDomainBlocking {
// let unblockDomainAction = UIAction(
// title: L10n.Common.Controls.Actions.unblockDomain(mastodonUser.domainFromAcct),
// image: UIImage(systemName: "nosign"),
// identifier: nil,
// discoverabilityTitle: nil,
// attributes: [],
// state: .off
// ) { [weak provider, weak cell] _ in
// guard let provider = provider else { return }
// provider.context.blockDomainService.unblockDomain(userProvider: provider, cell: cell)
// }
// children.append(unblockDomainAction)
// } else {
// let blockDomainAction = UIAction(
// title: L10n.Common.Controls.Actions.blockDomain(mastodonUser.domainFromAcct),
// image: UIImage(systemName: "nosign"),
// identifier: nil,
// discoverabilityTitle: nil,
// attributes: [],
// state: .off
// ) { [weak provider, weak cell] _ in
// guard let provider = provider else { return }
//
// let alertController = UIAlertController(title: L10n.Common.Alerts.BlockDomain.title(mastodonUser.domainFromAcct), message: nil, preferredStyle: .alert)
// let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .default) { _ in }
// alertController.addAction(cancelAction)
// let blockDomainAction = UIAlertAction(title: L10n.Common.Alerts.BlockDomain.blockEntireDomain, style: .destructive) { [weak provider, weak cell] _ in
// guard let provider = provider else { return }
// provider.context.blockDomainService.blockDomain(userProvider: provider, cell: cell)
// }
// alertController.addAction(blockDomainAction)
// provider.present(alertController, animated: true, completion: nil)
// }
// children.append(blockDomainAction)
// }
// }
//
// if let status = shareStatus, isMyself {
// let deleteAction = UIAction(
// title: L10n.Common.Controls.Actions.delete,
// image: UIImage(systemName: "delete.left"),
// identifier: nil,
// discoverabilityTitle: nil,
// attributes: [.destructive],
// state: .off
// ) { [weak provider] _ in
// guard let provider = provider else { return }
//
// let alertController = UIAlertController(title: L10n.Common.Alerts.DeletePost.title, message: nil, preferredStyle: .alert)
// let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .default) { _ in }
// alertController.addAction(cancelAction)
// let deleteAction = UIAlertAction(title: L10n.Common.Alerts.DeletePost.delete, style: .destructive) { [weak provider] _ in
// guard let provider = provider else { return }
// guard let activeMastodonAuthenticationBox = provider.context.authenticationService.activeMastodonAuthenticationBox.value else { return }
// provider.context.apiService.deleteStatus(
// domain: activeMastodonAuthenticationBox.domain,
// statusID: status.id,
// authorizationBox: activeMastodonAuthenticationBox
// )
// .sink { _ in
// // do nothing
// } receiveValue: { _ in
// // do nothing
// }
// .store(in: &provider.context.disposeBag)
// }
// alertController.addAction(deleteAction)
// provider.present(alertController, animated: true, completion: nil)
// }
// children.append(deleteAction)
// }
//
// return UIMenu(title: "", options: [], children: children)
// }
static func createActivityViewController( static func createActivityViewController(
dependency: NeedsDependency, dependency: NeedsDependency,
user: ManagedObjectRecord<MastodonUser> user: ManagedObjectRecord<MastodonUser>

View File

@ -8,11 +8,12 @@
import Foundation import Foundation
import CoreDataStack import CoreDataStack
import MastodonCore import MastodonCore
import UIKit
extension DataSourceFacade { extension DataSourceFacade {
static func responseToCreateSearchHistory( static func responseToCreateSearchHistory(
provider: DataSourceProvider & AuthContextProvider, provider: ViewControllerWithDependencies & AuthContextProvider,
item: DataSourceItem item: DataSourceItem
) async { ) async {
switch item { switch item {

View File

@ -384,6 +384,16 @@ extension DataSourceFacade {
composeContext: .editStatus(status: status, statusSource: statusSource), composeContext: .editStatus(status: status, statusSource: statusSource),
destination: .topLevel) destination: .topLevel)
_ = dependency.coordinator.present(scene: .editStatus(viewModel: editStatusViewModel), transition: .modal(animated: true)) _ = dependency.coordinator.present(scene: .editStatus(viewModel: editStatusViewModel), transition: .modal(animated: true))
case .showOriginal:
// do nothing, as the translation is reverted in `StatusTableViewCellDelegate` in `DataSourceProvider+StatusTableViewCellDelegate.swift`.
break
case .followUser(_):
guard let author = menuContext.author else { return }
try await DataSourceFacade.responseToUserFollowAction(dependency: dependency,
user: author)
} }
} // end func } // end func
} }

View File

@ -5,14 +5,14 @@
// Created by MainasuK on 2022-1-17. // Created by MainasuK on 2022-1-17.
// //
import Foundation import UIKit
import CoreData import CoreData
import CoreDataStack import CoreDataStack
import MastodonCore import MastodonCore
extension DataSourceFacade { extension DataSourceFacade {
static func coordinateToStatusThreadScene( static func coordinateToStatusThreadScene(
provider: DataSourceProvider & AuthContextProvider, provider: ViewControllerWithDependencies & AuthContextProvider,
target: StatusTarget, target: StatusTarget,
status: ManagedObjectRecord<Status> status: ManagedObjectRecord<Status>
) async { ) async {
@ -40,7 +40,7 @@ extension DataSourceFacade {
@MainActor @MainActor
static func coordinateToStatusThreadScene( static func coordinateToStatusThreadScene(
provider: DataSourceProvider & AuthContextProvider, provider: ViewControllerWithDependencies & AuthContextProvider,
root: StatusItem.Thread root: StatusItem.Thread
) async { ) async {
let threadViewModel = ThreadViewModel( let threadViewModel = ThreadViewModel(

View File

@ -352,10 +352,7 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider & AuthConte
choices: [choice], choices: [choice],
authenticationBox: authContext.mastodonAuthenticationBox authenticationBox: authContext.mastodonAuthenticationBox
) )
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): vote poll for \(choice) success")
} catch { } catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): vote poll fail: \(error.localizedDescription)")
// restore voting state // restore voting state
try await managedObjectContext.performChanges { try await managedObjectContext.performChanges {
guard guard
@ -411,10 +408,7 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider & AuthConte
choices: choices, choices: choices,
authenticationBox: authContext.mastodonAuthenticationBox authenticationBox: authContext.mastodonAuthenticationBox
) )
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): vote poll for \(choices) success")
} catch { } catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): vote poll fail: \(error.localizedDescription)")
// restore voting state // restore voting state
try await managedObjectContext.performChanges { try await managedObjectContext.performChanges {
guard let poll = poll.object(in: managedObjectContext) else { return } guard let poll = poll.object(in: managedObjectContext) else { return }
@ -496,6 +490,14 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider & AuthConte
cell.invalidateIntrinsicContentSize() cell.invalidateIntrinsicContentSize()
} }
} }
if case .showOriginal = action {
DispatchQueue.main.async {
if let cell = cell as? StatusTableViewCell {
cell.statusView.revertTranslation()
}
}
}
try await DataSourceFacade.responseToMenuAction( try await DataSourceFacade.responseToMenuAction(
dependency: self, dependency: self,

View File

@ -15,7 +15,6 @@ import MastodonLocalization
extension UITableViewDelegate where Self: DataSourceProvider & AuthContextProvider { extension UITableViewDelegate where Self: DataSourceProvider & AuthContextProvider {
func aspectTableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func aspectTableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): indexPath: \(indexPath.debugDescription)")
Task { Task {
let source = DataSourceItem.Source(tableViewCell: nil, indexPath: indexPath) let source = DataSourceItem.Source(tableViewCell: nil, indexPath: indexPath)
guard let item = await item(from: source) else { guard let item = await item(from: source) else {
@ -77,7 +76,6 @@ extension UITableViewDelegate where Self: DataSourceProvider & MediaPreviewableV
contextMenuConfigurationForRowAt contextMenuConfigurationForRowAt
indexPath: IndexPath, point: CGPoint indexPath: IndexPath, point: CGPoint
) -> UIContextMenuConfiguration? { ) -> UIContextMenuConfiguration? {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
guard let cell = tableView.cellForRow(at: indexPath) as? StatusViewContainerTableViewCell else { return nil } guard let cell = tableView.cellForRow(at: indexPath) as? StatusViewContainerTableViewCell else { return nil }
@ -238,7 +236,6 @@ extension UITableViewDelegate where Self: DataSourceProvider & MediaPreviewableV
willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration,
animator: UIContextMenuInteractionCommitAnimating animator: UIContextMenuInteractionCommitAnimating
) { ) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
guard let configuration = configuration as? TimelineTableViewCellContextMenuConfiguration else { return } guard let configuration = configuration as? TimelineTableViewCellContextMenuConfiguration else { return }
guard let indexPath = configuration.indexPath, let index = configuration.index else { return } guard let indexPath = configuration.indexPath, let index = configuration.index else { return }

View File

@ -44,7 +44,6 @@ extension DataSourceItem {
} }
} }
protocol DataSourceProvider: NeedsDependency & UIViewController { protocol DataSourceProvider: ViewControllerWithDependencies {
var logger: Logger { get }
func item(from source: DataSourceItem.Source) async -> DataSourceItem? func item(from source: DataSourceItem.Source) async -> DataSourceItem?
} }

View File

@ -0,0 +1,4 @@
"NSCameraUsageDescription" = "Выкарыстоўваецца, каб зрабіць фатаграфію для статусу допісу";
"NSPhotoLibraryAddUsageDescription" = "Выкарыстоўваецца для захавання фатаграфій у бібліятэку";
"NewPostShortcutItemTitle" = "Новы допіс";
"SearchShortcutItemTitle" = "Пошук";

View File

@ -1,4 +1,4 @@
"NSCameraUsageDescription" = "Used to take photo for post status"; "NSCameraUsageDescription" = "Χρησιμοποιείται για λήψη φωτογραφίας για την κατάσταση της ανάρτησης";
"NSPhotoLibraryAddUsageDescription" = "Used to save photo into the Photo Library"; "NSPhotoLibraryAddUsageDescription" = "Χρησιμοποιείται για αποθήκευση φωτογραφιών στις Φωτογραφίες";
"NewPostShortcutItemTitle" = "New Post"; "NewPostShortcutItemTitle" = "Νέα Ανάρτηση";
"SearchShortcutItemTitle" = "Search"; "SearchShortcutItemTitle" = "Αναζήτηση";

View File

@ -1,4 +1,4 @@
"NSCameraUsageDescription" = "Được sử dụng để chụp ảnh cho tút"; "NSCameraUsageDescription" = "Được sử dụng để chụp ảnh cho tút";
"NSPhotoLibraryAddUsageDescription" = "Được sử dụng để lưu ảnh vào Thư viện ảnh"; "NSPhotoLibraryAddUsageDescription" = "Được sử dụng để lưu ảnh vào Thư viện ảnh";
"NewPostShortcutItemTitle" = "Viết tút"; "NewPostShortcutItemTitle" = "Soạn tút";
"SearchShortcutItemTitle" = "Tìm kiếm"; "SearchShortcutItemTitle" = "Tìm kiếm";

View File

@ -1,384 +0,0 @@
//
// ComposeToolbarView.swift
// Mastodon
//
// Created by MainasuK Cirno on 2021-3-12.
//
import os.log
import UIKit
import Combine
import MastodonSDK
import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization
protocol ComposeToolbarViewDelegate: AnyObject {
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, mediaButtonDidPressed sender: Any, mediaSelectionType type: ComposeToolbarView.MediaSelectionType)
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, pollButtonDidPressed sender: Any)
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, emojiButtonDidPressed sender: Any)
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, contentWarningButtonDidPressed sender: Any)
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, visibilityButtonDidPressed sender: Any, visibilitySelectionType type: ComposeToolbarView.VisibilitySelectionType)
}
final class ComposeToolbarView: UIView {
var disposeBag = Set<AnyCancellable>()
static let toolbarButtonSize: CGSize = CGSize(width: 44, height: 44)
static let toolbarHeight: CGFloat = 44
weak var delegate: ComposeToolbarViewDelegate?
// barButtonItem
private(set) lazy var mediaBarButtonItem: UIBarButtonItem = {
let barButtonItem = UIBarButtonItem()
barButtonItem.image = UIImage(systemName: "photo")
barButtonItem.accessibilityLabel = L10n.Scene.Compose.Accessibility.appendAttachment
return barButtonItem
}()
let pollBarButtonItem: UIBarButtonItem = {
let barButtonItem = UIBarButtonItem()
barButtonItem.image = UIImage(systemName: "list.bullet")
barButtonItem.accessibilityLabel = L10n.Scene.Compose.Accessibility.appendPoll
return barButtonItem
}()
let contentWarningBarButtonItem: UIBarButtonItem = {
let barButtonItem = UIBarButtonItem()
barButtonItem.image = UIImage(systemName: "exclamationmark.shield")
barButtonItem.accessibilityLabel = L10n.Scene.Compose.Accessibility.enableContentWarning
return barButtonItem
}()
let visibilityBarButtonItem: UIBarButtonItem = {
let barButtonItem = UIBarButtonItem()
barButtonItem.image = UIImage(systemName: "person.3")
barButtonItem.accessibilityLabel = L10n.Scene.Compose.Accessibility.postVisibilityMenu
return barButtonItem
}()
// button
let mediaButton: UIButton = {
let button = HighlightDimmableButton()
ComposeToolbarView.configureToolbarButtonAppearance(button: button)
button.setImage(UIImage(systemName: "photo", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .regular)), for: .normal)
button.accessibilityLabel = L10n.Scene.Compose.Accessibility.appendAttachment
return button
}()
let pollButton: UIButton = {
let button = HighlightDimmableButton(type: .custom)
ComposeToolbarView.configureToolbarButtonAppearance(button: button)
button.setImage(UIImage(systemName: "list.bullet", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .medium)), for: .normal)
button.accessibilityLabel = L10n.Scene.Compose.Accessibility.appendPoll
return button
}()
let emojiButton: UIButton = {
let button = HighlightDimmableButton()
ComposeToolbarView.configureToolbarButtonAppearance(button: button)
let image = Asset.Human.faceSmilingAdaptive.image
.af.imageScaled(to: CGSize(width: 20, height: 20))
.withRenderingMode(.alwaysTemplate)
button.setImage(image, for: .normal)
button.accessibilityLabel = L10n.Scene.Compose.Accessibility.customEmojiPicker
return button
}()
let contentWarningButton: UIButton = {
let button = HighlightDimmableButton()
ComposeToolbarView.configureToolbarButtonAppearance(button: button)
button.setImage(UIImage(systemName: "exclamationmark.shield", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .regular)), for: .normal)
button.accessibilityLabel = L10n.Scene.Compose.Accessibility.enableContentWarning
return button
}()
let visibilityButton: UIButton = {
let button = HighlightDimmableButton()
ComposeToolbarView.configureToolbarButtonAppearance(button: button)
button.setImage(UIImage(systemName: "person.3", withConfiguration: UIImage.SymbolConfiguration(pointSize: 15, weight: .medium)), for: .normal)
button.accessibilityLabel = L10n.Scene.Compose.Accessibility.postVisibilityMenu
return button
}()
let characterCountLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 15, weight: .regular)
label.text = "500"
label.textColor = Asset.Colors.Label.secondary.color
label.accessibilityLabel = L10n.A11y.Plural.Count.inputLimitRemains(500)
return label
}()
let activeVisibilityType = CurrentValueSubject<VisibilitySelectionType, Never>(.public)
override init(frame: CGRect) {
super.init(frame: frame)
_init()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
_init()
}
}
extension ComposeToolbarView {
private func _init() {
setupBackgroundColor(theme: ThemeService.shared.currentTheme.value)
ThemeService.shared.currentTheme
.receive(on: DispatchQueue.main)
.sink { [weak self] theme in
guard let self = self else { return }
self.setupBackgroundColor(theme: theme)
}
.store(in: &disposeBag)
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 0
stackView.distribution = .fillEqually
stackView.translatesAutoresizingMaskIntoConstraints = false
addSubview(stackView)
NSLayoutConstraint.activate([
stackView.centerYAnchor.constraint(equalTo: centerYAnchor),
layoutMarginsGuide.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 8), // tweak button margin offset
])
let buttons = [
mediaButton,
pollButton,
emojiButton,
contentWarningButton,
visibilityButton,
]
buttons.forEach { button in
button.translatesAutoresizingMaskIntoConstraints = false
stackView.addArrangedSubview(button)
NSLayoutConstraint.activate([
button.widthAnchor.constraint(equalToConstant: 44),
button.heightAnchor.constraint(equalToConstant: 44),
])
}
characterCountLabel.translatesAutoresizingMaskIntoConstraints = false
addSubview(characterCountLabel)
NSLayoutConstraint.activate([
characterCountLabel.topAnchor.constraint(equalTo: topAnchor),
characterCountLabel.leadingAnchor.constraint(greaterThanOrEqualTo: stackView.trailingAnchor, constant: 8),
characterCountLabel.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor),
characterCountLabel.bottomAnchor.constraint(equalTo: bottomAnchor),
])
characterCountLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
mediaBarButtonItem.menu = createMediaContextMenu()
mediaButton.menu = createMediaContextMenu()
mediaButton.showsMenuAsPrimaryAction = true
pollBarButtonItem.target = self
pollBarButtonItem.action = #selector(ComposeToolbarView.pollButtonDidPressed(_:))
pollButton.addTarget(self, action: #selector(ComposeToolbarView.pollButtonDidPressed(_:)), for: .touchUpInside)
emojiButton.addTarget(self, action: #selector(ComposeToolbarView.emojiButtonDidPressed(_:)), for: .touchUpInside)
contentWarningBarButtonItem.target = self
contentWarningBarButtonItem.action = #selector(ComposeToolbarView.contentWarningButtonDidPressed(_:))
contentWarningButton.addTarget(self, action: #selector(ComposeToolbarView.contentWarningButtonDidPressed(_:)), for: .touchUpInside)
visibilityBarButtonItem.menu = createVisibilityContextMenu(interfaceStyle: traitCollection.userInterfaceStyle)
visibilityButton.menu = createVisibilityContextMenu(interfaceStyle: traitCollection.userInterfaceStyle)
visibilityButton.showsMenuAsPrimaryAction = true
updateToolbarButtonUserInterfaceStyle()
// update menu when selected visibility type changed
activeVisibilityType
.receive(on: RunLoop.main)
.sink { [weak self] type in
guard let self = self else { return }
self.visibilityBarButtonItem.menu = self.createVisibilityContextMenu(interfaceStyle: self.traitCollection.userInterfaceStyle)
self.visibilityButton.menu = self.createVisibilityContextMenu(interfaceStyle: self.traitCollection.userInterfaceStyle)
}
.store(in: &disposeBag)
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
updateToolbarButtonUserInterfaceStyle()
}
}
extension ComposeToolbarView {
enum MediaSelectionType: String {
case camera
case photoLibrary
case browse
}
enum VisibilitySelectionType: String, CaseIterable {
case `public`
// TODO: remove unlisted option from codebase
// case unlisted
case `private`
case direct
var title: String {
switch self {
case .public: return L10n.Scene.Compose.Visibility.public
// case .unlisted: return L10n.Scene.Compose.Visibility.unlisted
case .private: return L10n.Scene.Compose.Visibility.private
case .direct: return L10n.Scene.Compose.Visibility.direct
}
}
func image(interfaceStyle: UIUserInterfaceStyle) -> UIImage {
switch self {
case .public: return UIImage(systemName: "globe", withConfiguration: UIImage.SymbolConfiguration(pointSize: 19, weight: .medium))!
// case .unlisted: return UIImage(systemName: "eye.slash", withConfiguration: UIImage.SymbolConfiguration(pointSize: 18, weight: .regular))!
case .private:
switch interfaceStyle {
case .light: return UIImage(systemName: "person.3", withConfiguration: UIImage.SymbolConfiguration(pointSize: 15, weight: .medium))!
default: return UIImage(systemName: "person.3.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 15, weight: .medium))!
}
case .direct: return UIImage(systemName: "at", withConfiguration: UIImage.SymbolConfiguration(pointSize: 19, weight: .regular))!
}
}
var visibility: Mastodon.Entity.Status.Visibility {
switch self {
case .public: return .public
// case .unlisted: return .unlisted
case .private: return .private
case .direct: return .direct
}
}
}
}
extension ComposeToolbarView {
private func setupBackgroundColor(theme: Theme) {
backgroundColor = theme.composeToolbarBackgroundColor
}
private static func configureToolbarButtonAppearance(button: UIButton) {
button.tintColor = ThemeService.tintColor
button.setBackgroundImage(.placeholder(size: ComposeToolbarView.toolbarButtonSize, color: .systemFill), for: .highlighted)
button.layer.masksToBounds = true
button.layer.cornerRadius = 5
button.layer.cornerCurve = .continuous
}
private func updateToolbarButtonUserInterfaceStyle() {
// reset emoji
let emojiButtonImage = Asset.Human.faceSmilingAdaptive.image
.af.imageScaled(to: CGSize(width: 20, height: 20))
.withRenderingMode(.alwaysTemplate)
emojiButton.setImage(emojiButtonImage, for: .normal)
switch traitCollection.userInterfaceStyle {
case .light:
mediaBarButtonItem.image = UIImage(systemName: "photo")
mediaButton.setImage(UIImage(systemName: "photo", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .regular))!, for: .normal)
contentWarningBarButtonItem.image = UIImage(systemName: "exclamationmark.shield")
contentWarningButton.setImage(UIImage(systemName: "exclamationmark.shield", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .regular))!, for: .normal)
case .dark:
mediaBarButtonItem.image = UIImage(systemName: "photo.fill")
mediaButton.setImage(UIImage(systemName: "photo.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .regular))!, for: .normal)
contentWarningBarButtonItem.image = UIImage(systemName: "exclamationmark.shield.fill")
contentWarningButton.setImage(UIImage(systemName: "exclamationmark.shield.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 20, weight: .regular))!, for: .normal)
default:
assertionFailure()
}
visibilityBarButtonItem.menu = createVisibilityContextMenu(interfaceStyle: traitCollection.userInterfaceStyle)
visibilityButton.menu = createVisibilityContextMenu(interfaceStyle: traitCollection.userInterfaceStyle)
}
private func createMediaContextMenu() -> UIMenu {
var children: [UIMenuElement] = []
let photoLibraryAction = UIAction(title: L10n.Scene.Compose.MediaSelection.photoLibrary, image: UIImage(systemName: "rectangle.on.rectangle"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak self] _ in
guard let self = self else { return }
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: mediaSelectionType: .photoLibrary", ((#file as NSString).lastPathComponent), #line, #function)
self.delegate?.composeToolbarView(self, mediaButtonDidPressed: self.mediaButton, mediaSelectionType: .photoLibrary)
}
children.append(photoLibraryAction)
if UIImagePickerController.isSourceTypeAvailable(.camera) {
let cameraAction = UIAction(title: L10n.Scene.Compose.MediaSelection.camera, image: UIImage(systemName: "camera"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off, handler: { [weak self] _ in
guard let self = self else { return }
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: mediaSelectionType: .camera", ((#file as NSString).lastPathComponent), #line, #function)
self.delegate?.composeToolbarView(self, mediaButtonDidPressed: self.mediaButton, mediaSelectionType: .camera)
})
children.append(cameraAction)
}
let browseAction = UIAction(title: L10n.Scene.Compose.MediaSelection.browse, image: UIImage(systemName: "ellipsis"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak self] _ in
guard let self = self else { return }
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: mediaSelectionType: .browse", ((#file as NSString).lastPathComponent), #line, #function)
self.delegate?.composeToolbarView(self, mediaButtonDidPressed: self.mediaButton, mediaSelectionType: .browse)
}
children.append(browseAction)
return UIMenu(title: "", image: nil, identifier: nil, options: .displayInline, children: children)
}
private func createVisibilityContextMenu(interfaceStyle: UIUserInterfaceStyle) -> UIMenu {
let children: [UIMenuElement] = VisibilitySelectionType.allCases.map { type in
let state: UIMenuElement.State = activeVisibilityType.value == type ? .on : .off
return UIAction(title: type.title, image: type.image(interfaceStyle: interfaceStyle), identifier: nil, discoverabilityTitle: nil, attributes: [], state: state) { [weak self] action in
guard let self = self else { return }
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: visibilitySelectionType: %s", ((#file as NSString).lastPathComponent), #line, #function, type.rawValue)
self.delegate?.composeToolbarView(self, visibilityButtonDidPressed: self.visibilityButton, visibilitySelectionType: type)
}
}
return UIMenu(title: "", image: nil, identifier: nil, options: .displayInline, children: children)
}
}
extension ComposeToolbarView {
@objc private func pollButtonDidPressed(_ sender: Any) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
delegate?.composeToolbarView(self, pollButtonDidPressed: sender)
}
@objc private func emojiButtonDidPressed(_ sender: Any) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
delegate?.composeToolbarView(self, emojiButtonDidPressed: sender)
}
@objc private func contentWarningButtonDidPressed(_ sender: Any) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
delegate?.composeToolbarView(self, contentWarningButtonDidPressed: sender)
}
}
#if canImport(SwiftUI) && DEBUG
import SwiftUI
struct ComposeToolbarView_Previews: PreviewProvider {
static var previews: some View {
UIViewPreview(width: 375) {
let toolbarView = ComposeToolbarView()
toolbarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
toolbarView.widthAnchor.constraint(equalToConstant: 375).priority(.defaultHigh),
toolbarView.heightAnchor.constraint(equalToConstant: 64).priority(.defaultHigh),
])
return toolbarView
}
.previewLayout(.fixed(width: 375, height: 100))
}
}
#endif

View File

@ -34,11 +34,6 @@ final class DiscoveryCommunityViewController: UIViewController, NeedsDependency,
}() }()
let refreshControl = RefreshControl() let refreshControl = RefreshControl()
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
extension DiscoveryCommunityViewController { extension DiscoveryCommunityViewController {

View File

@ -5,15 +5,13 @@
// Created by MainasuK on 2022-4-29. // Created by MainasuK on 2022-4-29.
// //
import os.log
import Foundation import Foundation
import GameplayKit import GameplayKit
import MastodonSDK import MastodonSDK
import enum NIOHTTP1.HTTPResponseStatus
extension DiscoveryCommunityViewModel { extension DiscoveryCommunityViewModel {
class State: GKState { class State: GKState {
let logger = Logger(subsystem: "DiscoveryCommunityViewModel.State", category: "StateMachine")
let id = UUID() let id = UUID()
@ -25,20 +23,12 @@ extension DiscoveryCommunityViewModel {
override func didEnter(from previousState: GKState?) { override func didEnter(from previousState: GKState?) {
super.didEnter(from: previousState) super.didEnter(from: previousState)
let from = previousState.flatMap { String(describing: $0) } ?? "nil"
let to = String(describing: self)
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): \(from) -> \(to)")
} }
@MainActor @MainActor
func enter(state: State.Type) { func enter(state: State.Type) {
stateMachine?.enter(state) stateMachine?.enter(state)
} }
deinit {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): [\(self.id.uuidString)] \(String(describing: self))")
}
} }
} }
@ -87,9 +77,7 @@ extension DiscoveryCommunityViewModel.State {
super.didEnter(from: previousState) super.didEnter(from: previousState)
guard let _ = viewModel, let stateMachine = stateMachine else { return } guard let _ = viewModel, let stateMachine = stateMachine else { return }
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: retry loading 3s later…", ((#file as NSString).lastPathComponent), #line, #function)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) { DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: retry loading", ((#file as NSString).lastPathComponent), #line, #function)
stateMachine.enter(Loading.self) stateMachine.enter(Loading.self)
} }
} }
@ -174,8 +162,12 @@ extension DiscoveryCommunityViewModel.State {
viewModel.didLoadLatest.send() viewModel.didLoadLatest.send()
} catch { } catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch user timeline fail: \(error.localizedDescription)") if let error = error as? Mastodon.API.Error,
await enter(state: Fail.self) [HTTPResponseStatus.unauthorized, .notFound].contains(error.httpResponseStatus) {
await enter(state: NoMore.self)
} else {
await enter(state: Fail.self)
}
} }
} // end Task } // end Task
} // end func } // end func

View File

@ -16,8 +16,6 @@ import MastodonCore
final class DiscoveryCommunityViewModel { final class DiscoveryCommunityViewModel {
let logger = Logger(subsystem: "DiscoveryCommunityViewModel", category: "ViewModel")
var disposeBag = Set<AnyCancellable>() var disposeBag = Set<AnyCancellable>()
// input // input
@ -54,9 +52,4 @@ final class DiscoveryCommunityViewModel {
) )
// end init // end init
} }
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }

View File

@ -5,16 +5,13 @@
// Created by MainasuK on 2022-4-14. // Created by MainasuK on 2022-4-14.
// //
import os.log
import UIKit import UIKit
import Combine import Combine
import MastodonUI import MastodonUI
import MastodonCore import MastodonCore
final class DiscoveryForYouViewController: UIViewController, NeedsDependency, MediaPreviewableViewController { final class DiscoveryForYouViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {
let logger = Logger(subsystem: "DiscoveryForYouViewController", category: "ViewController")
weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } weak var context: AppContext! { willSet { precondition(!isViewLoaded) } }
weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } }
@ -33,11 +30,6 @@ final class DiscoveryForYouViewController: UIViewController, NeedsDependency, Me
}() }()
let refreshControl = RefreshControl() let refreshControl = RefreshControl()
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
extension DiscoveryForYouViewController { extension DiscoveryForYouViewController {
@ -111,7 +103,6 @@ extension DiscoveryForYouViewController: AuthContextProvider {
extension DiscoveryForYouViewController: UITableViewDelegate { extension DiscoveryForYouViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): \(indexPath)")
guard case let .user(record) = viewModel.diffableDataSource?.itemIdentifier(for: indexPath) else { return } guard case let .user(record) = viewModel.diffableDataSource?.itemIdentifier(for: indexPath) else { return }
guard let user = record.object(in: context.managedObjectContext) else { return } guard let user = record.object(in: context.managedObjectContext) else { return }
let profileViewModel = CachedProfileViewModel( let profileViewModel = CachedProfileViewModel(

View File

@ -5,7 +5,6 @@
// Created by MainasuK on 2022-4-14. // Created by MainasuK on 2022-4-14.
// //
import os.log
import UIKit import UIKit
import Combine import Combine
import GameplayKit import GameplayKit
@ -41,11 +40,6 @@ final class DiscoveryForYouViewModel {
) )
// end init // end init
} }
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
extension DiscoveryForYouViewModel { extension DiscoveryForYouViewModel {

View File

@ -16,8 +16,6 @@ import MastodonSDK
final class DiscoveryHashtagsViewModel { final class DiscoveryHashtagsViewModel {
let logger = Logger(subsystem: "DiscoveryHashtagsViewModel", category: "ViewModel")
var disposeBag = Set<AnyCancellable>() var disposeBag = Set<AnyCancellable>()
// input // input
@ -36,8 +34,12 @@ final class DiscoveryHashtagsViewModel {
viewDidAppeared viewDidAppeared
.throttle(for: 3, scheduler: DispatchQueue.main, latest: true) .throttle(for: 3, scheduler: DispatchQueue.main, latest: true)
.asyncMap { authenticationBox in .asyncMap { _ in
try await context.apiService.trendHashtags(domain: authContext.mastodonAuthenticationBox.domain, query: nil) let authenticationBox = authContext.mastodonAuthenticationBox
return try await context.apiService.trendHashtags(domain: authenticationBox.domain,
query: nil,
authenticationBox: authenticationBox
)
} }
.retry(3) .retry(3)
.map { response in Result<Mastodon.Response.Content<[Mastodon.Entity.Tag]>, Error> { response } } .map { response in Result<Mastodon.Response.Content<[Mastodon.Entity.Tag]>, Error> { response } }
@ -46,28 +48,27 @@ final class DiscoveryHashtagsViewModel {
.sink { [weak self] result in .sink { [weak self] result in
guard let self = self else { return } guard let self = self else { return }
switch result { switch result {
case .success(let response): case .success(let response):
self.hashtags = response.value.filter { !$0.name.isEmpty } self.hashtags = response.value.filter { !$0.name.isEmpty }
case .failure: case .failure:
break break
} }
} }
.store(in: &disposeBag) .store(in: &disposeBag)
} }
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
extension DiscoveryHashtagsViewModel { extension DiscoveryHashtagsViewModel {
@MainActor @MainActor
func fetch() async throws { func fetch() async throws {
let response = try await context.apiService.trendHashtags(domain: authContext.mastodonAuthenticationBox.domain, query: nil)
let authenticationBox = authContext.mastodonAuthenticationBox
let response = try await context.apiService.trendHashtags(domain: authenticationBox.domain,
query: nil,
authenticationBox: authenticationBox
)
hashtags = response.value.filter { !$0.name.isEmpty } hashtags = response.value.filter { !$0.name.isEmpty }
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch tags: \(response.value.count)")
} }
} }

View File

@ -35,10 +35,6 @@ extension DiscoveryNewsViewModel {
func enter(state: State.Type) { func enter(state: State.Type) {
stateMachine?.enter(state) stateMachine?.enter(state)
} }
deinit {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): [\(self.id.uuidString)] \(String(describing: self))")
}
} }
} }
@ -86,10 +82,9 @@ extension DiscoveryNewsViewModel.State {
override func didEnter(from previousState: GKState?) { override func didEnter(from previousState: GKState?) {
super.didEnter(from: previousState) super.didEnter(from: previousState)
guard let _ = viewModel, let stateMachine = stateMachine else { return } guard let _ = viewModel, let stateMachine = stateMachine else { return }
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: retry loading 3s later…", ((#file as NSString).lastPathComponent), #line, #function) // try reloading three seconds later
DispatchQueue.main.asyncAfter(deadline: .now() + 3) { DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: retry loading", ((#file as NSString).lastPathComponent), #line, #function)
stateMachine.enter(Loading.self) stateMachine.enter(Loading.self)
} }
} }
@ -144,7 +139,8 @@ extension DiscoveryNewsViewModel.State {
query: Mastodon.API.Trends.StatusQuery( query: Mastodon.API.Trends.StatusQuery(
offset: offset, offset: offset,
limit: nil limit: nil
) ),
authenticationBox: viewModel.authContext.mastodonAuthenticationBox
) )
let newOffset: Int? = { let newOffset: Int? = {
guard let offset = response.link?.offset else { return nil } guard let offset = response.link?.offset else { return nil }
@ -174,10 +170,13 @@ extension DiscoveryNewsViewModel.State {
viewModel.links = links viewModel.links = links
viewModel.didLoadLatest.send() viewModel.didLoadLatest.send()
} catch { } catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch news fail: \(error.localizedDescription)") if let error = error as? Mastodon.API.Error {
if let error = error as? Mastodon.API.Error, error.httpResponseStatus.code == 404 { if error.httpResponseStatus == .notFound {
viewModel.isServerSupportEndpoint = false viewModel.isServerSupportEndpoint = false
await enter(state: NoMore.self) await enter(state: NoMore.self)
} else if error.httpResponseStatus == .unauthorized {
await enter(state: NoMore.self)
}
} else { } else {
await enter(state: Fail.self) await enter(state: Fail.self)
} }

View File

@ -51,11 +51,6 @@ final class DiscoveryNewsViewModel {
await checkServerEndpoint() await checkServerEndpoint()
} // end Task } // end Task
} }
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
@ -64,7 +59,8 @@ extension DiscoveryNewsViewModel {
do { do {
_ = try await context.apiService.trendLinks( _ = try await context.apiService.trendLinks(
domain: authContext.mastodonAuthenticationBox.domain, domain: authContext.mastodonAuthenticationBox.domain,
query: .init(offset: nil, limit: nil) query: .init(offset: nil, limit: nil),
authenticationBox: authContext.mastodonAuthenticationBox
) )
} catch let error as Mastodon.API.Error where error.httpResponseStatus.code == 404 { } catch let error as Mastodon.API.Error where error.httpResponseStatus.code == 404 {
isServerSupportEndpoint = false isServerSupportEndpoint = false

View File

@ -35,11 +35,6 @@ final class DiscoveryPostsViewController: UIViewController, NeedsDependency, Med
let refreshControl = RefreshControl() let refreshControl = RefreshControl()
let discoveryIntroBannerView = DiscoveryIntroBannerView() let discoveryIntroBannerView = DiscoveryIntroBannerView()
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
extension DiscoveryPostsViewController { extension DiscoveryPostsViewController {

View File

@ -145,7 +145,8 @@ extension DiscoveryPostsViewModel.State {
query: Mastodon.API.Trends.StatusQuery( query: Mastodon.API.Trends.StatusQuery(
offset: offset, offset: offset,
limit: nil limit: nil
) ),
authenticationBox: viewModel.authContext.mastodonAuthenticationBox
) )
let newOffset: Int? = { let newOffset: Int? = {
guard let offset = response.link?.offset else { return nil } guard let offset = response.link?.offset else { return nil }
@ -176,10 +177,13 @@ extension DiscoveryPostsViewModel.State {
viewModel.didLoadLatest.send() viewModel.didLoadLatest.send()
} catch { } catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch posts fail: \(error.localizedDescription)") if let error = error as? Mastodon.API.Error {
if let error = error as? Mastodon.API.Error, error.httpResponseStatus.code == 404 { if error.httpResponseStatus == .notFound {
viewModel.isServerSupportEndpoint = false viewModel.isServerSupportEndpoint = false
await enter(state: NoMore.self) await enter(state: NoMore.self)
} else if error.httpResponseStatus == .unauthorized {
await enter(state: NoMore.self)
}
} else { } else {
await enter(state: Fail.self) await enter(state: Fail.self)
} }

View File

@ -5,7 +5,6 @@
// Created by MainasuK on 2022-4-12. // Created by MainasuK on 2022-4-12.
// //
import os.log
import UIKit import UIKit
import Combine import Combine
import GameplayKit import GameplayKit
@ -56,11 +55,6 @@ final class DiscoveryPostsViewModel {
await checkServerEndpoint() await checkServerEndpoint()
} // end Task } // end Task
} }
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
extension DiscoveryPostsViewModel { extension DiscoveryPostsViewModel {
@ -68,7 +62,8 @@ extension DiscoveryPostsViewModel {
do { do {
_ = try await context.apiService.trendStatuses( _ = try await context.apiService.trendStatuses(
domain: authContext.mastodonAuthenticationBox.domain, domain: authContext.mastodonAuthenticationBox.domain,
query: .init(offset: nil, limit: nil) query: .init(offset: nil, limit: nil),
authenticationBox: authContext.mastodonAuthenticationBox
) )
} catch let error as Mastodon.API.Error where error.httpResponseStatus.code == 404 { } catch let error as Mastodon.API.Error where error.httpResponseStatus.code == 404 {
isServerSupportEndpoint = false isServerSupportEndpoint = false

View File

@ -69,10 +69,13 @@ final class HashtagTimelineHeaderView: UIView {
var onButtonTapped: (() -> Void)? var onButtonTapped: (() -> Void)?
let followButton: UIButton = { let followButton: UIButton = {
let button = HashtagTimelineHeaderViewActionButton() let button = UIButton(configuration: .tinted())
button.cornerRadius = 10 button.configuration?.background.cornerRadius = 10
button.contentEdgeInsets = UIEdgeInsets(top: 6, left: 16, bottom: 5, right: 16) // set 28pt height button.configuration?.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer({ incoming in
button.titleLabel?.font = .systemFont(ofSize: 14, weight: .bold) var outgoing = incoming
outgoing.font = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .boldSystemFont(ofSize: 15))
return outgoing
})
return button return button
}() }()
@ -153,14 +156,18 @@ private extension HashtagTimelineHeaderView {
extension HashtagTimelineHeaderView { extension HashtagTimelineHeaderView {
func update(_ entity: HashtagTimelineHeaderView.Data) { func update(_ entity: HashtagTimelineHeaderView.Data) {
titleLabel.text = "#\(entity.name)" titleLabel.text = "#\(entity.name)"
followButton.setTitle(entity.following == true ? L10n.Scene.FollowedTags.Actions.unfollow : L10n.Scene.FollowedTags.Actions.follow, for: .normal)
followButton.backgroundColor = entity.following == true ? Asset.Colors.Button.tagUnfollow.color : Asset.Colors.Button.tagFollow.color if entity.following {
followButton.configuration?.background.backgroundColor = Asset.Colors.Button.userFollowing.color
followButton.setTitleColor( followButton.configuration?.baseForegroundColor = Asset.Colors.Button.userFollowingTitle.color
entity.following == true ? Asset.Colors.Button.tagFollow.color : Asset.Colors.Button.tagUnfollow.color, followButton.configuration?.title = L10n.Scene.FollowedTags.Actions.unfollow
for: .normal } else {
) followButton.configuration?.background.backgroundColor = Asset.Colors.Button.userFollow.color
followButton.configuration?.baseForegroundColor = .white
followButton.configuration?.title = L10n.Scene.FollowedTags.Actions.follow
}
followButton.configuration?.contentInsets = NSDirectionalEdgeInsets(top: 6, leading: 16, bottom: 5, trailing: 16)
postCountLabel.text = String(entity.postCount) postCountLabel.text = String(entity.postCount)
participantsLabel.text = String(entity.participantsCount) participantsLabel.text = String(entity.participantsCount)

View File

@ -1,47 +0,0 @@
//
// HashtagTimelineHeaderViewActionButton.swift
// Mastodon
//
// Created by Marcus Kida on 25.11.22.
//
import UIKit
import MastodonUI
import MastodonAsset
class HashtagTimelineHeaderViewActionButton: RoundedEdgesButton {
init() {
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func layoutSubviews() {
super.layoutSubviews()
let shadowColor: UIColor = {
switch traitCollection.userInterfaceStyle {
case .dark:
return .darkGray
default:
return .lightGray
}
}()
layer.setupShadow(
color: shadowColor,
alpha: 1,
x: 0,
y: 1,
blur: 2,
spread: 0,
roundedRect: bounds,
byRoundingCorners: .allCorners,
cornerRadii: CGSize(width: cornerRadius, height: cornerRadius)
)
}
}

View File

@ -41,13 +41,8 @@ extension HomeTimelineViewModel {
.sink { [weak self] records in .sink { [weak self] records in
guard let self = self else { return } guard let self = self else { return }
guard let diffableDataSource = self.diffableDataSource else { return } guard let diffableDataSource = self.diffableDataSource else { return }
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): incoming \(records.count) objects")
Task { @MainActor in Task { @MainActor in
let start = CACurrentMediaTime()
defer {
let end = CACurrentMediaTime()
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): cost \(end - start, format: .fixed(precision: 4))s to process \(records.count) feeds")
}
let oldSnapshot = diffableDataSource.snapshot() let oldSnapshot = diffableDataSource.snapshot()
var newSnapshot: NSDiffableDataSourceSnapshot<StatusSection, StatusItem> = { var newSnapshot: NSDiffableDataSourceSnapshot<StatusSection, StatusItem> = {
let newItems = records.map { record in let newItems = records.map { record in
@ -92,11 +87,8 @@ extension HomeTimelineViewModel {
let hasChanges = newSnapshot.itemIdentifiers != oldSnapshot.itemIdentifiers let hasChanges = newSnapshot.itemIdentifiers != oldSnapshot.itemIdentifiers
if !hasChanges && !self.hasPendingStatusEditReload { if !hasChanges && !self.hasPendingStatusEditReload {
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): snapshot not changes")
self.didLoadLatest.send() self.didLoadLatest.send()
return return
} else {
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): snapshot has changes")
} }
guard let difference = self.calculateReloadSnapshotDifference( guard let difference = self.calculateReloadSnapshotDifference(
@ -106,7 +98,6 @@ extension HomeTimelineViewModel {
) else { ) else {
self.updateSnapshotUsingReloadData(snapshot: newSnapshot) self.updateSnapshotUsingReloadData(snapshot: newSnapshot)
self.didLoadLatest.send() self.didLoadLatest.send()
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): applied new snapshot")
return return
} }
@ -116,7 +107,6 @@ extension HomeTimelineViewModel {
contentOffset.y = tableView.contentOffset.y - difference.sourceDistanceToTableViewTopEdge contentOffset.y = tableView.contentOffset.y - difference.sourceDistanceToTableViewTopEdge
tableView.setContentOffset(contentOffset, animated: false) tableView.setContentOffset(contentOffset, animated: false)
self.didLoadLatest.send() self.didLoadLatest.send()
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): applied new snapshot")
self.hasPendingStatusEditReload = false self.hasPendingStatusEditReload = false
} // end Task } // end Task
} }

View File

@ -37,7 +37,7 @@ final class HomeTimelineNavigationBarTitleViewModel {
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
.sink { [weak self] _ in .sink { [weak self] _ in
guard let self = self else { return } guard let self = self else { return }
self.networkErrorCount.value += self.networkErrorCount.value + 1 self.networkErrorCount.value = self.networkErrorCount.value + 1
} }
.store(in: &disposeBag) .store(in: &disposeBag)

View File

@ -70,6 +70,8 @@ extension MediaPreviewImageView {
addSubview(imageView) addSubview(imageView)
doubleTapGestureRecognizer.addTarget(self, action: #selector(MediaPreviewImageView.doubleTapGestureRecognizerHandler(_:))) doubleTapGestureRecognizer.addTarget(self, action: #selector(MediaPreviewImageView.doubleTapGestureRecognizerHandler(_:)))
doubleTapGestureRecognizer.delegate = self
imageView.addGestureRecognizer(doubleTapGestureRecognizer) imageView.addGestureRecognizer(doubleTapGestureRecognizer)
if #available(iOS 16.0, *) { if #available(iOS 16.0, *) {
imageView.addInteraction(liveTextInteraction) imageView.addInteraction(liveTextInteraction)
@ -113,6 +115,21 @@ extension MediaPreviewImageView {
} }
extension MediaPreviewImageView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
guard gestureRecognizer == doubleTapGestureRecognizer else { return false }
// block double-tap to select text gesture
// but only if the Live Text button is toggled off
if let gr = otherGestureRecognizer as? UITapGestureRecognizer,
gr.numberOfTapsRequired == 2,
#available(iOS 16, *),
!liveTextInteraction.selectableItemsHighlighted {
return true
}
return false
}
}
extension MediaPreviewImageView { extension MediaPreviewImageView {
func setup(image: UIImage, container: UIView, forceUpdate: Bool = false) { func setup(image: UIImage, container: UIView, forceUpdate: Bool = false) {

View File

@ -15,7 +15,6 @@ import VisionKit
protocol MediaPreviewImageViewControllerDelegate: AnyObject { protocol MediaPreviewImageViewControllerDelegate: AnyObject {
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, tapGestureRecognizerDidTrigger tapGestureRecognizer: UITapGestureRecognizer) func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, tapGestureRecognizerDidTrigger tapGestureRecognizer: UITapGestureRecognizer)
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, longPressGestureRecognizerDidTrigger longPressGestureRecognizer: UILongPressGestureRecognizer)
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, contextMenuActionPerform action: MediaPreviewImageViewController.ContextMenuAction) func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, contextMenuActionPerform action: MediaPreviewImageViewController.ContextMenuAction)
} }
@ -31,7 +30,6 @@ final class MediaPreviewImageViewController: UIViewController {
let previewImageView = MediaPreviewImageView() let previewImageView = MediaPreviewImageView()
let tapGestureRecognizer = UITapGestureRecognizer.singleTapGestureRecognizer let tapGestureRecognizer = UITapGestureRecognizer.singleTapGestureRecognizer
let longPressGestureRecognizer = UILongPressGestureRecognizer()
deinit { deinit {
os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
@ -58,13 +56,9 @@ extension MediaPreviewImageViewController {
tapGestureRecognizer.addTarget(self, action: #selector(MediaPreviewImageViewController.tapGestureRecognizerHandler(_:))) tapGestureRecognizer.addTarget(self, action: #selector(MediaPreviewImageViewController.tapGestureRecognizerHandler(_:)))
tapGestureRecognizer.delegate = self tapGestureRecognizer.delegate = self
longPressGestureRecognizer.addTarget(self, action: #selector(MediaPreviewImageViewController.longPressGestureRecognizerHandler(_:)))
longPressGestureRecognizer.delegate = self
tapGestureRecognizer.require(toFail: previewImageView.doubleTapGestureRecognizer) tapGestureRecognizer.require(toFail: previewImageView.doubleTapGestureRecognizer)
tapGestureRecognizer.require(toFail: longPressGestureRecognizer)
previewImageView.addGestureRecognizer(tapGestureRecognizer) previewImageView.addGestureRecognizer(tapGestureRecognizer)
previewImageView.addGestureRecognizer(longPressGestureRecognizer)
let previewImageViewContextMenuInteraction = UIContextMenuInteraction(delegate: self) let previewImageViewContextMenuInteraction = UIContextMenuInteraction(delegate: self)
previewImageView.addInteraction(previewImageViewContextMenuInteraction) previewImageView.addInteraction(previewImageViewContextMenuInteraction)
@ -95,11 +89,6 @@ extension MediaPreviewImageViewController {
delegate?.mediaPreviewImageViewController(self, tapGestureRecognizerDidTrigger: sender) delegate?.mediaPreviewImageViewController(self, tapGestureRecognizerDidTrigger: sender)
} }
@objc private func longPressGestureRecognizerHandler(_ sender: UILongPressGestureRecognizer) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
delegate?.mediaPreviewImageViewController(self, longPressGestureRecognizerDidTrigger: sender)
}
} }
extension MediaPreviewImageViewController: MediaPreviewPage { extension MediaPreviewImageViewController: MediaPreviewPage {

View File

@ -113,12 +113,11 @@ extension MediaPreviewViewController {
guard let self = self else { return } guard let self = self else { return }
switch self.viewModel.item { switch self.viewModel.item {
case .attachment(let previewContext): case .attachment(let previewContext):
let needsHideCloseButton: Bool = { self.topToolbar.isHidden = {
guard index < previewContext.attachments.count else { return false } guard index < previewContext.attachments.count else { return false }
let attachment = previewContext.attachments[index] let attachment = previewContext.attachments[index]
return attachment.kind == .video // not hide buttno for audio return attachment.kind == .video || attachment.kind == .audio
}() }()
self.closeButton.isHidden = needsHideCloseButton
default: default:
break break
} }
@ -274,10 +273,6 @@ extension MediaPreviewViewController: MediaPreviewImageViewControllerDelegate {
} }
} }
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, longPressGestureRecognizerDidTrigger longPressGestureRecognizer: UILongPressGestureRecognizer) {
// do nothing
}
func mediaPreviewImageViewController( func mediaPreviewImageViewController(
_ viewController: MediaPreviewImageViewController, _ viewController: MediaPreviewImageViewController,
contextMenuActionPerform action: MediaPreviewImageViewController.ContextMenuAction contextMenuActionPerform action: MediaPreviewImageViewController.ContextMenuAction

View File

@ -236,7 +236,6 @@ class MastodonLoginViewController: UIViewController, NeedsDependency {
let keyboardFrame = keyboardFrameValue.cgRectValue let keyboardFrame = keyboardFrameValue.cgRectValue
let keyboardOrigin = view.convert(keyboardFrame.origin, from: nil) let keyboardOrigin = view.convert(keyboardFrame.origin, from: nil)
let intersectionY = CGRectGetMaxY(view.frame) - keyboardOrigin.y;
UIView.animate(withDuration: duration.doubleValue, delay: 0, options: .curveEaseInOut) { UIView.animate(withDuration: duration.doubleValue, delay: 0, options: .curveEaseInOut) {
self.view.layoutIfNeeded() self.view.layoutIfNeeded()

View File

@ -47,10 +47,6 @@ final class WelcomeViewController: UIViewController, NeedsDependency {
private(set) lazy var joinDefaultServerButton: UIButton = { private(set) lazy var joinDefaultServerButton: UIButton = {
var buttonConfiguration = UIButton.Configuration.filled() var buttonConfiguration = UIButton.Configuration.filled()
buttonConfiguration.attributedTitle = AttributedString(
L10n.Scene.Welcome.joinDefaultServer,
attributes: .init([.font: UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold))])
)
buttonConfiguration.baseForegroundColor = .white buttonConfiguration.baseForegroundColor = .white
buttonConfiguration.background.backgroundColor = Asset.Colors.Brand.blurple.color buttonConfiguration.background.backgroundColor = Asset.Colors.Brand.blurple.color
buttonConfiguration.background.cornerRadius = 14 buttonConfiguration.background.cornerRadius = 14
@ -217,6 +213,23 @@ extension WelcomeViewController {
.store(in: &disposeBag) .store(in: &disposeBag)
setupIllustrationLayout() setupIllustrationLayout()
joinDefaultServerButton.configuration?.showsActivityIndicator = true
joinDefaultServerButton.isEnabled = false
joinDefaultServerButton.configuration?.title = nil
viewModel.downloadDefaultServer { [weak self] in
guard let selectedDefaultServer = self?.viewModel.randomDefaultServer else { return }
DispatchQueue.main.async {
self?.joinDefaultServerButton.configuration?.showsActivityIndicator = false
self?.joinDefaultServerButton.isEnabled = true
self?.joinDefaultServerButton.configuration?.attributedTitle = AttributedString(
L10n.Scene.Welcome.joinDefaultServer(selectedDefaultServer.domain),
attributes: .init([.font: UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold))])
)
}
}
} }
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
@ -262,12 +275,12 @@ extension WelcomeViewController {
//MARK: - Actions //MARK: - Actions
@objc @objc
private func joinDefaultServer(_ sender: UIButton) { private func joinDefaultServer(_ sender: UIButton) {
guard let server = viewModel.randomDefaultServer else { return }
sender.configuration?.title = nil sender.configuration?.title = nil
sender.isEnabled = false sender.isEnabled = false
sender.configuration?.showsActivityIndicator = true sender.configuration?.showsActivityIndicator = true
let server = Mastodon.Entity.Server.mastodonDotSocial
authenticationViewModel.isAuthenticating.send(true) authenticationViewModel.isAuthenticating.send(true)
context.apiService.instance(domain: server.domain) context.apiService.instance(domain: server.domain)
@ -320,19 +333,26 @@ extension WelcomeViewController {
self.authenticationViewModel.isAuthenticating.send(false) self.authenticationViewModel.isAuthenticating.send(false)
switch completion { switch completion {
case .failure(let error): case .failure(_):
//TODO: show an alert or something guard let randomServer = self.viewModel.pickRandomDefaultServer() else { return }
break
case .finished: self.viewModel.randomDefaultServer = randomServer
break
sender.isEnabled = true
sender.configuration?.showsActivityIndicator = false
sender.configuration?.attributedTitle = AttributedString(
L10n.Scene.Welcome.joinDefaultServer(randomServer.domain),
attributes: .init([.font: UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold))])
)
case .finished:
sender.isEnabled = true
sender.configuration?.showsActivityIndicator = false
sender.configuration?.attributedTitle = AttributedString(
L10n.Scene.Welcome.joinDefaultServer(server.domain),
attributes: .init([.font: UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold))])
)
} }
sender.isEnabled = true
sender.configuration?.showsActivityIndicator = false
sender.configuration?.attributedTitle = AttributedString(
L10n.Scene.Welcome.joinDefaultServer,
attributes: .init([.font: UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold))])
)
} receiveValue: { [weak self] response in } receiveValue: { [weak self] response in
guard let self = self else { return } guard let self = self else { return }
if let rules = response.instance.value.rules, !rules.isEmpty { if let rules = response.instance.value.rules, !rules.isEmpty {

View File

@ -8,11 +8,14 @@
import Foundation import Foundation
import Combine import Combine
import MastodonCore import MastodonCore
import MastodonSDK
final class WelcomeViewModel { final class WelcomeViewModel {
var disposeBag = Set<AnyCancellable>() var disposeBag = Set<AnyCancellable>()
private(set) var defaultServers: [Mastodon.Entity.DefaultServer]?
var randomDefaultServer: Mastodon.Entity.Server?
// input // input
let context: AppContext let context: AppContext
@ -26,5 +29,40 @@ final class WelcomeViewModel {
.map { !$0.isEmpty } .map { !$0.isEmpty }
.assign(to: &$needsShowDismissEntry) .assign(to: &$needsShowDismissEntry)
} }
func downloadDefaultServer(completion: (() -> Void)? = nil) {
context.apiService.defaultServers()
.timeout(.milliseconds(500) , scheduler: DispatchQueue.main)
.sink { [weak self] result in
switch result {
case .finished:
if let defaultServers = self?.defaultServers, defaultServers.isEmpty == false {
self?.randomDefaultServer = self?.pickRandomDefaultServer()
} else {
self?.randomDefaultServer = Mastodon.Entity.Server.mastodonDotSocial
}
case .failure(_):
self?.randomDefaultServer = Mastodon.Entity.Server.mastodonDotSocial
}
completion?()
} receiveValue: { [weak self] servers in
self?.defaultServers = servers.value
}
.store(in: &disposeBag)
}
func pickRandomDefaultServer() -> Mastodon.Entity.Server? {
guard let defaultServers else { return nil }
let weightedServers = defaultServers
.compactMap { [Mastodon.Entity.DefaultServer](repeating: $0, count: $0.weight) }
.reduce([], +)
let randomServer = weightedServers.randomElement()
.map { Mastodon.Entity.Server(domain: $0.domain, instance: Mastodon.Entity.Instance(domain: $0.domain)) }
return randomServer
}
} }

View File

@ -430,7 +430,7 @@ extension ProfileViewController {
} }
let menu = MastodonMenu.setupMenu( let menu = MastodonMenu.setupMenu(
actions: menuActions, actions: [menuActions],
delegate: self delegate: self
) )
return menu return menu

View File

@ -21,9 +21,6 @@ final class HeightFixedSearchBar: UISearchBar {
} }
final class SearchViewController: UIViewController, NeedsDependency { final class SearchViewController: UIViewController, NeedsDependency {
let logger = Logger(subsystem: "SearchViewController", category: "ViewController")
weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } weak var context: AppContext! { willSet { precondition(!isViewLoaded) } }
weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } }
@ -37,16 +34,6 @@ final class SearchViewController: UIViewController, NeedsDependency {
let titleViewContainer = UIView() let titleViewContainer = UIView()
let searchBar = HeightFixedSearchBar() let searchBar = HeightFixedSearchBar()
// let collectionView: UICollectionView = {
// var configuration = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
// configuration.backgroundColor = .clear
// configuration.headerMode = .supplementary
// let layout = UICollectionViewCompositionalLayout.list(using: configuration)
// let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
// collectionView.backgroundColor = .clear
// return collectionView
// }()
// value is the initial search text to set // value is the initial search text to set
let searchBarTapPublisher = PassthroughSubject<String, Never>() let searchBarTapPublisher = PassthroughSubject<String, Never>()
@ -62,11 +49,6 @@ final class SearchViewController: UIViewController, NeedsDependency {
) )
return viewController return viewController
}() }()
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
} }
extension SearchViewController { extension SearchViewController {
@ -85,30 +67,12 @@ extension SearchViewController {
title = L10n.Scene.Search.title title = L10n.Scene.Search.title
setupSearchBar() setupSearchBar()
// collectionView.translatesAutoresizingMaskIntoConstraints = false
// view.addSubview(collectionView)
// NSLayoutConstraint.activate([
// collectionView.topAnchor.constraint(equalTo: view.topAnchor),
// collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
// collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
// collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
// ])
//
// collectionView.delegate = self
// viewModel.setupDiffableDataSource(
// collectionView: collectionView
// )
guard let discoveryViewController = self.discoveryViewController else { return } guard let discoveryViewController = self.discoveryViewController else { return }
addChild(discoveryViewController) addChild(discoveryViewController)
discoveryViewController.view.translatesAutoresizingMaskIntoConstraints = false discoveryViewController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(discoveryViewController.view) view.addSubview(discoveryViewController.view)
discoveryViewController.view.pinToParent() discoveryViewController.view.pinToParent()
// discoveryViewController.view.isHidden = true
} }
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
@ -171,7 +135,6 @@ extension SearchViewController {
// MARK: - UISearchBarDelegate // MARK: - UISearchBarDelegate
extension SearchViewController: UISearchBarDelegate { extension SearchViewController: UISearchBarDelegate {
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
searchBarTapPublisher.send("") searchBarTapPublisher.send("")
return false return false
} }
@ -184,12 +147,8 @@ extension SearchViewController: UISearchBarDelegate {
// MARK: - UISearchControllerDelegate // MARK: - UISearchControllerDelegate
extension SearchViewController: UISearchControllerDelegate { extension SearchViewController: UISearchControllerDelegate {
func willDismissSearchController(_ searchController: UISearchController) { func willDismissSearchController(_ searchController: UISearchController) {
logger.debug("\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
searchController.isActive = true searchController.isActive = true
} }
func didPresentSearchController(_ searchController: UISearchController) {
logger.debug("\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
}
} }
// MARK: - ScrollViewContainer // MARK: - ScrollViewContainer
@ -201,23 +160,3 @@ extension SearchViewController: ScrollViewContainer {
discoveryViewController?.scrollToTop(animated: animated) discoveryViewController?.scrollToTop(animated: animated)
} }
} }
// MARK: - UICollectionViewDelegate
//extension SearchViewController: UICollectionViewDelegate {
// func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): select item at: \(indexPath.debugDescription)")
//
// defer {
// collectionView.deselectItem(at: indexPath, animated: true)
// }
//
// guard let diffableDataSource = viewModel.diffableDataSource else { return }
// guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return }
//
// switch item {
// case .trend(let hashtag):
// let viewModel = HashtagTimelineViewModel(context: context, hashtag: hashtag.name)
// coordinator.present(scene: .hashtagTimeline(viewModel: viewModel), from: self, transition: .show)
// }
// }
//}

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