diff --git a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionViewModel.swift b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionViewModel.swift index d97021a33..1a9f49f61 100644 --- a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionViewModel.swift @@ -225,9 +225,9 @@ private extension SaveArticleError { case .unauthorized: return LocalText.extensionAppUnauthorized case .network: - return LocalText.networkError + return LocalText.errorNetwork case .badData, .unknown: - return LocalText.genericError + return LocalText.errorGeneric } } } diff --git a/apple/OmnivoreKit/Sources/App/Views/AudioPlayer/ExpandedPlayer.swift b/apple/OmnivoreKit/Sources/App/Views/AudioPlayer/ExpandedPlayer.swift index 1fde8a399..1b84f8ce5 100644 --- a/apple/OmnivoreKit/Sources/App/Views/AudioPlayer/ExpandedPlayer.swift +++ b/apple/OmnivoreKit/Sources/App/Views/AudioPlayer/ExpandedPlayer.swift @@ -205,7 +205,7 @@ Image(systemName: "gobackward") .font(.appCallout) .tint(.appGrayTextContrast) - Text("Replay") + Text(LocalText.audioPlayerReplay) } } ).buttonStyle(RoundedRectButtonStyle()) diff --git a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift index 189f1066a..c2eb00567 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift @@ -128,7 +128,7 @@ struct HighlightsListCard: View { .foregroundColor(.appGrayText) .frame(width: 14, height: 14) } - Text("Highlight by \(highlightParams.createdBy?.name ?? "you")") + Text("\(LocalText.highlightCardHighlightByOther)\(highlightParams.createdBy?.name ?? "you")") // TODO: fix translation...add other/you .font(.appFootnote) .foregroundColor(.appGrayText) } diff --git a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListView.swift b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListView.swift index 2a0e9bfe9..3432f73a1 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListView.swift @@ -14,9 +14,7 @@ struct HighlightsListView: View { @State var setLabelsHighlight: Highlight? var emptyView: some View { - Text(""" - You have not added any highlights or notes to this page. - """) + Text(LocalText.highlightCardNoHighlightsOnPage) .multilineTextAlignment(.center) .padding(16) } diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift index c6f04bbc9..c4dac6a0b 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift @@ -116,7 +116,7 @@ struct CreateLabelView: View { if !newLabelName.isEmpty, newLabelColor != .clear { TextChip(text: newLabelName, color: newLabelColor) } else { - Text("Assign a name and color.").font(.appBody) + Text(LocalText.labelsViewAssignNameColor).font(.appBody) } Spacer() } diff --git a/apple/OmnivoreKit/Sources/Views/LocalText.swift b/apple/OmnivoreKit/Sources/Views/LocalText.swift index daed0b979..148be5252 100644 --- a/apple/OmnivoreKit/Sources/Views/LocalText.swift +++ b/apple/OmnivoreKit/Sources/Views/LocalText.swift @@ -5,43 +5,187 @@ public enum LocalText { NSLocalizedString(key, bundle: .module, comment: comment ?? "no comment provided by developer") } - public static let googleAuthButton = localText(key: "googleAuthButton") - public static let networkError = localText(key: "error.network") - public static let registrationViewSignUpHeadline = localText(key: "registrationViewSignUpHeadline") - public static let genericError = localText(key: "error.generic") - public static let invalidCredsLoginError = localText(key: "loginError.invalidCreds") + // Share extension public static let saveArticleSavedState = localText(key: "saveArticleSavedState") public static let saveArticleProcessingState = localText(key: "saveArticleProcessingState") public static let extensionAppUnauthorized = localText(key: "extensionAppUnauthorized") - public static let dismissButton = localText(key: "dismissButton") - public static let labelsGeneric = localText(key: "labels.generic") - public static let emailsGeneric = localText(key: "emails.generic") - public static let subscriptionsGeneric = localText(key: "subscriptions.generic") - public static let textToSpeechGeneric = localText(key: "textToSpeech.generic") - public static let privacyPolicyGeneric = localText(key: "privacy.policy.generic") - public static let termsAndConditionsGeneric = localText(key: "termsAndConditions.generic") - public static let feedbackGeneric = localText(key: "feedback.generic") - public static let manageAccountGeneric = localText(key: "manageAccount.generic") - public static let logoutGeneric = localText(key: "logout.generic") - public static let doneGeneric = localText(key: "done.generic") - public static let cancelGeneric = localText(key: "cancel.generic") - public static let inboxGeneric = localText(key: "inbox.generic") - public static let readLaterGeneric = localText(key: "readLater.generic") - public static let newslettersGeneric = localText(key: "newsletters.generic") - public static let allGeneric = localText(key: "all.generic") - public static let archivedGeneric = localText(key: "archived.generic") - public static let highlightedGeneric = localText(key: "highlighted.generic") - public static let filesGeneric = localText(key: "files.generic") - public static let newestGeneric = localText(key: "newest.generic") - public static let oldestGeneric = localText(key: "oldest.generic") - public static let recentlyReadGeneric = localText(key: "recentlyRead.generic") - public static let recentlyPublishedGeneric = localText(key: "recentlyPublished.generic") - public static let createLabelMessage = localText(key: "create.label.message") - public static let createNewEmailMessage = localText(key: "create.new.email.message") - public static let newslettersDescription = localText(key: "newsletters.description") - public static let labelsPurposeDescription = localText(key: "labels.purpose.description") - public static let noCurrentSubscriptionsMessage = localText(key: "no.current.subscriptions.message") - public static let clubsGeneric = localText(key: "clubs.generic") - public static let pushNotificationsGeneric = localText(key: "pushNotifications.generic") + // Audio player + public static let audioPlayerReplay = localText(key: "audioPlayerReplay") + + // Highlights List Card + public static let highlightCardHighlightByOther = localText(key: "highlightCardHighlightByOther") + public static let highlightCardNoHighlightsOnPage = localText(key: "highlightCardNoHighlightsOnPage") + + // Labels View + public static let labelsViewAssignNameColor = localText(key: "labelsViewAssignNameColor") + public static let createLabelMessage = localText(key: "createLabelMessage") + public static let labelsPurposeDescription = localText(key: "labelsPurposeDescription") + + // Manage Account View + public static let manageAccountDelete = localText(key: "manageAccountDelete") + public static let manageAccountResetCache = localText(key: "manageAccountResetCache") + public static let manageAccountConfirmDeleteMessage = localText(key: "manageAccountConfirmDeleteMessage") + + // Newsletter Emails View + public static let newsletterEmailsExisting = localText(key: "newsletterEmailsExisting") + public static let createNewEmailMessage = localText(key: "createNewEmailMessage") + public static let newslettersDescription = localText(key: "newslettersDescription") + public static let noCurrentSubscriptionsMessage = localText(key: "noCurrentSubscriptionsMessage") + + // Profile View + public static let profileConfirmLogoutMessage = localText(key: "profileConfirmLogoutMessage") + + // Devices View + public static let devicesTokensTitle = localText(key: "devicesTokensTitle") + public static let devicesCreated = localText(key: "devicesCreated") + + // Push Notification Settings + public static let notificationsEnabled = localText(key: "notificationsEnabled") + public static let notificationsExplainer = localText(key: "notificationsExplainer") + public static let notificationsTriggerExplainer = localText(key: "notificationsTriggerExplainer") + public static let notificationsEnable = localText(key: "notificationsEnable") + public static let notificationsGeneralExplainer = localText(key: "notificationsGeneralExplainer") + public static let notificationsOptionDeny = localText(key: "notificationsOptionDeny") + public static let notificationsOptionEnable = localText(key: "notificationsOptionEnable") + + // Community Modal + public static let communityHeadline = localText(key: "communityHeadline") + public static let communityAppstoreReview = localText(key: "communityAppstoreReview") + public static let communityTweet = localText(key: "communityTweet") + public static let communityFollowTwitter = localText(key: "communityFollowTwitter") + public static let communityJoinDiscord = localText(key: "communityJoinDiscord") + public static let communityStarGithub = localText(key: "communityStarGithub") + + // Clubs View + public static let clubsLearnTitle = localText(key: "clubsLearnTitle") + public static let clubsName = localText(key: "clubsName") + public static let clubsCreate = localText(key: "clubsCreate") + public static let clubsYours = localText(key: "clubsYours") + public static let clubsNotAMemberMessage = localText(key: "clubsNotAMemberMessage") + public static let clubsErrorCopying = localText(key: "clubsErrorCopying") + public static let clubsAdminDenyViewing = localText(key: "clubsAdminDenyViewing") + public static let clubsNoMembers = localText(key: "clubsNoMembers") + public static let clubsLeave = localText(key: "clubsLeave") + public static let clubsLeaveConfirm = localText(key: "clubsLeaveConfirm") + public static let clubsNoneJoined = localText(key: "clubsNoneJoined") + + // Subscriptions + public static let subscriptionsErrorRetrieving = localText(key: "subscriptionsErrorRetrieving") + public static let subscriptionsNone = localText(key: "subscriptionsNone") + + // Text to Speech + public static let texttospeechLanguageDefault = localText(key: "texttospeechLanguageDefault") + public static let texttospeechSettingsAudio = localText(key: "texttospeechSettingsAudio") + public static let texttospeechSettingsEnablePrefetch = localText(key: "texttospeechSettingsEnablePrefetch") + public static let texttospeechBetaSignupInProcess = localText(key: "texttospeechBetaSignupInProcess") + public static let texttospeechBetaRealisticVoiceLimit = localText(key: "texttospeechBetaRealisticVoiceLimit") + public static let texttospeechBetaRequestReceived = localText(key: "texttospeechBetaRequestReceived") + public static let texttospeechBetaWaitlist = localText(key: "texttospeechBetaWaitlist") + + // Sign in/up + public static let registrationNoAccount = localText(key: "registrationNoAccount") + public static let registrationForgotPassword = localText(key: "registrationForgotPassword") + public static let registrationStatusCheck = localText(key: "registrationStatusCheck") + public static let registrationUseDifferentEmail = localText(key: "registrationUseDifferentEmail") + public static let registrationFullName = localText(key: "registrationFullName") + public static let registrationUsername = localText(key: "registrationUsername") + public static let registrationAlreadyHaveAccount = localText(key: "registrationAlreadyHaveAccount") + public static let registrationBio = localText(key: "registrationBio") + public static let registrationWelcome = localText(key: "registrationWelcome") + public static let registrationUsernameAssignedPrefix = localText(key: "registrationUsernameAssignedPrefix") + public static let registrationChangeUsername = localText(key: "registrationChangeUsername") + public static let registrationEdit = localText(key: "registrationEdit") + public static let googleAuthButton = localText(key: "googleAuthButton") + public static let registrationViewSignUpHeadline = localText(key: "registrationViewSignUpHeadline") + public static let loginErrorInvalidCreds = localText(key: "loginErrorInvalidCreds") + + // Recommendation + public static let recommendationToPrefix = localText(key: "recommendationToPrefix") + public static let recommendationAddNote = localText(key: "recommendationAddNote") + public static let recommendationError = localText(key: "recommendationError") + + // Web Reader + public static let readerCopyLink = localText(key: "readerCopyLink") + public static let readerSave = localText(key: "readerSave") + public static let readerError = localText(key: "readerError") + + // Debug Menu + public static let menuDebugTitle = localText(key: "menuDebugTitle") + public static let menuDebugApiEnv = localText(key: "menuDebugApiEnv") + + // Navigation + public static let navigationSelectLink = localText(key: "navigationSelectLink") + public static let navigationSelectSidebarToggle = localText(key: "navigationSelectSidebarToggle") + + // Welcome View + public static let welcomeTitle = localText(key: "welcomeTitle") + public static let welcomeLearnMore = localText(key: "welcomeLearnMore") + public static let welcomeSignupAgreement = localText(key: "welcomeSignupAgreement") + public static let welcomeTitleTermsOfService = localText(key: "welcomeTitleTermsOfService") + public static let welcomeTitleAndJoiner = localText(key: "welcomeTitleAndJoiner") + public static let welcomeTitleEmailContinue = localText(key: "welcomeTitleEmailContinue") + + // Keyboard Commands + public static let keyboardCommandDecreaseFont = localText(key: "keyboardCommandDecreaseFont") + public static let keyboardCommandIncreaseFont = localText(key: "keyboardCommandIncreaseFont") + public static let keyboardCommandDecreaseMargin = localText(key: "keyboardCommandDecreaseMargin") + public static let keyboardCommandIncreaseMargin = localText(key: "keyboardCommandIncreaseMargin") + public static let keyboardCommandDecreaseLineSpacing = localText(key: "keyboardCommandDecreaseLineSpacing") + public static let keyboardCommandIncreaseLineSpacing = localText(key: "keyboardCommandIncreaseLineSpacing") + + // Generic + public static let genericSnooze = localText(key: "genericSnooze") + public static let genericClose = localText(key: "genericClose") + public static let genericCreate = localText(key: "genericCreate") + public static let genericConfirm = localText(key: "genericConfirm") + public static let genericProfile = localText(key: "genericProfile") + public static let genericNext = localText(key: "genericNext") + public static let genericName = localText(key: "genericName") + public static let genericOk = localText(key: "genericOk") + public static let genericRetry = localText(key: "genericRetry") + public static let genericEmail = localText(key: "genericEmail") + public static let genericPassword = localText(key: "genericPassword") + public static let genericSubmit = localText(key: "genericSubmit") + public static let genericContinue = localText(key: "genericContinue") + public static let genericSend = localText(key: "genericSend") + public static let genericOptions = localText(key: "genericOptions") + public static let genericOpen = localText(key: "genericOpen") + public static let genericChangeApply = localText(key: "genericChangeApply") + public static let genericTitle = localText(key: "genericTitle") + public static let genericAuthor = localText(key: "genericAuthor") + public static let genericDescription = localText(key: "genericDescription") + public static let genericSave = localText(key: "genericSave") + public static let genericLoading = localText(key: "genericLoading") + public static let genericFontFamily = localText(key: "genericFontFamily") + public static let genericHighContrastText = localText(key: "genericHighContrastText") + public static let genericFont = localText(key: "genericFont") + public static let genericHighlight = localText(key: "genericHighlight") + public static let labelsGeneric = localText(key: "labelsGeneric") + public static let emailsGeneric = localText(key: "emailsGeneric") + public static let subscriptionsGeneric = localText(key: "subscriptionsGeneric") + public static let textToSpeechGeneric = localText(key: "textToSpeechGeneric") + public static let privacyPolicyGeneric = localText(key: "privacyPolicyGeneric") + public static let termsAndConditionsGeneric = localText(key: "termsAndConditionsGeneric") + public static let feedbackGeneric = localText(key: "feedbackGeneric") + public static let manageAccountGeneric = localText(key: "manageAccountGeneric") + public static let logoutGeneric = localText(key: "logoutGeneric") + public static let doneGeneric = localText(key: "doneGeneric") + public static let cancelGeneric = localText(key: "cancelGeneric") + public static let inboxGeneric = localText(key: "inboxGeneric") + public static let readLaterGeneric = localText(key: "readLaterGeneric") + public static let newslettersGeneric = localText(key: "newslettersGeneric") + public static let allGeneric = localText(key: "allGeneric") + public static let archivedGeneric = localText(key: "archivedGeneric") + public static let highlightedGeneric = localText(key: "highlightedGeneric") + public static let filesGeneric = localText(key: "filesGeneric") + public static let newestGeneric = localText(key: "newestGeneric") + public static let oldestGeneric = localText(key: "oldestGeneric") + public static let recentlyReadGeneric = localText(key: "recentlyReadGeneric") + public static let recentlyPublishedGeneric = localText(key: "recentlyPublishedGeneric") + public static let clubsGeneric = localText(key: "clubsGeneric") + public static let errorGeneric = localText(key: "errorGeneric") + public static let pushNotificationsGeneric = localText(key: "pushNotificationsGeneric") + public static let dismissButton = localText(key: "dismissButton") + public static let errorNetwork = localText(key: "errorNetwork") } diff --git a/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift b/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift index fcb06e2fb..66f89d66b 100644 --- a/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift +++ b/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift @@ -20,11 +20,11 @@ private extension LoginError { var message: String { switch self { case .unauthorized: - return LocalText.invalidCredsLoginError + return LocalText.loginErrorInvalidCreds case .network: - return LocalText.networkError + return LocalText.errorNetwork case .unknown: - return LocalText.genericError + return LocalText.errorGeneric case .pendingEmailVerification: return "Please check your email for a verification message." } diff --git a/apple/OmnivoreKit/Sources/Views/Resources/en.lproj/Localizable.strings b/apple/OmnivoreKit/Sources/Views/Resources/en.lproj/Localizable.strings index 491638ab9..77c6164c4 100644 --- a/apple/OmnivoreKit/Sources/Views/Resources/en.lproj/Localizable.strings +++ b/apple/OmnivoreKit/Sources/Views/Resources/en.lproj/Localizable.strings @@ -1,39 +1,192 @@ -"googleAuthButton" = "Continue with Google"; -"registrationViewSignUpHeadline" = "Sign Up"; -"error.network" = "We are having trouble connecting to the internet."; -"error.generic" = "Something went wrong, please try again."; -"extensionAppUnauthorized" = "Please login to Omnivore from the app before saving your first link."; -"loginError.invalidCreds" = "The login credentials provided are invalid."; +// share extension "saveArticleSavedState" = "Saved to Omnivore"; "saveArticleProcessingState" = "Saved to Omnivore"; -"dismissButton" = "Dismiss"; +"extensionAppUnauthorized" = "Please login to Omnivore from the app before saving your first link."; -"labels.generic" = "Labels"; -"emails.generic" = "Emails"; -"subscriptions.generic" = "Subscriptions"; -"textToSpeech.generic" = "Text to Speech"; -"privacy.policy.generic" = "Privacy Policy"; -"termsAndConditions.generic" = "Terms and Conditions"; -"feedback.generic" = "Feedback"; -"manageAccount.generic" = "Manage Account"; -"logout.generic" = "Logout"; -"done.generic" = "Done"; -"cancel.generic" = "Cancel"; -"inbox.generic" = "Inbox"; -"readLater.generic" = "Read Later"; -"newsletters.generic" = "Newsletters"; -"all.generic" = "All"; -"archived.generic" = "Archived"; -"highlighted.generic" = "Highlighted"; -"files.generic" = "Files"; -"newest.generic" = "Newest"; -"oldest.generic" = "Oldest"; -"recentlyRead.generic" = "Recently Read"; -"recentlyPublished.generic" = "Recently Published"; -"create.label.message" = "Create a new Label"; -"create.new.email.message" = "Create a new email address"; -"newsletters.description" = "Add PDFs to your library, or subscribe to newsletters using an Omnivore email address."; -"labels.purpose.description" = "Use labels to create curated collections of links."; -"no.current.subscriptions.message" = "You have no current Subscriptions."; -"clubs.generic" = "Clubs"; -"pushNotifications.generic" = "Push Notifications"; +// audio player +"audioPlayerReplay" = "Replay"; + +// Highlights List Card +"highlightCardHighlightByOther" = "Highlight by "; +"highlightCardNoHighlightsOnPage" = "You have not added any highlights or notes to this page."; + +// Labels View +"labelsViewAssignNameColor" = "Assign a name and color."; +"createLabelMessage" = "Create a new Label"; +"labelsPurposeDescription" = "Use labels to create curated collections of links."; + +// Manage Account View +"manageAccountDelete" = "Delete Account"; +"manageAccountResetCache" = "Reset Data Cache"; +"manageAccountConfirmDeleteMessage" = "Are you sure you want to delete your account? This action can't be undone."; + +// Newsletter Emails View +"newsletterEmailsExisting" = "Existing Emails (Tap to copy)"; +"createNewEmailMessage" = "Create a new email address"; +"newslettersDescription" = "Add PDFs to your library, or subscribe to newsletters using an Omnivore email address."; +"noCurrentSubscriptionsMessage" = "You have no current Subscriptions."; + +// Profile View +"profileConfirmLogoutMessage" = "Are you sure you want to logout?"; + +// Devices View +"devicesTokensTitle" = "Registered device tokens (swipe to remove)"; +"devicesCreated" = "Created: "; + +// Push Notification Settings +"notificationsEnabled" = "Notifications Enabled"; +"notificationsExplainer" = "Enabling push notifications gives Omnivore device permission to send notifications,\nbut you are in charge of which notifications are sent."; +"notificationsTriggerExplainer" = "Push notifications are triggered using your \n[account rules](https://omnivore.app/settings/rules) which you can edit online."; +"notificationsEnable" = "Enable Push Notifications?"; + "notificationsGeneralExplainer" = "Get notified when newsletter links reach your inbox. Or receive reminders that you set from our share extension."; +"notificationsOptionDeny" = "No Thanks"; +"notificationsOptionEnable" = "Yes Please"; + +// Community Modal +"communityHeadline" = "Help build the Omnivore Community"; +"communityAppstoreReview" = "Review on the AppStore"; +"communityTweet" = "Tweet about Omnivore"; +"communityFollowTwitter" = "Follow us on Twitter"; +"communityJoinDiscord" = "Join us on Discord"; +"communityStarGithub" = "Star on GitHub"; + +// Clubs View +"clubsLearnTitle" = "Learn more about clubs"; +"clubsName" = "Club Name"; +"clubsCreate" = "Create a new club"; +"clubsYours" = "Your clubs"; +"clubsNotAMemberMessage" = "You are not a member of any clubs.\nCreate a new club and send the invite link to your friends get started.\n\nDuring the beta you are limited to creating three clubs, and each club\ncan have a maximum of twelve users." +"clubsErrorCopying" = "Error copying invite URL"; +"clubsAdminDenyViewing" = "The admin of this club does not allow viewing all members."; +"clubsNoMembers" = "This club does not have any members. Add users to your club by sending\nthem the invite link."; +"clubsLeave" = "Leave Club"; +"clubsLeaveConfirm" = "Are you sure you want to leave this club? No data will be deleted, but you will stop receiving recommendations from the club."; +"clubsNoneJoined" = "You do not have any clubs you can post to.\nJoin a club or create your own to start recommending articles."; + +// Subscriptions +"subscriptionsErrorRetrieving" = "Sorry, we were unable to retrieve your subscriptions."; +"subscriptionsNone" = "You have no current subscriptions."; +//"subscriptions.error.retrieving" = "Last received: \(updatedDate.formatted())"; // unused for now + +// Text to Speech +"texttospeechLanguageDefault" = "Default Language"; +"texttospeechSettingsAudio" = "Audio Settings"; +"texttospeechSettingsEnablePrefetch" = "Enable audio prefetch"; +"texttospeechBetaSignupInProcess" = "Signing up for beta"; +"texttospeechBetaRealisticVoiceLimit" = "You are in the ultra realistic voices beta. During the beta you can listen to 10,000 words of audio per day."; +"texttospeechBetaRequestReceived" = "Your request to join the ultra realistic voices demo has been received. You will be informed by email when a spot is available."; +"texttospeechBetaWaitlist" = "Ultra realistic voices are currently in limited beta. Enabling the feature will add you to the beta queue."; + +// Sign in/up +"registrationNoAccount" = "Don't have an account?"; +"registrationForgotPassword" = "Forgot your password?"; +"registrationStatusCheck" = "Check Status"; +"registrationUseDifferentEmail" = "Use a different email?"; +"registrationFullName" = "Full Name"; +"registrationUsername" = "Username"; +"registrationAlreadyHaveAccount" = "Already have an account?"; +"registrationBio" = "Bio (optional)"; +"registrationWelcome" = "Welcome to Omnivore!"; +"registrationUsernameAssignedPrefix" = "Your username is:"; +"registrationChangeUsername" = "Change Username"; +"registrationEdit" = "Edit"; +"googleAuthButton" = "Continue with Google"; +"registrationViewSignUpHeadline" = "Sign Up"; +"loginErrorInvalidCreds" = "The login credentials provided are invalid."; + +// Recommendation +"recommendationToPrefix" = "To:"; +"recommendationAddNote" = "Add a note (optional)"; +//"recommendationToPrefix" = "Include your \(viewModel.highlightCount) highlight\(viewModel.highlightCount > 1 ? "s" : """; // unused for now +"recommendationError" = "Error recommending this page"; + +// Web Reader +"readerCopyLink" = "Copy Link"; +"readerSave" = "Save to Omnivore"; +"readerError" = "An error occurred"; + +// Debug Menu +"menuDebugTitle" = "Debug Menu"; +"menuDebugApiEnv" = "API Environment:"; + +// Navigation +"navigationSelectLink" = "Select a link from the feed"; +"navigationSelectSidebarToggle" = "Toggle sidebar"; + +// Welcome View +"welcomeTitle" = "Read-it-later for serious readers."; +"welcomeLearnMore" = "Learn more"; +"welcomeSignupAgreement" = "By signing up, you agree to Omnivore’s\n"; +"welcomeTitleTermsOfService" = "Terms of Service"; +"welcomeTitleAndJoiner" = " and "; +"welcomeTitleEmailContinue" = "Continue with Email"; + +// Keyboard Commands +"keyboardCommandDecreaseFont" = "Decrease Font Size"; +"keyboardCommandIncreaseFont" = "Increase Font Size"; +"keyboardCommandDecreaseMargin" = "Decrease Margin"; +"keyboardCommandIncreaseMargin" = "Increase Margin"; +"keyboardCommandDecreaseLineSpacing" = "Decrease Line Spacing"; +"keyboardCommandIncreaseLineSpacing" = "Increase Line Spacing"; + +// Library +//"library.by.author.suffix" = "by \(author)" // unused +//"Recommended by \(byStr) in \(inStr)" // unused + + +// Generic +"genericSnooze" = "Snooze"; +"genericClose" = "Close"; +"genericCreate" = "Create"; +"genericConfirm" = "Confirm"; +"genericProfile" = "Profile"; +"genericNext" = "Next"; +"genericName" = "Name"; +"genericOk" = "Ok"; +"genericRetry" = "Retry"; +"genericEmail" = "Email"; +"genericPassword" = "Password"; +"genericSubmit" = "Submit"; +"genericContinue" = "Continue"; +"genericSend" = "Send"; +"genericOptions" = "Options"; +"genericOpen" = "Open"; +"genericChangeApply" = "Apply Changes"; +"genericTitle" = "Title"; +"genericAuthor" = "Author"; +"genericDescription" = "Description"; +"genericSave" = "Save"; +"genericLoading" = "Loading..."; +"genericFontFamily" = "Font Family"; +"genericHighContrastText" = "High Contrast Text"; +"genericFont" = "Font"; +"genericHighlight" = "Highlight"; +"labelsGeneric" = "Labels"; +"emailsGeneric" = "Emails"; +"subscriptionsGeneric" = "Subscriptions"; +"textToSpeechGeneric" = "Text to Speech"; +"privacyPolicyGeneric" = "Privacy Policy"; +"termsAndConditionsGeneric" = "Terms and Conditions"; +"feedbackGeneric" = "Feedback"; +"manageAccountGeneric" = "Manage Account"; +"logoutGeneric" = "Logout"; +"doneGeneric" = "Done"; +"cancelGeneric" = "Cancel"; +"inboxGeneric" = "Inbox"; +"readLaterGeneric" = "Read Later"; +"newslettersGeneric" = "Newsletters"; +"allGeneric" = "All"; +"archivedGeneric" = "Archived"; +"highlightedGeneric" = "Highlighted"; +"filesGeneric" = "Files"; +"newestGeneric" = "Newest"; +"oldestGeneric" = "Oldest"; +"recentlyReadGeneric" = "Recently Read"; +"recentlyPublishedGeneric" = "Recently Published"; +"clubsGeneric" = "Clubs"; +"errorGeneric" = "Something went wrong, please try again."; +"pushNotificationsGeneric" = "Push Notifications"; +"dismissButton" = "Dismiss"; +"errorNetwork" = "We are having trouble connecting to the internet."; + +// TODO: search navigationTitle, toggle, section, button, Label diff --git a/apple/OmnivoreKit/Sources/Views/Resources/zh-Hans.lproj/Localizable.strings b/apple/OmnivoreKit/Sources/Views/Resources/zh-Hans.lproj/Localizable.strings index 5cce13d03..0e5248d0a 100644 --- a/apple/OmnivoreKit/Sources/Views/Resources/zh-Hans.lproj/Localizable.strings +++ b/apple/OmnivoreKit/Sources/Views/Resources/zh-Hans.lproj/Localizable.strings @@ -1,39 +1,190 @@ -"googleAuthButton" = "Continue with Google"; -"registrationViewSignUpHeadline" = "Sign Up"; -"error.network" = "We are having trouble connecting to the internet."; -"error.generic" = "Something went wrong, please try again."; -"extensionAppUnauthorized" = "Please login to Omnivore from the app before saving your first link."; -"loginError.invalidCreds" = "The login credentials provided are invalid."; -"saveArticleSavedState" = "Saved to Omnivore"; -"saveArticleProcessingState" = "Saved to Omnivore"; -"dismissButton" = "Dismiss"; +// share extension +"saveArticleSavedState" = "正在保存到 Omnivore 中"; +"saveArticleProcessingState" = "已经保存到 Omnivore 中"; +"extensionAppUnauthorized" = "请在保存您的第一个链接之前从应用程序登录 Omnivore."; -"labels.generic" = "标签"; -"emails.generic" = "电子邮件"; -"subscriptions.generic" = "订阅"; -"textToSpeech.generic" = "文本转语音"; -"privacy.policy.generic" = "隐私策略"; -"termsAndConditions.generic" = "条款与条件"; -"feedback.generic" = "反馈"; -"manageAccount.generic" = "管理帐户"; -"logout.generic" = "退出登陆"; -"done.generic" = "完成"; -"cancel.generic" = "取消"; -"inbox.generic" = "收集箱"; -"readLater.generic" = "稍后阅读"; -"newsletters.generic" = "新闻稿件"; -"all.generic" = "全部"; -"archived.generic" = "存档"; -"highlighted.generic" = "高亮"; -"files.generic" = "文件"; -"newest.generic" = "最新"; -"oldest.generic" = "最早"; -"recentlyRead.generic" = "最近阅读"; -"recentlyPublished.generic" = "最近发布"; -"create.label.message" = "创建新标签"; -"create.new.email.message" = "创建新的电子邮件地址"; -"newsletters.description" = "将 PDF 添加到您的资料库,或使用 Omnivore 电子邮件地址订阅新闻稿件。"; -"labels.purpose.description" = "使用标签创建精选的链接集合。"; -"no.current.subscriptions.message" = "您当前没有任何订阅。"; -"clubs.generic" = "读书俱乐部"; -"pushNotifications.generic" = "推送通知"; +// audio player +"audioPlayerReplay" = "Replay"; + +// Highlights List Card +"highlightCardHighlightByOther" = "Highlight by "; +"highlightCardNoHighlightsOnPage" = "You have not added any highlights or notes to this page."; + +// Labels View +"labelsViewAssignNameColor" = "Assign a name and color."; +"createLabelMessage" = "创建新标签"; +"labelsPurposeDescription" = "使用标签创建精选的链接集合。"; + +// Manage Account View +"manageAccountDelete" = "Delete Account"; +"manageAccountResetCache" = "Reset Data Cache"; +"manageAccountConfirmDeleteMessage" = "Are you sure you want to delete your account? This action can't be undone."; + +// Newsletter Emails View +"newsletterEmailsExisting" = "Existing Emails (Tap to copy)"; +"createNewEmailMessage" = "创建新的电子邮件地址"; +"newslettersDescription" = "将 PDF 添加到您的资料库,或使用 Omnivore 电子邮件地址订阅新闻稿件。"; +"noCurrentSubscriptionsMessage" = "您当前没有任何订阅。"; + +// Profile View +"profileConfirmLogoutMessage" = "Are you sure you want to logout?"; + +// Devices View +"devicesTokensTitle" = "Registered device tokens (swipe to remove)"; +"devicesCreated" = "Created: "; + +// Push Notification Settings +"notificationsEnabled" = "Notifications Enabled"; +"notificationsExplainer" = "Enabling push notifications gives Omnivore device permission to send notifications,\nbut you are in charge of which notifications are sent."; +"notificationsTriggerExplainer" = "Push notifications are triggered using your \n[account rules](https://omnivore.app/settings/rules) which you can edit online."; +"notificationsEnable" = "Enable Push Notifications?"; + "notificationsGeneralExplainer" = "Get notified when newsletter links reach your inbox. Or receive reminders that you set from our share extension."; +"notificationsOptionDeny" = "No Thanks"; +"notificationsOptionEnable" = "Yes Please"; + +// Community Modal +"communityHeadline" = "Help build the Omnivore Community"; +"communityAppstoreReview" = "Review on the AppStore"; +"communityTweet" = "Tweet about Omnivore"; +"communityFollowTwitter" = "Follow us on Twitter"; +"communityJoinDiscord" = "Join us on Discord"; +"communityStarGithub" = "Star on GitHub"; + +// Clubs View +"clubsLearnTitle" = "Learn more about clubs"; +"clubsName" = "Club Name"; +"clubsCreate" = "Create a new club"; +"clubsYours" = "Your clubs"; +"clubsNotAMemberMessage" = "You are not a member of any clubs.\nCreate a new club and send the invite link to your friends get started.\n\nDuring the beta you are limited to creating three clubs, and each club\ncan have a maximum of twelve users." +"clubsErrorCopying" = "Error copying invite URL"; +"clubsAdminDenyViewing" = "The admin of this club does not allow viewing all members."; +"clubsNoMembers" = "This club does not have any members. Add users to your club by sending\nthem the invite link."; +"clubsLeave" = "Leave Club"; +"clubsLeaveConfirm" = "Are you sure you want to leave this club? No data will be deleted, but you will stop receiving recommendations from the club."; +"clubsNoneJoined" = "You do not have any clubs you can post to.\nJoin a club or create your own to start recommending articles."; + +// Subscriptions +"subscriptionsErrorRetrieving" = "Sorry, we were unable to retrieve your subscriptions."; +"subscriptionsNone" = "You have no current subscriptions."; +//"subscriptions.error.retrieving" = "Last received: \(updatedDate.formatted())"; // unused for now + +// Text to Speech +"texttospeechLanguageDefault" = "Default Language"; +"texttospeechSettingsAudio" = "Audio Settings"; +"texttospeechSettingsEnablePrefetch" = "Enable audio prefetch"; +"texttospeechBetaSignupInProcess" = "Signing up for beta"; +"texttospeechBetaRealisticVoiceLimit" = "You are in the ultra realistic voices beta. During the beta you can listen to 10,000 words of audio per day."; +"texttospeechBetaRequestReceived" = "Your request to join the ultra realistic voices demo has been received. You will be informed by email when a spot is available."; +"texttospeechBetaWaitlist" = "Ultra realistic voices are currently in limited beta. Enabling the feature will add you to the beta queue."; + +// Sign in/up +"registrationNoAccount" = "Don't have an account?"; +"registrationForgotPassword" = "Forgot your password?"; +"registrationStatusCheck" = "Check Status"; +"registrationUseDifferentEmail" = "Use a different email?"; +"registrationFullName" = "Full Name"; +"registrationUsername" = "Username"; +"registrationAlreadyHaveAccount" = "Already have an account?"; +"registrationBio" = "Bio (optional)"; +"registrationWelcome" = "Welcome to Omnivore!"; +"registrationUsernameAssignedPrefix" = "Your username is:"; +"registrationChangeUsername" = "Change Username"; +"registrationEdit" = "Edit"; +"googleAuthButton" = "使用 Google 账号"; +"registrationViewSignUpHeadline" = "注册"; +"loginErrorInvalidCreds" = "提供的登录凭据无效."; + +// Recommendation +"recommendationToPrefix" = "To:"; +"recommendationAddNote" = "Add a note (optional)"; +//"recommendationToPrefix" = "Include your \(viewModel.highlightCount) highlight\(viewModel.highlightCount > 1 ? "s" : """; // unused for now +"recommendationError" = "Error recommending this page"; + +// Web Reader +"readerCopyLink" = "Copy Link"; +"readerSave" = "Save to Omnivore"; +"readerError" = "An error occurred"; + +// Debug Menu +"menuDebugTitle" = "Debug Menu"; +"menuDebugApiEnv" = "API Environment:"; + +// Navigation +"navigationSelectLink" = "Select a link from the feed"; +"navigationSelectSidebarToggle" = "Toggle sidebar"; + +// Welcome View +"welcomeTitle" = "Read-it-later for serious readers."; +"welcomeLearnMore" = "Learn more"; +"welcomeSignupAgreement" = "By signing up, you agree to Omnivore’s\n"; +"welcomeTitleTermsOfService" = "Terms of Service"; +"welcomeTitleAndJoiner" = " and "; +"welcomeTitleEmailContinue" = "Continue with Email"; + +// Keyboard Commands +"keyboardCommandDecreaseFont" = "Decrease Font Size"; +"keyboardCommandIncreaseFont" = "Increase Font Size"; +"keyboardCommandDecreaseMargin" = "Decrease Margin"; +"keyboardCommandIncreaseMargin" = "Increase Margin"; +"keyboardCommandDecreaseLineSpacing" = "Decrease Line Spacing"; +"keyboardCommandIncreaseLineSpacing" = "Increase Line Spacing"; + +// Library +//"library.by.author.suffix" = "by \(author)" // unused +//"Recommended by \(byStr) in \(inStr)" // unused + + +// Generic +"genericSnooze" = "Snooze"; +"genericClose" = "Close"; +"genericCreate" = "Create"; +"genericConfirm" = "Confirm"; +"genericProfile" = "Profile"; +"genericNext" = "Next"; +"genericName" = "Name"; +"genericOk" = "Ok"; +"genericRetry" = "Retry"; +"genericEmail" = "Email"; +"genericPassword" = "Password"; +"genericSubmit" = "Submit"; +"genericContinue" = "Continue"; +"genericSend" = "Send"; +"genericOptions" = "Options"; +"genericOpen" = "Open"; +"genericChangeApply" = "Apply Changes"; +"genericTitle" = "Title"; +"genericAuthor" = "Author"; +"genericDescription" = "Description"; +"genericSave" = "Save"; +"genericLoading" = "Loading..."; +"genericFontFamily" = "Font Family"; +"genericHighContrastText" = "High Contrast Text"; +"genericFont" = "Font"; +"genericHighlight" = "Highlight"; +"labelsGeneric" = "标签"; +"emailsGeneric" = "电子邮件"; +"subscriptionsGeneric" = "订阅"; +"textToSpeechGeneric" = "文章转语音"; +"privacyPolicyGeneric" = "隐私策略"; +"termsAndConditionsGeneric" = "条款与条件"; +"feedbackGeneric" = "反馈"; +"manageAccountGeneric" = "管理帐户"; +"logoutGeneric" = "退出登陆"; +"doneGeneric" = "完成"; +"cancelGeneric" = "取消"; +"inboxGeneric" = "收集箱"; +"readLaterGeneric" = "稍后阅读"; +"newslettersGeneric" = "新闻稿件"; +"allGeneric" = "全部"; +"archivedGeneric" = "存档"; +"highlightedGeneric" = "荧光笔"; +"filesGeneric" = "文件"; +"newestGeneric" = "最新"; +"oldestGeneric" = "最早"; +"recentlyReadGeneric" = "最近阅读"; +"recentlyPublishedGeneric" = "最近发布"; +"clubsGeneric" = "读书俱乐部"; +"errorGeneric" = "哦!出现了小问题,请您重试."; +"pushNotificationsGeneric" = "推送通知"; +"dismissButton" = "撤回"; +"errorNetwork" = "我们在连接到互联网时遇到问题."; diff --git a/apple/Resources/zh-Hans.lproj/LaunchScreen.strings b/apple/Resources/zh-Hans.lproj/LaunchScreen.strings index 9f9a352a9..8b1378917 100644 --- a/apple/Resources/zh-Hans.lproj/LaunchScreen.strings +++ b/apple/Resources/zh-Hans.lproj/LaunchScreen.strings @@ -1,43 +1 @@ -"labels.generic" = "标签"; -"emails.generic" = "电子邮件"; -"subscriptions.generic" = "订阅"; -"textToSpeech.generic" = "文章转语音"; -"privacy.policy.generic" = "隐私策略"; -"termsAndConditions.generic" = "条款与条件"; -"feedback.generic" = "反馈"; -"manageAccount.generic" = "管理帐户"; -"logout.generic" = "注销"; -"done.generic" = "完成"; -"cancel.generic" = "取消"; -"inbox.generic" = "收集箱"; -"readLater.generic" = "稍后阅读"; -"newsletters.generic" = "新闻通讯"; -"all.generic" = "全部"; -"archived.generic" = "存档"; -"highlighted.generic" = "荧光笔"; -"files.generic" = "文件"; -"newest.generic" = "最新"; -"oldest.generic" = "最早"; -"recentlyRead.generic" = "最近阅读"; -"recentlyPublished.generic" = "最近发布"; -"create.label.message" = "创建新标签"; -"create.new.email.message" = "创建新的电子邮件地址"; -"newsletters.description" = "将 PDF 添加到您的书库,或使用 Omnivore 电子邮件地址订阅新闻通讯."; -"labels.purpose.description" = "使用标签创建精选的链接集合."; -"no.current.subscriptions.message" = "您当前没有订阅."; -"signInScreenHeadline" = "保存并分享喜爱的网页."; -"googleAuthButton" = "使用Google账号"; -"registrationViewSignInHeadline" = "登录"; -"registrationViewSignUpHeadline" = "注册"; -"registrationViewHeadline" = "青衿之志,履践致远。"; -"username.validation.error.invalidPattern" = "用户名中间只能包含字母、数字和下划线."; -"username.validation.error.tooshort" = "用户名应至少包含三个英文字符."; -"username.validation.error.toolong" = "用户名不能超过 15 个英文字符."; -"error.network" = "我们在连接到互联网时遇到问题."; -"error.generic" = "噢!出现了小问题,请您重试."; -"extensionAppUnauthorized" = "请在保存您的第一个链接之前从应用程序登录 Omnivore."; -"loginError.invalidCreds" = "提供的登录凭据无效."; -"saveArticleSavingState" = "保存中..."; -"saveArticleSavedState" = "已保存到 Omnivore 中"; -"saveArticleProcessingState" = "正在保存到 Omnivore 中"; -"dismissButton" = "撤回"; +