damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 393809c7d7714c917da1f18185e0a7265b0d3ff4
parent 9091cb1aae43633673794009bdc576faddc6ed35
Author: William Casarin <jb55@jb55.com>
Date:   Fri, 17 Mar 2023 08:01:43 -0600

Merge remote-tracking branch 'github/translations'

Diffstat:
Mdamus.xcodeproj/project.pbxproj | 35+++++++++++++++++++++--------------
Mdamus/Models/Mentions.swift | 4++--
Mdamus/Util/LocalizationUtil.swift | 6++++++
Mdamus/Views/ActionBar/EventDetailBar.swift | 12++++++------
Mdamus/Views/ActionBar/ShareAction.swift | 14+++++++-------
Mdamus/Views/ConfigView.swift | 2+-
Mdamus/Views/Events/EventMenu.swift | 4++--
Mdamus/Views/Events/ReplyDescription.swift | 2+-
Mdamus/Views/Events/TextEvent.swift | 2+-
Mdamus/Views/Notifications/EventGroupView.swift | 14++++++++------
Mdamus/Views/ProfileView.swift | 12++++++------
Mdamus/ar.lproj/Localizable.strings | 0
Mdamus/de.lproj/Localizable.strings | 0
Mdamus/de.lproj/Localizable.stringsdict | 16++++++++++++++++
Mdamus/en-US.xcloc/Localized Contents/en-US.xliff | 64+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mdamus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings | 0
Adamus/fr-CA.lproj/InfoPlist.strings | 0
Adamus/fr-CA.lproj/Localizable.strings | 0
Adamus/fr-CA.lproj/Localizable.stringsdict | 330+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdamus/fr-FR.lproj/Localizable.strings | 0
Rdamus/hu_HU.lproj/InfoPlist.strings -> damus/hu-HU.lproj/InfoPlist.strings | 0
Adamus/hu-HU.lproj/Localizable.strings | 0
Rdamus/hu_HU.lproj/Localizable.stringsdict -> damus/hu-HU.lproj/Localizable.stringsdict | 0
Ddamus/hu_HU.lproj/Localizable.strings | 0
Mdamus/ja.lproj/Localizable.strings | 0
Mdamus/nl.lproj/Localizable.strings | 0
Mdamus/pl-PL.lproj/Localizable.stringsdict | 16++++++++--------
Rdamus/sv_SE.lproj/InfoPlist.strings -> damus/sv-SE.lproj/InfoPlist.strings | 0
Adamus/sv-SE.lproj/Localizable.strings | 0
Rdamus/sv_SE.lproj/Localizable.stringsdict -> damus/sv-SE.lproj/Localizable.stringsdict | 0
Ddamus/sv_SE.lproj/Localizable.strings | 0
Mtransifex.yml | 239++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
32 files changed, 715 insertions(+), 57 deletions(-)

diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -307,9 +307,6 @@ 3A66D927299472FA008B44F4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 3A66D928299472FA008B44F4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; }; 3A66D929299472FA008B44F4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ja; path = ja.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; - 3A7D373429C2056500449FD0 /* hu_HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu_HU; path = hu_HU.lproj/InfoPlist.strings; sourceTree = "<group>"; }; - 3A7D373529C2056500449FD0 /* hu_HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = hu_HU; path = hu_HU.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; - 3A7D373629C2056500449FD0 /* hu_HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu_HU; path = hu_HU.lproj/Localizable.strings; sourceTree = "<group>"; }; 3A827A18299FC69D00C4D171 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 3A827A19299FC69D00C4D171 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; }; 3A827A1A299FC69D00C4D171 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ru; path = ru.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; @@ -347,12 +344,18 @@ 3ACB685B297633BC00C46468 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; 3ACB685E297633BC00C46468 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = "<group>"; }; 3ACBCB77295FE5C70037388A /* TimeAgoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeAgoTests.swift; sourceTree = "<group>"; }; + 3AD14EB529C40F38009D2D9C /* hu-HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "hu-HU"; path = "hu-HU.lproj/Localizable.stringsdict"; sourceTree = "<group>"; }; + 3AD14EB629C40F38009D2D9C /* hu-HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hu-HU"; path = "hu-HU.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; + 3AD14EB729C40F38009D2D9C /* hu-HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hu-HU"; path = "hu-HU.lproj/Localizable.strings"; sourceTree = "<group>"; }; + 3AD14EB829C40F3F009D2D9C /* sv-SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "sv-SE"; path = "sv-SE.lproj/Localizable.stringsdict"; sourceTree = "<group>"; }; + 3AD14EB929C40F3F009D2D9C /* sv-SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sv-SE"; path = "sv-SE.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; + 3AD14EBA29C40F3F009D2D9C /* sv-SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sv-SE"; path = "sv-SE.lproj/Localizable.strings"; sourceTree = "<group>"; }; + 3AD14EBB29C40F47009D2D9C /* fr-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-CA"; path = "fr-CA.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; + 3AD14EBC29C40F47009D2D9C /* fr-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "fr-CA"; path = "fr-CA.lproj/Localizable.stringsdict"; sourceTree = "<group>"; }; + 3AD14EBD29C40F47009D2D9C /* fr-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-CA"; path = "fr-CA.lproj/Localizable.strings"; sourceTree = "<group>"; }; 3AD5662B29BD2F5300BF77C5 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 3AD5662C29BD2F5300BF77C5 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fa; path = fa.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 3AD5662D29BD2F5300BF77C5 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = "<group>"; }; - 3AD5662E29C0DA4000BF77C5 /* sv_SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv_SE; path = sv_SE.lproj/InfoPlist.strings; sourceTree = "<group>"; }; - 3AD5662F29C0DA4000BF77C5 /* sv_SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv_SE; path = sv_SE.lproj/Localizable.strings; sourceTree = "<group>"; }; - 3AD5663029C0DA4000BF77C5 /* sv_SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sv_SE; path = sv_SE.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 3AD5663129C0DA4B00BF77C5 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = "<group>"; }; 3AD5663229C0DA4B00BF77C5 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ko; path = ko.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 3AD5663329C0DA4B00BF77C5 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = "<group>"; }; @@ -1305,9 +1308,10 @@ uk, bg, fa, - sv_SE, ko, - hu_HU, + "hu-HU", + "sv-SE", + "fr-CA", ); mainGroup = 4CE6DEDA27F7A08100C66700; packageReferences = ( @@ -1654,9 +1658,10 @@ 3AA5E70429B682B3002701ED /* uk */, 3AA5E70729B9E84A002701ED /* bg */, 3AD5662C29BD2F5300BF77C5 /* fa */, - 3AD5663029C0DA4000BF77C5 /* sv_SE */, 3AD5663229C0DA4B00BF77C5 /* ko */, - 3A7D373529C2056500449FD0 /* hu_HU */, + 3AD14EB529C40F38009D2D9C /* hu-HU */, + 3AD14EB829C40F3F009D2D9C /* sv-SE */, + 3AD14EBC29C40F47009D2D9C /* fr-CA */, ); name = Localizable.stringsdict; sourceTree = "<group>"; @@ -1685,9 +1690,10 @@ 3AA5E70329B682AD002701ED /* uk */, 3AA5E70529B9E83E002701ED /* bg */, 3AD5662B29BD2F5300BF77C5 /* fa */, - 3AD5662E29C0DA4000BF77C5 /* sv_SE */, 3AD5663329C0DA4B00BF77C5 /* ko */, - 3A7D373429C2056500449FD0 /* hu_HU */, + 3AD14EB629C40F38009D2D9C /* hu-HU */, + 3AD14EB929C40F3F009D2D9C /* sv-SE */, + 3AD14EBB29C40F47009D2D9C /* fr-CA */, ); name = InfoPlist.strings; sourceTree = "<group>"; @@ -1717,9 +1723,10 @@ 3AA5E70229B682A5002701ED /* uk */, 3AA5E70629B9E844002701ED /* bg */, 3AD5662D29BD2F5300BF77C5 /* fa */, - 3AD5662F29C0DA4000BF77C5 /* sv_SE */, 3AD5663129C0DA4B00BF77C5 /* ko */, - 3A7D373629C2056500449FD0 /* hu_HU */, + 3AD14EB729C40F38009D2D9C /* hu-HU */, + 3AD14EBA29C40F3F009D2D9C /* sv-SE */, + 3AD14EBD29C40F47009D2D9C /* fr-CA */, ); name = Localizable.strings; sourceTree = "<group>"; diff --git a/damus/Models/Mentions.swift b/damus/Models/Mentions.swift @@ -274,8 +274,8 @@ func format_msats(_ msat: Int64, locale: Locale = Locale.current) -> String { let sats = NSNumber(value: (Double(msat) / 1000.0)) let formattedSats = numberFormatter.string(from: sats) ?? sats.stringValue - let bundle = bundleForLocale(locale: locale) - return String(format: bundle.localizedString(forKey: "sats_count", value: nil, table: nil), locale: locale, sats.decimalValue as NSDecimalNumber, formattedSats) + let format = localizedStringFormat(key: "sats_count", locale: locale) + return String(format: format, locale: locale, sats.decimalValue as NSDecimalNumber, formattedSats) } func convert_invoice_block(_ b: invoice_block) -> Block? { diff --git a/damus/Util/LocalizationUtil.swift b/damus/Util/LocalizationUtil.swift @@ -15,3 +15,9 @@ func bundleForLocale(locale: Locale?) -> Bundle { let path = Bundle.main.path(forResource: locale!.identifier, ofType: "lproj") return path != nil ? (Bundle(path: path!) ?? Bundle.main) : Bundle.main } + +func localizedStringFormat(key: String, locale: Locale?) -> String { + let bundle = bundleForLocale(locale: locale) + let fallback = bundleForLocale(locale: Locale(identifier: "en-US")).localizedString(forKey: key, value: nil, table: nil) + return bundle.localizedString(forKey: key, value: fallback, table: nil) +} diff --git a/damus/Views/ActionBar/EventDetailBar.swift b/damus/Views/ActionBar/EventDetailBar.swift @@ -53,18 +53,18 @@ struct EventDetailBar: View { } func repostsCountString(_ count: Int, locale: Locale = Locale.current) -> String { - let bundle = bundleForLocale(locale: locale) - return String(format: bundle.localizedString(forKey: "reposts_count", value: nil, table: nil), locale: locale, count) + let format = localizedStringFormat(key: "reposts_count", locale: locale) + return String(format: format, locale: locale, count) } func reactionsCountString(_ count: Int, locale: Locale = Locale.current) -> String { - let bundle = bundleForLocale(locale: locale) - return String(format: bundle.localizedString(forKey: "reactions_count", value: nil, table: nil), locale: locale, count) + let format = localizedStringFormat(key: "reactions_count", locale: locale) + return String(format: format, locale: locale, count) } func zapsCountString(_ count: Int, locale: Locale = Locale.current) -> String { - let bundle = bundleForLocale(locale: locale) - return String(format: bundle.localizedString(forKey: "zaps_count", value: nil, table: nil), locale: locale, count) + let format = localizedStringFormat(key: "zaps_count", locale: locale) + return String(format: format, locale: locale, count) } struct EventDetailBar_Previews: PreviewProvider { diff --git a/damus/Views/ActionBar/ShareAction.swift b/damus/Views/ActionBar/ShareAction.swift @@ -32,7 +32,7 @@ struct ShareAction: View { let col = colorScheme == .light ? Color("DamusMediumGrey") : Color("DamusWhite") VStack { - Text("Share Note") + Text("Share Note", comment: "Title text to indicate that the buttons below are meant to be used to share a note with others.") .padding() .font(.system(size: 17, weight: .bold)) @@ -40,7 +40,7 @@ struct ShareAction: View { HStack(alignment: .top, spacing: 25) { - ShareActionButton(img: "link", txt: "Copy Link", comment: "Button to copy link to note", col: col) { + ShareActionButton(img: "link", text: NSLocalizedString("Copy Link", comment: "Button to copy link to note"), col: col) { show_share_action = false UIPasteboard.general.string = "https://damus.io/" + (bech32_note_id(event.id) ?? event.id) } @@ -48,18 +48,18 @@ struct ShareAction: View { let bookmarkImg = isBookmarked ? "bookmark.slash" : "bookmark" let bookmarkTxt = isBookmarked ? "Remove\nBookmark" : "Bookmark" let boomarkCol = isBookmarked ? Color(.red) : col - ShareActionButton(img: bookmarkImg, txt: bookmarkTxt, comment: "Button to bookmark to note", col: boomarkCol) { + ShareActionButton(img: bookmarkImg, text: NSLocalizedString(bookmarkTxt, comment: "Button to bookmark to note"), col: boomarkCol) { show_share_action = false self.bookmarks.updateBookmark(event) isBookmarked = self.bookmarks.isBookmarked(event) } - ShareActionButton(img: "globe", txt: "Broadcast", comment: "Button to broadcast note to all your relays", col: col) { + ShareActionButton(img: "globe", text: NSLocalizedString("Broadcast", comment: "Button to broadcast note to all your relays"), col: col) { show_share_action = false NotificationCenter.default.post(name: .broadcast_event, object: event) } - ShareActionButton(img: "square.and.arrow.up", txt: "Share Via...", comment: "Button to present iOS share sheet", col: col) { + ShareActionButton(img: "square.and.arrow.up", text: NSLocalizedString("Share Via...", comment: "Button to present iOS share sheet"), col: col) { show_share_action = false show_share_sheet = true } @@ -87,7 +87,7 @@ struct ShareAction: View { } } -func ShareActionButton(img: String, txt: String, comment: String, col: Color, action: @escaping () -> ()) -> some View { +func ShareActionButton(img: String, text: String, col: Color, action: @escaping () -> ()) -> some View { Button(action: action) { VStack() { Image(systemName: img) @@ -99,7 +99,7 @@ func ShareActionButton(img: String, txt: String, comment: String, col: Color, ac .frame(width: 55.0, height: 55.0) } .frame(height: 25) - Text(NSLocalizedString(txt, comment: comment)) + Text(verbatim: text) .foregroundColor(col) .font(.footnote) .multilineTextAlignment(.center) diff --git a/damus/Views/ConfigView.swift b/damus/Views/ConfigView.swift @@ -213,7 +213,7 @@ struct ConfigView: View { clear_kingfisher_cache() } - Picker(NSLocalizedString("Select image uplodaer", comment: "Prompt selection of user's image uplodaer"), + Picker(NSLocalizedString("Select image uploader", comment: "Prompt selection of user's image uploader"), selection: $settings.default_image_uploader) { ForEach(ImageUploader.allCases, id: \.self) { uploader in Text(uploader.model.displayName) diff --git a/damus/Views/Events/EventMenu.swift b/damus/Views/Events/EventMenu.swift @@ -18,11 +18,11 @@ struct EventMenuContext: View { var body: some View { HStack { Menu { - + MenuItems(event: event, keypair: keypair, target_pubkey: target_pubkey, bookmarks: bookmarks) } label: { - Label(NSLocalizedString("", comment: "Context menu"), systemImage: "ellipsis") + Label("", systemImage: "ellipsis") .foregroundColor(Color.gray) } } diff --git a/damus/Views/Events/ReplyDescription.swift b/damus/Views/Events/ReplyDescription.swift @@ -49,7 +49,7 @@ func reply_desc(profiles: Profiles, event: NostrEvent, locale: Locale = Locale.c if othersCount == 0 { return String(format: NSLocalizedString("Replying to %@ & %@", bundle: bundle, comment: "Label to indicate that the user is replying to 2 users."), locale: locale, uniqueNames[0], uniqueNames[1]) } else { - return String(format: bundle.localizedString(forKey: "replying_to_two_and_others", value: nil, table: nil), locale: locale, othersCount, uniqueNames[0], uniqueNames[1]) + return String(format: localizedStringFormat(key: "replying_to_two_and_others", locale: locale), locale: locale, othersCount, uniqueNames[0], uniqueNames[1]) } } diff --git a/damus/Views/Events/TextEvent.swift b/damus/Views/Events/TextEvent.swift @@ -40,7 +40,7 @@ struct TextEvent: View { let pk = is_anon ? "anon" : pubkey EventProfileName(pubkey: pk, profile: profile, damus: damus, show_friend_confirmed: true, size: .normal) - Text("⋅") + Text(verbatim: "⋅") .font(.footnote) .foregroundColor(.gray) Text(verbatim: "\(format_relative_time(event.created_at))") diff --git a/damus/Views/Notifications/EventGroupView.swift b/damus/Views/Notifications/EventGroupView.swift @@ -121,28 +121,30 @@ func event_group_author_name(profiles: Profiles, ind: Int, group: EventGroupType "zapped_your_profile_3" - returned when 3 or more zaps occurred to the current user's profile */ func reacting_to_text(profiles: Profiles, our_pubkey: String, group: EventGroupType, ev: NostrEvent?, locale: Locale? = nil) -> String { + if group.events.count == 0 { + return "??" + } + let verb = reacting_to_verb(group: group) let reacting_to = determine_reacting_to(our_pubkey: our_pubkey, ev: ev) let localization_key = "\(verb)_\(reacting_to)_\(min(group.events.count, 3))" - let bundle = bundleForLocale(locale: locale) + let format = localizedStringFormat(key: localization_key, locale: locale) switch group.events.count { - case 0: - return "??" case 1: let display_name = event_group_author_name(profiles: profiles, ind: 0, group: group) - return String(format: bundle.localizedString(forKey: localization_key, value: bundleForLocale(locale: Locale(identifier: "en-US")).localizedString(forKey: localization_key, value: nil, table: nil), table: nil), locale: locale, display_name) + return String(format: format, locale: locale, display_name) case 2: let alice_name = event_group_author_name(profiles: profiles, ind: 0, group: group) let bob_name = event_group_author_name(profiles: profiles, ind: 1, group: group) - return String(format: bundle.localizedString(forKey: localization_key, value: bundleForLocale(locale: Locale(identifier: "en-US")).localizedString(forKey: localization_key, value: nil, table: nil), table: nil), locale: locale, alice_name, bob_name) + return String(format: format, locale: locale, alice_name, bob_name) default: let alice_name = event_group_author_name(profiles: profiles, ind: 0, group: group) let count = group.events.count - 1 - return String(format: bundle.localizedString(forKey: localization_key, value: bundleForLocale(locale: Locale(identifier: "en-US")).localizedString(forKey: localization_key, value: nil, table: nil), table: nil), locale: locale, count, alice_name) + return String(format: format, locale: locale, count, alice_name) } } diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift @@ -50,18 +50,18 @@ func follow_btn_enabled_state(_ fs: FollowState) -> Bool { } func followersCountString(_ count: Int, locale: Locale = Locale.current) -> String { - let bundle = bundleForLocale(locale: locale) - return String(format: bundle.localizedString(forKey: "followers_count", value: nil, table: nil), locale: locale, count) + let format = localizedStringFormat(key: "followers_count", locale: locale) + return String(format: format, locale: locale, count) } func followingCountString(_ count: Int, locale: Locale = Locale.current) -> String { - let bundle = bundleForLocale(locale: locale) - return String(format: bundle.localizedString(forKey: "following_count", value: nil, table: nil), locale: locale, count) + let format = localizedStringFormat(key: "following_count", locale: locale) + return String(format: format, locale: locale, count) } func relaysCountString(_ count: Int, locale: Locale = Locale.current) -> String { - let bundle = bundleForLocale(locale: locale) - return String(format: bundle.localizedString(forKey: "relays_count", value: nil, table: nil), locale: locale, count) + let format = localizedStringFormat(key: "relays_count", locale: locale) + return String(format: format, locale: locale, count) } struct EditButton: View { diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings Binary files differ. diff --git a/damus/de.lproj/Localizable.strings b/damus/de.lproj/Localizable.strings Binary files differ. diff --git a/damus/de.lproj/Localizable.stringsdict b/damus/de.lproj/Localizable.stringsdict @@ -34,6 +34,22 @@ <string>Follower</string> </dict> </dict> + <key>following_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@FOLLOWING@</string> + <key>FOLLOWING</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Folge ich</string> + <key>other</key> + <string>Folge ich</string> + </dict> + </dict> <key>reacted_tagged_in_3</key> <dict> <key>NSStringLocalizedFormatKey</key> diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -159,6 +159,11 @@ Sentence composed of 2 variables to describe how many people are following a use <target>All</target> <note>Label for filter for all notifications.</note> </trans-unit> + <trans-unit id="Always show images" xml:space="preserve"> + <source>Always show images</source> + <target>Always show images</target> + <note>Setting to always show and never blur images</note> + </trans-unit> <trans-unit id="Anonymous" xml:space="preserve"> <source>Anonymous</source> <target>Anonymous</target> @@ -255,12 +260,14 @@ Sentence composed of 2 variables to describe how many people are following a use <trans-unit id="Broadcast" xml:space="preserve"> <source>Broadcast</source> <target>Broadcast</target> - <note>Context menu option for broadcasting the user's note to all of the user's connected relay servers.</note> + <note>Button to broadcast note to all your relays + Context menu option for broadcasting the user's note to all of the user's connected relay servers.</note> </trans-unit> <trans-unit id="Cancel" xml:space="preserve"> <source>Cancel</source> <target>Cancel</target> <note>Alert button to cancel out of alert for blocking a user. + Button to cancel a repost. Button to cancel out of alert that creates a new mutelist. Button to cancel out of posting a note. Button to cancel out of reposting a post. @@ -329,6 +336,11 @@ Sentence composed of 2 variables to describe how many people are following a use <target>Copy LNURL</target> <note>Context menu option for copying a user's Lightning URL.</note> </trans-unit> + <trans-unit id="Copy Link" xml:space="preserve"> + <source>Copy Link</source> + <target>Copy Link</target> + <note>Button to copy link to note</note> + </trans-unit> <trans-unit id="Copy Note ID" xml:space="preserve"> <source>Copy Note ID</source> <target>Copy Note ID</target> @@ -583,6 +595,11 @@ Sentence composed of 2 variables to describe how many people are following a use <target>Images</target> <note>Section title for images configuration.</note> </trans-unit> + <trans-unit id="Invalid Tip Address" xml:space="preserve"> + <source>Invalid Tip Address</source> + <target>Invalid Tip Address</target> + <note>Title of alerting as invalid tip address.</note> + </trans-unit> <trans-unit id="Invalid key" xml:space="preserve"> <source>Invalid key</source> <target>Invalid key</target> @@ -676,6 +693,11 @@ Sentence composed of 2 variables to describe how many people are following a use <target>Mentions</target> <note>Label for filter for seeing mention notifications (replies, etc).</note> </trans-unit> + <trans-unit id="Miscellaneous" xml:space="preserve"> + <source>Miscellaneous</source> + <target>Miscellaneous</target> + <note>Section header for miscellaneous user configuration</note> + </trans-unit> <trans-unit id="Muun" xml:space="preserve"> <source>Muun</source> <target>Muun</target> @@ -706,6 +728,16 @@ Sentence composed of 2 variables to describe how many people are following a use <target>No zaps are sent, only a lightning payment.</target> <note>Description of non-zap type where sats are sent to the user's wallet as a regular Lightning payment, not as a zap.</note> </trans-unit> + <trans-unit id="NostrBuild" xml:space="preserve"> + <source>NostrBuild</source> + <target>NostrBuild</target> + <note>Dropdown option label for system default for NostrBuild image uploader.</note> + </trans-unit> + <trans-unit id="NostrImg" xml:space="preserve"> + <source>NostrImg</source> + <target>NostrImg</target> + <note>Dropdown option label for system default for NostrImg image uploader.</note> + </trans-unit> <trans-unit id="Note contains &quot;nsec1&quot; private key. Are you sure?" xml:space="preserve"> <source>Note contains "nsec1" private key. Are you sure?</source> <target>Note contains "nsec1" private key. Are you sure?</target> @@ -726,6 +758,11 @@ Sentence composed of 2 variables to describe how many people are following a use <target>Nudity or explicit content</target> <note>Button for user to report that the account or content has nudity or explicit content.</note> </trans-unit> + <trans-unit id="Ok" xml:space="preserve"> + <source>Ok</source> + <target>Ok</target> + <note>Button to dismiss the alert.</note> + </trans-unit> <trans-unit id="Only you can see this message and who sent it." xml:space="preserve"> <source>Only you can see this message and who sent it.</source> <target>Only you can see this message and who sent it.</target> @@ -998,6 +1035,11 @@ Picker option to indicate that a zap should be sent privately and not identify t <target>Select default wallet</target> <note>Prompt selection of user's default wallet</note> </trans-unit> + <trans-unit id="Select image uploader" xml:space="preserve"> + <source>Select image uploader</source> + <target>Select image uploader</target> + <note>Prompt selection of user's image uploader</note> + </trans-unit> <trans-unit id="Send a message to start the conversation..." xml:space="preserve"> <source>Send a message to start the conversation...</source> <target>Send a message to start the conversation...</target> @@ -1026,6 +1068,16 @@ Picker option to indicate that a zap should be sent privately and not identify t Button to share an image. Button to share the link to a profile.</note> </trans-unit> + <trans-unit id="Share Note" xml:space="preserve"> + <source>Share Note</source> + <target>Share Note</target> + <note>Title text to indicate that the buttons below are meant to be used to share a note with others.</note> + </trans-unit> + <trans-unit id="Share Via..." xml:space="preserve"> + <source>Share Via...</source> + <target>Share Via...</target> + <note>Button to present iOS share sheet</note> + </trans-unit> <trans-unit id="Show" xml:space="preserve"> <source>Show</source> <target>Show</target> @@ -1078,6 +1130,11 @@ Picker option to indicate that a zap should be sent privately and not identify t <target>Thanks!</target> <note>Button to close out of alert that informs that the action to block a user was successful.</note> </trans-unit> + <trans-unit id="The address should either begin with LNURL or should look like an email address." xml:space="preserve"> + <source>The address should either begin with LNURL or should look like an email address.</source> + <target>The address should either begin with LNURL or should look like an email address.</target> + <note>Giving the description of the alert message.</note> + </trans-unit> <trans-unit id="They are impersonating someone" xml:space="preserve"> <source>They are impersonating someone</source> <target>They are impersonating someone</target> @@ -1283,6 +1340,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <target>Zap Type</target> <note>Header text to indicate that the picker below it is to choose the type of zap to send.</note> </trans-unit> + <trans-unit id="Zap Vibration" xml:space="preserve"> + <source>Zap Vibration</source> + <target>Zap Vibration</target> + <note>Setting to enable vibration on zap</note> + </trans-unit> <trans-unit id="Zapping..." xml:space="preserve"> <source>Zapping...</source> <target>Zapping...</target> diff --git a/damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings b/damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings Binary files differ. diff --git a/damus/fr-CA.lproj/InfoPlist.strings b/damus/fr-CA.lproj/InfoPlist.strings Binary files differ. diff --git a/damus/fr-CA.lproj/Localizable.strings b/damus/fr-CA.lproj/Localizable.strings Binary files differ. diff --git a/damus/fr-CA.lproj/Localizable.stringsdict b/damus/fr-CA.lproj/Localizable.stringsdict @@ -0,0 +1,330 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>collapsed_event_view_other_notes</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@NOTES@</string> + <key>NOTES</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>... %d autre note ...</string> + <key>many</key> + <string>... %d autres notes ...</string> + <key>other</key> + <string>... %d autres notes ...</string> + </dict> + </dict> + <key>followers_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@FOLLOWERS@</string> + <key>FOLLOWERS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Abonné</string> + <key>many</key> + <string>Abonnés</string> + <key>other</key> + <string>Abonnés</string> + </dict> + </dict> + <key>following_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@FOLLOWING@</string> + <key>FOLLOWING</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Abonnement</string> + <key>many</key> + <string>Abonnements</string> + <key>other</key> + <string>Abonnements</string> + </dict> + </dict> + <key>reacted_tagged_in_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REACTED@</string> + <key>REACTED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont réagi à une note dans laquelle vous apparaissez</string> + <key>many</key> + <string>%2$@ et %1$d autres ont réagi à une note dans laquelle vous apparaissez</string> + <key>other</key> + <string>%2$@ et %1$d autres ont réagi à une note dans laquelle vous apparaissez</string> + </dict> + </dict> + <key>reacted_your_post_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REACTED@</string> + <key>REACTED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont réagi à votre note</string> + <key>many</key> + <string>%2$@ et %1$d autres ont réagi à votre note</string> + <key>other</key> + <string>%2$@ et %1$d autres ont réagi à votre note</string> + </dict> + </dict> + <key>reacted_your_profile_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REACTED@</string> + <key>REACTED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont réagi à votre profil</string> + <key>many</key> + <string>%2$@ et %1$d autres ont réagi à votre profil</string> + <key>other</key> + <string>%2$@ et %1$d autres ont réagi à votre profil</string> + </dict> + </dict> + <key>reactions_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REACTIONS@</string> + <key>REACTIONS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Réaction</string> + <key>many</key> + <string>Réactions</string> + <key>other</key> + <string>Réactions</string> + </dict> + </dict> + <key>relays_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@RELAYS@</string> + <key>RELAYS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Relai</string> + <key>many</key> + <string>Relais</string> + <key>other</key> + <string>Relais</string> + </dict> + </dict> + <key>replying_to_two_and_others</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@OTHERS@</string> + <key>OTHERS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Réponse à %2$@, %3$@ &amp; %1$d autre</string> + <key>many</key> + <string>Réponse à %2$@, %3$@ &amp; %1$d autres</string> + <key>other</key> + <string>Réponse à %2$@, %3$@ &amp; %1$d autres</string> + </dict> + </dict> + <key>reposted_tagged_in_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REPOSTED@</string> + <key>REPOSTED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont cité une note dans laquelle vous apparaissez</string> + <key>many</key> + <string>%2$@ et %1$d autres ont cité une note dans laquelle vous apparaissez</string> + <key>other</key> + <string>%2$@ et %1$d autres ont republié une note dans laquelle vous apparaissez</string> + </dict> + </dict> + <key>reposted_your_post_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REPOSTED@</string> + <key>REPOSTED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont cité votre note</string> + <key>many</key> + <string>%2$@ et %1$d autres ont cité votre note</string> + <key>other</key> + <string>%2$@ et %1$d autres ont republié votre note</string> + </dict> + </dict> + <key>reposted_your_profile_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REPOSTED@</string> + <key>REPOSTED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont republié votre profile</string> + <key>many</key> + <string>%2$@ et %1$d autres ont republié votre profile</string> + <key>other</key> + <string>%2$@ et %1$d autres ont republié votre profile</string> + </dict> + </dict> + <key>reposts_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@REPOSTS@</string> + <key>REPOSTS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Republication</string> + <key>many</key> + <string>Republications</string> + <key>other</key> + <string>Republications</string> + </dict> + </dict> + <key>sats_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%1$#@SATS@</string> + <key>SATS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>@</string> + <key>one</key> + <string>%2$@ sat</string> + <key>many</key> + <string>%2$@ sats</string> + <key>other</key> + <string>%2$@ sats</string> + </dict> + </dict> + <key>zapped_tagged_in_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@ZAPPED@</string> + <key>ZAPPED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont zappé une note dans laquelle vous apparaissez</string> + <key>many</key> + <string>%2$@ et %1$d autres ont zappé une note dans laquelle vous apparaissez</string> + <key>other</key> + <string>%2$@ et %1$d autres ont zappé une note dans laquelle vous apparaissez</string> + </dict> + </dict> + <key>zapped_your_post_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@ZAPPED@</string> + <key>ZAPPED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont zappé votre note</string> + <key>many</key> + <string>%2$@ et %1$d autres ont zappé votre note</string> + <key>other</key> + <string>%2$@ et %1$d autres ont zappé votre note</string> + </dict> + </dict> + <key>zapped_your_profile_3</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@ZAPPED@</string> + <key>ZAPPED</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>%2$@ et %1$d autre ont zappé votre profile</string> + <key>many</key> + <string>%2$@ et %1$d autres ont zappé votre profile</string> + <key>other</key> + <string>%2$@ et %1$d autres ont zappé votre profile</string> + </dict> + </dict> + <key>zaps_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@ZAPS@</string> + <key>ZAPS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Zap</string> + <key>many</key> + <string>Zaps</string> + <key>other</key> + <string>Zaps</string> + </dict> + </dict> +</dict> +</plist> diff --git a/damus/fr-FR.lproj/Localizable.strings b/damus/fr-FR.lproj/Localizable.strings Binary files differ. diff --git a/damus/hu_HU.lproj/InfoPlist.strings b/damus/hu-HU.lproj/InfoPlist.strings Binary files differ. diff --git a/damus/hu-HU.lproj/Localizable.strings b/damus/hu-HU.lproj/Localizable.strings Binary files differ. diff --git a/damus/hu_HU.lproj/Localizable.stringsdict b/damus/hu-HU.lproj/Localizable.stringsdict diff --git a/damus/hu_HU.lproj/Localizable.strings b/damus/hu_HU.lproj/Localizable.strings Binary files differ. diff --git a/damus/ja.lproj/Localizable.strings b/damus/ja.lproj/Localizable.strings Binary files differ. diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings Binary files differ. diff --git a/damus/pl-PL.lproj/Localizable.stringsdict b/damus/pl-PL.lproj/Localizable.stringsdict @@ -15,9 +15,9 @@ <key>one</key> <string>... %d inna notatka ...</string> <key>few</key> - <string>... %d other notes ...</string> + <string>... %d innych notatek ...</string> <key>many</key> - <string>... %d other notes ...</string> + <string>... %d innych notatek ...</string> <key>other</key> <string>... %d inne notatki ...</string> </dict> @@ -155,11 +155,11 @@ <key>one</key> <string>Przekaźnik</string> <key>few</key> - <string>Relays</string> + <string>Przekaźniki</string> <key>many</key> - <string>Relays</string> - <key>other</key> <string>Przekaźników</string> + <key>other</key> + <string>Przekaźniki</string> </dict> </dict> <key>replying_to_two_and_others</key> @@ -355,11 +355,11 @@ <key>one</key> <string>Zap</string> <key>few</key> - <string>Zaps</string> + <string>Zapy</string> <key>many</key> - <string>Zaps</string> - <key>other</key> <string>Zapów</string> + <key>other</key> + <string>Zapy</string> </dict> </dict> </dict> diff --git a/damus/sv_SE.lproj/InfoPlist.strings b/damus/sv-SE.lproj/InfoPlist.strings Binary files differ. diff --git a/damus/sv-SE.lproj/Localizable.strings b/damus/sv-SE.lproj/Localizable.strings Binary files differ. diff --git a/damus/sv_SE.lproj/Localizable.stringsdict b/damus/sv-SE.lproj/Localizable.stringsdict diff --git a/damus/sv_SE.lproj/Localizable.strings b/damus/sv_SE.lproj/Localizable.strings Binary files differ. diff --git a/transifex.yml b/transifex.yml @@ -15,16 +15,252 @@ git: translation_files_expression: 'damus/<lang>.lproj/' settings: + # Mapping of most of the supported locale codes in Transifex to the locale code format that Xcode expects. + # Locale codes that are the identical between Transifex and Xcode do not need to be listed. language_mapping: en_US: en-US + aa_DJ: aa-DJ + af_ZA: af-ZA + am_ET: am-ET + ar_AA: ar-AA + ar_AE: ar-AE + ar_DZ: ar-DZ + ar_EG: ar-EG + ar_IQ: ar-IQ + ar_JO: ar-JO + ar_LB: ar-LB + ar_SA: ar-SA + ar_SD: ar-SD + ar_SY: ar-SY + as_IN: as-IN + ast_ES: ast-ES + az_AZ: az-AZ + az_IR: az-IR + be_BY: be-BY + bem_ZM: bem-ZM + bg_BG: bg-BG + bg_US: bg-US + bn_BD: bn-BD + bn_IN: bn-IN + bo_CN: bo-CN + bqi_IR: bqi-IR + br_FR: br-FR + bs_BA: bs-BA + bs_BA-SRP: bs-BA-SRP + ca_ES: ca-ES + cs_CZ: cs-CZ + cy_GB: cy-GB + da_DK: da-DK + de_AT: de-AT + de_CH: de-CH + de_DE: de-DE + dz_BT: dz-BT + el_CY: el-CY + el_DE: el-DE el_GR: el-GR + en_AE: en-AE + en_AL: en-AL + en_AT: en-AT + en_AU: en-AU + en_BA: en-BA + en_BA-SRP: en-BA-SRP + en_BD: en-BD + en_BE: en-BE + en_BG: en-BG + en_BH: en-BH + en_BR: en-BR + en_CA: en-CA + en_CH: en-CH + en_CL: en-CL + en_CO: en-CO + en_CY: en-CY + en_CZ: en-CZ + en_DE: en-DE + en_DK: en-DK + en_EC: en-EC + en_EG: en-EG + en_ES: en-ES + en_FI: en-FI + en_FJ: en-FJ + en_FR: en-FR + en_GB: en-GB + en_GH: en-GH + en_GR: en-GR + en_HK: en-HK + en_HR: en-HR + en_HU: en-HU + en_IE: en-IE + en_IN: en-IN + en_IT: en-IT + en_JP: en-JP + en_KR: en-KR + en_KW: en-KW + en_LK: en-LK + en_MX: en-MX + en_MY: en-MY + en_NG: en-NG + en_NL: en-NL + en_NO: en-NO + en_NZ: en-NZ + en_PE: en-PE + en_PG: en-PG + en_PH: en-PH + en_PK: en-PK + en_PL: en-PL + en_PR: en-PR + en_PT: en-PT + en_QA: en-QA + en_RO: en-RO + en_RS: en-RS + en_SA: en-SA + en_SE: en-SE + en_SG: en-SG + en_SI: en-SI + en_SK: en-SK + en_TT: en-TT + en_UG: en-UG + en_ZA: en-ZA + en_ZM: en-ZM + en_ee: en-ee + en_lt: en-lt + en_lv: en-lv es_419: es-419 + es_AR: es-AR + es_BO: es-BO + es_CL: es-CL + es_CO: es-CO + es_CR: es-CR + es_CU: es-CU + es_DO: es-DO + es_EC: es-EC + es_ES: es-ES + es_GT: es-GT + es_HN: es-HN + es_MX: es-MX + es_NI: es-NI + es_PA: es-PA + es_PE: es-PE + es_PR: es-PR + es_PY: es-PY + es_SA: es-SA + es_SV: es-SV + es_US: es-US + es_UY: es-UY + es_VE: es-VE + et_EE: et-EE + eu_ES: eu-ES + fa_AF: fa-AF + fa_IR: fa-IR + ff_SN: ff-SN + fi_FI: fi-FI + fil_PH: fil-PH + fo_FO: fo-FO + fr_BE: fr-BE + fr_CA: fr-CA + fr_CH: fr-CH + fr_CI: fr-CI + fr_CM: fr-CM fr_FR: fr-FR + fr_GA: fr-GA + fr_LU: fr-LU + fy_NL: fy-NL + ga_IE: ga-IE + gl_ES: gl-ES + gu_IN: gu-IN + gug_PY: gug-PY + he_IL: he-IL + hi_IN: hi-IN + hr_BA: hr-BA + hr_BA-SRP: hr-BA-SRP + hr_HR: hr-HR + ht_HT: ht-HT + hu_HU: hu-HU + hu_RO: hu-RO + hu_SK: hu-SK + hy_AM: hy-AM + hy_RU: hy-RU + hye_RU: hye-RU + id_ID: id-ID + is_IS: is-IS + it_CH: it-CH it_IT: it-IT + ja_JP: ja-JP + ka_GE: ka-GE + kk_KZ: kk-KZ + km_KH: km-KH + kn_IN: kn-IN + ko_KR: ko-KR + ks_IN: ks-IN + ku_IQ: ku-IQ + lg_UG: lg-UG + lo_LA: lo-LA + loz_ZM: loz-ZM + lt_LT: lt-LT lv_LV: lv-LV + mhr_RU: mhr-RU + mk_MK: mk-MK + ml_IN: ml-IN + mn_MN: mn-MN + mr_IN: mr-IN + ms_BN: ms-BN + ms_MY: ms-MY + mt_MT: mt-MT + my_MM: my-MM + nb_NO: nb-NO + ne_NP: ne-NP + nl_BE: nl-BE + nl_NL: nl-NL + nn_NO: nn-NO + no_NO: no-NO + or_IN: or-IN + pa_IN: pa-IN + pa_PK: pa-PK pl_PL: pl-PL + ps_AF: ps-AF + pt_AO: pt-AO + pt_BR: pt-BR + pt_MZ: pt-MZ pt_PT: pt-PT + qu_EC: qu-EC + ro_MD: ro-MD + ro_RO: ro-RO + ru_RU: ru-RU + ru_UA: ru-UA + ru_ee: ru-ee + ru_lt: ru-lt + ru_lv: ru-lv + si_LK: si-LK + sk_SK: sk-SK + sl_SI: sl-SI + sq_AL: sq-AL + sr_BA-SRP: sr-BA-SRP + sr_ME: sr-ME + sr_RS: sr-RS + st_ZA: st-ZA + sv_FI: sv-FI + sv_SE: sv-SE + sw_CD: sw-CD + sw_KE: sw-KE + sw_TZ: sw-TZ + sw_UG: sw-UG + ta_IN: ta-IN + ta_LK: ta-LK + te_IN: te-IN + tg_TJ: tg-TJ + th_TH: th-TH + tk_TM: tk-TM + tl_PH: tl-PH + tr_CY: tr-CY + tr_DE: tr-DE tr_TR: tr-TR + uk_UA: uk-UA + ur_PK: ur-PK + uz_UZ: uz-UZ + vi_VN: vi-VN + wo_SN: wo-SN + yue_CN: yue-CN zh_CN: zh-CN zh_HK: zh-HK - zh_TW: zh-TW- \ No newline at end of file + zh_SG: zh-SG + zh_TW: zh-TW + zu_ZA: zu-ZA