commit 95cf45073de84610059863d0a7d78a840295112d parent 279854a9fd1ee5730b6df195e47edd0d677525ce Author: William Casarin <jb55@jb55.com> Date: Thu, 25 Apr 2024 12:41:12 -0700 Merge translations Diffstat:
68 files changed, 552 insertions(+), 385 deletions(-)
diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -282,7 +282,6 @@ 4CA927632A290EB10098A105 /* EventTop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927622A290EB10098A105 /* EventTop.swift */; }; 4CA927652A290F1A0098A105 /* TimeDot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927642A290F1A0098A105 /* TimeDot.swift */; }; 4CA927672A290F8B0098A105 /* RelativeTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927662A290F8B0098A105 /* RelativeTime.swift */; }; - 4CA9276A2A290FC00098A105 /* ContextButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927692A290FC00098A105 /* ContextButton.swift */; }; 4CA9276C2A2910D10098A105 /* ReplyPart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9276B2A2910D10098A105 /* ReplyPart.swift */; }; 4CAAD8AD298851D000060CEA /* AccountDeletion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAAD8AC298851D000060CEA /* AccountDeletion.swift */; }; 4CAAD8B029888AD200060CEA /* RelayConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAAD8AF29888AD200060CEA /* RelayConfigView.swift */; }; @@ -319,7 +318,6 @@ 4CC7AAF8297F1CEE00430951 /* EventProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAF7297F1CEE00430951 /* EventProfile.swift */; }; 4CC7AAFA297F64AC00430951 /* EventMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAF9297F64AC00430951 /* EventMenu.swift */; }; 4CCEB7AE29B53D260078AA28 /* SearchingEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEB7AD29B53D260078AA28 /* SearchingEventView.swift */; }; - 4CCEB7B029B5415A0078AA28 /* SearchingProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEB7AF29B5415A0078AA28 /* SearchingProfileView.swift */; }; 4CD348EF29C3659D00497EB2 /* ImageUploadModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD348EE29C3659D00497EB2 /* ImageUploadModel.swift */; }; 4CD7641B28A1641400B6928F /* EndBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7641A28A1641400B6928F /* EndBlock.swift */; }; 4CDA128A29E9D10C0006FA5A /* SignalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDA128929E9D10C0006FA5A /* SignalView.swift */; }; @@ -742,6 +740,9 @@ 3A41E55A299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = "<group>"; }; 3A41E55B299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = id; path = id.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 3A4647CE2A413ADC00386AD8 /* CondensedProfilePicturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CondensedProfilePicturesView.swift; sourceTree = "<group>"; }; + 3A47CB772BDA05A200728A7C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/InfoPlist.strings; sourceTree = "<group>"; }; + 3A47CB782BDA05A200728A7C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = "<group>"; }; + 3A47CB792BDA05A200728A7C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fi; path = fi.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 3A48E7AF29DFBE9D006E787E /* MutedThreadsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MutedThreadsManager.swift; sourceTree = "<group>"; }; 3A5C4575296A879E0032D398 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "es-419"; path = "es-419.lproj/Localizable.stringsdict"; sourceTree = "<group>"; }; 3A5CAE1D298DC0DB00B5334F /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; @@ -1195,7 +1196,6 @@ 4CA927622A290EB10098A105 /* EventTop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventTop.swift; sourceTree = "<group>"; }; 4CA927642A290F1A0098A105 /* TimeDot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeDot.swift; sourceTree = "<group>"; }; 4CA927662A290F8B0098A105 /* RelativeTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelativeTime.swift; sourceTree = "<group>"; }; - 4CA927692A290FC00098A105 /* ContextButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextButton.swift; sourceTree = "<group>"; }; 4CA9276B2A2910D10098A105 /* ReplyPart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyPart.swift; sourceTree = "<group>"; }; 4CA9276D2A2A5D110098A105 /* wasm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wasm.h; sourceTree = "<group>"; }; 4CA9276E2A2A5D110098A105 /* wasm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = wasm.c; sourceTree = "<group>"; }; @@ -1239,7 +1239,6 @@ 4CC7AAF7297F1CEE00430951 /* EventProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventProfile.swift; sourceTree = "<group>"; }; 4CC7AAF9297F64AC00430951 /* EventMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventMenu.swift; sourceTree = "<group>"; }; 4CCEB7AD29B53D260078AA28 /* SearchingEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchingEventView.swift; sourceTree = "<group>"; }; - 4CCEB7AF29B5415A0078AA28 /* SearchingProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchingProfileView.swift; sourceTree = "<group>"; }; 4CD348EE29C3659D00497EB2 /* ImageUploadModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageUploadModel.swift; sourceTree = "<group>"; }; 4CD7641A28A1641400B6928F /* EndBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EndBlock.swift; sourceTree = "<group>"; }; 4CDA128929E9D10C0006FA5A /* SignalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignalView.swift; sourceTree = "<group>"; }; @@ -2292,7 +2291,6 @@ 4CA927622A290EB10098A105 /* EventTop.swift */, 4CC7AAF3297F18B400430951 /* ReplyDescription.swift */, 4CA927662A290F8B0098A105 /* RelativeTime.swift */, - 4CA927692A290FC00098A105 /* ContextButton.swift */, 4CA9276B2A2910D10098A105 /* ReplyPart.swift */, 5C7389B02B6EFA7100781E0A /* ProxyView.swift */, ); @@ -2403,7 +2401,6 @@ isa = PBXGroup; children = ( 4CCEB7AD29B53D260078AA28 /* SearchingEventView.swift */, - 4CCEB7AF29B5415A0078AA28 /* SearchingProfileView.swift */, 4C9D6D1A2B1D35D7004E5CD9 /* PullDownSearch.swift */, ); path = Search; @@ -2940,6 +2937,7 @@ "es-419", "es-ES", fa, + fi, fr, "hu-HU", id, @@ -3082,7 +3080,6 @@ 4C32B9572A9AD44700DC3548 /* Root.swift in Sources */, 4C3EA64428FF558100C48A62 /* sha256.c in Sources */, 504323A72A34915F006AE6DC /* RelayModel.swift in Sources */, - 4CA9276A2A290FC00098A105 /* ContextButton.swift in Sources */, 4CF0ABF62985CD5500D66079 /* UserSearch.swift in Sources */, 4C32B9542A9AD44700DC3548 /* FlatBuffersUtils.swift in Sources */, D7EDED1C2B1178FE0018B19C /* NoteContent.swift in Sources */, @@ -3257,7 +3254,6 @@ 4C2B7BF22A71B6540049DEE7 /* Id.swift in Sources */, 7C95CAEE299DCEF1009DCB67 /* KFOptionSetter+.swift in Sources */, 4C7D09722A0AEF5E00943473 /* DamusGradient.swift in Sources */, - 4CCEB7B029B5415A0078AA28 /* SearchingProfileView.swift in Sources */, 4C463CBF2B960B96008A8C36 /* PurpleBackdrop.swift in Sources */, BAB68BED29543FA3007BA466 /* SelectWalletView.swift in Sources */, 3169CAE6294E69C000EE4006 /* EmptyTimelineView.swift in Sources */, @@ -3771,6 +3767,7 @@ 3AC59CA929CDDB78007E04A6 /* pt-BR */, 3A821C4029E819D500B4BCA7 /* fr */, 3ABACEC02A5B3ED10037A847 /* sw */, + 3A47CB792BDA05A200728A7C /* fi */, ); name = Localizable.stringsdict; sourceTree = "<group>"; @@ -3806,6 +3803,7 @@ 3AC59CA829CDDB78007E04A6 /* pt-BR */, 3A821C3F29E819D500B4BCA7 /* fr */, 3ABACEBF2A5B3ED10037A847 /* sw */, + 3A47CB772BDA05A200728A7C /* fi */, ); name = InfoPlist.strings; sourceTree = "<group>"; @@ -3842,6 +3840,7 @@ 3AC59CA729CDDB78007E04A6 /* pt-BR */, 3A821C3E29E819D500B4BCA7 /* fr */, 3ABACEC12A5B3ED10037A847 /* sw */, + 3A47CB782BDA05A200728A7C /* fi */, ); name = Localizable.strings; sourceTree = "<group>"; diff --git a/damus/Components/Search/SearchHeaderView.swift b/damus/Components/Search/SearchHeaderView.swift @@ -35,7 +35,7 @@ struct SearchHeaderView: View { } var SearchText: Text { - Text(verbatim: described.description) + Text(described.description) } var body: some View { @@ -83,9 +83,9 @@ struct SingleCharacterAvatar: View { var body: some View { NonImageAvatar { - Text(verbatim: character) + Text(character) .font(.largeTitle.bold()) - .mask(Text(verbatim: character) + .mask(Text(character) .font(.largeTitle.bold())) } } diff --git a/damus/Components/Status/UserStatusSheet.swift b/damus/Components/Status/UserStatusSheet.swift @@ -192,7 +192,7 @@ struct UserStatusSheet: View { Picker(NSLocalizedString("Duration", comment: "Label for profile status expiration duration picker."), selection: $duration) { ForEach(StatusDuration.allCases, id: \.self) { d in - Text(verbatim: d.description) + Text(d.description) .tag(d) } } diff --git a/damus/Components/SupporterBadge.swift b/damus/Components/SupporterBadge.swift @@ -29,7 +29,8 @@ struct SupporterBadge: View { .frame(width:size, height:size) .foregroundStyle(GoldGradient) if self.style == .full { - Text(verbatim: format_date(date: purple_account.created_at, time_style: .none)) + let date = format_date(date: purple_account.created_at, time_style: .none) + Text(date) .foregroundStyle(.secondary) .font(.caption) } diff --git a/damus/Util/CompatibleAttribute.swift b/damus/Util/CompatibleAttribute.swift @@ -17,7 +17,7 @@ class CompatibleText: Equatable { return AnyView( VStack { Image("warning") - Text(NSLocalizedString("This note contains too many items and cannot be rendered", comment: "Error message indicating that a note is too big and cannot be rendered")) + Text("This note contains too many items and cannot be rendered", comment: "Error message indicating that a note is too big and cannot be rendered") .multilineTextAlignment(.center) } .foregroundColor(.secondary) diff --git a/damus/Views/ActionBar/ShareActionButton.swift b/damus/Views/ActionBar/ShareActionButton.swift @@ -36,7 +36,7 @@ struct ShareActionButton: View { .frame(width: 55.0, height: 55.0) } .frame(height: 25) - Text(verbatim: text) + Text(text) .foregroundColor(col) .font(.footnote) .multilineTextAlignment(.center) diff --git a/damus/Views/AddRelayView.swift b/damus/Views/AddRelayView.swift @@ -121,7 +121,7 @@ struct AddRelayView: View { dismiss() }) { HStack { - Text(verbatim: "Add relay") + Text("Add relay", comment: "Button to add a relay.") .bold() } .frame(minWidth: 300, maxWidth: .infinity, alignment: .center) diff --git a/damus/Views/BookmarksView.swift b/damus/Views/BookmarksView.swift @@ -33,7 +33,7 @@ struct BookmarksView: View { .resizable() .scaledToFit() .frame(width: 32.0, height: 32.0) - Text(NSLocalizedString("You have no bookmarks yet, add them in the context menu", comment: "Text indicating that there are no bookmarks to be viewed")) + Text("You have no bookmarks yet, add them in the context menu", comment: "Text indicating that there are no bookmarks to be viewed") } } else { ScrollView { diff --git a/damus/Views/Buttons/GradientFollowButton.swift b/damus/Views/Buttons/GradientFollowButton.swift @@ -22,7 +22,8 @@ struct GradientFollowButton: View { Button(action: { follow_state = perform_follow_btn_action(follow_state, target: target) }) { - Text(follow_btn_txt(follow_state, follows_you: follows_you)) + let followButtonText = follow_btn_txt(follow_state, follows_you: follows_you) + Text(followButtonText) .foregroundColor(follow_state == .unfollows ? .white : grayTextColor) .font(.callout) .fontWeight(.medium) diff --git a/damus/Views/ConfigView.swift b/damus/Views/ConfigView.swift @@ -88,7 +88,7 @@ struct ConfigView: View { } if state.is_privkey_user { - Section(header: Text(NSLocalizedString("Permanently Delete Account", comment: "Section title for deleting the user"))) { + Section(header: Text("Permanently Delete Account", comment: "Section title for deleting the user")) { Button(action: { delete_account_warning = true }, label: { diff --git a/damus/Views/CreateAccountView.swift b/damus/Views/CreateAccountView.swift @@ -28,7 +28,7 @@ struct CreateAccountView: View { VStack(alignment: .center) { EditPictureControl(uploader: .nostrBuild, pubkey: account.pubkey, image_url: $account.profile_image , uploadObserver: profileUploadObserver, callback: uploadedProfilePicture) - Text(NSLocalizedString("Public Key", comment: "Label to indicate the public key of the account.")) + Text("Public Key", comment: "Label to indicate the public key of the account.") .bold() .padding() .onTapGesture { diff --git a/damus/Views/Events/Components/ContextButton.swift b/damus/Views/Events/Components/ContextButton.swift @@ -1,20 +0,0 @@ -// -// ContextButton.swift -// damus -// -// Created by William Casarin on 2023-06-01. -// - -import SwiftUI - -struct ContextButton: View { - var body: some View { - Text(verbatim: /*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -struct ContextButton_Previews: PreviewProvider { - static var previews: some View { - ContextButton() - } -} diff --git a/damus/Views/Events/Components/ProxyView.swift b/damus/Views/Events/Components/ProxyView.swift @@ -36,7 +36,7 @@ struct ProxyView: View { HStack { let protocolLogo = get_protocol_image(protocolName: proxy.protocolName) if protocolLogo.isEmpty { - Text("\(proxy.protocolName)") + Text(proxy.protocolName) .font(.caption) } else { Image(protocolLogo) diff --git a/damus/Views/Images/FullScreenCarouselView.swift b/damus/Views/Images/FullScreenCarouselView.swift @@ -145,7 +145,7 @@ struct FullScreenCarouselView_Previews: PreviewProvider { HStack { Spacer() - Text("Some content") + Text(verbatim: "Some content") .padding() .foregroundColor(.white) diff --git a/damus/Views/Muting/MuteDurationMenu.swift b/damus/Views/Muting/MuteDurationMenu.swift @@ -17,7 +17,7 @@ struct MuteDurationMenu<T: View>: View { Button { action(duration) } label: { - Text("\(duration.title)") + Text(duration.title) } } } label: { @@ -30,6 +30,6 @@ struct MuteDurationMenu<T: View>: View { MuteDurationMenu { _ in } label: { - Text("Mute hashtag") + Text(verbatim: "Mute hashtag") } } diff --git a/damus/Views/Muting/MutelistView.swift b/damus/Views/Muting/MutelistView.swift @@ -62,7 +62,7 @@ struct MutelistView: View { Section(NSLocalizedString("Hashtags", comment: "Section header title for a list of hashtags that are muted.")) { ForEach(hashtags, id: \.self) { item in if case let MuteItem.hashtag(hashtag, _) = item { - Text("#\(hashtag.hashtag)") + Text(verbatim: "#\(hashtag.hashtag)") .id(hashtag.hashtag) .swipeActions { RemoveAction(item: .hashtag(hashtag, nil)) @@ -76,7 +76,7 @@ struct MutelistView: View { Section(NSLocalizedString("Words", comment: "Section header title for a list of words that are muted.")) { ForEach(words, id: \.self) { item in if case let MuteItem.word(word, _) = item { - Text("\(word)") + Text(word) .id(word) .swipeActions { RemoveAction(item: .word(word, nil)) @@ -94,7 +94,7 @@ struct MutelistView: View { RemoveAction(item: .thread(note_id, nil)) } } else { - Text(NSLocalizedString("Error retrieving muted event", comment: "Text for an item that application failed to retrieve the muted event for.")) + Text("Error retrieving muted event", comment: "Text for an item that application failed to retrieve the muted event for.") } } } diff --git a/damus/Views/Notifications/DamusAppNotificationView.swift b/damus/Views/Notifications/DamusAppNotificationView.swift @@ -37,9 +37,9 @@ struct DamusAppNotificationView: View { .shadow(radius: 5, y: 5) VStack(alignment: .leading, spacing: 5) { HStack(alignment: .center, spacing: 3) { - Text(NSLocalizedString("Damus", comment: "Name of the app for the title of an internal notification")) + Text("Damus", comment: "Name of the app for the title of an internal notification") .font(.body.weight(.bold)) - Text("·") + Text(verbatim: "·") .foregroundStyle(.secondary) Text(relative_date) .font(.system(size: 16)) @@ -49,7 +49,7 @@ struct DamusAppNotificationView: View { Image("check-circle.fill") .resizable() .frame(width: 15, height: 15) - Text(NSLocalizedString("Internal app notification", comment: "Badge indicating that a notification is an official internal app notification")) + Text("Internal app notification", comment: "Badge indicating that a notification is an official internal app notification") .font(.caption2) .bold() } diff --git a/damus/Views/Notifications/EventGroupView.swift b/damus/Views/Notifications/EventGroupView.swift @@ -196,7 +196,7 @@ struct EventGroupView: View { return VStack(alignment: .center) { Image("zap.fill") .foregroundColor(.orange) - Text(verbatim: fmt) + Text(fmt) .foregroundColor(Color.orange) } } diff --git a/damus/Views/Onboarding/OnboardingSuggestionsView.swift b/damus/Views/Onboarding/OnboardingSuggestionsView.swift @@ -36,7 +36,7 @@ struct OnboardingSuggestionsView: View { .navigationBarItems(leading: Button(action: { self.next_page() }, label: { - Text(NSLocalizedString("Skip", comment: "Button to dismiss the suggested users screen")) + Text("Skip", comment: "Button to dismiss the suggested users screen") .font(.subheadline.weight(.semibold)) })) .tag(0) @@ -48,7 +48,7 @@ struct OnboardingSuggestionsView: View { AnyView( HStack { Image(systemName: "sparkles") - Text(NSLocalizedString("Add your first post", comment: "Prompt given to the user during onboarding, suggesting them to write their first post")) + Text("Add your first post", comment: "Prompt given to the user during onboarding, suggesting them to write their first post") } .foregroundColor(.secondary) .font(.callout) @@ -97,7 +97,7 @@ fileprivate struct SuggestedUsersPageView: View { Button(action: { self.next_page() }) { - Text(NSLocalizedString("Continue", comment: "Button to dismiss suggested users view and continue to the main app")) + Text("Continue", comment: "Button to dismiss suggested users view and continue to the main app") .frame(minWidth: 300, maxWidth: .infinity, alignment: .center) } .buttonStyle(GradientButtonStyle()) diff --git a/damus/Views/PostView.swift b/damus/Views/PostView.swift @@ -268,7 +268,7 @@ struct PostView: View { Button(action: { self.cancel() }, label: { - Text(NSLocalizedString("Cancel", comment: "Button to cancel out of posting a note.")) + Text("Cancel", comment: "Button to cancel out of posting a note.") .padding(10) }) .buttonStyle(NeutralButtonStyle()) diff --git a/damus/Views/Profile/ProfileView.swift b/damus/Views/Profile/ProfileView.swift @@ -199,7 +199,7 @@ struct ProfileView: View { MuteDurationMenu { duration in notify(.mute(.user(profile.pubkey, duration?.date_from_now))) } label: { - Text(NSLocalizedString("Mute", comment: "Button to mute a profile.")) + Text("Mute", comment: "Button to mute a profile.") .foregroundStyle(.red) } } diff --git a/damus/Views/ProfileActionSheetView.swift b/damus/Views/ProfileActionSheetView.swift @@ -59,7 +59,7 @@ struct ProfileActionSheetView: View { } ) .buttonStyle(NeutralButtonShape.circle.style) - Text(NSLocalizedString("Message", comment: "Button label that allows the user to start a direct message conversation with the user shown on-screen")) + Text("Message", comment: "Button label that allows the user to start a direct message conversation with the user shown on-screen") .foregroundStyle(.secondary) .font(.caption) } @@ -114,7 +114,7 @@ struct ProfileActionSheetView: View { label: { HStack { Spacer() - Text(NSLocalizedString("View full profile", comment: "A button label that allows the user to see the full profile of the profile they are previewing")) + Text("View full profile", comment: "A button label that allows the user to see the full profile of the profile they are previewing") Image(systemName: "arrow.up.right") Spacer() } @@ -305,9 +305,9 @@ fileprivate struct ProfileActionSheetZapButton: View { }) .alert(isPresented: $show_error_alert) { Alert( - title: Text(NSLocalizedString("Zap failed", comment: "Title of an alert indicating that a zap action failed")), + title: Text("Zap failed", comment: "Title of an alert indicating that a zap action failed"), message: Text(zap_state.error_message() ?? ""), - dismissButton: .default(Text(NSLocalizedString("OK", comment: "Button label to dismiss an error dialog"))) + dismissButton: .default(Text("OK", comment: "Button label to dismiss an error dialog")) ) } .onChange(of: zap_state) { new_zap_state in diff --git a/damus/Views/PubkeyView.swift b/damus/Views/PubkeyView.swift @@ -57,7 +57,7 @@ struct PubkeyView: View { .resizable() .foregroundColor(DamusColors.green) .frame(width: 20, height: 20) - Text(NSLocalizedString("Copied", comment: "Label indicating that a user's key was copied.")) + Text("Copied", comment: "Label indicating that a user's key was copied.") .font(.footnote) .layoutPriority(1) .foregroundColor(DamusColors.green) diff --git a/damus/Views/Purple/DamusPurpleAccountView.swift b/damus/Views/Purple/DamusPurpleAccountView.swift @@ -31,9 +31,10 @@ struct DamusPurpleAccountView: View { // TODO: Generalize this view instead of setting up dividers and paddings manually VStack { HStack { - Text(NSLocalizedString("Expiry date", comment: "Label for Purple subscription expiry date")) + Text("Expiry date", comment: "Label for Purple subscription expiry date") Spacer() - Text(DateFormatter.localizedString(from: account.expiry, dateStyle: .short, timeStyle: .none)) + let formattedDate = DateFormatter.localizedString(from: account.expiry, dateStyle: .short, timeStyle: .none) + Text(formattedDate) } .padding(.horizontal) .padding(.top, 20) @@ -43,9 +44,10 @@ struct DamusPurpleAccountView: View { .padding(.vertical, 10) HStack { - Text(NSLocalizedString("Account creation", comment: "Label for Purple account creation date")) + Text("Account creation", comment: "Label for Purple account creation date") Spacer() - Text(DateFormatter.localizedString(from: account.created_at, dateStyle: .short, timeStyle: .none)) + let formattedDate = DateFormatter.localizedString(from: account.created_at, dateStyle: .short, timeStyle: .none) + Text(formattedDate) } .padding(.horizontal) @@ -54,7 +56,7 @@ struct DamusPurpleAccountView: View { .padding(.vertical, 10) HStack { - Text(NSLocalizedString("Subscriber number", comment: "Label for Purple account subscriber number")) + Text("Subscriber number", comment: "Label for Purple account subscriber number") Spacer() Text(verbatim: "#\(account.subscriber_number)") } @@ -90,7 +92,7 @@ struct DamusPurpleAccountView: View { .resizable() .frame(width: 15, height: 15) - Text(NSLocalizedString("Active account", comment: "Badge indicating user has an active Damus Purple account")) + Text("Active account", comment: "Badge indicating user has an active Damus Purple account") .font(.caption) .bold() } @@ -107,7 +109,7 @@ struct DamusPurpleAccountView: View { .resizable() .frame(width: 15, height: 15) - Text(NSLocalizedString("Expired account", comment: "Badge indicating user has an expired Damus Purple account")) + Text("Expired account", comment: "Badge indicating user has an expired Damus Purple account") .font(.caption) .bold() } diff --git a/damus/Views/Purple/DamusPurpleTranslationSetupView.swift b/damus/Views/Purple/DamusPurpleTranslationSetupView.swift @@ -61,7 +61,7 @@ struct DamusPurpleTranslationSetupView: View { .opacity(start ? 1.0 : 0.0) .animation(.content(), value: start) - Text(NSLocalizedString("You unlocked", comment: "Part 1 of 2 in message 'You unlocked automatic translations' the user gets when they sign up for Damus Purple" )) + Text("You unlocked", comment: "Part 1 of 2 in message 'You unlocked automatic translations' the user gets when they sign up for Damus Purple" ) .font(.largeTitle) .fontWeight(.bold) .foregroundStyle( @@ -95,7 +95,7 @@ struct DamusPurpleTranslationSetupView: View { .opacity(start ? 1.0 : 0.0) .animation(Animation.snappy(duration: 2).delay(0), value: start) - Text(NSLocalizedString("Automatic translations", comment: "Part 1 of 2 in message 'You unlocked automatic translations' the user gets when they sign up for Damus Purple")) + Text("Automatic translations", comment: "Part 1 of 2 in message 'You unlocked automatic translations' the user gets when they sign up for Damus Purple") .font(.headline) .fontWeight(.bold) .foregroundStyle( @@ -110,7 +110,7 @@ struct DamusPurpleTranslationSetupView: View { .animation(.content(), value: start) .padding(.top, 10) - Text(NSLocalizedString("As part of your Damus Purple membership, you get complimentary and automated translations. Would you like to enable Damus Purple translations?\n\nTip: You can always change this later in Settings → Translations", comment: "Message notifying the user that they get auto-translations as part of their service")) + Text("As part of your Damus Purple membership, you get complimentary and automated translations. Would you like to enable Damus Purple translations?\n\nTip: You can always change this later in Settings → Translations", comment: "Message notifying the user that they get auto-translations as part of their service") .lineSpacing(5) .multilineTextAlignment(.center) .foregroundStyle(.white.opacity(0.8)) @@ -125,7 +125,7 @@ struct DamusPurpleTranslationSetupView: View { }, label: { HStack { Spacer() - Text(NSLocalizedString("Enable Purple auto-translations", comment: "Label for button that allows users to enable Damus Purple translations")) + Text("Enable Purple auto-translations", comment: "Label for button that allows users to enable Damus Purple translations") Spacer() } }) @@ -139,7 +139,7 @@ struct DamusPurpleTranslationSetupView: View { }, label: { HStack { Spacer() - Text(NSLocalizedString("No, thanks", comment: "Label for button that allows users to reject enabling Damus Purple translations")) + Text("No, thanks", comment: "Label for button that allows users to reject enabling Damus Purple translations") Spacer() } }) diff --git a/damus/Views/Purple/DamusPurpleVerifyNpubView.swift b/damus/Views/Purple/DamusPurpleVerifyNpubView.swift @@ -53,7 +53,7 @@ struct DamusPurpleVerifyNpubView: View { }, label: { HStack { Spacer() - Text(NSLocalizedString("Verify my npub", comment: "Button label to verify the user's npub for the purpose of Purple subscription checkout")) + Text("Verify my npub", comment: "Button label to verify the user's npub for the purpose of Purple subscription checkout") Spacer() } }) @@ -61,7 +61,7 @@ struct DamusPurpleVerifyNpubView: View { .buttonStyle(GradientButtonStyle()) } else { - Text(NSLocalizedString("Verified!", comment: "Instructions after the user has verified their npub for Damus Purple purchase checkout")) + Text("Verified!", comment: "Instructions after the user has verified their npub for Damus Purple purchase checkout") .frame(height: subtitle_height) .multilineTextAlignment(.center) .foregroundColor(.green) @@ -71,7 +71,7 @@ struct DamusPurpleVerifyNpubView: View { }, label: { HStack { Spacer() - Text(NSLocalizedString("Continue", comment: "Prompt to user to continue")) + Text("Continue", comment: "Prompt to user to continue") Spacer() } }) diff --git a/damus/Views/Purple/DamusPurpleView.swift b/damus/Views/Purple/DamusPurpleView.swift @@ -138,7 +138,7 @@ struct DamusPurpleView: View, DamusPurpleStoreKitManagerDelegate { if let account_uuid { DamusPurpleView.IAPProductStateView(products: products, purchased: purchased, account_uuid: account_uuid, subscribe: subscribe) if let iap_error { - Text(String(format: NSLocalizedString("There has been an unexpected error with the in-app purchase. Please try again later or contact support@damus.io. Error: %@", comment: "In-app purchase error message for the user"), iap_error)) + Text("There has been an unexpected error with the in-app purchase. Please try again later or contact support@damus.io. Error: \(iap_error)", comment: "In-app purchase error message for the user") .foregroundStyle(.red) .multilineTextAlignment(.center) .padding(.horizontal) @@ -158,7 +158,7 @@ struct DamusPurpleView: View, DamusPurpleStoreKitManagerDelegate { } var ManageOnWebsiteNote: some View { - Text(NSLocalizedString("Visit the Damus website on a web browser to manage billing", comment: "Instruction on how to manage billing externally")) + Text("Visit the Damus website on a web browser to manage billing", comment: "Instruction on how to manage billing externally") .font(.caption) .foregroundColor(.white.opacity(0.6)) .multilineTextAlignment(.center) diff --git a/damus/Views/Purple/DamusPurpleWelcomeView.swift b/damus/Views/Purple/DamusPurpleWelcomeView.swift @@ -37,7 +37,7 @@ struct DamusPurpleWelcomeView: View { .opacity(start ? 1.0 : 0.0) .animation(.content(), value: start) - Text(NSLocalizedString("Welcome to Purple", comment: "Greeting to subscription service")) + Text("Welcome to Purple", comment: "Greeting to subscription service") .font(.largeTitle) .fontWeight(.bold) .foregroundStyle( @@ -70,7 +70,7 @@ struct DamusPurpleWelcomeView: View { .opacity(start ? 1.0 : 0.0) .animation(Animation.snappy(duration: 2).delay(0), value: start) - Text(NSLocalizedString("Thank you very much for signing up for Damus\u{00A0}Purple. Your contribution helps us continue our fight for a more Open and Free\u{00A0}internet.\n\nYou will also get access to premium features, and a star badge on your profile.\n\nEnjoy!", comment: "Appreciation to user for purchasing subscription service")) + Text("Thank you very much for signing up for Damus\u{00A0}Purple. Your contribution helps us continue our fight for a more Open and Free\u{00A0}internet.\n\nYou will also get access to premium features, and a star badge on your profile.\n\nEnjoy!", comment: "Appreciation to user for purchasing subscription service") .lineSpacing(5) .multilineTextAlignment(.center) .foregroundStyle(.white.opacity(0.8)) @@ -85,7 +85,7 @@ struct DamusPurpleWelcomeView: View { }, label: { HStack { Spacer() - Text(NSLocalizedString("Continue", comment: "Prompt to user to continue")) + Text("Continue", comment: "Prompt to user to continue") Spacer() } }) diff --git a/damus/Views/Purple/Detail/IAPProductStateView.swift b/damus/Views/Purple/Detail/IAPProductStateView.swift @@ -26,7 +26,7 @@ extension DamusPurpleView { var body: some View { if subscription_purchase_loading { HStack(spacing: 10) { - Text(NSLocalizedString("Purchasing", comment: "Loading label indicating the purchase action is in progress")) + Text("Purchasing", comment: "Loading label indicating the purchase action is in progress") .foregroundStyle(.white) ProgressView() .progressViewStyle(.circular) @@ -66,7 +66,7 @@ extension DamusPurpleView { } func PurchasedUnmanageableView(_ purchased: PurchasedProduct) -> some View { - Text(NSLocalizedString("This device's in-app purchase is registered to a different Nostr account. Unable to manage this Purple account. If you believe this was a mistake, please contact us via support@damus.io.", comment: "Notice label that user cannot manage their In-App purchases")) + Text("This device's in-app purchase is registered to a different Nostr account. Unable to manage this Purple account. If you believe this was a mistake, please contact us via support@damus.io.", comment: "Notice label that user cannot manage their In-App purchases") .font(.caption) .foregroundColor(.white.opacity(0.6)) .multilineTextAlignment(.center) @@ -76,21 +76,21 @@ extension DamusPurpleView { func PurchasedManageView(_ purchased: PurchasedProduct) -> some View { VStack(spacing: 10) { if SHOW_IAP_DEBUG_INFO == true { - Text(NSLocalizedString("Purchased!", comment: "User purchased a subscription")) + Text("Purchased!", comment: "User purchased a subscription") .font(.title2) .foregroundColor(.white) price_description(product: purchased.product) .foregroundColor(.white) .opacity(0.65) .frame(width: 200) - Text(NSLocalizedString("Purchased on", comment: "Indicating when the user purchased the subscription")) + Text("Purchased on", comment: "Indicating when the user purchased the subscription") .font(.title2) .foregroundColor(.white) Text(format_date(date: purchased.tx.purchaseDate)) .foregroundColor(.white) .opacity(0.65) if let expiry = purchased.tx.expirationDate { - Text(NSLocalizedString("Renews on", comment: "Indicating when the subscription will renew")) + Text("Renews on", comment: "Indicating when the subscription will renew") .font(.title2) .foregroundColor(.white) Text(format_date(date: expiry)) @@ -101,7 +101,7 @@ extension DamusPurpleView { Button(action: { show_manage_subscriptions = true }, label: { - Text(NSLocalizedString("Manage", comment: "Manage the damus subscription")) + Text("Manage", comment: "Manage the damus subscription") .padding(.horizontal, 20) }) .buttonStyle(GradientButtonStyle()) @@ -112,7 +112,7 @@ extension DamusPurpleView { func ProductsView(_ products: [Product]) -> some View { VStack(spacing: 10) { - Text(NSLocalizedString("Save 20% off on an annual subscription", comment: "Savings for purchasing an annual subscription")) + Text("Save 20% off on an annual subscription", comment: "Savings for purchasing an annual subscription") .font(.callout.bold()) .foregroundColor(.white) ForEach(products) { product in @@ -132,7 +132,7 @@ extension DamusPurpleView { .buttonStyle(GradientButtonStyle()) } - Text("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/)") + Text("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/)", comment: "Text explaining the terms and conditions of subscribing to Damus Purple. EULA stands for End User License Agreement.") .foregroundColor(.white.opacity(0.6)) .font(.caption) .padding() @@ -148,11 +148,11 @@ extension DamusPurpleView { Text(purple_type?.label() ?? product.displayName) Spacer() if let non_discounted_price = purple_type?.non_discounted_price(product: product) { - Text(verbatim: non_discounted_price) + Text(non_discounted_price) .strikethrough() .foregroundColor(DamusColors.white.opacity(0.5)) } - Text(verbatim: product.displayPrice) + Text(product.displayPrice) .fontWeight(.bold) } ) diff --git a/damus/Views/Purple/Detail/LogoView.swift b/damus/Views/Purple/Detail/LogoView.swift @@ -27,7 +27,7 @@ extension DamusPurpleView { .shadow(radius: 5) VStack(alignment: .leading) { - Text(NSLocalizedString("Purple", comment: "Subscription service name")) + Text("Purple", comment: "Subscription service name") .font(.system(size: 60.0).weight(.bold)) .foregroundStyle( LinearGradient( diff --git a/damus/Views/Purple/Detail/MarketingContentView.swift b/damus/Views/Purple/Detail/MarketingContentView.swift @@ -38,7 +38,7 @@ extension DamusPurpleView { .resizable() .frame(width: 15, height: 15) - Text(NSLocalizedString("Coming soon", comment: "Feature is still in development and will be available soon")) + Text("Coming soon", comment: "Feature is still in development and will be available soon") .font(.caption) .bold() } diff --git a/damus/Views/Purple/Detail/PurpleBackdrop.swift b/damus/Views/Purple/Detail/PurpleBackdrop.swift @@ -25,6 +25,6 @@ struct PurpleBackdrop<T: View>: View { #Preview { PurpleBackdrop { - Text("Hello, World") + Text(verbatim: "Hello, World") } } diff --git a/damus/Views/Purple/Detail/PurpleViewPrimitives.swift b/damus/Views/Purple/Detail/PurpleViewPrimitives.swift @@ -67,14 +67,14 @@ struct PurpleViewPrimitives { struct ProductLoadErrorView: View { var body: some View { - Text(NSLocalizedString("Subscription Error", comment: "Ah dang there was an error loading subscription information from the AppStore. Please try again later :(")) + Text("Subscription Error", comment: "Ah dang there was an error loading subscription information from the AppStore. Please try again later :(") .foregroundColor(.white) } } struct SaveTextView: View { var body: some View { - Text(NSLocalizedString("Save 14%", comment: "Percentage of purchase price the user will save")) + Text("Save 14%", comment: "Percentage of purchase price the user will save") .font(.callout) .italic() .foregroundColor(DamusColors.green) diff --git a/damus/Views/Relays/Detail/RelayAdminDetail.swift b/damus/Views/Relays/Detail/RelayAdminDetail.swift @@ -15,7 +15,7 @@ struct RelayAdminDetail: View { var body: some View { HStack(spacing: 15) { VStack(spacing: 10) { - Text("ADMIN") + Text("ADMIN", comment: "Text label indicating the profile picture underneath it is the admin of the Nostr relay.") .font(.caption) .fontWeight(.heavy) .foregroundColor(DamusColors.mediumGrey) @@ -36,18 +36,18 @@ struct RelayAdminDetail: View { Divider().frame(width: 1) VStack { - Text("CONTACT") + Text("CONTACT", comment: "Text label indicating that the information below is the contact information of the admin of the Nostr relay.") .font(.caption) .fontWeight(.heavy) .foregroundColor(DamusColors.mediumGrey) Image("messages") .foregroundColor(.gray) - if nip11?.contact == "" { - Text("N/A") + if let contact = nip11?.contact, !contact.isEmpty { + Text(contact) .font(.subheadline) .foregroundColor(.gray) } else { - Text(nip11?.contact ?? "N/A") + Text("N/A", comment: "Text label indicating that there is no NIP-11 relay admin contact information found. In English, N/A stands for not applicable.") .font(.subheadline) .foregroundColor(.gray) } diff --git a/damus/Views/Relays/Detail/RelayAuthenticationDetail.swift b/damus/Views/Relays/Detail/RelayAuthenticationDetail.swift @@ -15,7 +15,7 @@ struct RelayAuthenticationDetail: View { case .none: EmptyView() case .pending: - Text(NSLocalizedString("Pending", comment: "Label to display that authentication to a server is pending.")) + Text("Pending", comment: "Label to display that authentication to a server is pending.") .font(.caption) .frame(height: 20) .padding(.horizontal, 10) @@ -27,7 +27,7 @@ struct RelayAuthenticationDetail: View { .stroke(DamusColors.warningBorder, lineWidth: 1) ) case .verified: - Text(NSLocalizedString("Authenticated", comment: "Label to display that authentication to a server has succeeded.")) + Text("Authenticated", comment: "Label to display that authentication to a server has succeeded.") .font(.caption) .frame(height: 20) .padding(.horizontal, 10) @@ -39,7 +39,7 @@ struct RelayAuthenticationDetail: View { .stroke(DamusColors.successBorder, lineWidth: 1) ) case .error: - Text(NSLocalizedString("Error", comment: "Label to display that authentication to a server has failed.")) + Text("Error", comment: "Label to display that authentication to a server has failed.") .font(.caption) .frame(height: 20) .padding(.horizontal, 10) diff --git a/damus/Views/Relays/Detail/RelayNipList.swift b/damus/Views/Relays/Detail/RelayNipList.swift @@ -47,7 +47,7 @@ struct RelayNipList: View { var body: some View { VStack(alignment: .leading, spacing: 10) { - Text(NSLocalizedString("Supported NIPs", comment: "Label to display relay's supported NIPs.")) + Text("Supported NIPs", comment: "Label to display relay's supported NIPs.") .font(.callout) .fontWeight(.bold) .foregroundColor(DamusColors.mediumGrey) diff --git a/damus/Views/Relays/Detail/RelayPaidDetail.swift b/damus/Views/Relays/Detail/RelayPaidDetail.swift @@ -19,18 +19,21 @@ struct RelayPaidDetail: View { let formattedString = formatter.string(from: TimeInterval(time)) ?? "" return formattedString } - + + func displayAmount(unit: String, amount: Int64) -> String { + if unit == "msats" { + format_msats(amount) + } else { + "\(amount) \(unit)" + } + } + func Amount(unit: String, amount: Int64) -> some View { HStack { - if unit == "msats" { - Text("\(format_msats(amount))") - .font(.system(size: 13, weight: .heavy)) - .foregroundColor(DamusColors.white) - } else { - Text("\(amount) \(unit)") - .font(.system(size: 13, weight: .heavy)) - .foregroundColor(DamusColors.white) - } + let displayString = displayAmount(unit: unit, amount: amount) + Text(displayString) + .font(.system(size: 13, weight: .heavy)) + .foregroundColor(DamusColors.white) } } @@ -48,26 +51,24 @@ struct RelayPaidDetail: View { if !admission.isEmpty { Amount(unit: admission[0].unit, amount: admission[0].amount) } else { - Text(verbatim: "Paid Relay") + Text("Paid Relay", comment: "Text indicating that this is a paid relay.") .font(.system(size: 13, weight: .heavy)) .foregroundColor(DamusColors.white) } } else if let subscription = fees?.subscription { if !subscription.isEmpty { - Amount(unit: subscription[0].unit, amount: subscription[0].amount) - Text("/ \(timeString(time: subscription[0].period))") + Text("\(displayAmount(unit: subscription[0].unit, amount: subscription[0].amount)) / \(timeString(time: subscription[0].period))", comment: "Amount of money required to subscribe to the Nostr relay. In English, this would look something like '4,000 sats / 30 days', meaning it costs 4000 sats to subscribe to the Nostr relay for 30 days.") .font(.system(size: 13, weight: .heavy)) .foregroundColor(DamusColors.white) } } else if let publication = fees?.publication { if !publication.isEmpty { - Amount(unit: publication[0].unit, amount: publication[0].amount) - Text("/ event") + Text("\(displayAmount(unit: publication[0].unit, amount: publication[0].amount)) / event", comment: "Amount of money required to publish to the Nostr relay. In English, this would look something like '10 sats / event', meaning it costs 10 sats to publish one event.") .font(.system(size: 13, weight: .heavy)) .foregroundColor(DamusColors.white) } } else { - Text(verbatim: "Paid Relay") + Text("Paid Relay", comment: "Text indicating that this is a paid relay.") .font(.system(size: 13, weight: .heavy)) .foregroundColor(DamusColors.white) } diff --git a/damus/Views/Relays/Detail/RelaySoftwareDetail.swift b/damus/Views/Relays/Detail/RelaySoftwareDetail.swift @@ -14,7 +14,7 @@ struct RelaySoftwareDetail: View { var body: some View { HStack(spacing: 15) { VStack { - Text("SOFTWARE") + Text("SOFTWARE", comment: "Text label indicating which relay software is used to run this Nostr relay.") .font(.caption) .fontWeight(.heavy) .foregroundColor(DamusColors.mediumGrey) @@ -24,26 +24,37 @@ struct RelaySoftwareDetail: View { let software = nip11?.software let softwareSeparated = software?.components(separatedBy: "/") - let softwareShortened = softwareSeparated?.last - Text(softwareShortened ?? "N/A") - .font(.subheadline) - .foregroundColor(.gray) + if let softwareShortened = softwareSeparated?.last { + Text(softwareShortened) + .font(.subheadline) + .foregroundColor(.gray) + } else { + Text("N/A", comment: "Text label indicating that there is no NIP-11 relay software information found. In English, N/A stands for not applicable.") + .font(.subheadline) + .foregroundColor(.gray) + } } Divider().frame(width: 1) VStack { - Text("VERSION") + Text("VERSION", comment: "Text label indicating which version of the relay software is being run for this Nostr relay.") .font(.caption) .fontWeight(.heavy) .foregroundColor(DamusColors.mediumGrey) Image("branches") .foregroundColor(.gray) - - Text(nip11?.version ?? "N/A") - .font(.subheadline) - .foregroundColor(.gray) + + if let version = nip11?.version, !version.isEmpty { + Text(version) + .font(.subheadline) + .foregroundColor(.gray) + } else { + Text("N/A", comment: "Text label indicating that there is no NIP-11 relay software version information found. In English, N/A stands for not applicable.") + .font(.subheadline) + .foregroundColor(.gray) + } } } } diff --git a/damus/Views/Relays/RelayConfigView.swift b/damus/Views/Relays/RelayConfigView.swift @@ -112,7 +112,7 @@ struct RelayConfigView: View { func RelayList(title: String, relayList: [RelayDescriptor], recommended: Bool) -> some View { ScrollView(showsIndicators: false) { HStack { - Text(NSLocalizedString(title, comment: "Section title for type of relay server list")) + Text(title) .font(.system(size: 32, weight: .bold)) @@ -123,7 +123,7 @@ struct RelayConfigView: View { show_add_relay.toggle() }) { HStack { - Text(verbatim: "Add relay") + Text("Add relay", comment: "Button text to add a relay") .padding(10) } } diff --git a/damus/Views/Relays/RelayDetailView.swift b/damus/Views/Relays/RelayDetailView.swift @@ -144,13 +144,18 @@ struct RelayDetailView: View { Divider() - Text("Description") + Text("Description", comment: "Description of the specific Nostr relay server.") .font(.subheadline) .foregroundColor(DamusColors.mediumGrey) - Text(nip11?.description ?? "N/A") - .font(.subheadline) - + if let description = nip11?.description, !description.isEmpty { + Text(description) + .font(.subheadline) + } else { + Text("N/A", comment: "Text label indicating that there is no NIP-11 relay description information found. In English, N/A stands for not applicable.") + .font(.subheadline) + } + Divider() RelayInfo @@ -175,7 +180,7 @@ struct RelayDetailView: View { } if state.settings.developer_mode { - Text("Relay Logs") + Text("Relay Logs", comment: "Text label indicating that the text below it are developer mode logs.") .padding(.top) Divider() Text(log.contents ?? NSLocalizedString("No logs to display", comment: "Label to indicate that there are no developer mode logs available to be displayed on the screen")) diff --git a/damus/Views/Relays/RelayView.swift b/damus/Views/Relays/RelayView.swift @@ -75,7 +75,7 @@ struct RelayView: View { Button(action: { remove_action(privkey: keypair.privkey) }) { - Text(NSLocalizedString("Added", comment: "Button to show relay server is already added to list.")) + Text("Added", comment: "Button to show relay server is already added to list.") .font(.caption) } .buttonStyle(NeutralButtonShape.capsule.style) @@ -147,7 +147,7 @@ struct RelayView: View { Button(action: { add_action(keypair: keypair) }) { - Text(NSLocalizedString("Add", comment: "Button to add relay server to list.")) + Text("Add", comment: "Button to add relay server to list.") .font(.caption) } .buttonStyle(NeutralButtonShape.capsule.style) @@ -166,7 +166,7 @@ struct RelayView: View { remove_action(privkey: privkey) }) { if showText { - Text(NSLocalizedString("Disconnect", comment: "Button to disconnect from a relay server.")) + Text("Disconnect", comment: "Button to disconnect from a relay server.") } Image("minus-circle") diff --git a/damus/Views/Search/PullDownSearch.swift b/damus/Views/Search/PullDownSearch.swift @@ -84,7 +84,7 @@ struct PullDownSearchView: View { if results.count > 0 { HStack { Image("search") - Text(NSLocalizedString("Top hits", comment: "A label indicating that the notes being displayed below it are all top note search results")) + Text("Top hits", comment: "A label indicating that the notes being displayed below it are all top note search results") Spacer() } .padding(.horizontal) @@ -101,7 +101,7 @@ struct PullDownSearchView: View { HStack { Image("notes.fill") - Text(NSLocalizedString("Notes", comment: "A label indicating that the notes being displayed below it are from a timeline, not search results")) + Text("Notes", comment: "A label indicating that the notes being displayed below it are from a timeline, not search results") Spacer() } .foregroundColor(.secondary) @@ -109,7 +109,7 @@ struct PullDownSearchView: View { } else if results.count == 0 && !search_text.isEmpty { HStack { Image("search") - Text(NSLocalizedString("No results", comment: "A label indicating that note search resulted in no results")) + Text("No results", comment: "A label indicating that note search resulted in no results") Spacer() } .padding(.horizontal) diff --git a/damus/Views/Search/SearchingProfileView.swift b/damus/Views/Search/SearchingProfileView.swift @@ -1,20 +0,0 @@ -// -// SearchingProfileView.swift -// damus -// -// Created by William Casarin on 2023-03-05. -// - -import SwiftUI - -struct SearchingProfileView: View { - var body: some View { - Text(verbatim: /*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -struct SearchingProfileView_Previews: PreviewProvider { - static var previews: some View { - SearchingProfileView() - } -} diff --git a/damus/Views/SearchHomeView.swift b/damus/Views/SearchHomeView.swift @@ -85,7 +85,7 @@ struct SearchHomeView: View { HStack { Image("notes.fill") - Text(NSLocalizedString("All recent notes", comment: "A label indicating that the notes being displayed below it are all recent notes")) + Text("All recent notes", comment: "A label indicating that the notes being displayed below it are all recent notes") Spacer() } .foregroundColor(.secondary) diff --git a/damus/Views/Settings/AppearanceSettingsView.swift b/damus/Views/Settings/AppearanceSettingsView.swift @@ -54,7 +54,7 @@ struct AppearanceSettingsView: View { } // MARK: - Text Truncation - Section(header: Text(NSLocalizedString("Text Truncation", comment: "Section header for damus text truncation user configuration"))) { + Section(header: Text("Text Truncation", comment: "Section header for damus text truncation user configuration")) { Toggle(NSLocalizedString("Truncate timeline text", comment: "Setting to truncate text in timeline"), isOn: $settings.truncate_timeline_text) .toggleStyle(.switch) Toggle(NSLocalizedString("Truncate notification mention text", comment: "Setting to truncate text in mention notifications"), isOn: $settings.truncate_mention_text) @@ -70,7 +70,7 @@ struct AppearanceSettingsView: View { } // MARK: - Accessibility - Section(header: Text(NSLocalizedString("Accessibility", comment: "Section header for accessibility settings"))) { + Section(header: Text("Accessibility", comment: "Section header for accessibility settings")) { Toggle(NSLocalizedString("Left Handed", comment: "Moves the post button to the left side of the screen"), isOn: $settings.left_handed) .toggleStyle(.switch) } @@ -97,8 +97,8 @@ struct AppearanceSettingsView: View { // MARK: - Content filters and moderation Section( - header: Text(NSLocalizedString("Content filters", comment: "Section title for content filtering/moderation configuration.")), - footer: Text(NSLocalizedString("Notes with the #nsfw tag usually contains adult content or other \"Not safe for work\" content", comment: "Section footer clarifying what #nsfw (not safe for work) tags mean")) + header: Text("Content filters", comment: "Section title for content filtering/moderation configuration."), + footer: Text("Notes with the #nsfw tag usually contains adult content or other \"Not safe for work\" content", comment: "Section footer clarifying what #nsfw (not safe for work) tags mean") ) { Toggle(NSLocalizedString("Hide notes with #nsfw tags", comment: "Setting to hide notes with the #nsfw (not safe for work) tags"), isOn: $settings.hide_nsfw_tagged_content) .toggleStyle(.switch) @@ -106,8 +106,8 @@ struct AppearanceSettingsView: View { // MARK: - Profiles Section( - header: Text(NSLocalizedString("Profiles", comment: "Section title for profile view configuration.")), - footer: Text(NSLocalizedString("Profile action sheets allow you to follow, zap, or DM profiles more quickly without having to view their full profile", comment: "Section footer clarifying what the profile action sheet feature does")) + header: Text("Profiles", comment: "Section title for profile view configuration."), + footer: Text("Profile action sheets allow you to follow, zap, or DM profiles more quickly without having to view their full profile", comment: "Section footer clarifying what the profile action sheet feature does") ) { Toggle(NSLocalizedString("Show profile action sheets", comment: "Setting to show profile action sheets when clicking on a user's profile picture"), isOn: $settings.show_profile_action_sheet_on_pfp_click) .toggleStyle(.switch) @@ -157,9 +157,9 @@ struct AppearanceSettingsView: View { } } .alert(isPresented: $showing_enable_animation_alert) { - Alert(title: Text(NSLocalizedString("Confirmation", comment: "Confirmation dialog title")), - message: Text(NSLocalizedString("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?", comment: "Message explaining consequences of changing the 'enable animation' setting")), - primaryButton: .default(Text(NSLocalizedString("OK", comment: "Button label indicating user wants to proceed."))) { + Alert(title: Text("Confirmation", comment: "Confirmation dialog title"), + message: Text("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?", comment: "Message explaining consequences of changing the 'enable animation' setting"), + primaryButton: .default(Text("OK", comment: "Button label indicating user wants to proceed.")) { self.clear_cache_button_action() }, secondaryButton: .cancel() { @@ -176,22 +176,22 @@ struct AppearanceSettingsView: View { HStack(spacing: 6) { switch cache_clearing_state { case .not_cleared: - Text(NSLocalizedString("Clear Cache", comment: "Button to clear image cache.")) + Text("Clear Cache", comment: "Button to clear image cache.") case .clearing: ProgressView() - Text(NSLocalizedString("Clearing Cache", comment: "Loading message indicating that the cache is being cleared.")) + Text("Clearing Cache", comment: "Loading message indicating that the cache is being cleared.") case .cleared: Image(systemName: "checkmark.circle.fill") .foregroundColor(.green) - Text(NSLocalizedString("Cache has been cleared", comment: "Message indicating that the cache was successfully cleared.")) + Text("Cache has been cleared", comment: "Message indicating that the cache was successfully cleared.") } } }) .disabled(self.cache_clearing_state != .not_cleared) .alert(isPresented: $showing_cache_clear_alert) { - Alert(title: Text(NSLocalizedString("Confirmation", comment: "Confirmation dialog title")), - message: Text(NSLocalizedString("Are you sure you want to clear the cache? This will free space, but images may take longer to load again.", comment: "Message explaining what it means to clear the cache, asking if user wants to proceed.")), - primaryButton: .default(Text(NSLocalizedString("OK", comment: "Button label indicating user wants to proceed."))) { + Alert(title: Text("Confirmation", comment: "Confirmation dialog title"), + message: Text("Are you sure you want to clear the cache? This will free space, but images may take longer to load again.", comment: "Message explaining what it means to clear the cache, asking if user wants to proceed."), + primaryButton: .default(Text("OK", comment: "Button label indicating user wants to proceed.")) { self.clear_cache_button_action() }, secondaryButton: .cancel()) diff --git a/damus/Views/Settings/DeveloperSettingsView.swift b/damus/Views/Settings/DeveloperSettingsView.swift @@ -13,7 +13,7 @@ struct DeveloperSettingsView: View { var body: some View { Form { - Section(footer: Text(NSLocalizedString("Developer Mode enables features and options that may help developers diagnose issues and improve this app. Most users will not need Developer Mode.", comment: "Section header for Developer Settings view"))) { + Section(footer: Text("Developer Mode enables features and options that may help developers diagnose issues and improve this app. Most users will not need Developer Mode.", comment: "Section header for Developer Settings view")) { Toggle(NSLocalizedString("Developer Mode", comment: "Setting to enable developer mode"), isOn: $settings.developer_mode) .toggleStyle(.switch) if settings.developer_mode { diff --git a/damus/Views/Settings/NotificationSettingsView.swift b/damus/Views/Settings/NotificationSettingsView.swift @@ -26,7 +26,7 @@ struct NotificationSettingsView: View { var body: some View { Form { - Section(header: Text(NSLocalizedString("Local Notifications", comment: "Section header for damus local notifications user configuration"))) { + 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) .toggleStyle(.switch) Toggle(NSLocalizedString("Mentions", comment: "Setting to enable Mention Local Notification"), isOn: $settings.mention_notification) @@ -39,12 +39,12 @@ struct NotificationSettingsView: View { .toggleStyle(.switch) } - Section(header: Text(NSLocalizedString("Notification Preference", comment: "Section header for Notification Preferences"))) { + 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) .toggleStyle(.switch) } - Section(header: Text(NSLocalizedString("Notification Dots", comment: "Section header for notification indicator dot settings"))) { + Section(header: Text("Notification Dots", comment: "Section header for notification indicator dot settings")) { Toggle(NSLocalizedString("Zaps", comment: "Setting to enable Zap Local Notification"), isOn: indicator_binding(.zaps)) .toggleStyle(.switch) Toggle(NSLocalizedString("Mentions", comment: "Setting to enable Mention Local Notification"), isOn: indicator_binding(.mentions)) diff --git a/damus/Views/Settings/ReactionsSettingsView.swift b/damus/Views/Settings/ReactionsSettingsView.swift @@ -26,7 +26,7 @@ struct ReactionsSettingsView: View { isReactionsVisible = true } } header: { - Text(NSLocalizedString("Select default emoji", comment: "Prompt selection of user's default emoji reaction")) + Text("Select default emoji", comment: "Prompt selection of user's default emoji reaction") } } .navigationTitle(NSLocalizedString("Reactions", comment: "Title of emoji reactions view")) diff --git a/damus/Views/Settings/SearchSettingsView.swift b/damus/Views/Settings/SearchSettingsView.swift @@ -13,7 +13,7 @@ struct SearchSettingsView: View { var body: some View { Form { - Section(header: Text(NSLocalizedString("Spam", comment: "Section header for Universe/Search spam"))) { + Section(header: Text("Spam", comment: "Section header for Universe/Search spam")) { Toggle(NSLocalizedString("View multiple events per user", comment: "Setting to only see 1 event per user (npub) in the search/universe"), isOn: $settings.multiple_events_per_pubkey) .toggleStyle(.switch) } diff --git a/damus/Views/Settings/TranslationSettingsView.swift b/damus/Views/Settings/TranslationSettingsView.swift @@ -28,7 +28,7 @@ struct TranslationSettingsView: View { if settings.translation_service == .purple && damus_state.purple.enable_purple { NavigationLink(destination: DamusPurpleView(damus_state: damus_state)) { - Text(NSLocalizedString("Configure Damus Purple", comment: "Button to allow Damus Purple to be configured")) + Text("Configure Damus Purple", comment: "Button to allow Damus Purple to be configured") } } diff --git a/damus/Views/Settings/ZapSettingsView.swift b/damus/Views/Settings/ZapSettingsView.swift @@ -22,8 +22,8 @@ struct ZapSettingsView: View { var body: some View { Form { Section( - header: Text(NSLocalizedString("OnlyZaps", comment: "Section header for enabling OnlyZaps mode (hide reactions)")), - footer: Text(NSLocalizedString("Hide all 🤙's", comment: "Section footer describing OnlyZaps mode")) + header: Text("OnlyZaps", comment: "Section header for enabling OnlyZaps mode (hide reactions)"), + footer: Text("Hide all 🤙's", comment: "Section footer describing OnlyZaps mode") ) { Toggle(NSLocalizedString("OnlyZaps mode", comment: "Setting toggle to hide reactions."), isOn: $settings.onlyzaps_mode) diff --git a/damus/Views/SuggestedHashtagsView.swift b/damus/Views/SuggestedHashtagsView.swift @@ -57,7 +57,7 @@ struct SuggestedHashtagsView: View { VStack { HStack { Image(systemName: "sparkles") - Text(NSLocalizedString("Suggested hashtags", comment: "A label indicating that the items below it are suggested hashtags")) + Text("Suggested hashtags", comment: "A label indicating that the items below it are suggested hashtags") Spacer() Button(action: { withAnimation(.easeOut(duration: 0.2)) { @@ -105,7 +105,8 @@ struct SuggestedHashtagsView: View { Text(verbatim: "#\(hashtag)") .bold() - Text(pluralizedString(key: "users_talking_about_it", count: self.count)) + let pluralizedString = pluralizedString(key: "users_talking_about_it", count: self.count) + Text(pluralizedString) .foregroundStyle(.secondary) } diff --git a/damus/Views/Wallet/ConnectWalletView.swift b/damus/Views/Wallet/ConnectWalletView.swift @@ -39,9 +39,9 @@ struct ConnectWalletView: View { } .alert(isPresented: $showAlert) { Alert( - title: Text(NSLocalizedString("Invalid Nostr wallet connection string", comment: "Error message when an invalid Nostr wallet connection string is provided.")), - message: Text("Make sure the wallet you are connecting to supports NWC."), - dismissButton: .default(Text(NSLocalizedString("OK", comment: "Button label indicating user wants to proceed."))) { + title: Text("Invalid Nostr wallet connection string", comment: "Error message when an invalid Nostr wallet connection string is provided."), + message: Text("Make sure the wallet you are connecting to supports NWC.", comment: "Hint message when an invalid Nostr wallet connection string is provided."), + dismissButton: .default(Text("OK", comment: "Button label indicating user wants to proceed.")) { wallet_scan_result = .scanning } ) @@ -80,7 +80,7 @@ struct ConnectWalletView: View { model.cancel() }) { HStack { - Text(NSLocalizedString("Cancel", comment: "Text for button to cancel out of connecting Nostr Wallet Connect lightning wallet.")) + Text("Cancel", comment: "Text for button to cancel out of connecting Nostr Wallet Connect lightning wallet.") .padding() } .frame(minWidth: 300, maxWidth: .infinity, alignment: .center) @@ -175,10 +175,10 @@ struct ConnectWalletView: View { var TitleSection: some View { VStack(spacing: 25) { - Text("Damus Wallet") + Text("Damus Wallet", comment: "Title text for Damus Wallet view.") .fontWeight(.bold) - Text("Securely connect your Damus app to your wallet\nusing Nostr Wallet Connect") + Text("Securely connect your Damus app to your wallet using Nostr\u{00A0}Wallet\u{00A0}Connect", comment: "Text to prompt user to connect their wallet using 'Nostr Wallet Connect'.") .font(.caption) .multilineTextAlignment(.center) } diff --git a/damus/Views/Wallet/WalletView.swift b/damus/Views/Wallet/WalletView.swift @@ -28,7 +28,7 @@ struct WalletView: View { VStack(spacing: 5) { VStack(spacing: 10) { - Text("Wallet Relay") + Text("Wallet Relay", comment: "Label text indicating that below it is the information about the wallet relay.") .fontWeight(.semibold) .padding(.top) @@ -47,12 +47,12 @@ struct WalletView: View { if let lud16 = nwc.lud16 { VStack(spacing: 10) { - Text("Wallet Address") + Text("Wallet Address", comment: "Label text indicating that below it is the wallet address.") .fontWeight(.semibold) Divider() - Text(verbatim: lud16) + Text(lud16) } .frame(maxWidth: .infinity, minHeight: 75, alignment: .center) .padding(.horizontal, 10) @@ -69,7 +69,7 @@ struct WalletView: View { self.model.disconnect() }) { HStack { - Text(NSLocalizedString("Disconnect Wallet", comment: "Text for button to disconnect from Nostr Wallet Connect lightning wallet.")) + Text("Disconnect Wallet", comment: "Text for button to disconnect from Nostr Wallet Connect lightning wallet.") } .frame(minWidth: 300, maxWidth: .infinity, maxHeight: 18, alignment: .center) } diff --git a/damus/Views/Zaps/CustomizeZapView.swift b/damus/Views/Zaps/CustomizeZapView.swift @@ -173,7 +173,7 @@ struct CustomizeZapView: View { model.zapping = true }) { HStack { - Text(NSLocalizedString("Zap User", comment: "Button to send a zap.")) + Text("Zap User", comment: "Button to send a zap.") .font(.system(size: 20, weight: .bold)) } .frame(minWidth: 300, maxWidth: .infinity, alignment: .center) diff --git a/damus/de.lproj/Localizable.strings b/damus/de.lproj/Localizable.strings Binary files differ. diff --git a/damus/de.lproj/Localizable.stringsdict b/damus/de.lproj/Localizable.stringsdict @@ -226,6 +226,22 @@ <string>geteilte Beiträge</string> </dict> </dict> + <key>quoted_reposts_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@QUOTE_REPOSTS@</string> + <key>QUOTE_REPOSTS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Zitate</string> + <key>other</key> + <string>Zitat</string> + </dict> + </dict> <key>sats</key> <dict> <key>NSStringLocalizedFormatKey</key> diff --git a/damus/en-US.xcloc/Localized Contents/en-US.xliff b/damus/en-US.xcloc/Localized Contents/en-US.xliff @@ -2,7 +2,7 @@ <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd"> <file original="damus/en-US.lproj/InfoPlist.strings" source-language="en-US" target-language="en-US" datatype="plaintext"> <header> - <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.2" build-num="15C500b"/> + <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.3" build-num="15E204a"/> </header> <body> <trans-unit id="CFBundleDisplayName" xml:space="preserve"> @@ -44,15 +44,25 @@ </file> <file original="damus/en-US.lproj/Localizable.strings" source-language="en-US" target-language="en-US" datatype="plaintext"> <header> - <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.2" build-num="15C500b"/> + <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.3" build-num="15E204a"/> </header> <body> <trans-unit id="%@ %@" xml:space="preserve"> <source>%@ %@</source> <target>%@ %@</target> - <note>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'. + <note>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'. Sentence composed of 2 variables to describe how many imports were performed from loading a NostrScript. In source English, the first variable is the number of imports, and the second variable is 'Import' or 'Imports'. -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'.</note> +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'.</note> + </trans-unit> + <trans-unit id="%@ / %@" xml:space="preserve"> + <source>%@ / %@</source> + <target>%@ / %@</target> + <note>Amount of money required to subscribe to the Nostr relay. In English, this would look something like '4,000 sats / 30 days', meaning it costs 4000 sats to subscribe to the Nostr relay for 30 days.</note> + </trans-unit> + <trans-unit id="%@ / event" xml:space="preserve"> + <source>%@ / event</source> + <target>%@ / event</target> + <note>Amount of money required to publish to the Nostr relay. In English, this would look something like '10 sats / event', meaning it costs 10 sats to publish one event.</note> </trans-unit> <trans-unit id="%@ has been muted" xml:space="preserve"> <source>%@ has been muted</source> @@ -104,6 +114,26 @@ Sentence composed of 2 variables to describe how many reposts. In source English <target>(Contents are encrypted)</target> <note>Label on push notification indicating that the contents of the message are encrypted</note> </trans-unit> + <trans-unit id="1 month" xml:space="preserve"> + <source>1 month</source> + <target>1 month</target> + <note>A duration of 1 month to be shown to the user. Most likely in the context of how long they want to mute a piece of content for.</note> + </trans-unit> + <trans-unit id="1 week" xml:space="preserve"> + <source>1 week</source> + <target>1 week</target> + <note>A duration of 1 week to be shown to the user. Most likely in the context of how long they want to mute a piece of content for.</note> + </trans-unit> + <trans-unit id="24 hours" xml:space="preserve"> + <source>24 hours</source> + <target>24 hours</target> + <note>A duration of 24 hours/1 day to be shown to the user. Most likely in the context of how long they want to mute a piece of content for.</note> + </trans-unit> + <trans-unit id="ADMIN" xml:space="preserve"> + <source>ADMIN</source> + <target>ADMIN</target> + <note>Text label indicating the profile picture underneath it is the admin of the Nostr relay.</note> + </trans-unit> <trans-unit id="API Key (optional)" xml:space="preserve"> <source>API Key (optional)</source> <target>API Key (optional)</target> @@ -152,19 +182,13 @@ Sentence composed of 2 variables to describe how many reposts. In source English <trans-unit id="Add" xml:space="preserve"> <source>Add</source> <target>Add</target> - <note>Button to add relay server to list. - Button to confirm adding user inputted emoji.</note> + <note>Button to add relay server to list.</note> </trans-unit> <trans-unit id="Add Bookmark" xml:space="preserve"> <source>Add Bookmark</source> <target>Add Bookmark</target> <note>Button text to add bookmark to a note.</note> </trans-unit> - <trans-unit id="Add Emoji" xml:space="preserve"> - <source>Add Emoji</source> - <target>Add Emoji</target> - <note>Label for section for adding an emoji to the reactions list.</note> - </trans-unit> <trans-unit id="Add all" xml:space="preserve"> <source>Add all</source> <target>Add all</target> @@ -180,26 +204,32 @@ Sentence composed of 2 variables to describe how many reposts. In source English <target>Add bookmark</target> <note>Context menu option for adding a note bookmark.</note> </trans-unit> + <trans-unit id="Add mute item" xml:space="preserve"> + <source>Add mute item</source> + <target>Add mute item</target> + <note>Title text to indicate user to an add an item to their mutelist.</note> + </trans-unit> <trans-unit id="Add relay" xml:space="preserve"> <source>Add relay</source> <target>Add relay</target> - <note>Title text to indicate user to an add a relay.</note> + <note>Title text to indicate user to an add a relay. +Button text to add a relay</note> </trans-unit> <trans-unit id="Add your first post" xml:space="preserve"> <source>Add your first post</source> <target>Add your first post</target> <note>Prompt given to the user during onboarding, suggesting them to write their first post</note> </trans-unit> + <trans-unit id="Added" xml:space="preserve"> + <source>Added</source> + <target>Added</target> + <note>Button to show relay server is already added to list.</note> + </trans-unit> <trans-unit id="Additional information" xml:space="preserve"> <source>Additional information</source> <target>Additional information</target> <note>Header text to prompt user to optionally provide additional information when reporting a user or note.</note> </trans-unit> - <trans-unit id="Admin" xml:space="preserve"> - <source>Admin</source> - <target>Admin</target> - <note>Label to display relay contact user.</note> - </trans-unit> <trans-unit id="All" xml:space="preserve"> <source>All</source> <target>All</target> @@ -262,16 +292,16 @@ Sentence composed of 2 variables to describe how many reposts. In source English <target>Are you lost?</target> <note>Text asking the user if they are lost in the app.</note> </trans-unit> - <trans-unit id="Are you sure you want to attach this wallet?" xml:space="preserve"> - <source>Are you sure you want to attach this wallet?</source> - <target>Are you sure you want to attach this wallet?</target> - <note>Prompt to ask user if they want to attach their Nostr Wallet Connect lightning wallet.</note> - </trans-unit> <trans-unit id="Are you sure you want to clear the cache? This will free space, but images may take longer to load again." xml:space="preserve"> <source>Are you sure you want to clear the cache? This will free space, but images may take longer to load again.</source> <target>Are you sure you want to clear the cache? This will free space, but images may take longer to load again.</target> <note>Message explaining what it means to clear the cache, asking if user wants to proceed.</note> </trans-unit> + <trans-unit id="Are you sure you want to connect this wallet?" xml:space="preserve"> + <source>Are you sure you want to connect this wallet?</source> + <target>Are you sure you want to connect this wallet?</target> + <note>Prompt to ask user if they want to attach their Nostr Wallet Connect lightning wallet.</note> + </trans-unit> <trans-unit id="Are you sure you want to delete all of your bookmarks?" xml:space="preserve"> <source>Are you sure you want to delete all of your bookmarks?</source> <target>Are you sure you want to delete all of your bookmarks?</target> @@ -296,36 +326,11 @@ Tip: You can always change this later in Settings → Translations</source> Tip: You can always change this later in Settings → Translations</target> <note>Message notifying the user that they get auto-translations as part of their service</note> </trans-unit> - <trans-unit id="Attach" xml:space="preserve"> - <source>Attach</source> - <target>Attach</target> - <note>Text for button to attach Nostr Wallet Connect lightning wallet.</note> - </trans-unit> - <trans-unit id="Attach Alby Wallet" xml:space="preserve"> - <source>Attach Alby Wallet</source> - <target>Attach Alby Wallet</target> - <note>Button to attach an Alby Wallet, a service that provides a Lightning wallet for zapping sats. Alby is the name of the service and should not be translated.</note> - </trans-unit> - <trans-unit id="Attach Wallet" xml:space="preserve"> - <source>Attach Wallet</source> - <target>Attach Wallet</target> - <note>Text for button to attach Nostr Wallet Connect lightning wallet.</note> - </trans-unit> - <trans-unit id="Attach a Wallet" xml:space="preserve"> - <source>Attach a Wallet</source> - <target>Attach a Wallet</target> - <note>Navigation title for attaching Nostr Wallet Connect lightning wallet.</note> - </trans-unit> <trans-unit id="Authenticated" xml:space="preserve"> <source>Authenticated</source> <target>Authenticated</target> <note>Label to display that authentication to a server has succeeded.</note> </trans-unit> - <trans-unit id="Authentication" xml:space="preserve"> - <source>Authentication</source> - <target>Authentication</target> - <note>Header label to display authentication details for a given relay.</note> - </trans-unit> <trans-unit id="Automatic translations" xml:space="preserve"> <source>Automatic translations</source> <target>Automatic translations</target> @@ -383,6 +388,16 @@ Tip: You can always change this later in Settings → Translations</target> <target>By signing up, you agree to our </target> <note>Ask the user if they already have an account on Nostr</note> </trans-unit> + <trans-unit id="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/)" xml:space="preserve"> + <source>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/)</source> + <target>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/)</target> + <note>Text explaining the terms and conditions of subscribing to Damus Purple. EULA stands for End User License Agreement.</note> + </trans-unit> + <trans-unit id="CONTACT" xml:space="preserve"> + <source>CONTACT</source> + <target>CONTACT</target> + <note>Text label indicating that the information below is the contact information of the admin of the Nostr relay.</note> + </trans-unit> <trans-unit id="Cache has been cleared" xml:space="preserve"> <source>Cache has been cleared</source> <target>Cache has been cleared</target> @@ -395,13 +410,10 @@ Tip: You can always change this later in Settings → Translations</target> Button to cancel a repost. Button to cancel any interaction with the QRCode link. Button to cancel out of alert that creates a new mutelist. - Button to cancel out of posting a note. - Button to cancel out of view adding user inputted emoji. Button to cancel the upload. Cancel deleting bookmarks. Cancel deleting the user. - Cancel out of logging out the user. - Text for button to cancel out of connecting Nostr Wallet Connect lightning ewallet.</note> + Cancel out of logging out the user.</note> </trans-unit> <trans-unit id="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?" xml:space="preserve"> <source>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?</source> @@ -453,21 +465,27 @@ Tip: You can always change this later in Settings → Translations</target> <target>Confirmation</target> <note>Confirmation dialog title</note> </trans-unit> - <trans-unit id="Connect To Relay" xml:space="preserve"> - <source>Connect To Relay</source> - <target>Connect To Relay</target> - <note>Button to connect to the relay.</note> + <trans-unit id="Connect" xml:space="preserve"> + <source>Connect</source> + <target>Connect</target> + <note>Text for button to conect to Nostr Wallet Connect lightning wallet. +Button to connect to the relay.</note> + </trans-unit> + <trans-unit id="Connect to Alby Wallet" xml:space="preserve"> + <source>Connect to Alby Wallet</source> + <target>Connect to Alby Wallet</target> + <note>Button to attach an Alby Wallet, a service that provides a Lightning wallet for zapping sats. Alby is the name of the service and should not be translated.</note> + </trans-unit> + <trans-unit id="Connect to Mutiny Wallet" xml:space="preserve"> + <source>Connect to Mutiny Wallet</source> + <target>Connect to Mutiny Wallet</target> + <note>Button to attach an Mutiny Wallet, a service that provides a Lightning wallet for zapping sats. Mutiny is the name of the service and should not be translated.</note> </trans-unit> <trans-unit id="Connecting" xml:space="preserve"> <source>Connecting</source> <target>Connecting</target> <note>Relay status label that indicates a relay is connecting.</note> </trans-unit> - <trans-unit id="Contact" xml:space="preserve"> - <source>Contact</source> - <target>Contact</target> - <note>Label to display relay contact information.</note> - </trans-unit> <trans-unit id="Content filters" xml:space="preserve"> <source>Content filters</source> <target>Content filters</target> @@ -476,10 +494,8 @@ Tip: You can always change this later in Settings → Translations</target> <trans-unit id="Continue" xml:space="preserve"> <source>Continue</source> <target>Continue</target> - <note>Button to dismiss suggested users view and continue to the main app - Continue with bookmarks. - Continue with deleting the user. - Prompt to user to continue</note> + <note>Continue with bookmarks. + Continue with deleting the user.</note> </trans-unit> <trans-unit id="Copied" xml:space="preserve"> <source>Copied</source> @@ -490,7 +506,6 @@ Tip: You can always change this later in Settings → Translations</target> <source>Copy</source> <target>Copy</target> <note>Button to copy a relay server address. - Button to copy an emoji reaction Button to copy the value found. Context menu option for copying the version of damus.</note> </trans-unit> @@ -597,6 +612,11 @@ Tip: You can always change this later in Settings → Translations</target> Setting to enable DM Local Notification Toolbar label for DMs view, where DM is the English abbreviation for Direct Message.</note> </trans-unit> + <trans-unit id="Damus" xml:space="preserve"> + <source>Damus</source> + <target>Damus</target> + <note>Name of the app for the title of an internal notification</note> + </trans-unit> <trans-unit id="Damus Purple" xml:space="preserve"> <source>Damus Purple</source> <target>Damus Purple</target> @@ -607,6 +627,11 @@ Tip: You can always change this later in Settings → Translations</target> <target>Damus Purple environment</target> <note>Prompt selection of the Damus purple environment (Developer feature to switch between real/production mode to test modes).</note> </trans-unit> + <trans-unit id="Damus Wallet" xml:space="preserve"> + <source>Damus Wallet</source> + <target>Damus Wallet</target> + <note>Title text for Damus Wallet view.</note> + </trans-unit> <trans-unit id="DeepL (Proprietary, Higher Accuracy)" xml:space="preserve"> <source>DeepL (Proprietary, Higher Accuracy)</source> <target>DeepL (Proprietary, Higher Accuracy)</target> @@ -636,7 +661,7 @@ Tip: You can always change this later in Settings → Translations</target> <trans-unit id="Description" xml:space="preserve"> <source>Description</source> <target>Description</target> - <note>Label to display relay description.</note> + <note>Description of the specific Nostr relay server.</note> </trans-unit> <trans-unit id="Developer" xml:space="preserve"> <source>Developer</source> @@ -657,12 +682,8 @@ Tip: You can always change this later in Settings → Translations</target> <trans-unit id="Disconnect" xml:space="preserve"> <source>Disconnect</source> <target>Disconnect</target> - <note>Button to disconnect from a relay server.</note> - </trans-unit> - <trans-unit id="Disconnect From Relay" xml:space="preserve"> - <source>Disconnect From Relay</source> - <target>Disconnect From Relay</target> - <note>Button to disconnect from the relay.</note> + <note>Button to disconnect from the relay. +Button to disconnect from a relay server.</note> </trans-unit> <trans-unit id="Disconnect Wallet" xml:space="preserve"> <source>Disconnect Wallet</source> @@ -709,11 +730,6 @@ Tip: You can always change this later in Settings → Translations</target> <target>Edit</target> <note>Button to edit user's profile.</note> </trans-unit> - <trans-unit id="Emoji Reactions" xml:space="preserve"> - <source>Emoji Reactions</source> - <target>Emoji Reactions</target> - <note>Section title for emoji reactions that are currently added.</note> - </trans-unit> <trans-unit id="Enable Purple auto-translations" xml:space="preserve"> <source>Enable Purple auto-translations</source> <target>Enable Purple auto-translations</target> @@ -747,13 +763,19 @@ Tip: You can always change this later in Settings → Translations</target> <trans-unit id="Error" xml:space="preserve"> <source>Error</source> <target>Error</target> - <note>Label to display that authentication to a server has failed.</note> + <note>Label to display that authentication to a server has failed. +Relay status label that indicates a relay had an error when connecting</note> </trans-unit> <trans-unit id="Error fetching lightning invoice" xml:space="preserve"> <source>Error fetching lightning invoice</source> <target>Error fetching lightning invoice</target> <note>Message to display when there was an error fetching a lightning invoice while attempting to zap.</note> </trans-unit> + <trans-unit id="Error retrieving muted event" xml:space="preserve"> + <source>Error retrieving muted event</source> + <target>Error retrieving muted event</target> + <note>Text for an item that application failed to retrieve the muted event for.</note> + </trans-unit> <trans-unit id="Error: %@" xml:space="preserve"> <source>Error: %@</source> <target>Error: %@</target> @@ -904,7 +926,7 @@ My side interests include languages and I am striving to be a #polyglot - I am a <trans-unit id="Hashtags" xml:space="preserve"> <source>Hashtags</source> <target>Hashtags</target> - <note>Label for filter for seeing only hashtag follows.</note> + <note>Section header title for a list of hashtags that are muted.</note> </trans-unit> <trans-unit id="Hello everybody! This is my first post on Damus, I am happy to meet you all 🤙. What’s up? #introductions" xml:space="preserve"> <source>Hello everybody! @@ -937,7 +959,7 @@ This is my first post on Damus, I am happy to meet you all 🤙. What’s up? <trans-unit id="Hide" xml:space="preserve"> <source>Hide</source> <target>Hide</target> - <note>Button to hide a note from a user who has been muted.</note> + <note>Button to hide a note which has been muted.</note> </trans-unit> <trans-unit id="Hide all 🤙's" xml:space="preserve"> <source>Hide all 🤙's</source> @@ -983,6 +1005,16 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <target>Impersonation</target> <note>Description of report type for impersonation.</note> </trans-unit> + <trans-unit id="Indefinite" xml:space="preserve"> + <source>Indefinite</source> + <target>Indefinite</target> + <note>Mute a given item indefinitly (until user unmutes it). As opposed to muting the item for a given period of time.</note> + </trans-unit> + <trans-unit id="Internal app notification" xml:space="preserve"> + <source>Internal app notification</source> + <target>Internal app notification</target> + <note>Badge indicating that a notification is an official internal app notification</note> + </trans-unit> <trans-unit id="Invalid Nostr wallet connection string" xml:space="preserve"> <source>Invalid Nostr wallet connection string</source> <target>Invalid Nostr wallet connection string</target> @@ -1089,11 +1121,6 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <target>Local default</target> <note>Dropdown option label for system default for Lightning wallet.</note> </trans-unit> - <trans-unit id="Log" xml:space="preserve"> - <source>Log</source> - <target>Log</target> - <note>Label to display developer mode logs.</note> - </trans-unit> <trans-unit id="Login" xml:space="preserve"> <source>Login</source> <target>Login</target> @@ -1115,6 +1142,11 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <target>Make Default</target> <note>Button label to indicate that tapping it will make the selected zap type be the default for future zaps.</note> </trans-unit> + <trans-unit id="Make sure the wallet you are connecting to supports NWC." xml:space="preserve"> + <source>Make sure the wallet you are connecting to supports NWC.</source> + <target>Make sure the wallet you are connecting to supports NWC.</target> + <note>Hint message when an invalid Nostr wallet connection string is provided.</note> + </trans-unit> <trans-unit id="Make sure your nsec account key is saved before you logout or you will lose access to this account" xml:space="preserve"> <source>Make sure your nsec account key is saved before you logout or you will lose access to this account</source> <target>Make sure your nsec account key is saved before you logout or you will lose access to this account</target> @@ -1125,6 +1157,11 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <target>Manage</target> <note>Manage the damus subscription</note> </trans-unit> + <trans-unit id="Manage subscription" xml:space="preserve"> + <source>Manage subscription</source> + <target>Manage subscription</target> + <note>Button to take user to manage Damus Purple subscription</note> + </trans-unit> <trans-unit id="Media previews" xml:space="preserve"> <source>Media previews</source> <target>Media previews</target> @@ -1158,14 +1195,18 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <trans-unit id="Mute" xml:space="preserve"> <source>Mute</source> <target>Mute</target> - <note>Alert button to mute a user. - Button to mute a profile.</note> + <note>Alert button to mute a user.</note> </trans-unit> <trans-unit id="Mute %@?" xml:space="preserve"> <source>Mute %@?</source> <target>Mute %@?</target> <note>Alert message prompt to ask if a user should be muted.</note> </trans-unit> + <trans-unit id="Mute Hashtag" xml:space="preserve"> + <source>Mute Hashtag</source> + <target>Mute Hashtag</target> + <note>Label represnting a button that the user can tap to mute a given hashtag so they don't see it in their feed anymore.</note> + </trans-unit> <trans-unit id="Mute User" xml:space="preserve"> <source>Mute User</source> <target>Mute User</target> @@ -1184,17 +1225,15 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <trans-unit id="Muted" xml:space="preserve"> <source>Muted</source> <target>Muted</target> - <note>Sidebar menu label for muted users view.</note> - </trans-unit> - <trans-unit id="Muted Users" xml:space="preserve"> - <source>Muted Users</source> - <target>Muted Users</target> - <note>Navigation title of view to see list of muted users.</note> + <note>Navigation title of view to see list of muted users & phrases. + Sidebar menu label for muted users view.</note> </trans-unit> - <trans-unit id="My Relays" xml:space="preserve"> - <source>My Relays</source> - <target>My Relays</target> - <note>Section title for relay servers that the user is connected to.</note> + <trans-unit id="N/A" xml:space="preserve"> + <source>N/A</source> + <target>N/A</target> + <note>Text label indicating that there is no NIP-11 relay admin contact information found. In English, N/A stands for not applicable. +Text label indicating that there is no NIP-11 relay description information found. In English, N/A stands for not applicable. +Text label indicating that there is no NIP-11 relay software information found. In English, N/A stands for not applicable.</note> </trans-unit> <trans-unit id="Never" xml:space="preserve"> <source>Never</source> @@ -1226,11 +1265,6 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <target>No</target> <note>User confirm No</note> </trans-unit> - <trans-unit id="No data available" xml:space="preserve"> - <source>No data available</source> - <target>No data available</target> - <note>Text indicating that there is no data available to show for specific metadata about a relay server.</note> - </trans-unit> <trans-unit id="No logs to display" xml:space="preserve"> <source>No logs to display</source> <target>No logs to display</target> @@ -1291,21 +1325,28 @@ Hope to meet folks who are on their own journeys to a peaceful and free life!</t <target>NostrScript Error</target> <note>Text indicating that there was an error with loading NostrScript. There is a more descriptive error message shown separately underneath.</note> </trans-unit> - <trans-unit id="Note from a user you've muted" xml:space="preserve"> - <source>Note from a user you've muted</source> - <target>Note from a user you've muted</target> - <note>Text to indicate that what is being shown is a note from a user who has been muted.</note> + <trans-unit id="Note from a %@ you've muted" xml:space="preserve"> + <source>Note from a %@ you've muted</source> + <target>Note from a %@ you've muted</target> + <note>Text to indicate that what is being shown is a note which has been muted.</note> + </trans-unit> + <trans-unit id="Note you've muted" xml:space="preserve"> + <source>Note you've muted</source> + <target>Note you've muted</target> + <note>Text to indicate that what is being shown is a note which has been muted.</note> </trans-unit> <trans-unit id="Notes" xml:space="preserve"> <source>Notes</source> <target>Notes</target> - <note>A label indicating that the notes being displayed below it are from a timeline, not search results</note> + <note>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</note> </trans-unit> <trans-unit id="Notes & Replies" xml:space="preserve"> <source>Notes & Replies</source> <target>Notes & Replies</target> - <note>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).</note> + <note>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).</note> </trans-unit> <trans-unit id="Notes with the #nsfw tag usually contains adult content or other "Not safe for work" content" xml:space="preserve"> <source>Notes with the #nsfw tag usually contains adult content or other "Not safe for work" content</source> @@ -1342,7 +1383,7 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <source>OK</source> <target>OK</target> <note>Button label indicating user wants to proceed. - Button label to dismiss an error dialog</note> +Button label to dismiss an error dialog</note> </trans-unit> <trans-unit id="Ok" xml:space="preserve"> <source>Ok</source> @@ -1392,12 +1433,12 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <trans-unit id="Paid Relay" xml:space="preserve"> <source>Paid Relay</source> <target>Paid Relay</target> - <note>Section header that indicates the relay server requires payment.</note> + <note>Text indicating that this is a paid relay.</note> </trans-unit> - <trans-unit id="Paste" xml:space="preserve"> - <source>Paste</source> - <target>Paste</target> - <note>Button to paste a Nostr Wallet Connect string to connect the wallet for use in Damus for zaps.</note> + <trans-unit id="Paste NWC Address" xml:space="preserve"> + <source>Paste NWC Address</source> + <target>Paste NWC Address</target> + <note>Text for button to connect a lightning wallet.</note> </trans-unit> <trans-unit id="Pay" xml:space="preserve"> <source>Pay</source> @@ -1422,8 +1463,7 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <trans-unit id="Permanently Delete Account" xml:space="preserve"> <source>Permanently Delete Account</source> <target>Permanently Delete Account</target> - <note>Alert for deleting the users account. - Section title for deleting the user</note> + <note>Alert for deleting the users account.</note> </trans-unit> <trans-unit id="Plan" xml:space="preserve"> <source>Plan</source> @@ -1520,6 +1560,11 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Purchased!</target> <note>User purchased a subscription</note> </trans-unit> + <trans-unit id="Purchasing" xml:space="preserve"> + <source>Purchasing</source> + <target>Purchasing</target> + <note>Loading label indicating the purchase action is in progress</note> + </trans-unit> <trans-unit id="Purple" xml:space="preserve"> <source>Purple</source> <target>Purple</target> @@ -1535,6 +1580,11 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Quote</target> <note>Button to compose a quoted note</note> </trans-unit> + <trans-unit id="Quotes" xml:space="preserve"> + <source>Quotes</source> + <target>Quotes</target> + <note>Navigation bar title for Quote Reposts view.</note> + </trans-unit> <trans-unit id="Ran to suspension." xml:space="preserve"> <source>Ran to suspension.</source> <target>Ran to suspension.</target> @@ -1547,20 +1597,10 @@ Label for filter for seeing notes and replies (instead of only notes).</note> Section header for reactions settings Title of emoji reactions view</note> </trans-unit> - <trans-unit id="Recommended Emojis" xml:space="preserve"> - <source>Recommended Emojis</source> - <target>Recommended Emojis</target> - <note>Section title for recommend emojis</note> - </trans-unit> - <trans-unit id="Recommended relays" xml:space="preserve"> - <source>Recommended relays</source> - <target>Recommended relays</target> - <note>Title for view of recommended relays.</note> - </trans-unit> - <trans-unit id="Relay" xml:space="preserve"> - <source>Relay</source> - <target>Relay</target> - <note>Label to display relay address.</note> + <trans-unit id="Relay Logs" xml:space="preserve"> + <source>Relay Logs</source> + <target>Relay Logs</target> + <note>Text label indicating that the text below it are developer mode logs.</note> </trans-unit> <trans-unit id="Relays" xml:space="preserve"> <source>Relays</source> @@ -1589,6 +1629,16 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Remove bookmark</target> <note>Context menu option for removing a note bookmark.</note> </trans-unit> + <trans-unit id="Renew (1 mo)" xml:space="preserve"> + <source>Renew (1 mo)</source> + <target>Renew (1 mo)</target> + <note>Button to take user to renew subscription for one month</note> + </trans-unit> + <trans-unit id="Renew (1 yr)" xml:space="preserve"> + <source>Renew (1 yr)</source> + <target>Renew (1 yr)</target> + <note>Button to take user to renew subscription for one year</note> + </trans-unit> <trans-unit id="Renews on" xml:space="preserve"> <source>Renews on</source> <target>Renews on</target> @@ -1692,6 +1742,11 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Runtime error</target> <note>Indication that a runtime error occurred when running a NostrScript.</note> </trans-unit> + <trans-unit id="SOFTWARE" xml:space="preserve"> + <source>SOFTWARE</source> + <target>SOFTWARE</target> + <note>Text label indicating which relay software is used to run this Nostr relay.</note> + </trans-unit> <trans-unit id="Satoshi Nakamoto" xml:space="preserve"> <source>Satoshi Nakamoto</source> <target>Satoshi Nakamoto</target> @@ -1727,6 +1782,11 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Scan Code</target> <note>Button to switch to scan QR Code page.</note> </trans-unit> + <trans-unit id="Scan NWC Address" xml:space="preserve"> + <source>Scan NWC Address</source> + <target>Scan NWC Address</target> + <note>Text for button to connect a lightning wallet.</note> + </trans-unit> <trans-unit id="Scan Your Private Key QR" xml:space="preserve"> <source>Scan Your Private Key QR</source> <target>Scan Your Private Key QR</target> @@ -1774,6 +1834,11 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Secret Account Login Key</target> <note>Section title for user's secret account login key.</note> </trans-unit> + <trans-unit id="Securely connect your Damus app to your wallet using Nostr Wallet Connect" xml:space="preserve"> + <source>Securely connect your Damus app to your wallet using Nostr Wallet Connect</source> + <target>Securely connect your Damus app to your wallet using Nostr Wallet Connect</target> + <note>Text to prompt user to connect their wallet using 'Nostr Wallet Connect'.</note> + </trans-unit> <trans-unit id="Select a Lightning wallet" xml:space="preserve"> <source>Select a Lightning wallet</source> <target>Select a Lightning wallet</target> @@ -1845,7 +1910,7 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <trans-unit id="Show" xml:space="preserve"> <source>Show</source> <target>Show</target> - <note>Button to show a note from a user who has been muted. + <note>Button to show a note which has been muted. Toggle to show or hide user's secret account login key.</note> </trans-unit> <trans-unit id="Show general statuses" xml:space="preserve"> @@ -1884,11 +1949,6 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Show profile action sheets</target> <note>Setting to show profile action sheets when clicking on a user's profile picture</note> </trans-unit> - <trans-unit id="Show recommended relays" xml:space="preserve"> - <source>Show recommended relays</source> - <target>Show recommended relays</target> - <note>Button to show recommended relays.</note> - </trans-unit> <trans-unit id="Show wallet selector" xml:space="preserve"> <source>Show wallet selector</source> <target>Show wallet selector</target> @@ -1919,11 +1979,6 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Social media has developed into a key way information flows around the world. Unfortunately, our current social media systems are broken</target> <note>Description about why Nostr is needed.</note> </trans-unit> - <trans-unit id="Software" xml:space="preserve"> - <source>Software</source> - <target>Software</target> - <note>Label to display relay software.</note> - </trans-unit> <trans-unit id="Someone posted a note" xml:space="preserve"> <source>Someone posted a note</source> <target>Someone posted a note</target> @@ -1947,8 +2002,7 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <trans-unit id="Spam" xml:space="preserve"> <source>Spam</source> <target>Spam</target> - <note>Description of report type for spam. - Section header for Universe/Search spam</note> + <note>Description of report type for spam.</note> </trans-unit> <trans-unit id="Staging" xml:space="preserve"> <source>Staging</source> @@ -2000,23 +2054,23 @@ Label for filter for seeing notes and replies (instead of only notes).</note> <target>Take Photo</target> <note>Option to take a photo with the camera</note> </trans-unit> - <trans-unit id="Test (localhost)" xml:space="preserve"> - <source>Test (localhost)</source> - <target>Test (localhost)</target> - <note>Label indicating a localhost test environment for Damus Purple functionality (Developer feature)</note> + <trans-unit id="Test (local)" xml:space="preserve"> + <source>Test (local)</source> + <target>Test (local)</target> + <note>Label indicating a local test environment for Damus Purple functionality (Developer feature)</note> </trans-unit> <trans-unit id="Text Truncation" xml:space="preserve"> <source>Text Truncation</source> <target>Text Truncation</target> <note>Section header for damus text truncation user configuration</note> </trans-unit> - <trans-unit id="Thank you very much for signing up for Damusu{00A0}Purple. Your contribution helps us continue our fight for a more Open and Freeu{00A0}internet. You will also get access to premium features, and a star badge on your profile. Enjoy!" xml:space="preserve"> - <source>Thank you very much for signing up for Damusu{00A0}Purple. Your contribution helps us continue our fight for a more Open and Freeu{00A0}internet. + <trans-unit id="Thank you very much for signing up for Damus Purple. Your contribution helps us continue our fight for a more Open and Free internet. You will also get access to premium features, and a star badge on your profile. Enjoy!" xml:space="preserve"> + <source>Thank you very much for signing up for Damus Purple. Your contribution helps us continue our fight for a more Open and Free internet. You will also get access to premium features, and a star badge on your profile. Enjoy!</source> - <target>Thank you very much for signing up for Damusu{00A0}Purple. Your contribution helps us continue our fight for a more Open and Freeu{00A0}internet. + <target>Thank you very much for signing up for Damus Purple. Your contribution helps us continue our fight for a more Open and Free internet. You will also get access to premium features, and a star badge on your profile. @@ -2045,15 +2099,20 @@ You're all set!</source> You're all set!</target> <note>An error message that appears when the user attempts to add a relay that has already been added.</note> </trans-unit> + <trans-unit id="There has been an unexpected error with the in-app purchase. Please try again later or contact support@damus.io. Error: %@" xml:space="preserve"> + <source>There has been an unexpected error with the in-app purchase. Please try again later or contact support@damus.io. Error: %@</source> + <target>There has been an unexpected error with the in-app purchase. Please try again later or contact support@damus.io. Error: %@</target> + <note>In-app purchase error message for the user</note> + </trans-unit> <trans-unit id="There was an error loading your account. Please try again later. If problem persists, please contact us at support@damus.io" xml:space="preserve"> <source>There was an error loading your account. Please try again later. If problem persists, please contact us at support@damus.io</source> <target>There was an error loading your account. Please try again later. If problem persists, please contact us at support@damus.io</target> <note>Error label when Purple account information fails to load</note> </trans-unit> - <trans-unit id="This is a paid relay, you must pay for notes to be accepted." xml:space="preserve"> - <source>This is a paid relay, you must pay for notes to be accepted.</source> - <target>This is a paid relay, you must pay for notes to be accepted.</target> - <note>Footer description that explains that the relay server requires payment to post.</note> + <trans-unit id="This device's in-app purchase is registered to a different Nostr account. Unable to manage this Purple account. If you believe this was a mistake, please contact us via support@damus.io." xml:space="preserve"> + <source>This device's in-app purchase is registered to a different Nostr account. Unable to manage this Purple account. If you believe this was a mistake, please contact us via support@damus.io.</source> + <target>This device's in-app purchase is registered to a different Nostr account. Unable to manage this Purple account. If you believe this was a mistake, please contact us via support@damus.io.</target> + <note>Notice label that user cannot manage their In-App purchases</note> </trans-unit> <trans-unit id="This is a public key, you will not be able to make notes or interact in any way. This is used for viewing accounts from their perspective." xml:space="preserve"> <source>This is a public key, you will not be able to make notes or interact in any way. This is used for viewing accounts from their perspective.</source> @@ -2084,6 +2143,11 @@ Nice to meet you all! #introductions #plebchain </target> <target>Thread</target> <note>Navigation bar title for note thread.</note> </trans-unit> + <trans-unit id="Threads" xml:space="preserve"> + <source>Threads</source> + <target>Threads</target> + <note>Section header title for a list of threads that are muted.</note> + </trans-unit> <trans-unit id="To continue your Purple subscription checkout, please verify your npub by clicking on the button below" xml:space="preserve"> <source>To continue your Purple subscription checkout, please verify your npub by clicking on the button below</source> <target>To continue your Purple subscription checkout, please verify your npub by clicking on the button below</target> @@ -2148,7 +2212,8 @@ Nice to meet you all! #introductions #plebchain </target> <trans-unit id="URL" xml:space="preserve"> <source>URL</source> <target>URL</target> - <note>Example URL to LibreTranslate server</note> + <note>Custom URL host for Damus Purple testing + Example URL to LibreTranslate server</note> </trans-unit> <trans-unit id="Unable to find a QR Code" xml:space="preserve"> <source>Unable to find a QR Code</source> @@ -2180,16 +2245,16 @@ Nice to meet you all! #introductions #plebchain </target> <target>Unmute</target> <note>Button to unmute a profile.</note> </trans-unit> + <trans-unit id="Unmute Hashtag" xml:space="preserve"> + <source>Unmute Hashtag</source> + <target>Unmute Hashtag</target> + <note>Label represnting a button that the user can tap to unmute a given hashtag so they start seeing it in their feed again.</note> + </trans-unit> <trans-unit id="Unmute conversation" xml:space="preserve"> <source>Unmute conversation</source> <target>Unmute conversation</target> <note>Context menu option for unmuting a conversation.</note> </trans-unit> - <trans-unit id="Untitled" xml:space="preserve"> - <source>Untitled</source> - <target>Untitled</target> - <note>Text indicating that the long-form note title is untitled.</note> - </trans-unit> <trans-unit id="Upload" xml:space="preserve"> <source>Upload</source> <target>Upload</target> @@ -2215,6 +2280,16 @@ Nice to meet you all! #introductions #plebchain </target> <target>Username</target> <note>Label for Username section of user profile form.</note> </trans-unit> + <trans-unit id="Users" xml:space="preserve"> + <source>Users</source> + <target>Users</target> + <note>Section header title for a list of muted users.</note> + </trans-unit> + <trans-unit id="VERSION" xml:space="preserve"> + <source>VERSION</source> + <target>VERSION</target> + <note>Text label indicating which version of the relay software is being run for this Nostr relay.</note> + </trans-unit> <trans-unit id="Verified!" xml:space="preserve"> <source>Verified!</source> <target>Verified!</target> @@ -2228,8 +2303,7 @@ Nice to meet you all! #introductions #plebchain </target> <trans-unit id="Version" xml:space="preserve"> <source>Version</source> <target>Version</target> - <note>Label to display relay software version. - Section title for displaying the version number of the Damus app.</note> + <note>Section title for displaying the version number of the Damus app.</note> </trans-unit> <trans-unit id="View QR Code" xml:space="preserve"> <source>View QR Code</source> @@ -2276,10 +2350,21 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <trans-unit id="Wallet" xml:space="preserve"> <source>Wallet</source> <target>Wallet</target> - <note>Navigation title for Wallet view + <note>Navigation title for attaching Nostr Wallet Connect lightning wallet. + Navigation title for Wallet view Sidebar menu label for Wallet view. Title for section in zap settings that controls the Lightning wallet selection.</note> </trans-unit> + <trans-unit id="Wallet Address" xml:space="preserve"> + <source>Wallet Address</source> + <target>Wallet Address</target> + <note>Label text indicating that below it is the wallet address.</note> + </trans-unit> + <trans-unit id="Wallet Relay" xml:space="preserve"> + <source>Wallet Relay</source> + <target>Wallet Relay</target> + <note>Label text indicating that below it is the information about the wallet relay.</note> + </trans-unit> <trans-unit id="Website" xml:space="preserve"> <source>Website</source> <target>Website</target> @@ -2335,6 +2420,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <target>Why we need Nostr?</target> <note>Heading text for section describing why Nostr is needed.</note> </trans-unit> + <trans-unit id="Words" xml:space="preserve"> + <source>Words</source> + <target>Words</target> + <note>Section header title for a list of words that are muted.</note> + </trans-unit> <trans-unit id="Yes" xml:space="preserve"> <source>Yes</source> <target>Yes</target> @@ -2365,6 +2455,21 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <target>Your Name</target> <note>Label for Your Name section of user profile form.</note> </trans-unit> + <trans-unit id="Your Purple subscription expires in %@ days. Renew?" xml:space="preserve"> + <source>Your Purple subscription expires in %@ days. Renew?</source> + <target>Your Purple subscription expires in %@ days. Renew?</target> + <note>A notification message explaining to the user that their Damus Purple Subscription is expiring soon, prompting them to renew.</note> + </trans-unit> + <trans-unit id="Your Purple subscription expires in 1 day. Renew?" xml:space="preserve"> + <source>Your Purple subscription expires in 1 day. Renew?</source> + <target>Your Purple subscription expires in 1 day. Renew?</target> + <note>A notification message explaining to the user that their Damus Purple Subscription is expiring in one day, prompting them to renew.</note> + </trans-unit> + <trans-unit id="Your Purple subscription has expired. Renew?" xml:space="preserve"> + <source>Your Purple subscription has expired. Renew?</source> + <target>Your Purple subscription has expired. Renew?</target> + <note>A notification message explaining to the user that their Damus Purple Subscription has expired, prompting them to renew.</note> + </trans-unit> <trans-unit id="Your report will be sent to the relays you are connected to" xml:space="preserve"> <source>Your report will be sent to the relays you are connected to</source> <target>Your report will be sent to the relays you are connected to</target> @@ -2400,8 +2505,7 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <trans-unit id="Zap failed" xml:space="preserve"> <source>Zap failed</source> <target>Zap failed</target> - <note>Button label indicating that a zap action was unsuccessful (i.e. the user was unable to send a Bitcoin tip via the lightning network to the user shown on-screen) - Title of an alert indicating that a zap action failed</note> + <note>Button label indicating that a zap action was unsuccessful (i.e. the user was unable to send a Bitcoin tip via the lightning network to the user shown on-screen)</note> </trans-unit> <trans-unit id="Zap type" xml:space="preserve"> <source>Zap type</source> @@ -2460,7 +2564,13 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <trans-unit id="now" xml:space="preserve"> <source>now</source> <target>now</target> - <note>String indicating that a given timestamp just occurred</note> + <note>Relative time label that indicates a notification happened now + String indicating that a given timestamp just occurred</note> + </trans-unit> + <trans-unit id="npub, #hashtag, phrase" xml:space="preserve"> + <source>npub, #hashtag, phrase</source> + <target>npub, #hashtag, phrase</target> + <note>Placeholder example for relay server address.</note> </trans-unit> <trans-unit id="nsec1..." xml:space="preserve"> <source>nsec1...</source> @@ -2587,16 +2697,11 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <target>%@ and %@ zapped you</target> <note>Notification that 2 users zapped the current user's profile</note> </trans-unit> - <trans-unit id="⚡" xml:space="preserve"> - <source>⚡</source> - <target>⚡</target> - <note>Placeholder example for an emoji reaction</note> - </trans-unit> </body> </file> <file original="damus/en-US.lproj/Localizable.stringsdict" source-language="en-US" target-language="en-US" datatype="plaintext"> <header> - <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.2" build-num="15C500b"/> + <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.3" build-num="15E204a"/> </header> <body> <trans-unit id="/followed_by_three_and_others:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve"> @@ -2659,6 +2764,21 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <target>%#@IMPORTS@</target> <note/> </trans-unit> + <trans-unit id="/quoted_reposts_count:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve"> + <source>%#@QUOTE_REPOSTS@</source> + <target>%#@QUOTE_REPOSTS@</target> + <note/> + </trans-unit> + <trans-unit id="/quoted_reposts_count:dict/QUOTE_REPOSTS:dict/one:dict/:string" xml:space="preserve"> + <source>Quote</source> + <target>Quote</target> + <note/> + </trans-unit> + <trans-unit id="/quoted_reposts_count:dict/QUOTE_REPOSTS:dict/other:dict/:string" xml:space="preserve"> + <source>Quotes</source> + <target>Quotes</target> + <note/> + </trans-unit> <trans-unit id="/reacted_tagged_in_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve"> <source>%#@REACTED@</source> <target>%#@REACTED@</target> @@ -2963,7 +3083,7 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. </file> <file original="DamusNotificationService/InfoPlist.xcstrings" source-language="en-US" target-language="en-US" datatype="plaintext"> <header> - <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.2" build-num="15C500b"/> + <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.3" build-num="15E204a"/> </header> <body> <trans-unit id="CFBundleDisplayName" xml:space="preserve"> @@ -2985,7 +3105,7 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. </file> <file original="DamusNotificationService/Localizable.xcstrings" source-language="en-US" target-language="en-US" datatype="plaintext"> <header> - <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.2" build-num="15C500b"/> + <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="15.3" build-num="15E204a"/> </header> <body> <trans-unit id="" xml:space="preserve"> @@ -3113,10 +3233,10 @@ YOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY. <target state="new">Staging</target> <note>Label indicating a staging test environment for Damus Purple functionality (Developer feature)</note> </trans-unit> - <trans-unit id="Test (localhost)" xml:space="preserve"> - <source>Test (localhost)</source> - <target state="new">Test (localhost)</target> - <note>Label indicating a localhost test environment for Damus Purple functionality (Developer feature)</note> + <trans-unit id="Test (local)" xml:space="preserve"> + <source>Test (local)</source> + <target state="new">Test (local)</target> + <note>Label indicating a local test environment for Damus Purple functionality (Developer feature)</note> </trans-unit> <trans-unit id="This note contains too many items and cannot be rendered" xml:space="preserve"> <source>This note contains too many items and cannot be rendered</source> diff --git a/damus/en-US.xcloc/Source Contents/DamusNotificationService/Localizable.xcstrings b/damus/en-US.xcloc/Source Contents/DamusNotificationService/Localizable.xcstrings @@ -96,8 +96,8 @@ "Staging" : { "comment" : "Label indicating a staging test environment for Damus Purple functionality (Developer feature)" }, - "Test (localhost)" : { - "comment" : "Label indicating a localhost test environment for Damus Purple functionality (Developer feature)" + "Test (local)" : { + "comment" : "Label indicating a local test environment for Damus Purple functionality (Developer feature)" }, "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 Binary files differ. 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 @@ -226,6 +226,22 @@ <string>Reposts</string> </dict> </dict> + <key>quoted_reposts_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@QUOTE_REPOSTS@</string> + <key>QUOTE_REPOSTS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Quote</string> + <key>other</key> + <string>Quotes</string> + </dict> + </dict> <key>sats</key> <dict> <key>NSStringLocalizedFormatKey</key> diff --git 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" : "15C500b", + "toolBuildNumber" : "15E204a", "toolID" : "com.apple.dt.xcode", "toolName" : "Xcode", - "toolVersion" : "15.2" + "toolVersion" : "15.3" }, "version" : "1.0" } \ No newline at end of file diff --git a/damus/es-ES.lproj/Localizable.stringsdict b/damus/es-ES.lproj/Localizable.stringsdict @@ -254,6 +254,24 @@ <string>Republicaciones</string> </dict> </dict> + <key>quoted_reposts_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@QUOTE_REPOSTS@</string> + <key>QUOTE_REPOSTS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Cita</string> + <key>many</key> + <string>Citas</string> + <key>other</key> + <string>Citas</string> + </dict> + </dict> <key>sats</key> <dict> <key>NSStringLocalizedFormatKey</key> diff --git a/damus/fa.lproj/Localizable.strings b/damus/fa.lproj/Localizable.strings Binary files differ. diff --git a/damus/ko.lproj/Localizable.strings b/damus/ko.lproj/Localizable.strings Binary files differ. diff --git a/damus/nl.lproj/Localizable.strings b/damus/nl.lproj/Localizable.strings Binary files differ. diff --git a/damus/nl.lproj/Localizable.stringsdict b/damus/nl.lproj/Localizable.stringsdict @@ -226,6 +226,22 @@ <string>Herplaatsingen</string> </dict> </dict> + <key>quoted_reposts_count</key> + <dict> + <key>NSStringLocalizedFormatKey</key> + <string>%#@QUOTE_REPOSTS@</string> + <key>QUOTE_REPOSTS</key> + <dict> + <key>NSStringFormatSpecTypeKey</key> + <string>NSStringPluralRuleType</string> + <key>NSStringFormatValueTypeKey</key> + <string>d</string> + <key>one</key> + <string>Citaat</string> + <key>other</key> + <string>Citaten</string> + </dict> + </dict> <key>sats</key> <dict> <key>NSStringLocalizedFormatKey</key> diff --git a/damus/pl-PL.lproj/Localizable.strings b/damus/pl-PL.lproj/Localizable.strings Binary files differ.