From 9f52e2c2469cb875308d71c7acc9a1c2d84eff1c Mon Sep 17 00:00:00 2001 From: Joel Klabo Date: Thu, 23 Feb 2023 11:11:46 -0800 Subject: [PATCH 01/65] Fix Identical Participants in ParticipantView Changelog-Fixed: Fix duplicated participants in reply-to view Closes: #685 --- damus/Nostr/NostrEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/damus/Nostr/NostrEvent.swift b/damus/Nostr/NostrEvent.swift index f9a66edf..b3704543 100644 --- a/damus/Nostr/NostrEvent.swift +++ b/damus/Nostr/NostrEvent.swift @@ -835,7 +835,7 @@ func first_eref_mention(ev: NostrEvent, privkey: String?) -> Mention? { extension [ReferencedId] { var pRefs: [ReferencedId] { get { - self.filter { ref in + Set(self).filter { ref in ref.key == "p" } } From 85e797a0541ad0251a89982487f719cf71123f52 Mon Sep 17 00:00:00 2001 From: Joel Klabo Date: Thu, 23 Feb 2023 16:48:15 -0800 Subject: [PATCH 02/65] Embed in ScrollView --- damus/Views/ParicipantsView.swift | 60 ++++++++++++++++--------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/damus/Views/ParicipantsView.swift b/damus/Views/ParicipantsView.swift index 720a3e84..cf29f8d8 100644 --- a/damus/Views/ParicipantsView.swift +++ b/damus/Views/ParicipantsView.swift @@ -36,41 +36,43 @@ struct ParticipantsView: View { Spacer() } VStack { - ForEach(originalReferences.pRefs) { participant in - let pubkey = participant.id - HStack { - ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: damus_state.profiles) - - VStack(alignment: .leading) { - let profile = damus_state.profiles.lookup(id: pubkey) - ProfileName(pubkey: pubkey, profile: profile, damus: damus_state, show_friend_confirmed: false, show_nip5_domain: false) - if let about = profile?.about { - Text(FollowUserView.markdown.process(about)) - .lineLimit(3) - .font(.footnote) + ScrollView { + ForEach(originalReferences.pRefs) { participant in + let pubkey = participant.id + HStack { + ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: damus_state.profiles) + + VStack(alignment: .leading) { + let profile = damus_state.profiles.lookup(id: pubkey) + ProfileName(pubkey: pubkey, profile: profile, damus: damus_state, show_friend_confirmed: false, show_nip5_domain: false) + if let about = profile?.about { + Text(FollowUserView.markdown.process(about)) + .lineLimit(3) + .font(.footnote) + } } + + Spacer() + + Image(systemName: "checkmark.circle.fill") + .font(.system(size: 30)) + .foregroundColor(references.contains(participant) ? .purple : .gray) } - - Spacer() - - Image(systemName: "checkmark.circle.fill") - .font(.system(size: 30)) - .foregroundColor(references.contains(participant) ? .purple : .gray) - } - .onTapGesture { - if references.contains(participant) { - references = references.filter { - $0 != participant - } - } else { + .onTapGesture { if references.contains(participant) { - // Don't add it twice + references = references.filter { + $0 != participant + } } else { - references.append(participant) + if references.contains(participant) { + // Don't add it twice + } else { + references.append(participant) + } } } - } - } + } + } } Spacer() } From 5cd4c2d75eb7123694994e61e3b83a85bcc8a2d6 Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Fri, 24 Feb 2023 12:26:43 -0500 Subject: [PATCH 03/65] Fix localization issues, add tests, import translations, and add zh-CN and zh-TW Closes: #689 --- damus.xcodeproj/project.pbxproj | 30 ++++ damus/Components/ZapButton.swift | 10 +- damus/ContentView.swift | 2 +- damus/Models/Mentions.swift | 6 +- damus/Util/LocalizationUtil.swift | 19 ++ damus/Util/TimeAgo.swift | 3 +- damus/Views/ActionBar/EventDetailBar.swift | 27 ++- damus/Views/ConfigView.swift | 8 +- damus/Views/EventDetailView.swift | 2 +- damus/Views/Events/EventMenu.swift | 2 +- damus/Views/Events/ReplyDescription.swift | 18 +- damus/Views/FollowButtonView.swift | 2 +- damus/Views/FollowingView.swift | 7 +- damus/Views/ProfileName.swift | 6 +- damus/Views/ProfileView.swift | 24 ++- damus/Views/Timeline/LoadMoreButton.swift | 2 +- damus/ar.lproj/InfoPlist.strings | Bin 433 -> 710 bytes damus/ar.lproj/Localizable.strings | Bin 30736 -> 59388 bytes damus/ar.lproj/Localizable.stringsdict | 166 +++++++++--------- damus/cs.lproj/InfoPlist.strings | Bin 413 -> 778 bytes damus/cs.lproj/Localizable.strings | Bin 29297 -> 61358 bytes damus/cs.lproj/Localizable.stringsdict | 76 ++++---- damus/de.lproj/InfoPlist.strings | Bin 415 -> 820 bytes damus/de.lproj/Localizable.strings | Bin 29546 -> 62476 bytes damus/de.lproj/Localizable.stringsdict | 28 ++- damus/el-GR.lproj/InfoPlist.strings | Bin 526 -> 824 bytes damus/el-GR.lproj/Localizable.strings | Bin 33987 -> 62948 bytes damus/el-GR.lproj/Localizable.stringsdict | 28 ++- damus/en-US.lproj/Localizable.stringsdict | 16 -- .../Localized Contents/en-US.xliff | 60 ++++--- .../damus/en-US.lproj/Localizable.strings | Bin 60318 -> 60936 bytes .../damus/en-US.lproj/Localizable.stringsdict | 16 -- damus/es-419.lproj/InfoPlist.strings | Bin 403 -> 794 bytes damus/es-419.lproj/Localizable.strings | Bin 29156 -> 62254 bytes damus/es-419.lproj/Localizable.stringsdict | 46 +++-- damus/fr-FR.lproj/InfoPlist.strings | Bin 407 -> 794 bytes damus/fr-FR.lproj/Localizable.strings | Bin 29603 -> 62530 bytes damus/fr-FR.lproj/Localizable.stringsdict | 46 +++-- damus/id.lproj/InfoPlist.strings | Bin 395 -> 784 bytes damus/id.lproj/Localizable.stringsdict | 22 +-- damus/it-IT.lproj/InfoPlist.strings | Bin 417 -> 828 bytes damus/it-IT.lproj/Localizable.stringsdict | 46 +++-- damus/ja.lproj/InfoPlist.strings | Bin 437 -> 668 bytes damus/ja.lproj/Localizable.strings | Bin 30594 -> 57160 bytes damus/ja.lproj/Localizable.stringsdict | 22 +-- damus/lv-LV.lproj/Localizable.stringsdict | 76 ++++---- damus/nl.lproj/InfoPlist.strings | Bin 408 -> 808 bytes damus/nl.lproj/Localizable.strings | Bin 28823 -> 61466 bytes damus/nl.lproj/Localizable.stringsdict | 28 ++- damus/pl-PL.lproj/InfoPlist.strings | Bin 431 -> 840 bytes damus/pl-PL.lproj/Localizable.stringsdict | 76 ++++---- damus/pt-PT.lproj/InfoPlist.strings | Bin 287 -> 808 bytes damus/pt-PT.lproj/Localizable.strings | Bin 24668 -> 61550 bytes damus/pt-PT.lproj/Localizable.stringsdict | 46 +++-- damus/ru.lproj/InfoPlist.strings | Bin 541 -> 838 bytes damus/ru.lproj/Localizable.stringsdict | 76 ++++---- damus/tr-TR.lproj/InfoPlist.strings | Bin 105 -> 808 bytes damus/tr-TR.lproj/Localizable.strings | Bin 18608 -> 61648 bytes damus/tr-TR.lproj/Localizable.stringsdict | 38 ++-- damus/zh-CN.lproj/InfoPlist.strings | Bin 368 -> 602 bytes damus/zh-CN.lproj/Localizable.strings | Bin 28154 -> 55408 bytes damus/zh-CN.lproj/Localizable.stringsdict | 108 +----------- damus/zh-HK.lproj/InfoPlist.strings | Bin 0 -> 602 bytes damus/zh-HK.lproj/Localizable.strings | Bin 0 -> 55250 bytes damus/zh-HK.lproj/Localizable.stringsdict | 132 ++++++++++++++ damus/zh-TW.lproj/InfoPlist.strings | Bin 0 -> 602 bytes damus/zh-TW.lproj/Localizable.strings | Bin 0 -> 55250 bytes damus/zh-TW.lproj/Localizable.stringsdict | 132 ++++++++++++++ damusTests/EventDetailBarTests.swift | 56 ++++++ damusTests/FormatTests.swift | 19 ++ damusTests/ProfileViewTests.swift | 45 +++++ damusTests/ReplyDescriptionTests.swift | 87 +++++++++ damusTests/TimeAgoTests.swift | 2 +- 73 files changed, 1061 insertions(+), 600 deletions(-) create mode 100644 damus/Util/LocalizationUtil.swift create mode 100644 damus/zh-HK.lproj/InfoPlist.strings create mode 100644 damus/zh-HK.lproj/Localizable.strings create mode 100644 damus/zh-HK.lproj/Localizable.stringsdict create mode 100644 damus/zh-TW.lproj/InfoPlist.strings create mode 100644 damus/zh-TW.lproj/Localizable.strings create mode 100644 damus/zh-TW.lproj/Localizable.stringsdict create mode 100644 damusTests/EventDetailBarTests.swift create mode 100644 damusTests/ProfileViewTests.swift create mode 100644 damusTests/ReplyDescriptionTests.swift diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index ae344ec1..f14f11c8 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -11,6 +11,10 @@ 3169CAE6294E69C000EE4006 /* EmptyTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3169CAE5294E69C000EE4006 /* EmptyTimelineView.swift */; }; 3169CAED294FCCFC00EE4006 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3169CAEC294FCCFC00EE4006 /* Constants.swift */; }; 31D2E847295218AF006D67F8 /* Shimmer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D2E846295218AF006D67F8 /* Shimmer.swift */; }; + 3A3040ED29A5CB86008A0F29 /* ReplyDescriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040EC29A5CB86008A0F29 /* ReplyDescriptionTests.swift */; }; + 3A3040EF29A8FEE9008A0F29 /* EventDetailBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040EE29A8FEE9008A0F29 /* EventDetailBarTests.swift */; }; + 3A3040F129A8FF97008A0F29 /* LocalizationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040F029A8FF97008A0F29 /* LocalizationUtil.swift */; }; + 3A3040F329A91366008A0F29 /* ProfileViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040F229A91366008A0F29 /* ProfileViewTests.swift */; }; 3A4325A82961E11400BFCD9D /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 3A4325AA2961E11400BFCD9D /* Localizable.stringsdict */; }; 3AA247FD297E3CFF0090C62D /* RepostsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA247FC297E3CFF0090C62D /* RepostsModel.swift */; }; 3AA247FF297E3D900090C62D /* RepostsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA247FE297E3D900090C62D /* RepostsView.swift */; }; @@ -257,6 +261,16 @@ 3A25EF142992DA5D008ABE69 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "el-GR"; path = "el-GR.lproj/Localizable.strings"; sourceTree = ""; }; 3A25EF152992DA5D008ABE69 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "el-GR"; path = "el-GR.lproj/Localizable.stringsdict"; sourceTree = ""; }; 3A2B8B0A296A8982009CC16D /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "en-US"; path = "en-US.lproj/Localizable.stringsdict"; sourceTree = ""; }; + 3A3040EC29A5CB86008A0F29 /* ReplyDescriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyDescriptionTests.swift; sourceTree = ""; }; + 3A3040EE29A8FEE9008A0F29 /* EventDetailBarTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventDetailBarTests.swift; sourceTree = ""; }; + 3A3040F029A8FF97008A0F29 /* LocalizationUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationUtil.swift; sourceTree = ""; }; + 3A3040F229A91366008A0F29 /* ProfileViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewTests.swift; sourceTree = ""; }; + 3A3040F929A91ED6008A0F29 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "zh-HK.lproj/InfoPlist.strings"; sourceTree = ""; }; + 3A3040FA29A91EFC008A0F29 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "zh-HK.lproj/Localizable.strings"; sourceTree = ""; }; + 3A3040FB29A91F03008A0F29 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-HK"; path = "zh-HK.lproj/Localizable.stringsdict"; sourceTree = ""; }; + 3A3040FC29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/InfoPlist.strings"; sourceTree = ""; }; + 3A3040FD29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-TW"; path = "zh-TW.lproj/Localizable.stringsdict"; sourceTree = ""; }; + 3A3040FE29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/Localizable.strings"; sourceTree = ""; }; 3A41E559299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/InfoPlist.strings; sourceTree = ""; }; 3A41E55A299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; 3A41E55B299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = id; path = id.lproj/Localizable.stringsdict; sourceTree = ""; }; @@ -810,6 +824,7 @@ 4C2CDDF6299D4A5E00879FD5 /* Debouncer.swift */, 7C95CAED299DCEF1009DCB67 /* KFOptionSetter+.swift */, 4CE0E2AE29A2E82100DB4CA2 /* EventHolder.swift */, + 3A3040F029A8FF97008A0F29 /* LocalizationUtil.swift */, ); path = Util; sourceTree = ""; @@ -971,6 +986,9 @@ 4CF0ABDB2981A19E00D66079 /* ListTests.swift */, 4CB883A9297612FF00DC99E7 /* ZapTests.swift */, 4CB883AD2976FA9300DC99E7 /* FormatTests.swift */, + 3A3040EC29A5CB86008A0F29 /* ReplyDescriptionTests.swift */, + 3A3040EE29A8FEE9008A0F29 /* EventDetailBarTests.swift */, + 3A3040F229A91366008A0F29 /* ProfileViewTests.swift */, ); path = damusTests; sourceTree = ""; @@ -1160,6 +1178,8 @@ id, cs, ru, + "zh-HK", + "zh-TW", ); mainGroup = 4CE6DEDA27F7A08100C66700; packageReferences = ( @@ -1289,6 +1309,7 @@ 31D2E847295218AF006D67F8 /* Shimmer.swift in Sources */, F7908E97298B1FDF00AB113A /* NIPURLBuilder.swift in Sources */, 4C285C8228385570008A31F1 /* CarouselView.swift in Sources */, + 3A3040F129A8FF97008A0F29 /* LocalizationUtil.swift in Sources */, F75BA12D29A1855400E10810 /* BookmarksManager.swift in Sources */, 4C3EA67F28FFC01D00C48A62 /* InvoiceView.swift in Sources */, 4CE8794829941DA700F758CC /* RelayFilters.swift in Sources */, @@ -1416,8 +1437,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3A3040ED29A5CB86008A0F29 /* ReplyDescriptionTests.swift in Sources */, 3ACBCB78295FE5C70037388A /* TimeAgoTests.swift in Sources */, DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */, + 3A3040EF29A8FEE9008A0F29 /* EventDetailBarTests.swift in Sources */, 4C3EA67B28FF7B3900C48A62 /* InvoiceTests.swift in Sources */, 4C363A9E2828A822006E126D /* ReplyTests.swift in Sources */, 4CB883AA297612FF00DC99E7 /* ZapTests.swift in Sources */, @@ -1427,6 +1450,7 @@ 4C90BD1C283AC38E008EE7EF /* Bech32Tests.swift in Sources */, 50A50A8D29A09E1C00C01BE7 /* RequestTests.swift in Sources */, 4CE6DEF827F7A08200C66700 /* damusTests.swift in Sources */, + 3A3040F329A91366008A0F29 /* ProfileViewTests.swift in Sources */, 4CF0ABDC2981A19E00D66079 /* ListTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1476,6 +1500,8 @@ 3A41E55B299D52BE001FA465 /* id */, 3A8624DB299E82BE00BD8BE9 /* cs */, 3A827A1A299FC69D00C4D171 /* ru */, + 3A3040FB29A91F03008A0F29 /* zh-HK */, + 3A3040FD29A91F31008A0F29 /* zh-TW */, ); name = Localizable.stringsdict; sourceTree = ""; @@ -1499,6 +1525,8 @@ 3A41E559299D52BE001FA465 /* id */, 3A8624D9299E82BE00BD8BE9 /* cs */, 3A827A18299FC69D00C4D171 /* ru */, + 3A3040F929A91ED6008A0F29 /* zh-HK */, + 3A3040FC29A91F31008A0F29 /* zh-TW */, ); name = InfoPlist.strings; sourceTree = ""; @@ -1522,6 +1550,8 @@ 3A41E55A299D52BE001FA465 /* id */, 3A8624DA299E82BE00BD8BE9 /* cs */, 3A827A19299FC69D00C4D171 /* ru */, + 3A3040FA29A91EFC008A0F29 /* zh-HK */, + 3A3040FE29A91F31008A0F29 /* zh-TW */, ); name = Localizable.strings; sourceTree = ""; diff --git a/damus/Components/ZapButton.swift b/damus/Components/ZapButton.swift index 36c3ea23..d96b44a9 100644 --- a/damus/Components/ZapButton.swift +++ b/damus/Components/ZapButton.swift @@ -109,10 +109,12 @@ struct ZapButton: View { } } .accessibilityLabel(NSLocalizedString("Zap", comment: "Accessibility label for zap button")) - - Text(String("\(bar.zap_total > 0 ? "\(format_msats_abbrev(bar.zap_total))" : "")")) - .font(.footnote) - .foregroundColor(bar.zapped ? Color.orange : Color.gray) + + if bar.zap_total > 0 { + Text(verbatim: format_msats_abbrev(bar.zap_total)) + .font(.footnote) + .foregroundColor(bar.zapped ? Color.orange : Color.gray) + } } .sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) { SelectWalletView(showingSelectWallet: $showing_select_wallet, our_pubkey: damus_state.pubkey, invoice: invoice) diff --git a/damus/ContentView.swift b/damus/ContentView.swift index f3416eae..c255e841 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -166,7 +166,7 @@ struct ContentView: View { Text("Universe 🛸", comment: "Toolbar label for the universal view where posts from all connected relay servers appear.") .bold() case .none: - Text("", comment: "Toolbar label for unknown views. This label would be displayed only if a new timeline view is added but a toolbar label was not explicitly assigned to it yet.") + Text(verbatim: "") } } } diff --git a/damus/Models/Mentions.swift b/damus/Models/Mentions.swift index 445bb707..fb408840 100644 --- a/damus/Models/Mentions.swift +++ b/damus/Models/Mentions.swift @@ -263,17 +263,19 @@ func format_msats_abbrev(_ msats: Int64) -> String { return formatter.string(from: sats) ?? sats.stringValue } -func format_msats(_ msat: Int64) -> String { +func format_msats(_ msat: Int64, locale: Locale = Locale.current) -> String { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.minimumFractionDigits = 0 numberFormatter.maximumFractionDigits = 3 numberFormatter.roundingMode = .down + numberFormatter.locale = locale let sats = NSNumber(value: (Double(msat) / 1000.0)) let formattedSats = numberFormatter.string(from: sats) ?? sats.stringValue - return String(format: Bundle.main.localizedString(forKey: "sats_count", value: nil, table: nil), sats.decimalValue as NSDecimalNumber, formattedSats) + let bundle = bundleForLocale(locale: locale) + return String(format: bundle.localizedString(forKey: "sats_count", value: nil, table: nil), 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 new file mode 100644 index 00000000..de496d60 --- /dev/null +++ b/damus/Util/LocalizationUtil.swift @@ -0,0 +1,19 @@ +// +// LocalizationUtil.swift +// damus +// +// Created by Terry Yiu on 2/24/23. +// + +import Foundation + +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 formatInt(_ int: Int) -> String { + let numberFormatter = NumberFormatter() + numberFormatter.numberStyle = .decimal + return numberFormatter.string(from: NSNumber(integerLiteral: int)) ?? "\(int)" +} diff --git a/damus/Util/TimeAgo.swift b/damus/Util/TimeAgo.swift index 70626fb2..15917cbd 100644 --- a/damus/Util/TimeAgo.swift +++ b/damus/Util/TimeAgo.swift @@ -50,5 +50,6 @@ public func time_ago_since(_ date: Date, _ calendar: Calendar = Calendar.current return formatter.string(from: DateComponents(calendar: calendar, second: second))! } - return NSLocalizedString("now", comment: "String indicating that a given timestamp just occurred") + let bundle = bundleForLocale(locale: calendar.locale ?? Locale.current) + return NSLocalizedString("now", bundle: bundle, comment: "String indicating that a given timestamp just occurred") } diff --git a/damus/Views/ActionBar/EventDetailBar.swift b/damus/Views/ActionBar/EventDetailBar.swift index f4180706..c9005855 100644 --- a/damus/Views/ActionBar/EventDetailBar.swift +++ b/damus/Views/ActionBar/EventDetailBar.swift @@ -26,14 +26,18 @@ struct EventDetailBar: View { HStack { if bar.boosts > 0 { NavigationLink(destination: RepostsView(damus_state: state, model: RepostsModel(state: state, target: target))) { - Text("\(Text(verbatim: "\(bar.boosts)").font(.body.bold())) \(Text(String(format: Bundle.main.localizedString(forKey: "reposts_count", value: nil, table: nil), bar.boosts)).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many reposts. In source English, the first variable is the number of reposts, and the second variable is 'Repost' or 'Reposts'.") + let count = Text(verbatim: "\(formatInt(bar.boosts))").font(.body.bold()) + let noun = Text(verbatim: "\(repostsCountString(bar.boosts))").foregroundColor(.gray) + Text("\(count) \(noun)", comment: "Sentence composed of 2 variables to describe how many reposts. In source English, the first variable is the number of reposts, and the second variable is 'Repost' or 'Reposts'.") } .buttonStyle(PlainButtonStyle()) } if bar.likes > 0 { NavigationLink(destination: ReactionsView(damus_state: state, model: ReactionsModel(state: state, target: target))) { - Text("\(Text(verbatim: "\(bar.likes)").font(.body.bold())) \(Text(String(format: Bundle.main.localizedString(forKey: "reactions_count", value: nil, table: nil), bar.likes)).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many reactions there are on a post. In source English, the first variable is the number of reactions, and the second variable is 'Reaction' or 'Reactions'.") + let count = Text(verbatim: "\(formatInt(bar.likes))").font(.body.bold()) + let noun = Text(verbatim: "\(reactionsCountString(bar.likes))").foregroundColor(.gray) + Text("\(count) \(noun)", comment: "Sentence composed of 2 variables to describe how many reactions there are on a post. In source English, the first variable is the number of reactions, and the second variable is 'Reaction' or 'Reactions'.") } .buttonStyle(PlainButtonStyle()) } @@ -41,7 +45,9 @@ struct EventDetailBar: View { if bar.zaps > 0 { let dst = ZapsView(state: state, target: .note(id: target, author: target_pk)) NavigationLink(destination: dst) { - Text("\(Text(verbatim: "\(bar.zaps)").font(.body.bold())) \(Text(String(format: Bundle.main.localizedString(forKey: "zaps_count", value: nil, table: nil), bar.zaps)).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.") + let count = Text(verbatim: "\(formatInt(bar.zaps))").font(.body.bold()) + let noun = Text(verbatim: "\(zapsCountString(bar.zaps))").foregroundColor(.gray) + Text("\(count) \(noun)", comment: "Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.") } .buttonStyle(PlainButtonStyle()) } @@ -49,6 +55,21 @@ 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) +} + +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) +} + +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) +} + struct EventDetailBar_Previews: PreviewProvider { static var previews: some View { EventDetailBar(state: test_damus_state(), target: "", target_pk: "") diff --git a/damus/Views/ConfigView.swift b/damus/Views/ConfigView.swift index f2adb061..a246a8ca 100644 --- a/damus/Views/ConfigView.swift +++ b/damus/Views/ConfigView.swift @@ -220,10 +220,10 @@ struct ConfigView: View { } } - let bundleShortVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String - let bundleVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as! String - Section(NSLocalizedString("Version", comment: "Section title for displaying the version number of the Damus app.")) { - Text(verbatim: "\(bundleShortVersion) (\(bundleVersion))") + if let bundleShortVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"], let bundleVersion = Bundle.main.infoDictionary?["CFBundleVersion"] { + Section(NSLocalizedString("Version", comment: "Section title for displaying the version number of the Damus app.")) { + Text(verbatim: "\(bundleShortVersion) (\(bundleVersion))") + } } } } diff --git a/damus/Views/EventDetailView.swift b/damus/Views/EventDetailView.swift index d8654392..18999bee 100644 --- a/damus/Views/EventDetailView.swift +++ b/damus/Views/EventDetailView.swift @@ -23,7 +23,7 @@ func scroll_after_load(thread: ThreadModel, proxy: ScrollViewProxy) { struct EventDetailView_Previews: PreviewProvider { static var previews: some View { - let state = test_damus_state() + let _ = test_damus_state() EventDetailView() } } diff --git a/damus/Views/Events/EventMenu.swift b/damus/Views/Events/EventMenu.swift index da375fbc..57228d91 100644 --- a/damus/Views/Events/EventMenu.swift +++ b/damus/Views/Events/EventMenu.swift @@ -48,7 +48,7 @@ struct EventMenuContext: View { } label: { let imageName = isBookmarked ? "bookmark.fill" : "bookmark" let unBookmarkString = NSLocalizedString("Un-Bookmark", comment: "Context menu option for un-bookmarking a note") - let bookmarkString = NSLocalizedString("Bookmark", comment: "Context menu optoin for bookmarking a note") + let bookmarkString = NSLocalizedString("Bookmark", comment: "Context menu option for bookmarking a note") Label(isBookmarked ? unBookmarkString : bookmarkString, systemImage: imageName) } .onAppear { diff --git a/damus/Views/Events/ReplyDescription.swift b/damus/Views/Events/ReplyDescription.swift index 7e130d62..fa8f471a 100644 --- a/damus/Views/Events/ReplyDescription.swift +++ b/damus/Views/Events/ReplyDescription.swift @@ -26,13 +26,15 @@ struct ReplyDescription_Previews: PreviewProvider { } } -func reply_desc(profiles: Profiles, event: NostrEvent) -> String { +func reply_desc(profiles: Profiles, event: NostrEvent, locale: Locale = Locale.current) -> String { let desc = make_reply_description(event.tags) let pubkeys = desc.pubkeys let n = desc.others + let bundle = bundleForLocale(locale: locale) + if desc.pubkeys.count == 0 { - return NSLocalizedString("Replying to self", comment: "Label to indicate that the user is replying to themself.") + return NSLocalizedString("Replying to self", bundle: bundle, comment: "Label to indicate that the user is replying to themself.") } let names: [String] = pubkeys.map { @@ -40,20 +42,16 @@ func reply_desc(profiles: Profiles, event: NostrEvent) -> String { return Profile.displayName(profile: prof, pubkey: $0) } - let othersCount = n - pubkeys.count if names.count > 1 { + let othersCount = n - pubkeys.count if othersCount == 0 { - return String(format: "Replying to %@ & %@", names[0], names[1]) + return String(format: NSLocalizedString("Replying to %@ & %@", bundle: bundle, comment: "Label to indicate that the user is replying to 2 users."), locale: locale, names[0], names[1]) } else { - return String(format: "Replying to %@, %@ & %d others", names[0], names[1], othersCount) + return String(format: bundle.localizedString(forKey: "replying_to_two_and_others", value: nil, table: nil), locale: locale, othersCount, names[0], names[1]) } } - if othersCount == 0 { - return String(format: "Replying to %@", names[0]) - } else { - return String(format: "Replying to %@ & %d others", names[0], othersCount) - } + return String(format: NSLocalizedString("Replying to %@", bundle: bundle, comment: "Label to indicate that the user is replying to 1 user."), locale: locale, names[0]) } diff --git a/damus/Views/FollowButtonView.swift b/damus/Views/FollowButtonView.swift index d79a17de..1e96c34c 100644 --- a/damus/Views/FollowButtonView.swift +++ b/damus/Views/FollowButtonView.swift @@ -19,7 +19,7 @@ struct FollowButtonView: View { Button { follow_state = perform_follow_btn_action(follow_state, target: target) } label: { - Text(follow_btn_txt(follow_state, follows_you: follows_you)) + Text(verbatim: "\(follow_btn_txt(follow_state, follows_you: follows_you))") .frame(width: 105, height: 30) //.padding(.vertical, 10) .font(.caption.weight(.bold)) diff --git a/damus/Views/FollowingView.swift b/damus/Views/FollowingView.swift index 4628b2ce..41e9bfc6 100644 --- a/damus/Views/FollowingView.swift +++ b/damus/Views/FollowingView.swift @@ -29,7 +29,6 @@ struct FollowersView: View { @EnvironmentObject var followers: FollowersModel var body: some View { - let profile = damus_state.profiles.lookup(id: whos) ScrollView { LazyVStack(alignment: .leading) { ForEach(followers.contacts ?? [], id: \.self) { pk in @@ -38,7 +37,7 @@ struct FollowersView: View { } .padding() } - .navigationBarTitle(NSLocalizedString("\(Profile.displayName(profile: profile, pubkey: whos))'s Followers", comment: "Navigation bar title for view that shows who is following a user.")) + .navigationBarTitle(NSLocalizedString("Followers", comment: "Navigation bar title for view that shows who is following a user.")) .onAppear { followers.subscribe() } @@ -56,8 +55,6 @@ struct FollowingView: View { let whos: String var body: some View { - let profile = damus_state.profiles.lookup(id: whos) - let who = Profile.displayName(profile: profile, pubkey: whos) ScrollView { LazyVStack(alignment: .leading) { ForEach(following.contacts, id: \.self) { pk in @@ -72,7 +69,7 @@ struct FollowingView: View { .onDisappear { following.unsubscribe() } - .navigationBarTitle(NSLocalizedString("\(who) following", comment: "Navigation bar title for view that shows who a user is following.")) + .navigationBarTitle(NSLocalizedString("Following", comment: "Navigation bar title for view that shows who a user is following.")) } } diff --git a/damus/Views/ProfileName.swift b/damus/Views/ProfileName.swift index 9e8d6be8..dfabc9d5 100644 --- a/damus/Views/ProfileName.swift +++ b/damus/Views/ProfileName.swift @@ -67,7 +67,7 @@ struct ProfileName: View { var body: some View { HStack(spacing: 2) { - Text(prefix + String(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey))) + Text(verbatim: "\(prefix)\(String(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey)))") .font(.body) .fontWeight(prefix == "@" ? .none : .bold) if let nip05 = current_nip05 { @@ -136,11 +136,11 @@ struct EventProfileName: View { .font(.body.weight(.bold)) .padding([.trailing], 2) - Text("@" + String(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey))) + Text(verbatim: "@\(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey))") .foregroundColor(Color("DamusMediumGrey")) .font(eventviewsize_to_font(size)) } else { - Text(String(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey))) + Text(verbatim: "\(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey))") .font(eventviewsize_to_font(size)) .fontWeight(.bold) } diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift index 9828b207..dc7e03ca 100644 --- a/damus/Views/ProfileView.swift +++ b/damus/Views/ProfileView.swift @@ -49,6 +49,16 @@ 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) +} + +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) +} + struct EditButton: View { let damus_state: DamusState @@ -319,7 +329,9 @@ struct ProfileView: View { .foregroundColor(.gray) } else { let followerCount = followers.count! - Text("\(Text(verbatim: "\(followerCount)").font(.subheadline.weight(.medium))) \(Text(String(format: Bundle.main.localizedString(forKey: "followers_count", value: nil, table: nil), followerCount)).font(.subheadline).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many people are following a user. In source English, the first variable is the number of followers, and the second variable is 'Follower' or 'Followers'.") + let count_text = Text(verbatim: "\(formatInt(followerCount))").font(.subheadline.weight(.medium)) + let noun_text = Text(verbatim: "\(followersCountString(followerCount))").font(.subheadline).foregroundColor(.gray) + Text("\(count_text) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many people are following a user. In source English, the first variable is the number of followers, and the second variable is 'Follower' or 'Followers'.") } } } @@ -343,7 +355,9 @@ struct ProfileView: View { let following_model = FollowingModel(damus_state: damus_state, contacts: contacts) NavigationLink(destination: FollowingView(damus_state: damus_state, following: following_model, whos: profile.pubkey)) { HStack { - Text("\(Text(verbatim: "\(profile.following)").font(.subheadline.weight(.medium))) \(Text("Following", comment: "Part of a larger sentence to describe how many profiles a user is following.").font(.subheadline).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'.") + let count_text = Text(verbatim: "\(formatInt(profile.following))").font(.subheadline.weight(.medium)) + let noun_text = Text("Following", comment: "Text on the user profile page next to the number of accounts a user is following.").font(.subheadline).foregroundColor(.gray) + Text("\(count_text) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'.") } } .buttonStyle(PlainButtonStyle()) @@ -366,7 +380,9 @@ struct ProfileView: View { if let relays = profile.relays { // Only open relay config view if the user is logged in with private key and they are looking at their own profile. - let relay_text = Text("\(Text(verbatim: "\(relays.keys.count)").font(.subheadline.weight(.medium))) \(Text(String(format: Bundle.main.localizedString(forKey: "relays_count", value: nil, table: nil), relays.keys.count)).font(.subheadline).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'.") + let count_text = Text(verbatim: "\(formatInt(relays.keys.count))").font(.subheadline.weight(.medium)) + let noun_text = Text(verbatim: "\(relaysCountString(relays.keys.count))").font(.subheadline).foregroundColor(.gray) + let relay_text = Text("\(count_text) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'.") if profile.pubkey == damus_state.pubkey && damus_state.is_privkey_user { NavigationLink(destination: RelayConfigView(state: damus_state)) { relay_text @@ -506,7 +522,7 @@ struct KeyView: View { .symbolRenderingMode(.palette) } .padding(.leading,4) - Text(abbrev_pubkey(bech32, amount: 16)) + Text(verbatim: "\(abbrev_pubkey(bech32, amount: 16))") .font(.footnote) .foregroundColor(keyColor()) } diff --git a/damus/Views/Timeline/LoadMoreButton.swift b/damus/Views/Timeline/LoadMoreButton.swift index d98ffdae..cda930e4 100644 --- a/damus/Views/Timeline/LoadMoreButton.swift +++ b/damus/Views/Timeline/LoadMoreButton.swift @@ -23,7 +23,7 @@ struct LoadMoreButton: View { Group { if events.queued > 0 { Button(action: click) { - Text("Load \(events.queued) more") + Text("Load \(events.queued) more", comment: "Button text for loading more events, where the variable is the number of events.") } .font(.system(size: 14, weight: .bold)) .padding(10) diff --git a/damus/ar.lproj/InfoPlist.strings b/damus/ar.lproj/InfoPlist.strings index 8e309fb5fc306de648b873a0ca143590b311ef25..3841fdaecdcf776908c6e3ce5daec074628e0259 100644 GIT binary patch literal 710 zcmbV~-Acni5QWdxT=*1AKvDuRNGS;7McZw$MQTBOfY^!(T8pWIFRy-^L}MV}4`DWY zvU4VL&g}bJrbJF7J!_-2?sW}X>rREXpj@xu4ey8YBvGb4MH*|`;`kP0QRhc+Pl!mF z#Wt~X>szE_Ds=tz=fC{6?ovpMX7a3;D9m+Js`9J_xq-FSj`b1E z4reO03tfEi1H0jNGaKEpc}py{5s#Axo!Wr#HJaFv^Oy{$kbA&>(DJBD%Tl*=xFej- z==O@vb0W-Y$n?VeK2;R|(Av~*SFdXSO?{uaSNgm)x4@~#*Y9rZgJ!i0!J$L;bG(_C Q-gp~>Q`|ag3dlajPT9$OQrzIY0W6rxBec$Asj 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 IH?8dd11Vml6b8Wh{j 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 diff --git a/damus/ar.lproj/Localizable.stringsdict b/damus/ar.lproj/Localizable.stringsdict index 6f616cae..d2bba902 100644 --- a/damus/ar.lproj/Localizable.stringsdict +++ b/damus/ar.lproj/Localizable.stringsdict @@ -4,51 +4,51 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - %d منشورات اضافية - many - %d منشورات اضافية - one - %d منشور اضافي - other - %d منشورات اضافية - two - %d منشوران zero - %d منشورات أخرى + ... %d منشورات أخرى ... + one + ... %d منشور اضافي ... + two + ... %d منشوران ... + few + ... %d منشورات اضافية ... + many + ... %d منشورات اضافية ... + other + ... %d منشورات اضافية ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - المتابعون - many - المتابعون - one - متابع - other - المتابعون - two - متابعان zero متابع + one + متابع + two + متابعان + few + المتابِعون + many + المتابِعون + other + المتابِعون - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -60,18 +60,18 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + تفاعل + one + تفاعل + two + تفاعلان few تفاعلات many تفاعل - one - تفاعل other تفاعل - two - تفاعل - zero - تفاعل relays_count @@ -84,66 +84,66 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + موصّل + one + موصّل + two + موصّلان few موصّلات many - موصّلات - one - موصّل + موصّل other - موصّلات - two - موصّلان - zero موصّل replying_to_one_and_others NSStringLocalizedFormatKey - رد على %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d آخرون - many - & %d آخرون - one - & %d آخر - other - & %d آخرين - two - & %d آخران zero - + رد على %2$@ + one + الرد على %2$@ & %1$d آخر + two + الرد على %2$@ & %1$d آخرين + few + الرد على %2$@ & %1$d آخرين + many + الرد على %2$@ & %1$d آخرين + other + الرد على %2$@ & %1$d آخرين replying_to_two_and_others NSStringLocalizedFormatKey - رد على%@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d آخرون - many - & %d آخرون - one - & %d آخر - other - & %d آخرين - two - & %d آخران zero - + الرد على %2$@, %3$@ & %1$d others + one + الرد على %2$@, %3$@ & %1$d آخر + two + الرد على %2$@, %3$@ & %1$d آخرين + few + الرد على %2$@, %3$@ & %1$d آخرين + many + الرد على %2$@, %3$@ & %1$d آخرين + other + الرد على %2$@, %3$@ & %1$d آخرين reposts_count @@ -156,18 +156,18 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d - few - اعادات نشر - many + zero اعادات نشر one اعادة نشر - other - اعادات نشر two + اعادتا نشر + few اعادات نشر - zero - اعادات نشر + many + اعادة نشر + other + اعادة نشر sats_count @@ -180,18 +180,18 @@ NSStringPluralRuleType NSStringFormatValueTypeKey @ + zero + %2$@ ساتوشي + one + %2$@ ساتوشي + two + %2$@ ساتوشي few %2$@ ساتوشي many %2$@ ساتوشي - one - %2$@ ساتوشي other %2$@ ساتوشي - two - %2$@ ساتوشي - zero - %2$@ ساتوشي zaps_count @@ -204,18 +204,18 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d - few - وميض - many + zero وميض one ومضة - other - وميض two - وميض - zero - وميض + ومضتان + few + ومضات + many + ومضة + other + ومضة diff --git a/damus/cs.lproj/InfoPlist.strings b/damus/cs.lproj/InfoPlist.strings index 935ad6178532c8beb9cb48b21c3334b45db5524d..192eda4c08a9143a16722750ceaeb0f1c9888967 100644 GIT binary patch literal 778 zcmaiy%}T>S6opT=f=|%RkYz#p0OCRo1wl(ey67_6AB$}hOd`~U@0th5E2!VhM2FBo z7cQ)>8ET|6#k$kDgGoAwNqavA zd(DcKxJ(6WtScD$s-CWL%)992o$8%_J~(@E{a?_-*hN;|J>3}1=q1(KsY=)j?pjo? zl08GS!5Oc1qNjhnMF(s@GU$F(19J&m17Ai@gJ>Qt+c>9UMn2a(^7ktKjow_&Yp7fF zjtSY5EllUprsHFu-l<;UE*<{^ik_*Jvg|x>n6RDkpVER{&}2|}+K<5BW%t~Ht)DA6 zG^3M2WZ#|lsOyE*9Nvz1z-ZMfTRTlFlr+3ggS)l+R_vL+BF|Vk*J|pdD7I6uUex*| Jf6!&?qUjXs#MA>sY*g4SbbHdIe+qiyKT+y8*HtPt%cwqtX&; zItF4DN`L3A>qAOdl$9IC4}KQ@aoD`cM&g<8G|?R%DCI%G{Oc6+=eSS*DYvELshX9( pbu8k4c@OM;;X#u<_g?UV0#?ZBGi+eJWlu>1xznzHFT2~|`vpR(m{R}% diff --git a/damus/cs.lproj/Localizable.strings b/damus/cs.lproj/Localizable.strings index 730fa87c80e1b1ed86f66ef840c65afa47011f37..6a8ba2d8b9d2b5c5bee1fb0baaf09d1a87022d6f 100644 GIT binary patch literal 61358 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 jFC-gD1A-yfHs|3kJ{ z)PqGiUzXJ@tB$i#b)GFpMK&wv|M;h@92T=>d0ZBY?7Uh{hS^b(t?FW!9aoF&tXS~V zAlIwA**|>#(Z}~b`SM zi^)Y+oxS_%`ftVT>g~t>^`nnI-vIc0bg>=avd+rcSw1O;9pHGF&(ia3|H;8;y%T=l1)-m9~(Y_?)i z+rD0b`?Gvm0KxB?FsmoUaCO?8(+BO%x6|8V>AVt&Ld<{6&hkZ>A5DrnTUOc7NF5Rukx%p4MYbpyyR13(Syor81@AweolMGlv|~hd zTrTQmGl{@6-dIhK;0P9o_je$Xq5V`BgNl!7S-o-Zg)MR~gEZoEeQ)=p-v{u#sOB6{ zz7UzL)57oEgiiz++`f%OExwWTjjb5#fAVGa$(MFI{>kb4!K7F$vuRP+`AOmQT+Wak zQ`pc5I6Kel>}XOA#zn9xuaESsC}!!0H0{yFB)jA^t8sO9^=1|)|M&-Je&$TXk(`TZ zK>M(ov0{~ti(;P5*ozaZNkBZA|c>T9>cCq^*hvA6MkcoK)&n_x&X1jh<9xtl1e0KG-WXO0? zfvxOvzPNgGcCnki8ZNGXTb+V4O*pG2)k!%RGvY5u{@L;(o0iiGfpPt&*z)= z{u^{UfA`bb_#&&%u72gP^z03!4F6oCiEG0;AlM55z$!sttBc?@<-4DnWmk!mzgpzR zM1reP7y+Y@&2|?B+BV}erjWz}l1GxcLfn{4$tS`0lgaS&PxznnWAn|0tw@~MQwZdUHX^DYVm3md9xNg!MAT(W9e&gZZrA}6G(j4|J6lFIEjU-W5y z1fqBY^I$q(n$eLTiQJb02W`5zu!q`ePkF|uQ8BHH$+2(nf!?&uJ#mRTNP5}Vk-2DN zvS(0v(csl44+BN3O*_*u)Mk91O*x-ngo8;wC`Q#}D4+yrZ)R8UX3M6D>T0rravoN- zGw*{Vd!mECeslHnam@R0wOnEV3xk6}0X{^D(6lS5NjWHH7^wNlq9~@|2F7FIf`3es zOA&*AC|5$Car1esZ?loai!EYz`n!Ug{CccXh;K*^|A*4WS~M=}ccd*>ha) zg)EOLUpD3=MhK=$D7ImlBXqR40!{>R^$056G2>;i+>u@}4J@@2hNP+V2X;(>wsCW! z9aIg`KNvhyP%@M*>afG^M_HD&Lj#~JADTY3b1!Feu%6zF9S)sGge~+#|8ypaW*5b0 zOq8L|0lqvb(d^kAeOM04IWiT^jVSW1m`KD-L-T`x5}ljPDhNUx^1$b4jz>oN8FCmg zebGB55m};IeU4q^{T(-Rz7QUIvx1qcpLg70(7Y|yFuZ&l~p7T4><-x&|?AyYS z#UW+OMLw%>bL1VmoQrdcVfWJvpW33|POjd*`_U%3&*CM*7zgRo&4t6#kuH{?`5gu(fwJyiVx?IS7)p&yg%E{pU)Th*>I)b z2BSd%g`tg#dU*AAQY`=6J9<&j!+bV_6Q4|F7bnsJ3pWVF?r>l32wJ!-#=v@+vq&uP zqJU&fHda2B=?It}E#+QqouhJjP(sCFeRhms-}OTmZs$dI(ps83Lc~2dZdSOev6;*; z>Q00>k&HPnAs%7wypmyyonrPj*pdAs58TAv@oFi|auga{phmORtejyyu+UyUUDa*{ z>=)O+p%bw_!R$`P^Q*U@xGuBRq{45N{sgU4ltWg@9Qb(}qH!lXMLb}M6xmsJv>H~c z!A!ONSezJ!}J{Sd#-5&BscBEmT#FMU;HiC)q?c`Wr^<7A3>x;Hx zJ6Br!c^FthP9L<#Nr^iC-gaz)=wau9Z?OBI>mMF9$~WmDvB8=KNk1hOCH?XUnJFUx z{j*BvAY|EC9f0P+yO*$kC@0h4cpWZeqh9*rfdym`L8>7o!lnuaf|PCg%h=1@bw!DE*M1kOSBca)R58y`eeHb;ZiXf)6 zi{?QPQ~Nz=30teK%cBytbCIgvAvlh*X*|~Z<%fxD4an|1hWdNnPO{;WY&1Mzoyiyna#H6TZg(z z_Q9r=Z-dI{_7(%vB!=%}NW7zW00zaQ-X>90XsQ##R5~ZexsNl1zh12H{}Zl1gn%C9 z^(cFg9EJ4FCT+erC506&u`!t7-3zDziUfjC2qj?BFZT9#7w>-L2pXUc!`*6w%kP;b zd!)(xb0KCfv90lyum3Fw>uIvax7)EBR)rV>1J~yLR-eZSZ9Y@a1C}S9ID??Ig$W1M zyi8K}k$twgUXQE!)mtJkgangV3zWf5yo8zDGt_0iFAx=hI0ghvK25_pH*v70)ES5< zHXJpc0=sjChlIu0?NZr;u)4yB`!;~*CFWAnW4Q_hZ(G0F5hj$`j^=X?CguF7$`?Z? z<1Jco<2^lS-ZBLVN-x|X?V}aQs<1Zi0GN>S>cvxuFeO^H!ML`XhHtEx>x9thw(vM% z#2s9wP8PHAL>x!nF}z6pRQT*ous3B&Y>)Bd#+t`aavWo1IxN?EF1*BVb=9+QMj}d9^!Ph$*wJid{bJMt;)wbCOQ;plt<0; zV`eZ>Dx1#U-Q7)I)w~+!I6o5^dqh=9-VuOkEX{1(O}AXV)q6daBq3t@Klzezxc1Dp z9C?RE8Fi>4UTm@;-FK6e?9XB1u}J6D2m`la+-y&B*^Z|JUf()#3FH8D&6e(RqCD`5 zD@p3LE-p#Etg_W~LROlP#$Xhfc>F^?RYtB8dc@V0b(MT7!%(%jUw^uj9eV6G+t0^@ zZkD7}WRE@)BsM}~Gv3=JU>d>8NpV7e&Cl$0KAtF>Tukm?{rqVfylO@ZY9F7c!&Pttph%((#-Oz&6!mSr0*`U1P-$ zi{pGXS$33^M+Xv={;T`Xj%-m`b*aS*0uk506|*LUw`tQUVK7kC_k=B3xK5O{7mL2; z*9VqPP~=5fnYAURGr}nK@{H9Od;JT+5=IdT?K8YcXTx^J_;;IT&6Kx+N@jNB!fqcW zyd>X7@wc_N7sa$9R29xQ88%Z&gsn`3HBQDRCN|(R9@~?}??&z6G{0<&y!Idi+yoj& zmbTTIpeLAoqP|qRO@2fA{FgfhA^w=ZGySkP|JA=DY^WO{&;`hC#`^}#yCZ@UQ8lGK zcH9RT&2|4k5s{eh)3O#^u06{Fg<>)_X7S%`2I51gh}o7bMnp}LFQ7!V$99`ZRGEU{ zoBAOQcDU>0es+- zqdd-%xAS#WDXe=?R)2tCCZpuoA-14mB1t5Rcz0995*Lq^I)0|qu`TkN4C~kuuSlS) zx0flW*YZp;B=i~r4hpa$Btyw#ey}-SDK6fqf7xKkqH$FnHjV9{gJmu+F4N2!;iVP* zSsI;^pd?~FZFk|?jVRx+S8p(+cME$mb?7(P>R zgTZk9znVgUAPkgJ%DoDS+70;-K0tv?`5tY2;xaq&#dOgqLj7kM+S9-IwdH z#3aN(Y=B@XMMmuU;AzO2`-U!Y6y@&p> z2IKC#B!40jtqG_c!K}}z2#INoM-U1B{RKN1dL&mAz&1oI;uKJ!>O`FdFNcZ6kXSdV zu->9F)#MYAMeG5u`Ue$M*e}WX^&@kIa-?N^W{C|s_Qvwv*;54AF>>{G(0FaO8$jFQ z#&|$>rqkB|tJ*SVCf9;*Yk`#Xny7=VHiNW95Tb~$Aad{wA9`$Z=%WKN!Vc~vUz~um zTFj*yL6(cXb!q|QJt;zCMx;?QZFjG%(m`N4{6;4yh}R4qW@B$RgN;orlT<6OEtb4B z$8FI%VcSuAbQiQ*ZEjFYll6BaeTl+IeEpS`7`m-^*Q4EnJtgE_p{qyBj<^^HN+R4xjG4I3gox50nSR zKI-@w%9A4p{j5}w7m0IQ#uO*y8ZwrjV!4hT(y#aZ%cMFY4R31D4IM9~GP_qP0c`ti zNdT3apv40Wo5Uc{d{=KszNhF(XXQyb8;b=_C{{tNAQ4cf#~4?zh6%}0@q>w;m=#mQ zM@50Bk_;9p=#^oSi{|$bzHM3a+G1TA_=`>KPm=EF&22xmv$kf(2yxDN80d~6XIWKA zuNRN{CcfqkC$#b6>em!PSesGYxk*Xsr2DA{13@oPXR#<=24yIhujGtTLqi@~yhk60 z2E+%D$JZ6&dxJPsbnJ!@Ld)oY%1`r?D1e5Wy%^~RVWue!BYV~K`j#~ZsS-p?7ddpdVXnSRG~Qt)CI##-$TE6sunrdVTHu{g&_=vlF*CSX zv!yd^SrlQ2(DWTz$#h>;w?8*tby^f>&=+efz|i2aEf3`hW@gwd1?Vhtmob1hm`E?1 zn6N^i@NjsWewaq@cs)G!W+aLmgT@1tk>7b*ohS;YO3&xRC|+wpZ|VSBM?Q*=07J&C z$NVu=_-^7?O?1w7gjf@akY-&iR85m$5sBf+sPqrnXaA2%=nje;xzBP~Db-EVxx!rA zr-=zv0LUa(m$LBEK{XH>%7Su%)k9j2nRIf1QW*+7&M^fI+3FNpQKt&^e?`5V(8Gc} zQAW`r3CrB`?OsG!kc#-mY6UMb^p{p(NM#@~FsFZVBr72BS8mF!w4~okJP-EmWY1Qs z$ad(HL2nf-e4C-##=eFvcEI(E}D%H8u%>}ld zZk5BS#dX^5bIyFj9A?0%jR%?^7IV-DGbeGwHsQ4f>)V_o*NzQbq$z$4_L_q&c z?+lb~j&hn78-SYYtrN$l)S*T(dU1*Rz5ea$%~0*3o;++)sWb|a*kMI46F&3KEFv39 zHvY=GS8t7kp}m5N6iYv)s&p$V9!6To=e<~)I8i3MtnmzKi%})TL`{xT4zmsX@^B^iCa<|CU z`qsXi6x^?&-Vg_ZiXvkPlQI=?ZyG8rqqZNAq>_Us(6cP36vKHJqD+|v@=@$s1(r%` z&=fc-=$2BTkitb6&aKAR7_T$WL(>y7#vU5dt3)0?qu>L>jMf%)MNxUd^V2d}mM^Pn zqUb^^i}ouual0kp>68YR_PLSpD<-QJq#N7F!J#!UrU0ISZtR(z(7i=Si(O&`Pv_Yw ziQ=qMP8HQ1#CC48&Mw;Nu(h|xycPOu6tuh<9Xc98DPrSAGfKT3S~6ik7Yp@dmdfC( zUhrZFx5+L4iui!BR#m`Qp+zq@%dt1O3C+WOV z{Kns1hUBA)wn#IN)ncj%Kwi&-bX5_7#?FDrkl>u?s*#dTof*Dt`eutXtr>||5f<-{ zmLKHhFzfWTs1-|1k34FE*R58$AusOG97KN%xn}6SNe^{`RQ>Rnc><7wCT$gKFEz%L zrYbgmwjJ9-*Z+n|(0RXK@YR}oW@tHHUG+ddk>NJ7KENu?Vaz2>MSGT4?xk&CF1U37 zw{u9So$lFXKS8`MXj?9AAx{>=!Kf-`@W8QsRwzcu-s7e1 zq3YDC?bd}jo8X7Bs%E}hU{7oIh9dCqQ8!>3KDqZzuP8yvYS>knD(-0uo&ws|6eE!! z^T(B;_4-va4qZF1v-|1_A@wSB`;$&U?$bCljr1dHfM|jYx2>}=VQ;w>itaku-@}W_ zi*BySIaR~Cyt`rY+CDVziJ-l63;hFZhsd>bl1S;id#(8@VQyqILP)jbW^~MU%a|%Yse@E!>x1xWqjL2-7Zhlb_3G#CN>1yT9bj@Ion?PTv;Ac2#*%!u z&7`%~PW1oZLWy*4SO^50bK{LgW>$oI1BB9DN>3whFrHir`nJ}$!zymfeq*Vr5ViOj z?$ahS^+sL#f+jQ-h;o;nvut#@uP?r?NFNsoJ zX}IbkzUu)b{YWOo#mx&_z%cSUzp3si6+Af_QfGl;L#Fdw1W8DA@x-kVDFlwc;O^>b zfyghyOEXNwS+vI04f4U!X3^3FI7i}mF;ZA5GJ=GvNrX8Fz*+U;WMZfIoL)U*N?G#bgRc;V zL}WKx)@-6~99nAKh1m1Z;>5OkGT(M))8!!M=)^TBKbt*Jv5jXbKI9F@1Ky0X1 zng_J<*zmcZM|8G#TzOKODktz$qdHp#CR+oln4TeYVq zXvinS`dW#<5FX=$nEfrCm0mIDOsEexM8yQrfgi{>nY_MBp;Yf!oWN&};IbM1){Ned|sb-;?{Hpcge_Hylg@0r*XrN?J|Cw?S6 zm@|+fsJa#bm4bIdS*uHe8lxIzo)r`1t{)sbHre3HQ5gmVm`iYUz?>`0zyK6=Q7qXw z>jo`;P+9DY0L6BAt>7RSNZvCR+50am;5NMiAll>P4+U+QFn*8p%tMqED?8WTJ)y@yUq}z|$f+T@TZXs*W^- z>=PzNxTuhFeD&|cfTY8UsR$_o;?VnOnV-bAJV+kTzR3PdR5^W3Z6*`;o;#wuWh#a{ zb_1$q+avQlT^=jJi;J)b4sD$jZuHsPTE0z>N~ET0ivl)ilYtfwZ41wMO}{3m>Z#qW zk=&4%`Ki(mk?I1%^@8A3`9V9Mel5g8hy+{4JHom?6CE->tBc9he&W`Q7 z3vN-wY-)dO8(mge02NMCFSZq^NgXu-jP&lIiN_}2?7#FDvzx-!x@uC@tI=+pr1owi zQlu*XB5#VKc_NjuUa)z%G0Fqc8jIFKtibztRfz-+s_QpaSmIa3tytkQALWYZ6WwR{ zWj-id3fYE;wWKj0Cjb|Jck?t;P~dmk-j*KeTadgB-}X7X`g*Y|LF5=2S_?(HJ2BF zNk@@DxMYXDXExb^BE+z>-DIh9f{P@CTf*@YmcSQT4jd(OL)_C2gVXV7Dg+FBu06`a z`;LU;$lUzeeFgW!n^a~j+!e+$(9^1&1CxbXPLX>GQkz2-W^Y=9=$cr3>loYqYf>3R z0V-?v<5T@q)yewogGo-Z2JC``!7>X!1wfb zxe$#2L30IPvbhzB^c^(8M+@Z$(`|IfLPsN&91}%6Dh4@XNoH&rK3E44%`}b(tEX^Z zqX`F1RVn01LCo3ppSlRo^1-Tn#ehl^vQFGRPCmWkE6}QezLIiK^%6udmkD#mWnC(e z%DQ-6kC$>6X+Ea8Rw>uconY9OevM8K$>5^oYIJV$Mn_M%s>~dY-Ry9ptII(<9rGsa zENgFvYG+b!w9}Ew=};m?pb*Q0in39tyFO<^k;V)NICV=DF@s|qYz&R zcSz^Rn^L^r%YxqPfNaoztnXcFvZSmLe|a${T1RJgjpLLmGj_5|Dg;^a)cHpxZI*w; z`n5#*W@X2L-SW2m6*ri<2~Gt#hy;~bEGno00-JCL9brT+a>u@aYSOv2vNzo^Zer0; zq_juymDng$c;YxhGCDM4DSpNi=0Jy)-Y)nY*YU=_Jyqx?=@ zgukp+XLp}F+I|>B-3hQ+FNm%jab|g`t_&5+*^R_aR;Cp%*T1lDaDseHz(Q6{z?gvUwRn$b!*ho9LGqI#4b8?JJJrqyjTjx2)+D)iyt^2 zN&zI)Py}^-UM+^YgC6%@;5i&NpIwu`Irxmn4sQXY&J z`St(s0Vz7(vF7`Q8Wsm%juxbClWfsv+s}90=rV32Wp^n#dD$cdjHZblA9MR8tmzVl zLO4~_qKKel%PyGCZMA`w{h^^~GxY%IBP+W547yaZLB`IKV6<1)?4b1BBZc!R`^0~F z)6};hyq)8-6}7Lbdoeq~t_4Y9)YeQ&o|1~fz?>v#R@6=Avy)X5S9#g=4(&76 zFr{!{+-sSx)k!{TyGDdDJK=s?OTj!##WXOWF{K=-p?)6(G4j3u^uB=v3E>qmaGGCU zj8|Fw?pEh}0g`Un=zR3N+lPZF#b/#d$1gdw)yAd^}^^8mEx1a#hntF=7iMCl$;9-9eA=2HdH8xm{eB_qquZZv}K9$_Z~le{PMA6b&7wt zGCEx`%RB>JwQ6#tTatu{(@33{%xLX_Ij!ls;WABa%Y?*(E@W$_-Ko3tF;>9^Vv3D> zSlDD^Y*wJQ5PI3U?Rr0-m)xwbqDlYVDlU;3emzCg7h%{qs(z42T2Fbi=Y$K{YJ`M4 zs~VTqA=z2H*-oG@o(eFF%te&`Q8vrd+*AMa5<_astc~+xzH2{kfS` zN1h_|Y7YdM?O_VViqfTQ`qw3x7yhLLN`EJjCuxLgl$BYW;}xXUt229*Zq8~d%-TC! z))tXPmVD-pYaG)D!D{~Xm5n0Wg|`1m6ekOL34+lQ7AdBSmnN1-6sIuU)N*YNDFx4J zl)Y&&?G_?E>jP2iuUYt?2-&dS{0|bP%w)tr)NxWP5^52@4VfJA6mfkfFLjFXhnOS{?;+;z`QHFZL&TXr4`S5g>or$%)5pe*-{>+m zmrGZw=-vI4@6@29U^zEcF)|u$buW0ySa(-2+^2XciY{Pa``frZL8VD>og4hl>48>% zvcp7fifb`$RAez68-MI)r6NkWX&IMTba=--Ixbe?o??)pKt{^aD}WUXNe*CigOIh~ zy~OJg27?^ivC)FwdZiMx^rB7Ject}hRnq#EfOcv z+L9o$HGX6eXil#+);006C#%&7H4?wC3(4R)key-H)q3rx!=})c#dj21XhI0nh+-G1 z>-n$MYR4^HNLwTdE$~44AHuVMB(z|bo~YNJWBI7qxliKmY4ReXS2yF?1Tmo)KgV%c zyT?T26XfgbIX~UNLamJ%oTL>x#XwM@@%i%VKYD^(WW_G|%XUgvzh7oFV_hCuAfcxp zzN+waTCQR z76E4Oag)X}deJ%+F)AS=lu7UpZvt0>!lYEQCC<9~8Not+PLWpP9;fOLf`-d^bxQkS zAnm~oRb51G6BkL`(UM^J(Z9}WH+t2gB!+dXNAxwlo}7>m(NwRCBiz`?D8v_^&wmJz XK5R<5?Vj%Yp}a2aOHApX+2#KO_s7Py diff --git a/damus/cs.lproj/Localizable.stringsdict b/damus/cs.lproj/Localizable.stringsdict index ff34d940..5711b13a 100644 --- a/damus/cs.lproj/Localizable.stringsdict +++ b/damus/cs.lproj/Localizable.stringsdict @@ -4,43 +4,43 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - %d other notes - many - %d other notes one - %d jiná poznámka + ... %d jiná poznámka ... + few + ... %d other notes ... + many + ... %d other notes ... other - %d jiné poznámky + ... %d jiné poznámky ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Seguidor few Followers many Followers - one - Seguidor other Sledují - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -52,12 +52,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Reakce few Reactions many Reactions - one - Reakce other Reakce @@ -72,12 +72,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Relé few Relays many Relays - one - Relé other Relé @@ -85,45 +85,41 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Odpověď na %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others one - a %d další + Odpověď na %2$@ a %1$d další + few + Odpověď na %2$@ a %1$d others + many + Odpověď na %2$@ a %1$d others other - a %d další - zero - + Odpověď na %2$@ a %1$d další replying_to_two_and_others NSStringLocalizedFormatKey - Odpovědět na %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others one - a %d další + Odpovědět na %2$@, %3$@ & %1$d další + few + Odpovědět na %2$@, %3$@ & %1$d others + many + Odpovědět na %2$@, %3$@ & %1$d others other - a %d další - zero - + Odpovědět na %2$@, %3$@ & %1$d další reposts_count @@ -136,12 +132,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Přesdílet few Reposts many Reposts - one - Přesdílet other Přesdílené @@ -156,12 +152,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey @ + one + %2$@ sat few %2$@ sats many %2$@ sats - one - %2$@ sat other %2$@ satů @@ -176,12 +172,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Zap few Zaps many Zaps - one - Zap other Zapů diff --git a/damus/de.lproj/InfoPlist.strings b/damus/de.lproj/InfoPlist.strings index 9bff2e1aa90dfa1a3433e7dfa36648bb1d3d51dc..ab356d910ac4e57e3e7816630e329274f448d0f1 100644 GIT binary patch literal 820 zcmaiy%}T>S6ot>)rwCaVv=1OIT1!AEr4Zb>izfY{X%b9Q&}T2|cPFVsFxbT;+@Evq zJ!j_oYpRI?&DE+n;aj3Pz?n|% zO7Sn=&>lOE^tzWY9hlSkI>Y5gJEj$G%7#gwoQ%ol|CX5>or&xYtSit9m95)sLoI-- zb^lAfay8T1^oSTGJ0_mdRFlgGo{xF6roRMV!oOsnS2z=n-TjPB>^)pusmXc$0d8FP z&hro1J8sW5&gI=SFOJNQxuuMqOs9EgKArkIo0HF-dtJWM(z@P;KK~N`_jV7fy_TqV Jrq*5W;}3pzjK%-} literal 415 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 collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,15 @@ NSStringFormatValueTypeKey d one - %d andere Notiz + ... %d andere Notiz ... other - %d andere Notizen + ... %d andere Notizen ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -31,8 +33,6 @@ other Follower - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -69,7 +69,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Antwort an %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +77,15 @@ NSStringFormatValueTypeKey d one - & %d andere + Antwort an %2$@ & %1$d andere other - & %d andere - zero - + Antwort an %2$@ & %1$d andere replying_to_two_and_others NSStringLocalizedFormatKey - Antwort an %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +93,9 @@ NSStringFormatValueTypeKey d one - & %d andere + Antwort an %2$@, %3$@ & %1$d andere other - & %d andere - zero - + Antwort an %2$@, %3$@ & %1$d andere reposts_count diff --git a/damus/el-GR.lproj/InfoPlist.strings b/damus/el-GR.lproj/InfoPlist.strings index 59d7f9965152be114c887d70da82205958d6d0e8..91d408c9a498efbbabcfb264e2d759c7a6c03aa7 100644 GIT binary patch literal 824 zcmbVK+e*Vg6dag0zar$Zp#1>xK`jMAN!Cd~=R{}Qw*Gn5P_>a!x29?wY^s(9 zcCD(4W>0qws*R53BWZTz%v5a+8((;X&alPEO!qls4jFR53p(iAov-`TG)!lg z)oau3PtD#xoXPm}>{IT)dvzu)k@QB^m!}#1+3)$urI6=!Z5bNh@TRnp!9nS02HoT4D_~)sP#^ zT*=9_)`E8PnLqE%oA<_Q!0FI;yB@eY>UUKPzUq0dJZRZ)8L4XzY%g*`-5=<{m&NUi8gJQx?tro#pRl3? z3tZtd;JXwV7W9B$n9&$Bzy&umpoB&=qZHq`pW+fIWw-(cd5Wg|VG)`ED}7=v?fE9w zuhY&=FbLpWUxg}+;ly=yZ8O^IT=*M0v;U9qh;uBl!m{>DcR$YLuzP$LHEklUD_qcs x=O(O@%e07a&1a!8V=r9gtepctODus23Ge&BR}P!gz1%}G^8wh#6wAXp`Zv9c{VV_g diff --git a/damus/el-GR.lproj/Localizable.strings b/damus/el-GR.lproj/Localizable.strings index 19ee5ec01fe355a621022579eb90f328e156986c..165342676d6e22f821e8d4bfd59b74c9538b4dae 100644 GIT binary patch literal 62948 zcmdU&OS4|pdFS7%Gs`4j;lv#qoN9}a6kSy-BtH9$P_2+3IWeX{lD*5$43#g(mhx8B*hw)OVbrLFhklMl8&jBj4s`oiKH zvHqXLQ^4i$;zx_K0mJcF8@NvgG(6>rfE_3k8=yGZz7?KN#P2|TD(>HozuC_Tz!Si(7^Zf>yp8*s=lTbey_|^5!$8)&?7)IXl`#lX7;U_qu zGqP|Z{yY)#0BuB9VBKBZ(S8Sm{}JDwZud)e&IWYw20HAxj)_dEq?!RX2O{bc+O`UH#_P)%gEX zNb04yOY*tB_%K#^CuH^Gt>4A>mqUU-ZC4@1Z^hl8ZjCs<8sC2!*ItWnFKq$M|B3tG zj_a>(y}Bp)Jm<>R#rW-aTkps9pTz&~1%&+kZv1quU3YowS8>hzvBs^^lPceE9_hd~ zpeHAS&QFIfi9_J=A6fbj2Sz6sUkPlUh=29l9G+N@o+{O{#(cY6`y}|x$V2iDlAK`P`Ui>^iqw{>5wibzgviSt${pVl$ z(?4M2u*0(V@*zKLzny5ZjgP=$V6!FlzM2)VAkZGmKWD9<-TM9KcJbqoC?xHT`0TwV z??@E!f@D@!9s77WB=fWQp9lkq{IFT*?Zw9-yYKA%Y^fveP#kh;>(^mZ|8K1KX57%15LqdTLWKGvuL_Rt2};b$M;b+2A2K)SOx55sRS!l z>9O$QL@VEKp4~hpdLq8U#*I)DP35!u=)kfug%$Y%6Qt8mAv%R#`gGZI?pQoDV17re zp}1rE-TBap0}*d-w?DU=Kc@KkW_fNu&GY#;N^h?;(%PT@@#y^HkR#;)$3rjh-PoU$ zNNK^pCv8{;@s054yNwE!JNiU?>GQe+Ei;5lcZOU(61sCTD5sy!#LsswzTEz7w=A$m zFJE2!`Qn>#C7I=B_kXS3(R=*csfA>QPlSAsGh=Zi4Zu&9h)u;`k;Byt`Sx4L3XyWz z843x2Ftq|Cs)Z z$_x=6p7~sOeo1DpE9R3tH!&YE33Ryqd_ueDVZITb5N~MJsz>?hdK-H_V&+F$G)>ir z2n#wL2{T2ES``=}2xGhxXCG^DyNi%lV_{(_eSU&_d zvL<3?{G@YH;mq$?0Zev*?r3-*QKCZrj!(inUH|&&t8=w+^|x9^^GVCK z$f>A@y&HcoNAC4jWHqlvp7VPAM&9#gd~+#st5@4MA4NX&o2}lLucj`QP3*_!)KxBl zeh~koDScf!@zRy53G~-*FCL8i=4e!Xmh(}z3F#x(NsbZ|Jkj!Go=t@r{_MuTS>>!5 zZNdZPsMC;jx?=NA{C+iPr@AAbl3n)DamA&m%3N&~K~>6Cbp*!$9p9XALPwdVd{;OD&5(Xwh_PXx^+^O9{iM>PFde2Tq7{;LFkvsAYD zxqr&>w%TJw`jKZMFyw)HgJQDOnbYwEa$KZEQY+qEXwf{f1mxm-^|?Sd7s1(Td@mx} zqw(B~H4Zc@d%nemc(@1SdC=m{_@rL<^>|+Y34Y{kv*yUg(+jQ;Wapd3mfgEIp5^#b zJ~K7*c0#kgc&62_sjqw#a)_4SE+vO!Y1L)$sj7^xpud4_>LETF zI1@>nYWj=clpjqBFUOrCStxZfSW(GyL0pJ}z~cR~YH-J`Bf??)8= zbb$Bnwi0rJ)t9`eV@CB~vZ1;tl7Xd6y5cjybhmK;&+%B;6D((1S|m{z18vPC)VU-l zRizNSrsvy#Qt3E5aEV@?AnP%vqIxYP>D2+hDnVME=MZ%&QUNMIPnJ$tQ8PRg-}UjH zD1+7jYtNa!%gEgcq1O6YKMOT1+DLx#3Anb^+g%6$w zkD@97mK@$t!J;e4?~2~CD-H)o4>02Br&o!4E~M*X_~O@_$EL5+V>K^hCz~_@ld8s& z8FTt()Q|vKQa`^;qKN)|<=k*wKfAaCAz>?bhTOns}Pol#fBJ4nK zhr#J9doTf;qF%T_Rs>9Z1_$67ls*xE`3-5K#;5s&-kz!UN30GrDM&~vqFmTlT-iT!!c2c&E{f2R;W6mUb$r&n--emGG)zEQmlI)dA+ zdhUB`#8#mft&o$9k$MOvSM-kYGid`yS$Vv1F=_d1gGo~&o(p+(q8|r?zxZ3CGTRng zp6p*aZqU{FjF*~3j&}WMP*}Z~>hsAtt-+GD>hERi4o38Ne?UVASlJA+CEdZwkg;O% zp{m#FYbHHa`ql0XsCpQ_T)6stNE%W98!az0BzNxhg2^`M-P)6JXXWWU&PZC$cVJs? zKh7fzo8a6}YS4MUyftEcFt|W`0gtht{d5$3!(z|}B|A44mDi_Lk^BRr`x~+u{;lUH z*SRMP-|79=PnfpCUfCn{>*AZxv;SJS{#37Y3Kt zL%NC9G|BVk)^FqUkD~|tPW&OG>81UlfLHb=W6ac4<(L)P;!tcR|}Fst)ve2(T) zHDjVdb2QX@fa+Rcaxs1a1EzAASiq)%A(K0~A~mC)g4Ms!aaGeH;CFuq-Qo6+Rm!R@&#Dpt#`s2EhA`$)49SQ1$d z?C+RQ*;}m6T*kY4&yx4v)1H;p1Z7Q6#dCW-urS$_eLT`v&3fM?d!6u;r}aL^5UX=vBZ_&*b=?>dpii#O z%D-b7991o+V}*SgTn{&Ybgp=TWsuRK&;;Yyb2t|8;o)6PPL9vnI>o^5GSiz;op~NY zXgbGlPqC}UwP_udY@ny4pKfo9cgFXkXPU1P#d|KVmr>>Hrf#i8Bz>niFo$d^PpcHS z(lR~Ou&#D#c}<0;ep+F; zbrd9rI2AMUJ=Oeag)Kj;kX^skB+8&_L6s0mwe@s#Xe+7?NLE*DzcnuH3gzy zPZ0Dq2XrN;5Jt><=#m1@M7+i9J@M2lttL9{Vpf~ob6(JE_Lw^BnSkCsg8kb@&m;Er zvFm#lG*p+2-ZrrrK2S9=US(a*?#3255f2*MxR7kal$e33R zsj#GO{LhGF*ei2wh+%G(-2w_?8g{Xbos99jgmU^#wPd{twcbB^lsZw@r<j z1|Q&r_a63L!Af;u>aOE_m8R#%rgWHcYBwM|U8_15%JHc_xq)lW#!@MBOM8N3gCfuplRd0Qx7+C)1Y}IPZ^I&idU6n;yO@FOU zo-RPP&-~PMl4>jCN}r1^_AJ$GTkSgQ}C>@f7uSML%n^I<_Vfw;TqwHuR_GYh1=nJQac}p!nuxtTwh~Ac zW#(i$`{t1id-dy^8oH<4otS(2j`{@C|F2JSLr=Dw&bE!3B&E-*9+NxA=&G;Lgr&L? zk{4>uT!BB)PpKnFzC9)tc4jc)78VlCs*;f1?8K#hR;}8N(EU(6pSXieh00Unwr*-m z@qG_-uI2p%SPv=+I@#vwrV;nWCu9xsn6hWgOke?@4y~ye*A@Rc>_2k~Z-#a=?*ecB zInFKMG#X}pICX$I0w(&IV)#|_rk5rYP;(ZUiAmQa<|2Ohler1}C2yimXIU_xl{H{N z9*s5eiOe<4ty$*@MmpAeYY!-CBgtm}5vM~iAK?f}vlH(HMXp6;$Ry^tr(u(docCbk zlc-_AGjS>FCGPqlMHOQ0tj0ps=|pIVHsNb)|7{&69|R8D3$MxCM_r|ALeE*-8+ft0 zBCVc4?|)t0?$?x`%N2>M@N@V*dS=LwVnI*)ARnp+jgq1$Yd5GOTPW?rBdmHhPlBqN z!Kzg~=8yWENV8cP<)!!a6E=~A#CEy=uaY2IpDKE+nO4uLjn%pJ6doxj9a|nTA&-V) ztf-|1jZkeCE$uh*mi5=aa4o4S571+i*;K^^Pa%8h`e2U@R)BfHE1%l}eD<_5IIYpw zO0s1fSatRsQe7n+*r)N)Xv3ygB(yIzYpv?>T*Y=?CV+_fMJmG5yPBEeXSC}ym z7VV47Gt_z*S%aQdzn2g@?b@Dgq0ZaN84rA@ViowS^SFpcY9w$tEL5I)1Kl5qKU~i< zv2A1h{7`(t_e6Nw8LPXAhc>EKp=?4=zCAqL2?*F*=1C)bAW)tu zm>MH2EgYsy*#boO6ay&y0H^;>dbtT(51L*rpoW^-^G6F*Q;m6ocBw&P9xU z6xv%AB%%7;7h9G_-ur4;Hq~c)JnoC@>9YBW{GSygf0}a0Pm(I-Mnn_tHu7{V12Zg4 z*Nojssyh9NpDC;3d7w!V&X-(%PGyh%(Rjji*Ohh0+yW-x z*Io;8uI4K`>z6o9(VMCZ;MYrZuCjcmgy#armA+nd@wtdiJ_v1O|E6~nFoo|rn|5Ql zvNVlARp0i+zbm|SlIZHOFPEp)-0pDT4yB;LSn&qWsivVN%EuHPsnR6ukPI?bovhT? zvhzutUBEfd$=R19GQ$R8ck#Ko`e4L!ScTkm-Ajp{lvp2*wRm>Vk>1Ky&!0FLCfQd> zu(b{dxNFRr`)QAR8;^8nLiEd!6g0!-RnRAvUs8RvW*aS~& zWR$Q>LUc#ZA8KvO&Jj5p993^OpMmtB3tbe&(N@`KpN%T|_RzyedX@cIr+pLyCVgc{ zwxnV#DlEfJ-}cz07GS4)4X9R6P_shXWT2kfJ@!1_~EbocXH_E@JLj9E_L<_KYMlH z)s6HEIQ0y_0i;MT{DLFEeyDw;Uc&Wv54>_>^lW4;RQq3moR0EN`(QB?y zvCEX68F@fn;a#V2YZ=_$SFY%x^5w5%C9(=%@vZp1W-UJp_~}F_O6uby-P3E*d{u<# zeK)Kz5Q5cX?O*-uNpRKZ9*yV2BiRt*0G>x*sYMOF0j`owTgaT}GvPjq$bJ znxhq-@!b|3>FjUc)6)nJAPp+&(>9=2-;uJV zn%XjBzucOQ)TkMsr&*e!2(|J_h8uMgacRtSFyDR?m&p5EB^>^*9bYSs=`024C_4~cQ>hS*Y9sRT? znN5%6QBRr5nGu5@gns;G{4wsS;p?xgSoQiig-Cu)l87C|rcNVYvb&u2BJUuAQm-BU z%NE;m>9kX3d#JFE*Hx_VkMHR>%wL%}zZAZeiBY|iN8W;}CU20SQsBZ=vgbG^YyL!ht;)OV*RtgdV1Pujmdg^{}{Zc ztAjP@x%%YZyG#6S;`ChPDa-(K;tkkoBIK=z``OJzj@;w4f32LGX?QpC4Mjn{?&Jib zdrX1`|F8KgcR$d=I>$LZH4&UFbL1K|lKW-I7P0wU+;$_m@gz>sDaOo85Y!G_B(eYH!CIdzj|t9Cj;uNmSClGmr1oJ`?){mnYkHG5_&5l;;VZZ*xZVorI*j|tq_*FR)?&u{iIYz zep$Z)tG-i8)Iaxp`5Ny;T8F=Uhp$d-=T_G4qw)N_gUy$T{^NNHwLa#UftB%4qg6_~ zqVE%y7h2{dOTwG-upd2L*XbWMo3TGXhhgnslheURuA>IgQ!+nKIP29teD}ul(JSv- zB$D&VY1qx_%n;T~^-gq?XkA)L9`$sCNS2IDPtk-mfY>nKRhb>Kq%Wt}D57FgQ&yhH zYwT;w0&lW<(%=`tt9%Qct-$552<}o!85mF&Ym0z&!QSi(&FV-p=A#XwX9xS4mNME9KyWNQ?KV-gq|8V zYaK@=z@tpsQ4$(O4YJRCupN4~-nYxuy|u6J&EwvlGjnwuW&r*x{4~uBKM6nalRz~ z=yMQ>#_P{me9<1uJ1;?1haZUN$TN*+bwUxH-F@P^py?s-nTUc!TyhTV@A4fVDPg?@ z7G04eVc*jxHS8Zkw{$+}?;>WQucKPL&k5CgBJ|m%CL#T4iDXurSmR0=uIGJ->n0zt z{5s)LPiAIDvYC+LfAJsQ=SeRCZ?K;e7KO(YDkkhTjnP}6{rHqk;)w@BGucJhOPxMT z&iSeyrny+E&pH3L>FzY=R3)_TZkJ_WR!?$otIx(adsbrcQgBP%YOD`$kx6e}*XptC zt+uT#86EKxRiM-xPKMLoLH7keiF$F+;ekSgc zRgk5}9x;ur$Uyb=c{oP9CaYC>|6n{NDfaiRg4)xg`ogjHq$*&Z8fe=}&M4S*7OUWP z%>r9S6hp+P{6qZ^awt!WiHh38m|X+Wg18CYRK4L`tVO&@^e7Ghm1d;j6i=92p`Uhv z4)fPZ7Pa%1r)IXVS^(S@oYXc>#c9cUJGE?MTGJ6)-L2EaH-|WR^=w#F&TH*=-(vZ^ z3zK|hZVx6{P`PqfFL%-AdzLttoh!7v^BZx;Ghrb=jA+@X%Tn`_K8>ftVz;r9SWH)FMqosfBhUWwF{^Zr+STC=NlYp@@#Oa`#pKi@@_kKaE_g( z)JQ4AWM}8?8{erfB|GGLq&iTt zHBg(L^SPno3)fWTb58)dAoAK?d@rQJG1ynzZ$LDc>q5DM@eMlexXKY-J^S<*AwBqi zD*x;jto?v|i`Lw8$xoMMr#zkNG`>$g{MVZH={&W|lXKSZZ`5+`O%^}xoCp^r8Jr|V z{0ptP9vYd>{Lh(1NFSebhhuSOp)YjNhbT@gSvid)a-SxPn3~|MF@Dp#!ad1{N084r z*VRgwSx4*=R*UtX4SI97_m%j}w4zr0dT>Lv;!9g&e|#r!UbpW;7)_%f=;U0M=er)V z{Q9&)%>80(6v^lmZcY*JEyJ;(Gx8`(@_*L){Ap?-K9+oz3`yJ**U&KaMYp3bfc}yd zQeDVQkxa+%BL^3X#r&|nFMYIHM+36!o3{pH=`#QJHFxJ^$PIYu$ z%d%`ETi9eInzgx7lZdiSS+&9r_=F8nMj3YQL{^NWxXt}DXuI4tB;}Cv6N|3~-26#? zr=9UPwb#L2+`&vZr|6Se5o@gPrPeHF6Af|gL^e*Ra(YIg?m(k5QSlwW zOI$P`G`=Ba)MVrWJF1QumXAF{u538c?lDN)jeNs@tm8Q6t#9%@E9itO``B!v@`}gN zSb?rw|9&3NK+%)Xm=YyE1o<*ueNGF#unT@&2a7q#`Ku$?@syY@tNm5f6^8O z3F)mxPj94>b2jny$d7kaD*jYFbui>vwv;Opn-^Op2LG$s9oJlP*ZQ(*PLJ8Ts93Q* z5V^WAPq|uOCsR5aUgC*{7jGo!@vh$_M*ST-kwc81&2Z#nJfICV3qJx}BPLpQe`aL&@GU@gm~?%R`I%X)8J{Ap%W{ABCF^eZym@6sk`0am0??~~^gG4@X| zJ4lo^PI|c-rP$MU9XsZ@u+K4|)4}+Qmf~gkS6zR6ygf+n#2T$4Z)&oqAcHW(bf|gi zTvmfmS6vwE&Ky_9sG^5sSJABJWv!kh@6@OMASxWSlfSCkR&{E*FiMwu->ez%zl}Zs6&wYs|H5w*V{7S4g#P;^W_I-hT7n52UAf_e?%r8l*ia zJ?*Nd81sG=VqR=l&bdoQ((3G|d$;--2|1N6_NS;rpE;OY6MiV5gk*1HpfO9ncZ6`?T(2x25(s3i)5~e+Hk^=1{}d_q%2Y^OFh$_ z>$p<8BdahO-wb#CbsXYGyrr!gzRk6r3gz^=r1djlrKnrH5j6~Y2+W0!(f%fO3fd`- zQUwk=^4XbyaID_h2g@_7q9T8d9>PK9k;Mze6;!BH1D4(9o^>Znf^`p(R^)R*Rby>= z8+sDNtsqgx}*!D~JD^)K!R}F+3KWH#{x(!^BJ!qBEDm%^R_$;U~p146x zhqxCH$2mUKw3*rRITfZacjvlU1Axko{^_m)55LP|+6ql4`@z>3R0(=F=(YJ7c!E~3 zi|wGLM4X3G#D$qj@5CqG*Ot+peI(a=1!(5?n4tp?H!4D5UroeJW^W3hvV$H)cIR| zbB;7R^EmgPGLy^PLXzQ=adjtLQ$5!nO1#abCt?N7Z? z+bHQU@5Mqo(IoE9$r;-#r(A z-Fx$5Shme<+4h3YJyVFxh+q-3Z=3Tqbgx*Exiqfg+)1C5Em_bzoT=#XjtQM7;kliU z<1U@T!$gXor5VHd9vB!t7chO&p5wVV&Et$c?%w_)y^8QmNo1j(gp1`=2MLK$FA$$& zPNwZdx?KIWoDt8BR%2W}HRqW|sn-H)&2976`FA2~9M9TNoGwc^?g^M zF22@&>pjh_#ZlbNn$IR2!#1A@i&mw-mp5jI=&jCApxxg|TS~)zCC(Cx&Ny1~s@QH- z{D~H*ZqolIK3b1yJ>PCBmtZ)aN!ME_>4WsdUdxqAyqwOOOCNtv)9kGMDdt}OUhcZG z@g4ogTn^2(sqMaVs_{8hgT>4^!nu@fl<9A+ul6|o^$6K$!9<}dQ&d{~CZpv#u_-o5 zSIx{4xlvQb$`NnNsu`ED;;lGOv5Bv#^sg4vv5sPxte0{cTU82pEmmic~tuh?rmc85$4 zyW^)!rJk!ssedEBgO?Rmeoe`nst!P*GF#UncnJ4y=j}L2yqB;_mCDDribDh?Lw?H_h$)dUf08QII1`GoFe;wI>*SV=PUa6 zNL9+><@WbxEOZBJi+ws>Y|r?4t>0m5t{1M##bezwr*G~`imku0!qv;GIS3}$Hq}4Q zHaW|fF*(Mw;9@?VSoK=$a(OlSRX!81=iEKbhGawpRhXlNW3`GSecCGPX?qN6Za0EB5sVAwP<(a9Rr`BESXH&_BJDOr( zU1-P@TThemiNp=uo7{T2O$?*;?EK{PJN7rd9kl~0)YPZPS;={yNv2azgv2x8xm8V; z<>zE8D$hNP%dg`^>;E*Ic&*s;*CAc5F2F}kNnVWqId!z&S0(*ui+`b+JNJsKQxe4~ zNxM5hs)g0_PI}zrBlvz9UY=F=bnp}hUs0hw7I0=C2C2!&&{}Gnr)dM=(mp&zes!|6 zpO=_+o%A&PF!zrA+#?}3+T%Z+PuyBJ0(h^gE&&SpA6R_aN2t^VCqxPgb10?wP4|yt#o|<;8e=gLWfnN83Eys&!JwoPU2> z-?8i|B5Em<=%ocakf&iNE+@N^1bEK1$8yy@iJkgh`+FB$+TC6Y&2Qsi{(-G3?ee^n`&aPXF2-$r@ud8fKu?*hIQfjTX-oM;3O9e?IfZNE2@%^fRj^*;GD|-%U^LwDv$v@rFG2 zW=vKiaqhOIOwD)5`nY0KJU5$S!Zr|H<7bik{yp)AQa(809N!ArLpbj{=PWzxQ*BoS z)@Pcos$E}KP8o*u!*QJ@SbbS#a{W`Q9jM7B-Sj8{}Af#35{uImtq_w!+o(M#<3yEzu2;wscqJre8BdA670c+{EIMU1UV-z%ujl?|w#(LnY6249 zpD|(%_O+89yZ+9^LRspnvzMlwuT@hfRL7X|hKfYdJrwX3WV0dPwv0gtA`U!*@M2vVD0f{3_K^D%zTL(5W+hkMmeWXv?lk$ndt*sfmZk zU-SKxWU*eihk4HKFlB)qR@I0;x2s3B`i{J*D~}x-Mt;p9U^mtkH)38oSy0MzCS=USN#4KV=ml$1YsVu- z*hwhDbLG`HTPNi}w)KN14b=NNQ%jR1oNR!MV1tO5wKIA=h4|ipPka3EjYNBMQ$TRsrXKZ5b$mhVWkGd?poE&Fc`A6HUM=XS?RS zpCB0~%J5W?q>ySHI$HPO`@|b8J(MO-VOmGoj6QugJ|Fis&&>(F+GZYmsNW4uz8E|s zmh@zgcS--gfHM)-8X;v zM*H4v$9g}MXC;VV;?#8Z7al6>^vci!OQ3hP+kaaN`Cso5(D^HHj5?npM%yiFMeF5e z3Qd)poHeT*8{q9{&dB=kB-v?1o)l+7CFtYxB-9NS&S(byQkAov7L#(P=p}sWl%;!Z z=1EU)?#vikv{bd!)`b66Q6pEMlj%8$MsDec=Kh5`2@kzE@d(?Z*|d6opY!xLB1b~{ zI4O$Huuhh3EEMOYOO}^QG3Pr-f-gl(rPCc0d*z(9*3iiU)$(y-AZNN_36Toxuul@K z81*y&Z@ul=bqVzITAX00n0`Cn=D;1F#iyP$QjqnFWu#)-1XdBdhH;q zp2|<~xlM{%jRjB5weS&|s6H7Iuh?`Nd_DK92$veNJc3qxBTksg8nI%Vk6MJKoq{}t_{{N8Mo?PCpX=lr zprNvdEb|iT{73sM^o8h2I!zdO}|^NUuRpgk6a>W1aT^lH)5O zZAh;wBBRaUOk1GCFG6m0z6ZI)E8zz;$%o!Jnvvw!m`(A`2knezz0XgYG^d|=PBG7W zAtF0RRJ|?|cYPRHjVF`qDVA5apu49gG^O@g!yh$-z1s)%1A;Mt)6xg{Fuv0!yEB8-fC+J`G&%Zz9O7RSJ4c9}I9Uxb( zJu22xH>G!eI2M1EZGh3vx`)HFS;89hJ+70saRQ!*H z>m{N;F^Y8`44FfAQzu?%RA7=Aic#YwrW?;T?KNhuI*A~Gc?UwxhSg2)ik!-*`v31 zW-GVS*-6wsl#BFGCpLXdD~sWZ@0^6gt;21)lj%0#GS`6_&MLn2Nw7V4P1PP6(Ic_0 z_EIM}@@`wb+x_)DTTkrMuj1%UUL~`Q-j=3pJQB3wZPUG62o_04_Q8<@_&mymYl*7R z%;TC-fh+68I7A%y5B{WgScR?qUseNs+8=(}KADrBejizx)~(t+XD8{_^qDLXmUH`x z&%?u&33E>2yc-ciPwi>#0clz1xBPtPbKH}fn0iCzVaq&XVyVPmubc52anrq~p=~SG z9b$0VP%1U5@$e=VK7D_d>enA_gNY~J$&$_lj;?ZR@ka}vw|;J9-6`I(PRPx_2goxkfv-tPEYn~8zkm7vDY?AYit35#Z2GQh%($Dt z@A#E1I1+1bIvM9YNh>4-{=Gi+V6*+&+ciJCIIlzCmzpz;__EV1SxA`VkFomp7hI80 zz8LnUo`^~8uBcpfM@8Rrd#P6A;&>H&RIO*%ud=+vgl>>x*9u*4n~cFatXJcd?-8ij z=>!0(Ys+n$dkqga56CV~@9O}v8bhgbm)OagdA^LCkxB}0^YO&e)Q0vR%WLH`m931^ z=Ob)Mi@$Ffh$c-dpO@onk4@yPo;MLrZ(aKN7Hk-Hiws=3wDCJOP-rg7#AD=>Y};*j z`jyG%o(c*Qt5XXT#eMCe#u;elyt_)$-*zx2h5lD$#hgtsJ-J}BnI+2y9ps#+wpFhX z)GPA&FU7Opi%5RiwD+x=398VTl2ilXKanGQGt=I#zdAA6^8ZxGB|3mdmJi;ab*NOYYbMP97}AQw zP$#59@<#Z%UZd$Do@u!Y@5oYJY~JHod(d#7tq&b{_A(FN2}DIct5?dY?`U=8r=spm zooLxA_CysPsNzY$b>J81Y(eCH>?dHOQY^kVch^oDF=zn-?4X9$Z6h1S(m_tKdB zIMpZyR<%Mtj|H^#l~rf%E8K#b&WZ)mycbb~sX7uoq^B%iz=gRy7MUOtC1UBZv42;m zM0t>=J8B+W@2_Xt{UZ3_`H5E>zu0RJ&ph$K{~xzHx2gc+Nq6+H$(F~xUC;slteUKS z?&!bp9`Y=Biu&g2isgkyqp!!r!(H){CfW|fop4f9EXd^J#g=S-N9AS8ll)oVdq=ax zv%V66mlL<=-l=ANgdXrZ>kUkYAurUV`MhHMo%sBGlg_`{qmSPzSM&CN3f^4aLNeX| zqrX8d3XP-kIlf7DE*6x_p#j~Z_RoqJ0V@?r1Jk%RBPQ`)~>hP@y5WU)X{(e zI@V72(U6ild-1J+xXy+{!PgoErx`yvs86qAD&k7(Oi@R6JsBH?_2>V7azXv$oEVs! z#QsjB8Qg=uvfQ%hwy?4#x z=7bST)kEkA0Qo>8&wbvRBwElMnos^tE$Xdx!YdnL4`|)89<733G_3V`O%p&T(?!>C zVwfVCM?1Zf{Y?K(-;%6kJVkRZ?hxgOhN(y3<8MyvF#K^_ckbB|<`v*Ui;cr;FqIsW@@`!@0S@6``pe?86I&}wjEF7NWU z9ue^cSBcicWGl{+5^OM*>K-kl0vg1UUuLs>tsw9J?W zJ^Jk>T_78v_3EhOfV)xeV|R;o4d#PH`| Q`qMus&Q9#=XTt2?0NA7Ey8r+H literal 33987 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 Z1W1oJC6_a7Uh(t%Wo3WFl>V7r{$EoMg|Pqt diff --git a/damus/el-GR.lproj/Localizable.stringsdict b/damus/el-GR.lproj/Localizable.stringsdict index dab971b4..41ced9e5 100644 --- a/damus/el-GR.lproj/Localizable.stringsdict +++ b/damus/el-GR.lproj/Localizable.stringsdict @@ -4,6 +4,8 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,15 @@ NSStringFormatValueTypeKey d one - %d άλλη σημείωση + ... %d άλλη σημείωση ... other - %d άλλες σημειώσεις + ... %d άλλες σημειώσεις ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -31,8 +33,6 @@ other Ακόλουθοι - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -69,7 +69,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Απάντηση προς %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +77,15 @@ NSStringFormatValueTypeKey d one - & %d άλλον + Replying to %2$@ & %1$d other other - & %d άλλους - zero - + Replying to %2$@ & %1$d others replying_to_two_and_others NSStringLocalizedFormatKey - Απάντηση προς %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +93,9 @@ NSStringFormatValueTypeKey d one - & %d άλλον + Απάντηση προς %2$@, %3$@ & %1$d άλλον other - & %d άλλους - zero - + Απάντηση προς %2$@, %3$@ & %1$d άλλους reposts_count diff --git a/damus/en-US.lproj/Localizable.stringsdict b/damus/en-US.lproj/Localizable.stringsdict index 4441ecbf..21ef04ab 100644 --- a/damus/en-US.lproj/Localizable.stringsdict +++ b/damus/en-US.lproj/Localizable.stringsdict @@ -66,22 +66,6 @@ Relays - replying_to_one_and_others - - NSStringLocalizedFormatKey - %#@OTHERS@ - OTHERS - - NSStringFormatSpecTypeKey - NSStringPluralRuleType - NSStringFormatValueTypeKey - d - one - Replying to %2$@ & %1$d other - other - Replying to %2$@ & %1$d others - - replying_to_two_and_others NSStringLocalizedFormatKey diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index 778e5c73..e9a01b82 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -73,16 +73,6 @@ Sentence composed of 2 variables to describe how many people are following a use '%@' is an invalid NIP-05 identifier. It should look like an email. Description of why the nip05 identifier is invalid. - - (Profile.displayName(profile: profile, pubkey: whos))'s Followers - (Profile.displayName(profile: profile, pubkey: whos))'s Followers - Navigation bar title for view that shows who is following a user. - - - (who) following - (who) following - Navigation bar title for view that shows who a user is following. - API Key (optional) API Key (optional) @@ -211,6 +201,17 @@ Sentence composed of 2 variables to describe how many people are following a use Blue Wallet Dropdown option label for Lightning wallet, Blue Wallet. + + Bookmark + Bookmark + Context menu option for bookmarking a note + + + Bookmarks + Bookmarks + Sidebar menu label for Bookmarks view. + Title of bookmarks view + Boosts Boosts @@ -247,6 +248,11 @@ Sentence composed of 2 variables to describe how many people are following a use Clear Button for clearing cached data. + + Clear All + Clear All + Button for clearing bookmarks data. + Clear Cache Clear Cache @@ -470,12 +476,12 @@ Sentence composed of 2 variables to describe how many people are following a use Followers Followers - Label describing followers of a user. + Navigation bar title for view that shows who is following a user. Following Following - Part of a larger sentence to describe how many profiles a user is following. + Navigation bar title for view that shows who a user is following. Following... @@ -573,6 +579,11 @@ Sentence composed of 2 variables to describe how many people are following a use Like Accessibility Label for Like button + + Load %lld more + Load %lld more + Button text for loading more events, where the variable is the number of events. + Local authentication to access private key Local authentication to access private key @@ -1041,6 +1052,11 @@ Label for filter for seeing your posts and replies (instead of only your posts). URL Example URL to LibreTranslate server + + Un-Bookmark + Un-Bookmark + Context menu option for un-bookmarking a note + Unfollow Unfollow @@ -1123,6 +1139,11 @@ Label for filter for seeing your posts and replies (instead of only your posts). Yes, Post with Private Key Button to proceed with posting a note even though it looks like they might be posting a private key. + + You have no bookmarks yet, add them in the context menu + You have no bookmarks yet, add them in the context menu + Text indicating that there are no bookmarks to be viewed + Your Name Your Name @@ -1275,21 +1296,6 @@ Label for filter for seeing your posts and replies (instead of only your posts). Relays - - %#@OTHERS@ - %#@OTHERS@ - - - - Replying to %2$@ & %1$d other - Replying to %2$@ & %1$d other - - - - Replying to %2$@ & %1$d others - Replying to %2$@ & %1$d others - - %#@OTHERS@ %#@OTHERS@ 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 index ee39b6941dacbd688f08eded3f91dbdfe8b707e0..d13f961a855c88e6b2b16bad68579d7b08a31241 100644 GIT binary patch delta 973 zcmb_a-%C?r7=CpXbDo{%cEr=1^QcoQO4mRO&Cw4C0?VZYSzR=BrEKjSwqq9bOS{e(pBB)MT8JRg*ls8{FGv&ptuJjJf4XL=>9jx1u0DF4cnvYV3SF!x# z9HpEG8^jpC+-rfgtO=#(W(3yhFy6cm;peX1$mlVA9#JrRJ_>6r#%BrSp7>oRWl=a; zkMJX3gT+EuSk9m<|F4tHJDW@tYMZ@D8slZs6k|4KRsvYMs3RU!gmvLzo~8+o*Dzb|G2?B7;R&57Wp*-i!_0woZG+nB zNQrjQjS39WZZ4if delta 734 zcmeCU!#wXgGt>WnlM@tFHs9j>$1%C#9?Rqvj2WBPF)v}<{EclIle!*58bdxq9zzL( z27?|$5|Ew3Pzhz_0NEN0njkp2n^Tf#wY>`@p*Cf0EVE&rykfe<<}6kb#!v+YEe3rC zE(RqARR#y3CCFA6Gn4|Y&tOPpNCaA&!;lGdR4PzSIgrd`NC(P5oR|ybrvODt8FCR$ zbElSBK&NlMA*8}GdBJKRjtrZu7im-<0}O=#h9Y3tqya6?0XqxigkpvQATJRZUVcCl zkv^tPhU~mKSbAT`(Relays - replying_to_one_and_others - - NSStringLocalizedFormatKey - %#@OTHERS@ - OTHERS - - NSStringFormatSpecTypeKey - NSStringPluralRuleType - NSStringFormatValueTypeKey - d - one - Replying to %2$@ & %1$d other - other - Replying to %2$@ & %1$d others - - replying_to_two_and_others NSStringLocalizedFormatKey diff --git a/damus/es-419.lproj/InfoPlist.strings b/damus/es-419.lproj/InfoPlist.strings index cb67cc98ed39cea64f74e7ffe7f725a507a5009a..8e2d92423f57bdff7183f697b05e2700b65cda16 100644 GIT binary patch literal 794 zcmaiy!AiqW5Jm6WuXtox)P8`tsD^?drBM8UnrIEAF(hfh&+Rw3SINIqzRQ2!e3W;ohI#hnGN1p78Rj0Dx(B8SdSaHfHm)k=+fr+&S{>haGzXkH zs$FRHi#K${jw7S)8NPO~SI(OG423?Oy`+oXlys{3H=N)V8Hk+IcpQ8Wfm++go_nhw z6q*BnJss1&)Em7zPS7Ljp1oJ&-puG^`yN!c)I@y&wdcKw{HN?k?#MRI72R4fhp9D% zneSk5!ltrqTHLx0^D4e7%LX*;$OgUkYFk|r)kHap51!jlV_utY=5N8vKKMJRocp?W F^9L%JheH4W literal 403 zcmZ{gL2AP=5JmSs#mCFg)(0qEq!occ34zc9Or@zSkR_q913pg9&?ER_m6VVM+O7uX z|KUBRTj6=~#xabQ=xBzgfwAhE_GNQU)H&GYeTyfwiiSzr$ENA7x4&+#Wph*BCwnA4 z;~pE*jIF|(P|r{-I@vhd;464{DEU^^^d_wI^)#{{ttM@kFAoyRHFljjn`iYXE1UoFJo;}M$G5rSJYKHd! diff --git a/damus/es-419.lproj/Localizable.strings b/damus/es-419.lproj/Localizable.strings index a0305a3149809f68f1866bb644421f5e8c84e02e..4b15a951dd407382cd7d5234a8c671115e044e18 100644 GIT binary patch literal 62254 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
_%yGCXET8$KB_yc;7>^&maX zJ+I=gt+rrmP(@4@-S|(<4m=uGz!{`Rb_MrQUleZ@4(ueav6QzA)sB)aq~M zbUBcjO3x4D|M{NUleoBC6xWa?5>b7i^(kREGE@Hm$=Sc(hU`37+F+N2*Pz`y>M}&f z$`$aJr5t^CmF96=nV5+@mS_!{dCkHUT5hvcytC2>h^?OOB}VIY52>Ajj`}At?($hv z>5-_3w_^X>wK26cHGWz_W*1lEowYaO?@9dSJlL$*3-)Q}`RscjKb;&Qh3-kaQuN5& zM>?weRV7nl!ZNQqIki;n{Dc}%9$N*emFst^lbfDT3UAz-oHYoYpxU+5-4-u~k67gx_8!$`K~CcT+Y1vj;e+8XTNabec1GVKx%h&K@eLGRw1jy%QGe<0+2(h z_8=P|?q-g+%tGBUN3(rb16>5?>%?kn)cLxkt9s(wr#!0!Y&hw`oBrwF{@=f+CHM1S zxXxGo&3oVdtFS_e8!`T&JGWfBXoO0|ClO0JMjeI3!3Uz$`i{DFKZ3{fo@IuYtD&-o zq)8DO)OWn#ib^FtS!{!d?CVtFssnT$4xE+3g{+8YSCwHV{X|QScA7d$neKhOCMU-s zS&u3D|2$^K&zL*8>>O1rv*mvp*P|!uZS*9ssu`2f$#e?6R3UM_xlfO)^VBTCS&QY9 zbE^87_e;;Tr39!tK0mcvS5Jp>?l?`BeAr$L&A+zDWQ;sFm{`02>g4E_d-{!W2ghB8jPBSoTcW~)PrChIF0?PS0f$bwIB)Ef;tUk#rUu?CNif!yF0sU zvl6rB9%xph;t6e7^3Y{W@Ag@*`F>o*Y_(7QRmlHvuIdQYyFQFDtW#v}x>=O=+Q@V& z4^?LgO%pYxF|yOON*Bw~UVy&m;^$#O8b`ee)k@1sx!&L3zV@#%H#=d_34KAXM8EY8 ztaE-B8|%W=IY$7RkB$HDwEC5iK`-0ix;Z~M4LR@ zho`Haq(i~evtA7%_kA3AB7AsrzhReBx*78!TPz;5hL)RQAzFP$%FCz3EWO?pAmfpK z`5*g&Q*}2q8raq)`-_Ybfx3A3h#nZq@^m&9+>f0_5~uSOTvl) zvve%&NRBOuD$gj)0fUo9`05loLosqc4ZSK0Br~Ar#=m&GxRgJ198P+L9u*bg&b*&R ze;r-dgBPY%amgc5^Wa7I!>coz3jq@mp2x3;cCFnAJGCOVxTgiUCD1G>;aeI^uby86ioSR)G_LFTKq3h(FB73srhv|_#OhM06aB!O2k zcV9tFzWTj6ClXdYS39=0fs6)NjdVsN;JEeOdoLhu%I@0WtIqA&z$m}iZ5%Jqd4z%jYHmP#@iuTJ-;2&%^g$D;C?yICYSzR z^NsUK}-22X3%lh4kx&u@!(Q}xm>LvPp&*>PXf=w~W@^^Wd4Z<0#Yz&8RZD(*mK zp6OK9<5ia@agTf&Z_d6h-}u!HYwi!HR-^2jj7C{tzI$e^a;N)=*QnY=?~IqoEng!q h5jGGbl+WNXiW?x0t@Eqz{`Ft{7CNty)nnr9{{xoC{MY~h literal 29156 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 diff --git a/damus/es-419.lproj/Localizable.stringsdict b/damus/es-419.lproj/Localizable.stringsdict index 740d250b..6fce4a53 100644 --- a/damus/es-419.lproj/Localizable.stringsdict +++ b/damus/es-419.lproj/Localizable.stringsdict @@ -4,6 +4,8 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,17 @@ NSStringFormatValueTypeKey d one - %d otra nota + ... %d otra nota ... + many + ... %d otras notas ... other - %d otras notas + ... %d otras notas... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -28,11 +32,11 @@ d one Seguidor + many + Seguidores other Seguidores - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -46,6 +50,8 @@ d one Reacción + many + Reacciones other Reacciones @@ -62,6 +68,8 @@ d one Relé + many + Relés other Relés @@ -69,7 +77,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Respondiendo a %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +85,17 @@ NSStringFormatValueTypeKey d one - y %d otro + Respondiendo a %2$@ y %1$d otro + many + Respondiendo a %2$@ y %1$d otros other - y %d otros - zero - + Respondiendo a %2$@ y %1$d otros replying_to_two_and_others NSStringLocalizedFormatKey - Respondiendo a %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +103,11 @@ NSStringFormatValueTypeKey d one - y %d otro + Respondiendo a %2$@, %3$@ y %1$d otro + many + Respondiendo a %2$@, %3$@ y %1$d otros other - y %d otros - zero - + Respondiendo a %2$@, %3$@ y %1$d otros reposts_count @@ -114,6 +122,8 @@ d one Republicación + many + Republicaciones other Republicaciones @@ -130,6 +140,8 @@ @ one %2$@ sat + many + %2$@ sats other %2$@ sats @@ -146,6 +158,8 @@ d one Zap + many + Zaps other Zaps diff --git a/damus/fr-FR.lproj/InfoPlist.strings b/damus/fr-FR.lproj/InfoPlist.strings index 5e1126a0ca15122a2356872f1598e93583c21b5c..14b5b6acce6788d2c882abd981a53b779c40509b 100644 GIT binary patch literal 794 zcmaiy!AiqG7=-8SQ!Kd%1?>ZfhiWJYQVQY&#H`jrO+u3td|Qw9CDiZV#BM_aJ?tj` z?#|3Vv-|rq)kIErYE{Tog zI=2fw9q@*Z*l}d^JtNmf@9-Ca_YLkG-KbHa)uQY|f4RQt#OaG+={rtuwC7v(p7wAZ zXE^3{iDHRH3GNZa7qA(_?sCTM+Wr1_U~18i!`=BTBL9%Rfq8UTW$MwvN?w@R!Ip-pzUs$ z|Np$tbW6M>r!7Gn9;}?;WKURjP5Zh&E8;Bd^1j70S|R(y?Nifq*X*y%)vWK#`(Q?? zCOlv*6=5Ur&hkJI#44B}8t*E2_g3_csOp_q>8livpo8HUa#9n+^!Xe7SStSj_ArZ& diff --git a/damus/fr-FR.lproj/Localizable.strings b/damus/fr-FR.lproj/Localizable.strings index f55cf5254556b7ae0bebfa6693bdc687a7e40083..12929963d186f05fc3335c977099ea8b3c51fe67 100644 GIT binary patch literal 62530 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 collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,17 @@ NSStringFormatValueTypeKey d one - %d autre note + ... %d autre note ... + many + ... %d autres notes ... other - %d autres notes + ... %d autres notes ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -28,11 +32,11 @@ d one Abonné + many + Abonnés other Abonnés - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -46,6 +50,8 @@ d one Réaction + many + Réactions other Réactions @@ -62,6 +68,8 @@ d one Relais + many + Relais other Relais @@ -69,7 +77,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Réponse à %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +85,17 @@ NSStringFormatValueTypeKey d one - & %d autre + Réponse à %2$@ & %1$d autre + many + Réponse à %2$@ & %1$d autres other - & %d autres - zero - + Réponse à %2$@ & %1$d autres replying_to_two_and_others NSStringLocalizedFormatKey - Réponse à %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +103,11 @@ NSStringFormatValueTypeKey d one - & %d autre + Réponse à %2$@, %3$@ & %1$d autre + many + Réponse à %2$@, %3$@ & %1$d autres other - & %d autres - zero - + Réponse à %2$@, %3$@ & %1$d autres reposts_count @@ -114,6 +122,8 @@ d one Republication + many + Republications other Republications @@ -130,6 +140,8 @@ @ one %2$@ sat + many + %2$@ sats other %2$@ sats @@ -146,6 +158,8 @@ d one Zap + many + Zaps other Zaps diff --git a/damus/id.lproj/InfoPlist.strings b/damus/id.lproj/InfoPlist.strings index 4ed3cb8294261bee840e21f7334cfefd549bc45d..7612949e810d32d7ae40ddc69207e3992f5958f9 100644 GIT binary patch literal 784 zcmaiy-Acni6olv6r&w}X&^|!%q8bVXEd}ub(x(2;gMRz^{d&@|a`pOa3 zL=zZ>x?b*b&YKVNE_Fc92YYMRe~pHjSLSYxnxJR2WO{X1Dc_p2hN{%?-QzisOzU=` zr$4-*BX$@WeNV}?fxUFrEgfsv1Ig}X)sDF(-|*csx0Fj%WmL7R3e4=p+HsX@T(NI= z^gqiX&r7}0r(py=aDD|kW7wTeVK9zgw>4|gSHR`vOd@}uz2%N collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,13 +13,13 @@ NSStringFormatValueTypeKey d other - %d Note Lainnya + ... %d Note Lainnya ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -27,8 +29,6 @@ other Pengikut - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -61,7 +61,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Membalas ke %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -69,15 +69,13 @@ NSStringFormatValueTypeKey d other - & %d lainnya - zero - + Membalas ke %2$@ & %1$d lainnya replying_to_two_and_others NSStringLocalizedFormatKey - Membalas ke %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -85,9 +83,7 @@ NSStringFormatValueTypeKey d other - & %d lainnya - zero - + Membalas ke %2$@, %3$@ & %1$d lainnya reposts_count diff --git a/damus/it-IT.lproj/InfoPlist.strings b/damus/it-IT.lproj/InfoPlist.strings index a1b52641fb14fe45073c955940b73e31c317cb6f..182f62ae99fe39687dd6d5d84eda132343ce536b 100644 GIT binary patch literal 828 zcmaiy;Y!0m5QOKqPZ9F7AbkMwM>P}#DFyKXVxl#WCLu`+`ta(vo2F+lQo`l9y`9qH73$P*O7+3HV&D7CLQ7pK*1gsfOfo@iPWds|TUM;ZBL`Sx z-M}zc^>UTJy!kBeRxNst+-0u+8VzedS$7YpiS&$?R6Fk~;op&Ks75{inw}$^8M@u* z>5MmYz|JE>-z$9WVXvGuqvGd@-ISEnvDn~xMPBAgOqpp($!UnR?AD9j=6*J`;p~MX z;_se)3${jG4e}9|7tmJS-hD+in}yMlj#%hD!imei1^y}fz#Z7; zxq_26K?U^-dLCV|ne6yXyZI2NY?$HyT{EA0-p2N~bN{2)=6~t)(|Sh1^zVu7s9v!K GPk#U&S&aMu literal 417 zcmZ|LL2AP=6a>(HPBC~HC_X^RBCQAnN(hu5U@HA4A7t4`vcWxlB`2gQZMT~F%tP%O zPh)Ui;4}@MGXguox?MHTyGvp&!J)i2*q|}&#?(BnR_*Qf*Uhc$?#jog6YY!#>}Umh zgSW(!z(}%Dhpc^Ah7Yeb-Qm9vNqBozp5w|KgVZwO-nPDh(CttEDTh9>nr%<&%Hd1bGyE S)cwj%^b?C(yN)LfTB%=#Ig2L% diff --git a/damus/it-IT.lproj/Localizable.stringsdict b/damus/it-IT.lproj/Localizable.stringsdict index d728d3cc..265a6547 100644 --- a/damus/it-IT.lproj/Localizable.stringsdict +++ b/damus/it-IT.lproj/Localizable.stringsdict @@ -4,6 +4,8 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,17 @@ NSStringFormatValueTypeKey d one - %d altra nota + ... %d altra nota ... + many + ... %d altre note ... other - %d altre note + ... %d altre note ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -28,11 +32,11 @@ d one Seguace + many + Seguaci other Seguaci - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -46,6 +50,8 @@ d one Reazione + many + Reazioni other Reazioni @@ -62,6 +68,8 @@ d one Relè + many + Relè other Relè @@ -69,7 +77,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Rispondendo a %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +85,17 @@ NSStringFormatValueTypeKey d one - & %d altro + Rispondendo a %2$@ & %1$d altro + many + Rispondendo a %2$@ & %1$d altri other - & %d altri - zero - + Rispondendo a %2$@ & %1$d altri replying_to_two_and_others NSStringLocalizedFormatKey - Rispondendo a %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +103,11 @@ NSStringFormatValueTypeKey d one - & %d altro + Rispondendo a %2$@, %3$@ & %1$d altro + many + Rispondendo a %2$@, %3$@ & %1$d altri other - & %d altri - zero - + Rispondendo a %2$@, %3$@ & %1$d altri reposts_count @@ -114,6 +122,8 @@ d one Repost + many + I Repost other I Repost @@ -130,6 +140,8 @@ @ one %2$@ sat + many + %2$@ sats other %2$@ sats @@ -146,6 +158,8 @@ d one Zap + many + Zaps other Zaps diff --git a/damus/ja.lproj/InfoPlist.strings b/damus/ja.lproj/InfoPlist.strings index f618c36ecbf0a2c11d70ad545f75ba9db32f1447..59f25bd15c22ca53c9a2ad68d09a3bfafe62a78c 100644 GIT binary patch literal 668 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 LV|DqOR`&k^?jd1{ literal 30594 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 diff --git a/damus/ja.lproj/Localizable.stringsdict b/damus/ja.lproj/Localizable.stringsdict index aa772835..77000804 100644 --- a/damus/ja.lproj/Localizable.stringsdict +++ b/damus/ja.lproj/Localizable.stringsdict @@ -4,6 +4,8 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,13 +13,13 @@ NSStringFormatValueTypeKey d other - %d その他のNote + ... %d その他のNote ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -27,8 +29,6 @@ other フォロワー - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -61,7 +61,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - %@%#@OTHERS@ にリプライ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -69,15 +69,13 @@ NSStringFormatValueTypeKey d other - & %d その他 - zero - + %2$@ & %1$d その他にリプライ replying_to_two_and_others NSStringLocalizedFormatKey - %@, %@%#@OTHERS@ にリプライ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -85,9 +83,7 @@ NSStringFormatValueTypeKey d other - & %d その他 - zero - + %2$@, %3$@ & %1$d その他 にリプライ reposts_count diff --git a/damus/lv-LV.lproj/Localizable.stringsdict b/damus/lv-LV.lproj/Localizable.stringsdict index 3826fe22..62b358ea 100644 --- a/damus/lv-LV.lproj/Localizable.stringsdict +++ b/damus/lv-LV.lproj/Localizable.stringsdict @@ -4,164 +4,164 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - one - %d cita ziņa - other - %d citas ziņas zero - %d other notes + ... %d other notes ... + one + ... %d cita ziņa ... + other + ... %d citas ziņas ... - NSStringLocalizedFormatKey - ··· Ziņas ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + Followers one Sekotājs other Sekotāji - zero - Followers - NSStringLocalizedFormatKey - Sekotāji reactions_count NSStringLocalizedFormatKey - Reakcijas + %#@REACTIONS@ REACTIONS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + Reactions one Reakcija other Reakcijas - zero - Reactions relays_count NSStringLocalizedFormatKey - Releji + %#@RELAYS@ RELAYS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + Relays one Relejs other Releji - zero - Relays replying_to_one_and_others NSStringLocalizedFormatKey - Atbildot %@% #Citam + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - one - & %d cits - other - & %d citiem zero - + Atbildot %2$@ & %1$d others + one + Atbildot %2$@ & %1$d cits + other + Atbildot %2$@ & %1$d citiem replying_to_two_and_others NSStringLocalizedFormatKey - Atbildot %@, %@%#Citiem + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - one - & %d cits - other - & %d citiem zero - + Atbildot %2$@, %3$@ & %1$d others + one + Atbildot %2$@, %3$@ & %1$d cits + other + Atbildot %2$@, %3$@ & %1$d citiem reposts_count NSStringLocalizedFormatKey - Pārpublicējumi + %#@REPOSTS@ REPOSTS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + Reposts one Pārpublicēt other Pārpublicējumi - zero - Reposts sats_count NSStringLocalizedFormatKey - %1$#@Sats@ + %1$#@SATS@ SATS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey @ + zero + %2$@ sats one %2$@ sati other %2$@ sati - zero - %2$@ sats zaps_count NSStringLocalizedFormatKey - Zapi + %#@ZAPS@ ZAPS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + Zaps one Zaps other Zapi - zero - Zaps diff --git a/damus/nl.lproj/InfoPlist.strings b/damus/nl.lproj/InfoPlist.strings index 0c7676505fa38828d8ded28279b69b0025e66a5c..b944849816351cbb08e0d6b3abe466c0591dcb3e 100644 GIT binary patch literal 808 zcmaiy(MrQW5Jm5^UlH;m6to{8KB%Q4lu{5sAZ=o`joDzDf}iY9sAne8B^c<#ZkXA* zcjn&7_t#VtCAw9sO1VlEM7dtos3ywvL0s{D^OuRHI#a4U%?Fs-0I}@rQ?S>ZR5Q=C zu%^0#VXW)vF8_J+QQno_ndivc#^=9ahPg+k?ty6%JuyqBt*e@GH`E%c)`2^qIl-Au z?NX0_ctc0*I5O&9z_h1N=j)L^*5jG8A#0s%qJX;zQ6SoquedF?x4k2FKB>)QRR_Lx zukn+~jlK2ya^UZn4=cSmLx5vJ|1~@r$M$@~=56=C4m9MV)&%9JeTw`;_KrKUjdMlk z?&($Fly$YguSMsWN1YoxY7?q03Oe`N&ee?U+PO;CX5JRQ-GGPDW&8iD{>2>4d=Hns FpFh4}iM9X$ literal 408 zcmZ|LL2AP=5Czb^Px0}l5NLgX(nVX55(ptsdVq;Fb|;Y~Bgp|Dspsg$Dk&iev|Vcc zALgNEftSf@!_X2&Lo+N5j73w`ugg=SPQfP4YdoP=G)$p>tg7a+`)lV?);Hy?mm{?^ z?y;nnu~PU5)H4)^*2@^h*>ZUEp7WI|=}lO!uib%?_Q+m3X(;AP*l zO{0i0UHtwEhNsBpOuj0%pDsGAW#`Gyc-C4nA^fW<{c}CF|KzFwleOs)43T}v&>spZh-3f& diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings index 62b9a7c67fe2bbc0ca49b25f26414fd883b9a38a..79d1271b0c528f26a9e1dbf578136fcc0bd54575 100644 GIT binary patch literal 61466 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 K^Z$BHoc(`{vQ~!x literal 28823 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 diff --git a/damus/nl.lproj/Localizable.stringsdict b/damus/nl.lproj/Localizable.stringsdict index 46cc1793..a8a1c3fa 100644 --- a/damus/nl.lproj/Localizable.stringsdict +++ b/damus/nl.lproj/Localizable.stringsdict @@ -4,6 +4,8 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,15 @@ NSStringFormatValueTypeKey d one - %d andere notitie + ... %d andere notitie ... other - %d andere notities + ... %d andere notities ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -31,8 +33,6 @@ other Volgers - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -69,7 +69,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Antwoord aan %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +77,15 @@ NSStringFormatValueTypeKey d one - en %d andere gebruiker + Antwoord aan %2$@ en %1$d andere gebruiker other - en %d andere gebruikers - zero - + Antwoord aan %2$@ en %1$d andere gebruikers replying_to_two_and_others NSStringLocalizedFormatKey - Antwoord aan %@ en %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +93,9 @@ NSStringFormatValueTypeKey d one - en %d andere gebruiker + Antwoord aan %2$@, %3$@ en %1$d andere gebruiker other - en %d andere gebruikers - zero - + Antwoord aan %2$@, %3$@ en %1$d andere gebruikers reposts_count diff --git a/damus/pl-PL.lproj/InfoPlist.strings b/damus/pl-PL.lproj/InfoPlist.strings index 1e32453fa7c88b46f3f8ad52c8134e362ae32374..2c29301f0e4cdcf6c1ebc1f2c8596826136452dd 100644 GIT binary patch literal 840 zcmaiy%}T>S6opS$f^Xn%$g-e)0C8ar1)-FJ`T%27>QCAPlPE2|wR`oulf<+b=pvKc znRCv)=S+USM;gj$tV$atO0}d)^sGWTmDiSf!+RZ0h8pQqk#00O;KT=vS%Z(@UhzbV z!%l^2q)Qa~x*qTHUpML1o$HNx-Z@)@`OleQ5-M|d%QQ|8%;L2Qu42{#tg&*HtQnpi z$<%IVy8GiByW{pVJKs~3Ug?vfXT2+ZpuVKjj>$^C?8J8J)w0i+rPSFV2VK_=jg)Eu z%d?lm-=gHfneGbCey)A~=XwHF@;FWD_=tuNI!@PgwL5Q}7hpP%4#&sy>GTiPYwb?0 zU#m;Z?$~a%&7=EsvXGr+X#PD_jfn>iH};>d@!&P4-cPa3@E%46VnGs)Bon=m@(Jh) gW~R?U%BkItWo$|3d>2j9?L1kN+)iI$FPhwc0cIKPdGY13+muiPXa&Vrw8A8v6BpwTx zvi-Q%En3j zp1^5?K6a*8SO@3`r collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - %d other notes - many - %d other notes one - %d inna notatka + ... %d inna notatka ... + few + ... %d other notes ... + many + ... %d other notes ... other - %d inne notatki + ... %d inne notatki ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Obserwujący few Followers many Followers - one - Obserwujący other Obserwujący - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -52,12 +52,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Reakcja few Reactions many Reactions - one - Reakcja other Reakcje @@ -72,12 +72,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Przekaźnik few Relays many Relays - one - Przekaźnik other Przekaźników @@ -85,45 +85,41 @@ replying_to_one_and_others NSStringLocalizedFormatKey - W odpowiedzi do %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others one - i %d innej osobie + W odpowiedzi do %2$@ i %1$d innej osobie + few + W odpowiedzi do %2$@ i %1$d others + many + W odpowiedzi do %2$@ i %1$d others other - i %d innym osobom - zero - + W odpowiedzi do %2$@ i %1$d innym osobom replying_to_two_and_others NSStringLocalizedFormatKey - W odpowiedzi do %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others one - i %d innej osoba + Replying to %2$@, %3$@ i %1$d innej osoba + few + Replying to %2$@, %3$@ i %1$d others + many + Replying to %2$@, %3$@ i %1$d others other - i %d innym osobom - zero - + Replying to %2$@, %3$@ i %1$d innym osobom reposts_count @@ -136,12 +132,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Podany dalej few Reposts many Reposts - one - Podany dalej other Podane dalej @@ -156,12 +152,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey @ + one + %2$@ sat few %2$@ sats many %2$@ sats - one - %2$@ sat other %2$@ satoszy @@ -176,12 +172,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Zap few Zaps many Zaps - one - Zap other Zapów diff --git a/damus/pt-PT.lproj/InfoPlist.strings b/damus/pt-PT.lproj/InfoPlist.strings index 954203d2986211812f6c48e7be7aa2669198df42..488ca2346b3d271872ac0abeff713a26da02b795 100644 GIT binary patch literal 808 zcmaiyT}s116ot>Ts~GZFs9k{gP%Q;PNWqIq+@a{SWD3>MNsrqMM*sdWl*))r7I)tf>m^7;~5d z$<(wny`1%?Zngc&mU~RDJKQsOT~P5`U$_Ud&8Zl92Wm!YM`qTs^-}qnBRdOi*gbfk z#hJ^vFO%#eo}EJ?%eAn<+5 M%>IiEzuP9|Kj8(7e*gdg literal 287 zcmZXPK?=e^5CrdeMU$hTd4PC`22T5n448Z@YZx!GdoiA*D;G>s2RU?)--dyi+ zkc%fjA~!~QaaM6wsu=}q<)xdgIHWv9{(}cPVn0-zm7{XDV%6#CU>G#(pa^j=riVfY gQe4CB+S65n?%21|^Rl@y>Vdo=4{5^)tE>6N7fj_~m;e9( diff --git a/damus/pt-PT.lproj/Localizable.strings b/damus/pt-PT.lproj/Localizable.strings index aabd2a1bf20e5785812c4688cafa5e788b5a7b7c..cc720db37de9ec625e6ecc71dd20c747b3e66d89 100644 GIT binary patch literal 61550 zcmdU&O^;pIb*Aq)ll+CUJF%poMYRoN;zrOek(9(XNma;_3>%(MBqh-%i%gL+P5qnv zoc;$r3L;6n{O9f9`C)h`$cv+L!S+-#plyY(C#Sj&YCT`-8Z8u=y(f z;?9H3^Z3lw&tk5}o4cFe#`SxfOL66IHt%izV)MhzUvGXEpO{VK?#GCe*&RQOD}NXN zdORyW_-@oc#ESQ0hI?`KhnxQy^ZrH54i8s1zu!EGweQ57(EA`pF#F@68S0V?R_Fec zmH9k|-^0y|xcVUOfLiALJpR2i@yY#FDs|l_G0TI^?L;H zX}+hiE+e2})ES>IPqc_X(TSX~fxGd~VJ@5N^*{~~7PyE~I5qO<35 z6%G$JUr+O+=g+6HcjLP3<5E~rwKwyMtXLiDuyc5XL;gP5d>fxwRlLdm8OeA5K2du* zjX-Z`?SAlcfASq{PJF&Q&1_D;n(lo(-76aOH`+(4vKf36OF<7%09CA-{Ar}Q{KG^k zJiZ=JsTK~E(1nEXl)E9H7vW9P5j_1@w*RZa(Y?*Plic48tl`rVpWsKAO2yOkub+pE zgg5U`wu^M|b*vR{!jgqtFQ(7f;+4&fu>85b-k9WV#6FquA*nzs;DB}VVA2VQqwBJm zC$Wm```x(yZjA9~GWu+d?4A=>>2dkIx^~&b| z#eGKBFJgw%&2OgBvMe}&()%$+d_08^3!xq2z-zt0pQwpD09g$QC)ntD}|f z&MX2OM;=%>Qc3;ewQz!Lz?0LMg^^d|+7}@;qW+gtB(mnnYRG#)o{?&@oLn2ZA$>({ zTfm%FtjIR#RnRK(l4Y)~^Va6p!1-G-m-2!6cTdCiFGU`BF#YqU^^+d={m4Ame_45Z zrcu_u{{6}M>#!r`=6Av`h^TmATBN+-&&eCsD1I3o{c4gz)sC)6FTKvXbe3&C+q@mV z@mcuJy^x&#dKiDdy?JN)=U}SJYEJRv&0j^GcAooxGTqU0%s1(URBVsKKFF~_99aXI z2-O>yN>rk@0wJ9%ym@b}6cHhxPWXFKg#4iJ$86Ou#_zsA&m|8f8dB$|hOIhqT&a?g zuHL+M=9CiOY&n%eV*Jbaan+9I|32dv9TRd5BJ*iPepzPs73)cno6L@!1UbBUJ>lKU zG{1~a$Tu`=^`pGH8)K<+KAUo8YAZ4<q9jJ^+uvHIE{sIRUH_5Y*HPC&tY$VvYprk)F~IWSiah$8_=|o5>ph50k$R_83PeiKc;rM~qaM$r(iH1yb*%R>=z~z;0C>AZ%=F8kL&J?j{Urw zv8Km6H&!3&ajYN3TKC=z?wIY1_`hu(>&1%DJUs+u zVCf+bVg)K%>_Q$OEj$k%)su&EX}CsMMa3S2s$cy&^4FtSH#3V%A$jJ}4#10$zq-b6 z$CWznr?FnYLezLNVK-LrV#5gRnQjC4ER?G;TM;t-@J&*4upzVlBIrf0*c!<9rZlyG z?q)PcHj?H$A=kN%yA*RIJ|HgX6pVX4*F(ExXW*y0Dbneq&?LTY3uKhLspKoapT1S~ zNOw9%I;MHPd3UDIMGuBuFlhL^`Ox8aYbI}pQ}=})3=(ASuCdCGY0r7+zk&#?mc1ZH z>!iHfwRwBALY-#aMk6C01ecxGqu`jV;r`?!#7M==lDbNn}vJ^)wYyyl-X%ZJ0M?amF*bl|q(7P;1 zv0L0SqSg!AIi&VfM-W8Q`d*Qa#*;xeNm+6$+W}oc+OCUgH=3PwKtg3CQ04W6apH>J z;Fb8U=XH_{{sOICD}9%byOToArH<<5N!HNXDLoFF#`vIWLVZVKTSgV_aS@}xm^e^J zpBdEqR5Vwm4}PN;x>W24@>wxBccK+Zx_^xPdG%^(hnqia{(sCpBJ8qV-J2{3THx%_ znVn$sSQgjuoUzu*&gIgqT}JT1Dvpn7tz1FF&*GnPz0N83r|u4?+3v=S_{iMCI!(~u zaTl)GF%s{xddZ(m0jjv>Y!ex?78#E_c-kB4x>08jtxL1ogHH>WK2L&XxXs!DZjiO; z*v2J(@l}i+5u|*|!YAq-@Ekk#T&|N;1$BA!+1?JSIt}j>NfDLEkg-S8p*zyM z9!5UdadDYf>?lu7V9{@$*O7+Zy!sCE0kYFOGj0z<@_dU05=HwtBm5mSV4sq@I<1t9 zJP|`$Wi{_i2oLyUBYGey_zh1Dyb+1AqMCE`$5{I8NG~+@zM`-bgej#;vW1&r$W@VVBI@Y-bU6+ z_Mg{T2Q=ZD&t2i?vMFd_9c2|-9SMUg-=5vWohd6mNe4&+%CQ;sz`lQN={y*#Z2N{Cn0 z%balRUSUtjd9g42!1RDnT{=2h+~x83ERV!fyC$m~#(YE6JIfT>_Ur>(FeTV^jZ8x8 zq?`z`OsjU-YyR+lXt~myBdQMZC|Asi=U{`f4M%W#4$Q^bF3YY`y++X|69ytJpM9Ov z^hvDV_Y6kq-j46VOZR|N&r5ixOxHWXAg;Q@%QPa-HR|S7+j4Ij`nv?ZrlTv7fLMyx z>Ex3nol;fgw-v0}qefY(wS%xEMa9@Iad;ZL46hT1I7NT3sVFq+VLqbkW9j>9zlT$n zrdZ4gH`&s&sV-Zx4?4BVg+cC)TCOAM1$s=Sre3Wyygmt1CESlpzDvzlD{XnLQg(if zB*UQNpd1O?7FIeRw2f-NB6}l7HsyY@@8x@l@F($4?(X*<0^X7*1V+v~bt!@4xJOkt z)qpdzb)4>+7xnPWiE?%P-O;}|D*CKo?{1xMEo7+bg_G{&WzL>KV5F$CoJ3#f7Q$qd zJn!1BZmoB%q7K-_XNB^mnSJfzGbh&eKAG)QnfrRr(mJ}_bWglder!36wwx6AJG<4W zu2P4RjKkkvY&JZD>_g}G&3W~ZN=y1iy*kfcUKe_?D%lKus&Nlu{I1hl@9G}ht=XB~ z-APw)W^LV#wULq{Cbb~7UzZg6l{B24T#x(7)aEj}9b;>?QDgqAp@L_hOmj-3Qq)IO zl&{s4(B(WmT4W|3*7_QbBGC7&(NE&J zhU-CtGnbK*?ULKh&A~>quW{wIWd$jPk;miESg)FhZWUt_SEUnMKUe`Sj$JLj|6TA5 z%20KvYDD)sJx5l#Y~%gTHO@W=+fpa=qBgyaBj+nZza{=8*<}u{$4R8^dZ{C7?AX`V z)@ZlQEn(4iWVso-!Y_47U`^`Y^`|rHJ9^~icj!qi?=G_Ez4aOn6rD+5~Nw2rY2Ep>sq{^jH_Ky(U$983QMoMN;l8; zVL&O~;-I?n>E>Ui9V+(M*c-hY-x3e#6d-4vd8Kk5JCHs}LafoM+H2)LuU%1e*-z67 z#@)p3r#Y@_n`&lWiR`lyenhSgzw=X8mxBje=a}Cutxw${xs7pe9>Z(zxOTqLDD|%` zD1F9RRi#NihqcZ|#f5s;S}$aoC#;h*;hYfYy_4=SS7Ud9eM~?1rJXxGoQxC8K{nb^ zb#*`P1SKAT!EcA3zccN--Hw^zpL!RorN8{!X*DoV=eOOHOs(Y{&hYwr*j7KUh!<1s zvKK86oXdnL1Z`9{oS{`zn$LXwYz`#HZeyOJq`vO5+tpccP66&gpRzw$3iI>yHT`l& zV0ZZF>!##|n)7otm&@JB?@_E%-@B5}Ds1v?Fvu`O5UDcLpEPL20ru>p_KSwnUD z^}GmOTt*Nf^jCTS9XrQ8^u%dIGz9|UH|Wz=kbA?)QN30%>1CvUCDtcrpo*Z2lf3OZ z-K6Zh)0}hpJU!SzEl*d56Vk}@qqss&uNbJhlXC|k*^B9nkNY&0I?bpz;9#@NbR+J; zFBMC{2+l@nuYNokwS=d1fZPjM%EZx1tu*o-2etrfSJ^z6!HFCq9cPl3=B#`2qx9;% zbuT4tfZmbL2XS@<-#Lo^(y9112Q5l=!ZVq(vnVPNLGFKx1O zr>BL%pn7Hxnc*|cPrmh#LDj4_riJ(f=Y`8vT+Ie(sUM4$PHr0YtV zVd;6kWnV&0-ldZ_)q0S)pl2d8o9r~z`ztM6=ebYLq0KFCE}NR6qBGrZujWj-G5}^I z?&;k=iFGUVxme5&mXv(t<#5`pdV1?e`MD9@I z_SFdqg$L}(kh^_0p%`mcTsMkdiR+4;VA+jH)5w+FB=KZ_s=Z(3j7nT=qg@?=*G2hJ z@Td0&5_{+|W^79t+=%aLeyT|2@A)R5-lr1KGX&O9#sXr35S%kTSd?N27R!D3A_(BT zpBdhi4v&KZo`v!W8$19i9|i^H)Errh+w|rv=v8a3;%0wG+0r||_Q9T-b#*qqt5spqNc_0~4L3GCn#ywO4JQEEvuSU++| z$`tp7(LT>rWqI}Nj-%j21=kB>sDMEb2{%>t71?c z4_Do0bC&gU{cAJ*G_>Um``SbgzI88rSx<$Kd18N#G}?okpMkeMFdhnJrC6*m(5I(Z zuU1=EV+1QQj=Y9(bvJhISNMb~B;_`$#>5{ML1jzt6(8tw@=81>&l`P{b5oJuR2plR z2XAwlI%Z;righ3(+Vdl)$s z{!d*eyXw4arOL6dR8BjJ)|j0=&ufi-iK`x}sDSY(LlV!K5GEnH2fze%KBb zjy*y*dspTAgEA^tx*b&N3H|XDMdx2$x4sfu#$$im?5wWIa}OG^yt=BogUzQCo%7o9 zI4IRgbj91hk6n0Gn&fshqKMXBeK_98Vn7ex8)99lpU``WOB_4%+9hB4FIn$NP)4kw zTUk$PTkd)z2=p^bd$1l`t+D!Dtt&Z^D|@TDflK_~CloU3uUUldSkjC-*Yj9*6x!5| zXRd<1pH3Bwu}*lbQ=i8APCvY}uh-w1+4B;3>75y&N99>^SmRIMF7XGNj4`W9TXw+x ziFMFC$2nVt>k97CIL3=3a0*{P!@=bg7@5gDKkYehro0D7-X->55p{yw~CPA)!- zSwR-w@`8Lj7fbj`PXwe=k3v=kDpbmN?vZ^V=FAa(4iYV`(eCG&l^;}nd>AuP8+gRe z<8wW0_i?PqYDnpF$$&Jz^R?Wupk6uD%+zF`0DQ_6~&yb%N)2{VZFdOI}U@cZ~g z{|*G%)gyWN6P)hOVYyAZlg??{~>;trldZG%3*5oTvjVIzoFt!AH`$5f`3 zTnm|J1=_9TXo`X4B&?ZlfdXmksSL1Rxwm6wkL`FQYvhyc^V5|4uE(<&_cY$k_Fnwc z*SIv{`lGn6nJ&e<Dyg06(dIueiNSYxABj8U*~l` zvU1fuaZZtPJJ}+r=e<)^J;s8u-=dsIJJjf(Og?}2hpqyB1u_--*nM2(`r6i!$+P$1 z?#FMhkdYI0bA@iVSAz?DhkRteP6=F!U*&vcBl*rsaJ%jd>X(G*tkA*6bH%?h6XK1f zyxfPv=j!Z2w90FCku>(3;1zrycO1VD-Lhwb_jfHmJ9~$szfErbPsk&$R?ED&zbV#X zb9uVlSXkxX-_WTJi|+8VFx23c6Z_K70%6wt&)+PKsr=EYXH6``e&jenROjRy-gh#6 zUr`;){ye@za?Tx8M|+;$jc_ma`giwz6gncxkSC-rIH|(Ufb!GsHQknk3iz#0->IG$ zJt0rmdCx}cLb=Wt!3Fq-Pt{Y1+9|2BhkDx)6+q3sIH|(U$kSQI^)mI|_Wa{z&t7ex z{p~pKuKjY}_sQu+{eDM%2h+u8sCKyKXY;r%9HW=-4g?g8&w3n&O>t5vdlevUKI71J zdj9*Nd()@Gikf{ z7pD7JndG)Uj0WZc1C zl3LyWrRu_h7)K|d%P_Aeb#-)?406;{NP1!b^zlv!h&Vq}16qNKI!~&+{Uj)&>PhVj z6NP}bee${d1;ES2{2HdK{k@5g- zvcl85rM<`4WpX%W)T#ii9no-}XXv|RU)4O42+x|k5_TqpZ;^TTx&;)`+PuM8`Bz7L zIs*QcGw$tr%33D7FIXIFVbOiZRB}hh^$G3ci7ve#Py4%c-Iry5E57M((p#!rpt5p{ z7rVC$KSFEnBqB>@ne`IYky@35&a9^A!y9PGscqzgjdI^89n~z3mf$PvkbBp^k)5=_ ztjo4k{hPDnic#Y`9N~xV5Oke~nofb=ohM49FESlw_jmcL4QXrQ-k2}BB1!dJx@^+( zE(f*Pr78|R!{j&rV@n5T@3exSj>PL{2T}%qjC<-^`E(E2H#)@TwFaMfvmYKID`Yh! zX-h-`WKd+IJipCN=fR_5FA|t$w{% zn3gCwQY$X?X6XGX9(5(^ct|l8sOmiRrziaH%IZ z(Hie~kX6%fOD)`)xV<*X6ZsJZzlr}7b=W<{*R?Z?{j&yfS8H))A8N1#VKEdDW5)e; z=}tWsER@ms1Gag--7C$6?$ytPO2gWS_ctM&Ys%kbN45$ zLEIpU=%l530NQ2hc6l<*Ro5l@ux6iiSFCXU$hz=RpHgHEe6;Tz8Kt>{=Yq(6_1o;O z$>5})1HKs}Y;B#siXw>uiF(_R4Q&v8b-K}BE@Y-A!_JHuXnm=U#D>VKgiJ;x?FtEf z;DsGhV*H4Zn%~}qMUX!nY67ekP60C>#@x{949U4!ec$C_e2+e4e_rvA zlciyi>viT5HLQ9(Nlu802Fav&8y~*gb#yIO-qqm|2Usqg$Z|xlawQ~V>GFTxb%Vum zojaUM&);W>HDLveRDTn_V13-DQ#!Ig&PHItoOAGbIIsjefxp`C^fUEePPk;>K}+y} zM3vVgA8_fxqUSgt-SsL2YoGk6@d?|Sw?{LS+s?8p`C-0qgfCkBmk`pwau zy4xWayh3v2|EXnPO;1E7)Tzitx|9y_GVN9#L{A?d24#t=Spni8kdE9;;eHmaTTIa=jD%ICbpg>;uO3JOzp*!|u3#X3%t)ptZB+W4Dlhdp;) zlO?`Oj2dfwVK9>IGF4q?EOLCM{zWeQzBTrw`c`9+?vu&ud2#?d>33INZ(iX3v?|>V zo+&S{D|v_0)ci|O0X1VEw$?QJc!%Ul>|nIs%IFHdK7mE9Q#l>KOD@>KfHqtWnR;X-#mwuX;1afw29V#BHZgjK_{wrtu>5 zF^6zv_uVPWBSAC8XBvrJt#~`mnAv8kFLaWNLmNI#CtF?*D z#5Jxs;%IO4q{M4q+0Tcy!zC~F{9TF~QRU|=HG&-nU5d=&b;LAz6aJtxT>4A-8G5&6 zJFcI^IDM;U z?ChQJDDU~aJWY}&C{kB`IqIq>NSpQj9@g+!%U_h2O82tF)}_6qn^z&@`tpUxnE#|9;Ysg^6pV9AD!8!t+``}uV&uFU&e^#r;f?_p$!Vu-Dl@l zxtjcBJW1t#k#a<1HE89&O0NQt%VGSBAFA7>ezUN^JMH-#5_{_v`{+O!{i&BsvGN7Q z*}kGOWp#AHZO%z4BTRXa9pLGbS=U|dvs7LA`m1{02dWei6xa0(lPmI`zvR=_^A3zr z9^BHi4(UnG&@v9_O8#ms5<>e#3v{F|Fi}WxDl1K2Q62^Qai8YXF5#GA85xg5&V47_ zbZJF0K;k@eb{P{@!h;S z%|!h?)*=7?-HKzEsz&;K;)(KbBbTGg+#|Q~X#X@mR2p_?#}~oPN{v=G#T7NBFL%Z8 zRd&Z7obBr<9)eVQ#>{v)YPm;~y7G3^`Sa9K&1xzyl45#KMbIa42HzGw+MB%5?{kp0 zy?0?hA-AZztJat#O=a#}0&Sqdv_ra9UfZYbc4?&UQ&c{V8Xx1X!uh)|^ zuR>~dM~MdOZzzPLPLXEhx~QrZOTDVhTK8fRxntQQ&r){|o_{l~tXxO=mS!I}qhzk3l2|0L#-c0C$2r`mD# zg8!aIjzq1>H=|#Ow$87w)qaa>C1?Igu{!x{ROa4&_7K*sIAwCa4C_|#CaSk#fJZEG zJJyEekgld`k4=7NLHlZX3W#xN$onir$~AeeX%N0M=gw}F zdTiPqG_tThRUKIn)aZ0govJ$IiFY$ zD?Fa))l=x|0kB)@UBHh+`c(>i(pu~-dha`TJ$x|cw}c`UaKpEMshrHMBf34uKyw- z9ElRD>-t2NJIt)B5uFyFmyr&;9IwwL*K=>%ts<{uKt>PQbJAw?looy*+Xo(!o?g#*7#5-Z8t~h8-E?U(SH^1u=1ThnLfQqeM!IBli5dS zVB5p+>uokCy)c%n&m#};^Cr26b}{?2y@G$vf^2bkn>y`aIz2~r zkHPKTT-P_OEm^5`I=&gLqgEnS#xU#~2@x$pg!+Dv%W+kmOXWP;!CU_&V|k^bqq$D3 zRWwOls7V=aIb7ckLDkw9n-b1Vyot%%9Wxa=lJ+51suWrvT_vMEeE6M6CDiM#4 zFSbWMEv&Omjs0jvYh^heQ#AnB?j$<*QBIRRPR1+O>SqX+P{&yhy_RZ^?!6FMyX0#8 zyb&uAdHl55E*W8$otxz0tMFGU6XxT$?eR2MaI%cF^z(9O3Dpdza>d({IlbWD@Y|jz zhz?mA{>7en@>R2c`JwiyGPgdCd)!--rpYYOJUX{C#iQah&_8?_Q=_xm>6HV%-bV zPrka=xyUig)QpwO>wMF*c7f90kfHXJkr-UO9e#Xc`YUmQJuvR{&J*aMTEc!IR3S@q zp4EE*=!@Bv(ULiOw;c*W%(4F-g@*x1hDC$_@rN zgg@rH0ql=szdN5g@cv=lvC}>Yo=$95_^e*<>MtBeR zgF+8VzByj6aSn7jFI`oWx7(WY-(E_I?H*a_>Ne}h0VklD^4>8IOg~{Qw3w@Z7?y}- z(RmzC=Uon&VR?=bvblNQDDM{ys+vzipPWrrmN3diwRP@Rtx?17kms2HzNe{z#)Hkv zybaa#Q#~-3W8FBXR_gC1$uq^eOZ&)F%;x6Cd)11q(k^AdA2#Ez~U0q)xKJREkYn{&Zal9q@zYT9t)((j!AuJ=^i zJ_-&&*YRy!X@Sy|?AtpqLdW_>kIt9k0^hIk);l#|>W8`?Ym@0vK09u`2P#qJO*Y3f(m(L@^ zxmRAlzpj}cnD>ewSu~zY_O4$bNNLV_>2XlDW!vo%k+f7FblX8I_01BM(u(et%We0Z zpF3oKFF5`-blN#O4%$>hbicIL&55-L&+3OGHDXGwC*|QrU_E!F3fc3Fez9vV@?_~M zksX}HR+yQ%Wm~nU8ws*TBy;oAmWqSi$D0YL1l_k$A6woeJAub>HLp_fWM8|$zV>~e zq|p*Cr449(6=#z13Ga$^ThjB0WZPplu`h@FogZ?yizthw_ut+&eTu+K6#ijm$ICHu z3D=pO=N^@B^-9uxvGeVwDH_NVG;7+b_D$8->8m;qAL&Vch1qm0ynDU8@7}XY=R>a9 zd%wXP?!M_p*KLKd_J8#=R7j8Zmz_gbXTv3PS!lu zZ_{=@WB#{G-7B02>Bg11RYnisj5E|ooa>#Q{$0{@d$_Ah>vi>6Zcmn| zw~BN+vC#4Tb#-*7?>rJRvV0ZtqxY%2mcE|e#nN{XZimL##-;RpC$$9QHS1CzcL@#Z zTd=x?)xJ4MLGGrk%NY*wIKMHPV3E%9_?}va(-waB2v~2V&E7UoevNw+RV&961=Q4f zYo|T(e5VlBGG%Pll3U}6+|qTR_L+#d>`Ic^lI1G9RcEO8g-1>}QBJI9T}AHw=1Hwz zjWwU0y_XJ&QXggSk_zVQi86KsScAM-*+2QUc!h$8Q@--Y;G|pi2f>k^kYhaYap}ZR zYM;tPm_SywY#ALXGOyL%1>FOBI;(YZaOHNFex7t^ft8rF8_`9{xdiyQNo7OqSJ+f13xPs?(j zszQ6e^w-aY<%u#-MDL}Sjj-22tP~zNw$b0&t>HN}Rl|AWtM02nZ$J4(jRvps32Xv> zl^G%>UDum)ds~6xNf`h4w!W!d$PP)GqYaFQvFTi0{<7TVm))~ z!**C2E zbwmcL4c@&%&Lr=U?IR=N0CVKYHP!TV7Sa;&7G@F+tgHK&O?b@z8Nm+D>+}!nw{{in zGbcfpo<{=t`Pdwc@Xk+t8h15)U%;*7xq(H~d!n~vrY zTgRFmneo5uc&+;_wuB${5tb~SW2iZbQRom~rbByr_B)3UCrWf$hMCC8i0@?l(94@3 zc`vSVE@Rzj zgDZM3qcfN>vr(1KNIFHVuAGY*$!(a49vbMLyf`mnbwvwtr1$f^3Tv|`;jzZR?e+$x zxmPq=f-%r&zhr-ULxZ1`xwsYXLkY6{WoQcw;mn*)%wtp48pQ>kiH6cPJ9o@=CFVMb z=s-luQ%BXl)1Qz5bFuCZV*KsUqOxE|w3E0hua|W_kJ0RvtBX!;#SVZhP8lcirD{V* zqJh&OdM}x)!>d6V7AyS!BTX{@>)@&{QYGD51NlQ*I- z&*g|ATUKO|Cop^ZE8gHN{;TlON1GqSl{`nlc`s<;?Nf|JLb@M038~?cw-F*$o&vBu zv2tD49E@}4dOV@G+^^sE?jYsdtcHCdIkG+E=uY}^xt@sBuhw0gYe6l%od&PjUw|j9 ziswU=6G(dMTEn9(22Ch~_EQy5M*WT!$!wt&>ycOJ*?4S)DwtEzs-)l~dtJ<~EDbuA zR))6DH7MJuOCRGTdQu_Ot@%;X1GTE86d$vyNeZE9tSRafOPNX4v#CchudLZr@+qZA zcFw$TCZvRFXjL>P9${_h1qwPn&@76-nItFVVRZU}Y?o_{wExx&WuG(K%2}`(^d(Bu zDpM|WGe3`i(4{&ktP5V@4MLr+LFCcry&1f+LbYQ?>G!-GiIbvb*SDjD3pD9uKS$7j`L!cTK&zLVH+%P+ket^_3+$5cj4(<{ykp;0*Rj4ah zke@3WmmMRacef?)t8kC@pONP_|Ii)vsodmfd582kX4EMM5D40^HEGYMIf!QKl{1w# zXrH>zY~o6sM!z2a9>>3Yk2DqOSxu+SM}Kp#2gLI|X-$e4nd_h%BcSCz0I<0|vm0#uUmY~&T4|QKb*GEf`4peW9Jw|hv z@z~?)n|JZD#QBjwzdu*i6!Ik7_B=}-x)cG}W$2Y1(a^PS)yXHr$fWE_tW79{-q8|m zn0wz-vGV*`F1+|$HdO)M>prjg4azFg0(wrC9#1w!4hjYfPcm=9BYUQ)%ugpp>yt0L z-@k0#{CQBG)c~4JNrFOu_kaKGpVFH9_h7cZull<>SvwIz@y)-RDkQib^Y43_%QcE- zs8rmF*wH=ba9WK%AC;AI3uTSlJqaGuf96?S?wHCRk|tS0-BV>mrBW4T_Sng&HJ`dD zOMAoH`EdS;$0=`kG)1V2OSzZZY43Pt>UVLxiyx?Xum@ii*_`owa^_KV70{VHtma9| z4O2ggIjV>lZyBWb)pcZXJx+P9TvOG?cv^a-E#*K3A!>!@{TYAq!tos7oF))`-?JNF z8Ms6Bt2)-Fif+gCDy^lgvae*6H~#dQ-N7INVXKn9$6lGVg#29dR*U+y(U{Wm^>1Ug z?y>uwzOk*amzpPojP8|!IwIG<9QUdFPtGx(>R0Pe(S8~ z`_|OcS)0YtsL}&2I_p*j$o>T#Q#=SCrzTSE!mn1S+vP4Rxgu|hPied#;~zzb6Q6S? zM^6=wgn)g1?+`4_JKqD&x&f)BZtiT=chzGjwN<^r?A6$8SK1t}OoA=@$ zECoNgG|{S=E}i*NYH$BLswUHt+)=9g)p(G4cfHF%G?T8EeiO@nhdj`9_7XU`gsj~g ztsMU{uIrbpK0b@x{#CGAlN0|QP2PPw<{E#Ys^iU4b*j9Ex=xvCc0OF^8ks<`>{RO9 z)5*j)TK_7rPVa0Wcc$0zCVuNJWpotlAz7>*bcdFsu#b9D;pf3)efMk1uD&}^HMUS$ z{nfh5guFB-`%7KEzntU%Mj$gR!n<+CMd5-*$Yxw!;|16?_p!H_oh&*(cvX&9--8_z zMt9uoxO^$T7get6mATS`OBz9)PN5?=I>*0GL%Z^6{8f7eew%apL`U7ES14cc5$^02 z+vwM*+AY^UKXS5MJQFnxp7eRcMqy#10`G?ETDu>y8Zj!_1EihgzvU7^${gJ-BK35xmTo<^WmOH%rBq_O1?pFRs& z;9acU`-#a}jWY5^t%;0<_cbQj3Nj{OH_{s3$8}q0@2P;dU3%yr>3Oba@!li66>H-= zor{B0vJmW%Z?bQ>yvLQX5j+OFRqx;#oEy?ST~mkQPwtiN^R6+@6tVZ+Pe(Z~`_=Sq z^6JkuZk@m1Wyxzcq`p)S`P*^z@m(ITs|Na2=ncyur|5eV{hLZ(y`$^pbyBICmfxNS zbyIgfNy9gt%DkgfnK=kPoqbzA>38H5HNHNx8W4&Ij9;;KzC}i736Nh_;`BE09aWG< nX<;k~E|0^`g%HFFU9Q@) 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 diff --git a/damus/pt-PT.lproj/Localizable.stringsdict b/damus/pt-PT.lproj/Localizable.stringsdict index b7d5e0f2..0dbd2f25 100644 --- a/damus/pt-PT.lproj/Localizable.stringsdict +++ b/damus/pt-PT.lproj/Localizable.stringsdict @@ -4,6 +4,8 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,17 @@ NSStringFormatValueTypeKey d one - %d outro note + ... %d outro note ... + many + ... %d outros notes ... other - %d outros notes + ... %d outros notes ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -28,11 +32,11 @@ d one Seguidor + many + Seguidores other Seguidores - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -46,6 +50,8 @@ d one Reação + many + Reações other Reações @@ -62,6 +68,8 @@ d one Relay + many + Relays other Relays @@ -69,7 +77,7 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Respondendo a %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +85,17 @@ NSStringFormatValueTypeKey d one - & %d outros + Respondendo a %2$@ & %1$d outros + many + Respondendo a %2$@ & %1$d outros other - & %d outros - zero - + Respondendo a %2$@ & %1$d outros replying_to_two_and_others NSStringLocalizedFormatKey - Respondendo a %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +103,11 @@ NSStringFormatValueTypeKey d one - & %d outros + Respondendo a %2$@, %3$@ & %1$d outros + many + Respondendo a %2$@, %3$@ & %1$d outros other - & %d outros - zero - + Respondendo a %2$@, %3$@ & %1$d outros reposts_count @@ -114,6 +122,8 @@ d one Repost + many + Reposts other Reposts @@ -130,6 +140,8 @@ @ one %2$@ sat + many + %2$@ sats other %2$@ sats @@ -146,6 +158,8 @@ d one Zap + many + Zaps other Zaps diff --git a/damus/ru.lproj/InfoPlist.strings b/damus/ru.lproj/InfoPlist.strings index 2542bda0f711d02313a9b4976c65df8af295d741..a2a87354137e76e8a8ef844a472c6bdd2ecdd97d 100644 GIT binary patch literal 838 zcmbV~%}xSA5QOW{CttyXlRc6stAY|17FiHAAwXh$02HGpibT-Fmsh_TP#|og@z68d zKh@h+J)a*%737rZRb!3xs9U^|9yHYiZ>V?tG51r*6jaofBDK_6!?f2By+wTlwvI(= zhsY~kBPDdm`|Iz2+3Y*Y?K{v5^SqI}3G?qVLnnBi-38M)T`|j0cY#%#b4sm8O*G?t zhOPOA*XrDTbBe8HnU(P~t5_TJ6&-G$Em1qaQ)^Pu zvIbeFD%P+Qst)io(5cnP`b=UyJL7v*+dK^hx`){ebLztK8pcD+@3_g<{ocRXPyeCO zvj2MbdGEigwgbwbtgh#k{6 l4QiLEaq>8iX%amR^>sFpu{oy-)v4`==+R=9zU?hu^B22we9Hg; literal 541 zcmZ{g%Syvg5Qg`CiXqE__5s9&8VZF{3gQDCo1lT-NLrygn|NCk^8hY|k#XZic~)YK`cCs;cEv&83S-UHRntQ7a7kgP_;7iyP-gueny;6YX|> zVa*H9cqtQJb0#U_NhIc+*Ldf0$8!V71O6d?fV3YiV~Hi<4QIp);*H#boPvxoNb^b( z)ImSXqa@pa-=3S-y+M!a!DXnz5uJEmU<^n9X0ZGg2mN=LS9r)_(RxFuDKAY9_{z!N z+4%oy+*p1BvLa;FaIg6tb25`$Qj`%<^9;kZ$9-91LmSqcp diff --git a/damus/ru.lproj/Localizable.stringsdict b/damus/ru.lproj/Localizable.stringsdict index 36ada760..f34a9b9c 100644 --- a/damus/ru.lproj/Localizable.stringsdict +++ b/damus/ru.lproj/Localizable.stringsdict @@ -4,43 +4,43 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - %d other notes - many - %d other notes one - %d другая заметка + ... %d другая заметка ... + few + ... %d other notes ... + many + ... %d other notes ... other - %d другие заметки + ... %d другие заметки ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Подписчик few Followers many Followers - one - Подписчик other Подписчики - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -52,12 +52,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Реакция few Reactions many Reactions - one - Реакция other Реакции @@ -72,12 +72,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Релей few Relays many Relays - one - Релей other Релеи @@ -85,45 +85,41 @@ replying_to_one_and_others NSStringLocalizedFormatKey - Replying to %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others one - и %d другим + В ответ %2$@ и %1$d другим + few + В ответ %2$@ и %1$d others + many + В ответ %2$@ и %1$d others other - и %d другие - zero - + В ответ %2$@ и %1$d другие replying_to_two_and_others NSStringLocalizedFormatKey - В ответ %@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others one - и %d другим + В ответ %2$@, %3$@ и %1$d другим + few + В ответ %2$@, %3$@ и %1$d others + many + В ответ %2$@, %3$@ и %1$d others other - и %d другие - zero - + В ответ %2$@, %3$@ и %1$d другие reposts_count @@ -136,12 +132,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Репост few Reposts many Reposts - one - Репост other Репосты @@ -156,12 +152,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey @ + one + %2$@ сат few %2$@ sats many %2$@ sats - one - %2$@ сат other %2$@ сат @@ -176,12 +172,12 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + one + Зап few Zaps many Zaps - one - Зап other Запы diff --git a/damus/tr-TR.lproj/InfoPlist.strings b/damus/tr-TR.lproj/InfoPlist.strings index cbd763a5fe211e2bf5d0ad937df43824a9ed8cb3..49847167d613a79af36a52707852dfbfb8466fff 100644 GIT binary patch literal 808 zcmaiyQA+|*5QWda_9wjTOCXf=96eNG1R+B79BXSS=_z{7@fUCCh;2tk-FI;9@o@%Q<~~m0&*+qKGVzYj$qaV`H6Mia-TBP~oV~?TouuS_ z>@^m|UkBTijx+_cCW0Pd9DBFYow$b2UiU|1MNL!_(01I3$bZOQb4RvzuINqNiBsRc zpx0(@)0>f*;!+n$LG1Y-9kXq$+%0=i^SE|y>(1HjJLhFnwScMiI&f|~os(OP!OeZQ Qi-slmUUZVW_j%*?H|Ca#EdT%j literal 105 zcmdPbQgABGOUX%9NXaZN$VseJ$V<#kRnXGsQgU{K$hbfx{D9(03bqPLE{VCN#Y)y( PT>5am7<%A}Q(%e#$;Ka_ diff --git a/damus/tr-TR.lproj/Localizable.strings b/damus/tr-TR.lproj/Localizable.strings index efe3f4b132d473dbb6c805efbc233d0f1d9d31a0..49a39729a6ce7ade5f20c45865a83b01b1ba7a1a 100644 GIT binary patch literal 61648 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 literal 18608 zcmcIs%W@n?cHQ$UQu1gZDL~Mp2yN(a3;}{7IRt400g0j6Wp^dIi(OsSQx7y7Kj5Wz zT6i%Gue2R(6kc!#@JIXu{so_N@6CF2H%Nlx*-(wD%A1)t@8jG@>fX2RFjV6*UDRoj zyW-4Ei>0fl!R6`VpTBo$67o7dOGD|FMUy3N6kJn<#GMtTI}asZjXj6%xo_{?`Euv0 z2RqK!PX4=0v+Tz2zjXiV?DM1yRhlPZmg=~qxPDtUnV)-?Uj3TpZq{U(&#x~tKlZcw z`m+4;U+&zw_pN*3&(n#_?nb_Jby{aZ7nTNY0t>0Ioyskzg-a{E%Ccga<`d_+iBi}6 z^>JC8rCHcZ(rS_U)eAolUoZ68eP=&*-J%)I!soWOlr=8Y4s_S&toB0IC9rAH-<6^!jc+e1u@7%dB zQ$NZ=%Mm*-Ws)5S!L#4h&fcBRT`&&XK?ESel}Q69!K`^0*CF{k zw$h{gu?^wVxF7t)c0`H3df>i#Ag86jRM;QAfpF$3?O@rG(v1}-MILx4vk(?;f!!3j z&$3mkxI8tN=1|wUj$M@Lxv#^XJDr9Suekkb@CnsIRAy0zaljelFT4!BX_wPvuBuB=h#S~*56gi0sA{?M<8jgCHP#xce5b~7|D{PWw|9#vm!FFu?7A@bX~y%- zp@Mtvae)5TzQl33GM!9o=a)FOWm-?&MJNk*R;FXIJ;tm(_asz);fkzz|F&+hJY#uK5+)q%++RglG6zVy6k%L3?_TQ0z z{}#t}eVOl>zJAi#DBoS;F)386TrEV-{;|jKC{OOz#a;ZTn-exoM8M5MRr!e=+cS#K zK{|1#0Y_XkHPvzjRd$EZ)xdrAV9)({^=pmuY{uTbf193_AxquWZx`Jxtx;71hln#+O9D_8Q6TOD{f z`wH4$h3rf>xX+QYxhH-$!$~FHgjnYxGLmoHbMPD9#DJ9$H#ouB<~?%wbSuSUK%Ouy zGRT3hbwFGlu^_idtAg#TgF7fH)!JvJ&)k0E=Yu7J6?O*TCnOTsCQHZe>0uO6v)D$} z%=gnnU8C68XX!jkuir+*a?sQ@>?=pq3I1u~d(2t9=` zD9slj701~E5*4OLKq`ZMkQjl;iCv|m za{c~ED5pN3#NF=0jMZj7#rygSp5{z0yv?lhF%Vi#&!Y$hE;V{V?X$D?_0Xk zKgtRZn$`fUQnyNTc(8fEEESkT#)}mVb145D-Yfs(24fC9uuSQm&i&+5jD>Di^b#TjFg2Cfhko8vYJ?BO_|9R3b2v2M-(7foLWxnDP0|eEPnxF$1PK8FY%`%kx+)Mt?9Zyy z)qa+wWrATsbO$G#W^?$irflX7EQF97!B}`Vf#HQ2U-<jq`{NEK_pT05Iy4Xc~z@aFu^yN zt?dH`Gj8WKCHyo(Zs*)vTNJEu+Lnj2RCgsPNEl zM2&D#2oLKIj;7hviMZbneyXNcKNf4d=4b}1I%js^13rgiAL@t%R(HUBS%tkc*1+Hp zLkp+k87aT@J7MCl%l-47oAo_6gMb~l{NENkbpu;$(*M=#=zNq!@`HW=+BocSiJdkU(E)Ml}_iq~YipL|(SE18pcc=hfA zFnegusf!!F7GOb*>YD4951Bpehn8xf<04}smvPwI=rYU;geaCg5IMytgexNgn--L8 zdc%$NDNl(I)Cr!X*>G1d#HcACJR|H;wMYYMC<3O8S^8eZx|l(~%YZ7ESMTzxccr`j8}gbru1OCK#y2zbE5L|H0YRWA?2Mt=Sep^4H(Bs0 z0+>ktiKUR&J-sA{A-BjcX#N?Pl_eR9=|(n>-v1G^d(WBOlR1u=(|YDF)+GkKMI2m5 zL~MB#UEm|UkimzLwUD<6=abjSWIA$v>uFN3U9ze8PnS)#DPuxc=6(NHO^zDtkGr&! zXeZas9AG~;P9TKm61_%}{A3US_dmKXGd*sD$u8Ngkt=EiQzXw3TEZJ5=DcrN%>>lfM|iubW3-kRWezt6uLSH ztO9PuB+ja%DHa488eNEv4J&QEdYNsBUWLrF%`pD}utr-j(r_k^A4tgrM%S~jz!*xZ zD9Qt=c(AAvKOzCh)fj-1E7Ik0p~&c1$?y)uQ&Q#LAZ3SIF|b!E6a~*feF2ferMl zww|}c{7=L#y&bJlHu36F(I-&@QD(n^(6A8xqyTu>U<|9Qh?tSqf*=YHP)ZY&h>9-@ z+@d>CmevH6B!x|n&W%C+By}(#rQVLN#1_6lsg9|*7FJK|dQsiKch5%bA!B?GAML$f zsOZP{1xh6|d5c3y=ki{q@q_a&!>CH3;h3*W?MJm0zQze&kG}t&^kq{U4|S>=jiwk7 z21WU~&r-N{3j#SqzBWK@)Z&Hr@hMaVKyJV5atq}l?n*B1cU zV6eM3uST{A5p25KB#@3?9KmqeJn~zK>rXxVo9R_6lpN+Q=;vlScJzV&Q89)Yw%|Z! zc$iN81-m#R`fr!t2?VqP+5;im4)(j(YjNEX^ZYVPhk=YYn#wel+sw`Na)Y1p4VE^} zXc&23xx37vYdI0#?blGT>XlGVRoZM zg8yaBJ})FMQ$g=UsOxl&Y`pdn(Pr5a0Taazb6#Lrz#O#oOar`%J)sq00-o0+(lDg-@uY)v0;SIIu7ABrZBT|e7)R90zDH7+|u%!A|a>ldUPdcbVUsq`!`>d*#6nvU@lp)7jK81~{%A_TNWAswJj zPm(MsR3iLfLYy&%cIn_l-96Rf4-ulbfArbG|8o4r^!R$bPvJDwIHPv6)+^beWFUTiXgcpvpE7NbO7j`2W7SoYLLbhZI) zrHtWeCZIx;MRY^0EIj#|b!cQwh^I7Q>EZHkx*0SWiV50I&_6WI20hoGty@HY8uxpY z`Xwmn?}_b4c=L0CLN-EN+v06ADYxlM+y}2LhVCT?w)Q(pFJ06VAWOzGXXLnKovf?T zIH}qsTf6!NEo-)uwgy3+6t9UEV#(5p2C?@>^_7Mk5H!x#YUQ!1=`(}!Lfq|Z_QfVS z0c@r&NPV|6b1*GzJnk7dd!k|}Z#QHr4m!4g3TysIhtb-I9&z+A*Yq_0tOaH#8&yCu zCT?E)grd!RdT6}W$NL5~+CHIjhA`UgU;PT0W38F7sxjEsy4m840^x}mZkW5{zfO+7 zWn(|i8+5-7<0#dX|BqSXAwLO&y$w$r{AQOKEFIf|1OULUN1KoTt~C7zASN5M?yL13 zVJ>Y2+CEuq__@*CzC>3DC8O^^+h@Y7)3BIPzoV3H9DUozHAuA^oHk z(=xM!)xEw#8eho)v(-?jKSQFKux!Q459pt7PpW0lr_J-72w}VTZUN{o|9zWM`or(! zukU{MUR1&0?eTCko1;aG$MQNLOX*{1?a&0)X)Yr`Jl{+uyc z-JuYXDPS4!uWbwAFRAXdM!aiNvF{DQ>L`LL4iV>#WkmP=vvk*)6o_1HvlaYYpqUcG zuD+IT)iT_z0PR9z&Qu9oCPYbtbw<70P#M^DYUvOzGg{RyAtJ5}7&A!9K0?*Fd<+*U z`57pN9o2^cWtoo!^P4c}C17!>9N{k&Yx$+LVri5D%)WfWl}|5Os>UhNCKb?GciIMzuB|3#{0NtD&}W3;40RPg)NS<>oZ=4&p4GXu zi7lJvFHI;dOgNEAVw|vF`YwOJ>D+m$Ks5jnkjGX8C5mB$5|=G+qklh=4$J5YAESjR zHScbj7;}d$rfAhOVig6%Qg)Pb%DPlac71y>Ir)-T+`>vXI>o8;b=YS&MDiP-UC`A)MM@`LYWjIy)$~(=2l@Ge;KDsxrn_ zRowQHe25CyRprE*op7|wjG&S?Q*6imnQ?zjU4qs>tSH9&l=<*a(;-}|kkufNgG-E<>vTKGfn4@;tS7vkVUnpIp)AO&l-5=uGMA(47+f2*MqCJ)0LRKFey;msxt1wwcwY>}w zeIrcLI%bx-0oSfsF}f#-6{oCh0sM}_*yDuwJT=!Z*_k!yE$!!;xMb%{ub~`D6f252 zak;z$V9neauRh{Nnx%U{5cAm0SY*+9J{=_h*c)m%Q?yXp1)=tNux21;Ej6C-8Y@v- zErdbmW65T8y?+q1Yk=(#Je)9_@mY;vFF7*pyvr79f_lkeu>hVm@Y?=Db0z3PK4`4B z9m)usI3vb{z0f?g%r7s{vo2SV*h*4gy|c>)!|S+MTC5Cz+R@Pfs&66pA$eJHx2jjr zDW*OUEsV0V<-n#j@r&be8?t}fs|_F81_jF&c9AHxj7nv;E$ScoVtG=cV0aDuighN1 z-hf+IuR-g|(?iuT4qzr0)Hy|=4K8}W4mgBvP?cY4TgL!MA@__PA}PPKQ@2%}D!l-k zv|2E;OG$ZpfvhlEUiR>X&*Vr8zz|1$v?xQAqV^g+R%8vP>meI`l?zMWx~7Oz{E672^0($M)5`E&w>^Kpagmr6G4QV z^_vUYGQFeAn=sdx7cf@53nTZM#I)c@a2a=6r??lRpRjtU`r~lARiLpz0$Hz`@(8{_ zG{TAlJFeUc77_So%o|Ziu@j;rg2su$R=z{}A4U^*PMbWI9(uTan5$-z7ov!sQ!Cq@ z%5Ty3XDGCo#}afmD&9m`4tZ{KKKNa)7NjCpzYRQ3`A~F2B1)L{5aC-)@bwI73pV}I_(jQ|;9^)ztVp{U}XfDXLwNDm_P+laMmpIZS z$DXN-+y8O{T8QhTZ6vn^MRFmp^lDaDJJbh4Y1r?38^~x>u_+7tb)6fJWtz>WsxBuR zNzEIvwUN+ZZw*$TAasOTF%{~L;FYx*eeeWC=npljZN{n*h<<}^`J`IQb#j*hO1af*%%SVWlb84`Vr8CiT)=LtK;KLGIX zY6tBs20q}0E8MzqfD^d4SfD*&g05xpg=;2cDeG30V27hmc0tivb-M9)Ohyfqqbv9U!doiZDQC?kT-hxaD}@B>f+$IcT{BYK%tHP&oZRl z&DbK(;Y@h_a>zUNsu&2xVL!bbjuB*Jv8DZ!Fvj?!^XWm|a5g>Eqo=|dddXp&w@41s z1{*SnU7`(vskx6!Vf(F6Lw`7=F1;|4w^7bNhY=u^1$6d@(2T$J1a3#NsnAlTg7oJg Le;7&q4U+!{&B^6S diff --git a/damus/tr-TR.lproj/Localizable.stringsdict b/damus/tr-TR.lproj/Localizable.stringsdict index 8a8198bb..8f4ad99a 100644 --- a/damus/tr-TR.lproj/Localizable.stringsdict +++ b/damus/tr-TR.lproj/Localizable.stringsdict @@ -4,6 +4,8 @@ collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey @@ -11,15 +13,15 @@ NSStringFormatValueTypeKey d one - %d diğer not + ... %d diğer not ... other - %d diğer notlar + ... %d diğer notlar ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey @@ -29,10 +31,8 @@ one Takipçi other - Takipçiler + Takipçi - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -47,7 +47,7 @@ one Tepki other - Tepkiler + Tepki relays_count @@ -63,13 +63,13 @@ one Röle other - Röleler + Röle replying_to_one_and_others NSStringLocalizedFormatKey - %@%#@OTHERS@'lara yanıt + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -77,17 +77,15 @@ NSStringFormatValueTypeKey d one - & %d diğer + %2$@ & %1$d diğer'lara yanıt other - & %d diğerleri - zero - + %2$@ & %1$d ve diğerlerine yanıt replying_to_two_and_others NSStringLocalizedFormatKey - %@, %@%#@OTHERS@'a yanıt + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey @@ -95,11 +93,9 @@ NSStringFormatValueTypeKey d one - & %d diğer + %2$@, %3$@ & %1$d diğer'a yanıt other - & %d diğerleri - zero - + %2$@, %3$@ & %1$d ve diğerlerine yanıt reposts_count @@ -115,7 +111,7 @@ one Yineleme other - Yinelemeler + Yineleme sats_count @@ -131,7 +127,7 @@ one %2$@ sat other - %2$@ sat + %2$@ sats zaps_count diff --git a/damus/zh-CN.lproj/InfoPlist.strings b/damus/zh-CN.lproj/InfoPlist.strings index 8ccb59cf75563ad0ce18db3c6c570535d3d7d1cd..77008a38eef04945e86daa7549cba9c28a7f0316 100644 GIT binary patch literal 602 zcmezWPoF`HL4m=Ep_CzyA%!7_Ar;6=VaQ}CW+(vi5*aFi{5&9?3zpGh&}ZOcP-1Xq za6{4Kf}+C@s$L1G*A|GC820sNrYJF31NCCFkFfcKO$=Zt0=l6LXmc{y&ALE)-M~DM zk31P%fMh7pSBVViV4t`E$zq^dkgfuT5+Iom^rr$aG$20oV+e-p2kA!W#jX?KSBB}0 zojU0T;Y+#?c0cvo-~Ddt!OEpmkbRHMtpN-fKo^t%u>yk+&^1Xwmn8x*DEu9PF#?Jc zm@A9P@C(9xRMR156Yo36z#ZM7*aZ1&MM6v2kFuUXpfCOJ`bR|n3v(}GGJyCL0G`fx AKL7v# literal 368 zcmdPbQgABGOUX%9NXaZN$VseJ$V<#kRnXGsQgU{K$hbfx{D9(03bqPLFZS(wHgTnr zH5ZpYTr-9y?5YEbGRqQ^D;0DV+!B*h6+B%OLW>jAQx#lNi<65o3raHc^T1a71%u>0 zUBI$Pl3@E^&S`kDtnt~LHBaYkc(HEDi}j69b}xOgZvV^a>z*%fd^u?;)M*II0y6ST z@)dkClZq0HDis`4QZhj{72~uVtRAWys2Zy)p0+l=ShoWb77)vyHLZ9)tL6FZ9Z%bO dfG&EnZ~v41bDyrA@pSgS=bi138=64w0swRinwJ0o diff --git a/damus/zh-CN.lproj/Localizable.strings b/damus/zh-CN.lproj/Localizable.strings index 6fef0c49f3de06ee5563a412798f66b0926b35ff..e62687a6bfdafe0be128b22a41d839afa6be5618 100644 GIT binary patch literal 55408 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 fo&6Aq?r)XrHv@@tQ^R|78~zZ<4+E)x1LXe) collapsed_event_view_other_notes + NSStringLocalizedFormatKey + %#@NOTES@ NOTES NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - %d other notes - many - %d other notes - one - %d 条更多推文 other - %d 条更多推文 - two - %d other notes - zero - %d other notes + ... %d 条更多推 ... - NSStringLocalizedFormatKey - ··· %#@NOTES@ ··· followers_count + NSStringLocalizedFormatKey + %#@FOLLOWERS@ FOLLOWERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - Followers - many - Followers - one - 粉丝 other 粉丝 - two - Followers - zero - Followers - NSStringLocalizedFormatKey - %#@FOLLOWERS@ reactions_count @@ -60,18 +40,8 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d - few - Reactions - many - Reactions - one - 回应 other 回应 - two - Reactions - zero - Reactions relays_count @@ -84,66 +54,36 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d - few - Relays - many - Relays - one - 中继器 other 中继器 - two - Relays - zero - Relays replying_to_one_and_others NSStringLocalizedFormatKey - 正在回复%@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others - one - & %d 个其他用户 other - & %d 个其他用户 - two - & %d others - zero - + 正在回复%2$@ & %1$d 个其他用户 replying_to_two_and_others NSStringLocalizedFormatKey - 正在回复%@, %@%#@OTHERS@ + %#@OTHERS@ OTHERS NSStringFormatSpecTypeKey NSStringPluralRuleType NSStringFormatValueTypeKey d - few - & %d others - many - & %d others - one - & %d 个其他用户 other - & %d 个其他用户 - two - & %d others - zero - + 正在回复%2$@, %3$@ & %1$d 个其他用户 reposts_count @@ -156,18 +96,8 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d - few - Reposts - many - Reposts - one - 转发 other 转发 - two - Reposts - zero - Reposts sats_count @@ -180,18 +110,8 @@ NSStringPluralRuleType NSStringFormatValueTypeKey @ - few - %2$@ sats - many - %2$@ sats - one - %2$@ 聪 other %2$@ 聪 - two - %2$@ sats - zero - %2$@ sats zaps_count @@ -204,18 +124,8 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d - few - Zaps - many - Zaps - one - 电击 other 电击 - two - Zaps - zero - Zaps diff --git a/damus/zh-HK.lproj/InfoPlist.strings b/damus/zh-HK.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..79907ec35b063cf30c4a5ff0c92ed1f35ee7faa7 GIT binary patch literal 602 zcmezWPoF`HL4m=Ep_CzyA%!7_Ar;6=VaQ}CW+(vi5*aFi{5&9?3zpGh&}ZOcP-1Xq za6{4Kf}+C@s$L1G*A|GC7(ymwrYJF31NCCFkFfcKO$=Zt0=l6LXmc{y&ALE)-M~DM zk31P%fMh7pSBVViV4t`E$zq^dkgfuT5+Iom^rr$aG$20oV+e-p2kA!W#jX?KSBB}0 zojU0T;k{j+-B10ry8J^ARu)V__B}SY1~6m*T~GqV3Jg9#*CYX5mI%b4@OK2p2q;cq zt}G_QF9`EdO^29Gyzd+X4ZA?G3G!Ehe@oeqvaZ0Ve*69J`bR{Ig}WCq89;mr0GtbP AivR!s literal 0 HcmV?d00001 diff --git a/damus/zh-HK.lproj/Localizable.strings b/damus/zh-HK.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..34a72f67d8f057cf2ad8c9133c42286ed58e1d2f GIT binary patch literal 55250 zcmdU&dyJn~ncsi03b|T=KbjV_D<;|9WT5zxtQM`p#5hAtNW_-D7Ze#b_+!NvmO zHLWA9{WjAM8v*Ec+nkKG&maVrfSI{QtGmKxpZyMOWA=WJ{RR4i)%_hd-bCxDUEOVO z02|}(w7)wltav}AK|1e#8)bKErh;Xx!g|PHU~IkR^y1nM8=Y~+ZM>i^Ba9i{pc)*| zz1`JMV;!&s&)xRUt_m`r11Nwdpgv^yrQ;p6d3gdDN)GY+Jryj%PjEtKI6h*3_8Hfq zjpz!jldU_d-@)L3-Q8WiFA3Ri(7_w%FlqPp8ZDvAd+qlz`)!9kJz+m1S3I$!l0cyN zu-#`Cpar8t_WP*)4&>uDD))9&atF^2+f}I9(>hj-55_yIXGiS1RVrP~GClCK zhko;+_YL2Ap!M7vXAjJ7f9jPZ*Q|WwZ2y-3d*;iJ-ZK0jH!mGpvhv)qgM+7@J-2!4 z_;)7nZ-0Gk$;vAwkEt9%VYq;%A&(=5&ry?EQ3B}yE=$=O!)Ua%%&^&K|LV6UJkipe zDyfYMDZbxmB(1)?k`SnaMj;c(Eb=1zaJ2dzd0X9DZ}L@_ik}=?Iq;KXUl{ntmLK-* zd-$dcKj=Gr>fycv~Ah*6B~Xy`0}x{Cl@CTBgR?u3XMpu z)No~m+_uUVAkWy2sp^frh5pM_`ydg*GXdG2Tp6qw&(W5@&5?;SKLTyBv^Pxa?&^T#QEu+sFa zPxF}nQt9m@m9+NjzdSl0GdWT;xWn`U?}EOEL`n<(HfcjAh%bdlAE~I2az|IhmpqPN zUS$GMsn_Ik*mP&K@I-Dr3$ekMHhz(-Z^?w$VK_7_im?NsicyHkw16*gi16jOeH z%oEci{dsLMFxQjHtMli3T5Zc&`YkW(%p2JoB#QhcxP+hISLK?_P5ls>Pujmx!%DNl zfM>bLs1DX4pS$gM@=3TT z`4i0!SCKP326FKu^>08oZg)~oox-`*qQ`!lH~jkY%Ay^tVlcc3&_at|yOKWlej7Ev zg3aDvSx$I%w8ayG>|kXbWn=EOxjdGWe+n(Qn$Vn>Ir-Ss@vFs|l>VLhRB}etd$-ZC z&eNP~{^a+c{n12@(>miH(GT`XwP|sUDhImfGR9M0xg#DpQr%T{MkO?!bf4kl)vF)* zSkyRJ#Q=t#nU<{j#hii7_n&=btTP4g;I8lXoMRGwKa!pC8kMIWL{L5~N(vMck&qC$VF zHmu3;yCRlY`IBwWrMtw)XHRA4y94*{$Z6axIir<~0EKF!k_6-z+36H9Mh&lN)SNnC zz%1^oLLRvSHxJpLa=si#-VZ*#vG)rD-Ec#1bDIbr%PztJJc{R_HGUd6xQ2g&GthIy z{_>kwue8#d^C2q4;-XeO#dF3K?(r}NPS5@?IIC8vpZTQid9Jf?A+~Snh(68r| z#w&H^V8rnb&wx=0+8r%uy{!G%M|VBY87g56ha;}YXO={;`i2b;n^banZ^etC$cvA@ z_0SK8@|jl|W${?vp!VYoV!+m1plc{`qLV22~EjyAwR}xv#tMlfffruD>uJ%#es! zSw_pRK4v8h-7x$5_B{`ln5{CJ;*H@L7Axse%d&J*Q}q0^FEVDY-SG}eF1 zxx;h5wgwkjsY$QUwSl#8tDldH{YO9kNy5XIk9=;+ea}2L^A{W6RdB9J=kKn@CmR8e z`wVaID=Dpkq%-VnZnc_YqfVoT=KN0kn&-du_`aRDZ2It2E@uMSe~nd@txLUb%BQ;xmWW@7ReH?AH+4VYZM9N*he;FGUzr{n zA;}1sVnwwRMDpG4<*6CK6`w(M3h(W}H-Q^oo}VPusf&Kx;AbY}NxnOCniUSX@~4LWQPV2#6a^%yMS zkKI$PGgwt=6VyaYXb^D2E$ErAJM+8NSa)SHUFW9)<8IHSv0k&@rK{gPttQBa44eH% zWm)%2%~MKfyUiFlYK8pCXWuw`^VYAP&NcMPafmovx#XsVdl6gQZTxI{BH-@)M9P`e z;tyB)fYu;u(w;J6cI($YQZ3)gEoHoWPc>I$eu|Q(ZT4K!UAkjjG!of%c(nHH(FwS# z!!PJj@6bzeFTI^0_H19Y$bDa4o5-!MEKxv96rNjChfk}IsrLd-T`j#A+Tb-V`6Be% z{dH#=rI2=lVq;}jrxI%h9KF-;8_p$u&|ttDdEG5I)?|$o1Nzz*6=PN8nxTM7!LRe% z>KtpX0TKh|bn$syit!nE1awCI9im^(p}D0=*_6{N%?kx>onBYcLQGdUrS_quYyF9! zFFMk6KerC5GY|*TqeI0WS`%k9@tay$^g-qJBy=;L324Sgayh$lbR&KovkuIhR(>@g zy1R-)c`}D=;Wi5|P6kQM1?h9!<#CAHFjaaZuXU^ASv3)N^E=7|iL-oFGS3r{|5({9 zG0&k33jDW+{>5mHdulOr?h00Q3sRXP?(@3n;%$|8G&NU4$P4D43yP`s&*~VF4*rIi z0=o#!)N!VIp<9UXQ45{hvmEELW>KwT@uLEH)5v~p@gs+=%&QzOmE?Ne>PgO{dyJmJ z4}63oPNzdDxdCzhW-c{~-c?J&-}~LgjfNgjiBiX{W1i|m3QK6htAkJP%{Adl*(c^F zmSD$2S@kXN1$^~8sTI#9*yDteia$`pIW%H(Lm7EF@9WN~15bG;=6=iM=-He$gZ4}s ztEc|?^2|>Ezr&hC@;ApH+>%3+<{q+A3#q6<8^PQuGj@LfJckmx?0bCAM_+DthJ}%V z1ghsgLDnjb+TXl3WVj9IZB+t0dl9TB z)nn`u(LpXH8X@Mc&+Jt56|;yVc^7&p3kiAAm@ccX|8uWX$Y<6)fa($6Ywh+qGAvOM zI;=8ELu=ntlCN%n8(DsRg=4-r*6BWJv+hnRQDE&);i2|hEQZ&fG7hA66q?PQP5DT{ z=W;%OqCQs>eWGTTbG%;BS}aAJ+Z(MbdY#e6BZ?C4?sV!7drwQF*KzRcsZAX+F621} zz9qGKog^2%UT1HYRT^NQG0e1<2>rRMl@@Ncb#=dI8A-86IzsBPicLr5WDm=*$R)gn<1sMMQcoTooA24;&r|gbsg4! z+8S*28J)0RZX?-s!iq{{0rQ34N6Tdc4B}2o@$P=XV^OUWK!axL4H)Far}11q|Mefg z^TB^O`}aO`<*3+1JEBzL{%#h3=pxN?ct0`r-to(;OU`X5;8xAAxsG`^5dI#@D}R~4 z_u6RQS!)~p=D~)m&aial4$Y%(F|lF)XLIb*Y_F`3$wOeXB8E}T-Loynqf?DV@r(Bu ziXYw!h<4y@^QswkpnRU%63<2L2JK*#B<5Xi@|o7@KRUd$ZF}bisV|+Fsn=|pr9Wt2 zuAk)6AJ2vKu!A$F?R@4yPKhca`!xwt2hhB8LUXC^wyXRmv&w33+CKB2BUE)*$+ zRCHP=sUuU|?4f#jdeRIqNaL{{g?*)CCfC@8l*LHDA3IN7{j$XpO3dz88msP61f#?YLffF{$KTf zc=L%FtwT%?oZDPx6?5gH?rX3E%%LbHIvm+sNL|W(%fi;z?@8Vcn1B4l=eGRG$8xFj zo=B&OTL|?xu`;D9y03L1|Ne}6f>gT|Z>i$(1U-EEDP)r>uiJPkm2?e3S?mN7opLSK z@&bBR<8s(9g~qFGW;`L0E7^TuHCHc#V!<5R7|VN5(O0rS?Lj|U$?aOZLWC*HuMCEj zPVC81lkLDYpu6tEbz83=|F6IM|JpZQI6L|Bkvks#KRdtoxw1!~$#T)r;~8U9GziTj zLWO5U&r~^_zs@^FlxXly8xw2K%74?C>8fT)q4eFfJ|0+q?}bm!-u9Wd6#a7Zsa*KJ zHmowW0q88sM%L=JZfKjrqTOofe%fOLb&!2Ld%C6ojBlL%=ID1mwf_0*F6@82J11Pr zp{h3cye0+9hY@?{F7PQ;k_z7sG9)`3g!uow4 z539E!{QiXT28$6h%!j{$ZD-$?@>jGTOEl^|17$^QZmO2lk{)#S{z#V3+}ZmBN!|M| zHm;LZ)xU5eC?(69LmS>cg%t}dYvlEm(8=@Ln&Dko1rMm|-oLaE^(O+3Z;$-XXL9S` z%s(hWe-8C8#Xf1ifkoE-nTV}&DAM<1_MdMbo6cviWxi11nIgYUQavF>ND$X z8mzYa<$&SKJMTP}!@x7t%k$kASUj(Sxc$+26|vTfUzd+Ymvx>6UO4rGYs@Odo_uII zY=3y3Ik6{YJ#e*M;Xbj9y3V6lE%bfuN36{hM!I-qF<}ICJKz| zjPal_MOjm?&YrE@{i6x2nkcn_UY#;J%`GhZDZ4jBaW^LxiZ z)4H=`w;q&99JCXeyb^J$|JGdD!}Q~ zkDcD~w&5J^wRWGnzt6z`k^lSEkSl(Ylqkl>Bl~&>v!Us%Zqwg}J@6>dV*@N0Rc@Zl z&y#Tvyyh48*H@BC$8gxOpPjz#GdTuLlt;F)V==$HudJ+hucWkEbMcLs=|{&`6h6ai zNXj_oq7s%d_$iu+8t9$dR)^Fnja`MJMAF@Q>}7fR7pt!oBd?P%mb_O}P0TUvJbq4t ze>eDrfww$f&(SZx+%W5F7)g>J11Pk^1Iv)fPTq85msR((UFJ@vd zBxmvk)mMDxi?i>%plfNxI*pNWiP$jM$0}|RXMdhK2a`oVE+TP zc-Kw*3A(z`@D*>dzv;fPRTkr*gRw6x=ci^0T&YZce%A;0a`cBM+%>Y;7 z(4I_J(z)n&))O)7YY%+C*bg{lR8s$~{L}_pc~k~VER@=6;hab0ZpkGF$QV1bode2` z^D0&o#aFW1?CPFWg~YcYcmo?#qEauO&$9QyhhN zCwz1_@HxM&F1aa91u1WZodnXlRdQ~7j>J29j^~93Rz+E-XjO+B{N&HQ2I%8<$EaK@ z0jp(gznWUy(2%)tn;)%xR|g&@=T|3~;iG(CaAIUn?jA=qu;LMGt| zGzZev)g4uL7hccxkpuqq8@_saZLt%m$p(_;V`r3+OO{yoO5tIj4yz1AxABDU+kq>c zAohK5^42N+KWrlrEBh1o+wW=2J$3Na!SY@zH_bUYQR$@FNFV}>@#^+XEJMOgk z;D&4f9#>~kBIif!H|nxjgt@8!mp-G%%i1lS(}>k&@CexRIOg^78xOPoUXNrJLm%Q1 z&r_}@mC|`T;h#QJMsrYsD5r@EP!C@2t)flrzFP&P9u5cZk%mrZija9I8lft%$wr*A z-$z@wCQ;?XeaAQ7(q1=xO%d}p=^Ystv&(}7f1?_mTRWm)aG}P6y^0D;RI0%xr5~#| z%n?@M%V)n`oG;xSHjf=v+bF*FG+$lsR*w(teFmaj)#`?fve-u7nG1~+3;SL=w+nTv z;uv?fD^S4ScbhY}UGb_>Q>AikC0#)2@mgM~blxgjP;`&w@f=#$>C#n|0-u1idxs8j z7^AxcIK|u(yN9oP?_3rbF_i^&jOIB(f8~{k3XrupQv-{bu8iXa6xF)-%Ka=FM$Qtu zBI|uzoN9f@o;zqK)vT~T`5enH>gJt@V=EP3B?RA@u zAJz#e%9^EH{uFY)v(hhOXL);NTK+_yy?ecI-7nr-YdpeZAbY`!|Gw=Lqy1afO%Fep zb0U``!J^m)UqigDcq5ni=vnd=0nLfmRWFFww9%cki>rR35RkhJ5qqc65&PP|K6c}= zGCI1HjH-LoaH(A~-AC`W&RTr-q{+pg;Y#-gzBBEL={CZ37fwBUX0q(Y=%h_`pDW9x z)4?QF%vSb;uQJIQHOL~<$96`KbgKW0c|W9*z3nSEeQ47y!!dd;pIFDVZs8i0cX~t= z71b1A&R3;~j+@|>efR$Nxv-PH_NQ}P>OJqPDqkT=mit)KDvkSG;KKuyRwDFV_ha50 zKABT&F5RGtp!##f9!*q9R{_ai;1JJ|E9W$d>j72zbPnIWHa{}&Cw&oR__-%ot$Ke1 zRz-C+^oE#L8bnrcw1P+$hFnL!*(H}qD!x1us~bU0_UbGCpyx|AmN=zcEtF-P&*(ve z)^ksseDCH~jPrgBMMRe4B7!%lV0wUAw-ISnq?IPS@TN4cQK4@f)FP#(jh*P2`3uj1+4 z#-`r^;oY1cO;rXY$zzDT${_l}%XHr&XVl~r9;jp-*chu*1P?4JPS^pjG^QQK8bOqa zh)}DYIkxKOE3F4~6cvy--YaR~nSi{IRv(oEq(5VQMQf~Jv&5v@x!&fHPbkl*f+9Nm zab!Wz+3*iK(3zFKD$tvBgpCrHi-T?=gdsa$TGJbRvzJW$DVJtI-wD&5T|n-;lvUL9~B zo@ZtAn=7zLpT}F}*yI+JkvpM@yx_sQL)}prUG5#WTqC5@0(Ll^0Xl)qD@vl)(3r=_tekJ~m&Q0Dg9S%nT|y_z7-#K}Ew zQ^+X@Jf5T7aIoU*Zqd5B;{eV|e| zBV1yJrV;Wrcxcf4oa9YAq?k1_LFI{XT5yuxj@jvW`VO0HLRgU!TD`4vAm>_3m@TBkAaIjlsh(@Hs+_9o;Un>3E)J#@Do z=s*7Z#je4*qD_xJm=!3~{W{FhdDV_L=;u)1NvTgIWI3j392Ish^uL>qqalifwRhjE z4ZuqFr#M+Qs9E>9rwY6D)GIcsrArr~EvsC7-Lu3^6%wytx_-PqGM;nE%7^p3#sS)vLFf9Z3TU z@tS|Zj_1M3DZ~Gq5rB+voi{wHqQmcS1C59ZQr;jhyr&)keHHYc>NkD0&U34dFJ)Q zxr7fIec-$(!2eOx@T(#3SbH)EVpLIG)JB%IrqW|IN;HKyoXjm^b84WT-NL`aiKTh- zVDF|Ju6~1RVO@hjD~;jbyejC?uVg{dB+o;?pNR(EBJgawkL>{nnNFihMq`G}% z0V01#+k8K+sG@u(c6Z6sDsu3;Jap}>fk8E7bHu*x;k_q*Qb1_4-$`q}d6eXqG__~g z67-AssLa0{!;+@m*HHLoERv*bM9)H9YPaaS@ORs!>R&F+3x7Z4{HIU<)#q**{?|M2 zdhWzbecdIEf#)Ofo_)&J=oE2Zr%ZPtkn5#5l=lL@BWLzJn9KWM#aXPEYVTMdy2?E> z^oT8oH!LO+3J0-CWf!CF#5v4Jwd#*pN}{_I>V6x6`hHLKwMC5=kbkfJ)zeL9bmuZA zJ<}ZWaMb6@nh&_d4#*OQw0~yB*!PN4gPJ=+x~*)x&2*38&@BeC@Hcb69kc@r>dH;E z*ofU-Kchwgozj&G*If9RYh_MDWQP-)@PlyKce*HoQgpD&bWt{oCj!>ro>RK`ERDa9Ol*N3zkerfJBesSxrwUWt%2S?8Q`_WCC-}ZYsX3d(W{#NOlkDk*| zPXzTIn^{|Q0}dJN@_*9b($+}oRePh>t)G-XrTMaZPw3?p7c7p$7#$(_J(uR_31MVt z#h8jSA}=HZZ^Dc0&-+aBQ5Cn|QN=82=9sTSPR$a-KGpZ*Cv<9Q(-|1+46ahL({6IF zc&Jhm^#gb=-E$g%U2i2V#0awV$VOVDkajEnmv6>%V)5T?6!3neONUAH(VCPvbm`DV zq}P9u>**eDD4omnVzEf+>A6x)tIl+8;>zWqY%@I<4_(uEz}ZCOp4RPleZZtdaTd}N z8V}vC{rGDSJXL)6oNmC&yMv8*8yJuzec6vwJ?PG*UxxUk?3VEAgJLYVtXLS2i1PRt z{8!muEIXcyf3ZIhdnw67TIoDDE0aaDu2c;ZS3T0T7lG4#DD4`4m~Ny@hB+1 z$OTcJ*9OFIBpf!#%vT=(yWD=3DsySTBj{MsNSZ2IFnDB(W zmG=V1Y~g{r(WNsl{hKT)PZzqD>M>s)rzq-EB!eDJ7!H$$jX#~nE}i;V8L_$grEvr5 z>$dLQUG~^t{*%o$tM_Hc>~9}FG4t6+*3QE(AB*tM3b^dA-`H zf>%#ZYIiP(dQjHAI26WWhip-A3BAypb5S|1O+)AMs}T#Y9uQNZlWte=A6`*Np{YL? zw0rG=KP$eIHy>*OMHG3cS_5^shBqiHJ?_=y>tqq+0f`FW3;lDVusk(Y5LNtSCwXVC z6P&;?he#uGT~MV_=O2&!b30LRzBMB-d!!oQyFh>&=>YGLCs{tOWADMN+(*nBAW`!#ZlxWQJj`Xx{=~d(( zUh|I(Bw}Xq*H3uUo6ugXGKvSuOn45ycr+li8$_y)#A#jNF|wH8&6w2tJKLfXga z_{bPKz}vBA?$$*s$nG1ZRf-{G&yg%iTY7T5KcCl9#BF4f`H;P#3SRAqR92jJWS`&0 z>Xu}1$;z1xueRAmckR}n*x3yq>+7AKnx)&nedf)5tOzVw`KzaX^;Eeom)F+dyRs>V z5E^slifATVqFOqf(7FZ|)hQI#1g?2q&iO}7QR-AVddM7K>wM#Ad5W4MKUsyci#LVe zbzG98XlB^-n>A`Ie)#_Z!x0;l#wzui!MYl4;BBlOB2(B%c_O!#VP_=|0gc-nS;9N* zZGX0;kYLN7&-anC+Zl-KJ1DO#)ORIN*R`$_+^X4h!r;!sbL(yVINeW? zX*cfHqlSQd+9G6Xr;NwnD^j1Y6#H!I z!X)ByDGY1ID$;Tr8L8s#GUFjOl%Gedm7-=yxf{@)-&TiraXGTX+%2AtX99xy{8#d{ zM^*7-cMsH}KLQ<4Y};$PxZZwCb)7W~-t?6NG#vSkRR}$uXOw9U3TGHokzg8i13}Zt zlJwn?duqk!YMe2d%S%d?;MTd>yC-t#?&Jft6H0ri{WSW>Fv}`u^z8boPrA;c>Ngtf zyQa$yv(mO|_JEsSyd3T;)y*(qdP$bRx~i}6$F+bcy_WWDtub4Xo>JgmmNhhF&{vD| zGxXE0XS~Yd&g@4ouz*;S-HDah|9DP2EW|=#NjWr_%~Su5Ku~E}`@Q4k?776bJqLE` za>|wWSCSGjSMY+l;ZMxLu8$nQdn!$jSOQ$>YlHS_hA(fSnc|;;;ihk=?hW7 zQ2#7AdyGJ4x_zm~!`Xplv< z8a_uflAyu`NYinMnD65TbugQPY0D1x)ktmv@m{dCTdbUM4}1gw8; zAzw|&u@mNsWpm!4N3kv0*lU+3*C5xb$7ZfML$&brHs?Gn-Fjfw zpGb9VzPv&%=6f2HTMcj*CCPd&M}HyQ_xgYEcj@?F5A1p%*S`7UHNTz%vL@m+d;~I= zf3eS@lK%*}&=6qDA#3&rO}343sck9}$g>fzjx21gK(VT%*5eD8E3E=a#`9TI-AnHT zrpsn0i*Ewuk&SDQXLWfd>bT7P&ZNmv8k5ZTO~-MfqGg;$sC*dCHpf>EZ(#b?ftQLd z?oLpvdnwJh$=I9wJISxGFP>XbvB%Psy`E`hK;J&XdWUsl6wXH_Ze}z|YuKO5;UzUk zP-Nfp?=QYY*_|TJi`5m5-OtzbbK%@u&&6+H?=vjKW|cFgQMOanpSj;4PgfS8KzT2< zu|viWzEd?nUg2ZhCwrtIf0_E>+>j78#bPnG_sNz~bZC;GJ71cwnifU(izRojf(MqT10uueDbXcwRBa&B#7H>cyM zppCMSlq2YgzR>5M$K{s)buy~?TGJMyWbx+d~^2PS2+dTE-LApX-*giE&kI31R ze|eHqmq+(djkuEXph&lTYG{>4aJeH}tnW(zPHJvc z@Z<}@JB`U_%9=+lr_a9;Ui=-!;%H<$jU~3 z!3Ebqw?{4|PVu~^r!Q=~d_{+v-bRkRW=pRc8V~ohe%{?i#h#^H)76=tS}LExPZf}# z7l$O-F%~vL{b!>l1M=qexFCfaee-S*_f|;KJ$4nkMK((uvA?osIrsf+Cup_AEC+UD zcKFFHnikUD7r?@QYnxesrura#QNm&#aOFttVy#mL?f{lp2}6o zF*HEFnD^DnVDJ)tjgtB*mQkv#)xOpLui zvNqc8FWHM94_-gsJN@Jq;+yT^O?Jz+j;zr_Qt-K+hwmsb0w|Y{&`t+Y%ILNrqh!Q z#l6Nglw1!j!UO+@;)`?l8C~T+$SFJ*QS1T5Jtvn1P<=_U2pos6iU`!DI#R);lSovh z0!nBuS<*f>R)>he4^~`dKYhfqj2P8X;Aol|Imz+GD(29IwW6ahpupy-=gj?Azyq|3 z3}uxfN(%^^Vx+W3Iy_z4L4+52;v`?F`u?-8i~-S!na}U~A2ax*-c7H!Z*22bx@B!@ z8N1K)PJ5qz*=^L6mzLFEum~B6c#ew0&WamgqfCvgh3I_R{zrdus^)v=8MkeGga08_ zZ+vXuDI{y|{23jN&L~Dhew8cpQw}$Gpf&VV6|s(|BHOeYdFeRjV{WyTd#6!)0`vK8 zFKo~6L5Ist1KC~KKBtgs_}(Svxe8R`Ih{^X@-4>+y}eXA`CK7gIW>Hh#@BJ^*leQM zl9l|)={9J%ge^i!>MN#L39kw|EKZ?PPQ3o;mPIQZ-6UOaqia#!9baYc zo+*%7U_GS={2xATb!&~Sg08Vn`!&^l?3>oiuyX3aE49aSL20(^W=M-HaClrQA5buA zGNPaIy}CCax~QSvYfrqWedXj(ir{jn1DiaGk!|w&L&+`GAbJdMWl~2gE8#o_X85Rx z!cTb0dFfQmp%Fa->(qwvjmh+BJBhjWmGt2Eu;I(MoN``kd~rP1D%^jSy!NbG*;_OG z;laFigFnVQVyF2NR=9W5=pO%4Cf3;RrxpAr-$BJLkIk_To~@*CZ7iOQxnCW8dhaju z`*I}?E-QGpxz?{stn{u^FSTBdrQb^_yYLten7uEJxOBp(?zI{0fb$tClZ@nXM`$6j z5K%K0Q#u~8NwACQ}Eon{_TJ~VqG{Gl*BT8;CnxPEu`}kTYhhgUrTvb z_VxL z5>QfiJHPFvr~9^kp!kMYcUV1g1720r*q@@TARwhSsVFX;J+~_kVLjqoILvAF#%p{V zE04jx1MiY##x%lEeK??&W%t!|atCrv&h_-Q+jO4P)4J#Pv0_d|++{~u30uyWrNzm@ z^;wY=axh|4{C}?d`AQ)cMyoN3Zvvaaf*wr~S3Z;5ShouK$mAc>MlYgLY6GILKfAi( z0~GRXE0u=_G8ls%Yp32@oK!o%RbH0@RwJSl%WZ8sbNWQgTkj0JQmd-z{7y6KAjp?G zfIC6k{B++AzOC!$Fr~5|Jk7r#x_G?~i%IP~ zzDgQUedYLHAIl-)$%!f|=Uj2+Ud=Y$B_HjiR)bbRnW2j@H77q)U5t8zGQT^jn%K0} z(5PB;8pZuj3J?B5cFEsj#g)@O(E`=?=r4fs)LvC1QHDW8PBf6lmpk_S#WPR!tsJ;> znkWBgzuVk}>$r=G~36Q^-gCI#<^#qixZ1rfQaZsnQ1^YqHK*+w`kVDHex~0{+cJ zUz=ZUZ^9L=E+QLy6D^(p8)^I#vLT<4uM#1v;z^$C;wePMrZeGP!l4Ix6B#Y5;m8Bk zJg%o0Z?@|PD@p6SNFP5HKg|qTQ{o)>T=SbUsm__UNAPYV$grY5N6)_3x2TIwTMfro zc63hH)%c=8P@~^qfL2JbuQK(UB%~{W_Z!4%?-*3N=>n^~RKIgtZLV;_eu2Lf8nT3C7 zMfY#NyCmngKL66s+vp^lIs>n5wpz0#jxRzZZLPg@)FqO@5Y?O#G+j49h~oBagh}93A@d8m&ZKY$1dg+ z!=3i@(Z4m{j + + + + collapsed_event_view_other_notes + + NSStringLocalizedFormatKey + %#@NOTES@ + NOTES + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + ...還有%d 条便條... + + + followers_count + + NSStringLocalizedFormatKey + %#@FOLLOWERS@ + FOLLOWERS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 粉絲 + + + reactions_count + + NSStringLocalizedFormatKey + %#@REACTIONS@ + REACTIONS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 回應 + + + relays_count + + NSStringLocalizedFormatKey + %#@RELAYS@ + RELAYS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 中繼器 + + + replying_to_one_and_others + + NSStringLocalizedFormatKey + %#@OTHERS@ + OTHERS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 正在回覆%2$@ & %1$d 個其他用戶 + + + replying_to_two_and_others + + NSStringLocalizedFormatKey + %#@OTHERS@ + OTHERS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 正在回覆%2$@, %3$@ & %1$d 個其他用戶 + + + reposts_count + + NSStringLocalizedFormatKey + %#@REPOSTS@ + REPOSTS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 轉發 + + + sats_count + + NSStringLocalizedFormatKey + %1$#@SATS@ + SATS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + @ + other + %2$@ 聰 + + + zaps_count + + NSStringLocalizedFormatKey + %#@ZAPS@ + ZAPS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 電擊 + + + + diff --git a/damus/zh-TW.lproj/InfoPlist.strings b/damus/zh-TW.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..79907ec35b063cf30c4a5ff0c92ed1f35ee7faa7 GIT binary patch literal 602 zcmezWPoF`HL4m=Ep_CzyA%!7_Ar;6=VaQ}CW+(vi5*aFi{5&9?3zpGh&}ZOcP-1Xq za6{4Kf}+C@s$L1G*A|GC7(ymwrYJF31NCCFkFfcKO$=Zt0=l6LXmc{y&ALE)-M~DM zk31P%fMh7pSBVViV4t`E$zq^dkgfuT5+Iom^rr$aG$20oV+e-p2kA!W#jX?KSBB}0 zojU0T;k{j+-B10ry8J^ARu)V__B}SY1~6m*T~GqV3Jg9#*CYX5mI%b4@OK2p2q;cq zt}G_QF9`EdO^29Gyzd+X4ZA?G3G!Ehe@oeqvaZ0Ve*69J`bR{Ig}WCq89;mr0GtbP AivR!s literal 0 HcmV?d00001 diff --git a/damus/zh-TW.lproj/Localizable.strings b/damus/zh-TW.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..8e304b45392fc391d22c2dd3341f12091e06137c GIT binary patch literal 55250 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 WNb8qjWnR4P#y89FyQkNL+5ZRrS|9`f literal 0 HcmV?d00001 diff --git a/damus/zh-TW.lproj/Localizable.stringsdict b/damus/zh-TW.lproj/Localizable.stringsdict new file mode 100644 index 00000000..6339886b --- /dev/null +++ b/damus/zh-TW.lproj/Localizable.stringsdict @@ -0,0 +1,132 @@ + + + + + collapsed_event_view_other_notes + + NSStringLocalizedFormatKey + %#@NOTES@ + NOTES + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + ...還有%d 条便條... + + + followers_count + + NSStringLocalizedFormatKey + %#@FOLLOWERS@ + FOLLOWERS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 粉絲 + + + reactions_count + + NSStringLocalizedFormatKey + %#@REACTIONS@ + REACTIONS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 回應 + + + relays_count + + NSStringLocalizedFormatKey + %#@RELAYS@ + RELAYS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 中繼器 + + + replying_to_one_and_others + + NSStringLocalizedFormatKey + %#@OTHERS@ + OTHERS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 正在回覆%2$@ & %1$d 個其他用戶 + + + replying_to_two_and_others + + NSStringLocalizedFormatKey + %#@OTHERS@ + OTHERS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 正在回覆%2$@, %3$@ & %1$d 個其他用戶 + + + reposts_count + + NSStringLocalizedFormatKey + %#@REPOSTS@ + REPOSTS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 轉發 + + + sats_count + + NSStringLocalizedFormatKey + %1$#@SATS@ + SATS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + @ + other + %2$@ 聰 + + + zaps_count + + NSStringLocalizedFormatKey + %#@ZAPS@ + ZAPS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 電擊 + + + + diff --git a/damusTests/EventDetailBarTests.swift b/damusTests/EventDetailBarTests.swift new file mode 100644 index 00000000..0b9a08a0 --- /dev/null +++ b/damusTests/EventDetailBarTests.swift @@ -0,0 +1,56 @@ +// +// EventDetailBarTests.swift +// damusTests +// +// Created by Terry Yiu on 2/24/23. +// + +import XCTest +@testable import damus + +final class EventDetailBarTests: XCTestCase { + + let enUsLocale = Locale(identifier: "en-US") + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testRepostsCountString() throws { + XCTAssertEqual(repostsCountString(0, locale: enUsLocale), "Reposts") + XCTAssertEqual(repostsCountString(1, locale: enUsLocale), "Repost") + XCTAssertEqual(repostsCountString(2, locale: enUsLocale), "Reposts") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + for count in 1...10 { + XCTAssertNoThrow(repostsCountString(count, locale: $0)) + } + } + } + + func testReactionsCountString() throws { + XCTAssertEqual(reactionsCountString(0, locale: enUsLocale), "Reactions") + XCTAssertEqual(reactionsCountString(1, locale: enUsLocale), "Reaction") + XCTAssertEqual(reactionsCountString(2, locale: enUsLocale), "Reactions") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + for count in 1...10 { + XCTAssertNoThrow(reactionsCountString(count, locale: $0)) + } + } + } + + func testZapssCountString() throws { + XCTAssertEqual(zapsCountString(0, locale: enUsLocale), "Zaps") + XCTAssertEqual(zapsCountString(1, locale: enUsLocale), "Zap") + XCTAssertEqual(zapsCountString(2, locale: enUsLocale), "Zaps") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + for count in 1...10 { + XCTAssertNoThrow(zapsCountString(count, locale: $0)) + } + } + } + +} diff --git a/damusTests/FormatTests.swift b/damusTests/FormatTests.swift index 148878f6..35fa79e6 100644 --- a/damusTests/FormatTests.swift +++ b/damusTests/FormatTests.swift @@ -34,4 +34,23 @@ final class FormatTests: XCTestCase { XCTAssertEqual(format_msats_abbrev(1000), "1") } + func testFormatMsats() throws { + let enUsLocale = Locale(identifier: "en-US") + XCTAssertEqual(format_msats(0, locale: enUsLocale), "0 sats") + XCTAssertEqual(format_msats(1, locale: enUsLocale), "0.001 sats") + XCTAssertEqual(format_msats(1000, locale: enUsLocale), "1 sat") + XCTAssertEqual(format_msats(1001, locale: enUsLocale), "1.001 sats") + XCTAssertEqual(format_msats(2000, locale: enUsLocale), "2 sats") + XCTAssertEqual(format_msats(123456789, locale: enUsLocale), "123,456.789 sats") + // Sanity check that function call does not throw in any supported locale as the string format accepts arguments, and a mismatched format in any one of the locales could break the app. + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + XCTAssertNoThrow(format_msats(0, locale: $0)) + XCTAssertNoThrow(format_msats(1, locale: $0)) + XCTAssertNoThrow(format_msats(1000, locale: $0)) + XCTAssertNoThrow(format_msats(1001, locale: $0)) + XCTAssertNoThrow(format_msats(2000, locale: $0)) + XCTAssertNoThrow(format_msats(123456789, locale: $0)) + } + } + } diff --git a/damusTests/ProfileViewTests.swift b/damusTests/ProfileViewTests.swift new file mode 100644 index 00000000..637d8041 --- /dev/null +++ b/damusTests/ProfileViewTests.swift @@ -0,0 +1,45 @@ +// +// ProfileViewTests.swift +// damusTests +// +// Created by Terry Yiu on 2/24/23. +// + +import XCTest +@testable import damus + +final class ProfileViewTests: XCTestCase { + + let enUsLocale = Locale(identifier: "en-US") + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testFollowersCountString() throws { + XCTAssertEqual(followersCountString(0, locale: enUsLocale), "Followers") + XCTAssertEqual(followersCountString(1, locale: enUsLocale), "Follower") + XCTAssertEqual(followersCountString(2, locale: enUsLocale), "Followers") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + for count in 1...10 { + XCTAssertNoThrow(followersCountString(count, locale: $0)) + } + } + } + + func testRelaysCountString() throws { + XCTAssertEqual(relaysCountString(0, locale: enUsLocale), "Relays") + XCTAssertEqual(relaysCountString(1, locale: enUsLocale), "Relay") + XCTAssertEqual(relaysCountString(2, locale: enUsLocale), "Relays") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + for count in 1...10 { + XCTAssertNoThrow(relaysCountString(count, locale: $0)) + } + } + } + +} diff --git a/damusTests/ReplyDescriptionTests.swift b/damusTests/ReplyDescriptionTests.swift new file mode 100644 index 00000000..4dbf226d --- /dev/null +++ b/damusTests/ReplyDescriptionTests.swift @@ -0,0 +1,87 @@ +// +// ReplyDescriptionTests.swift +// damusTests +// +// Created by Terry Yiu on 2/21/23. +// + +import XCTest +@testable import damus + +final class ReplyDescriptionTests: XCTestCase { + + let enUsLocale = Locale(identifier: "en-US") + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + // Test that English strings work properly with argument substitution and pluralization, and that other locales don't crash. + func testReplyDesc() throws { + let profiles = test_damus_state().profiles + + let replyingToSelfEvent = test_event + XCTAssertEqual(reply_desc(profiles: profiles, event: replyingToSelfEvent, locale: enUsLocale), "Replying to self") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + XCTAssertNoThrow(reply_desc(profiles: profiles, event: replyingToSelfEvent, locale: $0)) + } + + let replyingToOne = NostrEvent( + content: "hello there https://jb55.com/s/Oct12-150217.png https://jb55.com/red-me.jpg cool", + pubkey: "pk", + tags: [["e", "123"], ["p", "123"]], + createdAt: Int64(Date().timeIntervalSince1970 - 100) + ) + XCTAssertEqual(reply_desc(profiles: profiles, event: replyingToOne, locale: enUsLocale), "Replying to \(Profile.displayName(profile: nil, pubkey: "123"))") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + XCTAssertNoThrow(reply_desc(profiles: profiles, event: replyingToOne, locale: $0)) + } + + let replyingToTwo = NostrEvent( + content: "hello there https://jb55.com/s/Oct12-150217.png https://jb55.com/red-me.jpg cool", + pubkey: "pk", + tags: [["e", "123"], ["p", "123"], ["p", "456"]], + createdAt: Int64(Date().timeIntervalSince1970 - 100) + ) + XCTAssertEqual(reply_desc(profiles: profiles, event: replyingToTwo, locale: enUsLocale), "Replying to \(Profile.displayName(profile: nil, pubkey: "456")) & \(Profile.displayName(profile: nil, pubkey: "123"))") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + XCTAssertNoThrow(reply_desc(profiles: profiles, event: replyingToTwo, locale: $0)) + } + + let replyingToTwoAndOneOther = NostrEvent( + content: "hello there https://jb55.com/s/Oct12-150217.png https://jb55.com/red-me.jpg cool", + pubkey: "pk", + tags: [["e", "123"], ["p", "123"], ["p", "456"], ["p", "789"]], + createdAt: Int64(Date().timeIntervalSince1970 - 100) + ) + XCTAssertEqual(reply_desc(profiles: profiles, event: replyingToTwoAndOneOther, locale: enUsLocale), "Replying to \(Profile.displayName(profile: nil, pubkey: "789")), \(Profile.displayName(profile: nil, pubkey: "456")) & 1 other") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + XCTAssertNoThrow(reply_desc(profiles: profiles, event: replyingToTwoAndOneOther, locale: $0)) + } + + for othersCount in 2...10 { + var tags: [[String]] = [["e", "123"]] + for i in 1...othersCount { + tags.append(["p", "\(i)"]) + } + tags.append(["p", "456"]) + tags.append(["p", "789"]) + + let replyingToTwoAndMultipleOthers = NostrEvent( + content: "hello there https://jb55.com/s/Oct12-150217.png https://jb55.com/red-me.jpg cool", + pubkey: "pk", + tags: tags, + createdAt: Int64(Date().timeIntervalSince1970 - 100) + ) + XCTAssertEqual(reply_desc(profiles: profiles, event: replyingToTwoAndMultipleOthers, locale: enUsLocale), "Replying to \(Profile.displayName(profile: nil, pubkey: "789")), \(Profile.displayName(profile: nil, pubkey: "456")) & \(othersCount) others") + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + XCTAssertNoThrow(reply_desc(profiles: profiles, event: replyingToTwoAndMultipleOthers, locale: $0)) + } + } + } + +} diff --git a/damusTests/TimeAgoTests.swift b/damusTests/TimeAgoTests.swift index 0b1af3a3..f11c92a8 100644 --- a/damusTests/TimeAgoTests.swift +++ b/damusTests/TimeAgoTests.swift @@ -11,7 +11,7 @@ import XCTest final class TimeAgoTests: XCTestCase { func testTimeAgoSince() { - let locale = Locale(identifier: "en_US") + let locale = Locale(identifier: "en-US") let calendar = locale.calendar XCTAssertEqual(time_ago_since(Date.now, calendar), "now") From 4c3a83772ea247a3f61055c6dd681e7f5e9fbcfe Mon Sep 17 00:00:00 2001 From: Joel Klabo Date: Thu, 23 Feb 2023 16:38:35 -0800 Subject: [PATCH 04/65] Update Alignment of Side Menu Labels Changelog-Fixed: Fix alignment of side menu labels Closes: #688 --- damus/Views/SideMenuView.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/damus/Views/SideMenuView.swift b/damus/Views/SideMenuView.swift index f1fea5d4..add412d6 100644 --- a/damus/Views/SideMenuView.swift +++ b/damus/Views/SideMenuView.swift @@ -108,6 +108,7 @@ struct SideMenuView: View { navLabel(title: NSLocalizedString("Settings", comment: "Sidebar menu label for accessing the app settings"), systemImage: "gear") } } + .labelStyle(SideMenuLabelStyle()) .padding([.top, .bottom], verticalSpacing) } } @@ -175,6 +176,17 @@ struct SideMenuView: View { .foregroundColor(textColor()) .frame(maxWidth: .infinity, alignment: .leading) } + + struct SideMenuLabelStyle: LabelStyle { + func makeBody(configuration: Configuration) -> some View { + HStack(alignment: .center, spacing: 8) { + configuration.icon + .frame(width: 24, height: 24) + .aspectRatio(contentMode: .fit) + configuration.title + } + } + } } struct Previews_SideMenuView_Previews: PreviewProvider { From 83c9289345a413b38621699b9763e6e148c3ead2 Mon Sep 17 00:00:00 2001 From: OlegAba Date: Wed, 22 Feb 2023 18:37:05 -0500 Subject: [PATCH 05/65] Lazy loading of thread child events Closes: #679 --- damus/Views/ThreadV2View.swift | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/damus/Views/ThreadV2View.swift b/damus/Views/ThreadV2View.swift index 94038f3c..7d72b00b 100644 --- a/damus/Views/ThreadV2View.swift +++ b/damus/Views/ThreadV2View.swift @@ -289,15 +289,17 @@ struct ThreadV2View: View { ).id("main") // MARK: - Responses of the actual event view - ForEach(thread.childEvents, id: \.id) { event in - MutedEventView( - damus_state: damus, - event: event, - scroller: reader, - nav_target: $nav_target, - navigating: $navigating, - selected: false - ) + LazyVStack { + ForEach(thread.childEvents, id: \.id) { event in + MutedEventView( + damus_state: damus, + event: event, + scroller: nil, + nav_target: $nav_target, + navigating: $navigating, + selected: false + ) + } } }.padding() }.navigationBarTitle(NSLocalizedString("Thread", comment: "Navigation bar title for note thread.")) From a2749eaaaa0d6cda28841090a4880e4b27557032 Mon Sep 17 00:00:00 2001 From: OlegAba Date: Tue, 21 Feb 2023 21:54:10 -0500 Subject: [PATCH 06/65] Fix event dividers --- damus/Views/DirectMessagesView.swift | 3 +++ damus/Views/EventView.swift | 3 --- damus/Views/ThreadV2View.swift | 7 +++++++ damus/Views/Timeline/InnerTimelineView.swift | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/damus/Views/DirectMessagesView.swift b/damus/Views/DirectMessagesView.swift index 675eb51b..d12232d6 100644 --- a/damus/Views/DirectMessagesView.swift +++ b/damus/Views/DirectMessagesView.swift @@ -41,6 +41,9 @@ struct DirectMessagesView: View { ForEach(dms, id: \.0) { tup in MaybeEvent(tup) .padding(.top, 10) + + Divider() + .padding([.top], 10) } } } diff --git a/damus/Views/EventView.swift b/damus/Views/EventView.swift index 689fe71f..28b86486 100644 --- a/damus/Views/EventView.swift +++ b/damus/Views/EventView.swift @@ -86,9 +86,6 @@ struct EventView: View { TextEvent(damus: damus, event: event, pubkey: pubkey, has_action_bar: has_action_bar, booster_pubkey: nil) .padding([.top], 6) } - - Divider() - .padding([.top], 4) } } } diff --git a/damus/Views/ThreadV2View.swift b/damus/Views/ThreadV2View.swift index 7d72b00b..f35a4adf 100644 --- a/damus/Views/ThreadV2View.swift +++ b/damus/Views/ThreadV2View.swift @@ -265,6 +265,10 @@ struct ThreadV2View: View { navigating: $navigating, selected: false ) + + Divider() + .padding(.top, 4) + .padding(.leading, 25 * 2) } }.background(GeometryReader { geometry in // get the height and width of the EventView view @@ -299,6 +303,9 @@ struct ThreadV2View: View { navigating: $navigating, selected: false ) + + Divider() + .padding([.top], 4) } } }.padding() diff --git a/damus/Views/Timeline/InnerTimelineView.swift b/damus/Views/Timeline/InnerTimelineView.swift index 3fbf466b..1744a8ca 100644 --- a/damus/Views/Timeline/InnerTimelineView.swift +++ b/damus/Views/Timeline/InnerTimelineView.swift @@ -42,6 +42,9 @@ struct InnerTimelineView: View { navigating = true } .padding(.top, 10) + + Divider() + .padding([.top], 10) } } } From 75fb0d19e25d7cedaf88cf890a5422753ec262b9 Mon Sep 17 00:00:00 2001 From: OlegAba Date: Tue, 21 Feb 2023 22:00:31 -0500 Subject: [PATCH 07/65] Fix ImageCarousel corner radius and context menu --- damus/Components/ImageCarousel.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/damus/Components/ImageCarousel.swift b/damus/Components/ImageCarousel.swift index 19540663..09089c31 100644 --- a/damus/Components/ImageCarousel.swift +++ b/damus/Components/ImageCarousel.swift @@ -205,6 +205,7 @@ struct ImageCarousel: View { view.framePreloadCount = 3 } .aspectRatio(contentMode: .fit) + .cornerRadius(10) .tabItem { Text(url.absoluteString) } @@ -217,11 +218,11 @@ struct ImageCarousel: View { } } } - .cornerRadius(10) .fullScreenCover(isPresented: $open_sheet) { ImageView(urls: urls) } .frame(height: 200) + .clipped() .onTapGesture { open_sheet = true } From 810b3e1fa5fa88a46dafb85acee0d27f79c33e56 Mon Sep 17 00:00:00 2001 From: OlegAba Date: Tue, 21 Feb 2023 22:11:07 -0500 Subject: [PATCH 08/65] Fix mention rounded border Closes: #670 --- damus/Views/Events/BuilderEventView.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/damus/Views/Events/BuilderEventView.swift b/damus/Views/Events/BuilderEventView.swift index 26c243b7..9cb0666f 100644 --- a/damus/Views/Events/BuilderEventView.swift +++ b/damus/Views/Events/BuilderEventView.swift @@ -71,8 +71,10 @@ struct BuilderEventView: View { } } .frame(minWidth: 0, maxWidth: .infinity) - .cornerRadius(8) - .border(Color.gray.opacity(0.2), width: 1) + .overlay( + RoundedRectangle(cornerRadius: 10) + .stroke(Color.gray.opacity(0.2), lineWidth: 1.0) + ) .onAppear { self.load() } From 436d20dfbde7f90c6052db2f078d7b65d9ea3cc9 Mon Sep 17 00:00:00 2001 From: Swift Date: Fri, 24 Feb 2023 13:28:47 -0500 Subject: [PATCH 09/65] Rich tagging Changelog-Changed: No more inline npubs when tagging users Closes: #691 --- damus.xcodeproj/project.pbxproj | 4 +++ damus/Models/DraftsModel.swift | 4 +-- damus/Views/PostView.swift | 31 ++++++++++++-------- damus/Views/Posting/UserSearch.swift | 25 ++++++++++++++-- damus/Views/TextViewWrapper.swift | 44 ++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 damus/Views/TextViewWrapper.swift diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index f14f11c8..a5013736 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -219,6 +219,7 @@ 7C95CAEE299DCEF1009DCB67 /* KFOptionSetter+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C95CAED299DCEF1009DCB67 /* KFOptionSetter+.swift */; }; 7CFF6317299FEFE5005D382A /* SelectableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CFF6316299FEFE5005D382A /* SelectableText.swift */; }; 9609F058296E220800069BF3 /* BannerImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9609F057296E220800069BF3 /* BannerImageView.swift */; }; + 9C83F89329A937B900136C08 /* TextViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C83F89229A937B900136C08 /* TextViewWrapper.swift */; }; BA693074295D649800ADDB87 /* UserSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA693073295D649800ADDB87 /* UserSettingsStore.swift */; }; BAB68BED29543FA3007BA466 /* SelectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */; }; DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */; }; @@ -548,6 +549,7 @@ 7C95CAED299DCEF1009DCB67 /* KFOptionSetter+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KFOptionSetter+.swift"; sourceTree = ""; }; 7CFF6316299FEFE5005D382A /* SelectableText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectableText.swift; sourceTree = ""; }; 9609F057296E220800069BF3 /* BannerImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BannerImageView.swift; sourceTree = ""; }; + 9C83F89229A937B900136C08 /* TextViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewWrapper.swift; sourceTree = ""; }; BA693073295D649800ADDB87 /* UserSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSettingsStore.swift; sourceTree = ""; }; BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectWalletView.swift; sourceTree = ""; }; DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownTests.swift; sourceTree = ""; }; @@ -741,6 +743,7 @@ 4C363A8D28236FE4006E126D /* NoteContentView.swift */, 4C75EFAC28049CFB0006080F /* PostButton.swift */, 4C75EFA327FA577B0006080F /* PostView.swift */, + 9C83F89229A937B900136C08 /* TextViewWrapper.swift */, 4CEE2AF8280B2EAC00AB5EEF /* PowView.swift */, 4CEE2AF6280B2DEA00AB5EEF /* ProfileName.swift */, 4C285C892838B985008A31F1 /* ProfilePictureSelector.swift */, @@ -1301,6 +1304,7 @@ E9E4ED0B295867B900DD7078 /* ThreadV2View.swift in Sources */, 4C3BEFDC281DCE6100B3DE84 /* Liked.swift in Sources */, 4CF0ABE7298444FD00D66079 /* MutedEventView.swift in Sources */, + 9C83F89329A937B900136C08 /* TextViewWrapper.swift in Sources */, 4CF0ABE12981A83900D66079 /* MutelistView.swift in Sources */, 4CB883A82975FC1800DC99E7 /* Zaps.swift in Sources */, 4C75EFB128049D510006080F /* NostrResponse.swift in Sources */, diff --git a/damus/Models/DraftsModel.swift b/damus/Models/DraftsModel.swift index b9912835..8e36ed1c 100644 --- a/damus/Models/DraftsModel.swift +++ b/damus/Models/DraftsModel.swift @@ -8,6 +8,6 @@ import Foundation class Drafts: ObservableObject { - @Published var post: String = "" - @Published var replies: [NostrEvent: String] = [:] + @Published var post: NSMutableAttributedString = NSMutableAttributedString(string: "") + @Published var replies: [NostrEvent: NSMutableAttributedString] = [:] } diff --git a/damus/Views/PostView.swift b/damus/Views/PostView.swift index 3ca4d14a..dfa2356e 100644 --- a/damus/Views/PostView.swift +++ b/damus/Views/PostView.swift @@ -15,7 +15,7 @@ enum NostrPostResult { let POST_PLACEHOLDER = NSLocalizedString("Type your post here...", comment: "Text box prompt to ask user to type their post.") struct PostView: View { - @State var post: String = "" + @State var post: NSMutableAttributedString = NSMutableAttributedString() @FocusState var focus: Bool @State var showPrivateKeyWarning: Bool = false @@ -44,7 +44,14 @@ struct PostView: View { if replying_to?.known_kind == .chat { kind = .chat } - let content = self.post.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + + post.enumerateAttributes(in: NSRange(location: 0, length: post.length), options: []) { attributes, range, stop in + if let link = attributes[.link] as? String { + post.replaceCharacters(in: range, with: link) + } + } + + let content = self.post.string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) let new_post = NostrPost(content: content, references: references, kind: kind) NotificationCenter.default.post(name: .post, object: NostrPostResult.post(new_post)) @@ -52,14 +59,14 @@ struct PostView: View { if let replying_to { damus_state.drafts.replies.removeValue(forKey: replying_to) } else { - damus_state.drafts.post = "" + damus_state.drafts.post = NSMutableAttributedString(string: "") } dismiss() } var is_post_empty: Bool { - return post.allSatisfy { $0.isWhitespace } + return post.string.allSatisfy { $0.isWhitespace } } var body: some View { @@ -74,7 +81,7 @@ struct PostView: View { if !is_post_empty { Button(NSLocalizedString("Post", comment: "Button to post a note.")) { - showPrivateKeyWarning = contentContainsPrivateKey(self.post) + showPrivateKeyWarning = contentContainsPrivateKey(self.post.string) if !showPrivateKeyWarning { self.send_post() @@ -97,7 +104,7 @@ struct PostView: View { VStack(alignment: .leading) { ZStack(alignment: .topLeading) { - TextEditor(text: $post) + TextViewWrapper(attributedText: $post) .focused($focus) .textInputAutocapitalization(.sentences) .onChange(of: post) { _ in @@ -108,7 +115,7 @@ struct PostView: View { } } - if post.isEmpty { + if post.string.isEmpty { Text(POST_PLACEHOLDER) .padding(.top, 8) .padding(.leading, 4) @@ -120,7 +127,7 @@ struct PostView: View { } // This if-block observes @ for tagging - if let searching = get_searching_string(post) { + if let searching = get_searching_string(post.string) { VStack { Spacer() UserSearch(damus_state: damus_state, search: searching, post: $post) @@ -130,7 +137,7 @@ struct PostView: View { .onAppear() { if let replying_to { if damus_state.drafts.replies[replying_to] == nil { - damus_state.drafts.replies[replying_to] = "" + damus_state.drafts.post = NSMutableAttributedString(string: "") } if let p = damus_state.drafts.replies[replying_to] { post = p @@ -144,10 +151,10 @@ struct PostView: View { } } .onDisappear { - if let replying_to, let reply = damus_state.drafts.replies[replying_to], reply.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + if let replying_to, let reply = damus_state.drafts.replies[replying_to], reply.string.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { damus_state.drafts.replies.removeValue(forKey: replying_to) - } else if replying_to == nil && damus_state.drafts.post.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { - damus_state.drafts.post = "" + } else if replying_to == nil && damus_state.drafts.post.string.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + damus_state.drafts.post = NSMutableAttributedString(string : "") } } .padding() diff --git a/damus/Views/Posting/UserSearch.swift b/damus/Views/Posting/UserSearch.swift index a0ac99f4..c8b21468 100644 --- a/damus/Views/Posting/UserSearch.swift +++ b/damus/Views/Posting/UserSearch.swift @@ -20,7 +20,8 @@ struct SearchedUser: Identifiable { struct UserSearch: View { let damus_state: DamusState let search: String - @Binding var post: String + + @Binding var post: NSMutableAttributedString var users: [SearchedUser] { guard let contacts = damus_state.contacts.event else { @@ -39,7 +40,25 @@ struct UserSearch: View { guard let pk = bech32_pubkey(user.pubkey) else { return } - post = post.replacingOccurrences(of: "@"+search, with: "@"+pk+" ") + + while post.string.last != "@" { + post.deleteCharacters(in: NSRange(location: post.length - 1, length: 1)) + } + post.deleteCharacters(in: NSRange(location: post.length - 1, length: 1)) + + + var tagString = "" + if let name = user.profile?.name { + tagString = "@\(name)\u{200B} " + } + let tagAttributedString = NSMutableAttributedString(string: tagString, + attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18.0), + NSAttributedString.Key.link: "@\(pk)"]) + tagAttributedString.removeAttribute(.link, range: NSRange(location: tagAttributedString.length - 2, length: 2)) + let mutableString = NSMutableAttributedString() + mutableString.append(post) + mutableString.append(tagAttributedString) + post = mutableString } } } @@ -49,7 +68,7 @@ struct UserSearch: View { struct UserSearch_Previews: PreviewProvider { static let search: String = "jb55" - @State static var post: String = "some @jb55" + @State static var post: NSMutableAttributedString = NSMutableAttributedString(string: "some @jb55") static var previews: some View { UserSearch(damus_state: test_damus_state(), search: search, post: $post) diff --git a/damus/Views/TextViewWrapper.swift b/damus/Views/TextViewWrapper.swift new file mode 100644 index 00000000..f8cde9fc --- /dev/null +++ b/damus/Views/TextViewWrapper.swift @@ -0,0 +1,44 @@ +// +// TextViewWrapper.swift +// damus +// +// Created by Swift on 2/24/23. +// + +import SwiftUI + +struct TextViewWrapper: UIViewRepresentable { + @Binding var attributedText: NSMutableAttributedString + + func makeUIView(context: Context) -> UITextView { + let textView = UITextView() + textView.delegate = context.coordinator + textView.font = UIFont.systemFont(ofSize: 18) + textView.textColor = UIColor.black + let linkAttributes: [NSAttributedString.Key : Any] = [ + NSAttributedString.Key.foregroundColor: UIColor(Color.accentColor)] + textView.linkTextAttributes = linkAttributes + return textView + } + + func updateUIView(_ uiView: UITextView, context: Context) { + uiView.attributedText = attributedText + } + + func makeCoordinator() -> Coordinator { + Coordinator(attributedText: $attributedText) + } + + class Coordinator: NSObject, UITextViewDelegate { + @Binding var attributedText: NSMutableAttributedString + + init(attributedText: Binding) { + _attributedText = attributedText + } + + func textViewDidChange(_ textView: UITextView) { + attributedText = NSMutableAttributedString(attributedString: textView.attributedText) + } + } +} + From e4dd585754fa2d64bcde83c014c1468dfb05e361 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Fri, 24 Feb 2023 15:10:58 -0800 Subject: [PATCH 10/65] Fix text color in dark mode on post view --- damus/Views/TextViewWrapper.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/damus/Views/TextViewWrapper.swift b/damus/Views/TextViewWrapper.swift index f8cde9fc..e29c8b50 100644 --- a/damus/Views/TextViewWrapper.swift +++ b/damus/Views/TextViewWrapper.swift @@ -9,12 +9,12 @@ import SwiftUI struct TextViewWrapper: UIViewRepresentable { @Binding var attributedText: NSMutableAttributedString - + func makeUIView(context: Context) -> UITextView { let textView = UITextView() textView.delegate = context.coordinator textView.font = UIFont.systemFont(ofSize: 18) - textView.textColor = UIColor.black + //textView.textColor = UIColor.black let linkAttributes: [NSAttributedString.Key : Any] = [ NSAttributedString.Key.foregroundColor: UIColor(Color.accentColor)] textView.linkTextAttributes = linkAttributes From 64b1a57918d0aeed621185103c69414827d3f637 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Tue, 21 Feb 2023 12:27:03 -0800 Subject: [PATCH 11/65] Notifications Changelog-Added: Add new Notifications View --- damus.xcodeproj/project.pbxproj | 52 +++- damus/Components/UserView.swift | 6 +- damus/ContentView.swift | 5 +- damus/Models/DamusState.swift | 4 +- damus/Models/EventsModel.swift | 2 +- damus/Models/HomeModel.swift | 30 +- damus/Models/Notifications/EventGroup.swift | 32 ++ damus/Models/Notifications/ZapGroup.swift | 53 ++++ damus/Models/NotificationsModel.swift | 294 ++++++++++++++++++ damus/Models/SearchHomeModel.swift | 36 ++- damus/Models/ThreadModel.swift | 2 +- damus/Models/ZapsModel.swift | 6 +- damus/Nostr/NostrEvent.swift | 4 + damus/Util/EventCache.swift | 27 ++ damus/Util/EventHolder.swift | 2 +- damus/Util/InsertSort.swift | 18 +- damus/Util/Zaps.swift | 2 +- damus/Views/DMChatView.swift | 4 +- damus/Views/EventView.swift | 4 +- damus/Views/Events/EventBody.swift | 10 +- damus/Views/Events/EventProfile.swift | 5 +- damus/Views/Events/TextEvent.swift | 5 +- .../Views/Notifications/EventGroupView.swift | 189 +++++++++++ .../Notifications/NotificationItemView.swift | 86 +++++ .../Notifications/NotificationsView.swift | 43 +++ .../Notifications/ProfilePicturesView.swift | 37 +++ damus/Views/ProfileView.swift | 21 +- 27 files changed, 918 insertions(+), 61 deletions(-) create mode 100644 damus/Models/Notifications/EventGroup.swift create mode 100644 damus/Models/Notifications/ZapGroup.swift create mode 100644 damus/Models/NotificationsModel.swift create mode 100644 damus/Util/EventCache.swift create mode 100644 damus/Views/Notifications/EventGroupView.swift create mode 100644 damus/Views/Notifications/NotificationItemView.swift create mode 100644 damus/Views/Notifications/NotificationsView.swift create mode 100644 damus/Views/Notifications/ProfilePicturesView.swift diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index a5013736..fdf1096e 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -47,6 +47,11 @@ 4C285C8C28398BC7008A31F1 /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C8B28398BC6008A31F1 /* Keys.swift */; }; 4C285C8E28399BFE008A31F1 /* SaveKeysView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C8D28399BFD008A31F1 /* SaveKeysView.swift */; }; 4C2CDDF7299D4A5E00879FD5 /* Debouncer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2CDDF6299D4A5E00879FD5 /* Debouncer.swift */; }; + 4C30AC7229A5677A00E2BD5A /* NotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7129A5677A00E2BD5A /* NotificationsView.swift */; }; + 4C30AC7429A5680900E2BD5A /* EventGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7329A5680900E2BD5A /* EventGroupView.swift */; }; + 4C30AC7629A5770900E2BD5A /* NotificationItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7529A5770900E2BD5A /* NotificationItemView.swift */; }; + 4C30AC7829A577AB00E2BD5A /* EventCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7729A577AB00E2BD5A /* EventCache.swift */; }; + 4C30AC8029A6A53F00E2BD5A /* ProfilePicturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7F29A6A53F00E2BD5A /* ProfilePicturesView.swift */; }; 4C363A8428233689006E126D /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8328233689006E126D /* Parser.swift */; }; 4C363A8828236948006E126D /* BlocksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8728236948006E126D /* BlocksView.swift */; }; 4C363A8A28236B57006E126D /* MentionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8928236B57006E126D /* MentionView.swift */; }; @@ -97,6 +102,9 @@ 4C3EA67F28FFC01D00C48A62 /* InvoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA67E28FFC01D00C48A62 /* InvoiceView.swift */; }; 4C42812C298C848200DBF26F /* TranslateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C42812B298C848200DBF26F /* TranslateView.swift */; }; 4C477C9E282C3A4800033AA3 /* TipCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C477C9D282C3A4800033AA3 /* TipCounter.swift */; }; + 4C54AA0729A540BA003E4487 /* NotificationsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C54AA0629A540BA003E4487 /* NotificationsModel.swift */; }; + 4C54AA0A29A55429003E4487 /* EventGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C54AA0929A55429003E4487 /* EventGroup.swift */; }; + 4C54AA0C29A5543C003E4487 /* ZapGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C54AA0B29A5543C003E4487 /* ZapGroup.swift */; }; 4C5C7E68284ED36500A22DF5 /* SearchHomeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5C7E67284ED36500A22DF5 /* SearchHomeModel.swift */; }; 4C5C7E6A284EDE2E00A22DF5 /* SearchResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5C7E69284EDE2E00A22DF5 /* SearchResultsView.swift */; }; 4C5F9114283D694D0052CD1C /* FollowTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5F9113283D694D0052CD1C /* FollowTarget.swift */; }; @@ -345,6 +353,11 @@ 4C285C8B28398BC6008A31F1 /* Keys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Keys.swift; sourceTree = ""; }; 4C285C8D28399BFD008A31F1 /* SaveKeysView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveKeysView.swift; sourceTree = ""; }; 4C2CDDF6299D4A5E00879FD5 /* Debouncer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debouncer.swift; sourceTree = ""; }; + 4C30AC7129A5677A00E2BD5A /* NotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsView.swift; sourceTree = ""; }; + 4C30AC7329A5680900E2BD5A /* EventGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventGroupView.swift; sourceTree = ""; }; + 4C30AC7529A5770900E2BD5A /* NotificationItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationItemView.swift; sourceTree = ""; }; + 4C30AC7729A577AB00E2BD5A /* EventCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventCache.swift; sourceTree = ""; }; + 4C30AC7F29A6A53F00E2BD5A /* ProfilePicturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfilePicturesView.swift; sourceTree = ""; }; 4C363A8328233689006E126D /* Parser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Parser.swift; sourceTree = ""; }; 4C363A8728236948006E126D /* BlocksView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlocksView.swift; sourceTree = ""; }; 4C363A8928236B57006E126D /* MentionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentionView.swift; sourceTree = ""; }; @@ -425,6 +438,9 @@ 4C42812B298C848200DBF26F /* TranslateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranslateView.swift; sourceTree = ""; }; 4C477C9D282C3A4800033AA3 /* TipCounter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipCounter.swift; sourceTree = ""; }; 4C4A3A5A288A1B2200453788 /* damus.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = damus.entitlements; sourceTree = ""; }; + 4C54AA0629A540BA003E4487 /* NotificationsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsModel.swift; sourceTree = ""; }; + 4C54AA0929A55429003E4487 /* EventGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventGroup.swift; sourceTree = ""; }; + 4C54AA0B29A5543C003E4487 /* ZapGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZapGroup.swift; sourceTree = ""; }; 4C5C7E67284ED36500A22DF5 /* SearchHomeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHomeModel.swift; sourceTree = ""; }; 4C5C7E69284EDE2E00A22DF5 /* SearchResultsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultsView.swift; sourceTree = ""; }; 4C5F9113283D694D0052CD1C /* FollowTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowTarget.swift; sourceTree = ""; }; @@ -665,6 +681,7 @@ 4C0A3F8D280F63FF000448DE /* Models */ = { isa = PBXGroup; children = ( + 4C54AA0829A55416003E4487 /* Notifications */, 3AA247FC297E3CFF0090C62D /* RepostsModel.swift */, 4C0A3F8E280F640A000448DE /* ThreadModel.swift */, 4C0A3F92280F66F5000448DE /* ReplyMap.swift */, @@ -704,13 +721,35 @@ 3AAA95CB298E07E900F3D526 /* DeepLPlan.swift */, 4CE8795A2996C47A00F758CC /* ZapsModel.swift */, 3AA59D1C2999B0400061C48E /* DraftsModel.swift */, + 4C54AA0629A540BA003E4487 /* NotificationsModel.swift */, ); path = Models; sourceTree = ""; }; + 4C30AC7029A5676F00E2BD5A /* Notifications */ = { + isa = PBXGroup; + children = ( + 4C30AC7129A5677A00E2BD5A /* NotificationsView.swift */, + 4C30AC7329A5680900E2BD5A /* EventGroupView.swift */, + 4C30AC7529A5770900E2BD5A /* NotificationItemView.swift */, + 4C30AC7F29A6A53F00E2BD5A /* ProfilePicturesView.swift */, + ); + path = Notifications; + sourceTree = ""; + }; + 4C54AA0829A55416003E4487 /* Notifications */ = { + isa = PBXGroup; + children = ( + 4C54AA0929A55429003E4487 /* EventGroup.swift */, + 4C54AA0B29A5543C003E4487 /* ZapGroup.swift */, + ); + path = Notifications; + sourceTree = ""; + }; 4C75EFA227FA576C0006080F /* Views */ = { isa = PBXGroup; children = ( + 4C30AC7029A5676F00E2BD5A /* Notifications */, 4CE0E2B029A3DF4700DB4CA2 /* Timeline */, 4CE879562996C44A00F758CC /* Zaps */, 4CB9D4A52992D01900A9A7E4 /* Profile */, @@ -828,6 +867,7 @@ 7C95CAED299DCEF1009DCB67 /* KFOptionSetter+.swift */, 4CE0E2AE29A2E82100DB4CA2 /* EventHolder.swift */, 3A3040F029A8FF97008A0F29 /* LocalizationUtil.swift */, + 4C30AC7729A577AB00E2BD5A /* EventCache.swift */, ); path = Util; sourceTree = ""; @@ -1239,6 +1279,7 @@ 4C3AC79D2833036D00E1F516 /* FollowingView.swift in Sources */, 4C363A8A28236B57006E126D /* MentionView.swift in Sources */, 4CE4F8CD281352B30009DFBB /* Notifications.swift in Sources */, + 4C30AC7829A577AB00E2BD5A /* EventCache.swift in Sources */, 4C285C8428385690008A31F1 /* CreateAccountView.swift in Sources */, 4C216F34286F5ACD00040376 /* DMView.swift in Sources */, 4C3EA64428FF558100C48A62 /* sha256.c in Sources */, @@ -1251,6 +1292,7 @@ 4CE8794C2995B59E00F758CC /* RelayMetadatas.swift in Sources */, 4C363A8C28236B92006E126D /* PubkeyView.swift in Sources */, 4C5C7E68284ED36500A22DF5 /* SearchHomeModel.swift in Sources */, + 4C54AA0C29A5543C003E4487 /* ZapGroup.swift in Sources */, 4C75EFB728049D990006080F /* RelayPool.swift in Sources */, 4CF0ABEE29844B5500D66079 /* AnyEncodable.swift in Sources */, 4CB8838D296F710400DC99E7 /* Reposted.swift in Sources */, @@ -1293,6 +1335,7 @@ 4C649844285A952100EAE2B3 /* LocalUserConfig.swift in Sources */, 4C75EFB328049D640006080F /* NostrEvent.swift in Sources */, 4CA2EFA0280E37AC0044ACD8 /* TimelineView.swift in Sources */, + 4C30AC7629A5770900E2BD5A /* NotificationItemView.swift in Sources */, 4C363A8428233689006E126D /* Parser.swift in Sources */, 3AAA95CA298DF87B00F3D526 /* TranslationService.swift in Sources */, 4CE4F9E328528C5200C00DD9 /* AddRelayView.swift in Sources */, @@ -1343,11 +1386,13 @@ 4C285C8C28398BC7008A31F1 /* Keys.swift in Sources */, 4CACA9DC280C38C000D9BBE8 /* Profiles.swift in Sources */, 4CE879582996C45300F758CC /* ZapsView.swift in Sources */, + 4C30AC7429A5680900E2BD5A /* EventGroupView.swift in Sources */, 4C633352283D419F00B1C9C3 /* SignalModel.swift in Sources */, 9609F058296E220800069BF3 /* BannerImageView.swift in Sources */, 4C363A94282704FA006E126D /* Post.swift in Sources */, 4C216F32286E388800040376 /* DMChatView.swift in Sources */, 4CAAD8AD298851D000060CEA /* AccountDeletion.swift in Sources */, + 4C54AA0A29A55429003E4487 /* EventGroup.swift in Sources */, 4C3EA67928FF7ABF00C48A62 /* list.c in Sources */, 4C64987E286D082C00EAE2B3 /* DirectMessagesModel.swift in Sources */, 4CE0E2B629A3ED5500DB4CA2 /* InnerTimelineView.swift in Sources */, @@ -1373,6 +1418,7 @@ 4CF0ABD629817F5B00D66079 /* ReportView.swift in Sources */, 4CB8838629656C8B00DC99E7 /* NIP05.swift in Sources */, 4CF0ABD82981980C00D66079 /* Lists.swift in Sources */, + 4C30AC8029A6A53F00E2BD5A /* ProfilePicturesView.swift in Sources */, 4C5C7E6A284EDE2E00A22DF5 /* SearchResultsView.swift in Sources */, 7C60CAEF298471A1009C80D6 /* CoreSVG.swift in Sources */, 6439E014296790CF0020672B /* ProfileZoomView.swift in Sources */, @@ -1402,6 +1448,7 @@ 4C3AC79B28306D7B00E1F516 /* Contacts.swift in Sources */, 4C3EA63D28FF52D600C48A62 /* bolt11.c in Sources */, 7CFF6317299FEFE5005D382A /* SelectableText.swift in Sources */, + 4C54AA0729A540BA003E4487 /* NotificationsModel.swift in Sources */, 4CB55EF3295E5D59007FD187 /* RecommendedRelayView.swift in Sources */, 4CF0ABEC29844B4700D66079 /* AnyDecodable.swift in Sources */, 4C5F9118283D88E40052CD1C /* FollowingModel.swift in Sources */, @@ -1426,6 +1473,7 @@ 4C99737B28C92A9200E53835 /* ChatroomMetadata.swift in Sources */, 4CC7AAF4297F18B400430951 /* ReplyDescription.swift in Sources */, 4C75EFA427FA577B0006080F /* PostView.swift in Sources */, + 4C30AC7229A5677A00E2BD5A /* NotificationsView.swift in Sources */, 4C75EFB528049D790006080F /* Relay.swift in Sources */, 4CEE2AF1280B216B00AB5EEF /* EventDetailView.swift in Sources */, 4CC7AAFA297F64AC00430951 /* EventMenu.swift in Sources */, @@ -1691,7 +1739,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\""; DEVELOPMENT_TEAM = XK7H4JAB3D; ENABLE_PREVIEWS = YES; @@ -1733,7 +1781,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\""; DEVELOPMENT_TEAM = XK7H4JAB3D; ENABLE_PREVIEWS = YES; diff --git a/damus/Components/UserView.swift b/damus/Components/UserView.swift index 721a5f40..d51aca67 100644 --- a/damus/Components/UserView.swift +++ b/damus/Components/UserView.swift @@ -12,11 +12,7 @@ struct UserView: View { let pubkey: String var body: some View { - let pmodel = ProfileModel(pubkey: pubkey, damus: damus_state) - let followers = FollowersModel(damus_state: damus_state, target: pubkey) - let pv = ProfileView(damus_state: damus_state, profile: pmodel, followers: followers) - - NavigationLink(destination: pv) { + NavigationLink(destination: ProfileView(damus_state: damus_state, pubkey: pubkey)) { ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: damus_state.profiles) VStack(alignment: .leading) { diff --git a/damus/ContentView.swift b/damus/ContentView.swift index c255e841..6edfadd6 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -192,7 +192,7 @@ struct ContentView: View { case .notifications: VStack(spacing: 0) { Divider() - TimelineView(events: home.notifications, loading: $home.loading, damus: damus, show_friend_icon: true, filter: { _ in true }) + NotificationsView(state: damus, notifications: home.notifications) } case .dms: DirectMessagesView(damus_state: damus_state!) @@ -615,7 +615,8 @@ struct ContentView: View { settings: UserSettingsStore(), relay_filters: relay_filters, relay_metadata: metadatas, - drafts: Drafts() + drafts: Drafts(), + events: EventCache() ) home.damus_state = self.damus_state! diff --git a/damus/Models/DamusState.swift b/damus/Models/DamusState.swift index 5739f5bc..debc3010 100644 --- a/damus/Models/DamusState.swift +++ b/damus/Models/DamusState.swift @@ -24,6 +24,7 @@ struct DamusState { let relay_filters: RelayFilters let relay_metadata: RelayMetadatas let drafts: Drafts + let events: EventCache var pubkey: String { return keypair.pubkey @@ -32,9 +33,8 @@ struct DamusState { var is_privkey_user: Bool { keypair.privkey != nil } - static var empty: DamusState { - return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), tips: TipCounter(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore(), relay_filters: RelayFilters(our_pubkey: ""), relay_metadata: RelayMetadatas(), drafts: Drafts()) + return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), tips: TipCounter(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore(), relay_filters: RelayFilters(our_pubkey: ""), relay_metadata: RelayMetadatas(), drafts: Drafts(), events: EventCache()) } } diff --git a/damus/Models/EventsModel.swift b/damus/Models/EventsModel.swift index 2ef83e42..dcc24348 100644 --- a/damus/Models/EventsModel.swift +++ b/damus/Models/EventsModel.swift @@ -65,7 +65,7 @@ class EventsModel: ObservableObject { case .notice(_): break case .eose(_): - load_profiles(profiles_subid: profiles_id, relay_id: relay_id, events: events, damus_state: state) + load_profiles(profiles_subid: profiles_id, relay_id: relay_id, load: .from_events(events), damus_state: state) } } } diff --git a/damus/Models/HomeModel.swift b/damus/Models/HomeModel.swift index e9527211..3c6bc866 100644 --- a/damus/Models/HomeModel.swift +++ b/damus/Models/HomeModel.swift @@ -50,22 +50,18 @@ class HomeModel: ObservableObject { let profiles_subid = UUID().description @Published var new_events: NewEventsBits = NewEventsBits() - @Published var notifications: EventHolder + @Published var notifications = NotificationsModel() @Published var dms: DirectMessagesModel - @Published var events: EventHolder + @Published var events = EventHolder() @Published var loading: Bool = false @Published var signal: SignalModel = SignalModel() init() { - self.events = EventHolder() - self.notifications = EventHolder() self.damus_state = DamusState.empty self.dms = DirectMessagesModel(our_pubkey: "") } init(damus_state: DamusState) { - self.events = EventHolder() - self.notifications = EventHolder() self.damus_state = damus_state self.dms = DirectMessagesModel(our_pubkey: damus_state.pubkey) self.setup_debouncer() @@ -143,7 +139,7 @@ class HomeModel: ObservableObject { return } - if !notifications.insert(ev) { + if !notifications.insert_zap(zap) { return } @@ -229,7 +225,7 @@ class HomeModel: ObservableObject { guard inner_ev.is_valid else { return } - + if inner_ev.is_textlike { handle_text_event(sub_id: sub_id, ev) } @@ -255,12 +251,11 @@ class HomeModel: ObservableObject { return } - // CHECK SIGS ON THESE - switch damus_state.likes.add_event(ev, target: e.ref_id) { case .already_counted: break case .success(let n): + handle_notification(ev: ev) let liked = Counted(event: ev, id: e.ref_id, total: n) notify(.liked, liked) notify(.update_stats, e.ref_id) @@ -320,9 +315,9 @@ class HomeModel: ObservableObject { if sub_id == dms_subid { var dms = dms.dms.flatMap { $0.1.events } dms.append(contentsOf: incoming_dms) - load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, events: dms, damus_state: damus_state) + load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, load: .from_events(dms), damus_state: damus_state) } else if sub_id == notifications_subid { - load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, events: notifications.all_events, damus_state: damus_state) + load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, load: .from_keys(notifications.uniq_pubkeys()), damus_state: damus_state) } self.loading = false @@ -375,7 +370,6 @@ class HomeModel: ObservableObject { // TODO: separate likes? var home_filter = NostrFilter.filter_kinds([ NostrKind.text.rawValue, - NostrKind.chat.rawValue, NostrKind.like.rawValue, NostrKind.boost.rawValue, ]) @@ -385,7 +379,6 @@ class HomeModel: ObservableObject { var notifications_filter = NostrFilter.filter_kinds([ NostrKind.text.rawValue, - NostrKind.chat.rawValue, NostrKind.like.rawValue, NostrKind.boost.rawValue, NostrKind.zap.rawValue, @@ -461,7 +454,12 @@ class HomeModel: ObservableObject { return } - if !notifications.insert(ev) { + damus_state.events.insert(ev) + if let inner_ev = ev.inner_event { + damus_state.events.insert(inner_ev) + } + + if !notifications.insert_event(ev) { return } @@ -484,6 +482,8 @@ class HomeModel: ObservableObject { guard should_show_event(contacts: damus_state.contacts, ev: ev) else { return } + + damus_state.events.insert(ev) if sub_id == home_subid { insert_home_event(ev) diff --git a/damus/Models/Notifications/EventGroup.swift b/damus/Models/Notifications/EventGroup.swift new file mode 100644 index 00000000..5d4fe852 --- /dev/null +++ b/damus/Models/Notifications/EventGroup.swift @@ -0,0 +1,32 @@ +// +// ReactionGroup.swift +// damus +// +// Created by William Casarin on 2023-02-21. +// + +import Foundation + +class EventGroup { + var events: [NostrEvent] + + var last_event_at: Int64 { + guard let first = self.events.first else { + return 0 + } + + return first.created_at + } + + init() { + self.events = [] + } + + init(events: [NostrEvent]) { + self.events = events + } + + func insert(_ ev: NostrEvent) -> Bool { + return insert_uniq_sorted_event_created(events: &events, new_ev: ev) + } +} diff --git a/damus/Models/Notifications/ZapGroup.swift b/damus/Models/Notifications/ZapGroup.swift new file mode 100644 index 00000000..001367db --- /dev/null +++ b/damus/Models/Notifications/ZapGroup.swift @@ -0,0 +1,53 @@ +// +// ZapGroup.swift +// damus +// +// Created by William Casarin on 2023-02-21. +// + +import Foundation + +class ZapGroup { + var zaps: [Zap] + var msat_total: Int64 + var zappers: Set + + var last_event_at: Int64 { + guard let first = zaps.first else { + return 0 + } + + return first.event.created_at + } + + func zap_requests() -> [NostrEvent] { + zaps.map { z in z.request.ev } + } + + init(zaps: [Zap]) { + self.zaps = zaps + self.msat_total = 0 + self.zappers = Set() + } + + init() { + self.zaps = [] + self.msat_total = 0 + self.zappers = Set() + } + + func insert(_ zap: Zap) -> Bool { + if !insert_uniq_sorted_zap_by_created(zaps: &zaps, new_zap: zap) { + return false + } + + msat_total += zap.invoice.amount + + if !zappers.contains(zap.request.ev.pubkey) { + zappers.insert(zap.request.ev.pubkey) + } + + return true + } +} + diff --git a/damus/Models/NotificationsModel.swift b/damus/Models/NotificationsModel.swift new file mode 100644 index 00000000..bf45e1c7 --- /dev/null +++ b/damus/Models/NotificationsModel.swift @@ -0,0 +1,294 @@ +// +// NotificationsModel.swift +// damus +// +// Created by William Casarin on 2023-02-21. +// + +import Foundation + +enum NotificationItem { + case repost(String, EventGroup) + case reaction(String, EventGroup) + case profile_zap(ZapGroup) + case event_zap(String, ZapGroup) + case reply(NostrEvent) + + var id: String { + switch self { + case .repost(let evid, _): + return "repost_" + evid + case .reaction(let evid, _): + return "reaction_" + evid + case .profile_zap: + return "profile_zap" + case .event_zap(let evid, _): + return "event_zap_" + evid + case .reply(let ev): + return "reply_" + ev.id + } + } + + var last_event_at: Int64 { + switch self { + case .reaction(_, let evgrp): + return evgrp.last_event_at + case .repost(_, let evgrp): + return evgrp.last_event_at + case .profile_zap(let zapgrp): + return zapgrp.last_event_at + case .event_zap(_, let zapgrp): + return zapgrp.last_event_at + case .reply(let reply): + return reply.created_at + } + } +} + +class NotificationsModel: ObservableObject { + var incoming_zaps: [Zap] + var incoming_events: [NostrEvent] + var should_queue: Bool + + // mappings from events to + var zaps: [String: ZapGroup] + var profile_zaps: ZapGroup + var reactions: [String: EventGroup] + var reposts: [String: EventGroup] + var replies: [NostrEvent] + var has_reply: Set + + @Published var notifications: [NotificationItem] + + init() { + self.zaps = [:] + self.reactions = [:] + self.reposts = [:] + self.replies = [] + self.has_reply = Set() + self.should_queue = true + self.incoming_zaps = [] + self.incoming_events = [] + self.profile_zaps = ZapGroup() + self.notifications = [] + } + + func uniq_pubkeys() -> [String] { + var pks = Set() + + for ev in incoming_events { + pks.insert(ev.pubkey) + } + + for grp in reposts { + for ev in grp.value.events { + pks.insert(ev.pubkey) + } + } + + for ev in replies { + pks.insert(ev.pubkey) + } + + for zap in incoming_zaps { + pks.insert(zap.request.ev.pubkey) + } + + return Array(pks) + } + + func build_notifications() -> [NotificationItem] { + var notifs: [NotificationItem] = [] + + for el in zaps { + let evid = el.key + let zapgrp = el.value + + let notif: NotificationItem = .event_zap(evid, zapgrp) + notifs.append(notif) + } + + if !profile_zaps.zaps.isEmpty { + notifs.append(.profile_zap(profile_zaps)) + } + + for el in reposts { + let evid = el.key + let evgrp = el.value + + notifs.append(.repost(evid, evgrp)) + } + + for el in reactions { + let evid = el.key + let evgrp = el.value + + notifs.append(.reaction(evid, evgrp)) + } + + for reply in replies { + notifs.append(.reply(reply)) + } + + notifs.sort { $0.last_event_at > $1.last_event_at } + return notifs + } + + + private func insert_repost(_ ev: NostrEvent) -> Bool { + guard let reposted_ev = ev.inner_event else { + return false + } + + let id = reposted_ev.id + + if let evgrp = self.reposts[id] { + return evgrp.insert(ev) + } else { + let evgrp = EventGroup() + self.reposts[id] = evgrp + return evgrp.insert(ev) + } + } + + private func insert_text(_ ev: NostrEvent) -> Bool { + guard !has_reply.contains(ev.id) else { + return false + } + + has_reply.insert(ev.id) + replies.append(ev) + + return true + } + + private func insert_reaction(_ ev: NostrEvent) -> Bool { + guard let ref_id = ev.referenced_ids.last else { + return false + } + + let id = ref_id.id + + if let evgrp = self.reactions[id] { + return evgrp.insert(ev) + } else { + let evgrp = EventGroup() + self.reactions[id] = evgrp + return evgrp.insert(ev) + } + } + + private func insert_event_immediate(_ ev: NostrEvent) -> Bool { + if ev.known_kind == .boost { + return insert_repost(ev) + } else if ev.known_kind == .like { + return insert_reaction(ev) + } else if ev.known_kind == .text { + return insert_text(ev) + } + + return false + } + + private func insert_zap_immediate(_ zap: Zap) -> Bool { + switch zap.target { + case .note(let notezt): + let id = notezt.note_id + if let zapgrp = self.zaps[notezt.note_id] { + return zapgrp.insert(zap) + } else { + let zapgrp = ZapGroup() + self.zaps[id] = zapgrp + return zapgrp.insert(zap) + } + + case .profile: + return profile_zaps.insert(zap) + } + } + + func insert_event(_ ev: NostrEvent) -> Bool { + if should_queue { + return insert_uniq_sorted_event_created(events: &incoming_events, new_ev: ev) + } + + if insert_event_immediate(ev) { + self.notifications = build_notifications() + return true + } + + return false + } + + func insert_zap(_ zap: Zap) -> Bool { + if should_queue { + return insert_uniq_sorted_zap_by_created(zaps: &incoming_zaps, new_zap: zap) + } + + if insert_zap_immediate(zap) { + self.notifications = build_notifications() + return true + } + + return false + } + + func filter(_ isIncluded: (NostrEvent) -> Bool) { + var changed = false + var count = 0 + + count = incoming_events.count + incoming_events = incoming_events.filter(isIncluded) + changed = changed || incoming_events.count != count + + count = profile_zaps.zaps.count + profile_zaps.zaps = profile_zaps.zaps.filter { zap in isIncluded(zap.request.ev) } + changed = changed || profile_zaps.zaps.count != count + + for el in reactions { + count = el.value.events.count + el.value.events = el.value.events.filter(isIncluded) + changed = changed || el.value.events.count != count + } + + for el in reposts { + count = el.value.events.count + el.value.events = el.value.events.filter(isIncluded) + changed = changed || el.value.events.count != count + } + + for el in zaps { + count = el.value.zaps.count + el.value.zaps = el.value.zaps.filter { + isIncluded($0.request.ev) + } + changed = changed || el.value.zaps.count != count + } + + count = replies.count + replies = replies.filter(isIncluded) + changed = changed || replies.count != count + + if changed { + self.notifications = build_notifications() + } + } + + func flush() -> Bool { + var inserted = false + + for zap in incoming_zaps { + inserted = insert_zap_immediate(zap) || inserted + } + + for event in incoming_events { + inserted = insert_event_immediate(event) || inserted + } + + if inserted { + self.notifications = build_notifications() + } + + return inserted + } +} diff --git a/damus/Models/SearchHomeModel.swift b/damus/Models/SearchHomeModel.swift index 9f5aec3a..73fdc961 100644 --- a/damus/Models/SearchHomeModel.swift +++ b/damus/Models/SearchHomeModel.swift @@ -76,7 +76,7 @@ class SearchHomeModel: ObservableObject { // global events are not realtime unsubscribe(to: relay_id) - load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, events: events.all_events, damus_state: damus_state) + load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, load: .from_events(events.all_events), damus_state: damus_state) } @@ -98,8 +98,31 @@ func find_profiles_to_fetch_pk(profiles: Profiles, event_pubkeys: [String]) -> [ return Array(pubkeys) } + +func find_profiles_to_fetch(profiles: Profiles, load: PubkeysToLoad) -> [String] { + switch load { + case .from_events(let events): + return find_profiles_to_fetch_from_events(profiles: profiles, events: events) + case .from_keys(let pks): + return find_profiles_to_fetch_from_keys(profiles: profiles, pks: pks) + } +} + +func find_profiles_to_fetch_from_keys(profiles: Profiles, pks: [String]) -> [String] { + var pubkeys = Set() -func find_profiles_to_fetch(profiles: Profiles, events: [NostrEvent]) -> [String] { + for pk in pks { + if profiles.lookup(id: pk) != nil { + continue + } + + pubkeys.insert(pk) + } + + return Array(pubkeys) +} + +func find_profiles_to_fetch_from_events(profiles: Profiles, events: [NostrEvent]) -> [String] { var pubkeys = Set() for ev in events { @@ -113,9 +136,14 @@ func find_profiles_to_fetch(profiles: Profiles, events: [NostrEvent]) -> [String return Array(pubkeys) } -func load_profiles(profiles_subid: String, relay_id: String, events: [NostrEvent], damus_state: DamusState) { +enum PubkeysToLoad { + case from_events([NostrEvent]) + case from_keys([String]) +} + +func load_profiles(profiles_subid: String, relay_id: String, load: PubkeysToLoad, damus_state: DamusState) { var filter = NostrFilter.filter_profiles - let authors = find_profiles_to_fetch(profiles: damus_state.profiles, events: events) + let authors = find_profiles_to_fetch(profiles: damus_state.profiles, load: load) filter.authors = authors guard !authors.isEmpty else { diff --git a/damus/Models/ThreadModel.swift b/damus/Models/ThreadModel.swift index fcbbf070..4fd44682 100644 --- a/damus/Models/ThreadModel.swift +++ b/damus/Models/ThreadModel.swift @@ -207,7 +207,7 @@ class ThreadModel: ObservableObject { } if sub_id == self.base_subid { - load_profiles(profiles_subid: self.profiles_subid, relay_id: relay_id, events: events, damus_state: damus_state) + load_profiles(profiles_subid: self.profiles_subid, relay_id: relay_id, load: .from_events(events), damus_state: damus_state) } } diff --git a/damus/Models/ZapsModel.swift b/damus/Models/ZapsModel.swift index eaf0f334..c28e245c 100644 --- a/damus/Models/ZapsModel.swift +++ b/damus/Models/ZapsModel.swift @@ -50,14 +50,14 @@ class ZapsModel: ObservableObject { break case .eose: let events = self.zaps.map { $0.request.ev } - load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, events: events, damus_state: state) + load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, load: .from_events(events), damus_state: state) case .event(_, let ev): guard ev.kind == 9735 else { return } if let zap = state.zaps.zaps[ev.id] { - if insert_uniq_sorted_zap(zaps: &zaps, new_zap: zap) { + if insert_uniq_sorted_zap_by_amount(zaps: &zaps, new_zap: zap) { objectWillChange.send() } } else { @@ -71,7 +71,7 @@ class ZapsModel: ObservableObject { state.zaps.add_zap(zap: zap) - if insert_uniq_sorted_zap(zaps: &zaps, new_zap: zap) { + if insert_uniq_sorted_zap_by_amount(zaps: &zaps, new_zap: zap) { objectWillChange.send() } } diff --git a/damus/Nostr/NostrEvent.swift b/damus/Nostr/NostrEvent.swift index b3704543..5f53525a 100644 --- a/damus/Nostr/NostrEvent.swift +++ b/damus/Nostr/NostrEvent.swift @@ -168,6 +168,9 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has return decrypted(privkey: privkey) ?? "*failed to decrypt content*" } + return content + + /* switch validity { case .ok: return content @@ -176,6 +179,7 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has case .bad_sig: return content + "\n\n*WARNING: invalid signature, could be forged!*" } + */ } var description: String { diff --git a/damus/Util/EventCache.swift b/damus/Util/EventCache.swift new file mode 100644 index 00000000..2a898ea3 --- /dev/null +++ b/damus/Util/EventCache.swift @@ -0,0 +1,27 @@ +// +// EventCache.swift +// damus +// +// Created by William Casarin on 2023-02-21. +// + +import Foundation + +class EventCache { + private var events: [String: NostrEvent] + + func lookup(_ evid: String) -> NostrEvent? { + return events[evid] + } + + func insert(_ ev: NostrEvent) { + guard events[ev.id] == nil else { + return + } + events[ev.id] = ev + } + + init() { + self.events = [:] + } +} diff --git a/damus/Util/EventHolder.swift b/damus/Util/EventHolder.swift index aea546a4..5e3b58d8 100644 --- a/damus/Util/EventHolder.swift +++ b/damus/Util/EventHolder.swift @@ -12,7 +12,7 @@ class EventHolder: ObservableObject { private var has_event: Set @Published var events: [NostrEvent] @Published var incoming: [NostrEvent] - @Published var should_queue: Bool + var should_queue: Bool var queued: Int { return incoming.count diff --git a/damus/Util/InsertSort.swift b/damus/Util/InsertSort.swift index 55768c34..86be0a3c 100644 --- a/damus/Util/InsertSort.swift +++ b/damus/Util/InsertSort.swift @@ -38,8 +38,7 @@ func insert_uniq_by_pubkey(events: inout [NostrEvent], new_ev: NostrEvent, cmp: return true } -@discardableResult -func insert_uniq_sorted_zap(zaps: inout [Zap], new_zap: Zap) -> Bool { +func insert_uniq_sorted_zap(zaps: inout [Zap], new_zap: Zap, cmp: (Zap, Zap) -> Bool) -> Bool { var i: Int = 0 for zap in zaps { @@ -48,7 +47,7 @@ func insert_uniq_sorted_zap(zaps: inout [Zap], new_zap: Zap) -> Bool { return false } - if new_zap.invoice.amount > zap.invoice.amount { + if cmp(new_zap, zap) { zaps.insert(new_zap, at: i) return true } @@ -59,6 +58,19 @@ func insert_uniq_sorted_zap(zaps: inout [Zap], new_zap: Zap) -> Bool { return true } +@discardableResult +func insert_uniq_sorted_zap_by_created(zaps: inout [Zap], new_zap: Zap) -> Bool { + return insert_uniq_sorted_zap(zaps: &zaps, new_zap: new_zap) { (a, b) in + a.event.created_at > b.event.created_at + } +} + +@discardableResult +func insert_uniq_sorted_zap_by_amount(zaps: inout [Zap], new_zap: Zap) -> Bool { + return insert_uniq_sorted_zap(zaps: &zaps, new_zap: new_zap) { (a, b) in + a.invoice.amount > b.invoice.amount + } +} func insert_uniq_sorted_event_created(events: inout [NostrEvent], new_ev: NostrEvent) -> Bool { return insert_uniq_sorted_event(events: &events, new_ev: new_ev) { diff --git a/damus/Util/Zaps.swift b/damus/Util/Zaps.swift index f75abb64..5d6b8e67 100644 --- a/damus/Util/Zaps.swift +++ b/damus/Util/Zaps.swift @@ -36,7 +36,7 @@ class Zaps { if our_zaps[note_target.note_id] == nil { our_zaps[note_target.note_id] = [zap] } else { - insert_uniq_sorted_zap(zaps: &(our_zaps[note_target.note_id]!), new_zap: zap) + insert_uniq_sorted_zap_by_amount(zaps: &(our_zaps[note_target.note_id]!), new_zap: zap) } case .profile(_): break diff --git a/damus/Views/DMChatView.swift b/damus/Views/DMChatView.swift index 0910f44d..7d24355b 100644 --- a/damus/Views/DMChatView.swift +++ b/damus/Views/DMChatView.swift @@ -37,9 +37,7 @@ struct DMChatView: View { var Header: some View { let profile = damus_state.profiles.lookup(id: pubkey) - let pmodel = ProfileModel(pubkey: pubkey, damus: damus_state) - let fmodel = FollowersModel(damus_state: damus_state, target: pubkey) - let profile_page = ProfileView(damus_state: damus_state, profile: pmodel, followers: fmodel) + let profile_page = ProfileView(damus_state: damus_state, pubkey: pubkey) return NavigationLink(destination: profile_page) { HStack { ProfilePicView(pubkey: pubkey, size: 24, highlight: .none, profiles: damus_state.profiles) diff --git a/damus/Views/EventView.swift b/damus/Views/EventView.swift index 28b86486..7c8985a5 100644 --- a/damus/Views/EventView.swift +++ b/damus/Views/EventView.swift @@ -61,10 +61,8 @@ struct EventView: View { if event.known_kind == .boost { if let inner_ev = event.inner_event { VStack(alignment: .leading) { - let prof_model = ProfileModel(pubkey: event.pubkey, damus: damus) - let follow_model = FollowersModel(damus_state: damus, target: event.pubkey) let prof = damus.profiles.lookup(id: event.pubkey) - let booster_profile = ProfileView(damus_state: damus, profile: prof_model, followers: follow_model) + let booster_profile = ProfileView(damus_state: damus, pubkey: event.pubkey) NavigationLink(destination: booster_profile) { Reposted(damus: damus, pubkey: event.pubkey, profile: prof) diff --git a/damus/Views/Events/EventBody.swift b/damus/Views/Events/EventBody.swift index 65c5ead6..26efd06c 100644 --- a/damus/Views/Events/EventBody.swift +++ b/damus/Views/Events/EventBody.swift @@ -11,6 +11,14 @@ struct EventBody: View { let damus_state: DamusState let event: NostrEvent let size: EventViewKind + let should_show_img: Bool + + init(damus_state: DamusState, event: NostrEvent, size: EventViewKind, should_show_img: Bool? = nil) { + self.damus_state = damus_state + self.event = event + self.size = size + self.should_show_img = should_show_img ?? should_show_images(contacts: damus_state.contacts, ev: event, our_pubkey: damus_state.pubkey) + } var content: String { event.get_content(damus_state.keypair.privkey) @@ -21,8 +29,6 @@ struct EventBody: View { ReplyDescription(event: event, profiles: damus_state.profiles) } - let should_show_img = should_show_images(contacts: damus_state.contacts, ev: event, our_pubkey: damus_state.pubkey, booster_pubkey: nil) - NoteContentView(damus_state: damus_state, event: event, show_images: should_show_img, size: size, artifacts: .just_content(content)) .frame(maxWidth: .infinity, alignment: .leading) } diff --git a/damus/Views/Events/EventProfile.swift b/damus/Views/Events/EventProfile.swift index 17ef625e..fc2e6734 100644 --- a/damus/Views/Events/EventProfile.swift +++ b/damus/Views/Events/EventProfile.swift @@ -31,10 +31,7 @@ struct EventProfile: View { var body: some View { HStack(alignment: .center) { VStack { - let pmodel = ProfileModel(pubkey: pubkey, damus: damus_state) - let pv = ProfileView(damus_state: damus_state, profile: pmodel, followers: FollowersModel(damus_state: damus_state, target: pubkey)) - - NavigationLink(destination: pv) { + NavigationLink(destination: ProfileView(damus_state: damus_state, pubkey: pubkey)) { ProfilePicView(pubkey: pubkey, size: pfp_size, highlight: .none, profiles: damus_state.profiles) } } diff --git a/damus/Views/Events/TextEvent.swift b/damus/Views/Events/TextEvent.swift index 2c6889f6..285fa8cc 100644 --- a/damus/Views/Events/TextEvent.swift +++ b/damus/Views/Events/TextEvent.swift @@ -19,10 +19,7 @@ struct TextEvent: View { let profile = damus.profiles.lookup(id: pubkey) VStack { - let pmodel = ProfileModel(pubkey: pubkey, damus: damus) - let pv = ProfileView(damus_state: damus, profile: pmodel, followers: FollowersModel(damus_state: damus, target: pubkey)) - - NavigationLink(destination: pv) { + NavigationLink(destination: ProfileView(damus_state: damus, pubkey: pubkey)) { ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: damus.profiles) } diff --git a/damus/Views/Notifications/EventGroupView.swift b/damus/Views/Notifications/EventGroupView.swift new file mode 100644 index 00000000..ee36dd1e --- /dev/null +++ b/damus/Views/Notifications/EventGroupView.swift @@ -0,0 +1,189 @@ +// +// RepostGroupView.swift +// damus +// +// Created by William Casarin on 2023-02-21. +// + +import SwiftUI + + +enum EventGroupType { + case repost(EventGroup) + case reaction(EventGroup) + case zap(ZapGroup) + case profile_zap(ZapGroup) + + var events: [NostrEvent] { + switch self { + case .repost(let grp): + return grp.events + case .reaction(let grp): + return grp.events + case .zap(let zapgrp): + return zapgrp.zap_requests() + case .profile_zap(let zapgrp): + return zapgrp.zap_requests() + } + } +} + +enum ReactingTo { + case your_post + case tagged_in + case your_profile +} + +func determine_reacting_to(our_pubkey: String, ev: NostrEvent?) -> ReactingTo { + guard let ev else { + return .your_profile + } + + if ev.pubkey == our_pubkey { + return .your_post + } + + return .tagged_in +} + +func determine_reacting_to_text(_ r: ReactingTo) -> String { + switch r { + case .tagged_in: + return "a post you were tagged in" + case .your_post: + return "your post" + case .your_profile: + return "your profile" + } +} + +func event_author_name(profiles: Profiles, _ ev: NostrEvent) -> String { + let alice_pk = ev.pubkey + let alice_prof = profiles.lookup(id: alice_pk) + return Profile.displayName(profile: alice_prof, pubkey: alice_pk) +} + +func reacting_to_text(profiles: Profiles, our_pubkey: String, group: EventGroupType, ev: NostrEvent?) -> String { + let verb = reacting_to_verb(group: group) + + let reacting_to = determine_reacting_to(our_pubkey: our_pubkey, ev: ev) + let target = determine_reacting_to_text(reacting_to) + + if group.events.count == 1 { + let ev = group.events.first! + let profile = profiles.lookup(id: ev.pubkey) + let display_name = Profile.displayName(profile: profile, pubkey: ev.pubkey) + return String(format: "%@ is %@ %@", display_name, verb, target) + } + + if group.events.count == 2 { + let alice_name = event_author_name(profiles: profiles, group.events[0]) + let bob_name = event_author_name(profiles: profiles, group.events[1]) + + return String(format: "%@ and %@ are %@ %@", alice_name, bob_name, verb, target) + } + + if group.events.count > 2 { + let alice_name = event_author_name(profiles: profiles, group.events.first!) + let count = group.events.count - 1 + + return String(format: "%@ and %d other people are %@ %@", alice_name, count, verb, target) + } + + return "??" +} + +func reacting_to_verb(group: EventGroupType) -> String { + switch group { + case .reaction: + return "reacting" + case .repost: + return "reposting" + case .zap: fallthrough + case .profile_zap: + return "zapping" + } +} + +struct EventGroupView: View { + let state: DamusState + let event: NostrEvent? + let group: EventGroupType + + var GroupDescription: some View { + Text(reacting_to_text(profiles: state.profiles, our_pubkey: state.pubkey, group: group, ev: event)) + } + + func ZapIcon(_ zapgrp: ZapGroup) -> some View { + let fmt = format_msats_abbrev(zapgrp.msat_total) + return VStack(alignment: .center) { + Image(systemName: "bolt.fill") + .foregroundColor(.orange) + Text("\(fmt)") + .foregroundColor(Color.orange) + } + } + + var GroupIcon: some View { + Group { + switch group { + case .repost: + Image(systemName: "arrow.2.squarepath") + .foregroundColor(Color("DamusGreen")) + case .reaction: + Image("shaka-full") + .resizable() + .frame(width: 24, height: 24) + .foregroundColor(.accentColor) + case .profile_zap(let zapgrp): + ZapIcon(zapgrp) + case .zap(let zapgrp): + ZapIcon(zapgrp) + } + } + } + + var body: some View { + HStack(alignment: .top) { + GroupIcon + .frame(width: PFP_SIZE + 10) + + VStack(alignment: .leading) { + ProfilePicturesView(state: state, events: group.events) + + GroupDescription + + if let event { + NavigationLink(destination: BuildThreadV2View(damus: state, event_id: event.id)) { + Text(event.content) + .padding([.top], 1) + .foregroundColor(.gray) + } + .buttonStyle(.plain) + } + } + } + .padding([.top], 6) + } +} + +let test_encoded_post = "{\"id\": \"8ba545ab96959fe0ce7db31bc10f3ac3aa5353bc4428dbf1e56a7be7062516db\",\"pubkey\": \"7e27509ccf1e297e1df164912a43406218f8bd80129424c3ef798ca3ef5c8444\",\"created_at\": 1677013417,\"kind\": 1,\"tags\": [],\"content\": \"hello\",\"sig\": \"93684f15eddf11f42afbdd81828ee9fc35350344d8650c78909099d776e9ad8d959cd5c4bff7045be3b0b255144add43d0feef97940794a1bc9c309791bebe4a\"}" +let test_repost = NostrEvent(id: "", content: test_encoded_post, pubkey: "", kind: 6, tags: [], createdAt: 1) +let test_reposts = [test_repost, test_repost] +let test_event_group = EventGroup(events: test_reposts) + +struct EventGroupView_Previews: PreviewProvider { + static var previews: some View { + VStack { + EventGroupView(state: test_damus_state(), event: test_event, group: .repost(test_event_group)) + .frame(height: 200) + .padding() + + EventGroupView(state: test_damus_state(), event: test_event, group: .reaction(test_event_group)) + .frame(height: 200) + .padding() + } + } + +} + diff --git a/damus/Views/Notifications/NotificationItemView.swift b/damus/Views/Notifications/NotificationItemView.swift new file mode 100644 index 00000000..9d131ac5 --- /dev/null +++ b/damus/Views/Notifications/NotificationItemView.swift @@ -0,0 +1,86 @@ +// +// NotificationItemView.swift +// damus +// +// Created by William Casarin on 2023-02-21. +// + +import SwiftUI + +enum ShowItem { + case show(NostrEvent?) + case dontshow(NostrEvent?) +} + +func notification_item_event(events: EventCache, notif: NotificationItem) -> ShowItem { + switch notif { + case .repost(let evid, _): + return .dontshow(events.lookup(evid)) + case .reply(let ev): + return .show(ev) + case .reaction(let evid, _): + return .dontshow(events.lookup(evid)) + case .event_zap(let evid, _): + return .dontshow(events.lookup(evid)) + case .profile_zap: + return .show(nil) + } +} + +struct NotificationItemView: View { + let state: DamusState + let item: NotificationItem + + var show_item: ShowItem { + notification_item_event(events: state.events, notif: item) + } + + func Item(_ ev: NostrEvent?) -> some View { + Group { + switch item { + case .repost(_, let evgrp): + EventGroupView(state: state, event: ev, group: .repost(evgrp)) + + case .event_zap(_, let zapgrp): + EventGroupView(state: state, event: ev, group: .zap(zapgrp)) + + case .profile_zap(let grp): + EventGroupView(state: state, event: nil, group: .profile_zap(grp)) + + case .reaction(_, let evgrp): + EventGroupView(state: state, event: ev, group: .reaction(evgrp)) + + case .reply(let ev): + NavigationLink(destination: BuildThreadV2View(damus: state, event_id: ev.id)) { + EventView(damus: state, event: ev, has_action_bar: true) + } + .buttonStyle(.plain) + } + + Divider() + .padding([.top,.bottom], 5) + } + } + + var body: some View { + Group { + switch show_item { + case .show(let ev): + Item(ev) + + case .dontshow(let ev): + if let ev { + Item(ev) + } + } + } + } +} + +let test_notification_item: NotificationItem = .repost("evid", test_event_group) + +struct NotificationItemView_Previews: PreviewProvider { + static var previews: some View { + NotificationItemView(state: test_damus_state(), item: test_notification_item) + } +} diff --git a/damus/Views/Notifications/NotificationsView.swift b/damus/Views/Notifications/NotificationsView.swift new file mode 100644 index 00000000..13b1cefe --- /dev/null +++ b/damus/Views/Notifications/NotificationsView.swift @@ -0,0 +1,43 @@ +// +// NotificationsView.swift +// damus +// +// Created by William Casarin on 2023-02-21. +// + +import SwiftUI + +struct NotificationsView: View { + let state: DamusState + @ObservedObject var notifications: NotificationsModel + + var body: some View { + ScrollViewReader { scroller in + ScrollView { + LazyVStack(alignment: .leading) { + Color.white.opacity(0) + .id("startblock") + .frame(height: 5) + ForEach(notifications.notifications, id: \.id) { item in + NotificationItemView(state: state, item: item) + } + } + .padding(.horizontal) + } + .onReceive(handle_notify(.scroll_to_top)) { notif in + let _ = notifications.flush() + self.notifications.should_queue = false + scroll_to_event(scroller: scroller, id: "startblock", delay: 0.0, animate: true, anchor: .top) + } + } + .onAppear { + let _ = notifications.flush() + } + } +} + +struct NotificationsView_Previews: PreviewProvider { + static var previews: some View { + NotificationsView(state: test_damus_state(), notifications: NotificationsModel()) + } +} diff --git a/damus/Views/Notifications/ProfilePicturesView.swift b/damus/Views/Notifications/ProfilePicturesView.swift new file mode 100644 index 00000000..2991d6ec --- /dev/null +++ b/damus/Views/Notifications/ProfilePicturesView.swift @@ -0,0 +1,37 @@ +// +// ProfilePicturesView.swift +// damus +// +// Created by William Casarin on 2023-02-22. +// + +import SwiftUI + +struct ProfilePicturesView: View { + let state: DamusState + let events: [NostrEvent] + + @State var nav_target: String? = nil + @State var navigating: Bool = false + + var body: some View { + NavigationLink(destination: ProfileView(damus_state: state, pubkey: nav_target ?? ""), isActive: $navigating) { + EmptyView() + } + HStack { + ForEach(events.prefix(8)) { ev in + ProfilePicView(pubkey: ev.pubkey, size: 32.0, highlight: .none, profiles: state.profiles) + .onTapGesture { + nav_target = ev.pubkey + navigating = true + } + } + } + } +} + +struct ProfilePicturesView_Previews: PreviewProvider { + static var previews: some View { + ProfilePicturesView(state: test_damus_state(), events: [test_event, test_event]) + } +} diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift index dc7e03ca..7fe3b55c 100644 --- a/damus/Views/ProfileView.swift +++ b/damus/Views/ProfileView.swift @@ -110,8 +110,6 @@ struct ProfileView: View { static let markdown = Markdown() @State private var selected_tab: ProfileTab = .posts - @StateObject var profile: ProfileModel - @StateObject var followers: FollowersModel @State private var showingEditProfile = false @State var showing_select_wallet: Bool = false @State var is_zoomed: Bool = false @@ -120,6 +118,21 @@ struct ProfileView: View { @State var filter_state : FilterState = .posts @State var yOffset: CGFloat = 0 + @StateObject var profile: ProfileModel + @StateObject var followers: FollowersModel + + init(damus_state: DamusState, profile: ProfileModel, followers: FollowersModel) { + self.damus_state = damus_state + self._profile = StateObject(wrappedValue: profile) + self._followers = StateObject(wrappedValue: followers) + } + + init(damus_state: DamusState, pubkey: String) { + self.damus_state = damus_state + self._profile = StateObject(wrappedValue: ProfileModel(pubkey: pubkey, damus: damus_state)) + self._followers = StateObject(wrappedValue: FollowersModel(damus_state: damus_state, target: pubkey)) + } + @Environment(\.dismiss) var dismiss @Environment(\.colorScheme) var colorScheme @Environment(\.openURL) var openURL @@ -459,9 +472,7 @@ struct ProfileView: View { struct ProfileView_Previews: PreviewProvider { static var previews: some View { let ds = test_damus_state() - let followers = FollowersModel(damus_state: ds, target: ds.pubkey) - let profile_model = ProfileModel(pubkey: ds.pubkey, damus: ds) - ProfileView(damus_state: ds, profile: profile_model, followers: followers) + ProfileView(damus_state: ds, pubkey: ds.pubkey) } } From 71f7ea47df67f0a5ff8f85d5cfd72a610fe51242 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Sat, 25 Feb 2023 12:10:37 -0800 Subject: [PATCH 12/65] Customized Zaps Changelog-Added: Customized zaps --- damus.xcodeproj/project.pbxproj | 8 + damus/Components/ZapButton.swift | 181 +++++++++++------ damus/Models/HomeModel.swift | 2 + damus/Nostr/Nostr.swift | 3 + damus/Nostr/NostrEvent.swift | 17 +- damus/Nostr/NostrKind.swift | 1 + damus/Util/LNUrlPayRequest.swift | 2 + damus/Util/Notifications.swift | 3 + damus/Util/Zap.swift | 10 +- damus/Views/ConfigView.swift | 33 ++-- damus/Views/Events/TextEvent.swift | 23 ++- damus/Views/Profile/MaybeAnonPfpView.swift | 46 +++++ damus/Views/Zaps/CustomizeZapView.swift | 215 +++++++++++++++++++++ 13 files changed, 458 insertions(+), 86 deletions(-) create mode 100644 damus/Views/Profile/MaybeAnonPfpView.swift create mode 100644 damus/Views/Zaps/CustomizeZapView.swift diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index fdf1096e..556a8a0b 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -134,6 +134,8 @@ 4C90BD1C283AC38E008EE7EF /* Bech32Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C90BD1B283AC38E008EE7EF /* Bech32Tests.swift */; }; 4C987B57283FD07F0042CE38 /* FollowersModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C987B56283FD07F0042CE38 /* FollowersModel.swift */; }; 4C99737B28C92A9200E53835 /* ChatroomMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C99737A28C92A9200E53835 /* ChatroomMetadata.swift */; }; + 4C9F18E229AA9B6C008C55EC /* CustomizeZapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9F18E129AA9B6C008C55EC /* CustomizeZapView.swift */; }; + 4C9F18E429ABDE6D008C55EC /* MaybeAnonPfpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9F18E329ABDE6D008C55EC /* MaybeAnonPfpView.swift */; }; 4CA2EFA0280E37AC0044ACD8 /* TimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */; }; 4CAAD8AD298851D000060CEA /* AccountDeletion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAAD8AC298851D000060CEA /* AccountDeletion.swift */; }; 4CAAD8B029888AD200060CEA /* RelayConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAAD8AF29888AD200060CEA /* RelayConfigView.swift */; }; @@ -470,6 +472,8 @@ 4C90BD1B283AC38E008EE7EF /* Bech32Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bech32Tests.swift; sourceTree = ""; }; 4C987B56283FD07F0042CE38 /* FollowersModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowersModel.swift; sourceTree = ""; }; 4C99737A28C92A9200E53835 /* ChatroomMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatroomMetadata.swift; sourceTree = ""; }; + 4C9F18E129AA9B6C008C55EC /* CustomizeZapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomizeZapView.swift; sourceTree = ""; }; + 4C9F18E329ABDE6D008C55EC /* MaybeAnonPfpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaybeAnonPfpView.swift; sourceTree = ""; }; 4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineView.swift; sourceTree = ""; }; 4CAAD8AC298851D000060CEA /* AccountDeletion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDeletion.swift; sourceTree = ""; }; 4CAAD8AF29888AD200060CEA /* RelayConfigView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayConfigView.swift; sourceTree = ""; }; @@ -909,6 +913,7 @@ children = ( 4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */, 4CB9D4A82992D2F400A9A7E4 /* FollowsYou.swift */, + 4C9F18E329ABDE6D008C55EC /* MaybeAnonPfpView.swift */, ); path = Profile; sourceTree = ""; @@ -1066,6 +1071,7 @@ isa = PBXGroup; children = ( 4CE879572996C45300F758CC /* ZapsView.swift */, + 4C9F18E129AA9B6C008C55EC /* CustomizeZapView.swift */, ); path = Zaps; sourceTree = ""; @@ -1304,6 +1310,7 @@ 4C363AA228296A7E006E126D /* SearchView.swift in Sources */, 4CC7AAED297F0B9E00430951 /* Highlight.swift in Sources */, 4C285C8A2838B985008A31F1 /* ProfilePictureSelector.swift in Sources */, + 4C9F18E429ABDE6D008C55EC /* MaybeAnonPfpView.swift in Sources */, 4C75EFB92804A2740006080F /* EventView.swift in Sources */, 3AA247FD297E3CFF0090C62D /* RepostsModel.swift in Sources */, F75BA12F29A18EF500E10810 /* BookmarksView.swift in Sources */, @@ -1398,6 +1405,7 @@ 4CE0E2B629A3ED5500DB4CA2 /* InnerTimelineView.swift in Sources */, 4C363A8828236948006E126D /* BlocksView.swift in Sources */, 4C06670628FCB08600038D2A /* ImageCarousel.swift in Sources */, + 4C9F18E229AA9B6C008C55EC /* CustomizeZapView.swift in Sources */, 4C75EFAF28049D350006080F /* NostrFilter.swift in Sources */, 4C3EA64C28FF59AC00C48A62 /* bech32_util.c in Sources */, 4C42812C298C848200DBF26F /* TranslateView.swift in Sources */, diff --git a/damus/Components/ZapButton.swift b/damus/Components/ZapButton.swift index d96b44a9..fff6f902 100644 --- a/damus/Components/ZapButton.swift +++ b/damus/Components/ZapButton.swift @@ -7,6 +7,22 @@ import SwiftUI +enum ZappingEventType { + case failed(ZappingError) + case got_zap_invoice(String) +} + +enum ZappingError { + case fetching_invoice + case bad_lnurl +} + +struct ZappingEvent { + let is_custom: Bool + let type: ZappingEventType + let event: NostrEvent +} + struct ZapButton: View { let damus_state: DamusState let event: NostrEvent @@ -19,61 +35,8 @@ struct ZapButton: View { @State var slider_value: Double = 0.0 @State var slider_visible: Bool = false @State var showing_select_wallet: Bool = false - - func send_zap() { - guard let privkey = damus_state.keypair.privkey else { - return - } - - // Only take the first 10 because reasons - let relays = Array(damus_state.pool.descriptors.prefix(10)) - let target = ZapTarget.note(id: event.id, author: event.pubkey) - // TODO: gather comment? - let content = "" - let zapreq = make_zap_request_event(pubkey: damus_state.pubkey, privkey: privkey, content: content, relays: relays, target: target) - - zapping = true - - Task { - var mpayreq = damus_state.lnurls.lookup(target.pubkey) - if mpayreq == nil { - mpayreq = await fetch_static_payreq(lnurl) - } - - guard let payreq = mpayreq else { - // TODO: show error - DispatchQueue.main.async { - zapping = false - } - return - } - - DispatchQueue.main.async { - damus_state.lnurls.endpoints[target.pubkey] = payreq - } - - let zap_amount = get_default_zap_amount(pubkey: damus_state.pubkey) ?? 1000 - guard let inv = await fetch_zap_invoice(payreq, zapreq: zapreq, sats: zap_amount) else { - DispatchQueue.main.async { - zapping = false - } - return - } - - DispatchQueue.main.async { - zapping = false - - if should_show_wallet_selector(damus_state.pubkey) { - self.invoice = inv - self.showing_select_wallet = true - } else { - open_with_wallet(wallet: get_default_wallet(damus_state.pubkey).model, invoice: inv) - } - } - } - - //damus_state.pool.send(.event(zapreq)) - } + @State var showing_zap_customizer: Bool = false + @State var is_charging: Bool = false var zap_img: String { if bar.zapped { @@ -92,6 +55,10 @@ struct ZapButton: View { return Color.orange } + if is_charging { + return Color.yellow + } + if !zapping { return nil } @@ -101,14 +68,24 @@ struct ZapButton: View { var body: some View { HStack(spacing: 4) { - EventActionButton(img: zap_img, col: zap_color) { - if bar.zapped { - //notify(.delete, bar.our_tip) - } else if !zapping { - send_zap() + Image(systemName: zap_img) + .foregroundColor(zap_color == nil ? Color.gray : zap_color!) + .font(.footnote.weight(.medium)) + .onTapGesture { + if bar.zapped { + //notify(.delete, bar.our_tip) + } else if !zapping { + self.showing_zap_customizer = true + //send_zap(damus_state: damus_state, event: event, lnurl: lnurl, is_custom: false) + //self.zapping = true + } } - } - .accessibilityLabel(NSLocalizedString("Zap", comment: "Accessibility label for zap button")) + .onLongPressGesture(minimumDuration: 0, pressing: { is_charing in + self.is_charging = is_charging + }, perform: { + self.showing_zap_customizer = true + }) + .accessibilityLabel(NSLocalizedString("Zap", comment: "Accessibility label for zap button")) if bar.zap_total > 0 { Text(verbatim: format_msats_abbrev(bar.zap_total)) @@ -116,9 +93,37 @@ struct ZapButton: View { .foregroundColor(bar.zapped ? Color.orange : Color.gray) } } + .sheet(isPresented: $showing_zap_customizer) { + CustomizeZapView(state: damus_state, event: event, lnurl: lnurl) + } .sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) { SelectWalletView(showingSelectWallet: $showing_select_wallet, our_pubkey: damus_state.pubkey, invoice: invoice) } + .onReceive(handle_notify(.zapping)) { notif in + let zap_ev = notif.object as! ZappingEvent + + guard zap_ev.event.id == self.event.id else { + return + } + + guard !zap_ev.is_custom else { + return + } + + switch zap_ev.type { + case .failed: + break + case .got_zap_invoice(let inv): + if should_show_wallet_selector(damus_state.pubkey) { + self.invoice = inv + self.showing_select_wallet = true + } else { + open_with_wallet(wallet: get_default_wallet(damus_state.pubkey).model, invoice: inv) + } + } + + self.zapping = false + } } } @@ -130,3 +135,55 @@ struct ZapButton_Previews: PreviewProvider { } } + + +func send_zap(damus_state: DamusState, event: NostrEvent, lnurl: String, is_custom: Bool, comment: String?, amount_sats: Int?, zap_type: ZapType) { + guard let privkey = damus_state.keypair.privkey else { + return + } + + // Only take the first 10 because reasons + let relays = Array(damus_state.pool.descriptors.prefix(10)) + let target = ZapTarget.note(id: event.id, author: event.pubkey) + let content = comment ?? "" + let zapreq = make_zap_request_event(pubkey: damus_state.pubkey, privkey: privkey, content: content, relays: relays, target: target, is_anon: zap_type == .anon) + + Task { + var mpayreq = damus_state.lnurls.lookup(target.pubkey) + if mpayreq == nil { + mpayreq = await fetch_static_payreq(lnurl) + } + + guard let payreq = mpayreq else { + // TODO: show error + DispatchQueue.main.async { + let typ = ZappingEventType.failed(.bad_lnurl) + let ev = ZappingEvent(is_custom: is_custom, type: typ, event: event) + notify(.zapping, ev) + } + return + } + + DispatchQueue.main.async { + damus_state.lnurls.endpoints[target.pubkey] = payreq + } + + let zap_amount = amount_sats ?? get_default_zap_amount(pubkey: damus_state.pubkey) ?? 1000 + + guard let inv = await fetch_zap_invoice(payreq, zapreq: zapreq, sats: zap_amount, zap_type: zap_type, comment: comment) else { + DispatchQueue.main.async { + let typ = ZappingEventType.failed(.fetching_invoice) + let ev = ZappingEvent(is_custom: is_custom, type: typ, event: event) + notify(.zapping, ev) + } + return + } + + DispatchQueue.main.async { + let ev = ZappingEvent(is_custom: is_custom, type: .got_zap_invoice(inv), event: event) + notify(.zapping, ev) + } + } + + return +} diff --git a/damus/Models/HomeModel.swift b/damus/Models/HomeModel.swift index 3c6bc866..53816b4c 100644 --- a/damus/Models/HomeModel.swift +++ b/damus/Models/HomeModel.swift @@ -125,6 +125,8 @@ class HomeModel: ObservableObject { handle_channel_meta(ev) case .zap: handle_zap_event(ev) + case .zap_request: + break } } diff --git a/damus/Nostr/Nostr.swift b/damus/Nostr/Nostr.swift index 268949da..e068d27b 100644 --- a/damus/Nostr/Nostr.swift +++ b/damus/Nostr/Nostr.swift @@ -141,6 +141,9 @@ struct Profile: Codable { } static func displayName(profile: Profile?, pubkey: String) -> String { + if pubkey == "anon" { + return "Anonymous" + } let pk = bech32_nopre_pubkey(pubkey) ?? pubkey return profile?.name ?? abbrev_pubkey(pk) } diff --git a/damus/Nostr/NostrEvent.swift b/damus/Nostr/NostrEvent.swift index 5f53525a..826d3059 100644 --- a/damus/Nostr/NostrEvent.swift +++ b/damus/Nostr/NostrEvent.swift @@ -577,14 +577,25 @@ func zap_target_to_tags(_ target: ZapTarget) -> [[String]] { } } -func make_zap_request_event(pubkey: String, privkey: String, content: String, relays: [RelayDescriptor], target: ZapTarget) -> NostrEvent { +func make_zap_request_event(pubkey: String, privkey: String, content: String, relays: [RelayDescriptor], target: ZapTarget, is_anon: Bool) -> NostrEvent { var tags = zap_target_to_tags(target) var relay_tag = ["relays"] relay_tag.append(contentsOf: relays.map { $0.url.absoluteString }) tags.append(relay_tag) - let ev = NostrEvent(content: content, pubkey: pubkey, kind: 9734, tags: tags) + + var priv = privkey + var pub = pubkey + + if is_anon { + tags.append(["anon"]) + let kp = generate_new_keypair() + pub = kp.pubkey + priv = kp.privkey! + } + + let ev = NostrEvent(content: content, pubkey: pub, kind: 9734, tags: tags) ev.id = calculate_event_id(ev: ev) - ev.sig = sign_event(privkey: privkey, ev: ev) + ev.sig = sign_event(privkey: priv, ev: ev) return ev } diff --git a/damus/Nostr/NostrKind.swift b/damus/Nostr/NostrKind.swift index 16b534bc..3d02ca87 100644 --- a/damus/Nostr/NostrKind.swift +++ b/damus/Nostr/NostrKind.swift @@ -21,4 +21,5 @@ enum NostrKind: Int { case chat = 42 case list = 30000 case zap = 9735 + case zap_request = 9734 } diff --git a/damus/Util/LNUrlPayRequest.swift b/damus/Util/LNUrlPayRequest.swift index 610d6554..f45c5956 100644 --- a/damus/Util/LNUrlPayRequest.swift +++ b/damus/Util/LNUrlPayRequest.swift @@ -9,8 +9,10 @@ import Foundation struct LNUrlPayRequest: Decodable { let allowsNostr: Bool? + let commentAllowed: Int? let nostrPubkey: String? + let metadata: String? let minSendable: Int64? let maxSendable: Int64? let status: String? diff --git a/damus/Util/Notifications.swift b/damus/Util/Notifications.swift index ff08c49f..bbe9334f 100644 --- a/damus/Util/Notifications.swift +++ b/damus/Util/Notifications.swift @@ -104,6 +104,9 @@ extension Notification.Name { static var update_bookmarks: Notification.Name { return Notification.Name("update_bookmarks") } + static var zapping: Notification.Name { + return Notification.Name("zapping") + } } func handle_notify(_ name: Notification.Name) -> NotificationCenter.Publisher { diff --git a/damus/Util/Zap.swift b/damus/Util/Zap.swift index 245040ff..02d3d63d 100644 --- a/damus/Util/Zap.swift +++ b/damus/Util/Zap.swift @@ -285,7 +285,7 @@ func fetch_static_payreq(_ lnurl: String) async -> LNUrlPayRequest? { return endpoint } -func fetch_zap_invoice(_ payreq: LNUrlPayRequest, zapreq: NostrEvent, sats: Int) async -> String? { +func fetch_zap_invoice(_ payreq: LNUrlPayRequest, zapreq: NostrEvent, sats: Int, zap_type: ZapType, comment: String?) async -> String? { guard var base_url = payreq.callback.flatMap({ URLComponents(string: $0) }) else { return nil } @@ -295,12 +295,18 @@ func fetch_zap_invoice(_ payreq: LNUrlPayRequest, zapreq: NostrEvent, sats: Int) var query = [URLQueryItem(name: "amount", value: "\(amount)")] - if zappable { + if zappable && zap_type != .non_zap { if let json = encode_json(zapreq) { print("zapreq json: \(json)") query.append(URLQueryItem(name: "nostr", value: json)) } } + + // add a lud12 comment as well if we have it + if let comment, let limit = payreq.commentAllowed, limit != 0 { + let limited_comment = String(comment.prefix(limit)) + query.append(URLQueryItem(name: "comment", value: limited_comment)) + } base_url.queryItems = query diff --git a/damus/Views/ConfigView.swift b/damus/Views/ConfigView.swift index a246a8ca..f88840f1 100644 --- a/damus/Views/ConfigView.swift +++ b/damus/Views/ConfigView.swift @@ -129,26 +129,14 @@ struct ConfigView: View { } } - Section(NSLocalizedString("Default Zap Amount in sats", comment: "Section title for zap configuration")) { TextField(String("1000"), text: $default_zap_amount) .keyboardType(.numberPad) .onReceive(Just(default_zap_amount)) { newValue in - let filtered = newValue.filter { Set("0123456789").contains($0) } - - if filtered != newValue { - default_zap_amount = filtered + + if let parsed = handle_string_amount(new_value: newValue) { + self.default_zap_amount = String(parsed) } - - if filtered == "" { - set_default_zap_amount(pubkey: state.pubkey, amount: 1000) - return - } - - guard let amt = Int(filtered) else { - return - } - set_default_zap_amount(pubkey: state.pubkey, amount: amt) } } @@ -346,3 +334,18 @@ struct ConfigView_Previews: PreviewProvider { } } } + + +func handle_string_amount(new_value: String) -> Int? { + let filtered = new_value.filter { Set("0123456789").contains($0) } + + if filtered == "" { + return nil + } + + guard let amt = Int(filtered) else { + return nil + } + + return amt +} diff --git a/damus/Views/Events/TextEvent.swift b/damus/Views/Events/TextEvent.swift index 285fa8cc..9c27e293 100644 --- a/damus/Views/Events/TextEvent.swift +++ b/damus/Views/Events/TextEvent.swift @@ -18,17 +18,17 @@ struct TextEvent: View { HStack(alignment: .top) { let profile = damus.profiles.lookup(id: pubkey) + let is_anon = event_is_anonymous(ev: event) VStack { - NavigationLink(destination: ProfileView(damus_state: damus, pubkey: pubkey)) { - ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: damus.profiles) - } + MaybeAnonPfpView(state: damus, is_anon: is_anon, pubkey: pubkey) Spacer() } VStack(alignment: .leading) { HStack(alignment: .center) { - EventProfileName(pubkey: pubkey, profile: profile, damus: damus, show_friend_confirmed: true, size: .normal) + let pk = is_anon ? "anon" : pubkey + EventProfileName(pubkey: pk, profile: profile, damus: damus, show_friend_confirmed: true, size: .normal) Text(verbatim: "\(format_relative_time(event.created_at))") .foregroundColor(.gray) @@ -65,3 +65,18 @@ struct TextEvent_Previews: PreviewProvider { TextEvent(damus: test_damus_state(), event: test_event, pubkey: "pk", has_action_bar: true, booster_pubkey: nil) } } + +func event_has_tag(ev: NostrEvent, tag: String) -> Bool { + for t in ev.tags { + if t.count >= 1 && t[0] == tag { + return true + } + } + + return false +} + + +func event_is_anonymous(ev: NostrEvent) -> Bool { + return ev.known_kind == .zap_request && event_has_tag(ev: ev, tag: "anon") +} diff --git a/damus/Views/Profile/MaybeAnonPfpView.swift b/damus/Views/Profile/MaybeAnonPfpView.swift new file mode 100644 index 00000000..19d8f269 --- /dev/null +++ b/damus/Views/Profile/MaybeAnonPfpView.swift @@ -0,0 +1,46 @@ +// +// MaybeAnonPfpView.swift +// damus +// +// Created by William Casarin on 2023-02-26. +// + +import SwiftUI + +struct MaybeAnonPfpView: View { + let state: DamusState + let is_anon: Bool + let pubkey: String + + init(state: DamusState, event: NostrEvent, pubkey: String) { + self.state = state + self.is_anon = event_is_anonymous(ev: event) + self.pubkey = pubkey + } + + init(state: DamusState, is_anon: Bool, pubkey: String) { + self.state = state + self.is_anon = is_anon + self.pubkey = pubkey + } + + var body: some View { + Group { + if is_anon { + Image(systemName: "person.fill.questionmark") + .font(.largeTitle) + .frame(width: PFP_SIZE, height: PFP_SIZE) + } else { + NavigationLink(destination: ProfileView(damus_state: state, pubkey: pubkey)) { + ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: state.profiles) + } + } + } + } +} + +struct MaybeAnonPfpView_Previews: PreviewProvider { + static var previews: some View { + MaybeAnonPfpView(state: test_damus_state(), is_anon: true, pubkey: "anon") + } +} diff --git a/damus/Views/Zaps/CustomizeZapView.swift b/damus/Views/Zaps/CustomizeZapView.swift new file mode 100644 index 00000000..c20a5cbd --- /dev/null +++ b/damus/Views/Zaps/CustomizeZapView.swift @@ -0,0 +1,215 @@ +// +// CustomizeZapView.swift +// damus +// +// Created by William Casarin on 2023-02-25. +// + +import SwiftUI +import Combine + +enum ZapType { + case pub + case anon + case non_zap +} + +struct ZapAmountItem: Identifiable, Hashable { + let amount: Int + let icon: String + + var id: String { + return icon + } +} + +func get_default_zap_amount_item(_ pubkey: String) -> ZapAmountItem { + let def = get_default_zap_amount(pubkey: pubkey) ?? 1000 + return ZapAmountItem(amount: def, icon: "🤙") +} + +func get_zap_amount_items(pubkey: String) -> [ZapAmountItem] { + let def_item = get_default_zap_amount_item(pubkey) + var entries = [ + ZapAmountItem(amount: 500, icon: "🙂"), + ZapAmountItem(amount: 5000, icon: "💜"), + ZapAmountItem(amount: 10_000, icon: "😍"), + ZapAmountItem(amount: 20_000, icon: "🤩"), + ZapAmountItem(amount: 50_000, icon: "🔥"), + ZapAmountItem(amount: 100_000, icon: "🚀"), + ZapAmountItem(amount: 1_000_000, icon: "🤯"), + ] + entries.append(def_item) + + entries.sort { $0.amount < $1.amount } + return entries +} + +struct CustomizeZapView: View { + let state: DamusState + let event: NostrEvent + let lnurl: String + @State var comment: String + @State var custom_amount: String + @State var custom_amount_sats: Int? + @State var selected_amount: ZapAmountItem + @State var zap_type: ZapType + @State var invoice: String + @State var error: String? + @State var showing_wallet_selector: Bool + @State var zapping: Bool + + let zap_amounts: [ZapAmountItem] + + @Environment(\.dismiss) var dismiss + + init(state: DamusState, event: NostrEvent, lnurl: String) { + self._comment = State(initialValue: "") + self.event = event + self.zap_amounts = get_zap_amount_items(pubkey: state.pubkey) + self._error = State(initialValue: nil) + self._invoice = State(initialValue: "") + self._showing_wallet_selector = State(initialValue: false) + self._custom_amount = State(initialValue: "") + self._zap_type = State(initialValue: .pub) + let selected = get_default_zap_amount_item(state.pubkey) + self._selected_amount = State(initialValue: selected) + self._custom_amount_sats = State(initialValue: nil) + self._zapping = State(initialValue: false) + self.lnurl = lnurl + self.state = state + } + + var ZapTypePicker: some View { + Picker("Zap Type", selection: $zap_type) { + Text("Public").tag(ZapType.pub) + Text("Anonymous").tag(ZapType.anon) + Text("Non-Zap").tag(ZapType.non_zap) + } + .pickerStyle(.segmented) + } + + var AmountPicker: some View { + Picker("Zap Amount", selection: $selected_amount) { + ForEach(zap_amounts) { entry in + let fmt = format_msats_abbrev(Int64(entry.amount) * 1000) + HStack(alignment: .firstTextBaseline) { + Text("\(entry.icon)") + .frame(width: 30) + Text("\(fmt)") + .frame(width: 50) + } + .tag(entry) + } + } + .pickerStyle(.wheel) + } + + func receive_zap(notif: Notification) { + let zap_ev = notif.object as! ZappingEvent + guard zap_ev.is_custom else { + return + } + guard zap_ev.event.id == event.id else { + return + } + + self.zapping = false + + switch zap_ev.type { + case .failed(let err): + switch err { + case .fetching_invoice: + self.error = "Error fetching lightning invoice" + case .bad_lnurl: + self.error = "Invalid lightning address" + } + break + case .got_zap_invoice(let inv): + if should_show_wallet_selector(state.pubkey) { + self.invoice = inv + self.showing_wallet_selector = true + } else { + open_with_wallet(wallet: get_default_wallet(state.pubkey).model, invoice: inv) + self.showing_wallet_selector = false + dismiss() + } + } + + +} + + var body: some View { + MainContent + .sheet(isPresented: $showing_wallet_selector) { + SelectWalletView(showingSelectWallet: $showing_wallet_selector, our_pubkey: state.pubkey, invoice: invoice) + } + .onReceive(handle_notify(.zapping)) { notif in + receive_zap(notif: notif) + } + .ignoresSafeArea() + } + + var MainContent: some View { + VStack(alignment: .leading) { + Form { + Section(content: { + AmountPicker + }, header: { + Text("Zap Amount in sats") + }) + + Section(content: { + TextField("100000", text: $custom_amount) + .keyboardType(.numberPad) + .onReceive(Just(custom_amount)) { newValue in + + if let parsed = handle_string_amount(new_value: newValue) { + self.custom_amount = String(parsed) + self.custom_amount_sats = parsed + } + } + }, header: { + Text("Custom Zap Amount") + }) + .dismissKeyboardOnTap() + + Section(content: { + TextField("Awesome post!", text: $comment) + }, header: { + Text("Comment") + }) + .dismissKeyboardOnTap() + + Section(content: { + ZapTypePicker + }, header: { + Text("Zap Type") + }) + + if zapping { + Text("Zapping...") + } else { + Button("Zap") { + let amount = custom_amount_sats ?? selected_amount.amount + send_zap(damus_state: state, event: event, lnurl: lnurl, is_custom: true, comment: comment, amount_sats: amount, zap_type: zap_type) + self.zapping = true + } + .zIndex(16) + } + + if let error { + Text(error) + .foregroundColor(.red) + } + } + } + } +} + +struct CustomizeZapView_Previews: PreviewProvider { + static var previews: some View { + CustomizeZapView(state: test_damus_state(), event: test_event, lnurl: "") + .frame(width: 400, height: 600) + } +} From 75fd8de456e427444db5c6369491afbaa758229f Mon Sep 17 00:00:00 2001 From: Swift Date: Fri, 24 Feb 2023 18:56:00 -0500 Subject: [PATCH 13/65] Fix post text in darkmode Closes: #693 --- damus/Views/Posting/UserSearch.swift | 1 + damus/Views/TextViewWrapper.swift | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/damus/Views/Posting/UserSearch.swift b/damus/Views/Posting/UserSearch.swift index c8b21468..072857db 100644 --- a/damus/Views/Posting/UserSearch.swift +++ b/damus/Views/Posting/UserSearch.swift @@ -55,6 +55,7 @@ struct UserSearch: View { attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18.0), NSAttributedString.Key.link: "@\(pk)"]) tagAttributedString.removeAttribute(.link, range: NSRange(location: tagAttributedString.length - 2, length: 2)) + tagAttributedString.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.label], range: NSRange(location: tagAttributedString.length - 2, length: 2)) let mutableString = NSMutableAttributedString() mutableString.append(post) mutableString.append(tagAttributedString) diff --git a/damus/Views/TextViewWrapper.swift b/damus/Views/TextViewWrapper.swift index e29c8b50..15d10c2a 100644 --- a/damus/Views/TextViewWrapper.swift +++ b/damus/Views/TextViewWrapper.swift @@ -14,7 +14,7 @@ struct TextViewWrapper: UIViewRepresentable { let textView = UITextView() textView.delegate = context.coordinator textView.font = UIFont.systemFont(ofSize: 18) - //textView.textColor = UIColor.black + textView.textColor = UIColor.label let linkAttributes: [NSAttributedString.Key : Any] = [ NSAttributedString.Key.foregroundColor: UIColor(Color.accentColor)] textView.linkTextAttributes = linkAttributes From 77bcd1b715c92ef15ea962b2ec673356b99c18cd Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Mon, 27 Feb 2023 07:01:23 +1300 Subject: [PATCH 14/65] Fix localization and add tests for EventGroupView --- damus.xcodeproj/project.pbxproj | 6 + damus/Util/LocalizationUtil.swift | 8 +- .../Views/Notifications/EventGroupView.swift | 95 ++++--- damus/en-US.lproj/Localizable.strings | Bin 0 -> 4782 bytes damus/en-US.lproj/Localizable.stringsdict | 144 +++++++++++ .../Localized Contents/en-US.xliff | 235 ++++++++++++++++++ .../damus/en-US.lproj/Localizable.strings | Bin 60936 -> 65928 bytes .../damus/en-US.lproj/Localizable.stringsdict | 144 +++++++++++ damusTests/EventGroupViewTests.swift | 42 ++++ devtools/export-source-translation.sh | 2 +- 10 files changed, 638 insertions(+), 38 deletions(-) create mode 100644 damus/en-US.lproj/Localizable.strings create mode 100644 damusTests/EventGroupViewTests.swift diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index fdf1096e..c76341d3 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 3A3040EF29A8FEE9008A0F29 /* EventDetailBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040EE29A8FEE9008A0F29 /* EventDetailBarTests.swift */; }; 3A3040F129A8FF97008A0F29 /* LocalizationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040F029A8FF97008A0F29 /* LocalizationUtil.swift */; }; 3A3040F329A91366008A0F29 /* ProfileViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040F229A91366008A0F29 /* ProfileViewTests.swift */; }; + 3A30410129AB12AA008A0F29 /* EventGroupViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A30410029AB12AA008A0F29 /* EventGroupViewTests.swift */; }; 3A4325A82961E11400BFCD9D /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 3A4325AA2961E11400BFCD9D /* Localizable.stringsdict */; }; 3AA247FD297E3CFF0090C62D /* RepostsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA247FC297E3CFF0090C62D /* RepostsModel.swift */; }; 3AA247FF297E3D900090C62D /* RepostsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA247FE297E3D900090C62D /* RepostsView.swift */; }; @@ -280,6 +281,8 @@ 3A3040FC29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/InfoPlist.strings"; sourceTree = ""; }; 3A3040FD29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-TW"; path = "zh-TW.lproj/Localizable.stringsdict"; sourceTree = ""; }; 3A3040FE29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/Localizable.strings"; sourceTree = ""; }; + 3A3040FF29AB02D1008A0F29 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/Localizable.strings"; sourceTree = ""; }; + 3A30410029AB12AA008A0F29 /* EventGroupViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventGroupViewTests.swift; sourceTree = ""; }; 3A41E559299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/InfoPlist.strings; sourceTree = ""; }; 3A41E55A299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; 3A41E55B299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = id; path = id.lproj/Localizable.stringsdict; sourceTree = ""; }; @@ -1032,6 +1035,7 @@ 3A3040EC29A5CB86008A0F29 /* ReplyDescriptionTests.swift */, 3A3040EE29A8FEE9008A0F29 /* EventDetailBarTests.swift */, 3A3040F229A91366008A0F29 /* ProfileViewTests.swift */, + 3A30410029AB12AA008A0F29 /* EventGroupViewTests.swift */, ); path = damusTests; sourceTree = ""; @@ -1490,6 +1494,7 @@ buildActionMask = 2147483647; files = ( 3A3040ED29A5CB86008A0F29 /* ReplyDescriptionTests.swift in Sources */, + 3A30410129AB12AA008A0F29 /* EventGroupViewTests.swift in Sources */, 3ACBCB78295FE5C70037388A /* TimeAgoTests.swift in Sources */, DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */, 3A3040EF29A8FEE9008A0F29 /* EventDetailBarTests.swift in Sources */, @@ -1604,6 +1609,7 @@ 3A827A19299FC69D00C4D171 /* ru */, 3A3040FA29A91EFC008A0F29 /* zh-HK */, 3A3040FE29A91F31008A0F29 /* zh-TW */, + 3A3040FF29AB02D1008A0F29 /* en-US */, ); name = Localizable.strings; sourceTree = ""; diff --git a/damus/Util/LocalizationUtil.swift b/damus/Util/LocalizationUtil.swift index de496d60..9f729b34 100644 --- a/damus/Util/LocalizationUtil.swift +++ b/damus/Util/LocalizationUtil.swift @@ -7,8 +7,12 @@ import Foundation -func bundleForLocale(locale: Locale) -> Bundle { - let path = Bundle.main.path(forResource: locale.identifier, ofType: "lproj") +func bundleForLocale(locale: Locale?) -> Bundle { + if locale == nil { + return Bundle.main + } + + let path = Bundle.main.path(forResource: locale!.identifier, ofType: "lproj") return path != nil ? (Bundle(path: path!) ?? Bundle.main) : Bundle.main } diff --git a/damus/Views/Notifications/EventGroupView.swift b/damus/Views/Notifications/EventGroupView.swift index ee36dd1e..d2b466a3 100644 --- a/damus/Views/Notifications/EventGroupView.swift +++ b/damus/Views/Notifications/EventGroupView.swift @@ -46,62 +46,86 @@ func determine_reacting_to(our_pubkey: String, ev: NostrEvent?) -> ReactingTo { return .tagged_in } -func determine_reacting_to_text(_ r: ReactingTo) -> String { - switch r { - case .tagged_in: - return "a post you were tagged in" - case .your_post: - return "your post" - case .your_profile: - return "your profile" - } -} - func event_author_name(profiles: Profiles, _ ev: NostrEvent) -> String { let alice_pk = ev.pubkey let alice_prof = profiles.lookup(id: alice_pk) return Profile.displayName(profile: alice_prof, pubkey: alice_pk) } -func reacting_to_text(profiles: Profiles, our_pubkey: String, group: EventGroupType, ev: NostrEvent?) -> String { +/** + Returns a notification string describing user actions in response to an event group type. + + The localization keys read by this function are the following (although some keys may not actually be used in practice): + + "??" - returned when there are no events associated with the specified event group type. + + "reacted_tagged_in_1" - returned when 1 reaction occurred to a post that the current user was tagged in + "reacted_tagged_in_2" - returned when 2 reactions occurred to a post that the current user was tagged in + "reacted_tagged_in_3" - returned when 3 or more reactions occurred to a post that the current user was tagged in + "reacted_your_post_1" - returned when 1 reaction occurred to the current user's post + "reacted_your_post_2" - returned when 2 reactions occurred to the current user's post + "reacted_your_post_3" - returned when 3 or more reactions occurred to the current user's post + "reacted_your_profile_1" - returned when 1 reaction occurred to the current user's profile + "reacted_your_profile_2" - returned when 2 reactions occurred to the current user's profile + "reacted_your_profile_3" - returned when 3 or more reactions occurred to the current user's profile + + "reposted_tagged_in_1" - returned when 1 repost occurred to a post that the current user was tagged in + "reposted_tagged_in_2" - returned when 2 reposts occurred to a post that the current user was tagged in + "reposted_tagged_in_3" - returned when 3 or more reposts occurred to a post that the current user was tagged in + "reposted_your_post_1" - returned when 1 repost occurred to the current user's post + "reposted_your_post_2" - returned when 2 reposts occurred to the current user's post + "reposted_your_post_3" - returned when 3 or more reposts occurred to the current user's post + "reposted_your_profile_1" - returned when 1 repost occurred to the current user's profile + "reposted_your_profile_2" - returned when 2 reposts occurred to the current user's profile + "reposted_your_profile_3" - returned when 3 or more reposts occurred to the current user's profile + + "zapped_tagged_in_1" - returned when 1 zap occurred to a post that the current user was tagged in + "zapped_tagged_in_2" - returned when 2 zaps occurred to a post that the current user was tagged in + "zapped_tagged_in_3" - returned when 3 or more zaps occurred to a post that the current user was tagged in + "zapped_your_post_1" - returned when 1 zap occurred to the current user's post + "zapped_your_post_2" - returned when 2 zaps occurred to the current user's post + "zapped_your_post_3" - returned when 3 or more zaps occurred to the current user's post + "zapped_your_profile_1" - returned when 1 zap occurred to the current user's profile + "zapped_your_profile_2" - returned when 2 zaps occurred to the current user's profile + "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 { let verb = reacting_to_verb(group: group) - let reacting_to = determine_reacting_to(our_pubkey: our_pubkey, ev: ev) - let target = determine_reacting_to_text(reacting_to) - - if group.events.count == 1 { + let localization_key = "\(verb)_\(reacting_to)_\(min(group.events.count, 3))" + let bundle = bundleForLocale(locale: locale) + + switch group.events.count { + case 0: + return NSLocalizedString("??", comment: "") + case 1: let ev = group.events.first! let profile = profiles.lookup(id: ev.pubkey) let display_name = Profile.displayName(profile: profile, pubkey: ev.pubkey) - return String(format: "%@ is %@ %@", display_name, verb, target) - } - - if group.events.count == 2 { + + 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) + case 2: let alice_name = event_author_name(profiles: profiles, group.events[0]) let bob_name = event_author_name(profiles: profiles, group.events[1]) - - return String(format: "%@ and %@ are %@ %@", alice_name, bob_name, verb, target) - } - - if group.events.count > 2 { + + 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) + default: let alice_name = event_author_name(profiles: profiles, group.events.first!) let count = group.events.count - 1 - - return String(format: "%@ and %d other people are %@ %@", alice_name, count, verb, target) + + 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 "??" } func reacting_to_verb(group: EventGroupType) -> String { switch group { case .reaction: - return "reacting" + return "reacted" case .repost: - return "reposting" + return "reposted" case .zap: fallthrough case .profile_zap: - return "zapping" + return "zapped" } } @@ -111,7 +135,7 @@ struct EventGroupView: View { let group: EventGroupType var GroupDescription: some View { - Text(reacting_to_text(profiles: state.profiles, our_pubkey: state.pubkey, group: group, ev: event)) + Text(verbatim: "\(reacting_to_text(profiles: state.profiles, our_pubkey: state.pubkey, group: group, ev: event))") } func ZapIcon(_ zapgrp: ZapGroup) -> some View { @@ -168,8 +192,9 @@ struct EventGroupView: View { } let test_encoded_post = "{\"id\": \"8ba545ab96959fe0ce7db31bc10f3ac3aa5353bc4428dbf1e56a7be7062516db\",\"pubkey\": \"7e27509ccf1e297e1df164912a43406218f8bd80129424c3ef798ca3ef5c8444\",\"created_at\": 1677013417,\"kind\": 1,\"tags\": [],\"content\": \"hello\",\"sig\": \"93684f15eddf11f42afbdd81828ee9fc35350344d8650c78909099d776e9ad8d959cd5c4bff7045be3b0b255144add43d0feef97940794a1bc9c309791bebe4a\"}" -let test_repost = NostrEvent(id: "", content: test_encoded_post, pubkey: "", kind: 6, tags: [], createdAt: 1) -let test_reposts = [test_repost, test_repost] +let test_repost_1 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk1", kind: 6, tags: [], createdAt: 1) +let test_repost_2 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk2", kind: 6, tags: [], createdAt: 1) +let test_reposts = [test_repost_1, test_repost_2] let test_event_group = EventGroup(events: test_reposts) struct EventGroupView_Previews: PreviewProvider { diff --git a/damus/en-US.lproj/Localizable.strings b/damus/en-US.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..17fd6e3eb5baeacc07a884900e88a76448314ba5 GIT binary patch literal 4782 zcmdT`?P|h65ZvEB#Sth4|498?3VnjULI~EjLQ#o|*oSXBcj213uJ0(we zXL2Xcc*bOULe2-+9uZgD>)dN>Ww0}OL>3d|65FvkaBPLTwwO%ney8i%yw$S;z0|DU zx`S=aS#?$V7+-H3uaDx`uX!%gsjVxEF_gyf{N0Mt8l$A?ovX7ioc%3cDKy5h{2gmg zH1Followers + reacted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to a post you were tagged in + other + %2$@ and %1$d others reacted to a post you were tagged in + + + reacted_your_post_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your post + other + %2$@ and %1$d others reacted to your post + + + reacted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your profile + other + %2$@ and %1$d others reacted to your profile + + reactions_count NSStringLocalizedFormatKey @@ -82,6 +130,54 @@ Replying to %2$@, %3$@ & %1$d others + reposted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted a post you were tagged in + other + %2$@ and %1$d others reposted a post you were tagged in + + + reposted_your_post_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your post + other + %2$@ and %1$d others reposted your post + + + reposted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your profile + other + %2$@ and %1$d others reposted your profile + + reposts_count NSStringLocalizedFormatKey @@ -114,6 +210,54 @@ %2$@ sats + zapped_tagged_in_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped a post you were tagged in + other + %2$@ and %1$d others zapped a post you were tagged in + + + zapped_your_post_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your post + other + %2$@ and %1$d others zapped your post + + + zapped_your_profile_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your profile + other + %2$@ and %1$d others zapped your profile + + zaps_count NSStringLocalizedFormatKey diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index e9a01b82..acd00a92 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -32,6 +32,11 @@ + + %@ + %@ + No comment provided by engineer. + %@ %@ %@ %@ @@ -73,6 +78,11 @@ Sentence composed of 2 variables to describe how many people are following a use '%@' is an invalid NIP-05 identifier. It should look like an email. Description of why the nip05 identifier is invalid. + + ?? + ?? + No comment provided by engineer. + API Key (optional) API Key (optional) @@ -1209,6 +1219,66 @@ Label for filter for seeing your posts and replies (instead of only your posts). optional Label indicating that a form input is optional. + + %@ reacted to a post you were tagged in + %@ reacted to a post you were tagged in + Notification that a user reacted to a post that the current user was tagged in + + + %@ and %@ reacted to a post you were tagged in + %@ and %@ reacted to a post you were tagged in + Notification that 2 users reacted to a post that the current user was tagged in + + + %@ reacted to your post + %@ reacted to your post + Notification that a user reacted to the current user's post + + + %@ and %@ reacted to your post + %@ and %@ reacted to your post + Notification that 2 users reacted to the current user's profile + + + %@ reacted to your profile + %@ reacted to your profile + Notification that a user reacted to the current user's profile + + + %@ and %@ reacted to your profile + %@ and %@ reacted to your profile + Notification that 2 users reacted to the current user's profile + + + %@ reposted a post you were tagged in + %@ reposted a post you were tagged in + Notification that a user reposted a post that the current user was tagged in + + + %@ and %@ reposted a post you were tagged in + %@ and %@ reposted a post you were tagged in + Notification that 2 users reposted a post that the current user was tagged in + + + %@ reposted your post + %@ reposted your post + Notification that a user reposted the current user's post + + + %@ and %@ reposted your post + %@ and %@ reposted your post + Notification that 2 users reposted the current user's post + + + %@ reposted your profile + %@ reposted your profile + Notification that a user reposted the current user's profile + + + %@ and %@ reposted your profile + %@ and %@ reposted your profile + Notification that 2 users reposted the current user's profile + satoshi satoshi @@ -1224,6 +1294,36 @@ Label for filter for seeing your posts and replies (instead of only your posts). you You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. + + %@ zapped a post you were tagged in + %@ zapped a post you were tagged in + Notification that a user zapped a post that the current user was tagged in + + + %@ and %@ zapped a post you were tagged in + %@ and %@ zapped a post you were tagged in + Notification that 2 users zapped a post that the current user was tagged in + + + %@ zapped your post + %@ zapped your post + Notification that a user zapped the current user's post + + + %@ and %@ zapped your post + %@ and %@ zapped your post + Notification that 2 users zapped the current user's post + + + %@ zapped your profile + %@ zapped your profile + Notification that a user zapped the current user's profile + + + %@ and %@ zapped your profile + %@ and %@ zapped your profile + Notification that 2 users zapped the current user's profile + ⚡️ %@ ⚡️ %@ @@ -1266,6 +1366,51 @@ Label for filter for seeing your posts and replies (instead of only your posts). %#@FOLLOWERS@ + + %#@REACTED@ + %#@REACTED@ + + + + %2$@ and %1$d other reacted to a post you were tagged in + %2$@ and %1$d other reacted to a post you were tagged in + + + + %2$@ and %1$d others reacted to a post you were tagged in + %2$@ and %1$d others reacted to a post you were tagged in + + + + %#@REACTED@ + %#@REACTED@ + + + + %2$@ and %1$d other reacted to your post + %2$@ and %1$d other reacted to your post + + + + %2$@ and %1$d others reacted to your post + %2$@ and %1$d others reacted to your post + + + + %#@REACTED@ + %#@REACTED@ + + + + %2$@ and %1$d other reacted to your profile + %2$@ and %1$d other reacted to your profile + + + + %2$@ and %1$d others reacted to your profile + %2$@ and %1$d others reacted to your profile + + %#@REACTIONS@ %#@REACTIONS@ @@ -1311,6 +1456,51 @@ Label for filter for seeing your posts and replies (instead of only your posts). Replying to %2$@, %3$@ & %1$d others + + %#@REPOSTED@ + %#@REPOSTED@ + + + + %2$@ and %1$d other reposted a post you were tagged in + %2$@ and %1$d other reposted a post you were tagged in + + + + %2$@ and %1$d others reposted a post you were tagged in + %2$@ and %1$d others reposted a post you were tagged in + + + + %#@REPOSTED@ + %#@REPOSTED@ + + + + %2$@ and %1$d other reposted your post + %2$@ and %1$d other reposted your post + + + + %2$@ and %1$d others reposted your post + %2$@ and %1$d others reposted your post + + + + %#@REPOSTED@ + %#@REPOSTED@ + + + + %2$@ and %1$d other reposted your profile + %2$@ and %1$d other reposted your profile + + + + %2$@ and %1$d others reposted your profile + %2$@ and %1$d others reposted your profile + + %#@REPOSTS@ %#@REPOSTS@ @@ -1341,6 +1531,51 @@ Label for filter for seeing your posts and replies (instead of only your posts). %2$@ sats + + %#@ZAPPED@ + %#@ZAPPED@ + + + + %2$@ and %1$d other zapped a post you were tagged in + %2$@ and %1$d other zapped a post you were tagged in + + + + %2$@ and %1$d others zapped a post you were tagged in + %2$@ and %1$d others zapped a post you were tagged in + + + + %#@ZAPPED@ + %#@ZAPPED@ + + + + %2$@ and %1$d other zapped your post + %2$@ and %1$d other zapped your post + + + + %2$@ and %1$d others zapped your post + %2$@ and %1$d others zapped your post + + + + %#@ZAPPED@ + %#@ZAPPED@ + + + + %2$@ and %1$d other zapped your profile + %2$@ and %1$d other zapped your profile + + + + %2$@ and %1$d others zapped your profile + %2$@ and %1$d others zapped your profile + + %#@ZAPS@ %#@ZAPS@ 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 index d13f961a855c88e6b2b16bad68579d7b08a31241..3bf2ad9956ab1e2238f98d006a90db60e2f87f48 100644 GIT binary patch delta 3216 zcmb_eK}#D^5FXK9YyvUHR2wYYU@6!`YD(!rOT2mz!PbgYS%XcrQreJcMU5ErB1o$+ zzd*crDip6C{Rtj=C`JE5e?Z%LFIh9$yxsS9m1Xmm-8VDeeBaFE?fq)s+wHjX?{5YM zF-U?KWFjn6?(r&S8eA9_(Zz~ zAp@O|cKNZ%Ph+nQVy_KDw9kTGB8n;&`)Y^62 zrU||peMHr5&-~Q#2wjnvd8)5bDTP#ZurEv#G0PHaXl) ztGIJm65U|eJIRDSW~XBAiHaibJ z+_uisTyRV}j(8Lgeti2BvHGd^+A# zeaX=J_M_x%ieq9`>gq)k)|fRi3?VvEB3lT9%!DrwoPsN54@xxS4jNXe0XbrpoS%T* zC(*nOiblta3tKz=58>D3tEf1>UZ3Fc>U%dFollowers + reacted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to a post you were tagged in + other + %2$@ and %1$d others reacted to a post you were tagged in + + + reacted_your_post_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your post + other + %2$@ and %1$d others reacted to your post + + + reacted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your profile + other + %2$@ and %1$d others reacted to your profile + + reactions_count NSStringLocalizedFormatKey @@ -82,6 +130,54 @@ Replying to %2$@, %3$@ & %1$d others + reposted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted a post you were tagged in + other + %2$@ and %1$d others reposted a post you were tagged in + + + reposted_your_post_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your post + other + %2$@ and %1$d others reposted your post + + + reposted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your profile + other + %2$@ and %1$d others reposted your profile + + reposts_count NSStringLocalizedFormatKey @@ -114,6 +210,54 @@ %2$@ sats + zapped_tagged_in_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped a post you were tagged in + other + %2$@ and %1$d others zapped a post you were tagged in + + + zapped_your_post_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your post + other + %2$@ and %1$d others zapped your post + + + zapped_your_profile_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your profile + other + %2$@ and %1$d others zapped your profile + + zaps_count NSStringLocalizedFormatKey diff --git a/damusTests/EventGroupViewTests.swift b/damusTests/EventGroupViewTests.swift new file mode 100644 index 00000000..6ccdcf6c --- /dev/null +++ b/damusTests/EventGroupViewTests.swift @@ -0,0 +1,42 @@ +// +// EventGroupViewTests.swift +// damusTests +// +// Created by Terry Yiu on 2/26/23. +// + +import XCTest +@testable import damus + +final class EventGroupViewTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testReactingToText() throws { + let enUsLocale = Locale(identifier: "en-US") + let damusState = test_damus_state() + + let encodedPost = "{\"id\": \"8ba545ab96959fe0ce7db31bc10f3ac3aa5353bc4428dbf1e56a7be7062516db\",\"pubkey\": \"7e27509ccf1e297e1df164912a43406218f8bd80129424c3ef798ca3ef5c8444\",\"created_at\": 1677013417,\"kind\": 1,\"tags\": [],\"content\": \"hello\",\"sig\": \"93684f15eddf11f42afbdd81828ee9fc35350344d8650c78909099d776e9ad8d959cd5c4bff7045be3b0b255144add43d0feef97940794a1bc9c309791bebe4a\"}" + let repost1 = NostrEvent(id: "", content: encodedPost, pubkey: "pk1", kind: NostrKind.boost.rawValue, tags: [], createdAt: 1) + let repost2 = NostrEvent(id: "", content: encodedPost, pubkey: "pk2", kind: NostrKind.boost.rawValue, tags: [], createdAt: 1) + + XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [])), ev: test_event, locale: enUsLocale), "??") + XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1])), ev: test_event, locale: enUsLocale), "pk1:pk1 reposted a post you were tagged in") + XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2])), ev: test_event, locale: enUsLocale), "pk1:pk1 and pk2:pk2 reposted a post you were tagged in") + XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2, repost2])), ev: test_event, locale: enUsLocale), "pk1:pk1 and 2 others reposted a post you were tagged in") + + Bundle.main.localizations.map { Locale(identifier: $0) }.forEach { + XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [])), ev: test_event, locale: $0), "??") + XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1])), ev: test_event, locale: $0)) + XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2])), ev: test_event, locale: $0)) + XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2, repost2])), ev: test_event, locale: $0)) + } + } + +} diff --git a/devtools/export-source-translation.sh b/devtools/export-source-translation.sh index b1a9b49f..e443317d 100755 --- a/devtools/export-source-translation.sh +++ b/devtools/export-source-translation.sh @@ -4,4 +4,4 @@ xcodebuild -exportLocalizations -project damus.xcodeproj -localizationPath "damus" -exportLanguage en-US # Generates all SwiftUI Text() wrapped localized strings. -genstrings -o "damus/en-US.xcloc/Source Contents/damus/en-US.lproj/" -SwiftUI **/*.swift +genstrings -a -d -o "damus/en-US.xcloc/Source Contents/damus/en-US.lproj/" -SwiftUI **/*.swift From f840fe9c80b6d0c29f5e0c3dc771973813f9e37b Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:29:55 +1300 Subject: [PATCH 15/65] Update source English strings per feedback from translators --- damus/Views/Events/EventMenu.swift | 6 ++-- .../Localized Contents/en-US.xliff | 20 +++++------ .../damus/en-US.lproj/Localizable.strings | Bin 60936 -> 60986 bytes transifex.yml | 34 +++++++++--------- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/damus/Views/Events/EventMenu.swift b/damus/Views/Events/EventMenu.swift index 57228d91..1669241a 100644 --- a/damus/Views/Events/EventMenu.swift +++ b/damus/Views/Events/EventMenu.swift @@ -47,9 +47,9 @@ struct EventMenuContext: View { notify(.update_bookmarks, event) } label: { let imageName = isBookmarked ? "bookmark.fill" : "bookmark" - let unBookmarkString = NSLocalizedString("Un-Bookmark", comment: "Context menu option for un-bookmarking a note") - let bookmarkString = NSLocalizedString("Bookmark", comment: "Context menu option for bookmarking a note") - Label(isBookmarked ? unBookmarkString : bookmarkString, systemImage: imageName) + let removeBookmarkString = NSLocalizedString("Remove Bookmark", comment: "Context menu option for removing a note bookmark.") + let addBookmarkString = NSLocalizedString("Add Bookmark", comment: "Context menu option for adding a note bookmark.") + Label(isBookmarked ? removeBookmarkString : addBookmarkString, systemImage: imageName) } .onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 1) { diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index e9a01b82..0ce1a9f5 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -119,6 +119,11 @@ Sentence composed of 2 variables to describe how many people are following a use Button to add recommended relay server. Button to confirm adding user inputted relay. + + Add Bookmark + Add Bookmark + Context menu option for adding a note bookmark. + Add Relay Add Relay @@ -201,11 +206,6 @@ Sentence composed of 2 variables to describe how many people are following a use Blue Wallet Dropdown option label for Lightning wallet, Blue Wallet. - - Bookmark - Bookmark - Context menu option for bookmarking a note - Bookmarks Bookmarks @@ -785,6 +785,11 @@ Label for filter for seeing your posts and replies (instead of only your posts). Relays have been notified and clients will be able to use this information to filter content. Thank you! Description of what was done as a result of sending a report to relay servers. + + Remove Bookmark + Remove Bookmark + Context menu option for removing a note bookmark. + Remove all Remove all @@ -1052,11 +1057,6 @@ Label for filter for seeing your posts and replies (instead of only your posts). URL Example URL to LibreTranslate server - - Un-Bookmark - Un-Bookmark - Context menu option for un-bookmarking a note - Unfollow Unfollow 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 index d13f961a855c88e6b2b16bad68579d7b08a31241..cf836b489db95f455ee4da1c973a1dab660d6a27 100644 GIT binary patch delta 151 zcmeCU!@TPb^9Bvs$pvNxlS5>MCeOLbHM!-vfU+Kg0)rNVJ_8qn5`!Z{3J@wVI5Fe{ zVKzf9Ln1>FL-u4wS>efXI&zaAsETa1kzK_%`GKb1=2bdZ3c;owSj57b3she=x&Nv- i$jr$`^Q8FE%?O+)2{L1I-MlkqlLaJ2HnUx0k^lg|w=bjs delta 131 zcmdmWhq>bp^9Bvs$rIE>HouWw#W&f(%3yMdtia@^3bDy=WH=@Z&6fgVp~+`tc_vTL z(%XDQ=Stz^I9-Fy9rNdyfmDl@GUPGnG9)qN17S8pE<++i5kvOm#tLzee%4Ts>}0|D S(r}hA*en4_k.lproj/ + source_file_dir: 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/' + translation_files_expression: 'damus/.lproj/' - filter_type: dir file_format: STRINGS source_file_extension: strings source_language: en_US - source_file_dir: damus/en-US.xcloc/Source Contents/damus/en-US.lproj/ - translation_files_expression: damus/.lproj/ + source_file_dir: 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/' + translation_files_expression: 'damus/.lproj/' -settings: - language_mapping: - de_AT: de-AT - el_GR: el-GR - es_419: es-419 - fr_FR: fr-FR - it_IT: it-IT - lv_LV: lv-LV - pl_PL: pl-PL - pt_PT: pt-PT - tr_TR: tr-TR - zh_CN: zh-CN + settings: + language_mapping: + en_US: en-US + el_GR: el-GR + es_419: es-419 + fr_FR: fr-FR + it_IT: it-IT + lv_LV: lv-LV + pl_PL: pl-PL + pt_PT: pt-PT + tr_TR: tr-TR + zh_CN: zh-CN + zh_HK: zh-HK + zh_TW: zh-TW \ No newline at end of file From 16156f4d9ae04f30ae8ff44b9ccc5ef3a3876042 Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Sun, 26 Feb 2023 08:21:33 +1300 Subject: [PATCH 16/65] Fix number formatting for Arabic and other languages --- damus/Util/LocalizationUtil.swift | 6 ------ damus/Views/ActionBar/EventDetailBar.swift | 9 +++------ damus/Views/ProfileView.swift | 9 +++------ .../Localized Contents/en-US.xliff | 5 +++++ .../damus/en-US.lproj/Localizable.strings | Bin 60986 -> 61370 bytes 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/damus/Util/LocalizationUtil.swift b/damus/Util/LocalizationUtil.swift index de496d60..3abb3e9a 100644 --- a/damus/Util/LocalizationUtil.swift +++ b/damus/Util/LocalizationUtil.swift @@ -11,9 +11,3 @@ 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 formatInt(_ int: Int) -> String { - let numberFormatter = NumberFormatter() - numberFormatter.numberStyle = .decimal - return numberFormatter.string(from: NSNumber(integerLiteral: int)) ?? "\(int)" -} diff --git a/damus/Views/ActionBar/EventDetailBar.swift b/damus/Views/ActionBar/EventDetailBar.swift index c9005855..799f0925 100644 --- a/damus/Views/ActionBar/EventDetailBar.swift +++ b/damus/Views/ActionBar/EventDetailBar.swift @@ -26,18 +26,16 @@ struct EventDetailBar: View { HStack { if bar.boosts > 0 { NavigationLink(destination: RepostsView(damus_state: state, model: RepostsModel(state: state, target: target))) { - let count = Text(verbatim: "\(formatInt(bar.boosts))").font(.body.bold()) let noun = Text(verbatim: "\(repostsCountString(bar.boosts))").foregroundColor(.gray) - Text("\(count) \(noun)", comment: "Sentence composed of 2 variables to describe how many reposts. In source English, the first variable is the number of reposts, and the second variable is 'Repost' or 'Reposts'.") + Text("\(Text("\(bar.boosts)").font(.body.bold())) \(noun)", comment: "Sentence composed of 2 variables to describe how many reposts. In source English, the first variable is the number of reposts, and the second variable is 'Repost' or 'Reposts'.") } .buttonStyle(PlainButtonStyle()) } if bar.likes > 0 { NavigationLink(destination: ReactionsView(damus_state: state, model: ReactionsModel(state: state, target: target))) { - let count = Text(verbatim: "\(formatInt(bar.likes))").font(.body.bold()) let noun = Text(verbatim: "\(reactionsCountString(bar.likes))").foregroundColor(.gray) - Text("\(count) \(noun)", comment: "Sentence composed of 2 variables to describe how many reactions there are on a post. In source English, the first variable is the number of reactions, and the second variable is 'Reaction' or 'Reactions'.") + Text("\(Text("\(bar.likes)").font(.body.bold())) \(noun)", comment: "Sentence composed of 2 variables to describe how many reactions there are on a post. In source English, the first variable is the number of reactions, and the second variable is 'Reaction' or 'Reactions'.") } .buttonStyle(PlainButtonStyle()) } @@ -45,9 +43,8 @@ struct EventDetailBar: View { if bar.zaps > 0 { let dst = ZapsView(state: state, target: .note(id: target, author: target_pk)) NavigationLink(destination: dst) { - let count = Text(verbatim: "\(formatInt(bar.zaps))").font(.body.bold()) let noun = Text(verbatim: "\(zapsCountString(bar.zaps))").foregroundColor(.gray) - Text("\(count) \(noun)", comment: "Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.") + Text("\(Text("\(bar.zaps)").font(.body.bold())) \(noun)", comment: "Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.") } .buttonStyle(PlainButtonStyle()) } diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift index 7fe3b55c..8e4c3272 100644 --- a/damus/Views/ProfileView.swift +++ b/damus/Views/ProfileView.swift @@ -342,9 +342,8 @@ struct ProfileView: View { .foregroundColor(.gray) } else { let followerCount = followers.count! - let count_text = Text(verbatim: "\(formatInt(followerCount))").font(.subheadline.weight(.medium)) let noun_text = Text(verbatim: "\(followersCountString(followerCount))").font(.subheadline).foregroundColor(.gray) - Text("\(count_text) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many people are following a user. In source English, the first variable is the number of followers, and the second variable is 'Follower' or 'Followers'.") + Text("\(Text("\(followerCount)").font(.subheadline.weight(.medium))) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many people are following a user. In source English, the first variable is the number of followers, and the second variable is 'Follower' or 'Followers'.") } } } @@ -368,9 +367,8 @@ struct ProfileView: View { let following_model = FollowingModel(damus_state: damus_state, contacts: contacts) NavigationLink(destination: FollowingView(damus_state: damus_state, following: following_model, whos: profile.pubkey)) { HStack { - let count_text = Text(verbatim: "\(formatInt(profile.following))").font(.subheadline.weight(.medium)) let noun_text = Text("Following", comment: "Text on the user profile page next to the number of accounts a user is following.").font(.subheadline).foregroundColor(.gray) - Text("\(count_text) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'.") + Text("\(Text("\(profile.following)").font(.subheadline.weight(.medium))) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'.") } } .buttonStyle(PlainButtonStyle()) @@ -393,9 +391,8 @@ struct ProfileView: View { if let relays = profile.relays { // Only open relay config view if the user is logged in with private key and they are looking at their own profile. - let count_text = Text(verbatim: "\(formatInt(relays.keys.count))").font(.subheadline.weight(.medium)) let noun_text = Text(verbatim: "\(relaysCountString(relays.keys.count))").font(.subheadline).foregroundColor(.gray) - let relay_text = Text("\(count_text) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'.") + let relay_text = Text("\(Text("\(relays.keys.count)").font(.subheadline.weight(.medium))) \(noun_text)", comment: "Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'.") if profile.pubkey == damus_state.pubkey && damus_state.is_privkey_user { NavigationLink(destination: RelayConfigView(state: damus_state)) { relay_text diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index 0ce1a9f5..686f43af 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -58,6 +58,11 @@ Sentence composed of 2 variables to describe how many people are following a use %@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet. Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. + + %lld + %lld + No comment provided by engineer. + %lld/%lld %lld/%lld 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 index cf836b489db95f455ee4da1c973a1dab660d6a27..c4ac875aab91ec67f8ec58d23d45ed17451c0b0d 100644 GIT binary patch delta 383 zcmdmWhk4h1W~TrDCQlFx5L9JwU{GREV6X*ZB?cgGa$}qH*sR30jbm~` z3(Mpcj2WBPF)v}<{EclIle!*58bdxq9zzL(27?|$5|Ew3Pzhz_0NEN0njkp2n^V$| zNVP!gRT+#JRDcc$Y!L?9m$k9XhIz7vzS!mrRx!p<1qLk!eFiRw8-Z3KJD`}M6zGTy zhE#?`pyfFXnLwwd0@aiQ$xMcHpbW&Jxj=pjP^6S07vaD_Dw&1wz~+-e&6$%IWZ6u< ZSCcS#K?2+4pqhZm6WVw-d)0m@005xCSjGSV delta 79 zcmdmWpLy3EW~TrDHm~E`z`Xe%=K{vfaY8zblRX4VHqYXo#WeYWu*75s5sAqH9XuQB j1UNTGh?HbbR!Cx-oL3hxSs}+}GDlqkNOJS3x(@{aA?P2y From 01630d0a4ce6ff49cf1dc1dd09b231186b4e83f1 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 00:27:17 +0000 Subject: [PATCH 17/65] Apply translations in zh_CN translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'zh_CN' language. --- damus/zh-CN.lproj/Localizable.strings | Bin 55408 -> 55968 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/zh-CN.lproj/Localizable.strings b/damus/zh-CN.lproj/Localizable.strings index e62687a6bfdafe0be128b22a41d839afa6be5618..c6d1a9bcd8003ec716e0e653b3486badf9b41d94 100644 GIT binary patch delta 945 zcmZWnKTK0$5WiA{*Gg-BQHoZ|;{}^Sp-={micK}dU?N0;#?&}aq_oxkOKB-hFksZl zp-s<_*f6wC4i1nHjRP@m>LlpmV2Fc*ql3`_L%pwHUoE-3_uYMW_q)5_cRyCtg%|4j z(oSgyvyE|P)j8FyK`5y3?0YSX8DteMX%p9iA4 z7xaRburI(Ai3AsGVwCFJ;lk)C--n0jIwrFR<~kkbJME_0_!+{Og&_DKg~cbWL$x)l z{8iQWqbPNG%`+Zc%sJUho6vwG4(s84sCduO-Yn4+Ard7waP51RJ$H1-IDcEf!JGYf zwfP3lyPMEzG~ll>5zSxjM4?F|X`l?=Fyntq@Zfy_@+tecWR!ub9Mq z{!Sa;6%8-LTbaep4dbC2o^d#5l55{e0o_hdE%Dc4i@8589LV>fJ$YoI27`v;V?^mc zSsrO`TS({o_irCP6pm0o6I=&!;o8lo2t7SteOx`kAf75&oCRD!6bB`^?Av{cd* zO;KEe2$80S8l$F${(@+1NjtxklBR};%f0u!IOlV}_vnIqJ>z7Bd?Ak+qlG=GLKV!# z)kxW!Voz$dLlD9cf>p4A9cIX$g|(6;kZl8AT)3mE=YLrXCVa0opo%+Ll-8dE+z3NZp$fH|0^!2&E2)*RI&=v;(($`m1&$)BZ243@v) z#{Q^R5uT0L<~Yop=&|ac35^prOnQ4ZCrJ$tL`b6`jTb)QM35+~kT*@bx#<+~Y!oT4 z>j%@1NatrneDD(0uYp*RpeKf@o2a;zZWD}>FVG5$BH*33`d=Bg;@j)ZZZizfhpFk? z+DV+l6GKT84_;~18c~xXH;)pZPH!gaA=+jr%K$ok7EFy)q4QYD9J;I=H(XjwwJ6z9 zqqLF*_&x=mCM|5x@zRPLyK2mN?Q#!^8NvPgZVc-5X{j5t8YLyPX}^N?`Y!9(<9tI0 R26zX%#hml2;nK{vPA#@ From 8cc561b8c6fa6fe881399c29a203eaabd7c9e1a4 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 03:07:55 +0000 Subject: [PATCH 18/65] Apply translations in ja translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ja' language. --- damus/ja.lproj/Localizable.strings | Bin 57160 -> 57786 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ja.lproj/Localizable.strings b/damus/ja.lproj/Localizable.strings index b2b85e53bbebb4391b079c215a94a380226d1921..bce557ecbddc9baa6ac786e126f1c51bd87192a3 100644 GIT binary patch delta 1011 zcmZuwUr1A76hFFIx4GF|x>?P38wtZ~9_%5A8Y)9WMZ>I!qMBv8Y@5xi=8Gfnp)4>w zVPFp}7(Ga0@jYcBfe=E3L7-?L6xBmdRu6$J?cD3X+l-HU@ArMb-}gJ``<-(q#|>i> z2IKP5@)Bi9QSrp$Gl*U(o<_q{CR(^}7K>JU8s%gvLN*Ph(`R!Yxh;7V_n67&w$b9d zW6#?XTgAL>(m=AXk#j0b_;=1_(0IZ__YO-`<+9P;8B=v5M0m792m%o0uNPz}gkms( z8_M7^4;ji+IBwoM%8whSaRNti9+UiT6`8J&7W!W3-JN=%oynaLgeK@BS17+WHK-0} z=34m8D*q2mL%~8a?#~hS1ADfRT$x45fJAd8w(L!D=y%CpgA8T#W3Yh6{QH>Y6N3l8 zxyc)r=xLRmN-sF6FJ`7M_F76dm}%gYhvJV)w7uRuf3ArWR7V3}<_0J{i$IvND{^W6 zj@8k|E;chFLwFrmAVN1yE=vF|@rXbNV+z%6FQy~6BysL^;|_W)tTcVXdgvO%0k%BI zlx7wQ@j9x>HL-t9>Op9SB1XEPh1V;XLf1dI$hysWUeD4OvSw9Rh5{(n>2COW5^rNG zuHl)-!dO;W46 zk%O+8=y9ckhJ(AbvQ|9!Sx&w>BxiR{EH#kYI_xmN8#VdWHsiV4xofR-h8Z2aZee>> zBh~t>ocXu=Rkd!$70qO|6sn4%nH}O;kcwyX$?BE-8)^68MbxE^HCT>)*n?-0FdYS( k_y$Mt1zY(E-{M#PSE||UKmGA~T6pQ9_d!Y2%q5L~0pa`=+i@95X{?^E)j$w#|Kp z9?FvwLhV=sfB{)Fx$u_ZWD^dJ$wEvvo6m%032!#Zj?mfcFhj|CQjf^yeRuw_003XZ Bs#*X5 From a448f610c0b626a9172c2e9aa9171917cbf4e724 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:05:36 +0000 Subject: [PATCH 19/65] Apply translations in nl translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'nl' language. --- damus/nl.lproj/Localizable.strings | Bin 61466 -> 62216 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings index 79d1271b0c528f26a9e1dbf578136fcc0bd54575..49bfa7b0babdb62d4d64af41414530c4e98b5395 100644 GIT binary patch delta 1071 zcmah|O=wd=5S}zPrfE!GlG;W|$fhxZwST7|YOqxl)Pku5N+qDFeb#9Hn!MJZOM|DP zAea#kJw@=M2SFCWlMoP3Ry=r7|sUEzxb>^jMVp5UECcCpU-^_g9>{7+J_{F$$ zV|`P&WpOuenM~yPqQ8M5mUl&$BndA?L(|~POP1-t_+VI0JH!3zaW>>Df$QI4= zoojFhR$e>h{k;(rX2Zj1@jJt5$bbea2$-T>2ChR2;*g{NL9+G15LloWMq!#h0muLL z!EyiYphh;1kJFddagwx~h8vK8YjB(Ha*)Tz2Lkx}h+A6xRy%$j7_>J-&A#eEt>~O+ zE+bEn^8}?5V7;KGXvkBM0>ZR?vs{fST}7XQCXW(G61hxff~cLLm=v9J zI*v-LsASd95pfwby!hFN!tNR0vQx>85{_*m2?)YS15%y0G0Mcb1fgd1Y`UlXne`6y zyi9UpE`a5zmJ{D}{{IA>--_i~X_60@&w70V<_MRGnc7Z3xmJ348ZX_mU?I967dveD zt6*Aa5s|`qAQ^-c)h0*P`>KueBzery?N#cRS*&*4`UF_?TXe5MKkb+sW=EqqCPF|0 zpMLXVA#7f#vv`v95j6HZ{QMkhT(bJC*FV}L`v9$Zs!Y|n=Z916rPc?N&6$~^%j8Ge V(}`y(Wui?Q=J=J#x8I}fe*hNV`1$|< delta 764 zcmchT(JMo76vvOD2f6b=GsB(D*rbFvo}`^pL}^JW z5A-XKp8ORan35L}Z=S~ajfcyVJm^=yd(QWs&iC{CZaxTmIl=gzf6wD{w>xtiU~VyE z$!r)|K#&aV&Aemqcp(CDn1e--!3z^qhhh1v(x{ffQ#dXhDt9#eavBegoMeLmA$p$f z67V`FV&X(%Gp5QSytmr?dd~$&k#7_xVVwLlm?oM@B3Pn(8m8#aCtHmAFexdB>6!fB znf|@3YM1D{x;=f!Co54nN9F6g6PqZ8)=V24`zuMC_ZT_Bhu#v~EdqI0-Jmq`^~ zsxoee#A2S!C%*?@$13nNBsz4OZqp*(IcreKS#ir{VUj~JW3JwgSG6|OdM!+;mP&Co z+r)ajiaE1kL)(Cz`Pw3Ncy=w~;fRFoYNIJgK_{{0u^C$}GL{)S(XHBXeay^GL-}&H RKW}YftJ&jzcK8%EeE`eDzF7bO From 7d852eb33bb6da526e7d76817cf7a046e7a943ba Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:05:42 +0000 Subject: [PATCH 20/65] Apply translations in nl translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'nl' language. From b4fcb58bcb94377417b41e29a1d72aef0405bda6 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:06:11 +0000 Subject: [PATCH 21/65] Apply translations in nl translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'nl' language. --- damus/nl.lproj/Localizable.strings | Bin 62216 -> 62216 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings index 49bfa7b0babdb62d4d64af41414530c4e98b5395..fee819d4162ce103ea4095dfc836e93f2eb50416 100644 GIT binary patch delta 46 zcmV+}0MY-5<^zc41F$GClm1Eu2Xg>$0CE6jlaZDalR$|KldvchlTa}nlkhMMvyd=& E!lG&s-2eap delta 46 zcmeBp#@z9Yd4q-le<(vHLkU9_Ln=caLkdIc Date: Sat, 25 Feb 2023 12:18:05 +0000 Subject: [PATCH 22/65] Apply translations in ar translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ar' language. --- damus/ar.lproj/Localizable.strings | Bin 59388 -> 60198 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings index 4dc7b22580ab735993121d7acb46c46cda289d9e..30cd8ffb40d0ea5bf068c2f81999fb241a0419da 100644 GIT binary patch delta 1121 zcmaJ=OHWf#5FRX^lnS+69tA|XsYz)IcL6koNs0}KAB#wnzFYx zw>GueyhW3?W}eT|n)2OQn%QDC@q49&Yvzi%=TvwRi_bw$;S){~ z5GRC6L9U)DIN%gP5fatHEgE^nU%>Cm3bi&hY~_b;&%q2w{C&yJ_s5j_%p@k@JV`N% z(i9{kolNUz4=VChq>u`@9`|Ys9+%)npOvp(H}mZ}CI27iTv~s$B0zDh)JsC5R-D2s zq`MXo8jmNtk-0=#`{_^ne>0Ic_xu>+M z$byXJx`ga+Py*5@jd1nzB0lofW*-C1gV3lnva3(fD6iyKaLrpq%f4bMm2$Nx)$93Z<=!xPsK@;SLW{QSz-qt0g%$+$6m(x+{b#2@6tI~05O7ojy z!v!uvA_6W9j8W-`SQ_zrWDDiUa5AMNKTg_XnKY*dyl5b?|F50Wix3iFQ72l_N_%Q7 zBHGEPFT(uewS~WRRbI@7Wqawc?^@qCqH{9*ktzww%fQ~U)n6)HuLzFT-9r5@uHF8!=e2pE==BYVz? z=Ss>V;JpQM%kF*Jgo$S0DuI9%duNIQjX{pwSQv3r7PdWK@ zawL7q!9gjdT(}SpS}8|4O2YG*`H_36>E|}`oUupq2H>_d|`la#R zsU8UfS28|mbk7-28_X4h3b>&aWN<(;^wPBN40$LJ$2i0xLi3Z5Ai6kdrs++<82x!? zO;H}BN&!+|jQ&6BRoa0&%&H!JC+&C>l<|JZhDTxR(z+S5F5}z?SrdXB88%7~$r7T# z$wQX12$?uQuYgpk@?F;j%8!btR1s@WkbVY)Vwx7sP&Z+}lfDXQlqczAgcWntGEe>~ z&`s9?{mjjrOl6%cz!dm@IMXK`+E4n*25EQ`mMg{ZcX}7@MCG!n#1628@3! Date: Sat, 25 Feb 2023 12:24:17 +0000 Subject: [PATCH 23/65] Apply translations in ar translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ar' language. --- damus/ar.lproj/Localizable.strings | Bin 60198 -> 60190 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings index 30cd8ffb40d0ea5bf068c2f81999fb241a0419da..3b3d777c6f8f497bbb3ed549745306f20d65338d 100644 GIT binary patch delta 26 icmZ2>jd|WR<_%dolV_dcn(XmZXmXS+-{v_wUHbs0H4Ezi delta 26 icmbPtjd|HM<_%dolfAlxCVR*#OrDn`vw4F~-aY`Db_+rP From c635f3d77a9853ed7612672adfdfc081a1e65362 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 12:24:29 +0000 Subject: [PATCH 24/65] Apply translations in ar translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ar' language. --- damus/ar.lproj/Localizable.strings | Bin 60190 -> 60194 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings index 3b3d777c6f8f497bbb3ed549745306f20d65338d..f306372174e12e15b60301ca8158bf98a92448b4 100644 GIT binary patch delta 24 gcmbPtjd{^E<_&Jfoa$^wZ0c+-Y?_ Date: Sat, 25 Feb 2023 12:24:37 +0000 Subject: [PATCH 25/65] Apply translations in ar translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ar' language. --- damus/ar.lproj/Localizable.strings | Bin 60194 -> 60198 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings index f306372174e12e15b60301ca8158bf98a92448b4..a6058b0ee011e06ed86f4d0972a73d4b02195c2f 100644 GIT binary patch delta 18 acmZ2jd{^E<_$%2SzXzT*>pEo&t2^c09y?RGXMYp From 9f22234926f7552308032f05a8ae65d57efe2c34 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 12:28:56 +0000 Subject: [PATCH 26/65] Apply translations in cs translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'cs' language. --- damus/cs.lproj/Localizable.strings | Bin 61358 -> 62064 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/cs.lproj/Localizable.strings b/damus/cs.lproj/Localizable.strings index 6a8ba2d8b9d2b5c5bee1fb0baaf09d1a87022d6f..e4521ae6e60d786d113ab548106410fe71e781a4 100644 GIT binary patch delta 1015 zcmZWo-%C?*6hAlDm`hz=e{AZ~yNO{Y+k&zm5^j6yhnbKNjtOme$+fvHch&Sk3wr7$ z>h#n@C_VKej{6b>QP3aILr;OG5SgN6&_hqN&-c3A+_>Cv&-a|q=X}oRd$#ngV)uK6 zX)m{z(+6snEA&^D3zD9z?UwkbP17$OdwGN();V|$@14_C+`1CVrr%rizjca<2S;Rm zxw+HKX}^z6E}4@XR$G)(c;Ylp5t^VlXWQy(6$+M|UUxNB&(b<2a6Tu+X_5mYExdHf z@_JjbvFC-yR*LYxwexmHzEQ$Y8B%D9Vx-bEzPiXuR&tm2LzNrZ%Xr-sD)eP(F`zqr zXU+WiaU*Y?lWWW9`B_hUdjLWcMHIJ;@n$iiX0(q;svhY1)xp7NEBn4WdAF&P|AZa< z#L>)3sESu@X6_GnJQ z_{%3*{}H}c579O3cFMiN#R!eUg(N@<#HHZ90ITpu#i<4dx)D#)7~=h$CcgQM?fmWH zDi5muyV#%SRj7mfMZ5(s2hg`#+5x*TViZw=B8Uxy?z;cmE0&{DG!&wyII>|cTakAQ zExjezUF7vm&S7_rm!A7@7&^g#G)NLt70&3e6y|8LkTN1&iS*2307=eVZrv!$r${!K)BBHQF)q z;!?-4hnmr2PFe>(Nt-|xk2Yhlr)gMHsD2RkUkyQ;naVQlxy}wQ{Tku)X PMl8U=A50Hz4ITXlYV-L( delta 744 zcmchU!Ak;B5XL80#XM9<7DmA$imRlScv1|52s#uS6hul;WF>8FWhS1gOSeu#5!9(` z5XI|Q(f`mj45CvIdGrw4w-#8p4iUq?_h#O=GryTvewNN3C3CG>tFl_sgvWks6GKv) zNmQ(dCSQmaNT*fWB!xmWhx0rYzfKy?3i%D={bpCFmaShKW{zthQ&4_zP*v!eZ2%n@BexHtPr!gIsHZZdVl-KHT21t(9;LT!=V^|G51(EN% z7}EZX^wuLr!^_YY$xsx~qK<6F3;3|hGz?#Z>BbN^p6bzM`cDd(`_Bf^zv^r}oKgRi z)X%#ar^^k_1U`42?CS=8j&IUIwvV<5cW0MXlzZA+dFHK8RDw|}R}Va*6utKH&Qu4- tQhgQ`liT3qmwt}g6u#woT@nnxIUMEC22 Date: Sat, 25 Feb 2023 12:38:58 +0000 Subject: [PATCH 27/65] Apply translations in el_GR translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'el_GR' language. --- damus/el-GR.lproj/Localizable.strings | Bin 62948 -> 63660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/el-GR.lproj/Localizable.strings b/damus/el-GR.lproj/Localizable.strings index 165342676d6e22f821e8d4bfd59b74c9538b4dae..1953dae1ec44e22be08e19a19919fcb04155b027 100644 GIT binary patch delta 1062 zcma)5-Aj{E7=QGr%{ATY9NMPkJF^fGzk()~qS8fCN(4m(`90FwSGu$$^gjsX2?Z%K zuw7}n4x)ml<{$(KFZvIPZh~4D-DvW15shD)C$6JhDHI+~!zYW^>NAn5RzFZ9X z&t^)$wK0vgHWNo)XUNuq8yS4{d?`m747}~I)O*QC0dgTj7gj#HPaf)|e*7z7E2By> zB6kz@;L)l1?=$?saooHi!XhMe3JHn-8o#`0$F-4J3>_mQZqhx=MCc*JiNxG@DDE_MAiMxy9)?qGJ{}x!L0^;*sfN ztiLFc@14(2^QSWguItWYul)iWZ8fZSnAqP|#Z#5a=1w=FC!JI7n`?<2sd#`tfVRTl zh2dSW1~6hd_CwT*eash7YtGRMcrL53JMm;9OIP-C$CMGz9oI-uY>9R7wJA2l0yt9& z(rHc1!@3092K-^Q<1t6B3=Tx9_Qf))8d1$EhGMOEBJ}^{bL}8j4VuhoyuC>XC@f~s zj6{2}7WZV8Di(OP$tK6Aw=eUWG_w7-o!{Ixaa~sSsOsXdfR&!WN7SS0?rX~xmGZu{ zZ{fs4czZ#MA|N)?zq37tKM*BHQK&9Nl$ccV@b#Y#?x-=e$A@_a99MwxtoVqPLRBHX uE>q_)4#m;?zH;nTtE`-P}vBIw=PRilPz4Skw%n`%@ delta 709 zcmZ4Uk@?AMW|sf|{{NdC_atYt3YQt@W*24wrp-UtrZK7OF{Cl%GvqOpFlaF7F(d)m zDGZfRRt}J@!Jr9(lY2QOiB_w)LUOVTbI!&xJLbtzhq)$yFyPso#VW=)`3j$aE3$RP z45dITGZ<1C5`k9bFk}K9k_xoE97tv|qyuFj&dLSyQ-C6+47mvBxT89qe6xVg-5e$C zz%tn`-DvW?SdGbcu}1YVK%WON6am8{4QO!=*jXSa6f+b6d5OR<@&l3}hiL#skkwf+ zD4>bxfJH!F%?7HkWB{os2YN0aXc{PV)q%7EgBy^a1BCe??@z9c<)^C~6c{El?_xf~ zyqkGH^HJs)`^JH*wgTeyhUd_plv7(YnK-by=u@VE443NKZ^8Yx)&1=NN z*d{wX71?}Cu8M!NjD7~&WQCb3n;p#Ns7;oM5u02SYrq-+47;Mqk3Ser{&rq$5|iI# hz6_4dkK$59Hv5%)FqkZ(Z?M^7*#d8{F;1VeSOFkwtP21D From b1b4b5b6c91c07f883a6651d617b187d459d4270 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 18:38:21 +0000 Subject: [PATCH 28/65] Apply translations in fa translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/InfoPlist.strings' on the 'fa' language. --- damus/fa.lproj/InfoPlist.strings | Bin 0 -> 782 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 damus/fa.lproj/InfoPlist.strings diff --git a/damus/fa.lproj/InfoPlist.strings b/damus/fa.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..f153d01cbfa0f1101c5cc77dc81e7471276d4a23 GIT binary patch literal 782 zcmbV~O-chn5QX2W7Lr3Wvl$tZX~&p_hzoU+QIHT24-k#0pfQ*zc%U!1nUe(v9S0blVy=knGo^*#b(xaxDU=8(wJ?4BaUlMukDAJjFYnXfu(O<GeM)RV zO*CVFfwM!ICELEPe((WZV>csf-m$eTgZsWY74TnJ!Y!zgT8`z^v|{CJb7m+Myt{av z=4FiMmRbjNhqvGQZQ?o51J%!1PM0vbfz^-|`glTTLvJgF(|_nt=U>mh%)Pxb9;P+l zdOj-dhc+jo;R>`0iX1RMF=uSeQqO|7;NL^Z1-dQu%FJ62Z-Q2Fsdt7II#A`U@^nEp NoCoJEWkSPLegp8ec%=XU literal 0 HcmV?d00001 From 3f3e59488a9fb719682ae01588da9a7869ac8384 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:32:04 +0000 Subject: [PATCH 29/65] Apply translations in fa translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'fa' language. --- damus/fa.lproj/Localizable.strings | Bin 0 -> 61876 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 damus/fa.lproj/Localizable.strings diff --git a/damus/fa.lproj/Localizable.strings b/damus/fa.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..1eada13b2e69f5fe2e606131c5de6e1e06e9205b GIT binary patch literal 61876 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 Date: Sat, 25 Feb 2023 19:39:42 +0000 Subject: [PATCH 30/65] Apply translations in ar translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ar' language. --- damus/ar.lproj/Localizable.strings | Bin 60198 -> 60584 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings index a6058b0ee011e06ed86f4d0972a73d4b02195c2f..0e1469b87fb86419c7880190b799050717b6d344 100644 GIT binary patch delta 369 zcmZ2>jd{gQW|sf|{{NeNPc(pEmBE2Qi9vzE7KoJ?R5!2YEa#YfVI9k64`v>w%|FmXfWt8Bmvne43$t;4v?+Epb3JLdpRXFh*ZlkdBJ=MkTsJ%m@_t( z*)dP{y2&-Uz?5t9hpTLx^H_x#Llqdb81xyqK#l@B5!KvchEkwAG8j@B5`p&TFk}K< zmkLx<4kR-f(t$D%x8?%*DL|1@hFpXjJ*Z?B*bkePgdSu}evq#)Sx$pvvV)Vz9|NbukDwE#}Z?kL;J_EB#37`S9su3&!lavp1v*rq#0s$bC zKNJ^}juRG>{@7-r+6c3x6X0l*9$^NPFnv^$K-?gcpeYEGE=3fRz Date: Sat, 25 Feb 2023 19:39:53 +0000 Subject: [PATCH 31/65] Apply translations in zh_CN translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'zh_CN' language. --- damus/zh-CN.lproj/Localizable.strings | Bin 55968 -> 56352 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/zh-CN.lproj/Localizable.strings b/damus/zh-CN.lproj/Localizable.strings index c6d1a9bcd8003ec716e0e653b3486badf9b41d94..3b11b9874018de0cc1ae9d13142c3d8eeaacf9ef 100644 GIT binary patch delta 351 zcmZ3mm3hGqW|sf|{{NdiMmBE2Qi9vzE7KoJ?R5!2XoXfu1g;{`U^AEOZOzL_J zX$<)cc?=~C8Vq_2NkDcALnV}z17vG3XoBG6UQS6(BGob|O#Uk Date: Sat, 25 Feb 2023 19:40:09 +0000 Subject: [PATCH 32/65] Apply translations in cs translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'cs' language. --- damus/cs.lproj/Localizable.strings | Bin 62064 -> 62448 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/cs.lproj/Localizable.strings b/damus/cs.lproj/Localizable.strings index e4521ae6e60d786d113ab548106410fe71e781a4..8e8d13af924c5130cfdcd5a491e463140af43679 100644 GIT binary patch delta 377 zcmezHg!#jBW|sf|{{Ne7P!}Mm%HY7D#Gt@n3&ctcK;GoWySkh2aI$f3c3~D^+WdoU z8k4#nLmERqLmop3g9d{hLlTgk!cYlir@$x7*xR4TQhJ0 zp+1AwWJl)wjb(PslR4PLCLg%NvN?}ch%r=wK?^9!1#utHT4cu*Gn4`yl);e7kO*{0 z4nro;nW;cE9|NbukDwCZIZ?h^7J_EA|3ZMbAXc8;|lb8&2v!n}}0s$bC z{S+4oAOIx*G5{n1K$8LAEtB-$NU_?!2(w}o6l{|efmoApCm@raDhQJhMii5>fMSyn K-wd;Ofp~ISt|!U> From 63ab151a5e12224bd84ea832a0a8732b23a987b5 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:40:15 +0000 Subject: [PATCH 33/65] Apply translations in nl translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'nl' language. --- damus/nl.lproj/Localizable.strings | Bin 62216 -> 62600 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings index fee819d4162ce103ea4095dfc836e93f2eb50416..9f36f3056b11e638ff1fee7a49fcd102dbee935b 100644 GIT binary patch delta 357 zcmeBp#@z9endSe#|Nkb(B?a)RGB_|OF(@$D0n$HHl+V zJIiJdW*(-^KiH-*Y3ebgG2}DkF_bW9Fz7KP0of@Gl~7g=kgdU>35E)j1BJ!aiBvs# z?h;9$HIqGv%70|)>9|NbukDwA;xZ?pamJ_EDd37`S9JQ6GclO_;!vv>=d0s$bC z(G(Yx9uydpz={m9fb0mfHWUPGll~V5liYw%lioBSlkOe}la96&lXie$lfa4$vp9iJ EbJss8f&c&j From b8614f055c41ae2e9b1d2b9d5066367d1532a9b5 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:41:05 +0000 Subject: [PATCH 34/65] Apply translations in el_GR translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'el_GR' language. --- damus/el-GR.lproj/Localizable.strings | Bin 63660 -> 64044 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/el-GR.lproj/Localizable.strings b/damus/el-GR.lproj/Localizable.strings index 1953dae1ec44e22be08e19a19919fcb04155b027..df41af5f6e90c017eaac486d8c348775ba936669 100644 GIT binary patch delta 343 zcmZ4Uk$KG*W|sf|{{Ne-Cmz7B%HY7D#Gt@n3&ctcs+-qxuI1e9!YshF`3KuHCUrfA zG=_YJJcbem4F)}iBp^G5p%Ti<0kSn1G(m83FQ+8YY86*VPIh6=*;r=BJUQwx*W?cd zJe#vv#TX}F;S+F0wyv0=6li4zLn=ce(5f7UOrS$jftHs8$xMcHpbW%Wxj=pjP^6S0 z7vUUtRHu_~7SOqyqlDA)CL8oBOx|F_G1)I)WO7(j+T;U`QIiWCc{ZPDdQu7i++R~~ delta 69 zcmV-L0J{II^aHH%0|fv6|NgTu53mEXfC``iv)~de0kfzJ4g-^76d04j6d02}D-5xK bkO{Ne6lQLd;)7a~K!c)_@Inl;NQC5dNZcOk From ff1b4d724d2c9159649289eabeaadd8c24b1d29b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:42:02 +0000 Subject: [PATCH 35/65] Apply translations in ja translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ja' language. --- damus/ja.lproj/Localizable.strings | Bin 57786 -> 58170 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ja.lproj/Localizable.strings b/damus/ja.lproj/Localizable.strings index bce557ecbddc9baa6ac786e126f1c51bd87192a3..f2f066d34601e31466fb5f1b803faf4075dd05e0 100644 GIT binary patch delta 385 zcmdmWn0ePRW|sf|{{NdC6BEFz%HY7D#Gt@n3&cv39ixRe@8jg+*zCeAz_j@X+cYM1 zJ%%)fe1<%R5(W(hJ%%J8JB6VV%E|$%w1Wk>`%B8MRp=)_c@ znsOkS$&e0|fjBr9$WH-^lrrQZ92!I=vyeQpd6%F|>f{gl3X^m=CfhlROrB7lG`XOR XZSu0^e3OOBohCof;o1DJd`~6-CP!4g delta 93 zcmV-j0HXi8#sj*;0|fv6|NgU{4X^{V?g*d(vrZ8#0h2fnbhC;IngWy15*U*(6Bv`8 zZw#@3{s*&26E Date: Sat, 25 Feb 2023 20:17:18 +0000 Subject: [PATCH 36/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 29184 -> 62606 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 4bb37cd90a8f0be995611848e0379ce5f81f444f..6441225cdf977238de8fe749f88f47eda6c33dc6 100644 GIT binary patch literal 62606 zcmdU&%aR>ecAifS7>v+FW6oe(64?qj=&;f@M}gi0;+|HHqb@J@od)==)cmCU-{_RhnZvJ+2VRLQs zD1P3KpFhOEyPMO^v-tdY^CYhPesgbgC$8OzE4MZ;<0s#L7gtZ?ue&kkVqE*%&8M5c z*!<_sUvK^~eqPx8L;Uxr{~q7`MSRanhnt7fJtT#MjsMT${zub#j{*zeO}v2T&h)J? zhVH94yh*n;Q1xaa!`GOqy?KqD$9)~u!Zp2oV20ESVP z`25)fi|`Yi&>5+?9seGMWJq42E3lq!K8_hLOn3dS`1aoPm!#-%tO{>{<21heA$SX2 z{%d@`8=r2*=!fw)vd4&{g~m$1I_v*zIzqdpc%h^JV1KT2XP�rIEu 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 literal 29184 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 From 356bd06e6ac61d965c9646041f00181ebe127b4b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 20:18:07 +0000 Subject: [PATCH 37/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62606 -> 62596 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 6441225cdf977238de8fe749f88f47eda6c33dc6..9bd92609ad8ffc58d4ecc33f2b343b9bfc9445b1 100644 GIT binary patch delta 32 ocmeBs$=vdidBd|_&TxiGhG@ndhRn&_q0*BlJZIZ1)mM@R0M#K3YXATM delta 26 icmZp9$=vsndBd~b$*XShu@^ApGZZtFZ2s6gISl}+@(d~f From d6ae9a5d790a3bb48ba7bb26a6d0ee10437dfba2 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 20:18:34 +0000 Subject: [PATCH 38/65] Apply translations in es_419 translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'es_419' language. --- damus/es-419.lproj/Localizable.strings | Bin 62254 -> 63340 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/es-419.lproj/Localizable.strings b/damus/es-419.lproj/Localizable.strings index 4b15a951dd407382cd7d5234a8c671115e044e18..e426441d1ce01e30818311fcb768f8de93ddf5e0 100644 GIT binary patch delta 1065 zcmZWo-%FEG7=FPYe2HsQH&eIC*O!Wv*bG5o6xolPrDo+t#T0B?b2y#OO$`EFml38s z)J+hJE`w!#&{Y?88F=A8P$)ANS znsi?)I_9XKBTv&=s$%@5RsP+H1{6RBfIlORSetR7ch7DXClof~WB=2L090np&WZ9>?BVIhMY5 zVzX(;QN!D8Z{3P2p+315dVW)@eo-W{*x&;z!@lI%KVO%NPZC#3;%82{Sc% z-Hw$jHnh2I-Y9PilM!}>IdPKhxGE81+Cq}R6m_s?p2peE`4X~5m(7U{i|f|W$WD&T zlh}V)TPG1kp>~1F%ZkddnhQ}|G;4m2k67S|>q;cc&+PcHbRW%2ethewHrrFWkyp?$ zK_sZ>@V46#F3}MkMRYSC%YVJ3$pu_jxl<9YDy)ba1-twYRY!5WnmMD|zVQ0C4=eAh zu<@o1*+=%plGbx_g5e1;IrLDAybiLJr|J$zB-tM4V}y3;U@qssN1@dEfc**85^0=N zQSD%eIz{j$>xRdxEfy{_%$0(w?heoS$_e!*L?`k>ims=2y}U1aiqj9C$C#3siWO1l e91&G{V*Tco=u5&YXC)%)mbqppo!>!MM@cx7_x!tD;Yp4${8|%W*0MP0--vP zR$y=g@^gSNA1IePIXX_cUIA!hDo}==Zc$>eX5a!seFm+`Yr7pM#mP*57N;@!Tm~06 z$Qcl4Yff$y6jfCMI?Wb{mB0>!$^iMrz+g&eCDQp|1sp)yi37|e=^rHgU!zjOxPwX%v0HX&isw)tTs)7+=5r-}yp#7e#Y|rCOkuKu702WPcag~vO=*)0 Yw0SnGH7h7>=33U_1+s9n(kCxg0E~NtcmMzZ From 03030314453ea527f6d0513d512cea3fe5fab888 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 20:50:26 +0000 Subject: [PATCH 39/65] Apply translations in uk translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/InfoPlist.strings' on the 'uk' language. --- damus/uk.lproj/InfoPlist.strings | Bin 0 -> 800 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 damus/uk.lproj/InfoPlist.strings diff --git a/damus/uk.lproj/InfoPlist.strings b/damus/uk.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..e9a74c71845cb5e064381f555f2d8f438c22f950 GIT binary patch literal 800 zcmbV~-Ae*d5XH~KJoVUX1j{}OrKM#kuDY&PASU$jZW$GnNovqPU;XY~YZDiWSms{l zwU+$eTRBso>y`=e*PV1=y}hvJ7t$spg!| za1Kx=WjoOMH{PK$Y(6sMy=9TrtYmfTTZ21L$vPI>0bXoJme`fg_qfl%ZDP?frMvw&7C28hlQT?C(jHSXX9~>Jzl-x@uI3y)sU Date: Sat, 25 Feb 2023 21:05:36 +0000 Subject: [PATCH 40/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62596 -> 62600 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 9bd92609ad8ffc58d4ecc33f2b343b9bfc9445b1..d52dfbcd963f8dcec095b92c5563615b6ea446b8 100644 GIT binary patch delta 64 zcmZp9$=vahdBZ#})og}xhJ1z+hC~Jhh7^VzFkJ;C3m85FWfZ`;c=Ez0(vv4R^G&{! L$+7u^*OZk2aNrcl delta 84 zcmeBp$=vdidBZ#}%_@dOh60Aq4CM?84B0?3pP>XOq5$R>16d_Nkzxj*s>uf%geOmM g=9~N=lVfs5x7lRAsT`AY%0wnF@ZsAW;%%}L06`5J+W-In From 2d3bd11d56968838153f2030b33b7dcec0634ab9 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:06:25 +0000 Subject: [PATCH 41/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62600 -> 62598 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index d52dfbcd963f8dcec095b92c5563615b6ea446b8..035f13cba25bb2e06d43329bf7724ca7a6045092 100644 GIT binary patch delta 26 hcmeBp$=vpmc|%kqyAwkZLn1@= delta 24 fcmZpB$=vahc|%kqXEkFYLkdGGL*C}ZM%7{fc9{sg From 2036d5843be019b5c429dd9182c3c5f91b9e7316 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:07:23 +0000 Subject: [PATCH 42/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62598 -> 62620 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 035f13cba25bb2e06d43329bf7724ca7a6045092..a869b77ff30391541baa72d8c7b0733fa69cb2d6 100644 GIT binary patch delta 56 zcmZpB$vo#J^M)U}iXjX|43!K?33^@#mKstvZm7$y=A1E%#n9NW$d2fUG Date: Sat, 25 Feb 2023 21:08:08 +0000 Subject: [PATCH 43/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62620 -> 62640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index a869b77ff30391541baa72d8c7b0733fa69cb2d6..b83b6c804768555c1d0cfab5e6b43a88725d043e 100644 GIT binary patch delta 22 ccmbR9l6eCV)%Z*n>QR|I!C7SU0-rz20eT$@t^fc4 delta 33 rcmV++0N($w=>weU1F(Ed0z?6mfMFt&MoSKpM9n0V@W2eS@=U&`@|F)7 From 360218913365eff41764e659d48f8cfabb18a23c Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:08:33 +0000 Subject: [PATCH 44/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62640 -> 62636 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index b83b6c804768555c1d0cfab5e6b43a88725d043e..77dba70c0af3f7302e845fe685ebde5e500f57fe 100644 GIT binary patch delta 38 ucmdn+l6lQb<_!|Q{GklR45bV%j0z0d4EYRslNW9ho?M`;v^l{yU^xK%vJBe* delta 27 hcmZ4Ul6eCVN%-;vGh{O)G88kEGGsAqR`Bgv4giW02^s(Z From 990e783c306a6f1fe8f2122a77779c92959ccc58 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:08:55 +0000 Subject: [PATCH 45/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62636 -> 62634 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 77dba70c0af3f7302e845fe685ebde5e500f57fe..cd64e72be65a04e1675dd12ae6e6bda4acf9da72 100644 GIT binary patch delta 38 ucmZ4Ul6loj<_-6J`AZp!8A=)Q7%~|o8A}*aCnr9Xp8R2+(q Date: Sat, 25 Feb 2023 21:09:09 +0000 Subject: [PATCH 46/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62634 -> 62632 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index cd64e72be65a04e1675dd12ae6e6bda4acf9da72..6e022069010bfed1f9ab636db508087d598ee217 100644 GIT binary patch delta 35 rcmZ4Wl6l2T<_%&!yrm4q45bWt44Dj)jLDN5edH%SiP$`+hc5#F=`al0 delta 32 ocmZ4Sl6loj<_%&!oW%^;42cZI4Ed9*eN-nOI2f^cRu5kW0Mm&K;Q#;t From 5252e5f5bb66c2016c2141ffd9ead3c9b1bfdf98 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:09:23 +0000 Subject: [PATCH 47/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62632 -> 62628 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 6e022069010bfed1f9ab636db508087d598ee217..08f031494f8f02468d16f2b2255f03f3df32c58a 100644 GIT binary patch delta 24 gcmZ4Sl6lEX<_({2ag{O@Gn6vqF|aajy1haY0E$Bi$^ZZW delta 30 mcmZ4Tl6l2T<_({2u@^IBGbAz;PmaGMK3Ol6YqQwxK1l%8F$}5z From 1e52d958ac796dca766649a171ea4d5737051c89 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:10:18 +0000 Subject: [PATCH 48/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62628 -> 62640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 08f031494f8f02468d16f2b2255f03f3df32c58a..2f171e4d386ee4c15518cd7e479f6f5b3a09fc54 100644 GIT binary patch delta 38 rcmZ4Tl6eCVP1_ Date: Sat, 25 Feb 2023 21:11:28 +0000 Subject: [PATCH 49/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62640 -> 62644 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 2f171e4d386ee4c15518cd7e479f6f5b3a09fc54..f62d15705c9c22aaea286332dac38d2a5b297deb 100644 GIT binary patch delta 35 ocmdn+l6lKZ<_!m~h-5P)GUNfV6QcryI)f^M1CZQ&;mQMf0Oy|zoB#j- delta 31 kcmdn;l6eCV9k?Q(%HY7Dz>v+5$dCubPK=wcTzMc50KbU~P5=M^ From 5eb61f1ac12e98848eddf7d42706f827548f8b1f Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:13:18 +0000 Subject: [PATCH 50/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62644 -> 62636 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index f62d15705c9c22aaea286332dac38d2a5b297deb..8d9ab3d42583480228655ae72fdf3901ce379815 100644 GIT binary patch delta 27 icmdn;l6lQb<_+7f@RT!DGUPF2GGqhs=2KT*$pZkWXbW@z delta 35 qcmZ4Ul6lKZ<_+7fh!iuFGkj*qVo+enW=Len17at}&4;eMk_Q0(K@A=N From 2b854ef9b72f1d21c3332c750c552a7aa6b92e78 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 13:22:43 +0000 Subject: [PATCH 51/65] Apply translations in ar translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ar' language. --- damus/ar.lproj/Localizable.strings | Bin 60584 -> 60574 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings index 0e1469b87fb86419c7880190b799050717b6d344..3497c904854c8786f5f2d198a1a1113812e754b0 100644 GIT binary patch delta 27 jcmZ2+lX>1v<_%o692#r^Y%Xl-Y?B2NMK&AMR^$T!fmjHb delta 22 ecmbPtlX=BW<_%o6lM`y$CJPivZC0qQ%Lf2& Date: Mon, 27 Feb 2023 07:46:39 +1300 Subject: [PATCH 52/65] Fix localization bug on RelayFilterView --- damus/Views/RelayFilterView.swift | 2 +- .../Localized Contents/en-US.xliff | 10 +++++----- .../damus/en-US.lproj/Localizable.strings | Bin 61370 -> 61338 bytes 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/damus/Views/RelayFilterView.swift b/damus/Views/RelayFilterView.swift index 8f99b5b8..d3f9efcf 100644 --- a/damus/Views/RelayFilterView.swift +++ b/damus/Views/RelayFilterView.swift @@ -26,7 +26,7 @@ struct RelayFilterView: View { } var body: some View { - Text("To filter your \(timeline.rawValue) feed, please choose applicable relays from the list below:", comment: "Instructions on how to filter a specific timeline feed by choosing relay servers to filter on.") + Text("Please choose relays from the list below to filter the current feed:", comment: "Instructions on how to filter a specific timeline feed by choosing relay servers to filter on.") .padding() .padding(.top, 20) .padding(.bottom, 0) diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index 686f43af..230552d8 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -692,6 +692,11 @@ Sentence composed of 2 variables to describe how many people are following a use Plan Prompt selection of DeepL subscription plan to perform machine translations on notes + + Please choose relays from the list below to filter the current feed: + Please choose relays from the list below to filter the current feed: + Instructions on how to filter a specific timeline feed by choosing relay servers to filter on. + Post Post @@ -1022,11 +1027,6 @@ Label for filter for seeing your posts and replies (instead of only your posts). Thread Navigation bar title for note thread. - - To filter your %@ feed, please choose applicable relays from the list below: - To filter your %@ feed, please choose applicable relays from the list below: - Instructions on how to filter a specific timeline feed by choosing relay servers to filter on. - Translate Note Translate Note 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 index c4ac875aab91ec67f8ec58d23d45ed17451c0b0d..f3246d4542d03f5c83fe08ba00cfa5bb920a661a 100644 GIT binary patch delta 97 zcmdmWpLy1O<_#%blW&|m#uzZU@PhQ@MHfsa3(OarT(nd|G>st@2vZoW7?c Date: Mon, 27 Feb 2023 07:54:49 +1300 Subject: [PATCH 53/65] Fix wording in SaveKeysView to be more mobile-friendly --- damus/Views/SaveKeysView.swift | 2 +- .../Localized Contents/en-US.xliff | 6 +++--- .../damus/en-US.lproj/Localizable.strings | Bin 61338 -> 61330 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/damus/Views/SaveKeysView.swift b/damus/Views/SaveKeysView.swift index e2de28ab..875dc8b4 100644 --- a/damus/Views/SaveKeysView.swift +++ b/damus/Views/SaveKeysView.swift @@ -38,7 +38,7 @@ struct SaveKeysView: View { .foregroundColor(.white) .padding(.bottom, 10) - Text("This is your account ID, you can give this to your friends so that they can follow you. Click to copy.", comment: "Label to describe that a public key is the user's account ID and what they can do with it.") + Text("This is your account ID, you can give this to your friends so that they can follow you. Tap to copy.", comment: "Label to describe that a public key is the user's account ID and what they can do with it.") .foregroundColor(.white) .padding(.bottom, 10) diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index 230552d8..ff0cb66b 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -1012,9 +1012,9 @@ Label for filter for seeing your posts and replies (instead of only your posts). This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key. Warning that the inputted account key for login is an old-style and asking user to verify if it is a public key. - - This is your account ID, you can give this to your friends so that they can follow you. Click to copy. - This is your account ID, you can give this to your friends so that they can follow you. Click to copy. + + This is your account ID, you can give this to your friends so that they can follow you. Tap to copy. + This is your account ID, you can give this to your friends so that they can follow you. Tap to copy. Label to describe that a public key is the user's account ID and what they can do with it. 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 index f3246d4542d03f5c83fe08ba00cfa5bb920a661a..d0ceb5e9a98c43d55ec6e9c7186a5b2f1a6cea95 100644 GIT binary patch delta 30 icmbPrpLx=K<_#=oSVI^R844!zo;eF)ZGL=ayAlApxC}V} delta 38 mcmbPqpLy1O<_#=oIGq`C7%~}>8L}sHo;i!)ZN7bGyAl8iy$!bj From b7a48a24e9f2b2360a651b22e9294cba2b4b7e6f Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 19:10:41 +0000 Subject: [PATCH 54/65] Apply translations in de translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'de' language. --- damus/de.lproj/Localizable.strings | Bin 62476 -> 63594 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/de.lproj/Localizable.strings b/damus/de.lproj/Localizable.strings index b0eb6fc013f182d530493b05e588ead437461f36..1c061d63a49e6b6298a35284909d12f21bd5b35a 100644 GIT binary patch delta 1418 zcmZ`(O-NKx7`>$pqv$lfCVv{sr;aIQniU3Op(brIQ&Ga`$FUi8Xl9(8d0K8pT11PA z=99t`758il&~eh|Tv;#IA2EtW`dKtKfQ{3aSvt3RSN5E1#K_7vFei zr-t#9E_^6+n!CMK4t$uX#KI9Lu9j$6I^gV`qhRYdvKFvn^_>{c}@n}kg&z(-fj zX)&v%s8*83`5UvyFQ`F|QM0xrz8SZwt2d`5Vtz6o^@esboit985mp~mqbc-h*(CZ8 zF@{bQqV3Xl^Toav2gZ-O(0JU5`*qrubwqexSCXNtCU{EVIJZsNG!}b=uDcFzGXX~-hC+}fAxU0c+#({vxjhrGaKStRGShudC{J*Rc zoF&u{F69Xn8^^Dgvi4%|MkVb+~#R-dc$utGPk6}b{zO^pn>a;>*3T~==!YgIl5u==k$QBfSvwQev zF503E7#Z({E8xJ_WGD2h9P{INX%1qsOjN#}+RzT~oENQg2b0#8iPcYx@G^?5i5qlv zK^a7q+GRfy73338^(pOaw%CPV_WGHb><#BqRg_~VXJKk}g>ygg#4u9-Fh`@!0=7!G zf?Jssx5`)v76}c?YbObypH@$BO<;ve){b#xVTe4)N6TX$PWNS-r8hhCR!&Wp>_K`o zg2e;dwyZllD1PXzNjGh(=Kne?9S@B?o4Qy}3^UVb_sXVZ%PSQLrNMVuml`9hLQ!g* zpXn&<;!2E<$R$>?Npv-aiJ2YnCEaNJW} zP6?rCV*bmevUW73YiqYd4Xdl=J$0+0V TYzB$;W6Ho{d6_x+qjS?A2%k_@ delta 807 zcmc&y&ubG=5T2NAN!m&p@`F?nx6zO`*0L2rx**0MhzBjPv{0m5voUEciQAG*C`C|O z#gkCW;7y@=@>qQbZw2)q5RC_K9y~}vSX6o`wtnwLCH@8S*!SMdo0{(`84kT9jp*O_e8gcfzM|dC*5c#WvQE{(!YcH=YPq4S8^V)EL z^B1C=UC#5{OqbB^B)f#MIv;1P>5+5{;*Y9eaS$W+#hSp?*kOKQAB9Rnj zm0d!aBB=rM*OmQY8>5#3kw9z=yu$tm!zmL~{h@3eqGUsuj8Z^0)s>KB(^c3Pk?a1>ts_TPk)$-^On!3ekT5=u MCDfD>-$&bi0Ui6uIsgCw From 7ab95583df517744a05ac4c9663633a6b0c07da9 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 20:23:02 +0000 Subject: [PATCH 55/65] Apply translations in de translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'de' language. --- damus/de.lproj/Localizable.strings | Bin 63594 -> 63592 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/de.lproj/Localizable.strings b/damus/de.lproj/Localizable.strings index 1c061d63a49e6b6298a35284909d12f21bd5b35a..eea35af5293e09c00a68c9571fb9b375fc7db8df 100644 GIT binary patch delta 26 icmaF$f%(M;<_+&2afdUcGUPCnFcdK)ZvOo!UlahYz6-|y delta 28 kcmaFyf%(-3<_+&2@rE+wF=R57F{CmSF%)n9`6yo$0K-lUL;wH) From 23229015a655925fc040bcd174f0a69e8028dbb4 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 20:59:17 +0000 Subject: [PATCH 56/65] Apply translations in de translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'de' language. --- damus/de.lproj/Localizable.strings | Bin 63592 -> 63570 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/de.lproj/Localizable.strings b/damus/de.lproj/Localizable.strings index eea35af5293e09c00a68c9571fb9b375fc7db8df..f7a83a8a7ce5b92f26e00dadc763bd2a2ca08511 100644 GIT binary patch delta 114 zcmaFyf%(!0<_&cdCfDrYi4S5(WyoPjWT<2)W>5gqrC>S*C|U&Mr!nLMWz&JYJO+?h s9#G7OArq*k1jthWs?G(HAel_CTp~j@P^J{f&jG?zhT_ftCuF7r0On&HdH?_b delta 145 zcmccgf%(M;<_&cd>YW%e8A^aKl|g}_oZ$&W215>*oeC7s1BwL!c{vP;43$83B10)d zF_2CHiWLFrQlJWu&LSWNsr3QsDTbN_QL6)1l?&AaQj^G#4OCGIHWg?S6GPtSmlHD6 E0r=q{+5i9m From 483730af18d7064035671f946ae4b34ad78c1865 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 21:01:54 +0000 Subject: [PATCH 57/65] Apply translations in pl_PL translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'pl_PL' language. --- damus/pl-PL.lproj/Localizable.strings | Bin 62636 -> 62592 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings index 8d9ab3d42583480228655ae72fdf3901ce379815..0358950ac0ed48d25d83fbed0a1cfae253deb50c 100644 GIT binary patch delta 126 zcmZ4UlDXj}^M*sclZ`GPV+@$Ac}041)D@G-moAG?A&DVp^87x_SSto4pbA?c zR$_1jidKU4LQF0Knpw_}$iU910HiA!@_;sG1F-^wIs?cSb+G9mnIxbn$Q@NcxniK3 d@_{5!@8sV3vXdS96&S51H##eCR=AoV4*+eSHQoRK From 06e9a1b3924eb8d183145508b1487bfccd43e542 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 26 Feb 2023 21:18:28 +0000 Subject: [PATCH 58/65] Apply translations in ar translated for the source file 'damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.strings' on the 'ar' language. --- damus/ar.lproj/Localizable.strings | Bin 60574 -> 60576 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/ar.lproj/Localizable.strings b/damus/ar.lproj/Localizable.strings index 3497c904854c8786f5f2d198a1a1113812e754b0..215f103f96362af243f1ea0157657aa7464a7d7a 100644 GIT binary patch delta 301 zcmbPtlX<~S<_#Y@CTpEJ#uzYJ@vQXZptB~E1I~y|7AcXaPh&_0!W0H81|Oxaw3vRXh9S2j1OxD!xB4JfM#a38j4PWiknh3f36ybXGXSaJ16tq$R-y}3Vl}z2LU}Vw=OH`R z5QapCg30HPt1`Q@c})IzTs#!y8Vxp8pe@co)7^k1$OR@qwjq$M1-8$X%@QaIG7{u& sL!iAN7lPca1r*T$%4z}C>H&QTGQo+>aC7mA?aY%Wgo|wEI5$lW0J5Ao>;M1& delta 348 zcmXYsKT88a5XA=$9%w0Ir>xQQ&LfEgQMrId&D|MO+X|j~qIeMT4``*05Yt#JSc=%% z2v^uz2@2Zh3s~nP_;#__*?IGu-FfrWcOLuB>!7Q5ZpVt>-uuc>Q*t?yJvr7dpYC;x z5H+kpNd@!p;G>DEDDmMUX6_+jRN}JB@CX}J5vH(!IjplXV|fJuHc8sN&AS9GG9@uH z69X!rvjQ^nzlTNCu~am^-W)yXer#_^hvfrW%jH}$Ii`R&X3Hvfh z<&05rokR9^{#8n9xLGrmUCH(LUD&8giJi+lC614{P?@GCY0pEI#@bXhYqrJZBC5cu YkR-vZzVD6e>E{uBb2(ZJ|2$0m0cVmz-T(jq From 01522868595d17531cb32ac0d6c3fa75696391b2 Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:43:00 +1300 Subject: [PATCH 59/65] Fix missing comments on new strings --- damus/Views/Zaps/CustomizeZapView.swift | 26 ++++---- .../Localized Contents/en-US.xliff | 58 +++++++++++++++++- .../damus/en-US.lproj/Localizable.strings | Bin 61330 -> 63960 bytes 3 files changed, 70 insertions(+), 14 deletions(-) diff --git a/damus/Views/Zaps/CustomizeZapView.swift b/damus/Views/Zaps/CustomizeZapView.swift index c20a5cbd..613ad3ee 100644 --- a/damus/Views/Zaps/CustomizeZapView.swift +++ b/damus/Views/Zaps/CustomizeZapView.swift @@ -81,16 +81,16 @@ struct CustomizeZapView: View { } var ZapTypePicker: some View { - Picker("Zap Type", selection: $zap_type) { - Text("Public").tag(ZapType.pub) - Text("Anonymous").tag(ZapType.anon) - Text("Non-Zap").tag(ZapType.non_zap) + Picker(NSLocalizedString("Zap Type", comment: "Header text to indicate that the picker below it is to choose the type of zap to send."), selection: $zap_type) { + Text("Public", comment: "Picker option to indicate that a zap should be sent publicly and identify the user as who sent it.").tag(ZapType.pub) + Text("Anonymous", comment: "Picker option to indicate that a zap should be sent anonymously and not identify the user as who sent it.").tag(ZapType.anon) + Text("Non-Zap", comment: "Picker option to indicate that sats should be sent to the user's wallet as a regular Lightning payment, not as a zap.").tag(ZapType.non_zap) } .pickerStyle(.segmented) } var AmountPicker: some View { - Picker("Zap Amount", selection: $selected_amount) { + Picker(NSLocalizedString("Zap Amount", comment: "Title of picker that allows selection of predefined amounts to zap."), selection: $selected_amount) { ForEach(zap_amounts) { entry in let fmt = format_msats_abbrev(Int64(entry.amount) * 1000) HStack(alignment: .firstTextBaseline) { @@ -156,11 +156,11 @@ struct CustomizeZapView: View { Section(content: { AmountPicker }, header: { - Text("Zap Amount in sats") + Text("Zap Amount in sats", comment: "Header text to indicate that the picker below it is to choose a pre-defined amount of sats to zap.") }) Section(content: { - TextField("100000", text: $custom_amount) + TextField(String("100000"), text: $custom_amount) .keyboardType(.numberPad) .onReceive(Just(custom_amount)) { newValue in @@ -170,27 +170,27 @@ struct CustomizeZapView: View { } } }, header: { - Text("Custom Zap Amount") + Text("Custom Zap Amount", comment: "Header text to indicate that the text field below it is to enter a custom zap amount.") }) .dismissKeyboardOnTap() Section(content: { - TextField("Awesome post!", text: $comment) + TextField(NSLocalizedString("Awesome post!", comment: "Placeholder text for a comment to send as part of a zap to the user."), text: $comment) }, header: { - Text("Comment") + Text("Comment", comment: "Header text to indicate that the text field below it is a comment that will be used to send as part of a zap to the user.") }) .dismissKeyboardOnTap() Section(content: { ZapTypePicker }, header: { - Text("Zap Type") + Text("Zap Type", comment: "Header text to indicate that the picker below it is to choose the type of zap to send.") }) if zapping { - Text("Zapping...") + Text("Zapping...", comment: "Text to indicate that the app is in the process of sending a zap.") } else { - Button("Zap") { + Button(NSLocalizedString("Zap", comment: "Button to send a zap.")) { let amount = custom_amount_sats ?? selected_amount.amount send_zap(damus_state: state, event: event, lnurl: lnurl, is_custom: true, comment: comment, amount_sats: amount, zap_type: zap_type) self.zapping = true diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index ff0cb66b..33d900c7 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -32,6 +32,11 @@ + + %@ + %@ + No comment provided by engineer. + %@ %@ %@ %@ @@ -144,6 +149,11 @@ Sentence composed of 2 variables to describe how many people are following a use Admin Label to display relay contact user. + + Anonymous + Anonymous + Picker option to indicate that a zap should be sent anonymously and not identify the user as who sent it. + Any Any @@ -154,6 +164,11 @@ Sentence composed of 2 variables to describe how many people are following a use Are you sure you want to repost this? Alert message to ask if user wants to repost a post. + + Awesome post! + Awesome post! + Placeholder text for a comment to send as part of a zap to the user. + + + Comment + Comment + Header text to indicate that the text field below it is a comment that will be used to send as part of a zap to the user. + Contact Contact @@ -359,6 +379,11 @@ Sentence composed of 2 variables to describe how many people are following a use Custom Dropdown option for selecting a custom translation server. + + Custom Zap Amount + Custom Zap Amount + Header text to indicate that the text field below it is to enter a custom zap amount. + DMs DMs @@ -637,6 +662,11 @@ Sentence composed of 2 variables to describe how many people are following a use No block list found, create a new one? This will overwrite any previous block lists. Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. + + Non-Zap + Non-Zap + Picker option to indicate that sats should be sent to the user's wallet as a regular Lightning payment, not as a zap. + None None @@ -744,6 +774,11 @@ Label for filter for seeing your posts and replies (instead of only your posts). Profile Picture Label for Profile Picture section of user profile form. + + Public + Public + Picker option to indicate that a zap should be sent publicly and identify the user as who sent it. + Public Account ID Public Account ID @@ -1162,7 +1197,28 @@ Label for filter for seeing your posts and replies (instead of only your posts). Zap Zap - Accessibility label for zap button + Accessibility label for zap button + Button to send a zap. + + + Zap Amount + Zap Amount + Title of picker that allows selection of predefined amounts to zap. + + + Zap Amount in sats + Zap Amount in sats + Header text to indicate that the picker below it is to choose a pre-defined amount of sats to zap. + + + Zap Type + Zap Type + Header text to indicate that the picker below it is to choose the type of zap to send. + + + Zapping... + Zapping... + Text to indicate that the app is in the process of sending a zap. Zaps 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 index d0ceb5e9a98c43d55ec6e9c7186a5b2f1a6cea95..4a98b6e8b7fc3751c64c75878099fc9c31db615d 100644 GIT binary patch delta 1513 zcmbVMO-K}B82-w#b(N)DXSeciR+FrBw-72w$)5y46hiAzr_t8jTz3a|M7BeD=@Js^ z10qSK*9bD^*bioOi8>e^tV@TE*{QqqzTfQ5?6_-C48zR#eecinKJz>?|GjAQchRb$ zqVZW3d@qXeV53UYgeq=pF%i$aJK>ZQG+DsKz=gaZ*OIZuE6{m7jR4A6=foCoZa+LNBY$(;Ge+3-sl2Ehb zIUwzQbaeW0@KM;DJv;9!1WYLi4AobHmCW9xoS*q{WT1(0yscD9yPQ*KJwa?=3Sg)w zfTO)WEcflh*7Gvlf8#Yl__k1n(+>mqe6I%a{tA5j>NS@aj$Ot2 zs~SJg&E9fgh4F4Hg6UJ`^}1|5M%+wLghAe7);X4$WhJIidpU@;*TrqRWR`t7LRkrV zT2(D4v%mRkSz65F6DvJRiLE_eNeSe-KyUX9xbYN}o!w(t{t4K8Y(t*TLf9<-9X3X! z)lhJERL2iwOiP$rT;eA@cmE#`bIG_2(w;8glEj;1kQ~nv-dyEbic`g)NY}_zo3@M? yu*+I-gXW%OgLN$HOGZ8ew_utg7SFW*;fXV>bO7+4~2uSV^illTI%nlh7Ur zlTf=9vu1;87?V(;B$Mo|5R-786tfnc3RaUIF$$Ah^CXi#Wfqf=j2x5ftq8Mn_htgp C?kMp9 From bacd9b3c388cd54eaf2ce68cf39e36252c8949c5 Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:47:05 +1300 Subject: [PATCH 60/65] Add strings for event grouped notifications --- damus/en-US.lproj/Localizable.strings | Bin 0 -> 4782 bytes damus/en-US.lproj/Localizable.stringsdict | 144 ++++++++++++++++++ .../Localized Contents/en-US.xliff | 135 ++++++++++++++++ .../damus/en-US.lproj/Localizable.strings | Bin 63960 -> 98660 bytes .../damus/en-US.lproj/Localizable.stringsdict | 144 ++++++++++++++++++ devtools/export-source-translation.sh | 2 +- 6 files changed, 424 insertions(+), 1 deletion(-) create mode 100644 damus/en-US.lproj/Localizable.strings diff --git a/damus/en-US.lproj/Localizable.strings b/damus/en-US.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..17fd6e3eb5baeacc07a884900e88a76448314ba5 GIT binary patch literal 4782 zcmdT`?P|h65ZvEB#Sth4|498?3VnjULI~EjLQ#o|*oSXBcj213uJ0(we zXL2Xcc*bOULe2-+9uZgD>)dN>Ww0}OL>3d|65FvkaBPLTwwO%ney8i%yw$S;z0|DU zx`S=aS#?$V7+-H3uaDx`uX!%gsjVxEF_gyf{N0Mt8l$A?ovX7ioc%3cDKy5h{2gmg zH1Followers + reacted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to a post you were tagged in + other + %2$@ and %1$d others reacted to a post you were tagged in + + + reacted_your_post_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your post + other + %2$@ and %1$d others reacted to your post + + + reacted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your profile + other + %2$@ and %1$d others reacted to your profile + + reactions_count NSStringLocalizedFormatKey @@ -82,6 +130,54 @@ Replying to %2$@, %3$@ & %1$d others + reposted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted a post you were tagged in + other + %2$@ and %1$d others reposted a post you were tagged in + + + reposted_your_post_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your post + other + %2$@ and %1$d others reposted your post + + + reposted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your profile + other + %2$@ and %1$d others reposted your profile + + reposts_count NSStringLocalizedFormatKey @@ -114,6 +210,54 @@ %2$@ sats + zapped_tagged_in_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped a post you were tagged in + other + %2$@ and %1$d others zapped a post you were tagged in + + + zapped_your_post_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your post + other + %2$@ and %1$d others zapped your post + + + zapped_your_profile_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your profile + other + %2$@ and %1$d others zapped your profile + + zaps_count NSStringLocalizedFormatKey diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index 33d900c7..0ccc8a9b 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -1327,6 +1327,51 @@ Label for filter for seeing your posts and replies (instead of only your posts). %#@FOLLOWERS@ + + %#@REACTED@ + %#@REACTED@ + + + + %2$@ and %1$d other reacted to a post you were tagged in + %2$@ and %1$d other reacted to a post you were tagged in + + + + %2$@ and %1$d others reacted to a post you were tagged in + %2$@ and %1$d others reacted to a post you were tagged in + + + + %#@REACTED@ + %#@REACTED@ + + + + %2$@ and %1$d other reacted to your post + %2$@ and %1$d other reacted to your post + + + + %2$@ and %1$d others reacted to your post + %2$@ and %1$d others reacted to your post + + + + %#@REACTED@ + %#@REACTED@ + + + + %2$@ and %1$d other reacted to your profile + %2$@ and %1$d other reacted to your profile + + + + %2$@ and %1$d others reacted to your profile + %2$@ and %1$d others reacted to your profile + + %#@REACTIONS@ %#@REACTIONS@ @@ -1372,6 +1417,51 @@ Label for filter for seeing your posts and replies (instead of only your posts). Replying to %2$@, %3$@ & %1$d others + + %#@REPOSTED@ + %#@REPOSTED@ + + + + %2$@ and %1$d other reposted a post you were tagged in + %2$@ and %1$d other reposted a post you were tagged in + + + + %2$@ and %1$d others reposted a post you were tagged in + %2$@ and %1$d others reposted a post you were tagged in + + + + %#@REPOSTED@ + %#@REPOSTED@ + + + + %2$@ and %1$d other reposted your post + %2$@ and %1$d other reposted your post + + + + %2$@ and %1$d others reposted your post + %2$@ and %1$d others reposted your post + + + + %#@REPOSTED@ + %#@REPOSTED@ + + + + %2$@ and %1$d other reposted your profile + %2$@ and %1$d other reposted your profile + + + + %2$@ and %1$d others reposted your profile + %2$@ and %1$d others reposted your profile + + %#@REPOSTS@ %#@REPOSTS@ @@ -1402,6 +1492,51 @@ Label for filter for seeing your posts and replies (instead of only your posts). %2$@ sats + + %#@ZAPPED@ + %#@ZAPPED@ + + + + %2$@ and %1$d other zapped a post you were tagged in + %2$@ and %1$d other zapped a post you were tagged in + + + + %2$@ and %1$d others zapped a post you were tagged in + %2$@ and %1$d others zapped a post you were tagged in + + + + %#@ZAPPED@ + %#@ZAPPED@ + + + + %2$@ and %1$d other zapped your post + %2$@ and %1$d other zapped your post + + + + %2$@ and %1$d others zapped your post + %2$@ and %1$d others zapped your post + + + + %#@ZAPPED@ + %#@ZAPPED@ + + + + %2$@ and %1$d other zapped your profile + %2$@ and %1$d other zapped your profile + + + + %2$@ and %1$d others zapped your profile + %2$@ and %1$d others zapped your profile + + %#@ZAPS@ %#@ZAPS@ 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 index 4a98b6e8b7fc3751c64c75878099fc9c31db615d..873df4c1957e4056b14d1f51b0a4c411e5802556 100644 GIT binary patch delta 488 zcmY+AUr1VU9L4$FYhiaH7rDqq#F_X|(Mn=Lv5+1LMueEKklLCIR;+rEY7i2#nrkpz zG*9%8YA$++pg;PJAc7FaU=KaW9)|P~!h#@12{vjYtb3(`J$~Vw^ZlHY%JPRJh1^vR znfo%_Eqa=h%L?FlHvrO zZxysvyI2$n8j)+zQ?y~3S3FiEEn2vDB(yf2!TrTf9nD@1(o+U_ee0enq6JQzmd$h z6XOG_j69nm9(#5h{56G?*mm*c+D!^K1DNUi&xb{{l^$Xck0g?RO=uLcOk>AsW$2g# p`|l*`KK-GT>o+6gkVuzJF#P+|cblNlYpL%%!tivsDdrjddkvK*(4GJQ delta 14 WcmaFT#CGE|Gt>WnoBP_Y{R99#Hwe)H diff --git a/damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.stringsdict b/damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.stringsdict index 21ef04ab..53fbef3a 100644 --- a/damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.stringsdict +++ b/damus/en-US.xcloc/Source Contents/damus/en-US.lproj/Localizable.stringsdict @@ -34,6 +34,54 @@ Followers + reacted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to a post you were tagged in + other + %2$@ and %1$d others reacted to a post you were tagged in + + + reacted_your_post_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your post + other + %2$@ and %1$d others reacted to your post + + + reacted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REACTED@ + REACTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reacted to your profile + other + %2$@ and %1$d others reacted to your profile + + reactions_count NSStringLocalizedFormatKey @@ -82,6 +130,54 @@ Replying to %2$@, %3$@ & %1$d others + reposted_tagged_in_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted a post you were tagged in + other + %2$@ and %1$d others reposted a post you were tagged in + + + reposted_your_post_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your post + other + %2$@ and %1$d others reposted your post + + + reposted_your_profile_3 + + NSStringLocalizedFormatKey + %#@REPOSTED@ + REPOSTED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other reposted your profile + other + %2$@ and %1$d others reposted your profile + + reposts_count NSStringLocalizedFormatKey @@ -114,6 +210,54 @@ %2$@ sats + zapped_tagged_in_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped a post you were tagged in + other + %2$@ and %1$d others zapped a post you were tagged in + + + zapped_your_post_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your post + other + %2$@ and %1$d others zapped your post + + + zapped_your_profile_3 + + NSStringLocalizedFormatKey + %#@ZAPPED@ + ZAPPED + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %2$@ and %1$d other zapped your profile + other + %2$@ and %1$d others zapped your profile + + zaps_count NSStringLocalizedFormatKey diff --git a/devtools/export-source-translation.sh b/devtools/export-source-translation.sh index b1a9b49f..e443317d 100755 --- a/devtools/export-source-translation.sh +++ b/devtools/export-source-translation.sh @@ -4,4 +4,4 @@ xcodebuild -exportLocalizations -project damus.xcodeproj -localizationPath "damus" -exportLanguage en-US # Generates all SwiftUI Text() wrapped localized strings. -genstrings -o "damus/en-US.xcloc/Source Contents/damus/en-US.lproj/" -SwiftUI **/*.swift +genstrings -a -d -o "damus/en-US.xcloc/Source Contents/damus/en-US.lproj/" -SwiftUI **/*.swift From 4b5c2172133f0dfe44226131a09cbab16b30c2a7 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Sun, 26 Feb 2023 14:14:25 -0800 Subject: [PATCH 61/65] Add scroll queue detection in notification view This will stop injecting events into the timeline if you're scrolling --- damus/Models/NotificationsModel.swift | 7 ++++- damus/Util/EventHolder.swift | 6 +++- .../Notifications/NotificationsView.swift | 6 ++++ damus/Views/TimelineView.swift | 28 +++++++++++-------- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/damus/Models/NotificationsModel.swift b/damus/Models/NotificationsModel.swift index bf45e1c7..634109f4 100644 --- a/damus/Models/NotificationsModel.swift +++ b/damus/Models/NotificationsModel.swift @@ -45,7 +45,8 @@ enum NotificationItem { } } -class NotificationsModel: ObservableObject { +class NotificationsModel: ObservableObject, ScrollQueue { + var incoming_zaps: [Zap] var incoming_events: [NostrEvent] var should_queue: Bool @@ -73,6 +74,10 @@ class NotificationsModel: ObservableObject { self.notifications = [] } + func set_should_queue(_ val: Bool) { + self.should_queue = val + } + func uniq_pubkeys() -> [String] { var pks = Set() diff --git a/damus/Util/EventHolder.swift b/damus/Util/EventHolder.swift index 5e3b58d8..58e0a221 100644 --- a/damus/Util/EventHolder.swift +++ b/damus/Util/EventHolder.swift @@ -8,12 +8,16 @@ import Foundation /// Used for holding back events until they're ready to be displayed -class EventHolder: ObservableObject { +class EventHolder: ObservableObject, ScrollQueue { private var has_event: Set @Published var events: [NostrEvent] @Published var incoming: [NostrEvent] var should_queue: Bool + func set_should_queue(_ val: Bool) { + self.should_queue = val + } + var queued: Int { return incoming.count } diff --git a/damus/Views/Notifications/NotificationsView.swift b/damus/Views/Notifications/NotificationsView.swift index 13b1cefe..6d0c03db 100644 --- a/damus/Views/Notifications/NotificationsView.swift +++ b/damus/Views/Notifications/NotificationsView.swift @@ -22,6 +22,12 @@ struct NotificationsView: View { NotificationItemView(state: state, item: item) } } + .background(GeometryReader { proxy -> Color in + DispatchQueue.main.async { + handle_scroll_queue(proxy, queue: self.notifications) + } + return Color.clear + }) .padding(.horizontal) } .onReceive(handle_notify(.scroll_to_top)) { notif in diff --git a/damus/Views/TimelineView.swift b/damus/Views/TimelineView.swift index e2a68452..a549ce3d 100644 --- a/damus/Views/TimelineView.swift +++ b/damus/Views/TimelineView.swift @@ -27,17 +27,6 @@ struct TimelineView: View { MainContent } - func handle_scroll(_ proxy: GeometryProxy) { - let offset = -proxy.frame(in: .named("scroll")).origin.y - guard offset >= 0 else { - return - } - let val = offset > 0 - if self.events.should_queue != val { - self.events.should_queue = val - } - } - var realtime_bar_opacity: Double { colorScheme == .dark ? 0.2 : 0.1 } @@ -55,7 +44,7 @@ struct TimelineView: View { .disabled(loading) .background(GeometryReader { proxy -> Color in DispatchQueue.main.async { - handle_scroll(proxy) + handle_scroll_queue(proxy, queue: self.events) } return Color.clear }) @@ -82,3 +71,18 @@ struct TimelineView_Previews: PreviewProvider { } +protocol ScrollQueue { + var should_queue: Bool { get } + func set_should_queue(_ val: Bool) +} + +func handle_scroll_queue(_ proxy: GeometryProxy, queue: ScrollQueue) { + let offset = -proxy.frame(in: .named("scroll")).origin.y + guard offset >= 0 else { + return + } + let val = offset > 0 + if queue.should_queue != val { + queue.set_should_queue(val) + } +} From 386bae64ca77eaa509ff5afbd962314a316132ca Mon Sep 17 00:00:00 2001 From: William Casarin Date: Sun, 26 Feb 2023 15:46:17 -0800 Subject: [PATCH 62/65] scroll coordinate space --- damus/Views/Notifications/NotificationsView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/damus/Views/Notifications/NotificationsView.swift b/damus/Views/Notifications/NotificationsView.swift index 6d0c03db..16c561c1 100644 --- a/damus/Views/Notifications/NotificationsView.swift +++ b/damus/Views/Notifications/NotificationsView.swift @@ -30,6 +30,7 @@ struct NotificationsView: View { }) .padding(.horizontal) } + .coordinateSpace(name: "scroll") .onReceive(handle_notify(.scroll_to_top)) { notif in let _ = notifications.flush() self.notifications.should_queue = false From 0f29d67e1fd2342779dc558f101950d8b9856385 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Sun, 26 Feb 2023 15:56:31 -0800 Subject: [PATCH 63/65] ensure blocked users do not show in notifications --- damus/Models/HomeModel.swift | 4 ++++ damus/Models/NotificationsModel.swift | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/damus/Models/HomeModel.swift b/damus/Models/HomeModel.swift index 53816b4c..fd502ec1 100644 --- a/damus/Models/HomeModel.swift +++ b/damus/Models/HomeModel.swift @@ -456,6 +456,10 @@ class HomeModel: ObservableObject { return } + guard should_show_event(contacts: damus_state.contacts, ev: ev) else { + return + } + damus_state.events.insert(ev) if let inner_ev = ev.inner_event { damus_state.events.insert(inner_ev) diff --git a/damus/Models/NotificationsModel.swift b/damus/Models/NotificationsModel.swift index 634109f4..82826e68 100644 --- a/damus/Models/NotificationsModel.swift +++ b/damus/Models/NotificationsModel.swift @@ -46,7 +46,6 @@ enum NotificationItem { } class NotificationsModel: ObservableObject, ScrollQueue { - var incoming_zaps: [Zap] var incoming_events: [NostrEvent] var should_queue: Bool From 4a6c6a65ab3ce804a6f38760903247708077a03e Mon Sep 17 00:00:00 2001 From: William Casarin Date: Sun, 26 Feb 2023 15:59:55 -0800 Subject: [PATCH 64/65] v1.1.0-9 --- damus.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index 1658f8ce..c539b594 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -1753,7 +1753,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\""; DEVELOPMENT_TEAM = XK7H4JAB3D; ENABLE_PREVIEWS = YES; @@ -1795,7 +1795,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\""; DEVELOPMENT_TEAM = XK7H4JAB3D; ENABLE_PREVIEWS = YES; From 1288732e5dc0a5578a8052ff749fb606f521fcaa Mon Sep 17 00:00:00 2001 From: William Casarin Date: Sun, 26 Feb 2023 16:01:21 -0800 Subject: [PATCH 65/65] v1.1.0-9 changelog --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 776fbd4e..41c0faf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ + +## [1.1.0-9] - 2023-02-26 + +### Added + +- Customized zaps (William Casarin) +- Add new Notifications View (William Casarin) +- Bookmarking (Joel Klabo) + +### Changed + +- No more inline npubs when tagging users (Swift) + + +### Fixed + +- Fix alignment of side menu labels (Joel Klabo) +- Fix duplicated participants in reply-to view (Joel Klabo) +- Load missing profiles in Zaps view (William Casarin) +- Fix memory leak with inline videos (William Casarin) +- Eliminate popping when scrolling (William Casarin) + + +[1.1.0-9]: https://github.com/damus-io/damus/releases/tag/v1.1.0-9 + ## [1.1.0-3] - 2023-02-20 ### Added