Merge branch 'develop' into ios-192-profile-about

# Conflicts:
#	Mastodon/Protocol/Provider/DataSourceProvider+NotificationTableViewCellDelegate.swift
#	Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewController+DataSourceProvider.swift
#	MastodonSDK/Sources/MastodonCore/DataController/FeedDataController.swift
#	MastodonSDK/Sources/MastodonUI/View/Content/StatusView+Configuration.swift
This commit is contained in:
Nathan Mattes 2024-01-31 15:36:53 +01:00
commit b2dbcc8095
138 changed files with 2292 additions and 1391 deletions

View File

@ -12,15 +12,15 @@
"RHxKOw" = "Send Post with text content";
"RxSqsb" = "Post";
"RxSqsb" = "Գրառում";
"WCIR3D" = "Post ${content} on Mastodon";
"ZKJSNu" = "Post";
"ZKJSNu" = "Գրառում";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Visibility";
"ZbSjzC" = "Տեսանելիութիւն";
"Zo4jgJ" = "Post Visibility";
@ -34,7 +34,7 @@
"dUyuGg" = "Post on Mastodon";
"dYQ5NN" = "Public";
"dYQ5NN" = "Հրապարակային";
"ehFLjY" = "Followers Only";

View File

@ -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

@ -1,14 +1,14 @@
"16wxgf" = "Post on Mastodon";
"16wxgf" = "Mastodon에 게시하기";
"751xkl" = "Text Content";
"CsR7G2" = "Post on Mastodon";
"CsR7G2" = "Mastodon에 게시하기";
"HZSGTr" = "What content to post?";
"HdGikU" = "Posting failed";
"HdGikU" = "게시 실패";
"KDNTJ4" = "Failure Reason";
"KDNTJ4" = "실패 원인";
"RHxKOw" = "Send Post with text content";
@ -16,7 +16,7 @@
"WCIR3D" = "Post ${content} on Mastodon";
"ZKJSNu" = "Post";
"ZKJSNu" = "게시";
"ZS1XaK" = "${content}";

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Block domain %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pendient",
"block": "Blocar",
"block_user": "Blocar a %s",
"block_domain": "Blocar a %s",
"block_domain": "Block domain %s",
"unblock": "Desbloquiar",
"unblock_user": "Desbloquiar a %s",
"blocked": "Blocau",
"domain_blocked": "Domain Blocked",
"mute": "Silenciar",
"mute_user": "Silenciar a %s",
"unmute": "Desmutear",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Amagar los reblogs",
"message": "Comfirmar pa amagar los reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "قيد المُراجعة",
"block": "حظر",
"block_user": "حَظرُ %s",
"block_domain": "حظر %s",
"block_domain": "Block domain %s",
"unblock": "رفع الحَظر",
"unblock_user": "رفع الحَظر عن %s",
"blocked": "محظور",
"domain_blocked": "Domain Blocked",
"mute": "كَتم",
"mute_user": "كَتمُ %s",
"unmute": "رفع الكتم",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "إخفاء إعادات التدوين",
"message": "التأكيد لِإخفاء إعادات التدوين"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Чакаецца",
"block": "Заблакіраваць",
"block_user": "Заблакіраваць %s",
"block_domain": "Заблакіраваць %s",
"block_domain": "Заблакіраваць дамен %s",
"unblock": "Разблакіраваць",
"unblock_user": "Разблакіраваць %s",
"blocked": "Заблакіраваны",
"domain_blocked": "Дамен заблакіраваны",
"mute": "Ігнараваць",
"mute_user": "Ігнараваць %s",
"unmute": "Не ігнараваць",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Схаваць пашырэнні",
"message": "Пацвердзіце, каб схаваць пашырэнні"
},
"confirm_block_domain": {
"title": "Заблакіраваць дамен",
"message": "Заблакіраваць дамен %s?"
},
"confirm_unblock_domain": {
"title": "Разблакіраваць дамен",
"message": "Разблакіраваць дамен %s?"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pendent",
"block": "Bloca",
"block_user": "Bloca %s",
"block_domain": "Bloca %s",
"block_domain": "Block domain %s",
"unblock": "Desbloca",
"unblock_user": "Desbloca %s",
"blocked": "Blocat",
"domain_blocked": "Domain Blocked",
"mute": "Silencia",
"mute_user": "Silencia %s",
"unmute": "Deixa de silenciar",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Amaga Impulsos",
"message": "Confirma per a amagar els impulsos"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "داوات کردووە",
"block": "ئاستەنگی بکە",
"block_user": "%s ئاستەنگ بکە",
"block_domain": "%s ئاستەنگ بکە",
"block_domain": "Block domain %s",
"unblock": "ئاستەنگی مەکە",
"unblock_user": "%s ئاستەنگ مەکە",
"blocked": "ئاستەنگ کراوە",
"domain_blocked": "Domain Blocked",
"mute": "بێدەنگی بکە",
"mute_user": "%s بێدەنگە",
"unmute": "بێدەنگی مەکە",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Čekající",
"block": "Blokovat",
"block_user": "Blokovat %s",
"block_domain": "Blokovat %s",
"block_domain": "Block domain %s",
"unblock": "Odblokovat",
"unblock_user": "Odblokovat %s",
"blocked": "Blokovaný",
"domain_blocked": "Domain Blocked",
"mute": "Skrýt",
"mute_user": "Skrýt %s",
"unmute": "Odkrýt",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Skrýt Reblogy",
"message": "Potvrďte skrytí reblogů"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Yn aros",
"block": "Blocio",
"block_user": "Blocio %s",
"block_domain": "Blocio %s",
"block_domain": "Block domain %s",
"unblock": "Dadflocio",
"unblock_user": "Dadflocio %s",
"blocked": "Wedi blocio",
"domain_blocked": "Domain Blocked",
"mute": "Anwybyddu",
"mute_user": "Anwybyddu %s",
"unmute": "Dad-anwybyddu",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Cuddio Ailflogiau",
"message": "Cadarnhau i guddio ailflogiau"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Block domain %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "In Warteschlange",
"block": "Blockieren",
"block_user": "%s blockieren",
"block_domain": "%s blockieren",
"block_domain": "Domain %s sperren",
"unblock": "Blockierung aufheben",
"unblock_user": "Blockierung von %s aufheben",
"blocked": "Blockiert",
"domain_blocked": "Domain gesperrt",
"mute": "Stummschalten",
"mute_user": "%s stummschalten",
"unmute": "Nicht mehr stummschalten",
@ -504,8 +505,8 @@
"option_number": "Auswahlmöglichkeit %ld",
"the_poll_is_invalid": "Die Umfrage ist ungültig",
"the_poll_has_empty_option": "Die Umfrage hat eine leere Option",
"add_option": "Add Option",
"remove_option": "Remove Option",
"add_option": "Option hinzufügen",
"remove_option": "Option entfernen",
"move_up": "Nach oben",
"move_down": "Nach unten"
},
@ -542,7 +543,7 @@
},
"language": {
"title": "Beitragssprache",
"suggested": "Suggested",
"suggested": "Empfohlen",
"recent": "Kürzlich",
"other": "Andere Sprache…"
}
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Teilen ausblenden",
"message": "Bestätigen, um Teilen auszublenden"
},
"confirm_block_domain": {
"title": "Domain sperren",
"message": "Bestätigen, um die Domain %s zu sperren"
},
"confirm_unblock_domain": {
"title": "Domain entsperren",
"message": "Bestätigen, um die Sperre der Domäne %s aufzuheben"
}
},
"accessibility": {
@ -656,8 +665,8 @@
"url": "URL in Mastodon öffnen",
"hashtag": "Wechseln zu #%s",
"no_user": {
"title": "No User Account Found",
"message": "There's no Useraccount \"%s\" on %s"
"title": "Kein Benutzerkonto gefunden",
"message": "Es gibt kein Benutzerkonto „%s” auf %s"
},
"empty_state": {
"no_results": "Keine Ergebnisse"
@ -711,17 +720,17 @@
"settings": {
"overview": {
"title": "Einstellungen",
"general": "General",
"notifications": "Notifications",
"general": "Allgemein",
"notifications": "Benachrichtigungen",
"support_mastodon": "Mastodon unterstützen",
"about_mastodon": "About Mastodon",
"server_details": "Server Details",
"logout": "Logout %@"
"about_mastodon": "Über Mastodon",
"server_details": "Serverdetails",
"logout": "%@ abmelden"
},
"about_mastodon": {
"title": "Über",
"more_settings": "Noch mehr Einstellungen",
"contribute_to_mastodon": "Contribute to Mastodon",
"contribute_to_mastodon": "Zu Mastodon beitragen",
"privacy_policy": "Datenschutzerklärung",
"clear_media_storage": "Clear Media Storage"
},
@ -735,12 +744,12 @@
}
},
"general": {
"title": "General",
"title": "Allgemein",
"appearance": {
"section_title": "Appearance",
"dark": "Dark",
"light": "Light",
"system": "Use Device Appearance"
"section_title": "Farbschema",
"dark": "Dunkel",
"light": "Hell",
"system": "Einstellungen des Geräts übernehmen"
},
"design": {
"section_title": "Design",
@ -748,18 +757,18 @@
},
"links": {
"section_title": "Links",
"open_in_mastodon": "Open in Mastodon",
"open_in_browser": "Open in Browser"
"open_in_mastodon": "In Mastodon öffnen",
"open_in_browser": "Im Browser öffnen"
}
},
"notifications": {
"title": "Notifications",
"title": "Mitteilungen",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
"title": "Mitteilungen erhalten von",
"anyone": "Jeder",
"followers": "People who follow you",
"follow": "People you follow",
"noone": "No one"
"noone": "Niemand"
},
"alert": {
"mentions_and_replies": "Mentions & Replies",

View File

@ -222,10 +222,11 @@
"pending": "Εκκρεμεί",
"block": "Αποκλεισμός",
"block_user": "Αποκλεισμός %s",
"block_domain": "Αποκλεισμός %s",
"block_domain": "Αποκλεισμός τομέα %s",
"unblock": "Άρση αποκλεισμού",
"unblock_user": "Άρση αποκλεισμού %s",
"blocked": "Αποκλείστηκε",
"domain_blocked": "Ο Τομέας αποκλείστηκε",
"mute": "Σίγαση",
"mute_user": "Σίγαση %s",
"unmute": "Κατάργηση σίγασης",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Απόκρυψη Αναδημοσιεύσεων",
"message": "Επιβεβαίωση απόκρυψης αναδημοσιεύσεων"
},
"confirm_block_domain": {
"title": "Αποκλεισμός τομέα",
"message": "Επιβεβαίωση αποκλεισμού τομέα %s"
},
"confirm_unblock_domain": {
"title": "Άρση αποκλεισμού τομέα",
"message": "Επιβεβαίωση άρσης αποκλεισμού τομέα %s"
}
},
"accessibility": {
@ -656,8 +665,8 @@
"url": "Άνοιγμα URL στο Mastodon",
"hashtag": "Μετάβαση στο #%s",
"no_user": {
"title": "No User Account Found",
"message": "There's no Useraccount \"%s\" on %s"
"title": "Δεν Βρέθηκε Λογαριασμός Χρήστη",
"message": "Δεν υπάρχει λογαριασμός χρήστη \"%s\" στο %s"
},
"empty_state": {
"no_results": "Κανένα αποτέλεσμα"
@ -710,66 +719,66 @@
},
"settings": {
"overview": {
"title": "Settings",
"general": "General",
"notifications": "Notifications",
"support_mastodon": "Support Mastodon",
"about_mastodon": "About Mastodon",
"server_details": "Server Details",
"logout": "Logout %@"
"title": "Ρυθμίσεις",
"general": "Γενικά",
"notifications": "Ειδοποιήσεις",
"support_mastodon": "Υποστήριξε το Mastodon",
"about_mastodon": "Σχετικά με το Mastodon",
"server_details": "Λεπτομέρειες Διακομιστή",
"logout": "Αποσύνδεση %@"
},
"about_mastodon": {
"title": "About",
"more_settings": "Even More Settings",
"contribute_to_mastodon": "Contribute to Mastodon",
"privacy_policy": "Privacy Policy",
"clear_media_storage": "Clear Media Storage"
"title": "Σχετικά",
"more_settings": "Ακόμα Περισσότερες Ρυθμίσεις",
"contribute_to_mastodon": "Συνείσφερε στο Mastodon",
"privacy_policy": "Πολιτική Απορρήτου",
"clear_media_storage": "Εκκαθάριση Χώρου Αποθήκευσης Πολυμέσων"
},
"server_details": {
"about": "About",
"rules": "Rules",
"about": "Σχετικά",
"rules": "Κανόνες",
"about_instance": {
"title": "Administrator",
"message_admin": "Message Admin",
"legal_notice": "A legal notice"
"title": "Διαχειριστής",
"message_admin": "Στείλε μήνυμα σε διαχειριστή",
"legal_notice": "Μια νομική ειδοποίηση"
}
},
"general": {
"title": "General",
"title": "Γενικά",
"appearance": {
"section_title": "Appearance",
"dark": "Dark",
"light": "Light",
"system": "Use Device Appearance"
"section_title": "Εμφάνιση",
"dark": "Σκοτεινό",
"light": "Φωτεινό",
"system": "Χρήση Εμφάνισης Συσκευής"
},
"design": {
"section_title": "Design",
"show_animations": "Play Animated Avatars and Emoji"
"section_title": "Σχεδίαση",
"show_animations": "Αναπαραγωγή κινούμενων Avatars και Emoji"
},
"links": {
"section_title": "Links",
"open_in_mastodon": "Open in Mastodon",
"open_in_browser": "Open in Browser"
"section_title": "Σύνδεσμοι",
"open_in_mastodon": "Άνοιγμα στο Mastodon",
"open_in_browser": "Άνοιγμα στον Περιηγητή"
}
},
"notifications": {
"title": "Notifications",
"title": "Ειδοποιήσεις",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
"followers": "People who follow you",
"follow": "People you follow",
"noone": "No one"
"title": "Λήψη Ειδοποιήσεων από",
"anyone": "Οποιοσδήποτε",
"followers": "Άτομα που σε ακολουθούν",
"follow": "Άτομα που ακολουθείς",
"noone": "Κανένας"
},
"alert": {
"mentions_and_replies": "Mentions & Replies",
"boosts": "Boosts",
"favorites": "Favorites",
"new_followers": "New Followers"
"mentions_and_replies": "Αναφορές & Απαντήσεις",
"boosts": "Ενισχύσεις",
"favorites": "Αγαπημένα",
"new_followers": "Νέοι Ακόλουθοι"
},
"disabled": {
"notification_hint": "Turn on notifications from your device settings to see updates on your lock screen.",
"go_to_settings": "Go to Notification Settings"
"notification_hint": "Ενεργοποίησε τις ειδοποιήσεις από τις ρυθμίσεις της συσκευής σου για να βλέπεις ενημερώσεις στην οθόνη κλειδώματος.",
"go_to_settings": "Μετάβαση στις Ρυθμίσεις Ειδοποιήσεων"
}
}
},

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Block domain %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Domain blokkolása: %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain blokkolva",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Domain blokkolása",
"message": "Megerősíti a domain blokkolását? %s"
},
"confirm_unblock_domain": {
"title": "Domain blokkolás feloldása",
"message": "Megerősíti a domain blokk feloldását? %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pendientes",
"block": "Bloquear",
"block_user": "Bloquear a %s",
"block_domain": "Bloquear %s",
"block_domain": "Bloquear dominio %s",
"unblock": "Desbloquear",
"unblock_user": "Desbloquear a %s",
"blocked": "Bloqueado",
"domain_blocked": "Dominio bloqueado",
"mute": "Silenciar",
"mute_user": "Silenciar a %s",
"unmute": "Dejar de silenciar",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Ocultar adhesiones",
"message": "Confirmá para ocultar adhesiones"
},
"confirm_block_domain": {
"title": "Bloquear dominio",
"message": "Confirmar para bloquear el dominio %s"
},
"confirm_unblock_domain": {
"title": "Desbloquear dominio",
"message": "Confirmar para desbloquear el dominio %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pendiente",
"block": "Bloquear",
"block_user": "Bloquear a %s",
"block_domain": "Bloquear a %s",
"block_domain": "Block domain %s",
"unblock": "Desbloquear",
"unblock_user": "Desbloquear a %s",
"blocked": "Bloqueado",
"domain_blocked": "Domain Blocked",
"mute": "Silenciar",
"mute_user": "Silenciar a %s",
"unmute": "Desmutear",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Ocultar reblogs",
"message": "Confirmar para ocultar reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Zain",
"block": "Blokeatu",
"block_user": "Blokeatu %s",
"block_domain": "Blokeatu %s",
"block_domain": "Block domain %s",
"unblock": "Desblokeatu",
"unblock_user": "Desblokeatu %s",
"blocked": "Blokeatuta",
"domain_blocked": "Domain Blocked",
"mute": "Mututu",
"mute_user": "Mututu %s",
"unmute": "Desmututu",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Ezkutatu bultzadak",
"message": "Berretsi birbidalketak ezkutatzea"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pyydetty",
"block": "Estä",
"block_user": "Estä %s",
"block_domain": "Estä %s",
"block_domain": "Block domain %s",
"unblock": "Poista esto",
"unblock_user": "Poista käyttäjän %s esto",
"blocked": "Estetty",
"domain_blocked": "Domain Blocked",
"mute": "Mykistä",
"mute_user": "Mykistä %s",
"unmute": "Poista mykistys",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Piilota edelleenjulkaisut",
"message": "Vahvista edelleenjulkaisujen piilotus"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "En attente",
"block": "Bloquer",
"block_user": "Bloquer %s",
"block_domain": "Bloquer %s",
"block_domain": "Block domain %s",
"unblock": "Débloquer",
"unblock_user": "Débloquer %s",
"blocked": "Bloqué",
"domain_blocked": "Domain Blocked",
"mute": "Masquer",
"mute_user": "Ignorer %s",
"unmute": "Ne plus ignorer",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Masquer les Reblogs",
"message": "Confirmer pour masquer les reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Ri dhèiligeadh",
"block": "Bac",
"block_user": "Bac %s",
"block_domain": "Bac %s",
"block_domain": "Block domain %s",
"unblock": "Dì-bhac",
"unblock_user": "Dì-bhac %s",
"blocked": "Ga bhacadh",
"domain_blocked": "Domain Blocked",
"mute": "Mùch",
"mute_user": "Mùch %s",
"unmute": "Dì-mhùch",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Falaich na brosnachaidhean",
"message": "Dearbh falach nam brosnachaidhean"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -2,7 +2,7 @@
"common": {
"alerts": {
"common": {
"please_try_again": "Inténtao de novo.",
"please_try_again": "Téntao de novo.",
"please_try_again_later": "Inténtao de novo máis tarde."
},
"sign_up_failure": {
@ -222,10 +222,11 @@
"pending": "Pendente",
"block": "Bloquear",
"block_user": "Bloquear a %s",
"block_domain": "Bloquear a %s",
"block_domain": "Bloquear dominio %s",
"unblock": "Desbloquear",
"unblock_user": "Desbloquear a %s",
"blocked": "Bloqueada",
"domain_blocked": "Dominio bloqueado",
"mute": "Acalar",
"mute_user": "Acalar a %s",
"unmute": "Non Acalar",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Agochar Promocións",
"message": "Confirma para agochar promocións"
},
"confirm_block_domain": {
"title": "Bloquear dominio",
"message": "Confirmar o bloqueo do dominio %s"
},
"confirm_unblock_domain": {
"title": "Desbloquear dominio",
"message": "Confirmar o desbloqueo de %s"
}
},
"accessibility": {
@ -656,8 +665,8 @@
"url": "Abrir URL en Mastodon",
"hashtag": "Ir a #%s",
"no_user": {
"title": "No User Account Found",
"message": "There's no Useraccount \"%s\" on %s"
"title": "Non se atopou ningunha conta",
"message": "Non hai contas con \"%s\" en %s"
},
"empty_state": {
"no_results": "Sen resultados"
@ -710,66 +719,66 @@
},
"settings": {
"overview": {
"title": "Settings",
"general": "General",
"notifications": "Notifications",
"support_mastodon": "Support Mastodon",
"about_mastodon": "About Mastodon",
"server_details": "Server Details",
"logout": "Logout %@"
"title": "Axustes",
"general": "Xeral",
"notifications": "Notificacións",
"support_mastodon": "Apoia a Mastodon",
"about_mastodon": "Acerca de Mastodon",
"server_details": "Detalles do servidor",
"logout": "Pechar sesión %@"
},
"about_mastodon": {
"title": "About",
"more_settings": "Even More Settings",
"contribute_to_mastodon": "Contribute to Mastodon",
"privacy_policy": "Privacy Policy",
"clear_media_storage": "Clear Media Storage"
"title": "Acerca de",
"more_settings": "Máis axustes",
"contribute_to_mastodon": "Colaborar con Mastodon",
"privacy_policy": "Política de Privacidade",
"clear_media_storage": "Limpar Almacenaxe Multimedia"
},
"server_details": {
"about": "About",
"rules": "Rules",
"about": "Acerca de",
"rules": "Regras",
"about_instance": {
"title": "Administrator",
"message_admin": "Message Admin",
"legal_notice": "A legal notice"
"title": "Administración",
"message_admin": "Mensaxe a Admin",
"legal_notice": "Aviso Legal"
}
},
"general": {
"title": "General",
"title": "Xeral",
"appearance": {
"section_title": "Appearance",
"dark": "Dark",
"light": "Light",
"system": "Use Device Appearance"
"section_title": "Aparencia",
"dark": "Escuro",
"light": "Claro",
"system": "Seguir ao dispositivo"
},
"design": {
"section_title": "Design",
"show_animations": "Play Animated Avatars and Emoji"
"section_title": "Deseño",
"show_animations": "Reproducir avatares e emoji animados"
},
"links": {
"section_title": "Links",
"open_in_mastodon": "Open in Mastodon",
"open_in_browser": "Open in Browser"
"section_title": "Ligazóns",
"open_in_mastodon": "Abrir en Mastodon",
"open_in_browser": "Abrir no navegador"
}
},
"notifications": {
"title": "Notifications",
"title": "Notificacións",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
"followers": "People who follow you",
"follow": "People you follow",
"noone": "No one"
"title": "Recibir notificacións de",
"anyone": "Calquera",
"followers": "Persoas que te seguen",
"follow": "Persoas que segues",
"noone": "Ninguén"
},
"alert": {
"mentions_and_replies": "Mentions & Replies",
"boosts": "Boosts",
"favorites": "Favorites",
"new_followers": "New Followers"
"mentions_and_replies": "Mencións e respostas",
"boosts": "Promocións",
"favorites": "Favoritos",
"new_followers": "Novas seguidoras"
},
"disabled": {
"notification_hint": "Turn on notifications from your device settings to see updates on your lock screen.",
"go_to_settings": "Go to Notification Settings"
"notification_hint": "Activar notificacións nos axustes do dispositivo para ver novidades na pantalla de bloqueo.",
"go_to_settings": "Ir aos axustes das notificacións"
}
}
},

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Block domain %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Block domain %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -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>
@ -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>

View File

@ -97,20 +97,20 @@
"title": "Translate from %s",
"unknown_language": "Unknown"
},
"edit_post": "Edit",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
"edit_post": "Խմբագրել",
"bookmark": "Էջանիշ",
"remove_bookmark": "Հեռացնել էջանիշը",
"follow": "Հետեւել %s-ին",
"unfollow": "Չհետեւել %s-ին"
},
"tabs": {
"home": "Home",
"home": "Հիմնական",
"search_and_explore": "Search and Explore",
"notifications": "Notifications",
"profile": "Profile",
"notifications": "Ծանուցումներ",
"profile": "Հաշիւ",
"a11y": {
"search": "Search",
"explore": "Explore"
"search": "Որոնել",
"explore": "Բացայայտել"
}
},
"keyboard": {
@ -118,12 +118,12 @@
"switch_to_tab": "Switch to %s",
"compose_new_post": "Compose New Post",
"show_favorites": "Show Favorites",
"open_settings": "Open Settings"
"open_settings": "Բացել կարգաւորումները"
},
"timeline": {
"previous_status": "Previous Post",
"next_status": "Next Post",
"open_status": "Open Post",
"next_status": "Յաջորդ գրառումը",
"open_status": "Բացել գրառումը",
"open_author_profile": "Open Author's Profile",
"open_reblogger_profile": "Open Reblogger's Profile",
"reply_status": "Reply to Post",
@ -140,17 +140,17 @@
"status": {
"user_reblogged": "%s reblogged",
"user_replied_to": "Replied to %s",
"show_post": "Show Post",
"show_user_profile": "Show user profile",
"show_post": "Ցուցադրել գրառումը",
"show_user_profile": "Ցուցադրել օգտատիրոջ էջը",
"content_warning": "Content Warning",
"sensitive_content": "Sensitive Content",
"sensitive_content": "Զգայուն բովանդակություն",
"media_content_warning": "Tap anywhere to reveal",
"tap_to_reveal": "Tap to reveal",
"load_embed": "Load Embed",
"link_via_user": "%s via %s",
"poll": {
"vote": "Քուէարկել",
"closed": "Closed"
"closed": "Փակ"
},
"meta_entity": {
"url": "Link: %s",
@ -160,14 +160,14 @@
},
"actions": {
"reply": "Պատասխանել",
"reblog": "Reblog",
"unreblog": "Undo reblog",
"favorite": "Favorite",
"unfavorite": "Unfavorite",
"reblog": "Տարածել",
"unreblog": "Չտարածել",
"favorite": "Հավանել",
"unfavorite": "Չհաւանել",
"menu": "Ցանկ",
"hide": "Թաքցնել",
"show_image": "Show image",
"show_gif": "Show GIF",
"show_image": "Ցոյց տալ նկարը",
"show_gif": "Ցոյց տալ գիֆը",
"show_video_player": "Show video player",
"share_link_in_post": "Share Link in Post",
"tap_then_hold_to_show_menu": "Tap then hold to show menu",
@ -192,9 +192,9 @@
},
"translation": {
"translated_from": "Translated from %s using %s",
"unknown_language": "Unknown",
"unknown_provider": "Unknown",
"show_original": "Show Original"
"unknown_language": "Անյայտ",
"unknown_provider": "Անյայտ",
"show_original": "Ցոյց տալ բնօրինակը"
},
"media": {
"accessibility_label": "%s, attachment %d of %d",
@ -204,8 +204,8 @@
},
"posted_via_application": "%s via %s",
"buttons": {
"reblogs_title": "Reblogs",
"favorites_title": "Favorites",
"reblogs_title": "Տարածել",
"favorites_title": "Հաւանածներ",
"edit_history_title": "Խմբագրման պատմութիւնը",
"edit_history_detail": "Last edit %s"
},
@ -217,21 +217,22 @@
},
"friendship": {
"follow": "Հետեւել",
"following": "Following",
"request": "Request",
"pending": "Pending",
"block": "Block",
"following": "Հետեւած",
"request": "Հարցում",
"pending": "Սպասուող",
"block": "Արգելափակել",
"block_user": "Block %s",
"block_domain": "Block %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"block_domain": "Block domain %s",
"unblock": "Արգելաբացել",
"unblock_user": "Արգելաբացել %s-ին",
"blocked": "Արգելափակուած",
"domain_blocked": "Domain Blocked",
"mute": "Լռեցնել",
"mute_user": "Լռեցնել %s֊ին",
"unmute": "Unmute",
"unmute_user": "Unmute %s",
"muted": "Լռեցուած",
"edit_info": "Edit Info",
"edit_info": "Խմբագրել",
"show_reblogs": "Show Reblogs",
"hide_reblogs": "Hide Reblogs"
},
@ -257,7 +258,7 @@
}
},
"user_list": {
"no_verified_link": "No verified link",
"no_verified_link": "Չկայ հաստատուած յղում",
"followers_count": "%@ followers"
}
},
@ -296,25 +297,25 @@
"server_picker": {
"title": "Pick Server",
"button": {
"language": "Language",
"language": "Լեզու",
"signup_speed": "Sign-up Speed",
"category": {
"all": "All",
"all": "Բոլորը",
"all_accessiblity_description": "Category: All",
"academia": "academia",
"activism": "activism",
"food": "food",
"food": "ուտելիք",
"furry": "furry",
"games": "games",
"general": "general",
"journalism": "journalism",
"lgbt": "lgbt",
"regional": "regional",
"art": "art",
"music": "music",
"tech": "tech"
"games": "խաղեր",
"general": "ընդհանուր",
"journalism": "լրագրութիւն",
"lgbt": "լգբտ",
"regional": "կրօնական",
"art": "արուեստ",
"music": "երաժշտութիւն",
"tech": "տեխնոլոգիա"
},
"see_less": "See Less",
"see_less": "Տեսնել քիչ",
"see_more": "Տեսնել աւելին"
},
"label": {
@ -344,11 +345,11 @@
"no_server_selected_hint": "Well pick a server based on your language if you continue without making a selection."
},
"privacy": {
"title": "Privacy",
"title": "Գաղտնիութիւն",
"description": "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your servers privacy policy.",
"policy": {
"ios": "Privacy Policy - Mastodon for iOS",
"server": "Privacy Policy - %s"
"server": "Գաղտնիութեան քաղաքականութիւն - %s"
},
"button": {
"confirm": "Համաձայն եմ"
@ -358,7 +359,7 @@
"title": "Ստեղծել հաշիւ",
"input": {
"avatar": {
"delete": "Delete"
"delete": "Ջնջել"
},
"username": {
"placeholder": "մուտքանուն",
@ -375,7 +376,7 @@
"placeholder": "գաղտնաբառ",
"confirmation_placeholder": "Հաստատել գաղտնաբառը",
"require": "Your password needs at least:",
"character_limit": "8 characters",
"character_limit": "8 նիշ",
"accessibility": {
"checked": "checked",
"unchecked": "unchecked"
@ -392,7 +393,7 @@
"email": "Էլ. փոստ",
"password": "Գաղտնաբառ",
"agreement": "Agreement",
"locale": "Locale",
"locale": "Տեղանք",
"reason": "Պատճառ"
},
"reason": {
@ -420,24 +421,24 @@
"subtitle": "These are set and enforced by the %s moderators.",
"prompt": "By continuing, youre subject to the terms of service and privacy policy for %s.",
"terms_of_service": "terms of service",
"privacy_policy": "privacy policy",
"privacy_policy": "գաղտնիութեան քաղաքականութիւն",
"button": {
"confirm": "I Agree"
"confirm": "Համաձայն եմ"
}
},
"confirm_email": {
"title": "Check Your Inbox",
"title": "Ստուգիր էլ. փոստդ",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.",
"button": {
"resend": "Resend"
"resend": "Ուղարկել նորից"
},
"dont_receive_email": {
"title": "Check your Email",
"title": "Ստուգիր էլ. հասցէդ!",
"description": "Check if your email address is correct as well as your junk folder if you havent.",
"resend_email": "Նորից ուղարկել էլ. նամակ"
},
"open_email_app": {
"title": "Check your Inbox.",
"title": "Ստուգիր էլ. փոստդ.",
"description": "We just sent you an email. Check your junk folder if you havent.",
"mail": "Փոստ",
"open_email_client": "Open Email Client"
@ -452,36 +453,36 @@
"title": "Հիմնական",
"navigation_bar_state": {
"offline": "Անցանց",
"new_posts": "See new posts",
"published": "Published!",
"new_posts": "Տեսնել նորերը",
"published": "Հրատարակուած է",
"Publishing": "Publishing post...",
"accessibility": {
"logo_label": "Mastodon",
"logo_label": "Մաստոդոն",
"logo_hint": "Tap to scroll to top and tap again to previous location"
}
}
},
"suggestion_account": {
"title": "Popular on Mastodon",
"follow_all": "Follow all"
"follow_all": "Հետեւել բոլորին"
},
"compose": {
"title": {
"new_post": "New Post",
"new_reply": "New Reply",
"edit_post": "Edit Post"
"new_post": "Նոր գրառում",
"new_reply": "Նոր պատասխան",
"edit_post": "Խմբագրել գրառումը"
},
"media_selection": {
"camera": "Take Photo",
"photo_library": "Photo Library",
"browse": "Browse"
"camera": "Լուսանկարել",
"photo_library": "Ֆոտոդարան",
"browse": "Դիտել"
},
"content_input_placeholder": "Type or paste whats on your mind",
"compose_action": "Հրապարակել",
"replying_to_user": "replying to %s",
"attachment": {
"photo": "photo",
"video": "video",
"photo": "նկար",
"video": "տեսանիւթ",
"attachment_broken": "This %s is broken and cant be\nuploaded to Mastodon.",
"description_photo": "Describe the photo for the visually-impaired...",
"description_video": "Describe the video for the visually-impaired...",
@ -493,38 +494,38 @@
"server_processing_state": "Server Processing..."
},
"poll": {
"title": "Poll",
"duration_time": "Duration: %s",
"thirty_minutes": "30 minutes",
"one_hour": "1 Hour",
"six_hours": "6 Hours",
"one_day": "1 Day",
"three_days": "3 Days",
"seven_days": "7 Days",
"option_number": "Option %ld",
"title": "Հարցում",
"duration_time": "Տեւողությունը՝ %s",
"thirty_minutes": "30 րոպէ",
"one_hour": "1 ժամ",
"six_hours": "6 ժամ",
"one_day": "1 օր",
"three_days": "3 օր",
"seven_days": "7 օր",
"option_number": "Տարբերակ %ld",
"the_poll_is_invalid": "The poll is invalid",
"the_poll_has_empty_option": "The poll has empty option",
"add_option": "Add Option",
"remove_option": "Remove Option",
"move_up": "Move Up",
"move_down": "Move Down"
"move_up": "Բարձրացնել",
"move_down": "Իջեցնել"
},
"content_warning": {
"placeholder": "Write an accurate warning here..."
},
"visibility": {
"public": "Public",
"unlisted": "Unlisted",
"private": "Followers only",
"direct": "Only people I mention"
"public": "Հրապարակային",
"unlisted": "Ծածուկ",
"private": "Միայն հետեւողներին",
"direct": "Միայն նշած մարդկանց"
},
"auto_complete": {
"space_to_add": "Space to add"
},
"accessibility": {
"append_attachment": "Add Attachment",
"append_poll": "Add Poll",
"remove_poll": "Remove Poll",
"append_poll": "Աւելացնել հարցում",
"remove_poll": "Հեռացնել հարցումը",
"custom_emoji_picker": "Custom Emoji Picker",
"enable_content_warning": "Enable Content Warning",
"disable_content_warning": "Disable Content Warning",
@ -541,31 +542,31 @@
"select_visibility_entry": "Select Visibility - %s"
},
"language": {
"title": "Post Language",
"title": "Հրապարակման լեզու",
"suggested": "Suggested",
"recent": "Recent",
"recent": "Վերջին",
"other": "Other Language…"
}
},
"profile": {
"header": {
"follows_you": "Follows You"
"follows_you": "Հետեւում է քեզ"
},
"dashboard": {
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers",
"my_posts": "գրառումներ",
"my_following": "հետեւած",
"my_followers": "հետեւորդ",
"other_posts": "գրառումներ",
"other_following": "հետեւած",
"other_followers": "հետեւորդ",
"familiar_followers": "mutuals"
},
"fields": {
"joined": "Joined",
"joined": "Միացել է",
"add_row": "Add Row",
"placeholder": {
"label": "Label",
"content": "Content"
"label": "Պիտակ",
"content": "Բովանդակութիւն"
},
"verified": {
"short": "Verified on %s",
@ -574,9 +575,9 @@
},
"segmented_control": {
"posts": "Գրառումներ",
"replies": "Replies",
"replies": "Արձագանքներ",
"posts_and_replies": "Posts and Replies",
"media": "Media",
"media": "Մեդիա",
"about": "Մասին"
},
"relationship_action_alert": {
@ -589,7 +590,7 @@
"message": "Confirm to unmute %s"
},
"confirm_block_user": {
"title": "Block Account",
"title": "Արգելափակել հաշիւը",
"message": "Confirm to block %s"
},
"confirm_unblock_user": {
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {
@ -613,11 +622,11 @@
}
},
"follower": {
"title": "follower",
"title": "հետեւորդ",
"footer": "Followers from other servers are not displayed."
},
"following": {
"title": "following",
"title": "հետեւած",
"footer": "Follows from other servers are not displayed."
},
"familiarFollowers": {
@ -631,13 +640,13 @@
"title": "Reblogged By"
},
"search": {
"title": "Search",
"title": "Որոնել",
"search_bar": {
"placeholder": "Search hashtags and users",
"cancel": "Cancel"
"cancel": "Չեղարկել"
},
"recommend": {
"button_text": "See All",
"button_text": "Տեսնել բոլորը",
"hash_tag": {
"title": "Trending on Mastodon",
"description": "Hashtags that are getting quite a bit of attention",
@ -646,7 +655,7 @@
"accounts": {
"title": "Accounts you might like",
"description": "You may like to follow these accounts",
"follow": "Follow"
"follow": "Հետեւել"
}
},
"searching": {
@ -663,27 +672,27 @@
"no_results": "No results"
},
"recent_search": "Recent searches",
"clear_all": "Clear all",
"clear": "Clear"
"clear_all": "Մաքրել բոլորը",
"clear": "Մաքրել"
}
},
"discovery": {
"tabs": {
"posts": "Posts",
"hashtags": "Hashtags",
"news": "News",
"community": "Community",
"for_you": "For You"
"posts": "Գրառումներ",
"hashtags": "Պիտակներ",
"news": "Նորութիւններ",
"community": "Համայնք",
"for_you": "Քեզ համար"
},
"intro": "These are the posts gaining traction in your corner of Mastodon."
},
"favorite": {
"title": "Favorites"
"title": "Հաւանածներ"
},
"notification": {
"title": {
"Everything": "Everything",
"Mentions": "Mentions"
"Everything": "Ամեն ինչ",
"Mentions": "Յիշատակումներ"
},
"notification_description": {
"followed_you": "followed you",
@ -698,74 +707,74 @@
"show_mentions": "Show Mentions"
},
"follow_request": {
"accept": "Accept",
"accepted": "Accepted",
"reject": "reject",
"rejected": "Rejected"
"accept": "Ընդունել",
"accepted": "Ընդունուած",
"reject": "մերժել",
"rejected": "Մերժուած"
}
},
"thread": {
"back_title": "Post",
"title": "Post from %s"
"back_title": "Գրառում",
"title": "%s-ի գրառումը"
},
"settings": {
"overview": {
"title": "Settings",
"general": "General",
"notifications": "Notifications",
"title": "Կարգաւորումներ",
"general": "Ընդհանուր",
"notifications": "Ծանուցումներ",
"support_mastodon": "Support Mastodon",
"about_mastodon": "About Mastodon",
"about_mastodon": "Մաստոդոնի մասին",
"server_details": "Server Details",
"logout": "Logout %@"
},
"about_mastodon": {
"title": "About",
"title": "Մասին",
"more_settings": "Even More Settings",
"contribute_to_mastodon": "Contribute to Mastodon",
"privacy_policy": "Privacy Policy",
"clear_media_storage": "Clear Media Storage"
},
"server_details": {
"about": "About",
"rules": "Rules",
"about": "Մասին",
"rules": "Կանոններ",
"about_instance": {
"title": "Administrator",
"title": "Ադմինիստրատոր",
"message_admin": "Message Admin",
"legal_notice": "A legal notice"
}
},
"general": {
"title": "General",
"title": "Ընդհանուր",
"appearance": {
"section_title": "Appearance",
"dark": "Dark",
"light": "Light",
"section_title": "Տեսք",
"dark": "Մուգ",
"light": "Բաց",
"system": "Use Device Appearance"
},
"design": {
"section_title": "Design",
"section_title": "Ոճ",
"show_animations": "Play Animated Avatars and Emoji"
},
"links": {
"section_title": "Links",
"section_title": "Յղումներ",
"open_in_mastodon": "Open in Mastodon",
"open_in_browser": "Open in Browser"
}
},
"notifications": {
"title": "Notifications",
"title": "Ծանուցումներ",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
"followers": "People who follow you",
"follow": "People you follow",
"noone": "No one"
"anyone": "Բոլորը",
"followers": "Մարդիկ, որոնք ձեզ հետեւում են",
"follow": "Մարդիկ, որոնց դու հետեւում ես",
"noone": "Ոչ ոք"
},
"alert": {
"mentions_and_replies": "Mentions & Replies",
"boosts": "Boosts",
"favorites": "Favorites",
"new_followers": "New Followers"
"boosts": "Տարածումներ",
"favorites": "Հաւանածներ",
"new_followers": "Նոր հետեւողներ"
},
"disabled": {
"notification_hint": "Turn on notifications from your device settings to see updates on your lock screen.",
@ -818,7 +827,7 @@
"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",
"unfollow": "Ապահետեւել",
"unfollowed": "Unfollowed",
"unfollow_user": "Unfollow %s",
"mute_user": "Mute %s",
@ -838,21 +847,21 @@
"account_list": {
"tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
"dismiss_account_switcher": "Dismiss Account Switcher",
"add_account": "Add Account"
"add_account": "Աւելացնել հաշիւ"
},
"bookmark": {
"title": "Bookmarks"
"title": "Էջանիշեր"
},
"followed_tags": {
"title": "Followed Tags",
"header": {
"posts": "posts",
"posts": "գրառումներ",
"participants": "participants",
"posts_today": "posts today"
},
"actions": {
"follow": "Follow",
"unfollow": "Unfollow"
"follow": "Հետեւել",
"unfollow": "Ապահետեւել"
}
}
},
@ -867,7 +876,7 @@
"user_not_logged_in": "Please open Mastodon to log in to an Account."
},
"followers_count": {
"configuration_display_name": "Followers",
"configuration_display_name": "Հետեւորդ",
"configuration_description": "Show number of followers.",
"title": "FOLLOWERS",
"followers_today": "%s followers today"
@ -888,7 +897,7 @@
},
"hashtag": {
"configuration": {
"display_name": "Hashtag",
"display_name": "Պիտակ",
"description": "Shows a recent post with the selected hashtag."
},
"not_found": {

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"
"NewPostShortcutItemTitle": "Նոր գրառում",
"SearchShortcutItemTitle": "Որոնել"
}

View File

@ -222,10 +222,11 @@
"pending": "Tertunda",
"block": "Blokir",
"block_user": "Blokir %s",
"block_domain": "Blokir %s",
"block_domain": "Block domain %s",
"unblock": "Berhenti memblokir",
"unblock_user": "Berhenti memblokir %s",
"blocked": "Diblokir",
"domain_blocked": "Domain Blocked",
"mute": "Bisukan",
"mute_user": "Bisukan %s",
"unmute": "Berhenti membisukan",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Í bið",
"block": "Útilokun",
"block_user": "Útiloka %s",
"block_domain": "Útiloka %s",
"block_domain": "Útiloka lénið %s",
"unblock": "Aflétta útilokun",
"unblock_user": "Opna á %s",
"blocked": "Útilokað",
"domain_blocked": "Lén útilokað",
"mute": "Þagga niður",
"mute_user": "Þagga niður í %s",
"unmute": "Afþagga",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Fela endurbirtingar",
"message": "Staðfestu til að fela endurbirtingar"
},
"confirm_block_domain": {
"title": "Útiloka lén",
"message": "Staðfestu útilokun lénsins %s"
},
"confirm_unblock_domain": {
"title": "Aflétta útilokun léns",
"message": "Staðfestu afléttingu á útilokun lénsins %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "In attesa",
"block": "Blocca",
"block_user": "Blocca %s",
"block_domain": "Blocca %s",
"block_domain": "Blocca il dominio %s",
"unblock": "Sblocca",
"unblock_user": "Sblocca %s",
"blocked": "Bloccato",
"domain_blocked": "Dominio bloccato",
"mute": "Silenzia",
"mute_user": "Silenzia %s",
"unmute": "Riattiva",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Nascondi le condivisioni",
"message": "Conferma di nascondere le condivisioni"
},
"confirm_block_domain": {
"title": "Blocca il dominio",
"message": "Conferma per bloccare il dominio %s"
},
"confirm_unblock_domain": {
"title": "Sblocca il dominio",
"message": "Conferma per sbloccare il dominio %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "保留",
"block": "ブロック",
"block_user": "%sをブロック",
"block_domain": "%sをブロック",
"block_domain": "%s全体をブロック",
"unblock": "ブロックを解除",
"unblock_user": "%sのブロックを解除",
"blocked": "ブロック済み",
"domain_blocked": "ドメインブロック中",
"mute": "ミュート",
"mute_user": "%sをミュート",
"unmute": "ミュートを解除",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "ブーストを非表示",
"message": "ブーストを非表示にしますか?"
},
"confirm_block_domain": {
"title": "ドメインのブロック",
"message": "%sのドメイン全体をブロックしてよいですか"
},
"confirm_unblock_domain": {
"title": "ドメインのブロックを解除",
"message": "%sのブロックを解除してよいですか"
}
},
"accessibility": {
@ -656,8 +665,8 @@
"url": "URL を Mastodon で開く",
"hashtag": "#%s へ移動",
"no_user": {
"title": "No User Account Found",
"message": "There's no Useraccount \"%s\" on %s"
"title": "ユーザーアカウントが見つかりませんでした",
"message": "\"%s\"というユーザーは%sには見つかりませんでした"
},
"empty_state": {
"no_results": "なし"
@ -710,66 +719,66 @@
},
"settings": {
"overview": {
"title": "Settings",
"general": "General",
"notifications": "Notifications",
"support_mastodon": "Support Mastodon",
"about_mastodon": "About Mastodon",
"server_details": "Server Details",
"logout": "Logout %@"
"title": "設定",
"general": "一般",
"notifications": "通知",
"support_mastodon": "Mastodonを支援する",
"about_mastodon": "Mastodonについて",
"server_details": "サーバーの詳細",
"logout": "%@ をログアウト"
},
"about_mastodon": {
"title": "About",
"more_settings": "Even More Settings",
"contribute_to_mastodon": "Contribute to Mastodon",
"privacy_policy": "Privacy Policy",
"clear_media_storage": "Clear Media Storage"
"title": "Mastodonについて",
"more_settings": "さらに詳しい設定",
"contribute_to_mastodon": "Mastodonに貢献する",
"privacy_policy": "プライバシーポリシー",
"clear_media_storage": "メディアキャッシュの削除"
},
"server_details": {
"about": "About",
"rules": "Rules",
"about": "このサーバーについて",
"rules": "ルール",
"about_instance": {
"title": "Administrator",
"message_admin": "Message Admin",
"legal_notice": "A legal notice"
"title": "管理者",
"message_admin": "管理者にメッセージを送信",
"legal_notice": "法的通知"
}
},
"general": {
"title": "General",
"title": "一般",
"appearance": {
"section_title": "Appearance",
"dark": "Dark",
"light": "Light",
"system": "Use Device Appearance"
"section_title": "テーマ",
"dark": "ダーク",
"light": "ライト",
"system": "端末の設定に合わせる"
},
"design": {
"section_title": "Design",
"show_animations": "Play Animated Avatars and Emoji"
"section_title": "アニメーション",
"show_animations": "アニメーションアイコンと絵文字を再生"
},
"links": {
"section_title": "Links",
"open_in_mastodon": "Open in Mastodon",
"open_in_browser": "Open in Browser"
"section_title": "Webブラウザ",
"open_in_mastodon": "アプリ内ブラウザアプリで開く",
"open_in_browser": "ブラウザアプリで開く"
}
},
"notifications": {
"title": "Notifications",
"title": "通知",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
"followers": "People who follow you",
"follow": "People you follow",
"noone": "No one"
"title": "通知を送信する人",
"anyone": "誰でも",
"followers": "あなたのフォロワーのみ",
"follow": "あなたがフォローしている人のみ",
"noone": "誰にも許可しない"
},
"alert": {
"mentions_and_replies": "Mentions & Replies",
"boosts": "Boosts",
"favorites": "Favorites",
"new_followers": "New Followers"
"mentions_and_replies": "メンションと返信",
"boosts": "ブースト",
"favorites": "お気に入り",
"new_followers": "新しいフォロワー"
},
"disabled": {
"notification_hint": "Turn on notifications from your device settings to see updates on your lock screen.",
"go_to_settings": "Go to Notification Settings"
"notification_hint": "プッシュ通知を受け取るには、端末の設定から通知を許可しましょう。",
"go_to_settings": "端末の通知設定を開く"
}
}
},

View File

@ -222,10 +222,11 @@
"pending": "Yegguni",
"block": "Sewḥel",
"block_user": "Sewḥel %s",
"block_domain": "Sewḥel %s",
"block_domain": "Block domain %s",
"unblock": "Serreḥ",
"unblock_user": "Serreḥ i %s",
"blocked": "Yettusewḥel",
"domain_blocked": "Domain Blocked",
"mute": "Sgugem",
"mute_user": "Sgugem %s",
"unmute": "Kkes asgugem",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Tê nirxandin",
"block": "Asteng bike",
"block_user": "%s asteng bike",
"block_domain": "%s asteng bike",
"block_domain": "Block domain %s",
"unblock": "Astengiyê rake",
"unblock_user": "%s asteng neke",
"blocked": "Astengkirî",
"domain_blocked": "Domain Blocked",
"mute": "Bêdeng bike",
"mute_user": "%s bêdeng bike",
"unmute": "Bêdeng neke",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Bilindkirinan veşêre",
"message": "Bo veşartina bilindkirinan bipejirîne"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -19,7 +19,7 @@
<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>
@ -33,7 +33,7 @@
<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>
@ -61,7 +61,7 @@
<key>plural.count.followed_by_and_mutual</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@names@%#@count_mutual@</string>
<string>%#@names@%#@count_mutual@ 명이 팔로우합니다.</string>
<key>names</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
@ -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

@ -33,24 +33,24 @@
"confirm": "로그아웃"
},
"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": "정말로 %s 전체를 차단하시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 콘텐츠를 보지 못합니다. 해당 도메인에 속한 팔로워와의 관계가 사라집니다.",
"block_entire_domain": "도메인 차단"
},
"save_photo_failure": {
"title": "사진 저장 실패",
"message": "Please enable the photo library access permission to save the photo."
"message": "사진을 저장하기 위해 사진 접근 권한을 허용해 주세요."
},
"delete_post": {
"title": "정말로 이 게시물을 삭제하시겠습니까?",
"message": "Are you sure you want to delete this post?"
"message": "정말로 이 게시물을 삭제하시겠습니까?"
},
"clean_cache": {
"title": "캐시 삭제",
"message": "Successfully cleaned %s cache."
"message": "%s의 캐시를 성공적으로 청소하였습니다."
},
"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": "번역에 실패했습니다. 관리자가 번역 기능을 활성화시키지 않았거나 번역 기능을 지원하지 않는 Mastodon의 버전을 사용하는 것일 수 있습니다.",
"button": "확인"
}
},
@ -98,10 +98,10 @@
"unknown_language": "알 수 없음"
},
"edit_post": "수정",
"bookmark": "Bookmark",
"remove_bookmark": "Remove Bookmark",
"follow": "Follow %s",
"unfollow": "Unfollow %s"
"bookmark": "북마크",
"remove_bookmark": "북마크 삭제",
"follow": "%s 팔로우하기",
"unfollow": "%s 언팔로우하기"
},
"tabs": {
"home": "홈",
@ -169,11 +169,11 @@
"show_image": "이미지 표시",
"show_gif": "GIF 보기",
"show_video_player": "비디오 플레이어 보기",
"share_link_in_post": "Share Link in Post",
"share_link_in_post": "게시글 안의 링크 공유",
"tap_then_hold_to_show_menu": "Tap then hold to show menu",
"a11y_labels": {
"reblog": "Re-blog",
"unreblog": "Undo re-blog"
"reblog": "리블로그",
"unreblog": "리블로그 취소"
}
},
"tag": {
@ -194,7 +194,7 @@
"translated_from": "%s에서 %s를 사용해 번역됨",
"unknown_language": "알 수 없음",
"unknown_provider": "알 수 없음",
"show_original": "Show Original"
"show_original": "원본 보기"
},
"media": {
"accessibility_label": "%s, attachment %d of %d",
@ -205,7 +205,7 @@
"posted_via_application": "%s via %s",
"buttons": {
"reblogs_title": "Reblogs",
"favorites_title": "Favorites",
"favorites_title": "즐겨찾기",
"edit_history_title": "Edit History",
"edit_history_detail": "Last edit %s"
},
@ -222,10 +222,11 @@
"pending": "대기중",
"block": "차단",
"block_user": "%s 차단",
"block_domain": "%s 차단",
"block_domain": "Block domain %s",
"unblock": "차단 해제",
"unblock_user": "%s 차단 해제",
"blocked": "차단됨",
"domain_blocked": "Domain Blocked",
"mute": "뮤트",
"mute_user": "%s 뮤트",
"unmute": "뮤트 해제",
@ -258,7 +259,7 @@
},
"user_list": {
"no_verified_link": "No verified link",
"followers_count": "%@ followers"
"followers_count": "%@ 팔로잉"
}
},
"scene": {
@ -266,22 +267,22 @@
"log_in": "로그인",
"learn_more": "Learn more",
"join_default_server": "Join %@",
"pick_server": "Pick another server",
"pick_server": "다른 서버 선택하기",
"separator": {
"or": "or"
"or": "또는"
},
"education": {
"mastodon": {
"title": "Welcome to Mastodon",
"title": "Mastodon에 오신 것을 환영합니다",
"description": "Mastodon is a decentralized social network, meaning no single company controls it. Its made up of many independently-run servers, all connected together."
},
"servers": {
"title": "What are servers?",
"title": "서버는 무엇인가요?",
"description": "Every Mastodon account is hosted on a server — each with its own values, rules, & admins. No matter which one you pick, you can follow and interact with people on any server."
},
"a11y": {
"what_is_mastodon": {
"title": "What is Mastodon?"
"title": "Mastodon이란?"
}
}
}
@ -294,9 +295,9 @@
}
},
"server_picker": {
"title": "Pick Server",
"title": "서버 선택하기",
"button": {
"language": "Language",
"language": "언어",
"signup_speed": "Sign-up Speed",
"category": {
"all": "모두",
@ -327,28 +328,28 @@
},
"empty_state": {
"finding_servers": "사용 가능한 서버를 찾는 중입니다...",
"bad_network": "Something went wrong while loading the data. Check your internet connection.",
"bad_network": "데이터를 로딩하는 과정에서 문제가 발생했습니다. 인터넷 연결 상태를 확인해주세요.",
"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": "아무 것도 고르지 않은 경우, 당신의 언어에 따라 서버를 골라드립니다."
},
"privacy": {
"title": "Privacy",
"title": "개인 정보",
"description": "마스토돈 앱은 아무런 데이터도 수집하지 않지만, 가입한 서버의 정책은 다를 수도 있습니다. 잠시 시간을 들여 마스토돈 앱과 서버의 개인정보 정책을 확인한 후 동의해 주세요.",
"policy": {
"ios": "Privacy Policy - Mastodon for iOS",
"server": "Privacy Policy - %s"
"ios": "개인정보처리방침 - Mastodon iOS",
"server": "개인정보처리방침 - %s"
},
"button": {
"confirm": "동의합니다"
@ -373,7 +374,7 @@
},
"password": {
"placeholder": "암호",
"confirmation_placeholder": "Confirm Password",
"confirmation_placeholder": "비밀번호 확인",
"require": "암호의 최소 요구사항:",
"character_limit": "8글자",
"accessibility": {
@ -420,13 +421,13 @@
"subtitle": "다음은 %s의 중재자들에 의해 설정되고 적용되는 규칙들입니다.",
"prompt": "By continuing, youre subject to the terms of service and privacy policy for %s.",
"terms_of_service": "이용약관",
"privacy_policy": "개인정보 정책",
"privacy_policy": "개인정보처리방침",
"button": {
"confirm": "동의합니다"
}
},
"confirm_email": {
"title": "Check Your Inbox",
"title": "받은 편지함을 확인하세요",
"tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. Well wait right here.",
"button": {
"resend": "재전송"
@ -444,8 +445,8 @@
},
"didnt_get_link": {
"prefix": "링크를 못 받으셨나요?",
"resend_in": "Resend (%@)",
"resend_now": "Resend now."
"resend_in": "재전송(%@)",
"resend_now": "재전송됨"
}
},
"home_timeline": {
@ -462,14 +463,14 @@
}
},
"suggestion_account": {
"title": "Popular on Mastodon",
"follow_all": "Follow all"
"title": "마스토돈 속 인기",
"follow_all": "모두 팔로우"
},
"compose": {
"title": {
"new_post": "새 게시물",
"new_reply": "새 답글",
"edit_post": "Edit Post"
"edit_post": "게시물 편집"
},
"media_selection": {
"camera": "사진 촬영",
@ -489,11 +490,11 @@
"upload_failed": "업로드 실패",
"can_not_recognize_this_media_attachment": "Can not recognize this media attachment",
"attachment_too_large": "첨부파일이 너무 큽니다",
"compressing_state": "Compressing...",
"compressing_state": "압축…",
"server_processing_state": "Server Processing..."
},
"poll": {
"title": "Poll",
"title": "투표",
"duration_time": "기간: %s",
"thirty_minutes": "30분",
"one_hour": "1시간",
@ -541,23 +542,23 @@
"select_visibility_entry": "Select Visibility - %s"
},
"language": {
"title": "Post Language",
"suggested": "Suggested",
"recent": "Recent",
"other": "Other Language…"
"title": "게시물 언어",
"suggested": "추천",
"recent": "최근",
"other": "다른 언어"
}
},
"profile": {
"header": {
"follows_you": "Follows You"
"follows_you": "나를 팔로우 합니다"
},
"dashboard": {
"my_posts": "posts",
"my_following": "following",
"my_followers": "followers",
"other_posts": "posts",
"other_following": "following",
"other_followers": "followers",
"my_posts": "게시물",
"my_following": "팔로잉",
"my_followers": "팔로워",
"other_posts": "게시물",
"other_following": "팔로잉",
"other_followers": "팔로워",
"familiar_followers": "mutuals"
},
"fields": {
@ -575,14 +576,14 @@
"segmented_control": {
"posts": "게시물",
"replies": "답글",
"posts_and_replies": "Posts and Replies",
"posts_and_replies": "게시물과 답장",
"media": "미디어",
"about": "정보"
},
"relationship_action_alert": {
"confirm_mute_user": {
"title": "Mute Account",
"message": "Confirm to mute %s"
"title": "계정 뮤트",
"message": "%s 뮤트 확인"
},
"confirm_unmute_user": {
"title": "계정 뮤트 해제",
@ -590,11 +591,11 @@
},
"confirm_block_user": {
"title": "계정 차단",
"message": "Confirm to block %s"
"message": "%s 차단 확인"
},
"confirm_unblock_user": {
"title": "계정 차단 해제",
"message": "Confirm to unblock %s"
"message": "%s 차단 해제 확인"
},
"confirm_show_reblogs": {
"title": "리블로그 보기",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "리블로그 가리기",
"message": "리블로그를 가리기 전 확인"
},
"confirm_block_domain": {
"title": "도메인 차단",
"message": "%s 도메인 차단 확인"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {
@ -710,7 +719,7 @@
},
"settings": {
"overview": {
"title": "Settings",
"title": "설정",
"general": "General",
"notifications": "Notifications",
"support_mastodon": "Support Mastodon",
@ -722,7 +731,7 @@
"title": "About",
"more_settings": "Even More Settings",
"contribute_to_mastodon": "Contribute to Mastodon",
"privacy_policy": "Privacy Policy",
"privacy_policy": "개인정보처리방침",
"clear_media_storage": "Clear Media Storage"
},
"server_details": {
@ -748,24 +757,24 @@
},
"links": {
"section_title": "Links",
"open_in_mastodon": "Open in Mastodon",
"open_in_browser": "Open in Browser"
"open_in_mastodon": "Mastodon으로 열기",
"open_in_browser": "브라우저로 열기"
}
},
"notifications": {
"title": "Notifications",
"title": "알림",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
"followers": "People who follow you",
"follow": "People you follow",
"noone": "No one"
"anyone": "모두",
"followers": "나를 팔로우하는 사람들",
"follow": "내가 팔로우하는 사람들",
"noone": "알림 받지않기"
},
"alert": {
"mentions_and_replies": "Mentions & Replies",
"boosts": "Boosts",
"favorites": "Favorites",
"new_followers": "New Followers"
"favorites": "즐겨찾기",
"new_followers": "새 팔로워"
},
"disabled": {
"notification_hint": "Turn on notifications from your device settings to see updates on your lock screen.",
@ -841,7 +850,7 @@
"add_account": "계정 추가"
},
"bookmark": {
"title": "Bookmarks"
"title": "북마크"
},
"followed_tags": {
"title": "팔로우한 태그",
@ -867,7 +876,7 @@
"user_not_logged_in": "Please open Mastodon to log in to an Account."
},
"followers_count": {
"configuration_display_name": "Followers",
"configuration_display_name": "팔로워",
"configuration_description": "Show number of followers.",
"title": "FOLLOWERS",
"followers_today": "%s followers today"

View File

@ -222,10 +222,11 @@
"pending": "Gaida",
"block": "Bloķēt",
"block_user": "Bloķēt %s",
"block_domain": "Bloķēt %s",
"block_domain": "Block domain %s",
"unblock": "Atbloķēt",
"unblock_user": "Atbloķēt %s",
"blocked": "Bloķēts",
"domain_blocked": "Domain Blocked",
"mute": "Apklusināt",
"mute_user": "Aplusināt %s",
"unmute": "Noņemt apklusinājumu",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Paslēpt Reblogus",
"message": "Apstiprināt, lai slēptu reblogus"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "ဆိုင်းငံ့ထားသည်",
"block": "ဘလော့လုပ်ရန်",
"block_user": "%s ကို ဘလော့လုပ်ရန်",
"block_domain": "%s ကို ဘလော့လုပ်ရန်",
"block_domain": "Block domain %s",
"unblock": "ဘလော့ဖြုတ်ရန်",
"unblock_user": "%s ကို ဘလော့ဖြုတ်ရန်",
"blocked": "ဘလော့ထားသည်",
"domain_blocked": "Domain Blocked",
"mute": "ပိတ်ထားရန်",
"mute_user": "%s ကို ပိတ်ထားရန်",
"unmute": "ပြန်ဖွင့်ရန်",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "In afwachting",
"block": "Blokkeren",
"block_user": "%s blokkeren",
"block_domain": "%s blokkeren",
"block_domain": "Block domain %s",
"unblock": "Deblokkeren",
"unblock_user": "%s deblokkeren",
"blocked": "Geblokkeerd",
"domain_blocked": "Domain Blocked",
"mute": "Negeren",
"mute_user": "Negeer %s",
"unmute": "Niet langer negeren",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Boosts verbergen",
"message": "Verbergen van boosts bevestigen"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Oczekujący",
"block": "Zablokuj",
"block_user": "Zablokuj %s",
"block_domain": "Zablokuj %s",
"block_domain": "Block domain %s",
"unblock": "Odblokuj",
"unblock_user": "Odblokuj %s",
"blocked": "Zablokowany",
"domain_blocked": "Domain Blocked",
"mute": "Wycisz",
"mute_user": "Wycisz %s",
"unmute": "Cofnij wyciszenie",
@ -355,7 +356,7 @@
}
},
"register": {
"title": "Create Account",
"title": "Utwórz konto",
"input": {
"avatar": {
"delete": "Usuń"
@ -419,8 +420,8 @@
"title": "Some ground rules.",
"subtitle": "These are set and enforced by the %s moderators.",
"prompt": "By continuing, youre subject to the terms of service and privacy policy for %s.",
"terms_of_service": "terms of service",
"privacy_policy": "privacy policy",
"terms_of_service": "zasady użytkowania",
"privacy_policy": "polityka prywatności",
"button": {
"confirm": "I Agree"
}
@ -429,7 +430,7 @@
"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.",
"button": {
"resend": "Resend"
"resend": "Wyślij ponownie"
},
"dont_receive_email": {
"title": "Check your Email",
@ -444,7 +445,7 @@
},
"didnt_get_link": {
"prefix": "Didnt get a link?",
"resend_in": "Resend (%@)",
"resend_in": "Wyślij ponownie (%@)",
"resend_now": "Resend now."
}
},
@ -472,12 +473,12 @@
"edit_post": "Edit Post"
},
"media_selection": {
"camera": "Take Photo",
"photo_library": "Photo Library",
"camera": "Zrób zdjęcie",
"photo_library": "Biblioteka zdjęć",
"browse": "Browse"
},
"content_input_placeholder": "Type or paste whats on your mind",
"compose_action": "Publish",
"compose_action": "Publikuj",
"replying_to_user": "odpowiadanie %s",
"attachment": {
"photo": "zdjęcie",
@ -513,18 +514,18 @@
"placeholder": "Write an accurate warning here..."
},
"visibility": {
"public": "Public",
"public": "Publiczny",
"unlisted": "Unlisted",
"private": "Followers only",
"direct": "Only people I mention"
"private": "Tylko dla obserwujących",
"direct": "Tylko wspomniane osoby"
},
"auto_complete": {
"space_to_add": "Space to add"
},
"accessibility": {
"append_attachment": "Add Attachment",
"append_poll": "Add Poll",
"remove_poll": "Remove Poll",
"append_attachment": "Dodaj załącznik",
"append_poll": "Dodaj ankietę",
"remove_poll": "Usuń ankietę",
"custom_emoji_picker": "Custom Emoji Picker",
"enable_content_warning": "Enable Content Warning",
"disable_content_warning": "Disable Content Warning",
@ -561,11 +562,11 @@
"familiar_followers": "mutuals"
},
"fields": {
"joined": "Joined",
"joined": "Dołączył(a)",
"add_row": "Add Row",
"placeholder": {
"label": "Label",
"content": "Content"
"label": "Etykieta",
"content": "Zawartość"
},
"verified": {
"short": "Verified on %s",
@ -574,19 +575,19 @@
},
"segmented_control": {
"posts": "Posts",
"replies": "Replies",
"replies": "Odpowiedzi",
"posts_and_replies": "Posts and Replies",
"media": "Media",
"about": "About"
},
"relationship_action_alert": {
"confirm_mute_user": {
"title": "Mute Account",
"message": "Confirm to mute %s"
"title": "Wycisz konto",
"message": "Potwierdź wyciszenie %s"
},
"confirm_unmute_user": {
"title": "Unmute Account",
"message": "Confirm to unmute %s"
"title": "Cofnij wyciszenie konta",
"message": "Potwierdź cofnięcie wyciszenia %s"
},
"confirm_block_user": {
"title": "Block Account",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {
@ -634,7 +643,7 @@
"title": "Search",
"search_bar": {
"placeholder": "Search hashtags and users",
"cancel": "Cancel"
"cancel": "Anuluj"
},
"recommend": {
"button_text": "See All",
@ -646,23 +655,23 @@
"accounts": {
"title": "Accounts you might like",
"description": "You may like to follow these accounts",
"follow": "Follow"
"follow": "Obserwuj"
}
},
"searching": {
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"url": "Otwórz adres URL w Mastodonie",
"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"
"no_results": "Brak wyników"
},
"recent_search": "Recent searches",
"recent_search": "Ostatnie wyszukiwania",
"clear_all": "Clear all",
"clear": "Clear"
}
@ -678,12 +687,12 @@
"intro": "These are the posts gaining traction in your corner of Mastodon."
},
"favorite": {
"title": "Favorites"
"title": "Ulubione"
},
"notification": {
"title": {
"Everything": "Everything",
"Mentions": "Mentions"
"Everything": "Wszystko",
"Mentions": "Wspomnienia"
},
"notification_description": {
"followed_you": "followed you",
@ -698,10 +707,10 @@
"show_mentions": "Show Mentions"
},
"follow_request": {
"accept": "Accept",
"accepted": "Accepted",
"reject": "reject",
"rejected": "Rejected"
"accept": "Zaakceptuj",
"accepted": "Zaakceptowano",
"reject": "odrzuć",
"rejected": "Odrzucono"
}
},
"thread": {
@ -737,9 +746,9 @@
"general": {
"title": "General",
"appearance": {
"section_title": "Appearance",
"dark": "Dark",
"light": "Light",
"section_title": "Wygląd",
"dark": "Ciemny",
"light": "Jasny",
"system": "Use Device Appearance"
},
"design": {
@ -753,7 +762,7 @@
}
},
"notifications": {
"title": "Notifications",
"title": "Powiadomienia",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
@ -791,13 +800,13 @@
"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",
"i_dont_like_it": "Nie lubię tego",
"it_is_not_something_you_want_to_see": "It is not something you want to see",
"its_spam": "Its spam",
"its_spam": "To spam",
"malicious_links_fake_engagement_or_repetetive_replies": "Malicious links, fake engagement, or repetetive replies",
"it_violates_server_rules": "It violates server rules",
"it_violates_server_rules": "To narusza zasady serwera",
"you_are_aware_that_it_breaks_specific_rules": "You are aware that it breaks specific rules",
"its_something_else": "Its something else",
"its_something_else": "To coś innego",
"the_issue_does_not_fit_into_other_categories": "The issue does not fit into other categories"
},
"step_two": {
@ -838,10 +847,10 @@
"account_list": {
"tab_bar_hint": "Current selected profile: %s. Double tap then hold to show account switcher",
"dismiss_account_switcher": "Dismiss Account Switcher",
"add_account": "Add Account"
"add_account": "Dodaj konto"
},
"bookmark": {
"title": "Bookmarks"
"title": "Zakładki"
},
"followed_tags": {
"title": "Followed Tags",
@ -851,7 +860,7 @@
"posts_today": "posts today"
},
"actions": {
"follow": "Follow",
"follow": "Obserwuj",
"unfollow": "Unfollow"
}
}

View File

@ -222,10 +222,11 @@
"pending": "Pendente",
"block": "Bloquear",
"block_user": "Bloquear %s",
"block_domain": "Bloquear %s",
"block_domain": "Block domain %s",
"unblock": "Desbloquear",
"unblock_user": "Desbloquear %s",
"blocked": "Bloqueado",
"domain_blocked": "Domain Blocked",
"mute": "Silenciar",
"mute_user": "Silenciar %s",
"unmute": "Remover silenciado",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Ocultar reblogs",
"message": "Confirmar para ocultar reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Block domain %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "Block",
"block_user": "Block %s",
"block_domain": "Block %s",
"block_domain": "Block domain %s",
"unblock": "Unblock",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Отправлен",
"block": "Заблокировать",
"block_user": "Заблокировать %s",
"block_domain": "Заблокировать %s",
"block_domain": "Block domain %s",
"unblock": "Разблокировать",
"unblock_user": "Разблокировать %s",
"blocked": "В заблокированных",
"domain_blocked": "Domain Blocked",
"mute": "Игнорировать",
"mute_user": "Игнорировать %s",
"unmute": "Убрать из игнорируемых",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Pending",
"block": "අවහිර",
"block_user": "%s අවහිර",
"block_domain": "%s අවහිර",
"block_domain": "Block domain %s",
"unblock": "අනවහිර",
"unblock_user": "Unblock %s",
"blocked": "Blocked",
"domain_blocked": "Domain Blocked",
"mute": "Mute",
"mute_user": "Mute %s",
"unmute": "Unmute",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Hide Reblogs",
"message": "Confirm to hide reblogs"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Na čakanju",
"block": "Blokiraj",
"block_user": "Blokiraj %s",
"block_domain": "Blokiraj %s",
"block_domain": "Blokiraj domeno %s",
"unblock": "Odblokiraj",
"unblock_user": "Odblokiraj %s",
"blocked": "Blokirano",
"domain_blocked": "Domena blokirana",
"mute": "Utišaj",
"mute_user": "Utišaj %s",
"unmute": "Odtišaj",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Skrij poobjave",
"message": "Potrdite, da poobjave ne bodo prikazane"
},
"confirm_block_domain": {
"title": "Blokiraj domeno",
"message": "Potrdite blokado domene %s"
},
"confirm_unblock_domain": {
"title": "Odblokiraj domeno",
"message": "Potrdite umik blokade domene %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Väntande",
"block": "Blockera",
"block_user": "Blockera %s",
"block_domain": "Blockera %s",
"block_domain": "Block domain %s",
"unblock": "Avblockera",
"unblock_user": "Avblockera %s",
"blocked": "Blockerad",
"domain_blocked": "Domain Blocked",
"mute": "Tysta",
"mute_user": "Tysta %s",
"unmute": "Avtysta",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Dölj boostar",
"message": "Bekräfta för att dölja boostar"
},
"confirm_block_domain": {
"title": "Blockera domän",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -79,9 +79,9 @@
"see_more": "ดูเพิ่มเติม",
"preview": "แสดงตัวอย่าง",
"copy": "คัดลอก",
"share": "แบ่งปัน",
"share_user": "แบ่งปัน %s",
"share_post": "แบ่งปันโพสต์",
"share": "แชร์",
"share_user": "แชร์ %s",
"share_post": "แชร์โพสต์",
"open_in_safari": "เปิดใน Safari",
"open_in_browser": "เปิดในเบราว์เซอร์",
"find_people": "ค้นหาผู้คนที่จะติดตาม",
@ -169,7 +169,7 @@
"show_image": "แสดงภาพ",
"show_gif": "แสดง GIF",
"show_video_player": "แสดงตัวเล่นวิดีโอ",
"share_link_in_post": "แบ่งปันลิงก์ในโพสต์",
"share_link_in_post": "แชร์ลิงก์ในโพสต์",
"tap_then_hold_to_show_menu": "แตะค้างไว้เพื่อแสดงเมนู",
"a11y_labels": {
"reblog": "ดัน",
@ -222,10 +222,11 @@
"pending": "รอดำเนินการ",
"block": "ปิดกั้น",
"block_user": "ปิดกั้น %s",
"block_domain": "ปิดกั้น %s",
"block_domain": "ปิดกั้นโดเมน %s",
"unblock": "เลิกปิดกั้น",
"unblock_user": "เลิกปิดกั้น %s",
"blocked": "ปิดกั้นอยู่",
"domain_blocked": "ปิดกั้นโดเมนอยู่",
"mute": "ซ่อน",
"mute_user": "ซ่อน %s",
"unmute": "เลิกซ่อน",
@ -277,7 +278,7 @@
},
"servers": {
"title": "เซิร์ฟเวอร์คืออะไร?",
"description": "ทุกบัญชี Mastodon ได้รับการโฮสต์ในเซิร์ฟเวอร์ — แต่ละแห่งมีค่า, กฎ และผู้ดูแลของเซิร์ฟเวอร์เอง ไม่ว่าคุณจะเลือกเซิร์ฟเวอร์ใด คุณสามารถติดตามและโต้ตอบกับผู้คนในเซิร์ฟเวอร์ใด"
"description": "ทุกบัญชี Mastodon จะถูกโฮสต์ในเซิร์ฟเวอร์ ซึ่งแต่ละแห่งมีค่านิยม, กฎ และผู้ดูแลของเซิร์ฟเวอร์เอง ไม่ว่าคุณจะเลือกเซิร์ฟเวอร์ใด คุณสามารถติดตามและโต้ตอบกับผู้คนในเซิร์ฟเวอร์ใดก็ได้"
},
"a11y": {
"what_is_mastodon": {
@ -288,7 +289,7 @@
},
"login": {
"title": "ยินดีต้อนรับกลับมา",
"subtitle": "นำคุณเข้าสู่ระบบในเซิร์ฟเวอร์ที่คุณได้สร้างบัญชีของคุณไว้ใน",
"subtitle": "นำคุณเข้าสู่ระบบในเซิร์ฟเวอร์ที่คุณได้สร้างบัญชีของคุณไว้",
"server_search_field": {
"placeholder": "ป้อน URL หรือค้นหาสำหรับเซิร์ฟเวอร์ของคุณ"
}
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "ซ่อนการดัน",
"message": "ยืนยันเพื่อซ่อนการดัน"
},
"confirm_block_domain": {
"title": "ปิดกั้นโดเมน",
"message": "ยืนยันเพื่อปิดกั้นโดเมน %s"
},
"confirm_unblock_domain": {
"title": "เลิกปิดกั้นโดเมน",
"message": "ยืนยันเพื่อเลิกปิดกั้นโดเมน %s"
}
},
"accessibility": {
@ -825,7 +834,7 @@
"you_wont_see_their_posts_or_reblogs_in_your_home_feed_they_wont_know_they_ve_been_muted": "คุณจะไม่เห็นโพสต์หรือการดันของเขาในฟีดหน้าแรกของคุณ เขาจะไม่ทราบว่ามีการซ่อนเขา",
"block_user": "ปิดกั้น %s",
"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": "ขณะที่เราตรวจทานสิ่งนี้ คุณสามารถดำเนินการกับ %s"
"while_we_review_this_you_can_take_action_against_user": "ขณะที่เราตรวจทานสิ่งนี้ คุณสามารถใช้การกระทำต่อ %s"
}
},
"preview": {

View File

@ -222,10 +222,11 @@
"pending": "Bekliyor",
"block": "Engelle",
"block_user": "%s kişisini engelle",
"block_domain": "%s kişisini engelle",
"block_domain": "Block domain %s",
"unblock": "Engeli kaldır",
"unblock_user": "%s kişisinin engelini kaldır",
"blocked": "Engellendi",
"domain_blocked": "Domain Blocked",
"mute": "Sessize al",
"mute_user": "Sustur %s",
"unmute": "Susturmayı kaldır",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Yeniden Paylaşımları Gizle",
"message": "Yeniden paylaşımları gizlemeyi onayla"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "Очікується",
"block": "Заблокувати",
"block_user": "Блокувати %s",
"block_domain": "Блокувати %s",
"block_domain": "Block domain %s",
"unblock": "Розблокувати",
"unblock_user": "Розблокувати %s",
"blocked": "Заблоковано",
"domain_blocked": "Domain Blocked",
"mute": "Заглушити",
"mute_user": "Заглушити %s",
"unmute": "Сповіщати",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Сховати реблоги",
"message": "Підтвердити, щоб приховати реблоги"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {

View File

@ -104,7 +104,7 @@
"unfollow": "Bỏ theo dõi %s"
},
"tabs": {
"home": "Trang chính",
"home": "Trang ch",
"search_and_explore": "Tìm và Khám Phá",
"notifications": "Thông báo",
"profile": "Trang hồ sơ",
@ -226,6 +226,7 @@
"unblock": "Bỏ chặn",
"unblock_user": "Bỏ chặn %s",
"blocked": "Đã chặn",
"domain_blocked": "Máy chủ chặn",
"mute": "Ẩn",
"mute_user": "Ẩn %s",
"unmute": "Bỏ ẩn",
@ -449,7 +450,7 @@
}
},
"home_timeline": {
"title": "Trang chính",
"title": "Trang ch",
"navigation_bar_state": {
"offline": "Ngoại tuyến",
"new_posts": "Đọc những tút mới",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "Ẩn đăng lại",
"message": "Xác nhận ẩn đăng lại"
},
"confirm_block_domain": {
"title": "Chặn máy chủ",
"message": "Bạn muốn chặn %s?"
},
"confirm_unblock_domain": {
"title": "Bỏ chặn máy chủ",
"message": "Bạn muốn bỏ chặn %s?"
}
},
"accessibility": {

View File

@ -222,10 +222,11 @@
"pending": "待确认",
"block": "屏蔽",
"block_user": "屏蔽 %s",
"block_domain": "屏蔽 %s",
"block_domain": "Block domain %s",
"unblock": "解除屏蔽",
"unblock_user": "解除屏蔽 %s",
"blocked": "已屏蔽",
"domain_blocked": "Domain Blocked",
"mute": "静音",
"mute_user": "静音 %s",
"unmute": "取消静音",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "隐藏转发",
"message": "确认隐藏转发"
},
"confirm_block_domain": {
"title": "Block domain",
"message": "Confirm to block domain %s"
},
"confirm_unblock_domain": {
"title": "Unblock domain",
"message": "Confirm to unblock domain %s"
}
},
"accessibility": {
@ -650,20 +659,20 @@
}
},
"searching": {
"posts": "Posts matching \"%s\"",
"people": "People matching \"%s\"",
"profile": "Go to @%s@%s",
"url": "Open URL in Mastodon",
"hashtag": "Go to #%s",
"posts": "匹配 %s 的嘟文",
"people": "匹配 %s 的用户",
"profile": "转到 @%s@%s",
"url": "在 Mastodon 中打开 URL",
"hashtag": "转到 #%s",
"no_user": {
"title": "No User Account Found",
"message": "There's no Useraccount \"%s\" on %s"
"title": "找不到账户",
"message": "找不到用户 %s在服务器 %s 上)"
},
"empty_state": {
"no_results": "无结果"
},
"recent_search": "最近搜索",
"clear_all": "Clear all",
"clear_all": "清除",
"clear": "清除"
}
},
@ -710,66 +719,66 @@
},
"settings": {
"overview": {
"title": "Settings",
"general": "General",
"notifications": "Notifications",
"support_mastodon": "Support Mastodon",
"about_mastodon": "About Mastodon",
"server_details": "Server Details",
"logout": "Logout %@"
"title": "设置",
"general": "通用",
"notifications": "通知",
"support_mastodon": "支持 Mastodon",
"about_mastodon": "关于 Mastodon",
"server_details": "服务器详情",
"logout": "登出 %@"
},
"about_mastodon": {
"title": "About",
"more_settings": "Even More Settings",
"contribute_to_mastodon": "Contribute to Mastodon",
"privacy_policy": "Privacy Policy",
"clear_media_storage": "Clear Media Storage"
"title": "关于",
"more_settings": "更多设置",
"contribute_to_mastodon": "贡献给Mastodon",
"privacy_policy": "隐私政策",
"clear_media_storage": "清楚媒体缓存"
},
"server_details": {
"about": "About",
"rules": "Rules",
"about": "关于",
"rules": "规则",
"about_instance": {
"title": "Administrator",
"message_admin": "Message Admin",
"legal_notice": "A legal notice"
"title": "管理员",
"message_admin": "联系管理员",
"legal_notice": "法律声明"
}
},
"general": {
"title": "General",
"title": "通用",
"appearance": {
"section_title": "Appearance",
"dark": "Dark",
"light": "Light",
"system": "Use Device Appearance"
"section_title": "外观",
"dark": "深色",
"light": "浅色",
"system": "跟随系统"
},
"design": {
"section_title": "Design",
"show_animations": "Play Animated Avatars and Emoji"
"section_title": "设计",
"show_animations": "播放动态头像和表情"
},
"links": {
"section_title": "Links",
"open_in_mastodon": "Open in Mastodon",
"open_in_browser": "Open in Browser"
"section_title": "链接",
"open_in_mastodon": "在 Mastodon 中打开",
"open_in_browser": "在浏览器中打开"
}
},
"notifications": {
"title": "Notifications",
"title": "通知",
"policy": {
"title": "Get Notifications from",
"anyone": "Anyone",
"followers": "People who follow you",
"follow": "People you follow",
"noone": "No one"
"title": "通知接收范围",
"anyone": "任何人",
"followers": "关注你的人",
"follow": "你关注的人",
"noone": "关闭通知"
},
"alert": {
"mentions_and_replies": "Mentions & Replies",
"boosts": "Boosts",
"favorites": "Favorites",
"new_followers": "New Followers"
"mentions_and_replies": "提及与回复",
"boosts": "转嘟",
"favorites": "喜欢",
"new_followers": "新关注者"
},
"disabled": {
"notification_hint": "Turn on notifications from your device settings to see updates on your lock screen.",
"go_to_settings": "Go to Notification Settings"
"notification_hint": "在系统设置中打开通知来随时获取新动态。",
"go_to_settings": "转到通知设置"
}
}
},

View File

@ -222,10 +222,11 @@
"pending": "等待中",
"block": "封鎖",
"block_user": "封鎖 %s",
"block_domain": "封鎖 %s",
"block_domain": "封鎖網域 %s",
"unblock": "解除封鎖",
"unblock_user": "解除封鎖 %s",
"blocked": "已封鎖",
"domain_blocked": "已封鎖網域",
"mute": "靜音",
"mute_user": "靜音 %s",
"unmute": "取消靜音",
@ -603,6 +604,14 @@
"confirm_hide_reblogs": {
"title": "隱藏轉嘟",
"message": "確認隱藏轉嘟"
},
"confirm_block_domain": {
"title": "封鎖網域",
"message": "確認將網域 %s 封鎖"
},
"confirm_unblock_domain": {
"title": "解除封鎖網域",
"message": "確認將網域 %s 解除封鎖"
}
},
"accessibility": {

View File

@ -29,6 +29,7 @@
2A3D9B7E29A8F33A00F30313 /* StatusHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3D9B7D29A8F33A00F30313 /* StatusHistoryView.swift */; };
2A3F6FE3292ECB5E002E6DA7 /* FollowedTagsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3F6FE2292ECB5E002E6DA7 /* FollowedTagsViewModel.swift */; };
2A3F6FE5292F6E44002E6DA7 /* FollowedTagsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3F6FE4292F6E44002E6DA7 /* FollowedTagsTableViewCell.swift */; };
2A409F832B5955290044E472 /* MastodonStatusThreadViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A409F822B5955290044E472 /* MastodonStatusThreadViewModel+State.swift */; };
2A506CF4292CD85800059C37 /* FollowedTagsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A506CF3292CD85800059C37 /* FollowedTagsViewController.swift */; };
2A506CF6292D040100059C37 /* HashtagTimelineHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A506CF5292D040100059C37 /* HashtagTimelineHeaderView.swift */; };
2A64515E29642A8A00CD8B8A /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A6451022964223800CD8B8A /* UniformTypeIdentifiers.framework */; };
@ -638,6 +639,7 @@
2A3D9B7D29A8F33A00F30313 /* StatusHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusHistoryView.swift; sourceTree = "<group>"; };
2A3F6FE2292ECB5E002E6DA7 /* FollowedTagsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowedTagsViewModel.swift; sourceTree = "<group>"; };
2A3F6FE4292F6E44002E6DA7 /* FollowedTagsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowedTagsTableViewCell.swift; sourceTree = "<group>"; };
2A409F822B5955290044E472 /* MastodonStatusThreadViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonStatusThreadViewModel+State.swift"; sourceTree = "<group>"; };
2A506CF3292CD85800059C37 /* FollowedTagsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowedTagsViewController.swift; sourceTree = "<group>"; };
2A506CF5292D040100059C37 /* HashtagTimelineHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagTimelineHeaderView.swift; sourceTree = "<group>"; };
2A6451022964223800CD8B8A /* UniformTypeIdentifiers.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UniformTypeIdentifiers.framework; path = System/Library/Frameworks/UniformTypeIdentifiers.framework; sourceTree = SDKROOT; };
@ -2671,6 +2673,7 @@
DB938F0E2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift */,
DB938F0826240F3C00E5B6C1 /* RemoteThreadViewModel.swift */,
DB0FCB7F27968F70006C02E2 /* MastodonStatusThreadViewModel.swift */,
2A409F822B5955290044E472 /* MastodonStatusThreadViewModel+State.swift */,
);
path = Thread;
sourceTree = "<group>";
@ -3994,6 +3997,7 @@
0FB3D31E25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift in Sources */,
DB0FCB882796BDA9006C02E2 /* SearchItem.swift in Sources */,
DB6180ED26391C6C0018D199 /* TransitioningMath.swift in Sources */,
2A409F832B5955290044E472 /* MastodonStatusThreadViewModel+State.swift in Sources */,
2D6DE40026141DF600A63F6A /* SearchViewModel.swift in Sources */,
D886FBD329DF710F00272017 /* WelcomeSeparatorView.swift in Sources */,
DB0617FD27855BFE0030EE79 /* ServerRuleItem.swift in Sources */,

View File

@ -26,11 +26,39 @@ extension StatusItem {
case leaf(context: Context)
public var record: MastodonStatus {
switch self {
case .root(let threadContext),
.reply(let threadContext),
.leaf(let threadContext):
return threadContext.status
get {
switch self {
case .root(let threadContext),
.reply(let threadContext),
.leaf(let threadContext):
return threadContext.status
}
}
set {
switch self {
case let .root(threadContext):
self = .root(context: .init(
status: newValue,
displayUpperConversationLink: threadContext.displayUpperConversationLink,
displayBottomConversationLink: threadContext.displayBottomConversationLink)
)
case let .reply(threadContext):
self = .reply(context: .init(
status: newValue,
displayUpperConversationLink: threadContext.displayUpperConversationLink,
displayBottomConversationLink: threadContext.displayBottomConversationLink)
)
case let .leaf(threadContext):
self = .leaf(context: .init(
status: newValue,
displayUpperConversationLink: threadContext.displayUpperConversationLink,
displayBottomConversationLink: threadContext.displayBottomConversationLink)
)
}
}
}
}

View File

@ -12,12 +12,13 @@ import MastodonCore
import MastodonSDK
extension DataSourceFacade {
@MainActor
public static func responseToStatusBookmarkAction(
provider: NeedsDependency & AuthContextProvider & DataSourceProvider,
status: MastodonStatus
) async throws {
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
await selectionFeedbackGenerator.selectionChanged()
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
selectionFeedbackGenerator.selectionChanged()
let updatedStatus = try await provider.context.apiService.bookmark(
record: status,
@ -27,6 +28,6 @@ extension DataSourceFacade {
let newStatus: MastodonStatus = .fromEntity(updatedStatus)
newStatus.isSensitiveToggled = status.isSensitiveToggled
provider.update(status: newStatus)
provider.update(status: newStatus, intent: .bookmark(updatedStatus.bookmarked == true))
}
}

View File

@ -11,12 +11,13 @@ import MastodonSDK
import MastodonCore
extension DataSourceFacade {
@MainActor
public static func responseToStatusFavoriteAction(
provider: DataSourceProvider & AuthContextProvider,
status: MastodonStatus
) async throws {
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
await selectionFeedbackGenerator.selectionChanged()
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
selectionFeedbackGenerator.selectionChanged()
let updatedStatus = try await provider.context.apiService.favorite(
status: status,
@ -26,6 +27,6 @@ extension DataSourceFacade {
let newStatus: MastodonStatus = .fromEntity(updatedStatus)
newStatus.isSensitiveToggled = status.isSensitiveToggled
provider.update(status: newStatus)
provider.update(status: newStatus, intent: .favorite(updatedStatus.favourited == true))
}
}

View File

@ -11,12 +11,13 @@ import MastodonUI
import MastodonSDK
extension DataSourceFacade {
@MainActor
static func responseToStatusReblogAction(
provider: DataSourceProvider & AuthContextProvider,
status: MastodonStatus
) async throws {
let selectionFeedbackGenerator = await UISelectionFeedbackGenerator()
await selectionFeedbackGenerator.selectionChanged()
let selectionFeedbackGenerator = UISelectionFeedbackGenerator()
selectionFeedbackGenerator.selectionChanged()
let updatedStatus = try await provider.context.apiService.reblog(
status: status,
@ -27,6 +28,6 @@ extension DataSourceFacade {
newStatus.reblog?.isSensitiveToggled = status.isSensitiveToggled
newStatus.isSensitiveToggled = status.isSensitiveToggled
provider.update(status: newStatus)
provider.update(status: newStatus, intent: .reblog(updatedStatus.reblogged == true))
}
}

View File

@ -28,7 +28,7 @@ extension DataSourceFacade {
authenticationBox: dependency.authContext.mastodonAuthenticationBox
).value.asMastodonStatus
dependency.delete(status: deletedStatus)
dependency.update(status: deletedStatus, intent: .delete)
}
}
@ -375,7 +375,7 @@ extension DataSourceFacade {
if context.isBlocking {
title = L10n.Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.title
message = L10n.Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.message(context.domain)
actionTitle = L10n.Common.Controls.Friendship.unblockDomain(context.domain)
actionTitle = L10n.Common.Controls.Actions.unblockDomain(context.domain)
} else {
title = L10n.Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.title
message = L10n.Common.Alerts.BlockDomain.title(context.domain)
@ -406,7 +406,7 @@ extension DataSourceFacade {
}
extension DataSourceFacade {
@MainActor
static func responseToToggleSensitiveAction(
dependency: NeedsDependency & DataSourceProvider,
status: MastodonStatus
@ -416,7 +416,7 @@ extension DataSourceFacade {
let newStatus: MastodonStatus = .fromEntity(_status.entity)
newStatus.isSensitiveToggled = !_status.isSensitiveToggled
dependency.update(status: newStatus)
dependency.update(status: newStatus, intent: .toggleSensitive(newStatus.isSensitiveToggled))
}
}

View File

@ -98,6 +98,7 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider & Aut
// MARK: - Follow Request
extension NotificationTableViewCellDelegate where Self: DataSourceProvider & AuthContextProvider {
@MainActor
func tableViewCell(
_ cell: UITableViewCell,
notificationView: NotificationView,
@ -113,7 +114,8 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider & Aut
assertionFailure("only works for status data provider")
return
}
try await DataSourceFacade.responseToUserFollowRequestAction(
dependency: self,
notification: notification,
@ -123,6 +125,7 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider & Aut
}
}
@MainActor
func tableViewCell(
_ cell: UITableViewCell,
notificationView: NotificationView,
@ -138,7 +141,7 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider & Aut
assertionFailure("only works for status data provider")
return
}
try await DataSourceFacade.responseToUserFollowRequestAction(
dependency: self,
notification: notification,
@ -147,7 +150,6 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider & Aut
)
}
}
}
// MARK: - Status Content

View File

@ -37,6 +37,5 @@ extension DataSourceItem {
protocol DataSourceProvider: ViewControllerWithDependencies {
func item(from source: DataSourceItem.Source) async -> DataSourceItem?
func update(status: MastodonStatus)
func delete(status: MastodonStatus)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent)
}

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";
"NewPostShortcutItemTitle" = "Նոր գրառում";
"SearchShortcutItemTitle" = "Որոնել";

View File

@ -28,16 +28,10 @@ extension DiscoveryCommunityViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
func delete(status: MastodonStatus) {
viewModel.dataController.setRecords(
viewModel.dataController.records.filter { $0.id != status.id }
)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -28,16 +28,10 @@ extension DiscoveryPostsViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
func delete(status: MastodonStatus) {
viewModel.dataController.setRecords(
viewModel.dataController.records.filter { $0.id != status.id }
)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -28,14 +28,10 @@ extension HashtagTimelineViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
func delete(status: MastodonStatus) {
viewModel.dataController.deleteRecord(status)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -33,14 +33,10 @@ extension HomeTimelineViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
func delete(status: MastodonStatus) {
viewModel.dataController.records = viewModel.dataController.records.filter { $0.id != status.id }
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -168,9 +168,10 @@ extension HomeTimelineViewController {
}
.store(in: &disposeBag)
context.publisherService.statusPublishResult.sink { result in
if case .success(.edit) = result {
context.publisherService.statusPublishResult.receive(on: DispatchQueue.main).sink { result in
if case .success(.edit(let status)) = result {
self.viewModel.hasPendingStatusEditReload = true
self.viewModel.dataController.update(status: .fromEntity(status.value), intent: .edit)
}
}.store(in: &disposeBag)

View File

@ -88,7 +88,7 @@ extension HomeTimelineViewModel.LoadLatestState {
Task {
let latestStatusIDs: [Status.ID] = latestFeedRecords.compactMap { record in
return record.status?.id
return record.status?.reblog?.id ?? record.status?.id
}
do {
@ -104,7 +104,7 @@ extension HomeTimelineViewModel.LoadLatestState {
// stop refresher if no new statuses
let statuses = response.value
let newStatuses = statuses.filter { !latestStatusIDs.contains($0.id) }
let newStatuses = statuses.filter { status in !latestStatusIDs.contains(where: { $0 == status.reblog?.id || $0 == status.id }) }
if newStatuses.isEmpty {
viewModel.didLoadLatest.send()
@ -113,10 +113,10 @@ extension HomeTimelineViewModel.LoadLatestState {
viewModel.homeTimelineNavigationBarTitleViewModel.newPostsIncoming()
}
var newRecords: [MastodonFeed] = newStatuses.map {
MastodonFeed.fromStatus(.fromEntity($0), kind: .home)
}
viewModel.dataController.records = {
var newRecords: [MastodonFeed] = newStatuses.map {
MastodonFeed.fromStatus(.fromEntity($0), kind: .home)
}
var oldRecords = viewModel.dataController.records
for (i, record) in newRecords.enumerated() {
if let index = oldRecords.firstIndex(where: { $0.status?.reblog?.id == record.id || $0.status?.id == record.id }) {

View File

@ -39,12 +39,10 @@ extension NotificationTimelineViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.dataController.delete(status: status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
Task {
await viewModel.loadLatest()
}
}
@MainActor

View File

@ -44,7 +44,7 @@ extension NotificationTimelineViewModel {
}
var snapshot = NSDiffableDataSourceSnapshot<NotificationSection, NotificationItem>()
snapshot.appendSections([.main])
snapshot.appendItems(newItems, toSection: .main)
snapshot.appendItems(newItems.removingDuplicates(), toSection: .main)
return snapshot
}()

View File

@ -28,14 +28,8 @@ extension BookmarkViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.dataController.setRecords(
viewModel.dataController.records.filter { $0.id != status.id }
)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
@MainActor

View File

@ -103,11 +103,7 @@ extension FamiliarFollowersViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
assertionFailure("Not required")
}

View File

@ -28,16 +28,10 @@ extension FavoriteViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
func delete(status: MastodonStatus) {
viewModel.dataController.setRecords(
viewModel.dataController.records.filter { $0.id != status.id }
)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -154,11 +154,7 @@ extension FollowerListViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
assertionFailure("Not required")
}

View File

@ -150,11 +150,7 @@ extension FollowingListViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
assertionFailure("Not required")
}

View File

@ -256,6 +256,12 @@ extension ProfileViewController {
}
.store(in: &disposeBag)
context.publisherService.statusPublishResult.sink { [weak self] result in
if case .success(.edit(let status)) = result {
self?.updateViewModelsWithDataControllers(status: .fromEntity(status.value), intent: .edit)
}
}.store(in: &disposeBag)
addChild(tabBarPagerController)
tabBarPagerController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(tabBarPagerController.view)
@ -800,7 +806,7 @@ extension ProfileViewController: ProfileHeaderViewControllerDelegate {
preferredStyle: .alert
)
let unblockAction = UIAlertAction(title: L10n.Common.Controls.Friendship.unblockDomain(domain), style: .default) { [weak self] _ in
let unblockAction = UIAlertAction(title: L10n.Common.Controls.Actions.unblockDomain(domain), style: .default) { [weak self] _ in
guard let self else { return }
Task {
_ = try await DataSourceFacade.responseToDomainBlockAction(
@ -973,11 +979,13 @@ extension ProfileViewController: DataSourceProvider {
return nil
}
func update(status: MastodonStatus) {
assertionFailure("Not required")
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
updateViewModelsWithDataControllers(status: status, intent: intent)
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
func updateViewModelsWithDataControllers(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.postsUserTimelineViewModel.dataController.update(status: status, intent: intent)
viewModel.repliesUserTimelineViewModel.dataController.update(status: status, intent: intent)
viewModel.mediaUserTimelineViewModel.dataController.update(status: status, intent: intent)
}
}

View File

@ -28,14 +28,10 @@ extension UserTimelineViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
func delete(status: MastodonStatus) {
viewModel.dataController.deleteRecord(status)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -28,14 +28,10 @@ extension FavoritedByViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -29,11 +29,7 @@ extension RebloggedByViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
assertionFailure("Not required")
}

View File

@ -29,14 +29,10 @@ extension SearchHistoryViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor
private func indexPath(for cell: UICollectionViewCell) async -> IndexPath? {
return collectionView.indexPath(for: cell)

View File

@ -33,12 +33,8 @@ extension SearchResultViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
viewModel.dataController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.dataController.deleteRecord(status)
func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
viewModel.dataController.update(status: status, intent: intent)
}
@MainActor

View File

@ -14,7 +14,7 @@ final class ListBatchFetchViewModel {
var disposeBag = Set<AnyCancellable>()
// timer running on `common` mode
let timerPublisher = Timer.publish(every: 1.0, on: .main, in: .common)
let timerPublisher = Timer.publish(every: 30.0, on: .main, in: .common)
.autoconnect()
.share()
.eraseToAnyPublisher()

View File

@ -0,0 +1,165 @@
// Copyright © 2024 Mastodon gGmbH. All rights reserved.
import Foundation
import MastodonSDK
extension MastodonStatusThreadViewModel {
// Bookmark
func handleBookmark(_ status: MastodonStatus) {
ancestors = handleBookmark(status, items: ancestors)
descendants = handleBookmark(status, items: descendants)
}
private func handleBookmark(_ status: MastodonStatus, items: [StatusItem]) -> [StatusItem] {
var newRecords = Array(items)
guard let index = newRecords.firstIndex(where: { $0.mastodonStatus?.id == status.id }) else {
return items
}
var newRecord = newRecords[index]
newRecord.mastodonStatus = status
newRecords[index] = newRecord
return newRecords
}
// Favorite
func handleFavorite(_ status: MastodonStatus) {
ancestors = handleFavorite(status, items: ancestors)
descendants = handleFavorite(status, items: descendants)
}
private func handleFavorite(_ status: MastodonStatus, items: [StatusItem]) -> [StatusItem] {
var newRecords = Array(items)
guard let index = newRecords.firstIndex(where: { $0.mastodonStatus?.id == status.id }) else {
return items
}
var newRecord = newRecords[index]
newRecord.mastodonStatus = status
newRecords[index] = newRecord
return newRecords
}
// Reblog
func handleReblog(_ status: MastodonStatus, _ isReblogged: Bool) {
ancestors = handleReblog(status, isReblogged, items: ancestors)
descendants = handleReblog(status, isReblogged, items: descendants)
}
private func handleReblog(_ status: MastodonStatus, _ isReblogged: Bool, items: [StatusItem]) -> [StatusItem] {
var newRecords = Array(items)
switch isReblogged {
case true:
let index: Int
if let idx = newRecords.firstIndex(where: { $0.mastodonStatus?.reblog?.id == status.reblog?.id }) {
index = idx
} else if let idx = newRecords.firstIndex(where: { $0.mastodonStatus?.id == status.reblog?.id }) {
index = idx
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return newRecords
}
var newRecord = newRecords[index]
newRecord.mastodonStatus = status.inheritSensitivityToggled(from: newRecord.mastodonStatus)
newRecords[index] = newRecord
case false:
let index: Int
if let idx = newRecords.firstIndex(where: { $0.mastodonStatus?.reblog?.id == status.id }) {
index = idx
} else if let idx = newRecords.firstIndex(where: { $0.mastodonStatus?.id == status.id }) {
index = idx
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return newRecords
}
var newRecord = newRecords[index]
newRecord.mastodonStatus = status.inheritSensitivityToggled(from: newRecord.mastodonStatus)
newRecords[index] = newRecord
}
return newRecords
}
// Sensitive
func handleSensitive(_ status: MastodonStatus, _ isVisible: Bool) {
ancestors = handleSensitive(status, isVisible, ancestors)
descendants = handleSensitive(status, isVisible, descendants)
}
private func handleSensitive(_ status: MastodonStatus, _ isVisible: Bool, _ items: [StatusItem]) -> [StatusItem] {
var newRecords = Array(items)
guard let index = newRecords.firstIndex(where: { $0.mastodonStatus?.id == status.id }) else {
return items
}
var newRecord = newRecords[index]
newRecord.mastodonStatus = status
newRecords[index] = newRecord
return newRecords
}
// Edit
func handleEdit(_ status: MastodonStatus) {
ancestors = handleEdit(status, items: ancestors)
descendants = handleEdit(status, items: descendants)
}
private func handleEdit(_ status: MastodonStatus, items: [StatusItem]) -> [StatusItem] {
var newRecords = Array(items)
guard let index = newRecords.firstIndex(where: { $0.mastodonStatus?.id == status.id }) else {
return items
}
var newRecord = newRecords[index]
newRecord.mastodonStatus = status
newRecords[index] = newRecord
return newRecords
}
// Delete
func handleDelete(_ status: MastodonStatus) {
ancestors = handleDelete(status, ancestors)
descendants = handleDelete(status, descendants)
}
private func handleDelete(_ status: MastodonStatus, _ items: [StatusItem]) -> [StatusItem] {
var newRecords = Array(items)
newRecords.removeAll(where: { $0.mastodonStatus?.id == status.id })
return newRecords
}
}
private extension StatusItem {
var mastodonStatus: MastodonStatus? {
get {
switch self {
case .feed(let record):
return record.status
case .feedLoader(let record):
return record.status
case .status(let record):
return record
case .thread(let thread):
return thread.record
case .topLoader, .bottomLoader:
return nil
}
}
set {
guard let status = newValue else { return }
switch self {
case .feed(let record):
self = .feed(record: .fromStatus(status, kind: record.kind))
case .feedLoader(let record):
self = .feedLoader(record: .fromStatus(status, kind: record.kind))
case .status:
self = .status(record: status)
case let .thread(thread):
var newThread = thread
newThread.record = status
self = .thread(newThread)
case .topLoader, .bottomLoader:
break
}
}
}
}

View File

@ -13,9 +13,12 @@ import CoreDataStack
import MastodonSDK
import MastodonCore
import MastodonMeta
import os.log
final class MastodonStatusThreadViewModel {
let logger = Logger(subsystem: "MastodonStatusThreadViewModel", category: "Data")
static let entryNotFoundMessage = "Failed to find suitable record. Depending on the context this might result in errors (data not being updated) or can be discarded (e.g. when there are mixed data sources where an entry might or might not exist)."
var disposeBag = Set<AnyCancellable>()
// input

View File

@ -29,121 +29,63 @@ extension ThreadViewController: DataSourceProvider {
}
}
func update(status: MastodonStatus) {
func update(status _status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
let status = _status.reblog ?? _status
if case MastodonStatus.UpdateIntent.delete = intent {
return handleDelete(status)
}
switch viewModel.root {
case let .root(context):
if context.status.id == status.id {
viewModel.root = .root(context: .init(status: status))
} else {
handle(status: status)
handleUpdate(status: status, viewModel: viewModel.mastodonStatusThreadViewModel, intent: intent)
}
case let .reply(context):
if context.status.id == status.id {
viewModel.root = .reply(context: .init(status: status))
} else {
handle(status: status)
handleUpdate(status: status, viewModel: viewModel.mastodonStatusThreadViewModel, intent: intent)
}
case let .leaf(context):
if context.status.id == status.id {
viewModel.root = .leaf(context: .init(status: status))
} else {
handle(status: status)
handleUpdate(status: status, viewModel: viewModel.mastodonStatusThreadViewModel, intent: intent)
}
case .none:
assertionFailure("This should not have happened")
}
}
private func handle(status: MastodonStatus) {
viewModel.mastodonStatusThreadViewModel.ancestors.handleUpdate(status: status, for: viewModel)
viewModel.mastodonStatusThreadViewModel.descendants.handleUpdate(status: status, for: viewModel)
}
func delete(status: MastodonStatus) {
private func handleDelete(_ status: MastodonStatus) {
if viewModel.root?.record.id == status.id {
viewModel.root = nil
viewModel.onDismiss.send(status)
}
viewModel.mastodonStatusThreadViewModel.ancestors.handleDelete(status: status, for: viewModel)
viewModel.mastodonStatusThreadViewModel.descendants.handleDelete(status: status, for: viewModel)
viewModel.mastodonStatusThreadViewModel.handleDelete(status)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)
}
}
private extension [StatusItem] {
mutating func handleUpdate(status: MastodonStatus, for viewModel: ThreadViewModel) {
for (index, ancestor) in enumerated() {
switch ancestor {
case let .feed(record):
if record.status?.id == status.id {
self[index] = .feed(record: .fromStatus(status, kind: record.kind))
}
case let.feedLoader(record):
if record.status?.id == status.id {
self[index] = .feedLoader(record: .fromStatus(status, kind: record.kind))
}
case let .status(record):
if record.id == status.id {
self[index] = .status(record: status)
}
case let .thread(thread):
switch thread {
case let .root(context):
if context.status.id == status.id {
self[index] = .thread(.root(context: .init(status: status)))
}
case let .reply(context):
if context.status.id == status.id {
self[index] = .thread(.reply(context: .init(status: status)))
}
case let .leaf(context):
if context.status.id == status.id {
self[index] = .thread(.leaf(context: .init(status: status)))
}
}
case .bottomLoader, .topLoader:
break
}
}
}
mutating func handleDelete(status: MastodonStatus, for viewModel: ThreadViewModel) {
for (index, ancestor) in enumerated() {
switch ancestor {
case let .feed(record):
if record.status?.id == status.id {
self.remove(at: index)
}
case let.feedLoader(record):
if record.status?.id == status.id {
self.remove(at: index)
}
case let .status(record):
if record.id == status.id {
self.remove(at: index)
}
case let .thread(thread):
switch thread {
case let .root(context):
if context.status.id == status.id {
self.remove(at: index)
}
case let .reply(context):
if context.status.id == status.id {
self.remove(at: index)
}
case let .leaf(context):
if context.status.id == status.id {
self.remove(at: index)
}
}
case .bottomLoader, .topLoader:
break
}
private func handleUpdate(status: MastodonStatus, viewModel: MastodonStatusThreadViewModel, intent: MastodonStatus.UpdateIntent) {
switch intent {
case .bookmark:
viewModel.handleBookmark(status)
case let .reblog(isReblogged):
viewModel.handleReblog(status, isReblogged)
case .favorite:
viewModel.handleFavorite(status)
case let .toggleSensitive(isVisible):
viewModel.handleSensitive(status, isVisible)
case .edit:
viewModel.handleEdit(status)
case .delete:
break // this case has already been handled
}
}
}

View File

@ -82,7 +82,7 @@ extension ThreadViewController {
viewModel.onEdit
.receive(on: DispatchQueue.main)
.sink(receiveValue: { [weak self] status in
self?.navigationController?.notifyChildrenAboutStatusUpdate(status)
self?.navigationController?.notifyChildrenAboutStatusEdit(status)
})
.store(in: &disposeBag)
@ -202,13 +202,13 @@ extension ThreadViewController: StatusTableViewControllerNavigateable {
extension UINavigationController {
func notifyChildrenAboutStatusDeletion(_ status: MastodonStatus) {
viewControllers.compactMap { $0 as? DataSourceProvider }.forEach { provider in
provider?.delete(status: status )
provider?.update(status: status, intent: .delete)
}
}
func notifyChildrenAboutStatusUpdate(_ status: MastodonStatus) {
func notifyChildrenAboutStatusEdit(_ status: MastodonStatus) {
viewControllers.compactMap { $0 as? DataSourceProvider }.forEach { provider in
provider?.update(status: status )
provider?.update(status: status, intent: .edit)
}
}
}

View File

@ -12,15 +12,15 @@
"RHxKOw" = "Send Post with text content";
"RxSqsb" = "Post";
"RxSqsb" = "Գրառում";
"WCIR3D" = "Post ${content} on Mastodon";
"ZKJSNu" = "Post";
"ZKJSNu" = "Գրառում";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Visibility";
"ZbSjzC" = "Տեսանելիութիւն";
"Zo4jgJ" = "Post Visibility";
@ -34,7 +34,7 @@
"dUyuGg" = "Post on Mastodon";
"dYQ5NN" = "Public";
"dYQ5NN" = "Հրապարակային";
"ehFLjY" = "Followers Only";

View File

@ -2,8 +2,11 @@ import Foundation
import UIKit
import Combine
import MastodonSDK
import os.log
final public class FeedDataController {
private let logger = Logger(subsystem: "FeedDataController", category: "Data")
private static let entryNotFoundMessage = "Failed to find suitable record. Depending on the context this might result in errors (data not being updated) or can be discarded (e.g. when there are mixed data sources where an entry might or might not exist)."
@Published public var records: [MastodonFeed] = []
@ -17,7 +20,7 @@ final public class FeedDataController {
public func loadInitial(kind: MastodonFeed.Kind) {
Task {
records = try await load(kind: kind, sinceId: nil)
records = try await load(kind: kind, maxID: nil)
}
}
@ -26,64 +29,152 @@ final public class FeedDataController {
guard let lastId = records.last?.status?.id else {
return loadInitial(kind: kind)
}
records = try await load(kind: kind, sinceId: lastId)
records += try await load(kind: kind, maxID: lastId)
}
}
public func update(status: MastodonStatus) {
@MainActor
public func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
switch intent {
case .delete:
delete(status)
case .edit:
updateEdited(status)
case let .bookmark(isBookmarked):
updateBookmarked(status, isBookmarked)
case let .favorite(isFavorited):
updateFavorited(status, isFavorited)
case let .reblog(isReblogged):
updateReblogged(status, isReblogged)
case let .toggleSensitive(isVisible):
updateSensitive(status, isVisible)
}
}
@MainActor
private func delete(_ status: MastodonStatus) {
records.removeAll { $0.id == status.id }
}
@MainActor
private func updateEdited(_ status: MastodonStatus) {
var newRecords = Array(records)
for (i, record) in newRecords.enumerated() {
if record.status?.id == status.id {
newRecords[i] = .fromStatus(status, kind: record.kind)
} else if let reblog = status.reblog, reblog.id == record.status?.id {
newRecords[i] = .fromStatus(status, kind: record.kind)
} else if let reblog = record.status?.reblog, reblog.id == status.id {
// Handle reblogged state
let isRebloggedByAnyOne: Bool = records[i].status!.reblog != nil
let newStatus: MastodonStatus
if isRebloggedByAnyOne {
// if status was previously reblogged by me: remove reblogged status
if records[i].status!.entity.reblogged == true && status.entity.reblogged == false {
newStatus = .fromEntity(status.entity)
} else {
newStatus = .fromEntity(records[i].status!.entity)
}
} else {
newStatus = .fromEntity(status.entity)
}
newStatus.isSensitiveToggled = status.isSensitiveToggled
newStatus.reblog = isRebloggedByAnyOne ? .fromEntity(status.entity) : nil
newRecords[i] = .fromStatus(newStatus, kind: record.kind)
} else if let reblog = record.status?.reblog, reblog.id == status.reblog?.id {
// Handle re-reblogged state
newRecords[i] = .fromStatus(status, kind: record.kind)
guard let index = newRecords.firstIndex(where: { $0.id == status.id }) else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
let existingRecord = newRecords[index]
let newStatus = status.inheritSensitivityToggled(from: existingRecord.status)
newRecords[index] = .fromStatus(newStatus, kind: existingRecord.kind)
records = newRecords
}
@MainActor
private func updateBookmarked(_ status: MastodonStatus, _ isBookmarked: Bool) {
var newRecords = Array(records)
guard let index = newRecords.firstIndex(where: { $0.id == status.id }) else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
let existingRecord = newRecords[index]
let newStatus = status.inheritSensitivityToggled(from: existingRecord.status)
newRecords[index] = .fromStatus(newStatus, kind: existingRecord.kind)
records = newRecords
}
@MainActor
private func updateFavorited(_ status: MastodonStatus, _ isFavorited: Bool) {
var newRecords = Array(records)
if let index = newRecords.firstIndex(where: { $0.id == status.id }) {
// Replace old status entity
let existingRecord = newRecords[index]
let newStatus = status.inheritSensitivityToggled(from: existingRecord.status).withOriginal(status: existingRecord.status?.originalStatus)
newRecords[index] = .fromStatus(newStatus, kind: existingRecord.kind)
} else if let index = newRecords.firstIndex(where: { $0.status?.reblog?.id == status.id }) {
// Replace reblogged entity of old "parent" status
let newStatus: MastodonStatus
if let existingEntity = newRecords[index].status?.entity {
newStatus = .fromEntity(existingEntity)
newStatus.originalStatus = newRecords[index].status?.originalStatus
newStatus.reblog = status
} else {
newStatus = status
}
newRecords[index] = .fromStatus(newStatus, kind: newRecords[index].kind)
} else {
logger.warning("\(Self.entryNotFoundMessage)")
}
records = newRecords
}
public func delete(status: MastodonStatus) {
self.records.removeAll { $0.id == status.id }
@MainActor
private func updateReblogged(_ status: MastodonStatus, _ isReblogged: Bool) {
var newRecords = Array(records)
switch isReblogged {
case true:
let index: Int
if let idx = newRecords.firstIndex(where: { $0.status?.reblog?.id == status.reblog?.id }) {
index = idx
} else if let idx = newRecords.firstIndex(where: { $0.id == status.reblog?.id }) {
index = idx
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
let existingRecord = newRecords[index]
newRecords[index] = .fromStatus(status.withOriginal(status: existingRecord.status), kind: existingRecord.kind)
case false:
let index: Int
if let idx = newRecords.firstIndex(where: { $0.status?.reblog?.id == status.id }) {
index = idx
} else if let idx = newRecords.firstIndex(where: { $0.status?.id == status.id }) {
index = idx
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
let existingRecord = newRecords[index]
let newStatus = existingRecord.status?.originalStatus ?? status.inheritSensitivityToggled(from: existingRecord.status)
newRecords[index] = .fromStatus(newStatus, kind: existingRecord.kind)
}
records = newRecords
}
@MainActor
private func updateSensitive(_ status: MastodonStatus, _ isVisible: Bool) {
var newRecords = Array(records)
if let index = newRecords.firstIndex(where: { $0.status?.reblog?.id == status.id }), let existingEntity = newRecords[index].status?.entity {
let existingRecord = newRecords[index]
let newStatus: MastodonStatus = .fromEntity(existingEntity)
newStatus.reblog = status
newRecords[index] = .fromStatus(newStatus, kind: existingRecord.kind)
} else if let index = newRecords.firstIndex(where: { $0.id == status.id }), let existingEntity = newRecords[index].status?.entity {
let existingRecord = newRecords[index]
let newStatus: MastodonStatus = .fromEntity(existingEntity)
.inheritSensitivityToggled(from: status)
newRecords[index] = .fromStatus(newStatus, kind: existingRecord.kind)
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
records = newRecords
}
}
private extension FeedDataController {
func load(kind: MastodonFeed.Kind, sinceId: MastodonStatus.ID?) async throws -> [MastodonFeed] {
func load(kind: MastodonFeed.Kind, maxID: MastodonStatus.ID?) async throws -> [MastodonFeed] {
switch kind {
case .home:
await context.authenticationService.authenticationServiceProvider.fetchAccounts(apiService: context.apiService)
return try await context.apiService.homeTimeline(sinceID: sinceId, authenticationBox: authContext.mastodonAuthenticationBox)
.value.map { .fromStatus(.fromEntity($0), kind: .home) }
case .notificationAll:
return try await getFeeds(with: .everything)
case .notificationMentions:
return try await getFeeds(with: .mentions)
case .home:
await context.authenticationService.authenticationServiceProvider.fetchAccounts(apiService: context.apiService)
return try await context.apiService.homeTimeline(maxID: maxID, authenticationBox: authContext.mastodonAuthenticationBox)
.value.map { .fromStatus(.fromEntity($0), kind: .home) }
case .notificationAll:
return try await getFeeds(with: .everything)
case .notificationMentions:
return try await getFeeds(with: .mentions)
}
}

View File

@ -3,8 +3,12 @@ import Combine
import CoreData
import CoreDataStack
import MastodonSDK
import os.log
public final class StatusDataController {
private let logger = Logger(subsystem: "StatusDataController", category: "Data")
private static let entryNotFoundMessage = "Failed to find suitable record. Depending on the context this might result in errors (data not being updated) or can be discarded (e.g. when there are mixed data sources where an entry might or might not exist)."
@MainActor
@Published
public private(set) var records: [MastodonStatus] = []
@ -35,39 +39,118 @@ public final class StatusDataController {
}
@MainActor
public func update(status: MastodonStatus) {
public func update(status: MastodonStatus, intent: MastodonStatus.UpdateIntent) {
switch intent {
case .delete:
deleteRecord(status)
case .edit:
updateEdited(status)
case let .bookmark(isBookmarked):
updateBookmarked(status, isBookmarked)
case let .favorite(isFavorited):
updateFavorited(status, isFavorited)
case let .reblog(isReblogged):
updateReblogged(status, isReblogged)
case let .toggleSensitive(isVisible):
updateSensitive(status, isVisible)
}
}
@MainActor
private func updateEdited(_ status: MastodonStatus) {
var newRecords = Array(records)
for (i, record) in newRecords.enumerated() {
if record.id == status.id {
newRecords[i] = status
} else if let reblog = status.reblog, reblog.id == record.id {
newRecords[i] = status
} else if let reblog = record.reblog, reblog.id == status.id {
// Handle reblogged state
let isRebloggedByAnyOne: Bool = records[i].reblog != nil
let newStatus: MastodonStatus
if isRebloggedByAnyOne {
// if status was previously reblogged by me: remove reblogged status
if records[i].entity.reblogged == true && status.entity.reblogged == false {
newStatus = .fromEntity(status.entity)
} else {
newStatus = .fromEntity(records[i].entity)
}
} else {
newStatus = .fromEntity(status.entity)
}
newStatus.isSensitiveToggled = status.isSensitiveToggled
newStatus.reblog = isRebloggedByAnyOne ? .fromEntity(status.entity) : nil
newRecords[i] = newStatus
} else if let reblog = record.reblog, reblog.id == status.reblog?.id {
// Handle re-reblogged state
newRecords[i] = status
}
guard let index = newRecords.firstIndex(where: { $0.id == status.id }) else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
newRecords[index] = status.inheritSensitivityToggled(from: newRecords[index])
records = newRecords
}
@MainActor
private func updateBookmarked(_ status: MastodonStatus, _ isBookmarked: Bool) {
var newRecords = Array(records)
guard let index = newRecords.firstIndex(where: { $0.id == status.id }) else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
newRecords[index] = status.inheritSensitivityToggled(from: newRecords[index])
records = newRecords
}
@MainActor
private func updateFavorited(_ status: MastodonStatus, _ isFavorited: Bool) {
var newRecords = Array(records)
if let index = newRecords.firstIndex(where: { $0.id == status.id }) {
// Replace old status entity
let existingRecord = newRecords[index]
let newStatus = status.inheritSensitivityToggled(from: existingRecord)
.withOriginal(status: existingRecord)
newRecords[index] = newStatus
} else if let index = newRecords.firstIndex(where: { $0.reblog?.id == status.id }) {
// Replace reblogged entity of old "parent" status
let existingRecord = newRecords[index]
let newStatus = status.inheritSensitivityToggled(from: existingRecord)
.withOriginal(status: existingRecord)
newStatus.reblog = status
newRecords[index] = newStatus
} else {
logger.warning("\(Self.entryNotFoundMessage)")
}
records = newRecords
}
@MainActor
private func updateReblogged(_ status: MastodonStatus, _ isReblogged: Bool) {
var newRecords = Array(records)
switch isReblogged {
case true:
let index: Int
if let idx = newRecords.firstIndex(where: { $0.reblog?.id == status.reblog?.id }) {
index = idx
} else if let idx = newRecords.firstIndex(where: { $0.id == status.reblog?.id }) {
index = idx
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
let existingStatus = newRecords[index]
newRecords[index] = status.withOriginal(status: existingStatus)
case false:
let index: Int
if let idx = newRecords.firstIndex(where: { $0.reblog?.id == status.id }) {
index = idx
} else if let idx = newRecords.firstIndex(where: { $0.id == status.id }) {
index = idx
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
let existingRecord = newRecords[index]
let newStatus = existingRecord.originalStatus ?? status.inheritSensitivityToggled(from: existingRecord)
newRecords[index] = newStatus
}
records = newRecords
}
@MainActor
private func updateSensitive(_ status: MastodonStatus, _ isVisible: Bool) {
var newRecords = Array(records)
if let index = newRecords.firstIndex(where: { $0.reblog?.id == status.id }) {
let newStatus: MastodonStatus = .fromEntity(newRecords[index].entity)
newStatus.reblog = status
newRecords[index] = newStatus
} else if let index = newRecords.firstIndex(where: { $0.id == status.id }) {
let newStatus: MastodonStatus = .fromEntity(newRecords[index].entity)
.inheritSensitivityToggled(from: status)
newRecords[index] = newStatus
} else {
logger.warning("\(Self.entryNotFoundMessage)")
return
}
records = newRecords
}
}

View File

@ -50,13 +50,6 @@ extension APIService {
domain: domain,
authorization: authorization).singleOutput()
_ = try await Mastodon.API.Statuses.editHistory(
forStatusID: statusID,
session: session,
domain: domain,
authorization: authorization
).singleOutput()
return response
}
}

View File

@ -95,6 +95,7 @@ public final class AuthenticationService: NSObject {
super.init()
$mastodonAuthenticationBoxes
.throttle(for: 3, scheduler: DispatchQueue.main, latest: true)
.sink { [weak self] boxes in
Task { [weak self] in
for authBox in boxes {

View File

@ -206,9 +206,9 @@ public enum L10n {
public enum Friendship {
/// Block
public static let block = L10n.tr("Localizable", "Common.Controls.Friendship.Block", fallback: "Block")
/// Block %@
/// Block domain %@
public static func blockDomain(_ p1: Any) -> String {
return L10n.tr("Localizable", "Common.Controls.Friendship.BlockDomain", String(describing: p1), fallback: "Block %@")
return L10n.tr("Localizable", "Common.Controls.Friendship.BlockDomain", String(describing: p1), fallback: "Block domain %@")
}
/// Blocked
public static let blocked = L10n.tr("Localizable", "Common.Controls.Friendship.Blocked", fallback: "Blocked")
@ -243,10 +243,6 @@ public enum L10n {
/// Unblock
public static let unblock = L10n.tr("Localizable", "Common.Controls.Friendship.Unblock", fallback: "Unblock")
/// Unblock %@
public static func unblockDomain(_ p1: Any) -> String {
return L10n.tr("Localizable", "Common.Controls.Friendship.UnblockDomain", String(describing: p1), fallback: "Unblock %@")
}
/// Unblock %@
public static func unblockUser(_ p1: Any) -> String {
return L10n.tr("Localizable", "Common.Controls.Friendship.UnblockUser", String(describing: p1), fallback: "Unblock %@")
}
@ -960,8 +956,12 @@ public enum L10n {
}
public enum RelationshipActionAlert {
public enum ConfirmBlockDomain {
/// Block Domain
public static let title = L10n.tr("Localizable", "Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title", fallback: "Block Domain")
/// Confirm to block domain %@
public static func message(_ p1: Any) -> String {
return L10n.tr("Localizable", "Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message", String(describing: p1), fallback: "Confirm to block domain %@")
}
/// Block domain
public static let title = L10n.tr("Localizable", "Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title", fallback: "Block domain")
}
public enum ConfirmBlockUser {
/// Confirm to block %@
@ -996,8 +996,8 @@ public enum L10n {
public static func message(_ p1: Any) -> String {
return L10n.tr("Localizable", "Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message", String(describing: p1), fallback: "Confirm to unblock domain %@")
}
/// Unblock Domain
public static let title = L10n.tr("Localizable", "Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title", fallback: "Unblock Domain")
/// Unblock domain
public static let title = L10n.tr("Localizable", "Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title", fallback: "Unblock domain")
}
public enum ConfirmUnblockUser {
/// Confirm to unblock %@

View File

@ -70,7 +70,7 @@ Please check your internet connection.";
"Common.Controls.Actions.UnblockDomain" = "Unblock %@";
"Common.Controls.Actions.Unfollow" = "Unfollow %@";
"Common.Controls.Friendship.Block" = "Block";
"Common.Controls.Friendship.BlockDomain" = "Block %@";
"Common.Controls.Friendship.BlockDomain" = "Block domain %@";
"Common.Controls.Friendship.BlockUser" = "Block %@";
"Common.Controls.Friendship.Blocked" = "Blocked";
"Common.Controls.Friendship.DomainBlocked" = "Domain Blocked";
@ -86,7 +86,6 @@ Please check your internet connection.";
"Common.Controls.Friendship.ShowReblogs" = "Show Reblogs";
"Common.Controls.Friendship.Unblock" = "Unblock";
"Common.Controls.Friendship.UnblockUser" = "Unblock %@";
"Common.Controls.Friendship.UnblockDomain" = "Unblock %@";
"Common.Controls.Friendship.Unmute" = "Unmute";
"Common.Controls.Friendship.UnmuteUser" = "Unmute %@";
"Common.Controls.Keyboard.Common.ComposeNewPost" = "Compose New Post";
@ -336,17 +335,18 @@ uploaded to Mastodon.";
"Scene.Profile.Fields.Verified.Long" = "Ownership of this link was checked on %@";
"Scene.Profile.Fields.Verified.Short" = "Verified on %@";
"Scene.Profile.Header.FollowsYou" = "Follows You";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Confirm to block domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Block domain";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Confirm to block %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Block Account";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Block Domain";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Confirm to unblock domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Unblock Domain";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "Confirm to hide reblogs";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Title" = "Hide Reblogs";
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Message" = "Confirm to mute %@";
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "Mute Account";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "Confirm to show reblogs";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "Show Reblogs";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Confirm to unblock domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Unblock domain";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "Confirm to unblock %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "Unblock Account";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "Confirm to unmute %@";
@ -568,4 +568,4 @@ uploaded to Mastodon.";
"Widget.MultipleFollowers.ConfigurationDescription" = "Show number of followers for multiple accounts.";
"Widget.MultipleFollowers.ConfigurationDisplayName" = "Multiple followers";
"Widget.MultipleFollowers.MockUser.AccountName" = "another@follower.social";
"Widget.MultipleFollowers.MockUser.DisplayName" = "Another follower";
"Widget.MultipleFollowers.MockUser.DisplayName" = "Another follower";

View File

@ -70,9 +70,10 @@
"Common.Controls.Actions.UnblockDomain" = "رفع الحظر عن %@";
"Common.Controls.Actions.Unfollow" = "ألغِ متابعة %@";
"Common.Controls.Friendship.Block" = "حظر";
"Common.Controls.Friendship.BlockDomain" = "حظر %@";
"Common.Controls.Friendship.BlockDomain" = "Block domain %@";
"Common.Controls.Friendship.BlockUser" = "حَظرُ %@";
"Common.Controls.Friendship.Blocked" = "محظور";
"Common.Controls.Friendship.DomainBlocked" = "Domain Blocked";
"Common.Controls.Friendship.EditInfo" = "تَحريرُ المَعلُومات";
"Common.Controls.Friendship.Follow" = "مُتابَعَة";
"Common.Controls.Friendship.Following" = "مُتابَع";
@ -334,6 +335,8 @@
"Scene.Profile.Fields.Verified.Long" = "تمَّ التَّحقق مِن مِلكية هذا الرابِطِ بِتاريخ %@";
"Scene.Profile.Fields.Verified.Short" = "تمَّ التَّحقق بِتاريخ %@";
"Scene.Profile.Header.FollowsYou" = "يُتابِعُك";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Confirm to block domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Block domain";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "تأكيدُ حَظر %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "حَظرُ الحِساب";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "التأكيد لِإخفاء إعادات التدوين";
@ -342,6 +345,8 @@
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "كَتمُ الحِساب";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "التأكيد لِإظهار إعادات التدوين";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "إظهار إعادات التدوين";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Confirm to unblock domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Unblock domain";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "تأكيدُ رَفع الحَظرِ عَن %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "رَفعُ الحَظرِ عَنِ الحِساب";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "أكِّد لرفع الكتمْ عن %@";

View File

@ -70,9 +70,10 @@
"Common.Controls.Actions.UnblockDomain" = "Разблакіраваць %@";
"Common.Controls.Actions.Unfollow" = "Адпісацца ад %@";
"Common.Controls.Friendship.Block" = "Заблакіраваць";
"Common.Controls.Friendship.BlockDomain" = "Заблакіраваць %@";
"Common.Controls.Friendship.BlockDomain" = "Заблакіраваць дамен %@";
"Common.Controls.Friendship.BlockUser" = "Заблакіраваць %@";
"Common.Controls.Friendship.Blocked" = "Заблакіраваны";
"Common.Controls.Friendship.DomainBlocked" = "Дамен заблакіраваны";
"Common.Controls.Friendship.EditInfo" = "Рэдагаваць інфармацыю";
"Common.Controls.Friendship.Follow" = "Падпісацца";
"Common.Controls.Friendship.Following" = "Падпісаны";
@ -334,6 +335,8 @@
"Scene.Profile.Fields.Verified.Long" = "Права ўласнасці на гэтую спасылку праверана %@";
"Scene.Profile.Fields.Verified.Short" = "Спраўджана %@";
"Scene.Profile.Header.FollowsYou" = "Падпісаны(-а) на вас";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Заблакіраваць дамен %@?";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Заблакіраваць дамен";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Заблакіраваць %@?";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Заблакіраваць уліковы запіс";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "Пацвердзіце, каб схаваць пашырэнні";
@ -342,6 +345,8 @@
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "Ігнараваць уліковы запіс";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "Пацвердзіце, каб паказаць пашырэнні";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "Паказаць пашырэнні";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Разблакіраваць дамен %@?";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Разблакіраваць дамен";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "Разблакіраваць %@?";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "Разблакіраваць уліковы запіс";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "Не ігнараваць %@?";

View File

@ -70,9 +70,10 @@ Comprova la connexió a Internet.";
"Common.Controls.Actions.UnblockDomain" = "Desbloca %@";
"Common.Controls.Actions.Unfollow" = "Deixa de seguir %@";
"Common.Controls.Friendship.Block" = "Bloca";
"Common.Controls.Friendship.BlockDomain" = "Bloca %@";
"Common.Controls.Friendship.BlockDomain" = "Block domain %@";
"Common.Controls.Friendship.BlockUser" = "Bloca %@";
"Common.Controls.Friendship.Blocked" = "Blocat";
"Common.Controls.Friendship.DomainBlocked" = "Domain Blocked";
"Common.Controls.Friendship.EditInfo" = "Edita";
"Common.Controls.Friendship.Follow" = "Segueix";
"Common.Controls.Friendship.Following" = "Seguint";
@ -334,6 +335,8 @@ carregat a Mastodon.";
"Scene.Profile.Fields.Verified.Long" = "La propietat d'aquest enllaç es va verificar el dia %@";
"Scene.Profile.Fields.Verified.Short" = "Verificat a %@";
"Scene.Profile.Header.FollowsYou" = "Et segueix";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Confirm to block domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Block domain";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Confirma per a blocar %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Bloca el Compte";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "Confirma per a amagar els impulsos";
@ -342,6 +345,8 @@ carregat a Mastodon.";
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "Silencia el Compte";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "Confirma per a mostrar els impulsos";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "Mostra els Impulsos";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Confirm to unblock domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Unblock domain";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "Confirma per a desblocar %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "Desbloca el Compte";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "Confirma deixar de silenciar a %@";

View File

@ -70,9 +70,10 @@
"Common.Controls.Actions.UnblockDomain" = "%@ ئاستەنگ مەکە";
"Common.Controls.Actions.Unfollow" = "Unfollow %@";
"Common.Controls.Friendship.Block" = "ئاستەنگی بکە";
"Common.Controls.Friendship.BlockDomain" = "%@ ئاستەنگ بکە";
"Common.Controls.Friendship.BlockDomain" = "Block domain %@";
"Common.Controls.Friendship.BlockUser" = "%@ ئاستەنگ بکە";
"Common.Controls.Friendship.Blocked" = "ئاستەنگ کراوە";
"Common.Controls.Friendship.DomainBlocked" = "Domain Blocked";
"Common.Controls.Friendship.EditInfo" = "دەستکاری";
"Common.Controls.Friendship.Follow" = "شوێنی بکەوە";
"Common.Controls.Friendship.Following" = "شوێنی دەکەویت";
@ -333,6 +334,8 @@
"Scene.Profile.Fields.Verified.Long" = "Ownership of this link was checked on %@";
"Scene.Profile.Fields.Verified.Short" = "Verified on %@";
"Scene.Profile.Header.FollowsYou" = "Follows You";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Confirm to block domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Block domain";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "دڵنیا ببەوە بۆ ئاستەنگکردنی %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "ئاستەنگی بکە";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "Confirm to hide reblogs";
@ -341,6 +344,8 @@
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "بێدەنگی بکە";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "Confirm to show reblogs";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "Show Reblogs";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Confirm to unblock domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Unblock domain";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "دڵنیا ببەوە بۆ لابردنی ئاستەنگی %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "ئاستەنگی مەکە";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "دڵنیا ببەوە بۆ بێدەنگنەکردنی %@";

View File

@ -70,9 +70,10 @@ Zkontrolujte prosím připojení k internetu.";
"Common.Controls.Actions.UnblockDomain" = "Odblokovat %@";
"Common.Controls.Actions.Unfollow" = "Přestat sledovat %@";
"Common.Controls.Friendship.Block" = "Blokovat";
"Common.Controls.Friendship.BlockDomain" = "Blokovat %@";
"Common.Controls.Friendship.BlockDomain" = "Block domain %@";
"Common.Controls.Friendship.BlockUser" = "Blokovat %@";
"Common.Controls.Friendship.Blocked" = "Blokovaný";
"Common.Controls.Friendship.DomainBlocked" = "Domain Blocked";
"Common.Controls.Friendship.EditInfo" = "Upravit informace";
"Common.Controls.Friendship.Follow" = "Sledovat";
"Common.Controls.Friendship.Following" = "Sleduji";
@ -330,6 +331,8 @@ nahrán do Mastodonu.";
"Scene.Profile.Fields.Verified.Long" = "Vlastnictví tohoto odkazu bylo zkontrolováno na %@";
"Scene.Profile.Fields.Verified.Short" = "Ověřeno na %@";
"Scene.Profile.Header.FollowsYou" = "Sleduje vás";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Confirm to block domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Block domain";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Potvrdit blokování %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Blokovat účet";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "Potvrďte skrytí reblogů";
@ -338,6 +341,8 @@ nahrán do Mastodonu.";
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "Skrýt účet";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "Potvrdit zobrazení reblogů";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "Zobrazit Reblogy";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Confirm to unblock domain %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Unblock domain";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "Potvrďte odblokování %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "Odblokovat účet";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "Potvrďte zrušení ztlumení %@";

View File

@ -70,9 +70,10 @@ Bitte überprüfe deine Internetverbindung.";
"Common.Controls.Actions.UnblockDomain" = "Blockierung von %@ aufheben";
"Common.Controls.Actions.Unfollow" = "%@ entfolgen";
"Common.Controls.Friendship.Block" = "Blockieren";
"Common.Controls.Friendship.BlockDomain" = "%@ blockieren";
"Common.Controls.Friendship.BlockDomain" = "Domain %@ sperren";
"Common.Controls.Friendship.BlockUser" = "%@ blockieren";
"Common.Controls.Friendship.Blocked" = "Blockiert";
"Common.Controls.Friendship.DomainBlocked" = "Domain gesperrt";
"Common.Controls.Friendship.EditInfo" = "Information bearbeiten";
"Common.Controls.Friendship.Follow" = "Folgen";
"Common.Controls.Friendship.Following" = "Gefolgt";
@ -223,19 +224,19 @@ kann nicht auf Mastodon hochgeladen werden.";
"Scene.Compose.Keyboard.TogglePoll" = "Umfrage umschalten";
"Scene.Compose.Language.Other" = "Andere Sprache…";
"Scene.Compose.Language.Recent" = "Kürzlich";
"Scene.Compose.Language.Suggested" = "Suggested";
"Scene.Compose.Language.Suggested" = "Empfohlen";
"Scene.Compose.Language.Title" = "Beitragssprache";
"Scene.Compose.MediaSelection.Browse" = "Durchsuchen";
"Scene.Compose.MediaSelection.Camera" = "Foto aufnehmen";
"Scene.Compose.MediaSelection.PhotoLibrary" = "Fotobibliothek";
"Scene.Compose.Poll.AddOption" = "Add Option";
"Scene.Compose.Poll.AddOption" = "Option hinzufügen";
"Scene.Compose.Poll.DurationTime" = "Dauer: %@";
"Scene.Compose.Poll.MoveDown" = "Nach unten";
"Scene.Compose.Poll.MoveUp" = "Nach oben";
"Scene.Compose.Poll.OneDay" = "1 Tag";
"Scene.Compose.Poll.OneHour" = "1 Stunde";
"Scene.Compose.Poll.OptionNumber" = "Auswahlmöglichkeit %ld";
"Scene.Compose.Poll.RemoveOption" = "Remove Option";
"Scene.Compose.Poll.RemoveOption" = "Option entfernen";
"Scene.Compose.Poll.SevenDays" = "7 Tage";
"Scene.Compose.Poll.SixHours" = "6 Stunden";
"Scene.Compose.Poll.ThePollHasEmptyOption" = "Die Umfrage hat eine leere Option";
@ -334,6 +335,8 @@ kann nicht auf Mastodon hochgeladen werden.";
"Scene.Profile.Fields.Verified.Long" = "Besitz des Links wurde überprüft am %@";
"Scene.Profile.Fields.Verified.Short" = "Überprüft am %@";
"Scene.Profile.Header.FollowsYou" = "Folgt dir";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Bestätigen, um die Domain %@ zu sperren";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Domain sperren";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Bestätige %@ zu blockieren";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Konto blockieren";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "Bestätigen, um Teilen auszublenden";
@ -342,6 +345,8 @@ kann nicht auf Mastodon hochgeladen werden.";
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "Konto stummschalten";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "Bestätigen, um Teilen anzuzeigen";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "Teilen anzeigen";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Bestätigen, um die Sperre der Domäne %@ aufzuheben";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Domain entsperren";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "Bestätige %@ zu entsperren";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "Konto entsperren";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "Bestätige um %@ nicht mehr stummzuschalten";
@ -443,8 +448,8 @@ kann nicht auf Mastodon hochgeladen werden.";
"Scene.Search.Searching.ClearAll" = "Alles löschen";
"Scene.Search.Searching.EmptyState.NoResults" = "Keine Ergebnisse";
"Scene.Search.Searching.Hashtag" = "Wechseln zu #%@";
"Scene.Search.Searching.NoUser.Message" = "There's no Useraccount \"%@\" on %@";
"Scene.Search.Searching.NoUser.Title" = "No User Account Found";
"Scene.Search.Searching.NoUser.Message" = "Es gibt kein Benutzerkonto „%@” auf %@";
"Scene.Search.Searching.NoUser.Title" = "Kein Benutzerkonto gefunden";
"Scene.Search.Searching.People" = "People matching \"%@\"";
"Scene.Search.Searching.Posts" = "Posts matching \"%@\"";
"Scene.Search.Searching.Profile" = "Go to @%@@%@";
@ -490,37 +495,37 @@ kann nicht auf Mastodon hochgeladen werden.";
"Scene.ServerRules.TermsOfService" = "Nutzungsbedingungen";
"Scene.ServerRules.Title" = "Einige Grundregeln.";
"Scene.Settings.AboutMastodon.ClearMediaStorage" = "Clear Media Storage";
"Scene.Settings.AboutMastodon.ContributeToMastodon" = "Contribute to Mastodon";
"Scene.Settings.AboutMastodon.ContributeToMastodon" = "Zu Mastodon beitragen";
"Scene.Settings.AboutMastodon.MoreSettings" = "Noch mehr Einstellungen";
"Scene.Settings.AboutMastodon.PrivacyPolicy" = "Datenschutzerklärung";
"Scene.Settings.AboutMastodon.Title" = "Über";
"Scene.Settings.General.Appearance.Dark" = "Dark";
"Scene.Settings.General.Appearance.Light" = "Light";
"Scene.Settings.General.Appearance.SectionTitle" = "Appearance";
"Scene.Settings.General.Appearance.System" = "Use Device Appearance";
"Scene.Settings.General.Appearance.Dark" = "Dunkel";
"Scene.Settings.General.Appearance.Light" = "Hell";
"Scene.Settings.General.Appearance.SectionTitle" = "Farbschema";
"Scene.Settings.General.Appearance.System" = "Einstellungen des Geräts übernehmen";
"Scene.Settings.General.Design.SectionTitle" = "Design";
"Scene.Settings.General.Design.ShowAnimations" = "Play Animated Avatars and Emoji";
"Scene.Settings.General.Links.OpenInBrowser" = "Open in Browser";
"Scene.Settings.General.Links.OpenInMastodon" = "Open in Mastodon";
"Scene.Settings.General.Links.OpenInBrowser" = "Im Browser öffnen";
"Scene.Settings.General.Links.OpenInMastodon" = "In Mastodon öffnen";
"Scene.Settings.General.Links.SectionTitle" = "Links";
"Scene.Settings.General.Title" = "General";
"Scene.Settings.General.Title" = "Allgemein";
"Scene.Settings.Notifications.Alert.Boosts" = "Boosts";
"Scene.Settings.Notifications.Alert.Favorites" = "Favorites";
"Scene.Settings.Notifications.Alert.MentionsAndReplies" = "Mentions & Replies";
"Scene.Settings.Notifications.Alert.NewFollowers" = "New Followers";
"Scene.Settings.Notifications.Disabled.GoToSettings" = "Go to Notification Settings";
"Scene.Settings.Notifications.Disabled.NotificationHint" = "Turn on notifications from your device settings to see updates on your lock screen.";
"Scene.Settings.Notifications.Policy.Anyone" = "Anyone";
"Scene.Settings.Notifications.Policy.Anyone" = "Jeder";
"Scene.Settings.Notifications.Policy.Follow" = "People you follow";
"Scene.Settings.Notifications.Policy.Followers" = "People who follow you";
"Scene.Settings.Notifications.Policy.Noone" = "No one";
"Scene.Settings.Notifications.Policy.Title" = "Get Notifications from";
"Scene.Settings.Notifications.Title" = "Notifications";
"Scene.Settings.Overview.AboutMastodon" = "About Mastodon";
"Scene.Settings.Overview.General" = "General";
"Scene.Settings.Overview.Logout" = "Logout %@";
"Scene.Settings.Overview.Notifications" = "Notifications";
"Scene.Settings.Overview.ServerDetails" = "Server Details";
"Scene.Settings.Notifications.Policy.Noone" = "Niemand";
"Scene.Settings.Notifications.Policy.Title" = "Mitteilungen erhalten von";
"Scene.Settings.Notifications.Title" = "Mitteilungen";
"Scene.Settings.Overview.AboutMastodon" = "Über Mastodon";
"Scene.Settings.Overview.General" = "Allgemein";
"Scene.Settings.Overview.Logout" = "%@ abmelden";
"Scene.Settings.Overview.Notifications" = "Benachrichtigungen";
"Scene.Settings.Overview.ServerDetails" = "Serverdetails";
"Scene.Settings.Overview.SupportMastodon" = "Mastodon unterstützen";
"Scene.Settings.Overview.Title" = "Einstellungen";
"Scene.Settings.ServerDetails.About" = "Über";

View File

@ -70,9 +70,10 @@
"Common.Controls.Actions.UnblockDomain" = "Άρση αποκλεισμού %@";
"Common.Controls.Actions.Unfollow" = "Κατάργηση ακολούθησης του %@";
"Common.Controls.Friendship.Block" = "Αποκλεισμός";
"Common.Controls.Friendship.BlockDomain" = "Αποκλεισμός %@";
"Common.Controls.Friendship.BlockDomain" = "Αποκλεισμός τομέα %@";
"Common.Controls.Friendship.BlockUser" = "Αποκλεισμός %@";
"Common.Controls.Friendship.Blocked" = "Αποκλείστηκε";
"Common.Controls.Friendship.DomainBlocked" = "Ο Τομέας αποκλείστηκε";
"Common.Controls.Friendship.EditInfo" = "Επεξεργασία Πληροφοριών";
"Common.Controls.Friendship.Follow" = "Ακολούθησε";
"Common.Controls.Friendship.Following" = "Ακολουθείς";
@ -334,6 +335,8 @@
"Scene.Profile.Fields.Verified.Long" = "Η ιδιοκτησία αυτού του συνδέσμου ελέχθηκε στις %@";
"Scene.Profile.Fields.Verified.Short" = "Επαληθεύτηκε στις %@";
"Scene.Profile.Header.FollowsYou" = "Σε Ακολουθεί";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Message" = "Επιβεβαίωση αποκλεισμού τομέα %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockDomain.Title" = "Αποκλεισμός τομέα";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Message" = "Επιβεβαίωση αποκλεισμού %@";
"Scene.Profile.RelationshipActionAlert.ConfirmBlockUser.Title" = "Αποκλεισμός Λογαριασμού";
"Scene.Profile.RelationshipActionAlert.ConfirmHideReblogs.Message" = "Επιβεβαίωση απόκρυψης αναδημοσιεύσεων";
@ -342,6 +345,8 @@
"Scene.Profile.RelationshipActionAlert.ConfirmMuteUser.Title" = "Σίγαση Λογαριασμού";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Message" = "Επιβεβαίωση εμφάνισης αναδημοσιεύσεων";
"Scene.Profile.RelationshipActionAlert.ConfirmShowReblogs.Title" = "Εμφάνιση Αναδημοσιεύσεων";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Message" = "Επιβεβαίωση άρσης αποκλεισμού τομέα %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockDomain.Title" = "Άρση αποκλεισμού τομέα";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Message" = "Επιβεβαίωση άρσης αποκλεισμού %@";
"Scene.Profile.RelationshipActionAlert.ConfirmUnblockUser.Title" = "Άρση Αποκλεισμού Λογαριασμού";
"Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.Message" = "Επιβεβαίωσε για άρση σίγασης %@";
@ -443,8 +448,8 @@
"Scene.Search.Searching.ClearAll" = "Εκκαθάριση όλων";
"Scene.Search.Searching.EmptyState.NoResults" = "Κανένα αποτέλεσμα";
"Scene.Search.Searching.Hashtag" = "Μετάβαση στο #%@";
"Scene.Search.Searching.NoUser.Message" = "There's no Useraccount \"%@\" on %@";
"Scene.Search.Searching.NoUser.Title" = "No User Account Found";
"Scene.Search.Searching.NoUser.Message" = "Δεν υπάρχει λογαριασμός χρήστη \"%@\" στο %@";
"Scene.Search.Searching.NoUser.Title" = "Δεν Βρέθηκε Λογαριασμός Χρήστη";
"Scene.Search.Searching.People" = "Άτομα που ταιριάζουν με «%@»";
"Scene.Search.Searching.Posts" = "Αναρτήσεις που ταιριάζουν με «%@»";
"Scene.Search.Searching.Profile" = "Μετάβαση στο @%@@%@";
@ -489,45 +494,45 @@
"Scene.ServerRules.Subtitle" = "Αυτά ορίζονται και επιβάλλονται από τους συντονιστές %@.";
"Scene.ServerRules.TermsOfService" = "όροι υπηρεσίας";
"Scene.ServerRules.Title" = "Ορισμένοι βασικοί κανόνες.";
"Scene.Settings.AboutMastodon.ClearMediaStorage" = "Clear Media Storage";
"Scene.Settings.AboutMastodon.ContributeToMastodon" = "Contribute to Mastodon";
"Scene.Settings.AboutMastodon.MoreSettings" = "Even More Settings";
"Scene.Settings.AboutMastodon.PrivacyPolicy" = "Privacy Policy";
"Scene.Settings.AboutMastodon.Title" = "About";
"Scene.Settings.General.Appearance.Dark" = "Dark";
"Scene.Settings.General.Appearance.Light" = "Light";
"Scene.Settings.General.Appearance.SectionTitle" = "Appearance";
"Scene.Settings.General.Appearance.System" = "Use Device Appearance";
"Scene.Settings.General.Design.SectionTitle" = "Design";
"Scene.Settings.General.Design.ShowAnimations" = "Play Animated Avatars and Emoji";
"Scene.Settings.General.Links.OpenInBrowser" = "Open in Browser";
"Scene.Settings.General.Links.OpenInMastodon" = "Open in Mastodon";
"Scene.Settings.General.Links.SectionTitle" = "Links";
"Scene.Settings.General.Title" = "General";
"Scene.Settings.Notifications.Alert.Boosts" = "Boosts";
"Scene.Settings.Notifications.Alert.Favorites" = "Favorites";
"Scene.Settings.Notifications.Alert.MentionsAndReplies" = "Mentions & Replies";
"Scene.Settings.Notifications.Alert.NewFollowers" = "New Followers";
"Scene.Settings.Notifications.Disabled.GoToSettings" = "Go to Notification Settings";
"Scene.Settings.Notifications.Disabled.NotificationHint" = "Turn on notifications from your device settings to see updates on your lock screen.";
"Scene.Settings.Notifications.Policy.Anyone" = "Anyone";
"Scene.Settings.Notifications.Policy.Follow" = "People you follow";
"Scene.Settings.Notifications.Policy.Followers" = "People who follow you";
"Scene.Settings.Notifications.Policy.Noone" = "No one";
"Scene.Settings.Notifications.Policy.Title" = "Get Notifications from";
"Scene.Settings.Notifications.Title" = "Notifications";
"Scene.Settings.Overview.AboutMastodon" = "About Mastodon";
"Scene.Settings.Overview.General" = "General";
"Scene.Settings.Overview.Logout" = "Logout %@";
"Scene.Settings.Overview.Notifications" = "Notifications";
"Scene.Settings.Overview.ServerDetails" = "Server Details";
"Scene.Settings.Overview.SupportMastodon" = "Support Mastodon";
"Scene.Settings.Overview.Title" = "Settings";
"Scene.Settings.ServerDetails.About" = "About";
"Scene.Settings.ServerDetails.AboutInstance.LegalNotice" = "A legal notice";
"Scene.Settings.ServerDetails.AboutInstance.MessageAdmin" = "Message Admin";
"Scene.Settings.ServerDetails.AboutInstance.Title" = "Administrator";
"Scene.Settings.ServerDetails.Rules" = "Rules";
"Scene.Settings.AboutMastodon.ClearMediaStorage" = "Εκκαθάριση Χώρου Αποθήκευσης Πολυμέσων";
"Scene.Settings.AboutMastodon.ContributeToMastodon" = "Συνείσφερε στο Mastodon";
"Scene.Settings.AboutMastodon.MoreSettings" = "Ακόμα Περισσότερες Ρυθμίσεις";
"Scene.Settings.AboutMastodon.PrivacyPolicy" = "Πολιτική Απορρήτου";
"Scene.Settings.AboutMastodon.Title" = "Σχετικά";
"Scene.Settings.General.Appearance.Dark" = "Σκοτεινό";
"Scene.Settings.General.Appearance.Light" = "Φωτεινό";
"Scene.Settings.General.Appearance.SectionTitle" = "Εμφάνιση";
"Scene.Settings.General.Appearance.System" = "Χρήση Εμφάνισης Συσκευής";
"Scene.Settings.General.Design.SectionTitle" = "Σχεδίαση";
"Scene.Settings.General.Design.ShowAnimations" = "Αναπαραγωγή κινούμενων Avatars και Emoji";
"Scene.Settings.General.Links.OpenInBrowser" = "Άνοιγμα στον Περιηγητή";
"Scene.Settings.General.Links.OpenInMastodon" = "Άνοιγμα στο Mastodon";
"Scene.Settings.General.Links.SectionTitle" = "Σύνδεσμοι";
"Scene.Settings.General.Title" = "Γενικά";
"Scene.Settings.Notifications.Alert.Boosts" = "Ενισχύσεις";
"Scene.Settings.Notifications.Alert.Favorites" = "Αγαπημένα";
"Scene.Settings.Notifications.Alert.MentionsAndReplies" = "Αναφορές & Απαντήσεις";
"Scene.Settings.Notifications.Alert.NewFollowers" = "Νέοι Ακόλουθοι";
"Scene.Settings.Notifications.Disabled.GoToSettings" = "Μετάβαση στις Ρυθμίσεις Ειδοποιήσεων";
"Scene.Settings.Notifications.Disabled.NotificationHint" = "Ενεργοποίησε τις ειδοποιήσεις από τις ρυθμίσεις της συσκευής σου για να βλέπεις ενημερώσεις στην οθόνη κλειδώματος.";
"Scene.Settings.Notifications.Policy.Anyone" = "Οποιοσδήποτε";
"Scene.Settings.Notifications.Policy.Follow" = "Άτομα που ακολουθείς";
"Scene.Settings.Notifications.Policy.Followers" = "Άτομα που σε ακολουθούν";
"Scene.Settings.Notifications.Policy.Noone" = "Κανένας";
"Scene.Settings.Notifications.Policy.Title" = "Λήψη Ειδοποιήσεων από";
"Scene.Settings.Notifications.Title" = "Ειδοποιήσεις";
"Scene.Settings.Overview.AboutMastodon" = "Σχετικά με το Mastodon";
"Scene.Settings.Overview.General" = "Γενικά";
"Scene.Settings.Overview.Logout" = "Αποσύνδεση %@";
"Scene.Settings.Overview.Notifications" = "Ειδοποιήσεις";
"Scene.Settings.Overview.ServerDetails" = "Λεπτομέρειες Διακομιστή";
"Scene.Settings.Overview.SupportMastodon" = "Υποστήριξε το Mastodon";
"Scene.Settings.Overview.Title" = "Ρυθμίσεις";
"Scene.Settings.ServerDetails.About" = "Σχετικά";
"Scene.Settings.ServerDetails.AboutInstance.LegalNotice" = "Μια νομική ειδοποίηση";
"Scene.Settings.ServerDetails.AboutInstance.MessageAdmin" = "Στείλε μήνυμα σε διαχειριστή";
"Scene.Settings.ServerDetails.AboutInstance.Title" = "Διαχειριστής";
"Scene.Settings.ServerDetails.Rules" = "Κανόνες";
"Scene.SuggestionAccount.FollowAll" = "Ακολούθησε τους όλους";
"Scene.SuggestionAccount.Title" = "Δημοφιλή στο Mastodon";
"Scene.Thread.BackTitle" = "Ανάρτηση";

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