From 1767a677bba675495e33e6720ca9f546978b1586 Mon Sep 17 00:00:00 2001 From: Terry Yiu Date: Sun, 28 Jul 2024 22:48:05 -0400 Subject: [PATCH 01/19] Fix profile view toolbar alignment bug in iOS 18 Changelog-Fixed: Fix profile view toolbar alignment bug in iOS 18 --- damus/Views/Profile/ProfileView.swift | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/damus/Views/Profile/ProfileView.swift b/damus/Views/Profile/ProfileView.swift index 235720e0..a17df5f0 100644 --- a/damus/Views/Profile/ProfileView.swift +++ b/damus/Views/Profile/ProfileView.swift @@ -217,16 +217,6 @@ struct ProfileView: View { } } - var customNavbar: some View { - HStack { - navBackButton - Spacer() - navActionSheetButton - } - .padding(.top, 5) - .accentColor(DamusColors.white) - } - func lnButton(unownedProfile: Profile?, record: ProfileRecord?) -> some View { return ProfileZapLinkView(unownedProfileRecord: record, profileModel: self.profile) { reactions_enabled, lud16, lnurl in Image(reactions_enabled ? "zap.fill" : "zap") @@ -458,8 +448,15 @@ struct ProfileView: View { .navigationTitle("") .navigationBarBackButtonHidden() .toolbar { - ToolbarItem(placement: .principal) { - customNavbar + ToolbarItem(placement: .topBarLeading) { + navBackButton + .padding(.top, 5) + .accentColor(DamusColors.white) + } + ToolbarItem(placement: .topBarTrailing) { + navActionSheetButton + .padding(.top, 5) + .accentColor(DamusColors.white) } } .toolbarBackground(.hidden) From 653f9fbcbe0e33855faec4a9be159e91eb5b9081 Mon Sep 17 00:00:00 2001 From: ericholguin Date: Tue, 2 Jul 2024 20:02:20 -0600 Subject: [PATCH 02/19] relay: Add Tor Relay Image This PR just adds the tor icon to relays ending with .onion Changelog-Added: Tor relay icon Closes: #2318 Signed-off-by: ericholguin --- damus/Assets.xcassets/tor.imageset/Contents.json | 12 ++++++++++++ damus/Assets.xcassets/tor.imageset/tor.svg.png | Bin 0 -> 4304 bytes damus/Views/Relays/RelayView.swift | 7 +++++++ 3 files changed, 19 insertions(+) create mode 100644 damus/Assets.xcassets/tor.imageset/Contents.json create mode 100644 damus/Assets.xcassets/tor.imageset/tor.svg.png diff --git a/damus/Assets.xcassets/tor.imageset/Contents.json b/damus/Assets.xcassets/tor.imageset/Contents.json new file mode 100644 index 00000000..62062a1b --- /dev/null +++ b/damus/Assets.xcassets/tor.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "tor.svg.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/damus/Assets.xcassets/tor.imageset/tor.svg.png b/damus/Assets.xcassets/tor.imageset/tor.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..0f4afdb19e1e2d3a18680f08b2ff3f4812accd07 GIT binary patch literal 4304 zcmV;>5HIhEP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/damus/Views/Relays/RelayView.swift b/damus/Views/Relays/RelayView.swift index a50a35b5..428e8b73 100644 --- a/damus/Views/Relays/RelayView.swift +++ b/damus/Views/Relays/RelayView.swift @@ -50,6 +50,13 @@ struct RelayView: View { .padding(.bottom, 2) .lineLimit(1) RelayType(is_paid: state.relay_model_cache.model(with_relay_id: relay)?.metadata.is_paid ?? false) + + if relay.absoluteString.hasSuffix(".onion") { + Image("tor") + .resizable() + .interpolation(.none) + .frame(width: 20, height: 20) + } } Text(relay.absoluteString) .font(.subheadline) From 740c10c9b27a21204cc0097ddc6a954a5fea365d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=E2=80=99Aquino?= Date: Sat, 3 Aug 2024 20:03:14 -0700 Subject: [PATCH 03/19] Implement push notification preferences and update API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit implements push notification preferences with the push notifications server, as well as updates itself to the new push notifications API. Testing ------- Device: iPhone 15 simulator iOS: 17.5 Damus: this commit notepush: 3ca3a8325707535fdbc98d681d5e4a47dc313c67 Steps: 1. Enable push notifications. Settings should get synced and success message should appear 2. Disable push notifications. Sync message should disappear as it no longer applies 3. Enable push notifications again, and tweak notifications. Settings should sync with no errors 4. Leave settings screen and come back. Settings should be declared as synced Signed-off-by: Daniel D’Aquino Closes: https://github.com/damus-io/damus/issues/2360 --- damus/Models/PushNotificationClient.swift | 218 ++++++++++++++++-- damus/Util/Constants.swift | 8 +- .../Settings/NotificationSettingsView.swift | 121 +++++++++- 3 files changed, 311 insertions(+), 36 deletions(-) diff --git a/damus/Models/PushNotificationClient.swift b/damus/Models/PushNotificationClient.swift index 13e75758..70775783 100644 --- a/damus/Models/PushNotificationClient.swift +++ b/damus/Models/PushNotificationClient.swift @@ -11,6 +11,10 @@ struct PushNotificationClient { let keypair: Keypair let settings: UserSettingsStore private(set) var device_token: Data? = nil + var device_token_hex: String? { + guard let device_token else { return nil } + return device_token.map { String(format: "%02.2hhx", $0) }.joined() + } mutating func set_device_token(new_device_token: Data) async throws { self.device_token = new_device_token @@ -20,26 +24,21 @@ struct PushNotificationClient { } func send_token() async throws { - guard let device_token else { return } // Send the device token and pubkey to the server - let token = device_token.map { String(format: "%02.2hhx", $0) }.joined() + guard let token = device_token_hex else { return } Log.info("Sending device token to server: %s", for: .push_notifications, token) - let pubkey = self.keypair.pubkey - - // Send those as JSON to the server - let json: [String: Any] = ["deviceToken": token, "pubkey": pubkey.hex()] - // create post request - let url = self.settings.send_device_token_to_localhost ? Constants.DEVICE_TOKEN_RECEIVER_TEST_URL : Constants.DEVICE_TOKEN_RECEIVER_PRODUCTION_URL - let json_data = try JSONSerialization.data(withJSONObject: json) - + let url = self.current_push_notification_environment().api_base_url() + .appendingPathComponent("user-info") + .appendingPathComponent(self.keypair.pubkey.hex()) + .appendingPathComponent(token) let (data, response) = try await make_nip98_authenticated_request( - method: .post, + method: .put, url: url, - payload: json_data, + payload: nil, payload_type: .json, auth_keypair: self.keypair ) @@ -58,26 +57,23 @@ struct PushNotificationClient { } func revoke_token() async throws { - guard let device_token else { return } - // Send the device token and pubkey to the server - let token = device_token.map { String(format: "%02.2hhx", $0) }.joined() + guard let token = device_token_hex else { return } Log.info("Revoking device token from server: %s", for: .push_notifications, token) let pubkey = self.keypair.pubkey - // Send those as JSON to the server - let json: [String: Any] = ["deviceToken": token, "pubkey": pubkey.hex()] - // create post request - let url = self.settings.send_device_token_to_localhost ? Constants.DEVICE_TOKEN_REVOKER_TEST_URL : Constants.DEVICE_TOKEN_REVOKER_PRODUCTION_URL - let json_data = try JSONSerialization.data(withJSONObject: json) + let url = self.current_push_notification_environment().api_base_url() + .appendingPathComponent("user-info") + .appendingPathComponent(pubkey.hex()) + .appendingPathComponent(token) let (data, response) = try await make_nip98_authenticated_request( - method: .post, + method: .delete, url: url, - payload: json_data, + payload: nil, payload_type: .json, auth_keypair: self.keypair ) @@ -94,6 +90,78 @@ struct PushNotificationClient { return } + + func set_settings(_ new_settings: NotificationSettings? = nil) async throws { + // Send the device token and pubkey to the server + guard let token = device_token_hex else { return } + + Log.info("Sending notification preferences to the server", for: .push_notifications) + + let url = self.current_push_notification_environment().api_base_url() + .appendingPathComponent("user-info") + .appendingPathComponent(self.keypair.pubkey.hex()) + .appendingPathComponent(token) + .appendingPathComponent("preferences") + + let json_payload = try JSONEncoder().encode(new_settings ?? NotificationSettings.from(settings: settings)) + + let (data, response) = try await make_nip98_authenticated_request( + method: .put, + url: url, + payload: json_payload, + payload_type: .json, + auth_keypair: self.keypair + ) + + if let httpResponse = response as? HTTPURLResponse { + switch httpResponse.statusCode { + case 200: + Log.info("Sent notification settings to Damus push notification server successfully", for: .push_notifications) + default: + Log.error("Error in sending notification settings to Damus push notification server. HTTP status code: %d; Response: %s", for: .push_notifications, httpResponse.statusCode, String(data: data, encoding: .utf8) ?? "Unknown") + throw ClientError.http_response_error(status_code: httpResponse.statusCode, response: data) + } + } + + return + } + + func get_settings() async throws -> NotificationSettings { + // Send the device token and pubkey to the server + guard let token = device_token_hex else { + throw ClientError.no_device_token + } + + let url = self.current_push_notification_environment().api_base_url() + .appendingPathComponent("user-info") + .appendingPathComponent(self.keypair.pubkey.hex()) + .appendingPathComponent(token) + .appendingPathComponent("preferences") + + let (data, response) = try await make_nip98_authenticated_request( + method: .get, + url: url, + payload: nil, + payload_type: .json, + auth_keypair: self.keypair + ) + + if let httpResponse = response as? HTTPURLResponse { + switch httpResponse.statusCode { + case 200: + guard let notification_settings = NotificationSettings.from(json_data: data) else { throw ClientError.json_decoding_error } + return notification_settings + default: + Log.error("Error in getting notification settings to Damus push notification server. HTTP status code: %d; Response: %s", for: .push_notifications, httpResponse.statusCode, String(data: data, encoding: .utf8) ?? "Unknown") + throw ClientError.http_response_error(status_code: httpResponse.statusCode, response: data) + } + } + throw ClientError.could_not_process_response + } + + func current_push_notification_environment() -> Environment { + return self.settings.send_device_token_to_localhost ? .local_test(host: nil) : .production + } } // MARK: Helper structures @@ -101,5 +169,111 @@ struct PushNotificationClient { extension PushNotificationClient { enum ClientError: Error { case http_response_error(status_code: Int, response: Data) + case could_not_process_response + case no_device_token + case json_decoding_error + } + + struct NotificationSettings: Codable, Equatable { + let zap_notifications_enabled: Bool + let mention_notifications_enabled: Bool + let repost_notifications_enabled: Bool + let reaction_notifications_enabled: Bool + let dm_notifications_enabled: Bool + let only_notifications_from_following_enabled: Bool + + static func from(json_data: Data) -> Self? { + guard let decoded = try? JSONDecoder().decode(Self.self, from: json_data) else { return nil } + return decoded + } + + static func from(settings: UserSettingsStore) -> Self { + return NotificationSettings( + zap_notifications_enabled: settings.zap_notification, + mention_notifications_enabled: settings.mention_notification, + repost_notifications_enabled: settings.repost_notification, + reaction_notifications_enabled: settings.like_notification, + dm_notifications_enabled: settings.dm_notification, + only_notifications_from_following_enabled: settings.notification_only_from_following + ) + } + + } + + enum Environment: CaseIterable, Codable, Identifiable, StringCodable, Equatable, Hashable { + static var allCases: [Environment] = [.local_test(host: nil), .production] + + case local_test(host: String?) + case production + + func text_description() -> String { + switch self { + case .local_test: + return NSLocalizedString("Test (local)", comment: "Label indicating a local test environment for Push notification functionality (Developer feature)") + case .production: + return NSLocalizedString("Production", comment: "Label indicating the production environment for Push notification functionality") + } + } + + func api_base_url() -> URL { + switch self { + case .local_test(let host): + URL(string: "http://\(host ?? "localhost:8000")") ?? Constants.PUSH_NOTIFICATION_SERVER_TEST_BASE_URL + case .production: + Constants.PURPLE_API_PRODUCTION_BASE_URL + + } + } + + func custom_host() -> String? { + switch self { + case .local_test(let host): + return host + default: + return nil + } + } + + init?(from string: String) { + switch string { + case "local_test": + self = .local_test(host: nil) + case "production": + self = .production + default: + let components = string.split(separator: ":", maxSplits: 1, omittingEmptySubsequences: false) + if components.count == 2 && components[0] == "local_test" { + self = .local_test(host: String(components[1])) + } else { + return nil + } + } + } + + func to_string() -> String { + switch self { + case .local_test(let host): + if let host { + return "local_test:\(host)" + } + return "local_test" + case .production: + return "production" + } + } + + var id: String { + switch self { + case .local_test(let host): + if let host { + return "local_test:\(host)" + } + else { + return "local_test" + } + case .production: + return "production" + } + } } } diff --git a/damus/Util/Constants.swift b/damus/Util/Constants.swift index f3cbf43a..279b92d7 100644 --- a/damus/Util/Constants.swift +++ b/damus/Util/Constants.swift @@ -10,13 +10,13 @@ import Foundation class Constants { //static let EXAMPLE_DEMOS: DamusState = .empty static let DAMUS_APP_GROUP_IDENTIFIER: String = "group.com.damus" - static let DEVICE_TOKEN_RECEIVER_PRODUCTION_URL: URL = URL(string: "http://45.33.32.5:8000/user-info")! - static let DEVICE_TOKEN_RECEIVER_TEST_URL: URL = URL(string: "http://localhost:8000/user-info")! - static let DEVICE_TOKEN_REVOKER_PRODUCTION_URL: URL = URL(string: "http://45.33.32.5:8000/user-info/remove")! - static let DEVICE_TOKEN_REVOKER_TEST_URL: URL = URL(string: "http://localhost:8000/user-info/remove")! static let MAIN_APP_BUNDLE_IDENTIFIER: String = "com.jb55.damus2" static let NOTIFICATION_EXTENSION_BUNDLE_IDENTIFIER: String = "com.jb55.damus2.DamusNotificationService" + // MARK: Push notification server + static let PUSH_NOTIFICATION_SERVER_PRODUCTION_BASE_URL: URL = URL(string: "http://45.33.32.5:8000")! + static let PUSH_NOTIFICATION_SERVER_TEST_BASE_URL: URL = URL(string: "http://localhost:8000")! + // MARK: Purple // API static let PURPLE_API_LOCAL_TEST_BASE_URL: URL = URL(string: "http://localhost:8989")! diff --git a/damus/Views/Settings/NotificationSettingsView.swift b/damus/Views/Settings/NotificationSettingsView.swift index f2711156..4ce30ef4 100644 --- a/damus/Views/Settings/NotificationSettingsView.swift +++ b/damus/Views/Settings/NotificationSettingsView.swift @@ -7,10 +7,13 @@ import SwiftUI +let MINIMUM_PUSH_NOTIFICATION_SYNC_DELAY_IN_SECONDS = 0.25 + struct NotificationSettingsView: View { let damus_state: DamusState @ObservedObject var settings: UserSettingsStore @State var notification_mode_setting_error: String? = nil + @State var notification_preferences_sync_state: PreferencesSyncState = .undefined @Environment(\.dismiss) var dismiss @@ -32,6 +35,7 @@ struct NotificationSettingsView: View { Task { do { try await damus_state.push_notification_client.send_token() + await self.sync_up_remote_notification_settings() settings.notifications_mode = new_value } catch { @@ -44,6 +48,7 @@ struct NotificationSettingsView: View { do { try await damus_state.push_notification_client.revoke_token() settings.notifications_mode = new_value + notification_preferences_sync_state = .not_applicable } catch { notification_mode_setting_error = String(format: NSLocalizedString("Error disabling push notifications with the server: %@", comment: "Error label shown when user tries to disable push notifications but something fails"), error.localizedDescription) @@ -52,6 +57,61 @@ struct NotificationSettingsView: View { } } + // MARK: - Push notification preference sync management + + func notification_preference_binding(_ raw_binding: Binding) -> Binding { + return Binding( + get: { + return raw_binding.wrappedValue + }, + set: { new_value in + let old_value = raw_binding.wrappedValue + raw_binding.wrappedValue = new_value + if self.settings.notifications_mode == .push { + Task { + await self.send_push_notification_preferences(on_failure: { + raw_binding.wrappedValue = old_value + }) + } + } + } + ) + } + + func sync_up_remote_notification_settings() async { + do { + notification_preferences_sync_state = .syncing + let remote_settings = try await damus_state.push_notification_client.get_settings() + let local_settings = PushNotificationClient.NotificationSettings.from(settings: settings) + if remote_settings != local_settings { + await self.send_push_notification_preferences(local_settings) + } + else { + notification_preferences_sync_state = .success + } + } + catch { + notification_preferences_sync_state = .failure(error: String(format: NSLocalizedString("Failed to get push notification preferences from the server", comment: "Error label indicating about a failure in fetching notification preferences"), error.localizedDescription)) + } + } + + func send_push_notification_preferences(_ new_settings: PushNotificationClient.NotificationSettings? = nil, on_failure: (() -> Void)? = nil) async { + do { + notification_preferences_sync_state = .syncing + try await damus_state.push_notification_client.set_settings(new_settings) + // Make sync appear to take at least a few milliseconds or so to avoid issues with labor perception bias (https://growth.design/case-studies/labor-perception-bias) + DispatchQueue.main.asyncAfter(deadline: .now() + MINIMUM_PUSH_NOTIFICATION_SYNC_DELAY_IN_SECONDS) { + notification_preferences_sync_state = .success + } + } + catch { + notification_preferences_sync_state = .failure(error: String(format: NSLocalizedString("Error syncing up push notifications preferences with the server: %@", comment: "Error label shown when system tries to sync up notification preferences to the push notification server but something fails"), error.localizedDescription)) + on_failure?() + } + } + + // MARK: - View layout + var body: some View { Form { if settings.enable_experimental_push_notifications { @@ -80,21 +140,40 @@ struct NotificationSettingsView: View { } } - Section(header: Text("Local Notifications", comment: "Section header for damus local notifications user configuration")) { - Toggle(NSLocalizedString("Zaps", comment: "Setting to enable Zap Local Notification"), isOn: $settings.zap_notification) + Section( + header: Text("Notification Preferences", comment: "Section header for Notification Preferences"), + footer: VStack { + switch notification_preferences_sync_state { + case .undefined, .not_applicable: + EmptyView() + case .success: + HStack { + Image("check-circle.fill") + .foregroundStyle(.damusGreen) + Text("Successfully synced", comment: "Label indicating success in syncing notification preferences") + } + case .syncing: + HStack(spacing: 10) { + ProgressView() + Text("Syncing", comment: "Label indicating success in syncing notification preferences") + } + case .failure(let error): + Text(error) + .foregroundStyle(.damusDangerPrimary) + } + } + ) { + Toggle(NSLocalizedString("Zaps", comment: "Setting to enable Zap Local Notification"), isOn: self.notification_preference_binding($settings.zap_notification)) .toggleStyle(.switch) - Toggle(NSLocalizedString("Mentions", comment: "Setting to enable Mention Local Notification"), isOn: $settings.mention_notification) + Toggle(NSLocalizedString("Mentions", comment: "Setting to enable Mention Local Notification"), isOn: self.notification_preference_binding($settings.mention_notification)) .toggleStyle(.switch) - Toggle(NSLocalizedString("Reposts", comment: "Setting to enable Repost Local Notification"), isOn: $settings.repost_notification) + Toggle(NSLocalizedString("Reposts", comment: "Setting to enable Repost Local Notification"), isOn: self.notification_preference_binding($settings.repost_notification)) .toggleStyle(.switch) - Toggle(NSLocalizedString("Likes", comment: "Setting to enable Like Local Notification"), isOn: $settings.like_notification) + Toggle(NSLocalizedString("Likes", comment: "Setting to enable Like Local Notification"), isOn: self.notification_preference_binding($settings.like_notification)) .toggleStyle(.switch) - Toggle(NSLocalizedString("DMs", comment: "Setting to enable DM Local Notification"), isOn: $settings.dm_notification) + Toggle(NSLocalizedString("DMs", comment: "Setting to enable DM Local Notification"), isOn: self.notification_preference_binding($settings.dm_notification)) .toggleStyle(.switch) - } - - Section(header: Text("Notification Preference", comment: "Section header for Notification Preferences")) { - Toggle(NSLocalizedString("Show only from users you follow", comment: "Setting to Show notifications only associated to users your follow"), isOn: $settings.notification_only_from_following) + Toggle(NSLocalizedString("Show only from users you follow", comment: "Setting to Show notifications only associated to users your follow"), isOn: self.notification_preference_binding($settings.notification_only_from_following)) .toggleStyle(.switch) } @@ -113,6 +192,28 @@ struct NotificationSettingsView: View { .onReceive(handle_notify(.switched_timeline)) { _ in dismiss() } + .onAppear(perform: { + Task { + if self.settings.notifications_mode == .push { + await self.sync_up_remote_notification_settings() + } + } + }) + } +} + +extension NotificationSettingsView { + enum PreferencesSyncState { + /// State is unknown + case undefined + /// State is not applicable (e.g. Notifications are set to local) + case not_applicable + /// Preferences are successfully synced + case success + /// Preferences are being synced + case syncing + /// There was a failure during syncing + case failure(error: String) } } From f49169c03cedae107d82fa3fc1fcc05698d94bec Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 04:50:06 +0000 Subject: [PATCH 04/19] Translate InfoPlist.strings in sw 100% translated source file: 'InfoPlist.strings' on 'sw'. --- damus/sw.lproj/InfoPlist.strings | Bin 1778 -> 1758 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/sw.lproj/InfoPlist.strings b/damus/sw.lproj/InfoPlist.strings index 5ce92090dce446df28de5ada120b40347469821f..28cca48e1ce57a5732c952ad8b4845084a6de84b 100644 GIT binary patch delta 235 zcmeywdyjX+0;b6gj5?E#FiAz{Fk~_)Fk~~7G88Z*0_jX3sQ_eWG9)u(fZ2Iq5~Knm zlE;t^6v+efK`L{BDvNII%7O9hiA_YLT$v_i9szI_PKzW#2kQtQ>`I{Y?*E2E$EuP%SC_I^s zg|8lBILMj;pc05d#XuHFJIF~81G9lfDFFGTIHwG#J_YDFkj^R~I|qoXfV?807|6U7 XAirD&r)#qrQYYIpD{o%KYQhKryj4If From 4fb4f3a2de325ebfd3a8bae3a63957ebaf4b82ff Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:43:51 +0000 Subject: [PATCH 05/19] Translate Localizable.strings in hu_HU 100% translated source file: 'Localizable.strings' on 'hu_HU'. --- damus/hu-HU.lproj/Localizable.strings | Bin 137138 -> 148480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/hu-HU.lproj/Localizable.strings b/damus/hu-HU.lproj/Localizable.strings index 66efa4961b7f3b1385dcc549c7650b9b2f6faffe..35f531f165dd7a79de5c2a53d583121613f8eac4 100644 GIT binary patch delta 8969 zcmcgx3viTGmi|w75;~nu+v(1$^B|oN5+dXQhSA{gh#&)kAv_GvS<@sjgggjIASPi< zw00c|#W;@0%Z}5fqYj`mgvD$zW=@Fo^$Rw-+BBm9JTdqi$3;Qa?D0!ld-{QGir?LKuKCX1wKo5Mcv(q zu}wx3#(lVZ09PJq!mJM5x8Rr8)v3E`jI`mY&uGQiT3o9zUT3V8{vVJ>oS*23;{^?d zABzhxZNAYYK1uP8sl!yC(JlvmK?&WhpwNhEZN@sRZ8B={r~!BN81osqMzJx;C{iEZ z$B%iuxDemlFzPd^75P@ooP>W&$qy#d=#^BoF2Qy(Y$C+Bwjv*hZx;R+J^3SA;*sGkvmoDee8Y5zC#^<} z9Pm<-T=)k{ll`xfUG6_e-wv$HaNi<}aw$SCaguwYHrL5mu1%H=$~4fmAj9Uf4u{un zG|6{=Na=C+4qL^Dy~&M_Q-X}LT3iX5n4ZqhnfqG#@cWc5-k9QAS_gVnil&~(2F5zm znlp_g+$cu#6%v%k*BPIJr-5jTCnQc@NSt<%t${y$O~Nex>x416x>A%uqfKV!l1Cj% ziI!ptyqLvgY-zzU6dEkH_S~;Ys=wlhuH-T#nSS!AIN(eQJXG*Pq_}*CEAVvjS*s|Y z;*h<&DNAfA@x?VkCv!&qn6RjA%*_>$ls*xsoj5x;;lc zUg8wH>(j)Sx7l#-lG&9MugC|sl>D5;&@1t>Xcz4L@Akq6KKp_atw05Fe1=E9^BUPB z^_~~*NT(XHuQ*jc;vlye`l(H>xl9FO#`dT{)14L)t_r&>&ZQjT+Yli?D<_wD??adD zvsn_yX}Hw*%>KjN`oVpp0#p?e7<|N>uEg|GV~%kzFue@!YP#*nn0WY1Ng#RpyjXcG zf+EDwM-FkMIWgc^SZ)!O_k1jJy4+&Lf+_N{-I9{d+Nm)*p&j0hr5J#jRN>lY%naOH z_WBsn{Ov5!dwiZavZ`9Xy^ZXFq1E%8ED4hpA8&I^ZUK`V85sSUpmxb>bs%-hJ^87& zM-{Kc@%KGefR#ACB-P8Vdbe?(vCt^R9mfhyr&Z*=xFF^(75%PSB`P0`=tYK4Z1fj9GQSJD$Z6wHd1!Bl+KVjR{bB8$Qk8U>dxn5R&+n;j|)v zvJ{0^P{{8dMWO(UAH+9LF`^YwiW$w=qy~u2Dp-o=S~zBzRkeCV^lP!u4#aH7_Wlt% z1z?whb|I+xYY?&hxG7Z9vVphY1UR1OV>|x0S;@yZ&U4z}2K=1=RpWOvep%mqzljOr ze_psr;e68N`F@H=s=(O<+e(89!@O}dIMFijJ*NkojX_1ML0K((TMI0y2@2+Q9BTMj zIK60t%6&Jk^lmKH=azq6r4K?Dwt-GuLyBjM>cr?;P|&P!J`%3@d}F;b_iHnxkD&2- zXYjQgfjkg_Bo2-%n|@0^S(!_=K=b-yYap#@nnm>NPYyIUpS8=UZ5Fq9Ys1)EbbPOZ zQZ)>fR;(2NvL#AXcG*PvmI4MZv16q(aBlfn8h&6`?iagqT4 zXe$?84xSqDfxU=#FDLAoO6!EHIZ705DKnw8Smw;5WO>&;lp>zrk|WOVc7e@n!De#q zA^_$x*v4#JL%_KJBjp%dYAjM1v`jqwn+(za=lH<1@6ELa-t3tWC;BTQ!;?Bc15Hu+@$G>e8P zQ8;!u#GAsgdsU)*@+djR42v!=?O{{cH6zgZ=xY&j|3VrYsiK3tKaLW{lwoUluzWa{ z(q;K}as;;hxH3}2H>T}=C`ufADnk~rn3kr5-`B%7)s?rVblyzwV0tZ$dS+*_}NdNAZ9c|xDKxnZ#|bC*z;UZ zH1>8UnHmbk>2+*-^7MBol^zhgUh$}WzYVa#nGsWFi`K!=++Bw(GjAPE_(XlcJCUP6 zXe~=oi}lxBCwBFD#2Y)4V^xleIfIzp5%?rv&5&FF83B6h>+xdJC7b-611I#iM-a`I zO?1m=qA4-(`I$7Ew6syYczeBF^kmq@nhZyv^8F`cy0xk6SmeX*S7`_QFkg(g52!nB zL>!MMD0F7CVxZlGb7chQyQUEt*fDuUo+|1}m7{J@!GZ0d#tFg-0&s=cB5s2R6`#_! zXk4ATvRRSjV8-*b)$)d1x^Wmb%c%KRu~-x4F!K~%aGtrFxZeQy;%g(WCWsA!$+p12Urr}5h6QGQ@rX5Y9vEm6yA~yg^1&YYCLzzOo=J&v zYm{Xy(8VT;k5YURYr4!>4qPY*6a72#R~EW$wV5Sx#>7biN4E}TrW|~#z|v?$~se(V;0;XjfphfuzW zh9O%5Cnn8`N$x5P`;0jHTIPKmL3vF3AzLa3{wAa}9BY3*W1D`ARenIW2}R0)Df^2Yqfi zYacT3w;fdA@fkTF*$kbxfG{)BDrvd2U2ab-x9%aIXHR+SGcLbpYj zqv1FqezqkKB)Px9-d3%g0p^F6Ny43F$cnDWOqE=^7tw?@EV-GYv4L~8!GWPb91WFaQ=rQIAa#Q;1!Q=c7-bFb1RUIz3H|TCW(rSZXr8rtFI3Pw!m za)ud;ytoA|m5`O(!d8-xQ)MebiWmHchls|=@-65|_FRT*p}!)=c1MXxU5@dbEb7qH z4z7o*2k_1bl^OeTMd|*$^xRQ7&r+KZeCi`B6b)nL8%M%}wO_tBbCHVw7#2f3~UY*i1qcv#yFh27E z0iosIYyfycfNWGJ{{B$9+{O$XAqP*;cq>wF(cPEssZeKQri?87I_W)0 zsp7=mWO3^G93-PmVF254mc9UB)B?BuT-KbV{1}FI?vB(N9rE`l=}txViN1{BlfR^` z7IDmCv!Y+FB1=iAs^Bc82_K!kgk_b(syCeoSrA;WRGdDPM6L4VDN69@))6Ny*$fYD(KXDj#q6Qzz+tna>0NxAodxS1@O?sPRPb>hHM)W9z}#o5Oq zO6MaQnNFu81~>7-i$%=`JEL}122jlp$8%`n1m#6?XUs4E^#qM83{UXyR!Y$=f89#r zytxzW{vB67?t1Zyz3DiW>~3}+mX%ZDMw|}g3%@EDu~#ULE1pj=YPuXB6d!O%OWb?q zv*rGnU!89ms4`e{w!xOl?i=2t)iJJF{_r`9?$+e>DRN`26W<1GQKv|8spdlr&`j1U zujTBWqfxa=3Yandl-Gs?YJ-t+jm?p-Rn4q7%?{#do5Rx-OwdVw1AciygYh}GhaSY@ z^GQ}PCI?PZp%t+$IPf|>5hKfsXzZx+I)+`H6@q+RESi|4s%$yqG&wx2quiUTx(2y8 zpOS(-r)iGoCh8mS==z2|_p56hHeU{UtbASLn8D*lDjjZ**2%&TDSf!cky}5c8Supj z@le5BdDoxlWi;N{8yWQYu}cent9cl2;s@pLbqH$6Ez6lo`lm8ja^BKjO?F*H%V*Ca>Ut(T;ktkysTV7_TaBC(U;e-*fH%m zB{c9ytTlDH9)QZi;}Lg9HnYKcC;f<|^fq+4QVT?QMEsFB!tdv1>rhaF6gKEgXo*Gyk+|y#g%@>?ErIP94Dha(L zy$N;9*6QH3-;6SnbeY4b%~=Rr1+#E7Vy8^MHjSGQJ5P%pI%l-8pn_|hbZ~p5<#62p E0Lj%`DgXcg delta 2999 zcma)8e@v9;9e=(ra2zkkaUR^k@#8o^Ev1SKNw-c#AdFCkgsH=JaqJE_ejW#f1Cf{% zBUQs3z4|14)e;2LR+mXdU+QaGr{Wg3tgZw9SeB;iz;xZp9}Hr$HjArpU?OE^q-8nc11t=RiffeGU?E%mr|4`nbom;?6Y#^rSEzo_zj<(FC7by zZD7r;leIAibFq3>k8eDNxa4N$WgV=W`RH=fu!Ej$tev&6W@UQkqcC(PLOlK_T{7`c zxc*sfCF$|9Moo`*?E?Dt(Nghj!sRTmU||o0^NNzBOb7eHs#=yo61(WmSTp8eWqfvb zI?mOBf!`@C#+Hx4pwt!*0{7q4Dcr7!bh`g$0hiP$W#cF21(Ia7Laz7YA+Xc#W3(s}di`0j? zStq_)0m<0$GRQdaGT3A42_qtwW-`~si~gM))kz~B8ad31oSFR0mnL$pPurt*)`hO$ zfen|krH4wd%NxTdZ<}!RBsh3~o~#_~$_wKKK4WYTsdKYKTE@Q>I$b@D61e&DgiV?2 zos+r$L{iv(){ehUkP`TjDRWd{7agpXzcP@??I&*r5rp^CA&YwkARN!iP%3y zknOzajNlccGT$;$%=<6rbK^u_l!KKLg4$VI(76O3dqf#?5S;o5f<6so9juPW4%vd> z8Qudr<=n(TByYNCP)@yf3b6k?Y(#GlCGYsWnd@SWxVT%=;aeYrH7dw3obLt;AKD>D z2ZxvgKcHy1^F|9#xuI7E)uAY*{O%`qe&0Pza0ciavLcZ%vllAz+Ow!RDb!^%jp6*>6P^FSSQg#D+JeEL~ajr21IFv{gIgIZh;xdz_9*Un2$+Og6|e3?m+ zZ4PqJ&0e9{MB8ywIvvz$M2)yzZo!#qs6_uHSfgDuBYKZ;=<3AQXz|xcYpBKG_!u$p zR01`h#pC+4ZjuyoV$Q)zNLL$a7kUFJo;E>(rHY0F3PYGE#_0pZ2w631Ce_CWV8N!| z=maOA$uBBVL^xLaAyHlM!BT)_KNLQTKGQ~*n=G#DjhfX}4hYDsmke~$Ap6kvA*96w zf7w>nibpe~O#acV{7gG}AIR0ybOHxFa@+us$aql0C)y1>m*YV1? zp@6<~MHHGT(0vQpP-MgJLAF};KFmaf z;`@Cjn76H^@;=(P2Ex%H0)sFZg2FznFVP%c`4t^d#CZb?o`L6a>9=6VQ`3;dM|a8U zk!iSOj1(P&u!L{l1CG~cz#1I+a0ZfNJv3cM7ChR4fjZ +g1fX|!1jw3}wNQ9gb* z4woXN_xb3ENi|1G17VsSb!W7slhz?99{;itjKe*Uq#XmWAx1jK{rTbQS4QbbgsQVh z#c(}Q+H2rB%UNp1CTTKKt<950H}J|bofxCiN`;<$2%a4Ve-5&Bd~*nW;(G`6O_}`{ DOf63A From 1ebadd42f09748db563f93b1ea97707d47746e45 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:44:10 +0000 Subject: [PATCH 06/19] Translate Localizable.stringsdict in hu_HU 100% translated source file: 'Localizable.stringsdict' on 'hu_HU'. --- damus/hu-HU.lproj/Localizable.stringsdict | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/damus/hu-HU.lproj/Localizable.stringsdict b/damus/hu-HU.lproj/Localizable.stringsdict index 14085514..d246c414 100644 --- a/damus/hu-HU.lproj/Localizable.stringsdict +++ b/damus/hu-HU.lproj/Localizable.stringsdict @@ -226,6 +226,22 @@ Megosztások + quoted_reposts_count + + NSStringLocalizedFormatKey + %#@QUOTE_REPOSTS@ + QUOTE_REPOSTS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Idézet + other + Idézetek + + sats NSStringLocalizedFormatKey From 4f9fef85153e691a848dfce962c16d8def610613 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 06:09:07 +0000 Subject: [PATCH 07/19] Translate Localizable.strings in sv_SE 100% translated source file: 'Localizable.strings' on 'sv_SE'. --- damus/sv-SE.lproj/Localizable.strings | Bin 135318 -> 146322 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/sv-SE.lproj/Localizable.strings b/damus/sv-SE.lproj/Localizable.strings index 84cc50f9f8e29261605da782205f92a4730993de..faddd631d539e6f92f5d5ba1d09a522640ad73d3 100644 GIT binary patch delta 8958 zcmd5>dvKK3b^nf@%W7F9t=`X-#7m$D2pVk6Ljpm-0vT+Oc*Il-5<-B4A_-9ti3H6b zF0HY|p}sgF3T84Mn;|mRcCrLxj60sx?o1qLUDr-r7bVy=actvELLAQ&`aAdTx4YsI z$B(v|o!$Mu``vr)Ip?19JCEO~PM#9&voz@Pk%WAS3{V!*4BmYAg?zkDP z7~5&JVcd(W&G?m(Hq6?M>kj%8YNZI&rs)_f1Xh?F7YE%<8hXfKr>)j3?W1wGCrlYmzn7DzT>Nj~ATt}Yx z305VB%K2GuHkI=W&u7+DY3+PQeSt(vkKTRIh_ZBtyujM`J zRt;$sqxL6IG7nCQE1Hf)#`wfgw36_<5v0W|wt%HwTyWK+662#BnPO|pgJ&MLrtQ{l z_2D0A(l|XEQ?_FY432j!%~g}*$i2E9cGF~S(nO8Di{*%}jK*wJ5c*SKgHFgXnz68a zX8didO;!CTJfbgwQbdpf8Q%qZO|bAkGcjzoMhhY4vdP-U^gEnRP>Sgl@Jp{&`%bt< zCv+il8DIS0k!to>3`=I7bm72TtyWH|@bC(X@%NV=i{*D`CHjxgcqLjLdzi|2 z%U#}tHpnJO(qy%&akD6uzoK$DXO<(W6|O78p~w8fU*xBD0qz8D1T;5VTlGO9Pb0hkCQr`FU7y z{4{078f^IatlVtiG;GiIrB&c=J3c<3XP2L5*Aw?IajM2Nn#fmQjo}kJ6M6fkM75%Y zG75w*1Hj@*!n+T|S}`VK!t4cnIAt&`x5}!98!feJBen{Ssey@fw?A>tSH`OTn5aZv z+@9ul)U1h84g1N>ZQqPj$6ljkRXYxmVDHjlwQdd^pz_}1{)Xk(;@NwoQ1#8DN`C8U z2j{HY>Tg)z?bb}k%^>%o8V6@R;|Qs`1k2}CjXl>7PMoz9ZzJ2 zgo5=z?GB7~>sb;F+p${W)+W$-(3%X@cHz^G&1b_q%C&EZxpX2D3h(8S6ne3!bQFm) zEdDEei#0<={3^_7$0kjHZV~(eJU4O)%c7w5mM!(|Sl9*N*@f+WAv$GRrLET5a!s}w zkG6v|kygyQ1OF14OR=5Yb!+*Wa3^!RAdNhiyGHzX<6l%Q*E>PShx=mQ){>tsx)KE4 ziSraX^7Uz*z0J>D$yIUBk-JxhM752W<^{30gOk2wRo_X|z5hq5zLTb_zObs*zL=y$_=Z7}3m57uo zc>`ss@n5AZPT4z=k4|!=e+sBgSZLh`KwAZ1Scu;+hSr3}YphkuS4#P6$Vn;w!M)Yd z{waMwOXLf~F?_W?C04tSs(K39%5TO{a+0{9Kx)Wm)V@|K<~I*H)!C=WsV;p;8N7n$ zan8Rv`TP~Pf8D?}lHii2uK$)CDsPBf>Vqq|b(N6|>sY5Wf_M3>l3<{E6DW1Ah$2afB;=d$YoAxEK4FO%wvwAM!=#g; z20?3NiuonE(`brkav#HsfR^a7i$;_YiP^To^Y=V|XuncbOYb zD1#{(KRldXYD$vuY8$j~yON*(QTfy@)@4AFps4I)qP9dskx`xr?n(gz`12PG&&pFj zzKD=Ivo1|VeT|aGZoxuHK7~LtKR6{_9WSCZ|Hcc49b-c3q4sv zb0jcIybw!?)Ua7$>!yp}e>ENjnLZmHS(l9@Sm0SglxW(d!LqkNcNs?P#CPc}+%`qH z(|tNO7aJ7~H*#vlbakwnoa9p@Qz?Ij@Mr8ob`Xg-;Va>1lq&^CjLTtRE?@ecBVD$( zz(=Pw^f<^DY>>cC_0_g{UoDmr!v zcxhu=k;;{4oc!iH-TdqS26*0ZdTh(zr8yJZ?NV>tpaKW%`1w9@<*5LN9xIR8wRlWj{ zsQdviBkl?%sl+Quwv_#E+1Edc)$VE%| z4`*}v>i5w-*gB2#s-3FML6-r&GgYFKDzd%SL=b6*&q=x<+ekj8F-(m_(+stL46O@= z2z9=IT;(R&ZPV=5BAs1H%|$8HeF9wNRmIFk+faPVR#K`!xh74DGQDPJ0uYYx-zz#-2+GC?gkN;wGG|Ie(b zfnUPLtB+FFp9e4Hcht-JFLFd-bTd@K>4CmiEB8}sU~2*m$EdzHXeOUOkP`TI61|pm zd$=DTjV_1!_ads%7c<7w3~ifkM^vGjSwwSgzbsAttcdOk%o|UWok)2cNdmtTX2sn! z5Ub(}nyxNSrK|}Og9P3rzcw&0R=CUf1Xf6q(4qEKQ?WW+M%($^%rrG8F)HKHb!e{~ z{5?(cwPCe%pri&Wf@ejc`3SH{dMk;&sCn#u7oJDz?H|SEQ z??D+D%uU$a7o#@J0mc+QlOb8FIyZ-$@j*CbU!#ZH-f^gZK`ohJVF24!byMK`z&BcC0l?|L7i?9m$2Zo(<}gLk+Fsh}{=MIZ_PnhI+ztB&rpw>95d) za8SB+>(%zwyRnTa@$S6wZfx^u8%tqWtVTL0pDQck0w;X*Nroi0w;Ioe9&*O&NNSso z=K=WGKj={K(l{=gohPk}v;ygJOHwTPh7S9< zlT^$OnUna&n&R9^qf(>?An_*5lH))s$B*yvu>1bBUxl00gq72sfZDId=!nu7h7VoJuX6c_LRW zI78D=e9K_cUXS|cGvtjfv%LJ+aIU)0N-@2XYY1M8W$pw)={9vC*_6(c6iMcP2V#em zGLpv0xFln8#FEg9y0&TLli8B6+1ZOg0ycw+#PvJzEB)#gz>+-CDV}P5md51DM#d$C zjcwZgWUFnmq57vYRFq)o$h6sNqzV1gX~V9-w|+z&QRuolGEKu>uuuB=!kU~JnB|Y& z_Y_Mw6V_TWqLW+9F*BOLj_ir#3@Kd|=buQYPId7`O7%z?Wp}GgvrJT)pKlC7{836* z(UvGaR35333zQunv=jcQ!J|$+MlsQ=(Z&Dp91wl*zW^xOp!niR4?9k~^@OUWP-?h= zXrvfj!J3W5+l{}8Jca?$RFnG787htyj*ZID4)(o7*}bA`F(BbniUs?$Zayh5PFPeC zDVbbLmMqF^hgF0v!UjNj5^@Tt&_28!`sAyvCZ}H9jKv*1vN5$+PQ@<01V2U1Vq|hH z>8_k%*ai%l`yi=Z@kniM-lYj!vV9~4X{L%0w&5BL$stK&8|g_!(2`{<+YW7>g9eA? zQt*nV!rBbH_#B;2Q0=8iIqc#+L5@*Wgv38ox~nxWlgkqscUNJ~+n9kj1lq*|54}vU z$E#m70l+Q{7jk8tBXIO0%}n^r_0%_hPT8S)s{Gb^%E)an+tgEbs0mh8Ns(2Rv~F9} zSKp*uQ%_}&4fiv=mXuZ5@`i)^OBbu!|DZG33pMl$RLb$J1_Um{zq}gjR7pcL36-uC zSCVi_O{hz(KDf!s%!*B>A_2sqYgR&eFBCGno16QYlJ=^S&^vnDp9>& z{Uv=n1myXlCW$^SF;@ww62WxmLCrr)nQF@*%G^WEDMdD-+vS#aM19mDBNk+zPzN-> zABpc$-O>x^P@~4x$~5u>4qm2)SYA@spxWJ06#;bN7871hxYh7RnmpAwvSib`l-0jt zS+cQ!P(<+Ns&{h}>Tw9c?7&VqRK|OF(V%@^XQ?*r+&@ZNC2b%?$`4Z#BDa8Skz1(e z??Krt^r@47a#todET71~e$~OJmN)`i-=nKHS$zC1Xcq4YLe`#HZw8>ku#)c6Q$Bic zmRgn=<&Y{NfGVLe-n@^Ml7nCTTm8C6b-AS-aWAZ@Z>2jLSgf1*tLi8V*^-EC!kmD# zZMxDlkmD`kxd(H3-QCV`zNq%yfH-w{FN1!@_@!ceqIEF^^RC!_(=XBFe$X~4>--4b ztAq1bz_vSpd6K8;*2fGlOc)@BmC|ex;}WY6(-rsWh=_Mcb=Ae+qEV^eLjQ?Um)=Qg zBZZv@8#z8z1B)Ux5PrM*IiyEp^mfwQG@HMu-07xfj683NsGlZb)}q_5`y3KZ2(m-u?>Pv7#k=BuX<wlgIXg9NlOlYrl()~=? zjvu#KFy%#ie1H#4$EiT?FW2o6mgK=P?kX?3Y zFTFM#gTp-wSk8tcTeilwuwK8kQ>w-HdlKWC`MH5Veknj*qp+HOXO$~(S*bOCN{;>W zmTB z)Mt3e2d8@&wikx92z#$u@JRVC0XBy6%rtTl!eC>5xi`L&QztyBV;`FF%s-N`vcQ8s zFL%#36V z3MjrnO=&lF*T_(XzS2akXx}dtY${N2=v}+1L~5in#V`lAzT=^v6oZ?*>!B9=zp?4R zE5(5akGiq#m@`>qt7TfPyv&swFoJu7PP_sx>f8mYw(3~E$t2QP9)wgXT`arFE(6>C zmRZ~1cGHe`JJ)F09X46J+c_Ndl)Vp9xvbW#vTB}gPc+)Ptr+NaU`I~|r`Os3O*4-5 zBw>9|Myx6oa&0zB4dFP>^(2WnvROnM>)8;aeWbkyWWUE1Uv?3kv?B;Axd*_3m&~@M z^-}8;f>n&;5`J4GEtM1wZi-I4_9|n|LE~tJD?YNG&fFacf)6{Fvip~++b_AbYZr53 zwamdZFLr#aX!q~DXQ93apd|QN%LL!~X|Ghvzz_8B*}HeF+J(R6$6@AR2IhQb)tVk1 zbw$8f(F_?08#un2X?XKHbzOyo_5%*x8V9u|{a>?SrAfCtq0fx{Pf~Pu3OIp6ZdgWl z=E64WABB0eVJ_s;C%j{-lvFxw;`Wi^WeV4)@MZ*}>O%0)`0HGg?%$|5l{{|0IEhv35MJs!Pn9-NM%<34#Mg;K#9Q^^XL z7x>~&=isWF_ULLh6{H`|2Ul_fpA?jt5Mhmerf(wy*@Clrd|Vbv{3d=^CnZ>k>&p>O z))|eqihrjh_^HL9U_B!`V(i!RdkuEo$fH4@?9>Ab;gi{)n>2;`Gr6HxhilL9Y%0N| zXF?VYt>&8B*Ul~AFRLMgnquTA-J1ntvD8rjrzxi!tQflTyq^747>^V1t5moiQZVXm z2LXFai^FINfM_~$L@so^d?Ib1}>ROYE* zW`L!3(&#KXdAWfuZ-i@6HBzNY`3!7>v8GCs5^wQZlf-6AU=CH3fS0=Cz{YmhlC1-* z`oj`%Bx3&`qV#J4*bY?D2G8q5O%NqVYUz-OLHHm#y2t|;9{*2FI&BhF-2Qqf!JOQx*t4Fk4JPw13Zn>J8XfOcZJm8x)dON&Ku*Xl_)Z4;?xVM;pw(sE?dA*oHK7MZzUDyb2{qN0i zDq28mr%to1=-#ivV-KeNdadsMHf%G~!3wbJN8bn4_RNaaxy`KOfppkO$9q8W377tF z>~!KINT9L{V1Dj%WqFbfyyRLaLSz&ivI92blYg`1IG5` zui%{Vl>Vh@%1T(Z;Ew26X`KE>4#m&^Dk~mg6P3FEI(%Q@25r^Leh)#Jsu%Hq{w#(k zRCcsNj+dFWeP#<<-&PFfrVD4MF_$$pvBuU34z%!ln4L{*tC@UvU_QN7433S9d8d`v zcJqIjjzTtkHbTq*O9*Lja?=bq(t4&~xIu`+ zukva=hbYWeP8j{G0fkT(IpfEH^$GaI@1&tMVCIXHz~^au%sv`jDkta_x1m2yAG`;* zVrZ=k96HaQvN%%rL&jp%N9l$xmGbx6{OP4fMxZ?#-VPP*jd$#(uV9)NeF<52QO zF7BgN>>Ep?vO>t#PtBEA#OR#d#k29;*b=d5nYzH>uK9|)YeA$2#d8+l6cp({6E$7; From 0187ff1dc073b042e25aba95c6649e28c64a8339 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 06:11:12 +0000 Subject: [PATCH 08/19] Translate Localizable.stringsdict in sv_SE 100% translated source file: 'Localizable.stringsdict' on 'sv_SE'. --- damus/sv-SE.lproj/Localizable.stringsdict | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/damus/sv-SE.lproj/Localizable.stringsdict b/damus/sv-SE.lproj/Localizable.stringsdict index e0883da9..624a76fd 100644 --- a/damus/sv-SE.lproj/Localizable.stringsdict +++ b/damus/sv-SE.lproj/Localizable.stringsdict @@ -226,6 +226,22 @@ Delningar + quoted_reposts_count + + NSStringLocalizedFormatKey + %#@QUOTE_REPOSTS@ + QUOTE_REPOSTS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Citat + other + Citat + + sats NSStringLocalizedFormatKey From d6d6858e0b0ed3295dcb58f97d23d342be09f41c Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Sat, 29 Jun 2024 16:57:22 -0400 Subject: [PATCH 09/19] Export strings for translations --- damus/Views/Chat/ChatBubbleView.swift | 4 +- .../Localized Contents/en-US.xliff | 152 ++++++++++++++++-- .../Localizable.xcstrings | 12 ++ .../damus/en-US.lproj/Localizable.strings | Bin 144252 -> 153918 bytes damus/en-US.xcloc/contents.json | 4 +- 5 files changed, 159 insertions(+), 13 deletions(-) diff --git a/damus/Views/Chat/ChatBubbleView.swift b/damus/Views/Chat/ChatBubbleView.swift index bd79a746..6fe6fbd8 100644 --- a/damus/Views/Chat/ChatBubbleView.swift +++ b/damus/Views/Chat/ChatBubbleView.swift @@ -165,7 +165,7 @@ struct ChatBubble: View { stroke_style: .init(lineWidth: 4), background_style: Color.accentColor ) { - Text("Hello there") + Text(verbatim: "Hello there") .padding() } .foregroundColor(.white) @@ -176,7 +176,7 @@ struct ChatBubble: View { stroke_style: .init(lineWidth: 4), background_style: Color.accentColor ) { - Text("Hello there") + Text(verbatim: "Hello there") .padding() } .foregroundColor(.white) diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index 855f8aee..064a0d72 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -2,7 +2,7 @@
- +
@@ -44,7 +44,7 @@
- +
@@ -255,6 +255,11 @@ Button text to add a relay An additional percentage of each zap will be sent to support Damus development Text indicating that they can contribute zaps to support Damus development. + + An unexpected error happened while trying to create the new contact list. Please contact support. + An unexpected error happened while trying to create the new contact list. Please contact support. + Error message for a failed contact list reset operation + Animations Animations @@ -413,7 +418,8 @@ Tip: You can always change this later in Settings → Translations Button to cancel the upload. Cancel deleting bookmarks. Cancel deleting the user. - Cancel out of logging out the user. + Cancel out of logging out the user. + Cancel resetting the contact list. Changing this setting will cause the cache to be cleared. This will free space, but images may take longer to load again. Are you sure you want to proceed? @@ -486,6 +492,16 @@ Button to connect to the relay. Connecting Relay status label that indicates a relay is connecting. + + Contact list (Follows + Relay list) + Contact list (Follows + Relay list) + Section title for Contact list first aid tools + + + Contact list has been reset + Contact list has been reset + Message indicating that the contact list was successfully reset. + Content filters Content filters @@ -495,7 +511,8 @@ Button to connect to the relay. Continue Continue Continue with bookmarks. - Continue with deleting the user. + Continue with deleting the user. + Continue with resetting the contact list. Copied @@ -569,6 +586,11 @@ Button to connect to the relay. Copy user public key Context menu option for copying the ID of the user who created the note. + + Could not create your initial contact list event. This is a software bug, please contact Damus support via support@damus.io or through our Nostr account for help. + Could not create your initial contact list event. This is a software bug, please contact Damus support via support@damus.io or through our Nostr account for help. + Error message to the user indicating that the initial contact list failed to be created. + Could not find the user you're looking for Could not find the user you're looking for @@ -766,6 +788,16 @@ Button to disconnect from a relay server. Label to display that authentication to a server has failed. Relay status label that indicates a relay had an error when connecting + + Error configuring push notifications with the server: %@ + Error configuring push notifications with the server: %@ + Error label shown when user tries to enable push notifications but something fails + + + Error disabling push notifications with the server: %@ + Error disabling push notifications with the server: %@ + Error label shown when user tries to disable push notifications but something fails + Error fetching lightning invoice Error fetching lightning invoice @@ -816,6 +848,12 @@ Relay status label that indicates a relay had an error when connecting Failed to parse NostrScript error message when it fails to parse a script. + + First Aid + First Aid + Navigation title for first aid settings and tools + Section header for first aid tools and settings + Follow Follow @@ -907,6 +945,11 @@ My side interests include languages and I am striving to be a #polyglot - I am a Free Dropdown option for selecting Free plan for DeepL translation service. + + General + General + Section header for general damus notifications user configuration + Get API Key Get API Key @@ -971,6 +1014,16 @@ This is my first post on Damus, I am happy to meet you all 🤙. What’s up? Hide notes with #nsfw tags Setting to hide notes with the #nsfw (not safe for work) tags + + Highlighted + Highlighted + Label to indicate that the user is highlighting their own post. + + + Highlighted %@ + Highlighted %@ + Label to indicate that the user is highlighting 1 user. + Home Home @@ -1005,6 +1058,11 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!
Impersonation Description of report type for impersonation. + + In progress… + In progress… + Loading message indicating that a contact list reset operation is in progress. + Indefinite Indefinite @@ -1106,6 +1164,11 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!
Load media Button to show media in note. + + Local + Local + Option for notification mode setting: Local notification mode + Local Notifications Local Notifications @@ -1265,6 +1328,11 @@ Text label indicating that there is no NIP-11 relay software information found. No User confirm No + + No contact list was found. You might experience issues using the app. If you suspect you have permanently lost your contact list (or if you never had one), you can fix this by resetting it + No contact list was found. You might experience issues using the app. If you suspect you have permanently lost your contact list (or if you never had one), you can fix this by resetting it + Section footer for Contact list first aid tools + No logs to display No logs to display @@ -1333,7 +1401,8 @@ Text label indicating that there is no NIP-11 relay software information found. Note you've muted Note you've muted - Text to indicate that what is being shown is a note which has been muted. + Text to indicate that what is being shown is a note which has been muted. +Label indicating note has been muted Notes @@ -1374,6 +1443,11 @@ Label for filter for seeing your notes and replies (instead of only your notes). Section header for Damus notifications Toolbar label for Notifications view. + + Notifications mode + Notifications mode + Prompt selection of the notification mode (Feature to switch between local notifications (generated from user's own phone) or push notifications (generated by Damus server). + Nudity Nudity @@ -1478,7 +1552,8 @@ Button label to dismiss an error dialog Post Post - Button to post a note. + Button to post a highlight. + Button to post a note. Private @@ -1570,6 +1645,11 @@ Button label to dismiss an error dialog Purple Subscription service name + + Push + Push + Option for notification mode setting: Push notification mode + QR Code QR Code @@ -1590,6 +1670,11 @@ Button label to dismiss an error dialog Ran to suspension. Indication that a NostrScript was run until it reached a suspended state. + + React with default reaction emoji + React with default reaction emoji + Accessibility label for react button + Reactions Reactions @@ -1700,6 +1785,11 @@ Button label to dismiss an error dialog Repost Button to repost a note + + Repost or quote this note + Repost or quote this note + Accessibility label for repost/quote button + Reposted Reposted @@ -1722,6 +1812,11 @@ Button label to dismiss an error dialog Requests Picker option for DM selector for seeing only message requests (DMs that someone else sent the user which has not been responded to yet). DM is the English abbreviation for Direct Message. + + Reset contact list + Reset contact list + Button to reset contact list. + Retry Retry @@ -1907,6 +2002,11 @@ Button label to dismiss an error dialog Share Via... Button to present iOS share sheet + + Share externally + Share externally + Accessibility label for external share button + Show Show @@ -2342,6 +2442,15 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. ARE YOU SURE YOU WANT TO CONTINUE? Alert for deleting the users account. + + WARNING: + +This will reset your contact list, including the list of everyone you follow and the list of all relays you usually connect to. ONLY PROCEED IF YOU ARE SURE YOU HAVE LOST YOUR CONTACT LIST BEYOND RECOVERABILITY. + WARNING: + +This will reset your contact list, including the list of everyone you follow and the list of all relays you usually connect to. ONLY PROCEED IF YOU ARE SURE YOU HAVE LOST YOUR CONTACT LIST BEYOND RECOVERABILITY. + Alert for resetting the user's contact list. + Wake up, %@ Wake up, %@ @@ -2365,6 +2474,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. Wallet Relay Label text indicating that below it is the information about the wallet relay. + + We did not detect any issues that we can automatically fix for you. If you are having issues, please contact Damus support: [support@damus.io](mailto:support@damus.io) + We did not detect any issues that we can automatically fix for you. If you are having issues, please contact Damus support: [support@damus.io](mailto:support@damus.io) + Message indicating that no First Aid actions are available. + Website Website @@ -2701,7 +2815,7 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY.
- +
@@ -3083,7 +3197,7 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY.
- +
@@ -3105,7 +3219,7 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY.
- +
@@ -3158,6 +3272,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. LibreTranslate (Open Source) Dropdown option for selecting LibreTranslate as the translation service. + + Local + Local + Option for notification mode setting: Local notification mode + Local default Local default @@ -3168,6 +3287,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. Mentioned by %@ Mentioned by heading in local notification + + Muted event + Muted event + Title for a push notification which has been muted + New encrypted direct message New encrypted direct message @@ -3203,6 +3327,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. Production Label indicating the production environment for Damus Purple + + Push + Push + Option for notification mode setting: Push notification mode + Reposted by %@ Reposted by %@ @@ -3238,6 +3367,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. Test (local) Label indicating a local test environment for Damus Purple functionality (Developer feature) + + This is an event that has been muted according to your mute list rules. We cannot suppress this notification, but we obscured the details to respect your preferences + This is an event that has been muted according to your mute list rules. We cannot suppress this notification, but we obscured the details to respect your preferences + Description for a push notification which has been muted, and explanation that we cannot suppress it + This note contains too many items and cannot be rendered This note contains too many items and cannot be rendered diff --git a/damus/en-US.xcloc/Source Contents/DamusNotificationService/Localizable.xcstrings b/damus/en-US.xcloc/Source Contents/DamusNotificationService/Localizable.xcstrings index 5789abcb..a3560c32 100644 --- a/damus/en-US.xcloc/Source Contents/DamusNotificationService/Localizable.xcstrings +++ b/damus/en-US.xcloc/Source Contents/DamusNotificationService/Localizable.xcstrings @@ -39,12 +39,18 @@ "LibreTranslate (Open Source)" : { "comment" : "Dropdown option for selecting LibreTranslate as the translation service." }, + "Local" : { + "comment" : "Option for notification mode setting: Local notification mode" + }, "Local default" : { "comment" : "Dropdown option label for system default for Lightning wallet." }, "Mentioned by %@" : { "comment" : "Mentioned by heading in local notification" }, + "Muted event" : { + "comment" : "Title for a push notification which has been muted" + }, "New encrypted direct message" : { "comment" : "Notification that the user has received a new direct message" }, @@ -78,6 +84,9 @@ "Production" : { "comment" : "Label indicating the production environment for Damus Purple" }, + "Push" : { + "comment" : "Option for notification mode setting: Push notification mode" + }, "Reposted by %@" : { "comment" : "Reposted by heading in local notification" }, @@ -99,6 +108,9 @@ "Test (local)" : { "comment" : "Label indicating a local test environment for Damus Purple functionality (Developer feature)" }, + "This is an event that has been muted according to your mute list rules. We cannot suppress this notification, but we obscured the details to respect your preferences" : { + "comment" : "Description for a push notification which has been muted, and explanation that we cannot suppress it" + }, "This note contains too many items and cannot be rendered" : { "comment" : "Error message indicating that a note is too big and cannot be rendered" }, 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 e8a81cd83e4f78d42822ea96fc05361550248b11..70d27d27ba5fb18f38ab0049458c04c64965ad9e 100644 GIT binary patch delta 5586 zcmeHLdu*H475|Qvy0)8#9oI35^RVMM&ZEtvv{Tg%n)E?vo95MyiH$)+;v|mTJnUql z+h`h9gCXsY!DT(#M0u!{HjpL)ndCA=AN)~igNd}-3JM(~Rfe{zA}O1+X@YL&-0RP; zJWBr-#dfHp#7UG(Xu@t_uwPhpaX&_9n3YD4rC7PWiwv1}U3Tz#})NDdCf6pd+pO05|G zqZ5Bs583NSXedCdS!8U5y=rK#4cA|SB0M(@*;zGODUIAk|D{?ZdZxkuFWnDn#Am^# zslq)+Ds$L|UOG0rfxg9ak@l${M>-7R`bf4p?h(-#wBwZmg9*=E2Gi=8&!%QaAGg_e zEOw}P<)VF@oz4y)q4`15AEDQHq2Ln(x)%W(he|y@xSH6+95jl65xY_O%-pw-~)Rj^Mz`}Ep!j&~+nFVe?T8IXt5nFfn_guD_Y zdn4k7pE=R(f$~-C&k<4LcAE7-N5t^!PKQc}9un`B&f_rlVvz@`@x3izH8bvoIbh<& zH%gp(0xc__6_=+~Tg1g*I+i+MPW*r}h=ZcO-@f88ZQXRh2<5@UvdULDqTNl{vaIal zHG@)C0vQwR)?*Ve3JrPV%z(EJl6y!-=YP| zFv>%PZ*nOqDXP9FNp&MVcPD{D+MMXzS|TRLjpBg|R{X&Y$P)u^W#WL{V41495V8vE z<}%Fq2?eQJRfrbB8!ti$UN%CFuZaT3?Iuifp`<-h#&IG@dGyTXp&Yb&VWY6Vm75Oy zXqyM;UdG%3vS~L2^#U$9x2CO* zX?JTrts%*(C8cEgE%d{Nsk=X_G2?U}SjFk@)ZNL5vpf(c&^q4jwN5Mvf?s^?&sN+R zgxsuhccL%v#`+*Q4CU^V56(OA$eWOjN2W8DBPn*X$-B8>Em2 z@b?+uuqTu>({L9@D%zR>q-NnfkAD0b=Cu|y}lWjAIVUCC7p*WA5%k5O41oEP`YH#Sv8 zmT6N!dqfc@8sog|qE9zHM@*z(lwKlY{-&pXH>q+{GiP<&6-Mcw`Icg2`Z!ZAZXuM8 z2>ZcFv_s+jws#%GF4E~+1zi>@IPP-bM)As*im>imP=QAa!5H1+ zg)ird=btFWxj#{HwRtVL-Dk)Z6?;pguWo`Ni zv?N-5AADe64rtnN;^*M4j=>BaMaPRaSxkLNX&D<4=Z|}%)_xc;U}l-24nGZnMf_&i zirt4Gmk?`AW^*5Uegt;0w!m7+)y(?)X(EAO9W<)fUiy+XNlS3H9~z^RA^5~D_j7Oo z>20M}8>V9p5;dGKfD5yaL8eb9d$AdkPASW`sgAC)d~GsEH^lipMir#z`pmoKym*cj-7I6DJHISL08?7i{V;1Gp#YpE%5 z;Ms{`f>GJN#gkdY=zOqtYnTGcSL}%73}5|R8^$nJwBK-z^PweqrEhiIL3)qScFgtF z)m^_{Q)4C9sY^W{T-{=nA?a;|abFqPL#tRub)`sBOb=*%IR8Fm{d-J5^o5!(JfGR0 zx-t{}cm}SnPq}J(j{6Npx>LleJ60WLLxH&dJCmJjos%@F6AJ3XJ{=46TR9uUsnJEU zqk5X)YXjgCb?@GRGcQ5*>R5WpQMwl<)T%2!hg7y@Ji8V0u?oR5&LL*f(W3uf=Ka-MH?JM-%NVB`>dq2IYCw=B#n!8WVHIwXq?Ld502R-eO zI~*XH9df3b^pXs3y`2`Zk`}ogD`jC;)j{IhNsxsPkW38*Ee7BJ-FDk%9jDpPjhy#|9YRO&cl_7}9g$`0WZR`{i2VF%vdDO|cBA1*z#CY+^HDGrtQmfy6 zm|;rg=(_~Il%GK4ed6nQ{vGhxzCpC+P|P5%ge`LTq2yn{Zqug!P?MlicqYBkg*Arn G`~L|{QRkol delta 302 zcmV+}0nz@xvI+d=2(aWylOSw3voK74DYFiCQUbHAczhAFK#alxvs{jF3zxu<0S=d} zQ2{EmUY+12lfGLJmu|KJ2A9rF0veP4JO;D6#`X%6FsKxhJkt=9>eC97pxGFgy2Sws zvkud25VJbuau2gW^o4!2A=0WK1kAXWk_xAsZ_a0-_!TmcBTGFJft7MDJm0SK3HkO2(0hHU}76O%Bg z6t;o^ZUU1)^)k1Pg#q#tm%u9l3YWl-0VubQngKurw{o8W-X4=6sSJ}kKq8k=Q35Wv zXuko*HIty}+Lv7X0T7d#>mrl7Mhcg}`T@GPeEI?GEVo`O0t^F_fM^uAvM~aTC%+VW A4FCWD diff --git a/damus/en-US.xcloc/contents.json b/damus/en-US.xcloc/contents.json index 56234ec4..2fc1d414 100644 --- a/damus/en-US.xcloc/contents.json +++ b/damus/en-US.xcloc/contents.json @@ -3,10 +3,10 @@ "project" : "damus.xcodeproj", "targetLocale" : "en-US", "toolInfo" : { - "toolBuildNumber" : "15E204a", + "toolBuildNumber" : "15F31d", "toolID" : "com.apple.dt.xcode", "toolName" : "Xcode", - "toolVersion" : "15.3" + "toolVersion" : "15.4" }, "version" : "1.0" } \ No newline at end of file From 48078b9b6a2265d673e3e45ff1229cada4ddcb2f Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 30 Jun 2024 11:14:39 +0000 Subject: [PATCH 10/19] Translate Localizable.strings in nl 100% translated source file: 'Localizable.strings' on 'nl'. --- damus/nl.lproj/Localizable.strings | Bin 147830 -> 157814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings index 7bfee55d5f9f109f5e96edaebf52111fc62b132a..696cf71cb586adaf4ac3efaa2cbf2e8e66bec2ce 100644 GIT binary patch delta 5868 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 Date: Tue, 16 Jul 2024 17:58:25 +0000 Subject: [PATCH 11/19] Translate Localizable.strings in de 100% translated source file: 'Localizable.strings' on 'de'. --- damus/de.lproj/Localizable.strings | Bin 150186 -> 160616 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/de.lproj/Localizable.strings b/damus/de.lproj/Localizable.strings index 12b6c46640173f18b10c665ee21df1eacf4f2d3c..6df686d9598ca810ea6be973c70e54b4a62486b2 100644 GIT binary patch delta 6600 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 Ifv>IPzp3%Ok^lez delta 261 zcmV+g0s8*v<_W5m39u|ovy4s@EV6r20+Z^AD3d&U8nfViJ`%G?lD+}6V3Y(5moTCM z4wo=t0V=abq;e;-K+nhvli))Xvo72k5wi^LmJqc-0k#RZ?g{}$6}RLd0Z~)m&p8CYKOf0SdP+tN}^{w<@s#Dj<`fKrWXcegP7f zj%xxOw`S4-a5$Gh0Rh^VEEWO^m%tJN29w_OB9p2}443c_0t&b64+0V}w|+zdC Date: Wed, 17 Jul 2024 06:35:05 +0000 Subject: [PATCH 12/19] Translate Localizable.strings in zh_CN 100% translated source file: 'Localizable.strings' on 'zh_CN'. --- damus/zh-CN.lproj/Localizable.strings | Bin 129222 -> 137110 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 b2451785a394b72501098f2da779ffcce6cf6ed2..f71dc7103d37d03c6e8222e74a42828fc460ab3e 100644 GIT binary patch delta 4671 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 delta 287 zcmV+)0pR|YuL#ER2e7C^vo1w?BeMu;QUa4)bttpWYibX(`h2bdmxMk66qC4G43|KJ z0Sc2&@C>s!e~t>5u66+qlMb#1lYsLOmv9XM2AACb0S>dEjO-zoj_?5xlVIjXvyQQt z36rjO6q7E!8k3y*46|Uo%nq~S%P0+(4(I_ElQ6;@v##3I2eV}3z7n&{_Pi65;J*l$ zJ`Dk0x0DM37zYB)QAZ~+Dcx9)TS l3>>$fkpYw~lX% Date: Wed, 17 Jul 2024 06:35:42 +0000 Subject: [PATCH 13/19] Translate Localizable.strings in zh_HK 100% translated source file: 'Localizable.strings' on 'zh_HK'. --- damus/zh-HK.lproj/Localizable.strings | Bin 129160 -> 137046 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/zh-HK.lproj/Localizable.strings b/damus/zh-HK.lproj/Localizable.strings index bc756077fa9c45944619984abd7b2ac190e216c2..f7066bfb0bec4af6c2e1565c24a3736cb71a0685 100644 GIT binary patch delta 4907 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 From 9de21a730a1866e52b7c09eabc7cde00605a14fe Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 06:35:50 +0000 Subject: [PATCH 14/19] Translate Localizable.strings in zh_TW 100% translated source file: 'Localizable.strings' on 'zh_TW'. --- damus/zh-TW.lproj/Localizable.strings | Bin 129126 -> 137022 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/zh-TW.lproj/Localizable.strings b/damus/zh-TW.lproj/Localizable.strings index f55a841fcecfd2fc8b67db25a57e24721f102da1..b13a3fc4299a95e3cdcb7b9ad59a327d4682c6c4 100644 GIT binary patch delta 4719 zcma)A4^Wfm8UJ1y7zr^DLI?y>LR1Kd64C3dP6t^3Rs0eI!chK(KLLz@gaD%BPmglQ zm<_(|-p=bWZT-h}=izc&cD7TztGhZ&cU!gVI?MDnd!2KwT5r3vI`%x@=SKn-=jD>` z{oeO^pXYgh&)+wn-~P_oQ{iJL*U~eii5qIUCa#4ua+UC{h2MJ4#no`t@KyyYja)0t zRl%8*?fgj8#|cW{so+Ud zom+h-r#*z;tW!M$2c*46H0-yNL=`#f{4~kEjFvg|zF*bbBD>el2~sUEZg~V4!itc# z0(BFJbi+8E%j6VrjJY|Ox%C3I3x3;$J&RzU9T0N?z&hmxrIYp?eGx3Q~`bIk^6zGLa@i9@+u~iECYPFe0 zb;#z|1N(Y7r3+3uha=L5Cv_1H!HcQ@=^7g8iKmnOQJaM~*xM?s?E&;Wf{WLKw><@4 zkXXaD!55sLsZS6sz5H%$r~{Zd*-wv>`SC9R?_KbUR&>J?T^)m{m7P0E78x)mFrv`K zTLj_gXE+OLuz$Wq4C^t}L?Vm=7wivq?Bv~7Ta*SA($2!ywwXLts$nn4vodJd48hXxwu3zA-uSVBD!(T6mD9Ls0EE~0l zSlBfyNu=X9V%fNi#Q09Vd^H)&pk%5eM49RaZPDQxfepqj0$~)63vmu36i^RvUwd9K0i$t9jeD5B!=i4;*4W9T?PM@Xe>cpL=RKdtb zlDY6PV!;rBY$9w!26UW;8`r}TrQDMP=v0>m0N)2Hs1 zB3GRAc_-q+sj4ZP-u_s&c#Z@E+=YAyyn-qnC4bT|%RLgy2Cot&*~FIKBigtWV*rz? zo#vt}Z{EOSKE>!ebmhZnR`wdCw>8g))7A_DfhCZq}`mr6~uPL?-vJ(Ilp`BTTrz;7o zjE4@zWgyXlaJ{5v0C6lO$qkX^{=R3)@tDW@!1Cc_f8sKdJy+1$Sk4fck5Q|)!GW>- z1b9mcAM>lfc^%0OVO=(|JXB~QncqeXNm4i2E;s`A1&AURP7l2C&RGM#i8m=$R3+-F3) z!VagIg8)t}_OF3cqMwS+?6;MXj6?*`vKn&-dQJ=Ykyx7$_(~zb&?7vsiq##XQ7S9> z5(Vr2faszFBIcFE7Khp2=BaH!Pw%fZv9a4^iT{&M61|wJuEas2Rpu}mU4 zuAnPo(~p-xJb>6Ri3h@KUU2Tkprc<#ubYa-a1~{zrn7Ys@{nO z>Tc=V12`XI!IpI%|FCD+@tnP75JOTqwceW5($6bOCWdjp)%L?;)@FWZ{kQ=*$8We!df2C=5qzp zyX-JpD@Z5+nzdZP3Yf?P#v)NJY(gfyAP$)#F|x7)c`nc)Z2{0MVU-^dLpMe!T1YBd zq4~EQ_>T8YwD?d#g;noeQT9GPR@K)QxPL0AZsyCK=Attlhjxg2@0Mcm!t0KsVzj)k z?Lx(QR|Kz|+Tyraxvy)eYofZu8e%bVtKg!nfa`KPD4s*D{Sp50KM->WP2U^^_gUjl zBY=|Mu3b#lbdxr5OXO{h!KU6hjm_xW-$~bJ7Jt-L7&;JJPKo& z56TBLXPcJV3Ka&aE0EeR(fLp^v^MlkrAGLlqz!n&wP+@9;hvc^v&046GllEY4))HQ zBw1a`nW0vQA&cI$QkX6c{zCwR=%7pPe6t~=(PICG-)6<8;AZa?dsa(@^-C*4AKYC? j-G=n{N$?#~KV{^eC^;mJqfvYHbnIHV|G`J3VZr|Z$Q;N6 delta 282 zcmV+#0pLvA7A7u6GoZki8O@z|{d1vrN3q4zte7 zAPtianiiLyS^*rhlG@k@vrOZ_60^4UwiA;u#R!)k4gp@bcnbjt2$SyEG?y?f0Tj17 z76DWclP<+9w+bf#J_)z*F#(tqx5h>RG7^)ncNCXuQ2`3Kz*zw}0+SA!7MGq{0UWpT zTme!NlP<*ymry?eB$HqT1efm40SdQ9Z~+7ax72h21{}A3kpXTkw|v0?-YJ(HLjg9E gE}06KsOte5w{GqM#sQN)tqhkCQUM6J)baspB>Zn~o&W#< From ee5f53e4ebc8e8b5cab0350e9adc334d04367b4b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 09:14:03 +0000 Subject: [PATCH 15/19] Translate Localizable.strings in hu_HU 100% translated source file: 'Localizable.strings' on 'hu_HU'. --- damus/hu-HU.lproj/Localizable.strings | Bin 148480 -> 158484 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/hu-HU.lproj/Localizable.strings b/damus/hu-HU.lproj/Localizable.strings index 35f531f165dd7a79de5c2a53d583121613f8eac4..3d1c0f6a02b81020fcaf2544e6d750bae773aead 100644 GIT binary patch delta 5967 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 delta 272 zcmbPojkBSHbAy=Aq!f|KIe99Z)BGlBZjPu3Vw&93rmW|G Date: Sun, 4 Aug 2024 23:59:48 -0400 Subject: [PATCH 16/19] Export strings for translation --- .../Localized Contents/en-US.xliff | 179 +++++++++--------- .../damus/en-US.lproj/Localizable.strings | Bin 153918 -> 151922 bytes 2 files changed, 91 insertions(+), 88 deletions(-) diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff index 064a0d72..ae5412ec 100644 --- a/damus/en-US.xcloc/Localized Contents/en-US.xliff +++ b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -144,11 +144,6 @@ Sentence composed of 2 variables to describe how many people are following a use API Key (required) Prompt for required entry of API Key to use translation server. - - About - About - Label to prompt for about text entry for user to describe about themself. - About Me About Me @@ -159,6 +154,11 @@ Sentence composed of 2 variables to describe how many people are following a use Absolute Boss Placeholder text for About Me description. + + Absolute legend. + Absolute legend. + Example Bio + Accessibility Accessibility @@ -189,6 +189,11 @@ Sentence composed of 2 variables to describe how many people are following a use Add Bookmark Button text to add bookmark to a note. + + Add Photo + Add Photo + Label to indicate user can add a photo. + Add all Add all @@ -356,10 +361,10 @@ Tip: You can always change this later in Settings → Translations Be the first to access upcoming premium features: Automatic translations, longer note storage, and more Description of new features to be expected - - Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus. - Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus. - Reminder to user that they should save their account information. + + Bio + Bio + Label to prompt bio entry for user to describe themself. Bitcoin Lightning Tips @@ -388,10 +393,10 @@ Tip: You can always change this later in Settings → Translations Broadcast music playing on Apple Music Toggle to enable or disable broadcasting what music is being played on Apple Music in their profile status. - - By signing up, you agree to our - By signing up, you agree to our - Ask the user if they already have an account on Nostr + + By continuing you agree to our + By continuing you agree to our + No comment provided by engineer. By subscribing to Damus Purple, you are accepting our [privacy policy](https://damus.io/privacy-policy.txt) and Apple's Standard [EULA](https://www.apple.com/legal/internet-services/itunes/dev/stdeula/) @@ -601,26 +606,21 @@ Button to connect to the relay. Could not find user to mute... Alert message to indicate that the muted user could not be found. + + Create Account + Create Account + Button to continue to the create account page. + Create account Create account Button to navigate to create account view. - - Create account now - Create account now - Button to create account. - Create new mutelist Create new mutelist Title of alert prompting the user to create a new mutelist. - - Creator(s) of Bitcoin. Absolute legend. - Creator(s) of Bitcoin. Absolute legend. - Example description about Bitcoin creator(s), Satoshi Nakamoto. - Custom Custom @@ -631,6 +631,7 @@ Button to connect to the relay. DMs Navigation title for DMs view, where DM is the English abbreviation for Direct Message. Navigation title for view of DMs, where DM is an English abbreviation for Direct Message. + Picker option for DM selector for seeing only DMs that have been responded to. DM is the English abbreviation for Direct Message. Setting to enable DM Local Notification Toolbar label for DMs view, where DM is the English abbreviation for Direct Message. @@ -717,11 +718,6 @@ Button to disconnect from a relay server. Dismiss Button to dismiss alert - - Display name - Display name - Label to prompt display name entry. - Done Done @@ -969,7 +965,8 @@ My side interests include languages and I am striving to be a #polyglot - I am a Hashtags Hashtags - Section header title for a list of hashtags that are muted. + Label for filter for seeing only hashtag follows. + Section header title for a list of hashtags that are muted. Hello everybody! @@ -1109,11 +1106,6 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!
LIVE Text indicator that the video is a livestream. - - Learn more about Nostr - Learn more about Nostr - Button that opens up a webpage where the user can learn more about Nostr. - Learn more about the features Learn more about the features @@ -1124,16 +1116,6 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!Left Handed Moves the post button to the left side of the screen - - Let's get started! - Let's get started! - Button to continue to login page. - - - Let's go! - Let's go! - Button to complete account creation and start using the app. - LibreTranslate (Open Source) LibreTranslate (Open Source) @@ -1238,7 +1220,8 @@ Hope to meet folks who are on their own journeys to a peaceful and free life! Mentions Mentions - Setting to enable Mention Local Notification + Label for filter for seeing mention notifications (replies, etc). + Setting to enable Mention Local Notification Merch @@ -1258,7 +1241,9 @@ Hope to meet folks who are on their own journeys to a peaceful and free life! Mute Mute - Alert button to mute a user. + Alert button to mute a user. + Button to mute a profile + Title for confirmation dialog to mute a profile. Mute %@? @@ -1298,6 +1283,11 @@ Hope to meet folks who are on their own journeys to a peaceful and free life! + + Name + Name + Label to prompt name entry. + Never Never @@ -1323,6 +1313,11 @@ Text label indicating that there is no NIP-11 relay software information found. New to Nostr? Ask the user if they are new to Nostr + + Next + Next + Button to continue with account creation. + No No @@ -1378,11 +1373,6 @@ Text label indicating that there is no NIP-11 relay software information found. Nostr Address Label for the Nostr Address section of user profile form. - - Nostr is a protocol, designed for simplicity, that aims to create a censorship-resistant global social network - Nostr is a protocol, designed for simplicity, that aims to create a censorship-resistant global social network - Description about what is Nostr. - NostrScript NostrScript @@ -1393,6 +1383,11 @@ Text label indicating that there is no NIP-11 relay software information found. NostrScript Error Text indicating that there was an error with loading NostrScript. There is a more descriptive error message shown separately underneath. + + Not now + Not now + Button to not save key, complete account creation, and start using the app. + Note from a %@ you've muted Note from a %@ you've muted @@ -1407,15 +1402,12 @@ Label indicating note has been muted Notes Notes - Label for filter for seeing only notes (instead of notes and replies). -Label for filter for seeing only your notes (instead of notes and replies). -A label indicating that the notes being displayed below it are from a timeline, not search results + Label for filter for seeing only notes (instead of notes and replies). Notes & Replies Notes & Replies - Label for filter for seeing notes and replies (instead of only notes). -Label for filter for seeing your notes and replies (instead of only your notes). + Label for filter for seeing notes and replies (instead of only notes). Notes with the #nsfw tag usually contains adult content or other "Not safe for work" content @@ -1504,6 +1496,11 @@ Button label to dismiss an error dialog Optional Prompt to enter optional additional information when reporting an account or content. + + Orange-pill + Orange-pill + Button label that allows the user to start a direct message conversation with the user shown on-screen, to orange-pill them (i.e. help them to setup zaps) + - - Public Key - Public Key - Label to indicate the public key of the account. - Public key Public key @@ -1810,7 +1802,7 @@ Button label to dismiss an error dialog Requests Requests - Picker option for DM selector for seeing only message requests (DMs that someone else sent the user which has not been responded to yet). DM is the English abbreviation for Direct Message. + Picker option for DM selector for seeing only message requests (DMs that someone else sent the user which has not been responded to yet Reset contact list @@ -1872,6 +1864,11 @@ Button label to dismiss an error dialog Save Key in Secure Keychain Toggle to save private key to the Apple secure keychain. + + Save your login info? + Save your login info? + Ask user if they want to save their account information. + Scan Code Scan Code @@ -2054,6 +2051,11 @@ Button label to dismiss an error dialog Show wallet selector Toggle to show or hide selection of wallet. + + Sign In + Sign In + Button to continue to login page. + Sign Out Sign Out @@ -2074,11 +2076,6 @@ Button label to dismiss an error dialog Skip Button to dismiss the suggested users screen - - Social media has developed into a key way information flows around the world. Unfortunately, our current social media systems are broken - Social media has developed into a key way information flows around the world. Unfortunately, our current social media systems are broken - Description about why Nostr is needed. - Someone posted a note Someone posted a note @@ -2187,11 +2184,6 @@ Enjoy! The address should either begin with LNURL or should look like an email address. Giving the description of the alert message. - - The go-to iOS Nostr client - The go-to iOS Nostr client - Quick description of what Damus is - The relay you are trying to add is already added. You're all set! @@ -2199,6 +2191,11 @@ You're all set! You're all set! An error message that appears when the user attempts to add a relay that has already been added. + + The social network you control + The social network you control + Quick description of what Damus is + There has been an unexpected error with the in-app purchase. Please try again later or contact support@damus.io. Error: %@ There has been an unexpected error with the in-app purchase. Please try again later or contact support@damus.io. Error: %@ @@ -2228,16 +2225,16 @@ Nice to meet you all! #introductions #plebchain Nice to meet you all! #introductions #plebchain First post example given to the user during onboarding, as a suggestion as to what they could post first - - This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe! - This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe! - Label to describe that a private key is the user's secret account key and what they should do with it. - This note contains too many items and cannot be rendered This note contains too many items and cannot be rendered Error message indicating that a note is too big and cannot be rendered + + This user cannot be zapped because they have not configured zaps on their account yet. Time to orange-pill? + This user cannot be zapped because they have not configured zaps on their account yet. Time to orange-pill? + Comment explaining why a user cannot be zapped. + Thread Thread @@ -2375,6 +2372,11 @@ Nice to meet you all! #introductions #plebchain User muted Alert message to indicate the user has been muted + + User not zappable + User not zappable + Headline indicating a user cannot be zapped + Username Username @@ -2479,6 +2481,11 @@ This will reset your contact list, including the list of everyone you follow and We did not detect any issues that we can automatically fix for you. If you are having issues, please contact Damus support: [support@damus.io](mailto:support@damus.io) Message indicating that no First Aid actions are available. + + We'll save your account key, so you won't need to enter it manually next time you log in. + We'll save your account key, so you won't need to enter it manually next time you log in. + Reminder to user that they should save their account information. + Website Website @@ -2519,21 +2526,11 @@ This will reset your contact list, including the list of everyone you follow and What do you want to report? Header text to prompt user what issue they want to report. - - What is Nostr? - What is Nostr? - Heading text for section describing what is Nostr. - Who to Follow Who to Follow Title for a screen displaying suggestions of who to follow - - Why we need Nostr? - Why we need Nostr? - Heading text for section describing why Nostr is needed. - Words Words @@ -2644,7 +2641,8 @@ This will reset your contact list, including the list of everyone you follow and Zaps Zaps - Navigation bar title for the Zaps view. + Label for filter for zap notifications. + Navigation bar title for the Zaps view. Navigation title for zap settings. Section header for zap settings Setting to enable Zap Local Notification @@ -2761,6 +2759,11 @@ This will reset your contact list, including the list of everyone you follow and %@ and %@ reposted your profile Notification that 2 users reposted the current user's profile + + required + required + Label indicating that a form input is required. + self self 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 70d27d27ba5fb18f38ab0049458c04c64965ad9e..ae53dc3857f950bf973d91923508d9485418a43a 100644 GIT binary patch delta 1961 zcmd5-T}%{L6rM9I%dp+7qszhy2m`Lgt`wo=SCPLM8cd3tR%suM7KH^;7?!`b5JSbL zeJ~Z#LwnLb@T0*}Y6xZ3Nr<(peW})1+B7!xf#6GRO+!qRnm$m{a|ai;2_{YY(oE*u zbMLwLoHO6~?wPC8vA>^-Z6)CIzHMsa5J^cjY^s8Jgq^ z&!u#>?&3FHDu29x#fE9)slnT&cee=N8&C^6q7R!X<>eRA?mL2Z3C!vmG)$S z-C51&-eOo*Yfz2fl8YvH%871smOZ5hlgV;MvbE zI+h5@baf*evORGA?M!yeq+!`AwR0$4YTz)>GM$>FW`2aVkylz++sbQMtY@(<)|z=& zq2U|Ls1H#tB9s~Rd&#>;5wo5h!VsB&|&q|=YV+c;jI&B&Jg55L7S$>^Rr&q02{@J#}enjz~Y8 zOgksrW)fCtbrE%nuwdV2r>F@|O<0WELy%&jg+Wm0;1>{2N5?>kS)(+@qqCq#VRog0 z12tai;RNwfeF@DA<%Hjs*35`Em^Vc;rJv`e5edAEeSW8F&0TaaPfn$w38*%%pNGlK zVFngb@lCKrRY^M4egiJ3G7jB@OCYezB!ufKL4aE_!VdtaN<=+`?4w*kr=2Nr!n9ZLEvgA;`VVGU2Uph4AJTpwAUZShq?g zK~$Yix51|8HI6R0CJMTbF%*|nczQCMOX>7OPVE1c6XyI;PK$gaFZIiN+?W+oqMHRH zFzrSX`R2faWt|G$TmW?q9K%H3Z{pa_-yd!qVZ3V@>t?B*MiXVHYfUrtrOF9sCew{2 zw>;v;@%r~;UtuUSL<7Llh72l81#67x6dl}duK5#iutB9AbztA$#Bgg2yl5O?`XCJt delta 3256 zcmds3eQZ-z6u;-Kc3ml5*R@?YSogMpV|5!tkwJu{jD-WKvO!NBg zyXV|<&OPV%JNN#2B;!PHMz?ti2L0f|U^iGYLSnUO7H^1zoR`RzYP}!ZEa1d%yTB?} z)Z21r4#`E4P{j;-iiAFg>rX?rRKu>6eacio^<{WAb-n7HbiA+)d?__>e!O(-Frk_Q zc1)Bi8{E~RPSlgHR(h+VUH@;8w@ci`W%S*lM^Pf8^ixHQq;(=fqXf;XB92)}$VR(g zap0{^u$1zWW)iL;wN^6LDB`+7!wj2mCL<*xfj@77T-@aZ8&)R4Bv0J*E^DMXhCHgY ztW7tfQWj!lC`P6dA~YCD4UL*e5*HOCGVs*wrRrbqMP`M^r;_z~&&b5=L|V1zz%MRA z4wT9K=!@8Q30(THB(*ErGD+T>Ym?^=+GWK@HaY*0oyX~1qh`@Adk&U>ir0eR-gk;{ z(+7l`PY<1yv#T8PlL0U8_bE0!e*ng%QOWSn15hXfhdjj$g9((>QoW8`j%rGMLWIdE zm!LwZa(7j+Jbuvmgt`+`n>*(?2#_`d-FNa7FGl^~g&O(Yf}Bwg;H!V*jV#5EeVf3O z>hHSa)hMCl!-CqYetS1`*Bhap`fE^p7xna1|R zWPxkLXo{0oBdso{vEjj>aZC@jfvh%D&4|{x@ER1L8URm-yM|HGr#RBK?NnI?D#6o* zzVE@JZ41C%kb4$cvHK`tF7O$Q)i%t6_tUWZU2g2P#NKy$tWwEvYUgKz2_DSj&FjQa zTZTpcaeFK#YYCIAb*>ifx^;`IMuS}j=XkW1m9Tu&5TDE#d;yB^<2JBKb!VQOKGT91 zW`J4lv6!%I9XKX5G67-&_k0xe6`VcbahSYXdvX!_0Qbm&y+=Ezk~? z1yCx#?rD^Plocztg9$h8gUOiO4PI?6g3pAnt6o`j>ta$x5; zt?V>xhGDoDFx)$6Ps1>$v4I=?kiskvWalr^A>PRFB5{+R2L4hRy0T|ZcA=3NZf(Yi z#jO?()K}AGI#h$GLAt$>5Ox&m7GMlLy9FNHQ1BTHJK%KBsF-$ zt6Sw^$gX3CFryv~FHXA5lR668D3NhIuhyB%0mer3o~L`8Fa3vYN~oEEQMY2#uAhMl zFWwt~rQrrjTlrwU8pT4fh*CZh24PBdqn@I~h$Jnhnsce1Xtg|9l%u(>!jFK2Uz65< z4Zh48hP|9x?~&HaRy?~7=sU| z?zbVG$VP`YIPt(A$HR`8C55EFh_v~lWkkaNF&Z-s_#BPXkMC@)I@+6PCPq&K>9^`y zF`q7AK-STMAtP~8s;8Mk9P`uvb7R`x-{2r{|M$yew?*6aJ1q9{PXcgW*YoOmv%IOOJA9t<>sqxb=6xr%- Date: Mon, 5 Aug 2024 08:22:18 +0000 Subject: [PATCH 17/19] Translate Localizable.strings in hu_HU 100% translated source file: 'Localizable.strings' on 'hu_HU'. --- damus/hu-HU.lproj/Localizable.strings | Bin 158484 -> 156530 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/hu-HU.lproj/Localizable.strings b/damus/hu-HU.lproj/Localizable.strings index 3d1c0f6a02b81020fcaf2544e6d750bae773aead..3ded9cb1bb35aa94085dac2787b7433c987885b2 100644 GIT binary patch delta 1970 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 From 613ec23f7f95d1436718a7618738f2875e273081 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 09:42:45 +0000 Subject: [PATCH 18/19] Translate Localizable.strings in nl 100% translated source file: 'Localizable.strings' on 'nl'. --- damus/nl.lproj/Localizable.strings | Bin 157814 -> 155926 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings index 696cf71cb586adaf4ac3efaa2cbf2e8e66bec2ce..944f20bf59ba8352b168fc4ac9ceab7de34da90c 100644 GIT binary patch delta 1979 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 Date: Mon, 5 Aug 2024 10:10:20 +0000 Subject: [PATCH 19/19] Translate Localizable.stringsdict in ja 100% translated source file: 'Localizable.stringsdict' on 'ja'. --- damus/ja.lproj/Localizable.stringsdict | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/damus/ja.lproj/Localizable.stringsdict b/damus/ja.lproj/Localizable.stringsdict index b7177fb4..0144ec62 100644 --- a/damus/ja.lproj/Localizable.stringsdict +++ b/damus/ja.lproj/Localizable.stringsdict @@ -198,6 +198,20 @@ リポスト + quoted_reposts_count + + NSStringLocalizedFormatKey + %#@QUOTE_REPOSTS@ + QUOTE_REPOSTS + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 引用 + + sats NSStringLocalizedFormatKey