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" = "محتوى نصي";
@ -32,7 +32,7 @@
"ayoYEb-ehFLjY" = "${content}، المُتابِعُون فقط";
"dUyuGg" = "النَّشرُ عَلَى مَاستودُون";
"dUyuGg" = "النَّشرُ عَلَى ماستدون";
"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}";
"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";
"ryJLwG" = "Post was sent successfully. ";
"ryJLwG" = "Η ανάρτηση στάλθηκε με επιτυχία. ";

View File

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

View File

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

View File

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

View File

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

View File

@ -15,10 +15,6 @@
"title": "Voto fallido",
"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": {
"title": "Error de publicación",
"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",
"unknown_language": "Unknown"
},
"edit_post": "Edit"
"edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
},
"tabs": {
"home": "Inicio",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Iniciar sesión",
"learn_more": "Learn more",
"join_default_server": "Join mastodon.social",
"join_default_server": "Join %@",
"pick_server": "Pick another server",
"separator": {
"or": "or"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Troba Chent a la quala Seguir",
"follow_explain": "Quan sigas a belún veyerás las suyas publicacions en a tuya pachina d'inicio."
"title": "Popular on Mastodon",
"follow_all": "Follow all"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Tot",
"people": "Chent",
"hashtags": "Etiquetas",
"posts": "Publicacions"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Sin resultaus"
},
"recent_search": "Busquedas recients",
"clear_all": "Clear all",
"clear": "Borrar"
}
},

View File

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

View File

@ -15,10 +15,6 @@
"title": "Памылка пры галасаванні",
"poll_ended": "Апытанне завяршылася"
},
"discard_post_content": {
"title": "Скасаваць чарнавік",
"message": "Пацвердзіце, каб скасаваць змесціва допісу."
},
"publish_post_failure": {
"title": "Памылка пры публікацыі",
"message": "Не ўдалося апублікаваць допіс.\nПраверце злучэнне з інтэрнэтам.",
@ -101,7 +97,11 @@
"title": "Перакласці з %s",
"unknown_language": "Невядомая"
},
"edit_post": "Рэдагаваць"
"edit_post": "Рэдагаваць",
"bookmark": "Закладка",
"remove_bookmark": "Выдаліць закладку",
"follow": "Падпісацца на %s",
"unfollow": "Адпісацца ад %s"
},
"tabs": {
"home": "Галоўная",
@ -257,16 +257,16 @@
}
},
"user_list": {
"no_verified_link": "No verified link",
"followers_count": "%@ followers"
"no_verified_link": "Няма спраўджанай спасылкі",
"followers_count": "%@ падпісчыкаў"
}
},
"scene": {
"welcome": {
"log_in": "Увайсці",
"learn_more": "Даведацца больш",
"join_default_server": "Далучайцеся да mastodon.social",
"pick_server": "Pick another server",
"join_default_server": "Далучыцца да %@",
"pick_server": "Выбраць іншы сервер",
"separator": {
"or": "або"
},
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Знайсці людзей, каб падпісацца",
"follow_explain": "Калі вы падпішацеся на кагосьці, вы ўбачыце яго допісы ў сваёй хатняй стужцы."
"title": "Папулярна ў Mastodon",
"follow_all": "Падпісацца на ўсіх"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Усе",
"people": "Людзі",
"hashtags": "Хэштэгі",
"posts": "Допісы"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Няма вынікаў"
},
"recent_search": "Нядаўнія запыты",
"clear_all": "Clear all",
"clear": "Ачысціць"
}
},
@ -875,18 +875,18 @@
},
"hashtag": {
"configuration": {
"display_name": "Hashtag",
"description": "Shows a recent post with the selected hashtag."
"display_name": "Хэштэг",
"description": "Паказвае нядаўні допіс з выбраным хэштэгам."
},
"not_found": {
"account_name": "John Mastodon",
"account_name": "Джон Мастадон",
"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": {
"account_name": "John Mastodon",
"account_name": "Джон Мастадон",
"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",
"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": {
"title": "Error en publicar",
"message": "No s'ha pogut enviar la publicació.\nComprova la connexió a Internet.",
@ -49,8 +45,8 @@
"message": "Segur que vols eliminar aquesta publicació?"
},
"clean_cache": {
"title": "Neteja la memòria cau",
"message": "S'ha netejat correctament la memòria cau de %s."
"title": "Esborra la memòria cau",
"message": "S'han esborrat %s de memòria cau."
},
"translation_failed": {
"title": "Nota",
@ -89,19 +85,23 @@
"open_in_safari": "Obrir a Safari",
"open_in_browser": "Obre al navegador",
"find_people": "Busca persones a seguir",
"manually_search": "Cerca manualment a canvi",
"manually_search": "Millor cerca manualment",
"skip": "Omet",
"reply": "Respon",
"report_user": "Informa sobre %s",
"block_domain": "Bloqueja %s",
"report_user": "Denuncia %s",
"block_domain": "Bloca %s",
"unblock_domain": "Desbloca %s",
"settings": "Configuració",
"delete": "Suprimeix",
"translate_post": {
"title": "Traduït del %s",
"title": "Tradueix del: %s",
"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": {
"home": "Inici",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Inicia sessió",
"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",
"separator": {
"or": "o"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Cerca Persones a Seguir",
"follow_explain": "Quan segueixes algú, veuràs els seus tuts a Inici."
"title": "Popular a Mastodon",
"follow_all": "Seguir a tothom"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Tots",
"people": "Gent",
"hashtags": "Etiquetes",
"posts": "Tuts"
},
"posts": "Tuts coincidents amb \"%s\"",
"people": "Perfils coincidents amb \"%s\"",
"profile": "Vés a @%s@%s",
"url": "Obre l'enllaç a Mastodon",
"hashtag": "Vés a #%s",
"empty_state": {
"no_results": "No hi ha resultats"
},
"recent_search": "Cerques recents",
"clear_all": "Esborra-ho tot",
"clear": "Neteja"
}
},

View File

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

View File

@ -15,10 +15,6 @@
"title": "Selhání hlasování",
"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": {
"title": "Publikování selhalo",
"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",
"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": {
"home": "Domů",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Přihlásit se",
"learn_more": "Zjistit více",
"join_default_server": "Join mastodon.social",
"join_default_server": "Připojit se k %@",
"pick_server": "Pick another server",
"separator": {
"or": "or"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Najít lidi pro sledování",
"follow_explain": "Když někoho sledujete, uvidíte jejich příspěvky ve vašem domovském kanálu."
"title": "Popular on Mastodon",
"follow_all": "Follow all"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Vše",
"people": "Lidé",
"hashtags": "Hashtagy",
"posts": "Příspěvky"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Žádné výsledky"
},
"recent_search": "Nedávná hledání",
"clear_all": "Clear all",
"clear": "Vymazat"
}
},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -12,18 +12,14 @@
"title": "Palvelinvirhe"
},
"vote_failure": {
"title": "Vote Failure",
"title": "Äänestys epäonnistui",
"poll_ended": "Kysely on päättynyt"
},
"discard_post_content": {
"title": "Hylkää luonnos",
"message": "Confirm to discard composed post content."
},
"publish_post_failure": {
"title": "Julkaiseminen epäonnistui",
"message": "Julkaisun julkaiseminen epäonnistui.\nTarkista internet-yhteytesi.",
"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ää."
}
},
@ -37,24 +33,24 @@
"confirm": "Kirjaudu ulos"
},
"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"
},
"save_photo_failure": {
"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": {
"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": {
"title": "Puhdista välimuisti",
"message": "%s välimuisti tyhjennetty onnistuneesti."
},
"translation_failed": {
"title": "Note",
"message": "Translation failed. Maybe the administrator has not enabled translations on this server or this server is running an older version of Mastodon where translations are not yet supported.",
"title": "Huomautus",
"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"
}
},
@ -101,7 +97,11 @@
"title": "Käännetty kielestä %s",
"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": {
"home": "Koti",
@ -185,10 +185,10 @@
"emoji": "Emoji"
},
"visibility": {
"unlisted": "Everyone can see this post but not display in the public timeline.",
"private": "Only their followers can see this post.",
"private_from_me": "Only my followers can see this post.",
"direct": "Only mentioned user can see this post."
"unlisted": "Kaikki voivat nähdä julkaisun, mutta sitä ei näytetä julkisella aikajanalla.",
"private": "Vain heidän seuraajansa voivat nähdä julkaisun.",
"private_from_me": "Vain omat seuraajat voivat nähdä julkaisun.",
"direct": "Vain mainittu käyttäjä voi nähdä julkaisun."
},
"translation": {
"translated_from": "Käännetty kielestä %s palvelulla %s",
@ -257,16 +257,16 @@
}
},
"user_list": {
"no_verified_link": "No verified link",
"followers_count": "%@ followers"
"no_verified_link": "Ei todennettua linkkiä",
"followers_count": "%@ seuraajaa"
}
},
"scene": {
"welcome": {
"log_in": "Kirjaudu sisään",
"learn_more": "Lue lisää",
"join_default_server": "Liity mastodon.social-palvelimelle",
"pick_server": "Pick another server",
"join_default_server": "Liity palvelimelle %@",
"pick_server": "Valitse eri palvelin",
"separator": {
"or": "tai"
},
@ -288,9 +288,9 @@
},
"login": {
"title": "Tervetuloa takaisin",
"subtitle": "Log you in on the server you created your account on.",
"subtitle": "Kirjaudu palvelimelle, jolla loit tilisi.",
"server_search_field": {
"placeholder": "Enter URL or search for your server"
"placeholder": "Syötä URL-osoite tai etsi palvelintasi"
}
},
"server_picker": {
@ -323,7 +323,7 @@
"category": "KATEGORIA"
},
"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": {
"finding_servers": "Etsistään saatavilla olevia palvelimia...",
@ -374,7 +374,7 @@
"password": {
"placeholder": "salasana",
"confirmation_placeholder": "Vahvista salasana",
"require": "Your password needs at least:",
"require": "Salasanasi on oltava ainakin:",
"character_limit": "8 merkkiä",
"accessibility": {
"checked": "tarkastettu",
@ -457,13 +457,13 @@
"Publishing": "Julkaistaan julkaisua...",
"accessibility": {
"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": {
"title": "Löydä tilejä seurattavaksi",
"follow_explain": "Kun seuraat jotakuta, näet hänen julkaisunsa kotisyötteessäsi."
"title": "Suosittua Mastodonissa",
"follow_all": "Seuraa kaikkia"
},
"compose": {
"title": {
@ -482,15 +482,15 @@
"attachment": {
"photo": "kuva",
"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_video": "Kuvaile video näkövammaisille...",
"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",
"load_failed": "Lataus epäonnistui",
"upload_failed": "Lähetys epäonnistui",
"can_not_recognize_this_media_attachment": "Medialiitettä ei tunnisteta",
"attachment_too_large": "Liite on liian suuri",
"compressing_state": "Pakataan...",
"server_processing_state": "Server Processing..."
"server_processing_state": "Palvelin käsittelee..."
},
"poll": {
"title": "Kysely",
@ -502,8 +502,8 @@
"three_days": "3 päivää",
"seven_days": "7 päivää",
"option_number": "Vaihtoehto %ld",
"the_poll_is_invalid": "The poll is invalid",
"the_poll_has_empty_option": "The poll has empty option",
"the_poll_is_invalid": "Kysely on virheellinen",
"the_poll_has_empty_option": "Kyselyssä on tyhjä vaihtoehto",
"add_option": "Lisää vaihtoehto",
"remove_option": "Poista vaihtoehto",
"move_up": "Siirrä ylemmäs",
@ -519,7 +519,7 @@
"direct": "Vain mainitsemani tilit"
},
"auto_complete": {
"space_to_add": "Space to add"
"space_to_add": "Lisättävä tila"
},
"accessibility": {
"append_attachment": "Lisää liite",
@ -529,8 +529,8 @@
"enable_content_warning": "Ota sisältövaroitus käyttöön",
"disable_content_warning": "Poista sisältövaroitus käytöstä",
"post_visibility_menu": "Julkaisun näkyvyysvalikko",
"post_options": "Post Options",
"posting_as": "Posting as %s"
"post_options": "Julkaisun valinnat",
"posting_as": "Julkaistaan tunnuksella %s"
},
"keyboard": {
"discard_post": "Hylkää julkaisu",
@ -549,7 +549,7 @@
},
"profile": {
"header": {
"follows_you": "Follows You"
"follows_you": "Seuraa sinua"
},
"dashboard": {
"my_posts": "julkaisut",
@ -561,22 +561,22 @@
"familiar_followers": "yhteiset"
},
"fields": {
"joined": "Joined",
"joined": "Liittynyt",
"add_row": "Lisää rivi",
"placeholder": {
"label": "Nimi",
"content": "Sisältö"
},
"verified": {
"short": "Verified on %s",
"long": "Ownership of this link was checked on %s"
"short": "Vahvistettu %s",
"long": "Linkin omistajuus on tarkastettu %s"
}
},
"segmented_control": {
"posts": "Julkaisut",
"replies": "Vastaukset",
"posts_and_replies": "Posts and Replies",
"media": "Media",
"posts_and_replies": "Julkaisut ja vastaukset",
"media": "Mediat",
"about": "Tietoja"
},
"relationship_action_alert": {
@ -590,11 +590,11 @@
},
"confirm_block_user": {
"title": "Estä tili",
"message": "Confirm to block %s"
"message": "Vahvista käyttäjän %s esto"
},
"confirm_unblock_user": {
"title": "Unblock Account",
"message": "Confirm to unblock %s"
"title": "Poista tilin esto",
"message": "Vahvista tilin %s eston poisto"
},
"confirm_show_reblogs": {
"title": "Show Reblogs",
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Kaikki",
"people": "Tilit",
"hashtags": "Hashtagit",
"posts": "Julkaisut"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Avaa profiilii @%s@%s",
"url": "Avaa URL Mastodonissa",
"hashtag": "Siirry #%s",
"empty_state": {
"no_results": "Ei hakutuloksia"
},
"recent_search": "Viimeaikaiset",
"clear_all": "Tyhjennä kaikki",
"clear": "Tyhjennä"
}
},
@ -716,13 +716,13 @@
"look_and_feel": {
"title": "Look and Feel",
"use_system": "Use System",
"really_dark": "Really Dark",
"sorta_dark": "Sorta Dark",
"light": "Light"
"really_dark": "Erittäin tumma",
"sorta_dark": "Tummahko",
"light": "Vaalea"
},
"notifications": {
"title": "Ilmoitukset",
"favorites": "Favorites my post",
"favorites": "Lisää julkaisuni suosikkeihinsa",
"follows": "Seuraa minua",
"boosts": "Omien julkaisujen edelleen jaot",
"mentions": "Mainitsee minut",
@ -739,7 +739,7 @@
"disable_avatar_animation": "Poista käytöstä animoidut avatarit",
"disable_emoji_animation": "Poista käytöstä animoidut emojit",
"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": {
"title": "Tylsä alue",
@ -761,58 +761,58 @@
}
},
"report": {
"title_report": "Report",
"title_report": "Raportoi",
"title": "Ilmianna %s",
"step1": "Vaihe 1/2",
"step2": "Vaihe 2/2",
"content1": "Onko julkaisuja, joita haluaisit lisätä ilmiantoon?",
"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",
"skip_to_send": "Lähetä ilman kommentteja",
"text_placeholder": "Kirjoita tai liitä lisäkommentteja",
"reported": "REPORTED",
"reported": "ILMOITETTU",
"step_one": {
"step_1_of_4": "Step 1 of 4",
"whats_wrong_with_this_post": "What's wrong with this post?",
"whats_wrong_with_this_account": "What's wrong with this account?",
"whats_wrong_with_this_username": "What's wrong with %s?",
"select_the_best_match": "Select the best match",
"i_dont_like_it": "I dont like it",
"it_is_not_something_you_want_to_see": "It is not something you want to see",
"its_spam": "Its spam",
"malicious_links_fake_engagement_or_repetetive_replies": "Malicious links, fake engagement, or repetetive replies",
"it_violates_server_rules": "It violates server rules",
"you_are_aware_that_it_breaks_specific_rules": "You are aware that it breaks specific rules",
"its_something_else": "Its something else",
"the_issue_does_not_fit_into_other_categories": "The issue does not fit into other categories"
"step_1_of_4": "Vaihe 1/4",
"whats_wrong_with_this_post": "Mitä vikaa tässä julkaisussa on?",
"whats_wrong_with_this_account": "Mitä vikaa tässä tilissä on?",
"whats_wrong_with_this_username": "Mitä vikaa käyttäjässä %s on?",
"select_the_best_match": "Valitse sopivin",
"i_dont_like_it": "En pidä siitä",
"it_is_not_something_you_want_to_see": "Tätä ei halua nähdä",
"its_spam": "Se on roskapostia",
"malicious_links_fake_engagement_or_repetetive_replies": "Haitallisia linkkejä, valheellinen osanotto tai toistuvia vastauksia",
"it_violates_server_rules": "Se rikkoo palvelimen sääntöjä",
"you_are_aware_that_it_breaks_specific_rules": "Tiedät sen rikkovan tiettyjä sääntöjä",
"its_something_else": "Jotain muuta",
"the_issue_does_not_fit_into_other_categories": "Ongelma ei sovi muihin kategorioihin"
},
"step_two": {
"step_2_of_4": "Step 2 of 4",
"which_rules_are_being_violated": "Which rules are being violated?",
"select_all_that_apply": "Select all that apply",
"i_just_dont_like_it": "I just dont like it"
"step_2_of_4": "Vaihe 2/4",
"which_rules_are_being_violated": "Mitä sääntöjä rikotaan?",
"select_all_that_apply": "Valitse kaikki sopivat",
"i_just_dont_like_it": "En vain pidä siitä"
},
"step_three": {
"step_3_of_4": "Step 3 of 4",
"are_there_any_posts_that_back_up_this_report": "Are there any posts that back up this report?",
"select_all_that_apply": "Select all that apply"
"step_3_of_4": "Vaihe 3/4",
"are_there_any_posts_that_back_up_this_report": "Onko raporttia tukevia julkaisuja?",
"select_all_that_apply": "Valitse kaikki sopivat"
},
"step_four": {
"step_4_of_4": "Step 4 of 4",
"is_there_anything_else_we_should_know": "Is there anything else we should know?"
"step_4_of_4": "Vaihe 4/4",
"is_there_anything_else_we_should_know": "Pitäisikö meidän tietää jotain muuta?"
},
"step_final": {
"dont_want_to_see_this": "Dont want to see this?",
"when_you_see_something_you_dont_like_on_mastodon_you_can_remove_the_person_from_your_experience.": "When you see something you dont like on Mastodon, you can remove the person from your experience.",
"unfollow": "Unfollow",
"unfollowed": "Unfollowed",
"unfollow_user": "Unfollow %s",
"mute_user": "Mute %s",
"you_wont_see_their_posts_or_reblogs_in_your_home_feed_they_wont_know_they_ve_been_muted": "You wont see their posts or reblogs in your home feed. They wont know theyve been muted.",
"block_user": "Block %s",
"they_will_no_longer_be_able_to_follow_or_see_your_posts_but_they_can_see_if_theyve_been_blocked": "They will no longer be able to follow or see your posts, but they can see if theyve been blocked.",
"while_we_review_this_you_can_take_action_against_user": "While we review this, you can take action against %s"
"dont_want_to_see_this": "Etkö halua nähdä tätä?",
"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": "Lopeta seuraaminen",
"unfollowed": "Seuraaminen lopetettiin",
"unfollow_user": "Lopeta käyttäjän %s seuraaminen",
"mute_user": "Mykistä %s",
"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": "Estä %s",
"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": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimenpiteisiin käyttäjää %s vastaan"
}
},
"preview": {
@ -828,18 +828,18 @@
"add_account": "Lisää tili"
},
"bookmark": {
"title": "Bookmarks"
"title": "Kirjanmerkit"
},
"followed_tags": {
"title": "Followed Tags",
"title": "Seuratut tunnisteet",
"header": {
"posts": "posts",
"participants": "participants",
"posts_today": "posts today"
"posts": "julkaisua",
"participants": "osallistujaa",
"posts_today": "julkaisua tänään"
},
"actions": {
"follow": "Follow",
"unfollow": "Unfollow"
"follow": "Seuraa",
"unfollow": "Lopeta seuraaminen"
}
}
},
@ -875,18 +875,18 @@
},
"hashtag": {
"configuration": {
"display_name": "Hashtag",
"description": "Shows a recent post with the selected hashtag."
"display_name": "Aihetunniste",
"description": "Näyttää hiljattaisen julkaisun valitusta aihetunnisteesta."
},
"not_found": {
"account_name": "John Mastodon",
"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."
"account_name": "Mikko Mastodon",
"account": "@mikkoMastodon@ei-sellaista.tiliä",
"content": "Valitettavasti emme löytäneet yhtään julkaisua aihetunnisteella <a>#%@</a>. Kokeile <a>#DifferentHashtag</a> tai tarkista widgetin asetukset."
},
"placeholder": {
"account_name": "John Mastodon",
"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."
"account_name": "Mikko Mastodon",
"account": "@mikkoMastodon@ei-sellaista.tiliä",
"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>
<string>1 reblog</string>
<key>other</key>
<string>%ld re-blogs</string>
<string>%ld reblogs</string>
</dict>
</dict>
<key>plural.count.reply</key>

View File

@ -15,10 +15,6 @@
"title": "Échec du vote",
"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": {
"title": "La publication a échoué",
"message": "La publication a échoué.\nVeuillez vérifier votre accès à Internet.",
@ -101,7 +97,11 @@
"title": "Traduit depuis %s",
"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": {
"home": "Accueil",
@ -206,12 +206,12 @@
"buttons": {
"reblogs_title": "Reblogs",
"favorites_title": "Favoris",
"edit_history_title": "Modifier l'historique",
"edit_history_title": "Historique des modifications",
"edit_history_detail": "Dernière modification %s"
},
"edited_at_timestamp_prefix": "Édité %s",
"edit_history": {
"title": "Modifier l'historique",
"title": "Historique des modifications",
"original_post": "Message original · %s"
}
},
@ -258,14 +258,14 @@
},
"user_list": {
"no_verified_link": "Lien non vérifié",
"followers_count": "%@ abonnés"
"followers_count": "%@ abonné·e·s"
}
},
"scene": {
"welcome": {
"log_in": "Se connecter",
"learn_more": "En savoir plus",
"join_default_server": "Rejoindre mastodon.social",
"join_default_server": "Rejoindre %@",
"pick_server": "Trouver un autre serveur",
"separator": {
"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."
},
"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.",
"policy": {
"ios": "Politique de confidentialité - Mastodon pour iOS",
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Trouver des personnes à suivre",
"follow_explain": "Quand vous suivez quelqu'un, vous verrez leurs messages dans votre flux daccueil."
"title": "Populaire sur Mastodon",
"follow_all": "Tout suivre"
},
"compose": {
"title": {
@ -515,7 +515,7 @@
"visibility": {
"public": "Public",
"unlisted": "Non listé",
"private": "Abonnés seulement",
"private": "Abonné·e·s seulement",
"direct": "Seulement les personnes que je mentionne"
},
"auto_complete": {
@ -553,11 +553,11 @@
},
"dashboard": {
"my_posts": "messages",
"my_following": "abonnement",
"my_followers": "abonnés",
"my_following": "abonnements",
"my_followers": "abonné·e·s",
"other_posts": "publications",
"other_following": "abonnement",
"other_followers": "abonnés",
"other_followers": "abonné·e·s",
"familiar_followers": "mutuel"
},
"fields": {
@ -617,7 +617,7 @@
"footer": "Les abonné·e·s issus des autres serveurs ne sont pas affiché·e·s."
},
"following": {
"title": "abonnement",
"title": "abonnements",
"footer": "Les abonnés issus des autres serveurs ne sont pas affichés."
},
"familiarFollowers": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Tout",
"people": "Personnes",
"hashtags": "Hashtags",
"posts": "Publications"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Aller à @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Aucun résultat"
},
"recent_search": "Recherches récentes",
"clear_all": "Effacer tout",
"clear": "Effacer"
}
},
@ -682,7 +682,7 @@
"Mentions": "Mentions"
},
"notification_description": {
"followed_you": "sest abonné à vous",
"followed_you": "sest abonné·e à vous",
"favorited_your_post": "a ajouté votre message à ses favoris",
"reblogged_your_post": "a partagé votre message",
"mentioned_you": "vous a mentionné",
@ -728,7 +728,7 @@
"mentions": "Me mentionne",
"trigger": {
"anyone": "nimporte qui",
"follower": "un abonné",
"follower": "un·e abonné·e",
"follow": "toute personne que je suis",
"noone": "personne",
"title": "Me notifier lorsque"
@ -856,21 +856,21 @@
"followers_count": {
"configuration_display_name": "Abonné·e·s",
"configuration_description": "Afficher le nombre d'abonnés.",
"title": "ABONNES",
"followers_today": "%s abonnés aujourd'hui"
"title": "ABONNÉ·E·S",
"followers_today": "%s abonné·e·s aujourd'hui"
},
"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.",
"mock_user": {
"display_name": "Autres abonnés",
"display_name": "Autres abonné·e·s",
"account_name": "another@follower.social"
}
},
"latest_followers": {
"configuration_display_name": "Derniers abonnés",
"configuration_display_name": "Derniers abonné·e·s",
"configuration_description": "Afficher les derniers abonnés.",
"title": "Derniers abonnés",
"title": "Derniers abonné·e·s",
"last_update": "Dernière mise à jour: %s"
},
"hashtag": {

View File

@ -15,10 +15,6 @@
"title": "Dhfhàillig leis a bhòt",
"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": {
"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.",
@ -88,7 +84,7 @@
"share_post": "Co-roinn am post",
"open_in_safari": "Fosgail ann an Safari",
"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",
"skip": "Leum thairis air",
"reply": "Freagair",
@ -101,7 +97,11 @@
"title": "Eadar-theangaich o: %s",
"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": {
"home": "Dachaigh",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Clàraich a-steach",
"learn_more": "Barrachd fiosrachaidh",
"join_default_server": "Faigh ballrachd air mastodon.social",
"join_default_server": "Faigh ballrachd aig %@",
"pick_server": "Tagh frithealaiche eile",
"separator": {
"or": "no"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Lorg daoine a leanas tu",
"follow_explain": "Nuair a leanas tu cuideigin, chì thu na puist aca air inbhir na dachaigh agad."
"title": "Fèillmhor air Mastodon",
"follow_all": "Lean na h-uile"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Na h-uile",
"people": "Daoine",
"hashtags": "Tagaichean hais",
"posts": "Postaichean"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Gun toradh"
},
"recent_search": "Na lorg thu o chionn goirid",
"clear_all": "Clear all",
"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",
"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",
"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"
},
"step_two": {

View File

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

View File

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

View File

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

View File

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

View File

@ -15,10 +15,6 @@
"title": "Greiðsla atkvæðis mistókst",
"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": {
"title": "Mistókst að birta",
"message": "Mistókst að birta færsluna.\nAthugaðu nettenginguna þína.",
@ -101,7 +97,11 @@
"title": "Þýða úr %s",
"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": {
"home": "Heim",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Skrá inn",
"learn_more": "Kanna nánar",
"join_default_server": "Taka þátt á mastodon.social",
"join_default_server": "Taka þátt í %@",
"pick_server": "Veldu annan netþjón",
"separator": {
"or": "eða"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Finndu fólk til að fylgjast með",
"follow_explain": "Þegar þú fylgist með einhverjum, muntu sjá færslur frá viðkomandi á streyminu þínu."
"title": "Vinsælt á Mastodon",
"follow_all": "Fylgjast með öllum"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Allt",
"people": "Fólk",
"hashtags": "Myllumerki",
"posts": "Færslur"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Engar niðurstöður"
},
"recent_search": "Nýlegar leitir",
"clear_all": "Hreinsa allt",
"clear": "Hreinsa"
}
},

View File

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

View File

@ -15,10 +15,6 @@
"title": "投票の失敗",
"poll_ended": "投票は終了しました"
},
"discard_post_content": {
"title": "投稿を破棄しますか?",
"message": "この操作は取り消しできません。下書きは失われます。"
},
"publish_post_failure": {
"title": "失敗",
"message": "投稿に失敗しました。\nインターネットに接続されているか確認してください。",
@ -101,7 +97,11 @@
"title": "%sから翻訳",
"unknown_language": "不明"
},
"edit_post": "編集"
"edit_post": "編集",
"bookmark": "ブックマーク",
"remove_bookmark": "ブックマークから削除",
"follow": "%sをフォロー",
"unfollow": "%sをフォロー解除"
},
"tabs": {
"home": "ホーム",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "ログイン",
"learn_more": "詳しく学ぶ",
"join_default_server": "mastodon.social に登録",
"join_default_server": "%@ に登録",
"pick_server": "ほかのサーバーをさがす",
"separator": {
"or": "または"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "フォローする人を探す",
"follow_explain": "誰かをフォローすると、その人の投稿がタイムラインに表示されるようになります。"
"title": "人気のアカウント",
"follow_all": "すべてフォロー"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "すべて",
"people": "人々",
"hashtags": "ハッシュタグ",
"posts": "投稿"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "なし"
},
"recent_search": "最近の検索",
"clear_all": "Clear all",
"clear": "クリア"
}
},
@ -886,7 +886,7 @@
"placeholder": {
"account_name": "John Mastodon",
"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",
"poll_ended": "Tafrant tfuk"
},
"discard_post_content": {
"title": "Kkes arewway",
"message": "Sentem i wakken ad yettusefsax ugbur n tsuffeɣt."
},
"publish_post_failure": {
"title": "Yecceḍ usuffeɣ",
"message": "Yecceḍ usuffeɣ n tsuffeɣt.\nMa ulac aɣilif, senqed tuqqna-inek internet.",
@ -101,7 +97,11 @@
"title": "Translate from %s",
"unknown_language": "Unknown"
},
"edit_post": "Edit"
"edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
},
"tabs": {
"home": "Agejdan",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Qqen",
"learn_more": "Learn more",
"join_default_server": "Join mastodon.social",
"join_default_server": "Join %@",
"pick_server": "Pick another server",
"separator": {
"or": "or"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Af imdanen ara tḍefreḍ",
"follow_explain": "Mi ara teṭṭafareḍ albaɛḍ, ad twaliḍ tisuffaɣ-is deg usuddem-inek agejdan."
"title": "Popular on Mastodon",
"follow_all": "Follow all"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Akk",
"people": "Imdanen",
"hashtags": "Ihacṭagen",
"posts": "Tisuffaɣ"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Ulac igemmaḍ"
},
"recent_search": "Inadiyen imaynuten",
"clear_all": "Clear all",
"clear": "Sfeḍ"
}
},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,10 +15,6 @@
"title": "Niepowodzenie głosowania",
"poll_ended": "Ankieta zakończyła się"
},
"discard_post_content": {
"title": "Anuluj wersje roboczą",
"message": "Potwierdź odrzucenie treści posta."
},
"publish_post_failure": {
"title": "Błąd publikowania",
"message": "Nie udało się opublikować posta.\nSprawdź swoje połączenie internetowe.",
@ -101,7 +97,11 @@
"title": "Przetłumacz z %s",
"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": {
"home": "Strona główna",
@ -202,7 +202,7 @@
"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"
},
"posted_via_application": "%s via %s",
"posted_via_application": "%s przez %s",
"buttons": {
"reblogs_title": "Reblogs",
"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.",
"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ę.",
"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.",
"user_suspended_warning": "Konto %s zostało zawieszone."
}
}
},
"user_list": {
"no_verified_link": "No verified link",
"followers_count": "%@ followers"
"no_verified_link": "Niezweryfikowany link",
"followers_count": "%@ obserwujących"
}
},
"scene": {
"welcome": {
"log_in": "Zaloguj się",
"learn_more": "Learn more",
"join_default_server": "Join mastodon.social",
"pick_server": "Pick another server",
"learn_more": "Dowiedz się więcej",
"join_default_server": "Dołącz do %@",
"pick_server": "Wybierz inną instancję",
"separator": {
"or": "or"
"or": "lub"
},
"education": {
"mastodon": {
"title": "Welcome to 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."
"title": "Witaj na Mastodonie",
"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": {
"title": "What are servers?",
"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."
"title": "Czym są serwery?",
"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": {
"what_is_mastodon": {
@ -287,7 +287,7 @@
}
},
"login": {
"title": "Welcome back",
"title": "Witaj ponownie",
"subtitle": "Zaloguj się na serwerze, na którym utworzyłeś swoje konto.",
"server_search_field": {
"placeholder": "Wprowadź adres URL lub wyszukaj swój serwer"
@ -300,55 +300,55 @@
"signup_speed": "Szybkość rejestracji",
"category": {
"all": "Wszystkie",
"all_accessiblity_description": "Category: All",
"academia": "academia",
"activism": "activism",
"food": "food",
"furry": "furry",
"games": "games",
"general": "general",
"journalism": "journalism",
"lgbt": "lgbt",
"regional": "regional",
"art": "art",
"music": "music",
"tech": "tech"
"all_accessiblity_description": "Kategoria: Wszystkie",
"academia": "środowiska akademickie",
"activism": "aktywizm",
"food": "jedzenie",
"furry": "„futrzaki”",
"games": "gry",
"general": "ogólne",
"journalism": "dziennikarstwo",
"lgbt": "LGBT",
"regional": "regionalne",
"art": "sztuka",
"music": "muzyka",
"tech": "technologia"
},
"see_less": "See Less",
"see_more": "See More"
"see_less": "Zobacz mniej",
"see_more": "Zobacz więcej"
},
"label": {
"language": "LANGUAGE",
"users": "USERS",
"category": "CATEGORY"
"language": "JĘZYK",
"users": "UŻYTKOWNICY",
"category": "KATEGORIA"
},
"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": {
"finding_servers": "Finding available servers...",
"bad_network": "Something went wrong while loading the data. Check your internet connection.",
"no_results": "No results"
"finding_servers": "Szukanie dostępnych instancji...",
"bad_network": "Coś poszło nie tak podczas ładowania danych. Sprawdź swoje połączenie internetowe.",
"no_results": "Brak wyników"
},
"signup_speed": {
"all": "All",
"instant": "Instant Sign-up",
"manually_reviewed": "Manual Review"
"all": "Wszystko",
"instant": "Natychmiastowa rejestracja",
"manually_reviewed": "Ręczne sprawdzenie"
},
"language": {
"all": "All"
"all": "Wszystko"
},
"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": {
"title": "Privacy",
"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.",
"title": "Prywatność",
"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": {
"ios": "Privacy Policy - Mastodon for iOS",
"server": "Privacy Policy - %s"
"ios": "Polityka prywatności - Mastodon dla iOS",
"server": "Polityka Prywatności - %s"
},
"button": {
"confirm": "I Agree"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Find People to Follow",
"follow_explain": "When you follow someone, youll see their posts in your home feed."
"title": "Popular on Mastodon",
"follow_all": "Follow all"
},
"compose": {
"title": {
@ -478,27 +478,27 @@
},
"content_input_placeholder": "Type or paste whats on your mind",
"compose_action": "Publish",
"replying_to_user": "replying to %s",
"replying_to_user": "odpowiadanie %s",
"attachment": {
"photo": "photo",
"video": "video",
"attachment_broken": "This %s is broken and cant be\nuploaded to Mastodon.",
"photo": "zdjęcie",
"video": "film",
"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_video": "Describe the video for the visually-impaired...",
"load_failed": "Load Failed",
"upload_failed": "Upload Failed",
"can_not_recognize_this_media_attachment": "Can not recognize this media attachment",
"attachment_too_large": "Attachment too large",
"compressing_state": "Compressing...",
"server_processing_state": "Server Processing..."
"load_failed": "Załadowanie nie powiodło się",
"upload_failed": "Nie udało się przesłać",
"can_not_recognize_this_media_attachment": "Nie można rozpoznać tego załącznika",
"attachment_too_large": "Załącznik jest zbyt duży",
"compressing_state": "Kompresja...",
"server_processing_state": "Przetwarzanie..."
},
"poll": {
"title": "Poll",
"duration_time": "Duration: %s",
"thirty_minutes": "30 minutes",
"one_hour": "1 Hour",
"six_hours": "6 Hours",
"one_day": "1 Day",
"title": "Ankieta",
"duration_time": "Czas trwania: %s",
"thirty_minutes": "30 minutach",
"one_hour": "Godzinie",
"six_hours": "6 Godzinach",
"one_day": "Dobie",
"three_days": "3 Days",
"seven_days": "7 Days",
"option_number": "Option %ld",
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "All",
"people": "People",
"hashtags": "Hashtags",
"posts": "Posts"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "No results"
},
"recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear"
}
},

View File

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

View File

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

View File

@ -15,10 +15,6 @@
"title": "Eșec la vot",
"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": {
"title": "Eșec la publicare",
"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",
"unknown_language": "Necunoscut"
},
"edit_post": "Edit"
"edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
},
"tabs": {
"home": "Acasă",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Log In",
"learn_more": "Learn more",
"join_default_server": "Join mastodon.social",
"join_default_server": "Join %@",
"pick_server": "Pick another server",
"separator": {
"or": "or"
@ -462,8 +462,8 @@
}
},
"suggestion_account": {
"title": "Find People to Follow",
"follow_explain": "When you follow someone, youll see their posts in your home feed."
"title": "Popular on Mastodon",
"follow_all": "Follow all"
},
"compose": {
"title": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "All",
"people": "People",
"hashtags": "Hashtags",
"posts": "Posts"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "No results"
},
"recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear"
}
},

View File

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

View File

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

View File

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

View File

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

View File

@ -15,10 +15,6 @@
"title": "Röstning misslyckades",
"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": {
"title": "Publicering misslyckades",
"message": "Det gick inte att publicera inlägget.\nKontrollera din internetanslutning.",
@ -101,7 +97,11 @@
"title": "Översätt från %s",
"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": {
"home": "Hem",
@ -109,8 +109,8 @@
"notifications": "Notiser",
"profile": "Profil",
"a11y": {
"search": "Search",
"explore": "Explore"
"search": "Sök",
"explore": "Utforska"
}
},
"keyboard": {
@ -194,7 +194,7 @@
"translated_from": "Översatt från %s med %s",
"unknown_language": "Okänt",
"unknown_provider": "Okänd",
"show_original": "Show Original"
"show_original": "Visa original"
},
"media": {
"accessibility_label": "%s, bilaga %d av %d",
@ -209,7 +209,7 @@
"edit_history_title": "Edit History",
"edit_history_detail": "Last edit %s"
},
"edited_at_timestamp_prefix": "Edited %s",
"edited_at_timestamp_prefix": "Ändrad %s",
"edit_history": {
"title": "Edit History",
"original_post": "Original Post · %s"
@ -257,7 +257,7 @@
}
},
"user_list": {
"no_verified_link": "No verified link",
"no_verified_link": "Ingen verifierad länk",
"followers_count": "%@ följare"
}
},
@ -265,36 +265,36 @@
"welcome": {
"log_in": "Logga in",
"learn_more": "Läs mer",
"join_default_server": "Join mastodon.social",
"pick_server": "Pick another server",
"join_default_server": "Gå med %@",
"pick_server": "Hitta en annan server",
"separator": {
"or": "or"
"or": "eller"
},
"education": {
"mastodon": {
"title": "Welcome to 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."
"title": "Välkommen till Mastodon",
"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": {
"title": "What are servers?",
"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."
"title": "Vad är servrar?",
"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": {
"what_is_mastodon": {
"title": "What is Mastodon?"
"title": "Vad är Mastodon?"
}
}
}
},
"login": {
"title": "Welcome back",
"title": "Välkommen tillbaka",
"subtitle": "Logga in på servern där du skapade ditt konto.",
"server_search_field": {
"placeholder": "Ange URL eller sök efter din server"
}
},
"server_picker": {
"title": "Pick Server",
"title": "Välj server",
"button": {
"language": "Språk",
"signup_speed": "Sign-up Speed",
@ -331,27 +331,27 @@
"no_results": "Inga resultat"
},
"signup_speed": {
"all": "All",
"all": "Allt",
"instant": "Instant Sign-up",
"manually_reviewed": "Manual Review"
"manually_reviewed": "Manuell granskning"
},
"language": {
"all": "All"
},
"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": {
"title": "Privacy",
"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.",
"title": "Integritet",
"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": {
"ios": "Integritetspolicy - Mastodon för iOS",
"server": "Integritetspolicy - %s"
},
"button": {
"confirm": "I Agree"
"confirm": "Jag godkänner"
}
},
"register": {
@ -373,7 +373,7 @@
},
"password": {
"placeholder": "lösenord",
"confirmation_placeholder": "Confirm Password",
"confirmation_placeholder": "Bekräfta lösenord",
"require": "Ditt lösenord behöver minst:",
"character_limit": "8 tecken",
"accessibility": {
@ -398,7 +398,7 @@
"reason": {
"blocked": "%s innehåller en icke tillåten e-postleverantör",
"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",
"accepted": "%s måste godkännas",
"blank": "%s krävs",
@ -422,12 +422,12 @@
"terms_of_service": "användarvillkor",
"privacy_policy": "integritetspolicy",
"button": {
"confirm": "I Agree"
"confirm": "Jag godkänner"
}
},
"confirm_email": {
"title": "Check Your Inbox",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.",
"title": "Kolla din inkorg",
"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": {
"resend": "Skicka igen"
},
@ -443,8 +443,8 @@
"open_email_client": "Öppna e-postklient"
},
"didnt_get_link": {
"prefix": "Didnt get a link?",
"resend_in": "Resend (%@)",
"prefix": "Fick du ingen länk?",
"resend_in": "Skicka igen (%@)",
"resend_now": "Resend now."
}
},
@ -462,14 +462,14 @@
}
},
"suggestion_account": {
"title": "Hitta personer att följa",
"follow_explain": "När du följer någon, kommer du att se deras inlägg i ditt hemflöde."
"title": "Populärt på Mastodon",
"follow_all": "Följ alla"
},
"compose": {
"title": {
"new_post": "Nytt inlägg",
"new_reply": "Nytt svar",
"edit_post": "Edit Post"
"edit_post": "Redigera inlägg"
},
"media_selection": {
"camera": "Ta foto",
@ -504,10 +504,10 @@
"option_number": "Alternativ %ld",
"the_poll_is_invalid": "Undersökningen är ogiltig",
"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",
"move_up": "Move Up",
"move_down": "Move Down"
"move_up": "Flytta upp",
"move_down": "Flytta ned"
},
"content_warning": {
"placeholder": "Skriv en noggrann varning här..."
@ -541,10 +541,10 @@
"select_visibility_entry": "Välj synlighet - %s"
},
"language": {
"title": "Post Language",
"title": "Inläggsspråk",
"suggested": "Suggested",
"recent": "Recent",
"other": "Other Language…"
"recent": "Senaste",
"other": "Andra språk…"
}
},
"profile": {
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Allt",
"people": "Personer",
"hashtags": "Hashtaggar",
"posts": "Inlägg"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Gå till @%s@%s",
"url": "Öppna URL i Mastodon",
"hashtag": "Gå till #%s",
"empty_state": {
"no_results": "Inga resultat"
},
"recent_search": "Senaste sökningarna",
"clear_all": "Rensa alla",
"clear": "Rensa"
}
},
@ -845,19 +845,19 @@
},
"extension": {
"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": {
"common": {
"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": {
"configuration_display_name": "Followers",
"configuration_description": "Show number of followers.",
"title": "FOLLOWERS",
"followers_today": "%s followers today"
"configuration_display_name": "Följare",
"configuration_description": "Visa antal följare.",
"title": "FÖLJARE",
"followers_today": "%s följare idag"
},
"multiple_followers": {
"configuration_display_name": "Multiple followers",
@ -871,7 +871,7 @@
"configuration_display_name": "Latest followers",
"configuration_description": "Show latest followers.",
"title": "Latest followers",
"last_update": "Last update: %s"
"last_update": "Senaste uppdatering: %s"
},
"hashtag": {
"configuration": {
@ -881,7 +881,7 @@
"not_found": {
"account_name": "John Mastodon",
"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": {
"account_name": "John Mastodon",

View File

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

View File

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

View File

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

View File

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

View File

@ -15,10 +15,6 @@
"title": "Помилка голосування",
"poll_ended": "Опитування завершено"
},
"discard_post_content": {
"title": "Видалити чернетку",
"message": "Підтвердьте, щоб відхилити створений вміст публікації."
},
"publish_post_failure": {
"title": "Помилка публікації",
"message": "Не вдалося опублікувати допис.\nПеревірте підключення до Інтернету.",
@ -53,8 +49,8 @@
"message": "%s успішно очищено."
},
"translation_failed": {
"title": "Note",
"message": "Translation failed. Maybe the administrator has not enabled translations on this server or this server is running an older version of Mastodon where translations are not yet supported.",
"title": "Нотатка",
"message": "Не вдалося виконати переклад. Можливо, адміністратор не активував переклади на цьому сервері або цей сервер використовує стару версію Mastodon, де переклади ще не підтримуються.",
"button": "OK"
}
},
@ -82,7 +78,7 @@
"sign_in": "Увійти",
"see_more": "Дивіться більше",
"preview": "Попередній перегляд",
"copy": "Copy",
"copy": "Копіювати",
"share": "Поділитись",
"share_user": "Поділитися %s",
"share_post": "Поділитися записом",
@ -98,18 +94,22 @@
"settings": "Налаштування",
"delete": "Видалити",
"translate_post": {
"title": "Translate from %s",
"unknown_language": "Unknown"
"title": "Перекладено з %s",
"unknown_language": "Невідомо"
},
"edit_post": "Edit"
"edit_post": "Редагувати",
"bookmark": "Закладка",
"remove_bookmark": "Видалити Закладку",
"follow": "Стежити за %s",
"unfollow": "Не стежити за %s"
},
"tabs": {
"home": "Головна",
"search_and_explore": "Search and Explore",
"notifications": "Notifications",
"notifications": "Сповіщення",
"profile": "Профіль",
"a11y": {
"search": "Search",
"search": "Пошук",
"explore": "Explore"
}
},
@ -147,7 +147,7 @@
"media_content_warning": "Натисніть будь-де, щоб показати більше",
"tap_to_reveal": "Натисніть, щоб відобразити",
"load_embed": "Load Embed",
"link_via_user": "%s via %s",
"link_via_user": "%s через %s",
"poll": {
"vote": "Проголосувати",
"closed": "Зачинено"
@ -172,8 +172,8 @@
"share_link_in_post": "Share Link in Post",
"tap_then_hold_to_show_menu": "Натисніть та утримуйте, щоб показати меню",
"a11y_labels": {
"reblog": "Re-blog",
"unreblog": "Undo re-blog"
"reblog": "Репост",
"unreblog": "Скасувати репост"
}
},
"tag": {
@ -191,28 +191,28 @@
"direct": "Тільки згаданий користувач може бачити цю публікацію."
},
"translation": {
"translated_from": "Translated from %s using %s",
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"show_original": "Show Original"
"translated_from": "Перекладено з %s за допомогою %s",
"unknown_language": "Невідомо",
"unknown_provider": "Невідомо",
"show_original": "Показати оригінал"
},
"media": {
"accessibility_label": "%s, attachment %d of %d",
"expand_image_hint": "Expands the image. Double-tap and hold to show actions",
"accessibility_label": "%s, вкладення %d із %d",
"expand_image_hint": "Розгортає зображення. Двічі торкніться та утримуйте, щоб показати дії",
"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": {
"reblogs_title": "Reblogs",
"favorites_title": "Favorites",
"edit_history_title": "Edit History",
"edit_history_detail": "Last edit %s"
"reblogs_title": "Репости",
"favorites_title": "Улюблені",
"edit_history_title": "Редагувати історію",
"edit_history_detail": "Останнє редагування %s"
},
"edited_at_timestamp_prefix": "Edited %s",
"edited_at_timestamp_prefix": "Відредаговано %s",
"edit_history": {
"title": "Edit History",
"original_post": "Original Post · %s"
"title": "Редагувати історію",
"original_post": "Оригінальна публікація · %s"
}
},
"friendship": {
@ -257,47 +257,47 @@
}
},
"user_list": {
"no_verified_link": "No verified link",
"followers_count": "%@ followers"
"no_verified_link": "Нема підтвердженого посилання",
"followers_count": "%@ підписників"
}
},
"scene": {
"welcome": {
"log_in": "Увійти",
"learn_more": "Learn more",
"join_default_server": "Join mastodon.social",
"pick_server": "Pick another server",
"learn_more": "Докладніше",
"join_default_server": "Приєднатися до %@",
"pick_server": "Обрати інший сервер",
"separator": {
"or": "or"
"or": "або"
},
"education": {
"mastodon": {
"title": "Welcome to 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."
"title": "Вітаємо у Mastodon",
"description": "Mastodon - це децентралізована соціальна мережа, тобто жодна компанія не контролює її. У її склад входить велика кількість незалежних серверів пов'язаних між собою."
},
"servers": {
"title": "What are servers?",
"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."
"title": "Що таке сервери?",
"description": "Кожен обліковий запис Mastodon розміщений на сервері - кожен сервер має особисті цінності, правила, й адмінів. Немає різниці, який ви оберете, ви можете слідкувати та спілкуватися з користувачами з будь-яких серверів."
},
"a11y": {
"what_is_mastodon": {
"title": "What is Mastodon?"
"title": "Що таке Mastodon?"
}
}
}
},
"login": {
"title": "Welcome back",
"title": "З поверненням",
"subtitle": "Увійдіть на сервері, де ви створили свій обліковий запис.",
"server_search_field": {
"placeholder": "Введіть URL-адресу або адресу сервера"
}
},
"server_picker": {
"title": "Pick Server",
"title": "Оберіть сервер",
"button": {
"language": "Language",
"signup_speed": "Sign-up Speed",
"language": "Мова",
"signup_speed": "Швидкість реєстрації",
"category": {
"all": "Всі",
"all_accessiblity_description": "Категорія: Усі",
@ -331,31 +331,31 @@
"no_results": "Жодних результатів"
},
"signup_speed": {
"all": "All",
"instant": "Instant Sign-up",
"manually_reviewed": "Manual Review"
"all": "Всі",
"instant": "Миттєва реєстрація",
"manually_reviewed": "Ручна перевірка"
},
"language": {
"all": "All"
"all": "Всі"
},
"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": {
"title": "Privacy",
"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.",
"title": "Приватність",
"description": "Хоча додаток Mastodon не збирає жодних даних, сервер, на якому ви зареєструвались, може мати іншу політику. Витратьте хвилину, щоб переглянути та погодитися з політикою конфіденційності Mastodon і політикою конфіденційності Вашого сервера.",
"policy": {
"ios": "Privacy Policy - Mastodon for iOS",
"server": "Privacy Policy - %s"
"ios": "Політика конфіденційності - Mastodon для iOS",
"server": "Політика конфіденційності - %s"
},
"button": {
"confirm": "I Agree"
"confirm": "Я погоджуюся"
}
},
"register": {
"title": "Create Account",
"title": "Створить аккаунт",
"input": {
"avatar": {
"delete": "Видалити"
@ -373,7 +373,7 @@
},
"password": {
"placeholder": "пароль",
"confirmation_placeholder": "Confirm Password",
"confirmation_placeholder": "Підтвердіть Пароль",
"require": "Ваш пароль повинен містити як мінімум:",
"character_limit": "8 символів",
"accessibility": {
@ -398,7 +398,7 @@
"reason": {
"blocked": "%s містить заборонених провайдерів email",
"unreachable": "%s здається, не існує",
"taken": "%s is already taken. How about:",
"taken": "%s вже зайняте. Як щодо:",
"reserved": "%s є зарезервованим ключовим словом",
"accepted": "%s має бути прийнято",
"blank": "%s необхідно",
@ -422,30 +422,30 @@
"terms_of_service": "умови використання",
"privacy_policy": "політика конфіденційності",
"button": {
"confirm": "I Agree"
"confirm": "Я погоджуюся"
}
},
"confirm_email": {
"title": "Check Your Inbox",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.",
"title": "Перевірте вхідні",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Натисніть на посилання, яке ми надіслали вам, щоб підтвердити %@. Ми чекатимемо прямо тут.",
"button": {
"resend": "Повторно надіслати"
},
"dont_receive_email": {
"title": "Check your Email",
"title": "Перевірте свою пошту",
"description": "Перевірте правильність адреси електронної пошти, а також теку зі спамом, якщо ви ще не зробили цього.",
"resend_email": "Повторно надіслати лист"
},
"open_email_app": {
"title": "Check your Inbox.",
"title": "Перевірте вашу поштову скриньку.",
"description": "Ми щойно надіслали вам електронного листа. Перевірте вашу спам теку, якщо ви не зробили цього.",
"mail": "Пошта",
"open_email_client": "Відкрити поштового клієнта"
},
"didnt_get_link": {
"prefix": "Didnt get a link?",
"resend_in": "Resend (%@)",
"resend_now": "Resend now."
"prefix": "Не отримали посилання?",
"resend_in": "Надіслати повторно (%@)",
"resend_now": "Надіслати ще раз."
}
},
"home_timeline": {
@ -462,14 +462,14 @@
}
},
"suggestion_account": {
"title": "Знайти людей, аби підписатися",
"follow_explain": "Коли ви підпишетесь на когось, ви побачите його дописи у своїй домашній стрічці."
"title": "Популярне на Mastodon",
"follow_all": "Стежити за всіма"
},
"compose": {
"title": {
"new_post": "Новий допис",
"new_reply": "Нова відповідь",
"edit_post": "Edit Post"
"edit_post": "Редагувати допис"
},
"media_selection": {
"camera": "Зробити фото",
@ -493,7 +493,7 @@
"server_processing_state": "Обробка сервера..."
},
"poll": {
"title": "Poll",
"title": "Опитування",
"duration_time": "Тривалість: %s",
"thirty_minutes": "30 хвилин",
"one_hour": "1 Година",
@ -504,10 +504,10 @@
"option_number": "Параметр %ld",
"the_poll_is_invalid": "Неприпустимий варіант опитування",
"the_poll_has_empty_option": "В опитуванні є порожній варіант",
"add_option": "Add Option",
"remove_option": "Remove Option",
"move_up": "Move Up",
"move_down": "Move Down"
"add_option": "Додати відповідь",
"remove_option": "Видалити відповідь",
"move_up": "Вище",
"move_down": "Нижче"
},
"content_warning": {
"placeholder": "Напишіть своє попередження тут..."
@ -541,10 +541,10 @@
"select_visibility_entry": "Оберіть видимість - %s"
},
"language": {
"title": "Post Language",
"suggested": "Suggested",
"recent": "Recent",
"other": "Other Language…"
"title": "Мова допису",
"suggested": "Рекомендовані",
"recent": "Останні",
"other": "Інші мови…"
}
},
"profile": {
@ -552,16 +552,16 @@
"follows_you": "Підписаний(-на) на вас"
},
"dashboard": {
"my_posts": "posts",
"my_posts": "публікації",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers",
"my_followers": "підписники",
"other_posts": "публікації",
"other_following": "підписок",
"other_followers": "підписники",
"familiar_followers": "mutuals"
},
"fields": {
"joined": "Joined",
"joined": "Приєднався",
"add_row": "Додати рядок",
"placeholder": {
"label": "Позначка",
@ -650,16 +650,16 @@
}
},
"searching": {
"segment": {
"all": "Всі",
"people": "Громада",
"hashtags": "Гештеги",
"posts": "Дописи"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Жодних результатів"
},
"recent_search": "Нещодавні запити",
"clear_all": "Clear all",
"clear": "Очистити"
}
},
@ -674,7 +674,7 @@
"intro": "Ось найбільш популярні дописи серед вашого серверу Mastodon."
},
"favorite": {
"title": "Favorites"
"title": "Вподобане"
},
"notification": {
"title": {
@ -831,15 +831,15 @@
"title": "Закладки"
},
"followed_tags": {
"title": "Followed Tags",
"title": "Відстежувані мітки",
"header": {
"posts": "posts",
"participants": "participants",
"posts_today": "posts today"
"posts": "публікації",
"participants": "учасників",
"posts_today": "публікацій сьогодні"
},
"actions": {
"follow": "Follow",
"unfollow": "Unfollow"
"follow": "Стежити",
"unfollow": "Не стежити"
}
}
},
@ -854,28 +854,28 @@
"user_not_logged_in": "Please open Mastodon to log in to an Account."
},
"followers_count": {
"configuration_display_name": "Followers",
"configuration_description": "Show number of followers.",
"title": "FOLLOWERS",
"followers_today": "%s followers today"
"configuration_display_name": "Підписники",
"configuration_description": "Показати кількість підписників.",
"title": "ПІДПИСНИКИ",
"followers_today": "%s підписників сьогодні"
},
"multiple_followers": {
"configuration_display_name": "Multiple followers",
"configuration_description": "Show number of followers for multiple accounts.",
"mock_user": {
"display_name": "Another follower",
"display_name": "Інший підписник",
"account_name": "another@follower.social"
}
},
"latest_followers": {
"configuration_display_name": "Latest followers",
"configuration_description": "Show latest followers.",
"title": "Latest followers",
"last_update": "Last update: %s"
"configuration_display_name": "Останні підписники",
"configuration_description": "Показати останніх підписників.",
"title": "Останні підписники",
"last_update": "Останнє оновлення: %s"
},
"hashtag": {
"configuration": {
"display_name": "Hashtag",
"display_name": "Хештеґ",
"description": "Shows a recent post with the selected hashtag."
},
"not_found": {
@ -886,7 +886,7 @@
"placeholder": {
"account_name": "John Mastodon",
"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",
"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": {
"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.",
@ -72,7 +68,7 @@
"done": "Xong",
"confirm": "Xác nhận",
"continue": "Tiếp tục",
"compose": "Viết tút",
"compose": "Soạn tút",
"cancel": "Hủy bỏ",
"discard": "Bỏ qua",
"try_again": "Thử lại",
@ -101,10 +97,14 @@
"title": "Dịch từ %s",
"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": {
"home": "Bảng tin",
"home": "Trang chính",
"search_and_explore": "Tìm và Khám Phá",
"notifications": "Thông báo",
"profile": "Trang hồ sơ",
@ -116,7 +116,7 @@
"keyboard": {
"common": {
"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",
"open_settings": "Mở cài đặt"
},
@ -124,7 +124,7 @@
"previous_status": "Tút trước",
"next_status": "Tút sau",
"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",
"reply_status": "Trả lời tút",
"toggle_reblog": "Chọn đăng lại tút",
@ -150,7 +150,7 @@
"link_via_user": "%s bởi %s",
"poll": {
"vote": "Bình chọn",
"closed": "Kết thúc"
"closed": "Đóng"
},
"meta_entity": {
"url": "Link: %s",
@ -265,7 +265,7 @@
"welcome": {
"log_in": "Đăng nhập",
"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",
"separator": {
"or": "hoặc"
@ -449,7 +449,7 @@
}
},
"home_timeline": {
"title": "Bảng tin",
"title": "Trang chính",
"navigation_bar_state": {
"offline": "Ngoại tuyến",
"new_posts": "Đọc những tút mới",
@ -462,12 +462,12 @@
}
},
"suggestion_account": {
"title": "Đề xuất theo dõi",
"follow_explain": "Khi theo dõi ai đó, bạn sẽ thấy tút của họ trong bảng tin."
"title": "Thịnh hành trên Mastodon",
"follow_all": "Theo dõi tất cả"
},
"compose": {
"title": {
"new_post": "Viết tút",
"new_post": "Soạn tút",
"new_reply": "Viết trả lời",
"edit_post": "Sửa tút"
},
@ -644,22 +644,22 @@
"people_talking": "%s người đang thảo luận"
},
"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",
"follow": "Theo dõi"
}
},
"searching": {
"segment": {
"all": "Tất cả",
"people": "Mọi người",
"hashtags": "Hashtag",
"posts": "Tút"
},
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"empty_state": {
"no_results": "Không có kết quả"
},
"recent_search": "Tìm kiếm gần đây",
"clear_all": "Clear all",
"clear": "Xóa"
}
},
@ -727,7 +727,7 @@
"boosts": "Đăng lại tút của tôi",
"mentions": "Nhắc đến tôi",
"trigger": {
"anyone": "ai đó",
"anyone": "bất cứ ai",
"follower": "người theo dõi tôi",
"follow": "người tôi theo dõi",
"noone": "không một ai",

View File

@ -1,6 +1,6 @@
{
"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",
"NewPostShortcutItemTitle": "Viết tút",
"NewPostShortcutItemTitle": "Soạn tút",
"SearchShortcutItemTitle": "Tìm kiếm"
}

View File

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

View File

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

View File

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

View File

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

View File

@ -44,7 +44,6 @@
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, ); }; };
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 */; };
2A86A14629892944007F1062 /* MultiFollowersCountIntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A86A14529892944007F1062 /* MultiFollowersCountIntentHandler.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 */; };
D809907A294BC9390050219F /* PrivacyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099079294BC9390050219F /* PrivacyTableViewCell.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 */; };
D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.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 */; };
D8BE30B32A179E26006B8270 /* SuggestionAccountTableViewFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BE30B22A179E26006B8270 /* SuggestionAccountTableViewFooter.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 */; };
D8E5C349296DB8A3007E76A7 /* StatusEditHistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E5C348296DB8A3007E76A7 /* StatusEditHistoryViewController.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 */; };
DB0FCB862796BDA1006C02E2 /* SearchSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB852796BDA1006C02E2 /* SearchSection.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 */; };
DB0FCB922796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB912796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.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 */; };
DB4F0963269ED06300D62E92 /* SearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0962269ED06300D62E92 /* SearchResultViewController.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 */; };
DB4F097526A037F500D62E92 /* SearchHistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097426A037F500D62E92 /* SearchHistoryViewModel.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 */; };
DB63F752279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.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 */; };
DB63F764279A5E3C00455B82 /* NotificationTimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F763279A5E3C00455B82 /* NotificationTimelineViewController.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 */; };
DB9F58EF26EF491E00E7BBE9 /* AccountListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.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 */; };
DBA4B0F726C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; };
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>"; };
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>"; };
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>"; };
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>"; };
@ -776,6 +775,13 @@
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>"; };
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; };
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>"; };
@ -795,6 +801,8 @@
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>"; };
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>"; };
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>"; };
@ -843,7 +851,6 @@
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>"; };
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>"; };
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>"; };
@ -925,7 +932,6 @@
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>"; };
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>"; };
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>"; };
@ -985,7 +991,6 @@
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>"; };
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>"; };
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>"; };
@ -1097,7 +1102,6 @@
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>"; };
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>"; };
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>"; };
@ -1315,7 +1319,6 @@
0F20220626134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift */,
0F20222C261457EE000C64BF /* HashtagTimelineViewModel+State.swift */,
2A506CF5292D040100059C37 /* HashtagTimelineHeaderView.swift */,
2A76F75B2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift */,
);
path = HashtagTimeline;
sourceTree = "<group>";
@ -1791,6 +1794,26 @@
path = Privacy;
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 */ = {
isa = PBXGroup;
children = (
@ -2097,6 +2120,8 @@
DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */,
DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */,
DB4F0969269EDAD200D62E92 /* SearchResultViewModel+State.swift */,
2D198648261C0B8500F0B013 /* SearchResultSection.swift */,
2D198642261BF09500F0B013 /* SearchResultItem.swift */,
);
path = SearchResult;
sourceTree = "<group>";
@ -2106,10 +2131,6 @@
children = (
DB0FCB852796BDA1006C02E2 /* SearchSection.swift */,
DB0FCB872796BDA9006C02E2 /* SearchItem.swift */,
2D198648261C0B8500F0B013 /* SearchResultSection.swift */,
2D198642261BF09500F0B013 /* SearchResultItem.swift */,
DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */,
DB4F097C26A03A5B00D62E92 /* SearchHistoryItem.swift */,
);
path = Search;
sourceTree = "<group>";
@ -2132,14 +2153,6 @@
path = Status;
sourceTree = "<group>";
};
DB4F098026A0475500D62E92 /* View */ = {
isa = PBXGroup;
children = (
DB4F0967269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift */,
);
path = View;
sourceTree = "<group>";
};
DB4FFC2D269EC39C00D62E92 /* Search */ = {
isa = PBXGroup;
children = (
@ -2160,7 +2173,6 @@
DB55D32225FB4D320002F825 /* View */ = {
isa = PBXGroup;
children = (
DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */,
DB8190C52601FF0400020C08 /* AttachmentContainerView.swift */,
DB9A486B26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift */,
DBC7A671260C897100E57475 /* StatusContentWarningEditorView.swift */,
@ -2279,7 +2291,6 @@
isa = PBXGroup;
children = (
DB63F74C27993F5B00455B82 /* SearchHistoryUserCollectionViewCell.swift */,
DB63F759279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift */,
DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */,
);
path = Cell;
@ -2901,6 +2912,7 @@
DBF1D24F269DAF6100C1C08A /* SearchDetail */ = {
isa = PBXGroup;
children = (
D81A22732AB4641F00905D71 /* Search Results Overview */,
DB4F0964269ED06700D62E92 /* SearchResult */,
DBF1D252269DB01700C1C08A /* SearchHistory */,
DBF1D24D269DAF5D00C1C08A /* SearchDetailViewController.swift */,
@ -2913,11 +2925,12 @@
isa = PBXGroup;
children = (
DB63F7502799449300455B82 /* Cell */,
DB4F098026A0475500D62E92 /* View */,
DBF1D250269DB01200C1C08A /* SearchHistoryViewController.swift */,
DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */,
DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */,
DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */,
DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */,
DB4F097C26A03A5B00D62E92 /* SearchHistoryItem.swift */,
);
path = SearchHistory;
sourceTree = "<group>";
@ -2929,7 +2942,6 @@
2DE0FAC62615F5D200CDF649 /* View */,
DB9D6BE825E4F5340051B173 /* SearchViewController.swift */,
2D6DE3FF26141DF600A63F6A /* SearchViewModel.swift */,
DB0FCB8B2796BF8D006C02E2 /* SearchViewModel+Diffable.swift */,
);
path = Search;
sourceTree = "<group>";
@ -3228,6 +3240,7 @@
cs,
sl,
el,
be,
);
mainGroup = DB427DC925BAA00100D1B89D;
packageReferences = (
@ -3539,8 +3552,8 @@
DB3E6FE02806A4ED00B035AE /* DiscoveryHashtagsViewModel.swift in Sources */,
2D38F1F725CD47AC00561493 /* HomeTimelineViewModel+LoadOldestState.swift in Sources */,
DB0FCB7427956939006C02E2 /* DataSourceFacade+Status.swift in Sources */,
D81A22782AB4782400905D71 /* SearchResultOverviewSection.swift in Sources */,
DBB525502611ED6D002F1F29 /* ProfileHeaderView.swift in Sources */,
DB63F75A279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift in Sources */,
DB023D26279FFB0A005AC798 /* ShareActivityProvider.swift in Sources */,
5D0393962612D266007FE196 /* WebViewModel.swift in Sources */,
5B24BBDA262DB14800A9381B /* ReportViewModel.swift in Sources */,
@ -3588,7 +3601,6 @@
DB0FCB9C27980AB6006C02E2 /* HashtagTimelineViewController+DataSourceProvider.swift in Sources */,
DB63F76F279A7D1100455B82 /* NotificationTableViewCell.swift in Sources */,
2A1BF99529F7E68400FA1BA5 /* DataSourceFacade+UserView.swift in Sources */,
DB0FCB8C2796BF8D006C02E2 /* SearchViewModel+Diffable.swift in Sources */,
DBEFCD76282A143F00C0ABEA /* ReportStatusViewController.swift in Sources */,
DBDFF1952805561700557A48 /* DiscoveryPostsViewModel+Diffable.swift in Sources */,
DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */,
@ -3693,8 +3705,8 @@
2D84350525FF858100EECE90 /* UIScrollView.swift in Sources */,
6213AF5A28939C8400BCADB6 /* BookmarkViewModel.swift in Sources */,
5B24BBDB262DB14800A9381B /* ReportStatusViewModel+Diffable.swift in Sources */,
DB4F0968269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift in Sources */,
5DA732CC2629CEF500A92342 /* UIView+Remove.swift in Sources */,
D81A22752AB4643200905D71 /* SearchResultsOverviewTableViewController.swift in Sources */,
2A506CF4292CD85800059C37 /* FollowedTagsViewController.swift in Sources */,
DB1D843026566512000346B3 /* KeyboardPreference.swift in Sources */,
DB852D1926FAEB6B00FC9D81 /* SidebarViewController.swift in Sources */,
@ -3791,8 +3803,10 @@
DB63F77B279ACAE500455B82 /* DataSourceFacade+Favorite.swift in Sources */,
DB9D6BF825E4F5690051B173 /* NotificationViewController.swift in Sources */,
2DAC9E46262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift in Sources */,
D8D688F92AB8B970000F651A /* SearchResultOverviewCoordinator.swift in Sources */,
DB4FFC2C269EC39600D62E92 /* SearchTransitionController.swift in Sources */,
2A3D9B7E29A8F33A00F30313 /* StatusHistoryView.swift in Sources */,
D81A227B2AB47B9A00905D71 /* SearchResultDefaultSectionTableViewCell.swift in Sources */,
6213AF5E2893A8B200BCADB6 /* DataSourceFacade+Bookmark.swift in Sources */,
DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */,
DBF156E22702DA6900EC00B7 /* UIStatusBarManager+HandleTapAction.m in Sources */,
@ -3831,7 +3845,6 @@
DB45FAB625CA5485005A8AC7 /* UIAlertController.swift in Sources */,
DBE0821525CD382600FD6BBD /* MastodonRegisterViewController.swift in Sources */,
DBEFCD74282A130400C0ABEA /* ReportReasonViewModel.swift in Sources */,
DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */,
DBFEEC96279BDC67004F81DD /* ProfileAboutViewController.swift in Sources */,
DB63F74F2799405600455B82 /* SearchHistoryViewModel+Diffable.swift in Sources */,
DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */,
@ -3862,7 +3875,6 @@
DBCC3B30261440A50045B23D /* UITabBarController.swift in Sources */,
DB3E6FE42806A5B800B035AE /* DiscoverySection.swift in Sources */,
DB8190C62601FF0400020C08 /* AttachmentContainerView.swift in Sources */,
2A76F75C2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift in Sources */,
DB697DDB278F4DE3004EF2F7 /* DataSourceProvider+StatusTableViewCellDelegate.swift in Sources */,
DB87D4512609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift in Sources */,
DBB45B5627B39FC9002DC5A7 /* MediaPreviewVideoViewController.swift in Sources */,
@ -3874,6 +3886,7 @@
DBFEEC99279BDCDE004F81DD /* ProfileAboutViewModel.swift in Sources */,
2D198649261C0B8500F0B013 /* SearchResultSection.swift in Sources */,
DB4F097B26A039FF00D62E92 /* SearchHistorySection.swift in Sources */,
D8D688F62AB869CB000F651A /* SearchResultsProfileTableViewCell.swift in Sources */,
2A82294F29262EE000D2A1F7 /* AppContext+NextAccount.swift in Sources */,
DBB525302611EBF3002F1F29 /* ProfilePagingViewModel.swift in Sources */,
DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */,
@ -4046,6 +4059,7 @@
2AB501522992443C00346092 /* eu */,
2AB501542992443D00346092 /* ar */,
D87DC50C2A17C32F00219C5F /* el */,
D82463532A52B47B00A3DBDD /* be */,
);
name = WidgetExtension.intentdefinition;
sourceTree = "<group>";
@ -4081,6 +4095,7 @@
DB96C25D292505FE00F3B85D /* cs */,
DB96C260292506D600F3B85D /* sl */,
D87DC50B2A17C32E00219C5F /* el */,
D82463522A52B47B00A3DBDD /* be */,
);
name = Intents.intentdefinition;
sourceTree = "<group>";
@ -4115,6 +4130,7 @@
DB96C25E292505FF00F3B85D /* cs */,
DB96C261292506D700F3B85D /* sl */,
D87DC50D2A17C32F00219C5F /* el */,
D82463542A52B47B00A3DBDD /* be */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
@ -4165,6 +4181,7 @@
DB96C25F292505FF00F3B85D /* cs */,
DB96C262292506D700F3B85D /* sl */,
D87DC50E2A17C32F00219C5F /* el */,
D82463552A52B47B00A3DBDD /* be */,
);
name = Intents.stringsdict;
sourceTree = "<group>";
@ -4567,7 +4584,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2023.10;
MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -4599,7 +4616,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2023.10;
MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -4786,7 +4803,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2023.10;
MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -5077,7 +5094,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 2023.10;
MARKETING_VERSION = 2023.13;
PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";

View File

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

View File

@ -149,6 +149,7 @@ extension SceneCoordinator {
// search
case searchDetail(viewModel: SearchDetailViewModel)
case searchResult(viewModel: SearchResultViewModel)
// compose
case compose(viewModel: ComposeViewModel)
@ -371,159 +372,169 @@ private extension SceneCoordinator {
let viewController: UIViewController?
switch scene {
case .welcome:
let _viewController = WelcomeViewController()
viewController = _viewController
case .mastodonPickServer(let viewModel):
let _viewController = MastodonPickServerViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonRegister(let viewModel):
let _viewController = MastodonRegisterViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonServerRules(let viewModel):
let _viewController = MastodonServerRulesViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonConfirmEmail(let viewModel):
let _viewController = MastodonConfirmEmailViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonLogin:
let loginViewController = MastodonLoginViewController(appContext: appContext,
authenticationViewModel: AuthenticationViewModel(context: appContext, coordinator: self, isAuthenticationExist: false),
sceneCoordinator: self)
loginViewController.delegate = self
case .welcome:
let _viewController = WelcomeViewController()
viewController = _viewController
case .mastodonPickServer(let viewModel):
let _viewController = MastodonPickServerViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonRegister(let viewModel):
let _viewController = MastodonRegisterViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonServerRules(let viewModel):
let _viewController = MastodonServerRulesViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonConfirmEmail(let viewModel):
let _viewController = MastodonConfirmEmailViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonLogin:
let loginViewController = MastodonLoginViewController(appContext: appContext,
authenticationViewModel: AuthenticationViewModel(context: appContext, coordinator: self, isAuthenticationExist: false),
sceneCoordinator: self)
loginViewController.delegate = self
viewController = loginViewController
case .mastodonPrivacyPolicies(let viewModel):
let privacyViewController = PrivacyTableViewController(context: appContext, coordinator: self, viewModel: viewModel)
viewController = privacyViewController
case .mastodonResendEmail(let viewModel):
let _viewController = MastodonResendEmailViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonWebView(let viewModel):
let _viewController = WebViewController()
_viewController.viewModel = viewModel
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
viewController = loginViewController
case .mastodonPrivacyPolicies(let viewModel):
let privacyViewController = PrivacyTableViewController(context: appContext, coordinator: self, viewModel: viewModel)
viewController = privacyViewController
case .mastodonResendEmail(let viewModel):
let _viewController = MastodonResendEmailViewController()
_viewController.viewModel = viewModel
viewController = _viewController
case .mastodonWebView(let viewModel):
let _viewController = WebViewController()
_viewController.viewModel = viewModel
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
case .searchDetail(let viewModel):
let _viewController = SearchDetailViewController(appContext: appContext, sceneCoordinator: self, authContext: viewModel.authContext)
_viewController.viewModel = viewModel
viewController = _viewController
case .searchResult(let viewModel):
let searchResultViewController = SearchResultViewController()
searchResultViewController.context = appContext
searchResultViewController.coordinator = self
searchResultViewController.viewModel = viewModel
viewController = searchResultViewController
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 {
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)

View File

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

View File

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

View File

@ -33,7 +33,7 @@ extension DataSourceFacade {
@MainActor
static func coordinateToProfileScene(
provider: DataSourceProvider & AuthContextProvider,
provider: ViewControllerWithDependencies & AuthContextProvider,
user: ManagedObjectRecord<MastodonUser>
) async {
guard let user = user.object(in: provider.context.managedObjectContext) else {
@ -127,227 +127,6 @@ extension DataSourceFacade {
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(
dependency: NeedsDependency,
user: ManagedObjectRecord<MastodonUser>

View File

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

View File

@ -384,6 +384,16 @@ extension DataSourceFacade {
composeContext: .editStatus(status: status, statusSource: statusSource),
destination: .topLevel)
_ = 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
}

View File

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

View File

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

View File

@ -15,7 +15,6 @@ import MastodonLocalization
extension UITableViewDelegate where Self: DataSourceProvider & AuthContextProvider {
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 {
let source = DataSourceItem.Source(tableViewCell: nil, indexPath: indexPath)
guard let item = await item(from: source) else {
@ -77,7 +76,6 @@ extension UITableViewDelegate where Self: DataSourceProvider & MediaPreviewableV
contextMenuConfigurationForRowAt
indexPath: IndexPath, point: CGPoint
) -> 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 }
@ -238,7 +236,6 @@ extension UITableViewDelegate where Self: DataSourceProvider & MediaPreviewableV
willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration,
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 indexPath = configuration.indexPath, let index = configuration.index else { return }

View File

@ -44,7 +44,6 @@ extension DataSourceItem {
}
}
protocol DataSourceProvider: NeedsDependency & UIViewController {
var logger: Logger { get }
protocol DataSourceProvider: ViewControllerWithDependencies {
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";
"NSPhotoLibraryAddUsageDescription" = "Used to save photo into the Photo Library";
"NewPostShortcutItemTitle" = "New Post";
"SearchShortcutItemTitle" = "Search";
"NSCameraUsageDescription" = "Χρησιμοποιείται για λήψη φωτογραφίας για την κατάσταση της ανάρτησης";
"NSPhotoLibraryAddUsageDescription" = "Χρησιμοποιείται για αποθήκευση φωτογραφιών στις Φωτογραφίες";
"NewPostShortcutItemTitle" = "Νέα Ανάρτηση";
"SearchShortcutItemTitle" = "Αναζήτηση";

View File

@ -1,4 +1,4 @@
"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";
"NewPostShortcutItemTitle" = "Viết tút";
"NewPostShortcutItemTitle" = "Soạn tút";
"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()
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
}
extension DiscoveryCommunityViewController {

View File

@ -5,15 +5,13 @@
// Created by MainasuK on 2022-4-29.
//
import os.log
import Foundation
import GameplayKit
import MastodonSDK
import enum NIOHTTP1.HTTPResponseStatus
extension DiscoveryCommunityViewModel {
class State: GKState {
let logger = Logger(subsystem: "DiscoveryCommunityViewModel.State", category: "StateMachine")
let id = UUID()
@ -25,20 +23,12 @@ extension DiscoveryCommunityViewModel {
override func didEnter(from previousState: GKState?) {
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
func enter(state: State.Type) {
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)
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) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: retry loading", ((#file as NSString).lastPathComponent), #line, #function)
stateMachine.enter(Loading.self)
}
}
@ -174,8 +162,12 @@ extension DiscoveryCommunityViewModel.State {
viewModel.didLoadLatest.send()
} catch {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch user timeline fail: \(error.localizedDescription)")
await enter(state: Fail.self)
if let error = error as? Mastodon.API.Error,
[HTTPResponseStatus.unauthorized, .notFound].contains(error.httpResponseStatus) {
await enter(state: NoMore.self)
} else {
await enter(state: Fail.self)
}
}
} // end Task
} // end func

View File

@ -16,8 +16,6 @@ import MastodonCore
final class DiscoveryCommunityViewModel {
let logger = Logger(subsystem: "DiscoveryCommunityViewModel", category: "ViewModel")
var disposeBag = Set<AnyCancellable>()
// input
@ -54,9 +52,4 @@ final class DiscoveryCommunityViewModel {
)
// 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.
//
import os.log
import UIKit
import Combine
import MastodonUI
import MastodonCore
final class DiscoveryForYouViewController: UIViewController, NeedsDependency, MediaPreviewableViewController {
let logger = Logger(subsystem: "DiscoveryForYouViewController", category: "ViewController")
weak var context: AppContext! { willSet { precondition(!isViewLoaded) } }
weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } }
@ -33,11 +30,6 @@ final class DiscoveryForYouViewController: UIViewController, NeedsDependency, Me
}()
let refreshControl = RefreshControl()
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
}
extension DiscoveryForYouViewController {
@ -111,7 +103,6 @@ extension DiscoveryForYouViewController: AuthContextProvider {
extension DiscoveryForYouViewController: UITableViewDelegate {
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 let user = record.object(in: context.managedObjectContext) else { return }
let profileViewModel = CachedProfileViewModel(

View File

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

View File

@ -16,8 +16,6 @@ import MastodonSDK
final class DiscoveryHashtagsViewModel {
let logger = Logger(subsystem: "DiscoveryHashtagsViewModel", category: "ViewModel")
var disposeBag = Set<AnyCancellable>()
// input
@ -36,8 +34,12 @@ final class DiscoveryHashtagsViewModel {
viewDidAppeared
.throttle(for: 3, scheduler: DispatchQueue.main, latest: true)
.asyncMap { authenticationBox in
try await context.apiService.trendHashtags(domain: authContext.mastodonAuthenticationBox.domain, query: nil)
.asyncMap { _ in
let authenticationBox = authContext.mastodonAuthenticationBox
return try await context.apiService.trendHashtags(domain: authenticationBox.domain,
query: nil,
authenticationBox: authenticationBox
)
}
.retry(3)
.map { response in Result<Mastodon.Response.Content<[Mastodon.Entity.Tag]>, Error> { response } }
@ -46,28 +48,27 @@ final class DiscoveryHashtagsViewModel {
.sink { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let response):
self.hashtags = response.value.filter { !$0.name.isEmpty }
case .failure:
break
case .success(let response):
self.hashtags = response.value.filter { !$0.name.isEmpty }
case .failure:
break
}
}
.store(in: &disposeBag)
}
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
}
extension DiscoveryHashtagsViewModel {
@MainActor
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 }
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) {
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?) {
super.didEnter(from: previousState)
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) {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: retry loading", ((#file as NSString).lastPathComponent), #line, #function)
stateMachine.enter(Loading.self)
}
}
@ -144,7 +139,8 @@ extension DiscoveryNewsViewModel.State {
query: Mastodon.API.Trends.StatusQuery(
offset: offset,
limit: nil
)
),
authenticationBox: viewModel.authContext.mastodonAuthenticationBox
)
let newOffset: Int? = {
guard let offset = response.link?.offset else { return nil }
@ -174,10 +170,13 @@ extension DiscoveryNewsViewModel.State {
viewModel.links = links
viewModel.didLoadLatest.send()
} 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, error.httpResponseStatus.code == 404 {
viewModel.isServerSupportEndpoint = false
await enter(state: NoMore.self)
if let error = error as? Mastodon.API.Error {
if error.httpResponseStatus == .notFound {
viewModel.isServerSupportEndpoint = false
await enter(state: NoMore.self)
} else if error.httpResponseStatus == .unauthorized {
await enter(state: NoMore.self)
}
} else {
await enter(state: Fail.self)
}

View File

@ -51,11 +51,6 @@ final class DiscoveryNewsViewModel {
await checkServerEndpoint()
} // 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 {
_ = try await context.apiService.trendLinks(
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 {
isServerSupportEndpoint = false

View File

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

View File

@ -145,7 +145,8 @@ extension DiscoveryPostsViewModel.State {
query: Mastodon.API.Trends.StatusQuery(
offset: offset,
limit: nil
)
),
authenticationBox: viewModel.authContext.mastodonAuthenticationBox
)
let newOffset: Int? = {
guard let offset = response.link?.offset else { return nil }
@ -176,10 +177,13 @@ extension DiscoveryPostsViewModel.State {
viewModel.didLoadLatest.send()
} 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, error.httpResponseStatus.code == 404 {
viewModel.isServerSupportEndpoint = false
await enter(state: NoMore.self)
if let error = error as? Mastodon.API.Error {
if error.httpResponseStatus == .notFound {
viewModel.isServerSupportEndpoint = false
await enter(state: NoMore.self)
} else if error.httpResponseStatus == .unauthorized {
await enter(state: NoMore.self)
}
} else {
await enter(state: Fail.self)
}

View File

@ -5,7 +5,6 @@
// Created by MainasuK on 2022-4-12.
//
import os.log
import UIKit
import Combine
import GameplayKit
@ -56,11 +55,6 @@ final class DiscoveryPostsViewModel {
await checkServerEndpoint()
} // end Task
}
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
}
extension DiscoveryPostsViewModel {
@ -68,7 +62,8 @@ extension DiscoveryPostsViewModel {
do {
_ = try await context.apiService.trendStatuses(
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 {
isServerSupportEndpoint = false

View File

@ -69,10 +69,13 @@ final class HashtagTimelineHeaderView: UIView {
var onButtonTapped: (() -> Void)?
let followButton: UIButton = {
let button = HashtagTimelineHeaderViewActionButton()
button.cornerRadius = 10
button.contentEdgeInsets = UIEdgeInsets(top: 6, left: 16, bottom: 5, right: 16) // set 28pt height
button.titleLabel?.font = .systemFont(ofSize: 14, weight: .bold)
let button = UIButton(configuration: .tinted())
button.configuration?.background.cornerRadius = 10
button.configuration?.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer({ incoming in
var outgoing = incoming
outgoing.font = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .boldSystemFont(ofSize: 15))
return outgoing
})
return button
}()
@ -153,14 +156,18 @@ private extension HashtagTimelineHeaderView {
extension HashtagTimelineHeaderView {
func update(_ entity: HashtagTimelineHeaderView.Data) {
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
followButton.setTitleColor(
entity.following == true ? Asset.Colors.Button.tagFollow.color : Asset.Colors.Button.tagUnfollow.color,
for: .normal
)
if entity.following {
followButton.configuration?.background.backgroundColor = Asset.Colors.Button.userFollowing.color
followButton.configuration?.baseForegroundColor = Asset.Colors.Button.userFollowingTitle.color
followButton.configuration?.title = L10n.Scene.FollowedTags.Actions.unfollow
} 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)
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
guard let self = self 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
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()
var newSnapshot: NSDiffableDataSourceSnapshot<StatusSection, StatusItem> = {
let newItems = records.map { record in
@ -92,11 +87,8 @@ extension HomeTimelineViewModel {
let hasChanges = newSnapshot.itemIdentifiers != oldSnapshot.itemIdentifiers
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()
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(
@ -106,7 +98,6 @@ extension HomeTimelineViewModel {
) else {
self.updateSnapshotUsingReloadData(snapshot: newSnapshot)
self.didLoadLatest.send()
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): applied new snapshot")
return
}
@ -116,7 +107,6 @@ extension HomeTimelineViewModel {
contentOffset.y = tableView.contentOffset.y - difference.sourceDistanceToTableViewTopEdge
tableView.setContentOffset(contentOffset, animated: false)
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
} // end Task
}

View File

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

View File

@ -70,6 +70,8 @@ extension MediaPreviewImageView {
addSubview(imageView)
doubleTapGestureRecognizer.addTarget(self, action: #selector(MediaPreviewImageView.doubleTapGestureRecognizerHandler(_:)))
doubleTapGestureRecognizer.delegate = self
imageView.addGestureRecognizer(doubleTapGestureRecognizer)
if #available(iOS 16.0, *) {
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 {
func setup(image: UIImage, container: UIView, forceUpdate: Bool = false) {

View File

@ -15,7 +15,6 @@ import VisionKit
protocol MediaPreviewImageViewControllerDelegate: AnyObject {
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, tapGestureRecognizerDidTrigger tapGestureRecognizer: UITapGestureRecognizer)
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, longPressGestureRecognizerDidTrigger longPressGestureRecognizer: UILongPressGestureRecognizer)
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, contextMenuActionPerform action: MediaPreviewImageViewController.ContextMenuAction)
}
@ -31,7 +30,6 @@ final class MediaPreviewImageViewController: UIViewController {
let previewImageView = MediaPreviewImageView()
let tapGestureRecognizer = UITapGestureRecognizer.singleTapGestureRecognizer
let longPressGestureRecognizer = UILongPressGestureRecognizer()
deinit {
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.delegate = self
longPressGestureRecognizer.addTarget(self, action: #selector(MediaPreviewImageViewController.longPressGestureRecognizerHandler(_:)))
longPressGestureRecognizer.delegate = self
tapGestureRecognizer.require(toFail: previewImageView.doubleTapGestureRecognizer)
tapGestureRecognizer.require(toFail: longPressGestureRecognizer)
previewImageView.addGestureRecognizer(tapGestureRecognizer)
previewImageView.addGestureRecognizer(longPressGestureRecognizer)
let previewImageViewContextMenuInteraction = UIContextMenuInteraction(delegate: self)
previewImageView.addInteraction(previewImageViewContextMenuInteraction)
@ -95,11 +89,6 @@ extension MediaPreviewImageViewController {
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 {

View File

@ -113,12 +113,11 @@ extension MediaPreviewViewController {
guard let self = self else { return }
switch self.viewModel.item {
case .attachment(let previewContext):
let needsHideCloseButton: Bool = {
self.topToolbar.isHidden = {
guard index < previewContext.attachments.count else { return false }
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:
break
}
@ -274,10 +273,6 @@ extension MediaPreviewViewController: MediaPreviewImageViewControllerDelegate {
}
}
func mediaPreviewImageViewController(_ viewController: MediaPreviewImageViewController, longPressGestureRecognizerDidTrigger longPressGestureRecognizer: UILongPressGestureRecognizer) {
// do nothing
}
func mediaPreviewImageViewController(
_ viewController: MediaPreviewImageViewController,
contextMenuActionPerform action: MediaPreviewImageViewController.ContextMenuAction

View File

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

View File

@ -47,10 +47,6 @@ final class WelcomeViewController: UIViewController, NeedsDependency {
private(set) lazy var joinDefaultServerButton: UIButton = {
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.background.backgroundColor = Asset.Colors.Brand.blurple.color
buttonConfiguration.background.cornerRadius = 14
@ -217,6 +213,23 @@ extension WelcomeViewController {
.store(in: &disposeBag)
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?) {
@ -262,12 +275,12 @@ extension WelcomeViewController {
//MARK: - Actions
@objc
private func joinDefaultServer(_ sender: UIButton) {
guard let server = viewModel.randomDefaultServer else { return }
sender.configuration?.title = nil
sender.isEnabled = false
sender.configuration?.showsActivityIndicator = true
let server = Mastodon.Entity.Server.mastodonDotSocial
authenticationViewModel.isAuthenticating.send(true)
context.apiService.instance(domain: server.domain)
@ -320,19 +333,26 @@ extension WelcomeViewController {
self.authenticationViewModel.isAuthenticating.send(false)
switch completion {
case .failure(let error):
//TODO: show an alert or something
break
case .finished:
break
case .failure(_):
guard let randomServer = self.viewModel.pickRandomDefaultServer() else { return }
self.viewModel.randomDefaultServer = randomServer
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
guard let self = self else { return }
if let rules = response.instance.value.rules, !rules.isEmpty {

View File

@ -8,11 +8,14 @@
import Foundation
import Combine
import MastodonCore
import MastodonSDK
final class WelcomeViewModel {
var disposeBag = Set<AnyCancellable>()
private(set) var defaultServers: [Mastodon.Entity.DefaultServer]?
var randomDefaultServer: Mastodon.Entity.Server?
// input
let context: AppContext
@ -26,5 +29,40 @@ final class WelcomeViewModel {
.map { !$0.isEmpty }
.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(
actions: menuActions,
actions: [menuActions],
delegate: self
)
return menu

View File

@ -21,9 +21,6 @@ final class HeightFixedSearchBar: UISearchBar {
}
final class SearchViewController: UIViewController, NeedsDependency {
let logger = Logger(subsystem: "SearchViewController", category: "ViewController")
weak var context: AppContext! { willSet { precondition(!isViewLoaded) } }
weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } }
@ -37,16 +34,6 @@ final class SearchViewController: UIViewController, NeedsDependency {
let titleViewContainer = UIView()
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
let searchBarTapPublisher = PassthroughSubject<String, Never>()
@ -62,11 +49,6 @@ final class SearchViewController: UIViewController, NeedsDependency {
)
return viewController
}()
deinit {
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
}
}
extension SearchViewController {
@ -85,30 +67,12 @@ extension SearchViewController {
title = L10n.Scene.Search.title
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 }
addChild(discoveryViewController)
discoveryViewController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(discoveryViewController.view)
discoveryViewController.view.pinToParent()
// discoveryViewController.view.isHidden = true
}
override func viewDidAppear(_ animated: Bool) {
@ -171,7 +135,6 @@ extension SearchViewController {
// MARK: - UISearchBarDelegate
extension SearchViewController: UISearchBarDelegate {
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
searchBarTapPublisher.send("")
return false
}
@ -184,12 +147,8 @@ extension SearchViewController: UISearchBarDelegate {
// MARK: - UISearchControllerDelegate
extension SearchViewController: UISearchControllerDelegate {
func willDismissSearchController(_ searchController: UISearchController) {
logger.debug("\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
searchController.isActive = true
}
func didPresentSearchController(_ searchController: UISearchController) {
logger.debug("\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
}
}
// MARK: - ScrollViewContainer
@ -201,23 +160,3 @@ extension SearchViewController: ScrollViewContainer {
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