1
0
mirror of git://jb55.com/damus synced 2024-09-28 16:00:43 +00:00

Fix localization issues, and export and import translations

This commit is contained in:
Terry Yiu 2023-03-16 22:55:54 -04:00
parent eabbb12195
commit f367df2225
No known key found for this signature in database
GPG Key ID: 108645AE8A19B71A
27 changed files with 715 additions and 56 deletions

View File

@ -308,9 +308,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>"; };
@ -348,12 +345,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>"; };
@ -1308,9 +1311,10 @@
uk,
bg,
fa,
sv_SE,
ko,
hu_HU,
"hu-HU",
"sv-SE",
"fr-CA",
);
mainGroup = 4CE6DEDA27F7A08100C66700;
packageReferences = (
@ -1658,9 +1662,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>";
@ -1689,9 +1694,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>";
@ -1721,9 +1727,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>";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -22,7 +22,7 @@ struct EventMenuContext: View {
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)
}
}

View File

@ -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])
}
}

View File

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

View File

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

View File

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

Binary file not shown.

View File

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

View File

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

Binary file not shown.

Binary file not shown.

View File

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

View File

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

View File

@ -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_SG: zh-SG
zh_TW: zh-TW
zu_ZA: zu-ZA