993 lines
62 KiB
Plaintext
993 lines
62 KiB
Plaintext
/* OSGKeyboard · English localization (development language) */
|
||
|
||
"OSGKeyboard" = "OSGKeyboard";
|
||
|
||
/* Onboarding */
|
||
"onboarding.progress" = "Step %1$d of %2$d";
|
||
"onboarding.welcome.tagline" = "Speak it. It’s typed.";
|
||
"onboarding.permission.preface" = "iOS will ask for microphone and speech recognition next.";
|
||
"onboarding.permission.mic.title" = "Microphone";
|
||
"onboarding.permission.mic.body" = "Records your voice.";
|
||
/* Pre-system prompt CTA — use Next/Continue, never Allow (App Store 5.1.1(iv)). */
|
||
"onboarding.permission.mic.allow" = "Next";
|
||
"onboarding.permission.mic.deniedHint" = "Open Settings to enable, or tap Next to set up later.";
|
||
"onboarding.permission.speech.title" = "Speech Recognition";
|
||
"onboarding.permission.speech.body" = "Turns your voice into text.";
|
||
"onboarding.permission.speech.allow" = "Next";
|
||
"onboarding.permission.speech.deniedHint" = "Open Settings to enable, or tap Next to set up later.";
|
||
"onboarding.permission.openSettings" = "Open Settings";
|
||
"onboarding.permission.status.undetermined" = "Not requested yet";
|
||
"onboarding.permission.status.granted" = "Allowed";
|
||
"onboarding.permission.status.denied" = "Denied";
|
||
"legal.privacyPolicy" = "Privacy Policy";
|
||
"onboarding.enable.title" = "Add Keyboard";
|
||
"onboarding.enable.fullAccessNote" = "Turn on Allow Full Access so the mic can work.";
|
||
"onboarding.enable.step1" = "Settings → General → Keyboard → Add New Keyboard";
|
||
"onboarding.enable.step2" = "Select OSGKeyboard and enable Allow Full Access";
|
||
"onboarding.enable.step3.prefix" = "Hold ";
|
||
"onboarding.enable.step3.suffix" = "and select OSGKeyboard";
|
||
"onboarding.enable.openSettings" = "Open Settings";
|
||
"onboarding.enable.resources.preparing" = "Preparing Chinese input resources…";
|
||
"onboarding.enable.resources.ready" = "Chinese input resources ready";
|
||
"onboarding.enable.resources.failed" = "Could not prepare Chinese input resources";
|
||
"onboarding.enable.resources.retry" = "Retry";
|
||
"onboarding.api.title" = "Choose Engine";
|
||
"onboarding.api.localModels.hint" = "Local engine uses on-device speech recognition. Add an API key below to enable AI polish.";
|
||
"onboarding.polish.title" = "Text polish (LLM)";
|
||
"onboarding.polish.subtitle" = "Cleans up the transcript after recognition. Can differ from the ASR provider.";
|
||
"onboarding.polish.localHint" = "Fill in an API key to enable AI polish. Without a key, raw ASR text is inserted.";
|
||
"onboarding.experience.intro.eyebrow" = "AI AGENT VOICE KEYBOARD";
|
||
"onboarding.experience.intro.title" = "Speak. It’s written.";
|
||
"onboarding.experience.intro.subtitle" = "The best voice keyboard, with your best personal AI Agent.";
|
||
"onboarding.experience.intro.action" = "Get Started";
|
||
"onboarding.experience.promise.voice.title" = "Smart voice keyboard";
|
||
"onboarding.experience.promise.voice.body" = "Type 6× faster with multiple polishing styles.";
|
||
"onboarding.experience.promise.agent.title" = "Personal AI Agent";
|
||
"onboarding.experience.promise.agent.body" = "Translate, summarize, and learn your tone to write smart replies.";
|
||
"onboarding.experience.promise.privacy.title" = "Privacy protected";
|
||
"onboarding.experience.promise.privacy.body" = "Bring your own AI API key and stay in control of your privacy.";
|
||
"onboarding.experience.permissions.title" = "Let us hear you";
|
||
"onboarding.experience.permissions.subtitle" = "Voice input needs microphone and speech recognition access. Two system prompts will appear next.";
|
||
"onboarding.experience.permissions.systemHint" = "These permissions are used only when you start voice input.";
|
||
"onboarding.experience.permissions.later" = "Set Up Later";
|
||
"onboarding.experience.keyboard.title" = "Add the keyboard";
|
||
"onboarding.experience.keyboard.subtitle" = "Add the keyboard in iOS Settings and turn on Allow Full Access.";
|
||
"onboarding.experience.keyboard.ready" = "OSGKeyboard and Full Access are ready";
|
||
"onboarding.experience.keyboard.fullAccess" = "Full Access connects the keyboard to the host app microphone and optional AI services";
|
||
"onboarding.experience.keyboard.openAgain" = "Open Settings Again";
|
||
"onboarding.experience.keyboard.practiceAction" = "Try It Now";
|
||
"onboarding.experience.keyboard.previewTitle" = "Keyboards";
|
||
"onboarding.experience.keyboardSwitch.title" = "Switch keyboards";
|
||
"onboarding.experience.keyboardSwitch.subtitle" = "Once the keyboard is active, we’ll automatically verify Full Access.";
|
||
"onboarding.experience.keyboardSwitch.instruction" = "Tap the field below, hold the globe key, then choose OSGKeyboard.";
|
||
"onboarding.experience.keyboardSwitch.placeholder" = "Switch and verify the keyboard here";
|
||
"onboarding.experience.keyboardSwitch.waiting" = "Waiting for OSGKeyboard…";
|
||
"onboarding.experience.keyboardSwitch.ready" = "OSGKeyboard and Full Access are verified";
|
||
"onboarding.experience.keyboardSwitch.fullAccessMissing" = "OSGKeyboard appeared, but Full Access has not been detected";
|
||
"onboarding.experience.keyboardSwitch.timeout" = "OSGKeyboard has not appeared yet. Make sure you switched keyboards.";
|
||
"onboarding.experience.keyboardSwitch.checkSettings" = "Check Full Access in Settings";
|
||
"onboarding.experience.keyboardSwitch.waitingAction" = "Waiting for Verification";
|
||
"onboarding.experience.practice.skip" = "Skip for Now";
|
||
"onboarding.experience.practice.translateSample" = "我明天下午到,到了以后给你消息。";
|
||
"onboarding.experience.practice.replySample" = "I’ll arrive tomorrow afternoon and message you when I’m there.";
|
||
"onboarding.experience.practice.editorTitle" = "New Message";
|
||
"onboarding.experience.practice.permissionsTitle" = "Enable voice access";
|
||
"onboarding.experience.practice.permissionsSubtitle" = "Go back to finish permission setup, then try your first voice input.";
|
||
"onboarding.experience.practice.switchTitle" = "Switch keyboards";
|
||
"onboarding.experience.practice.switchSubtitle" = "Tap the field below, hold the globe key, then choose OSGKeyboard.";
|
||
"onboarding.experience.practice.fullAccessTitle" = "Enable Full Access";
|
||
"onboarding.experience.practice.fullAccessSubtitle" = "OSGKeyboard is enabled. Turn on Allow Full Access to use voice input.";
|
||
"onboarding.experience.practice.fullAccessAction" = "Turn On Full Access";
|
||
"onboarding.experience.practice.cloudTitle" = "Start the trial";
|
||
"onboarding.experience.practice.cloudSubtitle" = "All four lessons work without an account or credits.";
|
||
"onboarding.experience.practice.cloudBody" = "Speech is transcribed on-device. Only the transcript, lesson sample, and question needed for these exercises are sent to OSG managed AI. The anonymous lesson credential expires when onboarding ends.";
|
||
"onboarding.experience.practice.cloudAction" = "Agree & Start";
|
||
"onboarding.experience.practice.creditsTitle" = "Getting ready";
|
||
"onboarding.experience.practice.creditsSubtitle" = "Verifying the app and obtaining a short-lived, restricted lesson credential.";
|
||
"onboarding.experience.practice.preparingCredits" = "Securely connecting to OSG AI…";
|
||
"onboarding.experience.practice.creditsFailed" = "The anonymous trial is temporarily unavailable. Check your connection and try again. You will not be charged.";
|
||
"onboarding.experience.practice.retry" = "Try Again";
|
||
"onboarding.experience.practice.progress.voice" = "1 of 4 · Voice Input";
|
||
"onboarding.experience.practice.progress.translate" = "2 of 4 · AI Translation";
|
||
"onboarding.experience.practice.progress.reply" = "3 of 4 · AI Reply";
|
||
"onboarding.experience.practice.progress.askAI" = "4 of 4 · Ask AI";
|
||
"onboarding.experience.practice.speakTitle" = "Read this aloud";
|
||
"onboarding.experience.practice.speakSubtitle" = "Tap the keyboard microphone, read the sentence below, then tap it again.";
|
||
"onboarding.experience.practice.readAloud" = "Read aloud";
|
||
"onboarding.experience.practice.voiceSample" = "Today is Thursday. Where are you planning to go for fun?";
|
||
"onboarding.experience.practice.translateTitle" = "Try Translate";
|
||
"onboarding.experience.practice.translateSubtitle" = "Copy the Chinese sample, translate it into English in OSGKeyboard, then insert the result.";
|
||
"onboarding.experience.practice.replyTitle" = "Try Reply";
|
||
"onboarding.experience.practice.replySubtitle" = "Copy the sample below, tap Reply in the keyboard, then insert the generated response.";
|
||
"onboarding.experience.practice.askAITitle" = "Ask AI";
|
||
"onboarding.experience.practice.askAISubtitle" = "Hold the keyboard microphone and ask a question. Tap it again to stop recording and wait for the answer, then insert the result.";
|
||
"onboarding.experience.practice.askAIPrompt" = "Try asking: “What’s in the news today?”";
|
||
"onboarding.experience.practice.copyAction" = "Copy Sample";
|
||
"onboarding.experience.practice.copied" = "Copied. Switch to OSGKeyboard.";
|
||
"onboarding.experience.practice.waiting" = "Waiting for you to complete this step in the keyboard…";
|
||
"onboarding.experience.login.title" = "Sign in for 1,000 credits";
|
||
"onboarding.experience.login.subtitle" = "Sign in for free credits and start using AI without an API key.";
|
||
"onboarding.experience.login.body" = "Register for the first time to get free credits, then invite friends to earn more.";
|
||
"onboarding.experience.login.skip" = "Not Now";
|
||
"onboarding.experience.login.signedIn" = "Signed in. Your credits are up to date.";
|
||
"onboarding.experience.login.balance %lld" = "Current balance: %lld credits";
|
||
"onboarding.experience.complete.verifiedTitle" = "You’re ready";
|
||
"onboarding.experience.complete.title" = "You’re ready";
|
||
"onboarding.experience.complete.subtitle" = "Tap Start Using";
|
||
"onboarding.experience.complete.dictate" = "Voice to Text";
|
||
"onboarding.experience.complete.translate" = "Translate";
|
||
"onboarding.experience.complete.reply" = "Smart Reply";
|
||
"onboarding.experience.complete.agent" = "Ask AI";
|
||
"onboarding.experience.complete.action" = "Start Using";
|
||
"settings.onboarding.replay" = "Restart permission setup";
|
||
|
||
/* Common navigation */
|
||
"common.back" = "Back";
|
||
"common.next" = "Next";
|
||
"common.done" = "Done";
|
||
"common.continue" = "Continue";
|
||
"common.reset" = "Reset";
|
||
"common.cancel" = "Cancel";
|
||
"common.save" = "Save";
|
||
"common.clear" = "Clear";
|
||
"common.delete" = "Delete";
|
||
"common.space" = "Space";
|
||
"common.newline" = "Return";
|
||
"common.send" = "Send";
|
||
|
||
/* Privacy footnote (onboarding engine page) */
|
||
"privacy.audio.title" = "On-device transcription";
|
||
"privacy.audio.body" = "Powered by the on-device iOS speech engine.";
|
||
"privacy.network.title" = "Automatic text polish";
|
||
"privacy.network.body" = "AI formats and polishes your text automatically.";
|
||
"privacy.universal.title" = "Works everywhere";
|
||
"privacy.universal.body" = "Chat, email, vibe coding — just speak.";
|
||
|
||
/* Home */
|
||
"home.status.ready" = "Ready";
|
||
"home.status.setupIncomplete" = "Setup incomplete";
|
||
"home.hero.label" = "Tap to configure";
|
||
"home.action.enableInSettings" = "Enable in iOS Settings";
|
||
"home.action.editApi" = "Edit API Configuration";
|
||
"home.action.keyboardPreview" = "Keyboard Preview (Debug)";
|
||
"home.action.openSettingsA11y" = "Open OSGKeyboard settings";
|
||
|
||
/* API settings */
|
||
"api.baseUrl" = "Base URL";
|
||
"api.model" = "Model";
|
||
"api.getKey" = "Get an API key";
|
||
"api.key" = "API Key";
|
||
"api.key.placeholder" = "sk-…";
|
||
"api.key.show" = "Show";
|
||
"api.key.hide" = "Hide";
|
||
"api.connection" = "Connection";
|
||
"api.test.idle" = "Test connection";
|
||
"api.test.running" = "Testing…";
|
||
"api.test.success" = "Success · Retry";
|
||
"api.test.failure" = "Failed · Retry";
|
||
"api.test.connected" = "Connected";
|
||
"api.test.missing" = "API key missing";
|
||
"api.test.rateLimited" = "Rate limited (429)";
|
||
"api.test.http" = "HTTP %d";
|
||
"api.test.network" = "Network error";
|
||
"api.test.connectedWith" = "“%@”";
|
||
"api.test.transportWith" = "%@";
|
||
|
||
/* Settings */
|
||
"settings.title" = "Settings";
|
||
"settings.appLanguage.title" = "App language";
|
||
"settings.appLanguage.auto" = "Auto";
|
||
"settings.appLanguage.english" = "English";
|
||
"settings.appLanguage.chinese" = "Chinese";
|
||
"settings.appearance.title" = "Appearance";
|
||
"settings.appearance.system" = "System";
|
||
"settings.appearance.light" = "Light";
|
||
"settings.appearance.dark" = "Dark";
|
||
"settings.reset.title" = "Reset all settings?";
|
||
"settings.reset.message" = "API key, model, base URL, voice history, and cloud consent will be cleared. Clipboard history is kept.";
|
||
"settings.reset.confirm" = "Reset all settings";
|
||
"settings.engine.title" = "Speech Transcription & Polish";
|
||
"settings.aiService.title" = "AI Service";
|
||
"settings.aiService.credits.title" = "Use Credits";
|
||
"settings.aiService.credits.subtitle" = "OSG handles transcription and polishing with your credit balance.";
|
||
"settings.aiService.credits.signIn" = "Sign in above to use OSG credits.";
|
||
"settings.aiService.credits.consent.title" = "Use OSG Managed Cloud Services?";
|
||
"settings.aiService.credits.consent.message" = "When you use credits, voice recordings are sent through OSG's managed gateway to the managed speech provider. Transcripts, nearby cursor context, and AI questions may also be sent through the gateway for polishing or answers. Requests are linked to your OSG account for authorization and credit billing. Local recognition and your own API keys are unaffected.";
|
||
"settings.aiService.credits.consent.accept" = "Agree & Use Credits";
|
||
"settings.aiService.byok.title" = "I Have API Keys";
|
||
"settings.aiService.byok.subtitle" = "Use Apple on-device transcription or your own cloud providers.";
|
||
"settings.asr.apple.title" = "Apple On-Device Recognition";
|
||
"settings.asr.apple.subtitle" = "Private transcription on this device; no ASR key required.";
|
||
"settings.engine.subtitle" = "Local: built-in system transcription. Cloud: ASR transcription with optional LLM polish.";
|
||
"settings.engine.local.title" = "On-device transcription";
|
||
"settings.engine.local.ios26" = "Always on-device, no network.";
|
||
"settings.engine.local.legacy" = "Transcribe with the built-in system speech service";
|
||
"settings.engine.cloud.title" = "Cloud transcription";
|
||
"settings.engine.cloud.subtitle" = "Cloud ASR transcription, with optional LLM polish";
|
||
"settings.engine.cloud.badge" = "Cloud engine";
|
||
"settings.provider.title" = "Provider";
|
||
"settings.provider.personalDictionaryBadge" = "Personal dictionary";
|
||
"settings.provider.streamingBadge" = "Streaming";
|
||
"settings.provider.subtitle" = "Pick the LLM that polishes your dictation.";
|
||
"settings.polishProvider.title" = "Text polish (LLM)";
|
||
"settings.polishProvider.subtitle" = "Cleans up the transcript after recognition. Independent from the ASR provider.";
|
||
"settings.polishApi.title" = "Polish API";
|
||
"settings.asrProvider.title" = "Speech recognition (ASR)";
|
||
"settings.asrProvider.subtitle" = "Transcribes your audio in cloud mode. Can differ from the polish provider.";
|
||
"settings.asrApi.title" = "ASR API";
|
||
"settings.asr.model" = "ASR model";
|
||
"settings.asr.testConnection" = "Test ASR";
|
||
"settings.provider.supplier" = "Provider";
|
||
"settings.provider.tools" = "Connection check";
|
||
"settings.provider.validate" = "Validate";
|
||
"settings.provider.fetchModels" = "Fetch models";
|
||
"settings.provider.loadingModels" = "Loading models…";
|
||
"settings.provider.modelsLoaded" = "%lld models loaded";
|
||
"settings.provider.selectModel" = "Select model";
|
||
"settings.provider.modelSelected" = "Selected %@";
|
||
"settings.provider.modelsEmptyHint" = "Tap refresh to load models";
|
||
"settings.provider.fillDefault" = "Fill default";
|
||
"settings.provider.thinking" = "Thinking";
|
||
"settings.provider.thinkingSubtitle" = "Slower, higher quality — recommended off";
|
||
"settings.provider.thinkingOn" = "On";
|
||
"settings.provider.thinkingOff" = "Off";
|
||
"settings.provider.thinkingHint" = "Off by default. Turn on only when you want slower, deeper reasoning.";
|
||
"settings.provider.note" = "Note";
|
||
"settings.asr.volcengine.appId" = "APP ID";
|
||
"settings.asr.volcengine.accessToken" = "Access Token";
|
||
"settings.asr.volcengine.apiKey" = "API Key";
|
||
"settings.asr.volcengine.apiKeyMode.title" = "Use new API Key";
|
||
"settings.asr.volcengine.apiKeyMode.subtitle" = "API Key for the new console; turn off for APP ID + Token.";
|
||
"settings.asr.volcengine.note.appToken" = "Legacy console: enter APP ID and Access Token. Secret Key is not required. Resource is fixed to Doubao streaming 2.0 (volc.seedasr.sauc.duration).";
|
||
"settings.asr.volcengine.note.apiKey" = "New console: enter only the API Key. Resource is fixed to Doubao streaming 2.0 (volc.seedasr.sauc.duration).";
|
||
"provider.openai" = "OpenAI";
|
||
"provider.deepseek" = "DeepSeek";
|
||
"provider.qwen" = "Qwen (DashScope)";
|
||
"provider.zhipu" = "Zhipu GLM";
|
||
"provider.moonshot" = "Moonshot";
|
||
"provider.mimo" = "Xiaomi MiMo";
|
||
"provider.custom" = "Custom";
|
||
"settings.api.title" = "API";
|
||
"settings.language.title" = "Language";
|
||
"settings.languageAndPolish.title" = "Language & Polish";
|
||
// v0.2.1: translation feature
|
||
"settings.translation.afterPolish" = "Polish then translate";
|
||
"settings.translation.off" = "Don't translate";
|
||
"settings.polishScenario.section" = "Polish";
|
||
"settings.polishScenario.title" = "Scenario";
|
||
"settings.polishScenario.hint" = "Pick a scenario to match how you write. Choose Custom to edit the full system prompt.";
|
||
"settings.polishScenario.customHint" = "Custom scenario: edit the full system prompt below.";
|
||
"settings.languageModels.title" = "Language & models";
|
||
"settings.localModels.title" = "On-device models";
|
||
"settings.localModels.speechRole" = "Speech";
|
||
"settings.localModels.polishRole" = "Polish";
|
||
"settings.localModels.builtIn" = "Built-in";
|
||
"settings.localModels.speechEngine" = "Apple iOS Speech";
|
||
"settings.localModels.polishEngine" = "Settings LLM";
|
||
"settings.localModels.polishNeedsKey" = "Add API key";
|
||
"settings.localModels.allReady" = "Ready";
|
||
"settings.localModels.readiness %lld %lld" = "%lld/%lld ready";
|
||
"settings.localModels.cloudPolish.title" = "Cloud polish after ASR";
|
||
"settings.localModels.cloudPolish.subtitle" = "Sends the transcript to your configured cloud LLM (DeepSeek by default) for cleanup. Enable only when iOS speech recognition struggles — noisy far-field audio, strong accents, etc. Requires a DeepSeek API key.";
|
||
"settings.localEngine.title" = "Local engine";
|
||
"settings.language.subtitle.cloud" = "Recognition language and text processing mode.";
|
||
"settings.language.subtitle.local" = "Recognition language.";
|
||
"settings.mode.title" = "Mode";
|
||
"settings.mode.off" = "Off";
|
||
"settings.mode.transcribe" = "Transcribe";
|
||
"settings.mode.polish" = "Polish";
|
||
"settings.systemPrompt.title" = "System Prompt";
|
||
"settings.systemPrompt.edit" = "Edit system prompt";
|
||
"settings.systemPrompt.hint" = "Used by the cloud LLM when polishing your dictation. Local engine skips this step.";
|
||
"settings.about.title" = "About";
|
||
"settings.version.title" = "Version";
|
||
"settings.diagnostics.title" = "Startup Diagnostics";
|
||
"settings.diagnostics.section" = "Saved Reports";
|
||
"settings.diagnostics.count" = "%d startup failure reports";
|
||
"settings.diagnostics.empty" = "No startup failures have been saved.";
|
||
"settings.diagnostics.latest" = "Latest: %@";
|
||
"settings.diagnostics.export" = "Export Diagnostic Logs";
|
||
"settings.diagnostics.clear" = "Clear Diagnostic Logs";
|
||
"settings.diagnostics.clear.title" = "Clear diagnostic logs?";
|
||
"settings.diagnostics.clear.message" = "This permanently removes all saved Flow startup failure reports from this device.";
|
||
"settings.diagnostics.clear.confirm" = "Clear Logs";
|
||
"settings.diagnostics.corpus.section" = "Personal Style Training Corpus";
|
||
"settings.diagnostics.corpus.count" = "%d eligible samples · %d effective characters";
|
||
"settings.diagnostics.corpus.empty" = "No eligible paired dictations are available.";
|
||
"settings.diagnostics.corpus.ready" = "Newest complete samples through the 2,500-character target.";
|
||
"settings.diagnostics.corpus.export" = "Export Training Corpus";
|
||
"settings.diagnostics.corpus.privacy" = "Contains dictated text and prior polish prompts. Nothing is uploaded automatically. Share only with trusted devices or services.";
|
||
"settings.diagnostics.privacy.section" = "Privacy";
|
||
"settings.diagnostics.privacy.body" = "Reports stay on this device until you export or clear them. They include startup state, timings, error codes, and memory usage, but never audio, transcripts, clipboard content, prompts, API keys, or account identifiers.";
|
||
"releaseNotes.title" = "What's New";
|
||
"releaseNotes.openHint" = "View release notes for this version";
|
||
"releaseNotes.unavailable.title" = "Cannot load page";
|
||
"releaseNotes.unavailable.message" = "Release notes could not be opened. Check your network connection and try again.";
|
||
"settings.daily.title" = "Daily";
|
||
"settings.config.title" = "Configuration";
|
||
"settings.general.title" = "General";
|
||
"settings.general.appearanceLanguage.title" = "Appearance & Language";
|
||
"settings.general.keyboard.title" = "Keyboard & Gestures";
|
||
"settings.general.sync.title" = "Sync";
|
||
"settings.aiAgent.title" = "AI Agent";
|
||
"settings.aiAgent.responseLength.section" = "Answers";
|
||
"settings.aiAgent.responseLength.title" = "Response length";
|
||
"settings.aiAgent.multipleReplies.title" = "Provide multiple replies";
|
||
"settings.aiAgent.multipleReplies.description" = "Show several natural reply options when using Reply.";
|
||
"settings.clipboard.title" = "Clipboard";
|
||
"settings.clipboard.section" = "Features";
|
||
"settings.clipboard.subtitle.on" = "On";
|
||
"settings.clipboard.subtitle.off" = "Off";
|
||
"settings.clipboard.history.title" = "History";
|
||
"settings.clipboard.history.footer" = "Keeps up to 15 copied text items on this device. Off by default.";
|
||
"settings.clipboard.candidate.title" = "Suggestion strip";
|
||
"settings.clipboard.candidate.footer" = "Shows your latest copy above the keyboard. Tap to insert.";
|
||
"settings.clipboard.paste.section" = "System access";
|
||
"settings.clipboard.paste.body" = "Allows clipboard skills to read text you copy.";
|
||
"settings.clipboard.paste.request" = "Verify Paste Access";
|
||
"settings.clipboard.paste.verified" = "Verified";
|
||
"settings.clipboard.paste.open" = "Open iOS Settings";
|
||
"settings.clipboard.storage.section" = "Local history";
|
||
"settings.clipboard.storage.body" = "Clipboard history and reply choices stay on this device and do not sync through iCloud. Reply choices are sent to your selected AI only when you explicitly relearn a personal style. Turning History off keeps saved items.";
|
||
"clipboard.paste.noText.title" = "Copy text first";
|
||
"clipboard.paste.noText.message" = "Copy a short piece of text, then try again.";
|
||
"settings.clipboard.clear.button" = "Clear clipboard history";
|
||
"settings.clipboard.clear.title" = "Clear clipboard history?";
|
||
"settings.clipboard.clear.message" = "This permanently removes all saved clipboard items and reply choices from this device. This cannot be undone.";
|
||
"settings.clipboard.clear.confirm" = "Clear history";
|
||
"settings.typingInput.title" = "Pinyin Input";
|
||
"settings.typingInput.default.title" = "Default Input";
|
||
"settings.typingInput.default.description" = "Used when the keyboard opens";
|
||
"settings.typingInput.default.mode.voice" = "Voice";
|
||
"settings.typingInput.default.mode.pinyin" = "Pinyin";
|
||
"settings.typingInput.default.mode.english" = "English";
|
||
"settings.typingInput.rememberLast.title" = "Remember Last Choice";
|
||
"settings.typingInput.rememberLast.description" = "Restore last surface on reopen";
|
||
"settings.typingInput.schema.section" = "Input Method";
|
||
"settings.typingInput.schema.picker" = "Pinyin Scheme";
|
||
"typing.schema.fullPinyin" = "Full Pinyin";
|
||
"typing.schema.microsoftDoublePinyin" = "Microsoft Shuangpin";
|
||
"typing.schema.sogouDoublePinyin" = "Sogou Shuangpin";
|
||
"settings.typingInput.fuzzy.section" = "Fuzzy Pinyin";
|
||
"settings.typingInput.fuzzy.footer" = "All off by default. Enable only the pairs you need to avoid noisy candidates.";
|
||
"settings.typingInput.resources.section" = "Input Resources";
|
||
"settings.typingInput.resources.status" = "Status";
|
||
"settings.typingInput.resources.ready" = "Ready";
|
||
"settings.typingInput.resources.pending" = "Not initialized";
|
||
"settings.typingInput.resources.redeploy" = "Redeploy Input Resources";
|
||
"settings.typingInput.habits.clear" = "Clear Typing Habits";
|
||
"settings.typingInput.habits.clear.title" = "Clear Typing Habits?";
|
||
"settings.typingInput.habits.clear.confirm" = "Clear";
|
||
"settings.typingInput.habits.clear.message" = "Resets learned word order for Chinese and English. Personal dictionary entries are kept.";
|
||
"settings.typingInput.habits.footer" = "Learned frequency only. Words you added to the personal dictionary stay.";
|
||
"settings.speechRecognition.title" = "Speech Recognition";
|
||
"settings.textPolish.title" = "Text Polish";
|
||
"settings.preferences.title" = "Preferences";
|
||
"settings.dictionaryAndPolish.title" = "Dictionary & polish";
|
||
"settings.polishPreferences.title" = "Polish preferences";
|
||
"settings.handedness.title" = "Handedness";
|
||
"settings.handedness.left" = "Left hand";
|
||
"settings.handedness.right" = "Right hand";
|
||
"settings.keyboardHaptic.title" = "Key Haptics";
|
||
"settings.keyboardHaptic.off" = "Off";
|
||
"settings.keyboardHaptic.light" = "Light";
|
||
"settings.keyboardHaptic.strong" = "Strong";
|
||
"settings.systemPrompt.reset" = "Reset";
|
||
"settings.asrLocale" = "ASR locale";
|
||
"settings.engineBadge.ios26" = "SpeechAnalyzer — always on-device";
|
||
"settings.engineRow.title" = "Recognition engine";
|
||
"settings.onDeviceOnly.title" = "On-device only";
|
||
"settings.onDeviceOnly.body" = "Disable cloud fallback. The keyboard reports an error instead of going online.";
|
||
"settings.legend.onDevice" = "On-device";
|
||
"settings.legend.cloudFallback" = "Cloud fallback";
|
||
"settings.privacy.title" = "Privacy";
|
||
"settings.privacy.policy" = "Privacy Policy";
|
||
"settings.privacy.fullAccess.title" = "About Full Access";
|
||
"settings.privacy.fullAccess.body" = "Full Access is required for the microphone and to read your API key. OSGKeyboard does not record or upload what you type with the keyboard.";
|
||
"settings.privacy.cloud.body" = "With your own API key, cloud requests go directly to the provider you configure. When you choose OSG credits, audio and text requests go through OSG's managed gateway to the managed provider.";
|
||
"settings.privacy.cloud.alert.title" = "Cloud processing sends data off-device";
|
||
"settings.privacy.cloud.alert.message" = "The selected cloud path sends voice recordings and relevant text off-device for transcription, polishing, or AI answers. User-configured requests go directly to that provider; managed-credit requests go through OSG's managed gateway.";
|
||
"settings.link.support" = "Help & Feedback";
|
||
"settings.link.github" = "GitHub";
|
||
"settings.support.footer" = "OSGKeyboard is open source. Report bugs and share ideas on GitHub.";
|
||
"settings.support.intro" = "The fastest way to get help or send feedback is to open a GitHub issue. We read every report.";
|
||
"settings.support.issuesHint" = "Search existing issues first. For bugs, include your iOS version, engine mode (local or cloud), and steps to reproduce.";
|
||
"settings.support.openIssues" = "Open GitHub Issues";
|
||
"settings.support.unavailable.title" = "Cannot load page";
|
||
"settings.support.unavailable.message" = "GitHub Issues could not be opened. Check your network connection and try again.";
|
||
"settings.link.licenses" = "Third-Party Licenses";
|
||
"settings.link.models" = "On-device models";
|
||
"settings.models.link.subtitle" = "Download source, models, and storage";
|
||
"settings.licenses.title" = "Third-Party Licenses";
|
||
"settings.licenses.footer" = "Open-source components used by OSGKeyboard. License texts are reproduced from upstream repositories; model weights are downloaded at runtime and cached on device. OSGKeyboard itself is source-available — commercial licensing: rocky.hk@gmail.com.";
|
||
|
||
/* On-device models manager (settings → "On-device models") */
|
||
"settings.models.title" = "On-device models";
|
||
"settings.models.intro.title" = "Run speech recognition entirely on your iPhone";
|
||
"settings.models.intro.body" = "Download the Qwen3-ASR model before using local recognition. Files are cached in this app's storage and can be deleted anytime.";
|
||
"settings.models.mirror.title" = "Download source";
|
||
"settings.models.source.modelScope" = "ModelScope";
|
||
"settings.models.source.huggingface" = "Hugging Face";
|
||
"settings.models.action.downloadSize %@" = "Download - %@";
|
||
"settings.models.action.deleteSize %@" = "Delete - %@";
|
||
"settings.models.action.downloadingPercent %lld" = "%lld%%";
|
||
"settings.models.status.notDownloaded" = "Not downloaded";
|
||
"settings.models.status.downloading" = "Downloading…";
|
||
"settings.models.status.downloadingPercent %lld" = "Downloading… %lld%%";
|
||
"settings.models.status.downloaded" = "Downloaded";
|
||
"settings.models.status.failed" = "Download failed";
|
||
"settings.models.action.download" = "Download";
|
||
"settings.models.action.cancel" = "Cancel";
|
||
"settings.models.action.cancelDownload" = "Cancel download";
|
||
"settings.models.action.delete" = "Delete";
|
||
|
||
/* Local ASR backend picker (local engine mode) */
|
||
"asr.backend.speechAnalyzer.label" = "iOS SpeechAnalyzer";
|
||
"asr.backend.speechAnalyzer.blurb" = "Built into iOS 26, always on-device, lowest latency.";
|
||
"asr.backend.speechAnalyzer.hint" = "No download required.";
|
||
"asr.backend.qwen3.label" = "Qwen3-ASR 0.6B (CoreML)";
|
||
"asr.backend.qwen3.blurb" = "Stronger on Chinese dialects and noisy audio. ~1.6 GB CoreML model, works in background.";
|
||
"asr.backend.qwen3.downloadHint" = "Download the CoreML model in the section above before dictating.";
|
||
"asr.error.modelNotDownloaded" = "Qwen3-ASR is not downloaded yet. Download it from On-device models in Settings.";
|
||
"asr.error.unsupportedOS" = "Qwen3-ASR CoreML requires iOS 18 or later. Use iOS SpeechAnalyzer or switch to a cloud engine.";
|
||
|
||
/* App group error */
|
||
"appGroup.error.title" = "App Group not configured";
|
||
"appGroup.error.body" = "OSGKeyboard needs an App Group to share config between the main app and the keyboard extension.";
|
||
"appGroup.error.step1" = "Create group.com.osgkeyboard.shared in the Apple Developer portal";
|
||
"appGroup.error.step2" = "Enable it for both the main app and the keyboard extension";
|
||
"appGroup.error.step3" = "Re-generate the provisioning profile and download it";
|
||
|
||
/* Keyboard preview */
|
||
"preview.title" = "Keyboard Preview";
|
||
"preview.subtitle" = "Tap Start/Stop Recording to test here. On the real keyboard, tap the mic disc to dictate.";
|
||
"preview.placeholder" = "Type here or tap the record button";
|
||
"preview.placeholder" = "Type here or tap the record button";
|
||
"preview.clear" = "Clear text";
|
||
"preview.openSettingsA11y" = "Open OSGKeyboard settings";
|
||
"preview.openSettings" = "Settings";
|
||
"preview.record.start" = "Start Recording";
|
||
"preview.record.stop" = "Stop Recording";
|
||
"preview.status.field" = "Text field";
|
||
"preview.status.recording" = "Recording…";
|
||
"preview.status.processing" = "Transcribing…";
|
||
|
||
/* Dictation handoff */
|
||
"dictation.title" = "Voice Input";
|
||
"dictation.status.ready" = "Ready to record…";
|
||
"dictation.status.listening" = "Listening…";
|
||
"dictation.status.listeningLive" = "Live transcription…";
|
||
"dictation.status.processing" = "Processing…";
|
||
"dictation.status.requestingPermission" = "Requesting permission…";
|
||
"dictation.status.waitingResult" = "Waiting for transcription…";
|
||
"dictation.status.saving" = "Saving…";
|
||
"preview.modeChip.cycle" = "Cycle input mode";
|
||
"preview.localeChip.cycle" = "Cycle recognition language";
|
||
"preview.error.audioSession" = "Audio session error: %@";
|
||
"preview.error.micUnavailable" = "Microphone unavailable (hw format %.0f Hz / %d ch)";
|
||
"preview.error.formatCreate" = "Failed to create 16 kHz audio format.";
|
||
"preview.error.converterCreate" = "Failed to create audio converter.";
|
||
"preview.error.engineStart" = "Engine start failed: %@";
|
||
|
||
/* Keyboard (ext) */
|
||
"keyboard.placeholder.idle" = "Tap to talk";
|
||
"keyboard.placeholder.preparing" = "Preparing";
|
||
"keyboard.placeholder.processing" = "Processing";
|
||
"keyboard.placeholder.error" = "Polishing failed";
|
||
"keyboard.rec" = "REC";
|
||
"keyboard.space" = "Space";
|
||
"keyboard.denied.mic" = "Mic denied";
|
||
"keyboard.denied.speech" = "Speech denied";
|
||
"keyboard.openSettingsA11y" = "Open OSGKeyboard settings";
|
||
"keyboard.deniedHint" = "Opens the OSGKeyboard settings page where you can grant microphone or speech recognition access.";
|
||
"keyboard.tapToTalkA11y" = "Tap to talk";
|
||
|
||
/* Mode chip labels (used in both ext + preview stub) */
|
||
"mode.off" = "Off";
|
||
"mode.transcribe" = "Transcribe";
|
||
"mode.polish" = "Polish";
|
||
|
||
/* Locale chip labels (preview stub) */
|
||
"locale.zh-Hans" = "ZH-Hans";
|
||
|
||
/* Locale menu items (settings) */
|
||
"locale.auto" = "Auto";
|
||
"locale.zh-Hans" = "Chinese (Simplified)";
|
||
"locale.zh-Hant" = "Chinese (Traditional)";
|
||
"locale.en-US" = "English (US)";
|
||
"locale.ja-JP" = "Japanese";
|
||
"locale.ko-KR" = "Korean";
|
||
|
||
/* Flow session */
|
||
"flow.error.noSpeech" = "No speech detected. Please try again.";
|
||
"flow.error.recognitionInterrupted" = "Recognition did not finish. Please try again.";
|
||
"keyboard.denied.mic" = "Microphone access denied";
|
||
"keyboard.denied.speech" = "Speech recognition denied";
|
||
|
||
/* Home · Flow session */
|
||
"home.flow.active" = "Voice session active";
|
||
"home.flow.label" = "Ready";
|
||
"home.flow.inactive" = "Voice session inactive";
|
||
"home.flow.notReady" = "Not ready";
|
||
"home.flow.recording" = "Recording…";
|
||
"home.flow.processing" = "Processing…";
|
||
"home.flow.hint" = "Switch to any app and tap the keyboard mic to dictate.";
|
||
"home.setup.permission.mic" = "Microphone access is off — voice input won't work.";
|
||
"home.setup.permission.speech" = "Speech recognition is off — voice input won't work.";
|
||
"home.setup.permission.both" = "Microphone and speech recognition are off — voice input won't work.";
|
||
"home.setup.permission.request" = "Next";
|
||
"home.setup.cloudIncomplete" = "Cloud recognition and AI polish need API keys.";
|
||
"home.setup.polishKeyMissing" = "Add an API key to enable AI polish. Without it, local dictation still inserts raw recognized text.";
|
||
"home.setup.byok.configure" = "Configure API Key";
|
||
"home.setup.credits.alternative" = "Or use OSG credits for transcription and AI without managing API keys.";
|
||
"home.setup.credits.open" = "Use Credits";
|
||
"home.setup.keyboardHint" = "Don't see OSGKeyboard? Add it in iOS Settings.";
|
||
"home.setup.keyboardHint.dismiss" = "Got it";
|
||
"home.flow.starting" = "Starting voice session…";
|
||
"home.flow.preparingProgress" = "Preparing background session (%d/%d)…";
|
||
"home.flow.recoveringProgress" = "Restoring background session (%d/%d)…";
|
||
"home.flow.waitingForForeground" = "Background session paused — reopen this app to restore it";
|
||
"home.flow.recoveryFailed" = "Background session needs attention";
|
||
"home.flow.retry" = "Retry";
|
||
"home.flow.openSettings" = "Open Settings to grant permissions";
|
||
"home.flow.start" = "Start voice session";
|
||
"home.flow.end" = "End voice session";
|
||
"home.flow.endShort" = "End";
|
||
"home.flow.startShort" = "Start";
|
||
"home.preview.label" = "Try typing";
|
||
"home.preview.placeholder" = "Tap to type and test…";
|
||
"home.card.history.empty" = "No voice transcripts yet";
|
||
"home.card.dictionary.empty" = "No words yet";
|
||
"home.card.dictionary.smart.subtitle" = "Frequently used new terms discovered from your typing";
|
||
"home.card.dictionary.smart.empty" = "No recommended terms yet";
|
||
"home.card.dictionary.smart.addHint" = "Tap to add frequently used terms to your personal dictionary";
|
||
"home.card.dictionary.smart.accessibilityHint" = "Used %lld times. Double-tap to add it to your personal dictionary.";
|
||
"home.card.dictionary.confirm.title" = "Add “%@” to your personal dictionary?";
|
||
"home.card.dictionary.confirm.message" = "You’ve used this term %lld times. Once added, it will also improve speech recognition and AI polishing.";
|
||
"home.card.dictionary.confirm.add" = "Add to dictionary";
|
||
"home.wide.tagline.subtitle" = "Switch to any app and tap the keyboard mic to dictate.";
|
||
"home.wide.mode.cloud" = "Cloud";
|
||
"home.wide.mode.local" = "On-device";
|
||
"home.wide.devices" = "iPhone & iPad";
|
||
"home.engine.unsupportedOS" = "Qwen3-ASR CoreML requires iOS 18+";
|
||
"home.engine.warming" = "Loading ASR model into memory…";
|
||
"home.engine.downloading" = "Downloading ASR model…";
|
||
"home.engine.loadFailed" = "Model downloaded but failed to load. Restart the app and try again.";
|
||
"home.engine.modelsReady" = "ASR model ready";
|
||
"home.engine.setupRequired" = "Local ASR model not ready";
|
||
"home.engine.downloadFirst" = "Download the local ASR model in Settings first";
|
||
"home.engine.attentionBanner" = "Local ASR model is not ready yet. Download it and wait for warm-up before dictating.";
|
||
|
||
/* Tabs */
|
||
"tab.keyboard" = "Home";
|
||
"tab.history" = "History";
|
||
"tab.dictionary" = "Dictionary";
|
||
"tab.styles" = "Styles";
|
||
"tab.skills" = "Skills";
|
||
"tab.settings" = "Settings";
|
||
|
||
/* AI Agent skills */
|
||
"skills.title" = "Skills";
|
||
"skills.installed.section" = "Installed (%d)";
|
||
"skills.installed.empty" = "No installed skills.";
|
||
"skills.uninstalled.section" = "Not installed";
|
||
"skills.clipboard.guide.title" = "Enable clipboard skills";
|
||
"skills.clipboard.guide.body" = "Copy text to summarize, translate, or extract actions from it.";
|
||
"skills.clipboard.guide.enableHistory" = "Turn On Clipboard History";
|
||
"skills.clipboard.guide.verify.title" = "One more step";
|
||
"skills.clipboard.guide.verify.body" = "Allow OSGKeyboard to read text you copy.";
|
||
"skills.clipboard.guide.verify.action" = "Verify Paste Access";
|
||
"skills.clipboard.guide.recovery.title" = "Paste access is off";
|
||
"skills.clipboard.guide.recovery.body" = "Allow Paste from Other Apps in iOS Settings, then return to verify.";
|
||
"skills.clipboard.guide.success.title" = "Clipboard skills are ready";
|
||
"skills.clipboard.guide.success.body" = "Copy text to use them from the keyboard.";
|
||
"skills.clipboard.guide.openSystemSettings" = "Open iOS Settings";
|
||
"skills.detail.title" = "Skill";
|
||
"skills.badge.default" = "Default skill";
|
||
"skills.action.install" = "Install";
|
||
"skills.action.uninstall" = "Uninstall";
|
||
"skills.action.reinstallShortcut" = "Reinstall Shortcut";
|
||
"skills.reply.name" = "Reply";
|
||
"skills.reply.description" = "Understand the copied text and reply naturally in its primary language.";
|
||
"skills.playfulReply.name" = "Playful reply";
|
||
"skills.playfulReply.description" = "Reply with a short, witty joke that stays kind and appropriate.";
|
||
"skills.replyInSourceLanguage.name" = "Reply";
|
||
"skills.replyInSourceLanguage.description" = "Understand the copied text and reply naturally in the same language.";
|
||
"skills.summarize.name" = "Summarize key points";
|
||
"skills.summarize.description" = "Summarize the content and extract facts, decisions, conclusions, and next steps when present.";
|
||
"skills.openLink.name" = "Open Link";
|
||
"skills.openLink.description" = "Open the single copied web link in your default browser.";
|
||
"skills.summarizeWebPage.name" = "Summarize Webpage";
|
||
"skills.summarizeWebPage.description" = "Securely extract the public webpage text, then summarize its key facts and conclusions.";
|
||
"skills.callPhone.name" = "Call Number";
|
||
"skills.callPhone.description" = "Call the single phone number detected in the copied text.";
|
||
"skills.createContact.name" = "Create Contact";
|
||
"skills.createContact.description" = "Open the system contact editor with the detected phone number prefilled.";
|
||
"skills.extractConclusions.name" = "Extract conclusions";
|
||
"skills.extractConclusions.description" = "Pull out decisions, conclusions, and next steps from long text.";
|
||
"skills.translate.name" = "Translate";
|
||
"skills.translate.description" = "Translate copied text in another language into the device's current primary system language.";
|
||
"skills.acceptInvitation.name" = "Accept invitation";
|
||
"skills.acceptInvitation.description" = "Draft a concise acceptance and confirm the important details.";
|
||
"skills.declineInvitation.name" = "Decline politely";
|
||
"skills.declineInvitation.description" = "Draft a sincere decline without inventing an excuse.";
|
||
"skills.acceptTask.name" = "Acknowledge task";
|
||
"skills.acceptTask.description" = "Confirm the requested work and any stated deadline.";
|
||
"skills.clarifyRequest.name" = "Clarify and follow up";
|
||
"skills.clarifyRequest.description" = "Ask only the key questions needed for a question, task, or problem.";
|
||
"skills.empathyReply.name" = "Empathetic reply";
|
||
"skills.empathyReply.description" = "Acknowledge a complaint and offer a safe next step.";
|
||
"skills.blessingReply.name" = "Reply to wishes";
|
||
"skills.blessingReply.description" = "Thank the sender or join a group wish without confusing the recipient.";
|
||
"skills.askForDetails.name" = "Ask for details";
|
||
"skills.askForDetails.description" = "Request the information needed to diagnose or resolve a problem.";
|
||
"skills.businessReply.name" = "Business reply";
|
||
"skills.businessReply.description" = "Draft a professional reply with clear commitment boundaries.";
|
||
"skills.organizeList.name" = "Organize list";
|
||
"skills.organizeList.description" = "Clean up lists, agendas, and steps without adding new tasks.";
|
||
"skills.extractTodos.name" = "Extract tasks";
|
||
"skills.extractTodos.description" = "Extract to-dos from copied text into Reminders.";
|
||
"skills.extractEvents.name" = "Extract events";
|
||
"skills.extractEvents.description" = "Extract events from copied text into Calendar.";
|
||
"skills.saveToNotes.name" = "Save to Notes";
|
||
"skills.saveToNotes.description" = "Create a new note from the copied text. The title comes from the time and content; the body stays as copied.";
|
||
"skills.navigate.name" = "Navigate";
|
||
"skills.navigate.description" = "Find an address in the copied text and start driving directions. Uses Amap if installed, then Baidu Maps, then Apple Maps.";
|
||
"skills.install.lead" = "Add it, then confirm. Don’t rename it.";
|
||
"skills.install.openShortcuts" = "Add Shortcut";
|
||
"skills.install.confirmAdded" = "I've added it";
|
||
"skills.add" = "Add skill";
|
||
"skills.edit" = "Edit skill";
|
||
"skills.custom.description" = "Custom clipboard skill";
|
||
"skills.editor.name" = "Name";
|
||
"skills.editor.namePlaceholder" = "Skill name";
|
||
"skills.editor.summary" = "About";
|
||
"skills.editor.summaryPlaceholder" = "Shown on the skill card";
|
||
"skills.editor.icon" = "Icon";
|
||
"skills.editor.iconChoose" = "Choose SF Symbol";
|
||
"skills.editor.iconSearch" = "Search symbols";
|
||
"skills.editor.prompt" = "Processing prompt";
|
||
"skills.editor.thinking" = "Thinking";
|
||
"skills.editor.thinkingHint" = "Off by default. Turn on only when you want slower, deeper reasoning for this skill.";
|
||
"skills.editor.shortcut" = "Shortcut (Optional)";
|
||
"skills.editor.linkPlaceholder" = "https://www.icloud.com/shortcuts/…";
|
||
"skills.editor.shortcutNamePlaceholder" = "Shortcut name (required with a link)";
|
||
"skills.editor.shortcutHint" = "Leave the link empty to process text and insert the result after review. With a link, the Shortcut name is filled in automatically. Don’t rename it after adding.";
|
||
"skills.editor.lookingUp" = "Looking up Shortcut name…";
|
||
"skills.editor.resolvedName" = "Will run: %@";
|
||
"skills.editor.lookupFailed" = "Couldn’t read the Shortcut name. Check the link, or type the name yourself.";
|
||
"skills.delete.title" = "Delete this skill?";
|
||
"skills.delete.message" = "It will be removed from this device. The Shortcut in the Shortcuts app is not deleted.";
|
||
"skills.error.title" = "Couldn’t save skill";
|
||
"skills.error.emptyName" = "Enter a skill name.";
|
||
"skills.error.emptyPrompt" = "The prompt cannot be empty.";
|
||
"skills.error.emptyShortcutName" = "Enter the Shortcut name used to run it.";
|
||
"skills.error.invalidLink" = "Enter a valid iCloud Shortcuts link.";
|
||
"skills.error.emptyIcon" = "Choose an icon.";
|
||
"skills.error.promptTooLong" = "The prompt can contain up to 6,000 characters.";
|
||
"skills.error.generic" = "Try again.";
|
||
|
||
/* Polish style packs */
|
||
"polishStyles.title" = "Polish styles";
|
||
"polishStyles.add" = "Add style";
|
||
"polishStyles.edit" = "Edit style";
|
||
"polishStyles.viewPrompt" = "View full prompt";
|
||
"polishStyles.duplicate" = "Duplicate";
|
||
"polishStyles.builtin.section" = "Built-in";
|
||
"polishStyles.fun.section" = "Fun styles";
|
||
"polishStyles.custom.section" = "My styles";
|
||
"polishStyles.intro.title" = "Choose a writing personality";
|
||
"polishStyles.intro.body" = "The selected style shapes every polished dictation. Your custom styles sync through iCloud when settings sync is enabled.";
|
||
"polishStyles.learn.title" = "Generate Your Style";
|
||
"polishStyles.learn.body" = "Learn how you naturally express yourself from past dictation.";
|
||
"polishStyles.learn.progress" = "%lld / %lld characters";
|
||
"polishStyles.learn.remaining" = "%lld to go";
|
||
"polishStyles.learn.ready" = "Ready";
|
||
"polishStyles.learn.action" = "Generate Style";
|
||
"polishStyles.learn.generating" = "Generating…";
|
||
"polishStyles.learn.generated.description" = "Your personal style learned from reviewed evidence.";
|
||
"polishStyles.learn.generatedAt" = "Generated";
|
||
"polishStyles.learn.evidenceSummary" = "%lld ASR characters · %lld reply choices · %lld final edits";
|
||
"polishStyles.learn.select" = "Use this style";
|
||
"polishStyles.learn.selected" = "In use";
|
||
"polishStyles.learn.regenerate" = "Regenerate";
|
||
"polishStyles.learn.regenerating" = "Regenerating…";
|
||
"polishStyles.learn.privacy" = "Sent to your configured AI only when you generate. Review and edit before saving.";
|
||
"polishStyles.learn.limit" = "Delete a custom style before generating another one.";
|
||
"polishStyles.learn.error.insufficient" = "Keep dictating until 2,500 effective characters are available.";
|
||
"polishStyles.learn.error.invalidResponse" = "The AI did not return a valid writing style. Please try again.";
|
||
"polishStyles.learn.error.promptTooLong" = "The generated prompt exceeded 6,000 characters. Please try again.";
|
||
"polishStyles.learn.error.requestTooLarge" = "The learning sample is too large for the configured AI service. Shorten unusually long history entries and try again.";
|
||
"polishStyles.learn.error.request" = "Couldn’t generate a style with the configured AI service. Check your connection and AI settings, then try again.";
|
||
"polishStyles.light.description" = "Fix recognition errors and punctuation with minimal rewriting.";
|
||
"polishStyles.structured.description" = "Organize multiple points into clear paragraphs and lists.";
|
||
"polishStyles.formal.description" = "Professional, restrained writing for email and work.";
|
||
"polishStyles.dating.description" = "Warm, playful messages with a light touch of wit.";
|
||
"polishStyles.chat.description" = "Short, natural messages without a formal tone.";
|
||
"polishStyles.flex.description" = "4A / study-abroad Chinglish with optional luxury seasoning.";
|
||
"polishStyles.corp.description" = "Big-tech buzzwords for syncs, pushback, and blame-shifting.";
|
||
"polishStyles.diba.description" = "Clean logical takedowns that leave the other side stuck.";
|
||
"polishStyles.xhs.description" = "Sisterly Xiaohongshu note voice with hooks, ready to post.";
|
||
"polishStyles.custom.description" = "Custom complete writing personality";
|
||
"polishStyles.copyName" = "%@ Copy";
|
||
"polishStyles.editor.name" = "Name";
|
||
"polishStyles.editor.namePlaceholder" = "Style name";
|
||
"polishStyles.editor.allowsAddedEmoji" = "Allow mood emojis";
|
||
"polishStyles.editor.allowsAddedEmoji.hint" = "When on, polish may add a few emojis that match the draft’s emotion, and keeps them on screen. Off by default.";
|
||
"polishStyles.editor.prompt" = "Complete prompt";
|
||
"polishStyles.editor.hint" = "Describe only the role, tone, style boundaries, and examples. The system appends the personal dictionary, safety contract, and output rules.";
|
||
"polishStyles.error.title" = "Couldn’t save style";
|
||
"polishStyles.error.emptyName" = "Enter a style name.";
|
||
"polishStyles.error.emptyPrompt" = "The prompt cannot be empty.";
|
||
"polishStyles.error.limit" = "You can save up to 8 custom styles.";
|
||
"polishStyles.error.promptTooLong" = "The prompt can contain up to 6,000 characters.";
|
||
"polishStyles.error.builtin" = "Built-in styles cannot be changed. Duplicate one to customize it.";
|
||
"polishStyles.error.generic" = "Try again.";
|
||
|
||
/* History */
|
||
"history.title" = "History";
|
||
"history.subtitle" = "Saved on this device only.";
|
||
"history.empty" = "No voice transcripts yet.";
|
||
"history.clear.title" = "Clear all history?";
|
||
"history.clear.message" = "This cannot be undone.";
|
||
"history.clear.confirm" = "Clear all";
|
||
"history.clear.button" = "Clear all history";
|
||
"history.clearDay.title" = "Delete this day's history?";
|
||
"history.clearDay.message" = "All transcripts from this day will be removed. This cannot be undone.";
|
||
"history.clearDay.confirm" = "Delete day";
|
||
"history.clearDay.button" = "Delete this day's history";
|
||
"flow.error.speechRequired" = "Speech recognition access is required for voice sessions.";
|
||
"flow.error.micRequired" = "Microphone access is required for background voice sessions.";
|
||
"flow.error.micUnavailable" = "Microphone is unavailable on this device.";
|
||
"flow.error.audioUnavailable" = "Could not start background audio.";
|
||
|
||
"settings.models.error.metadata" = "Download cache was corrupted or incomplete. Try switching the download source and download again.";
|
||
"settings.models.error.offline" = "Could not reach the model server. Check your network or try a different download source.";
|
||
"settings.models.confirm.downloadTitle %@" = "Download %@";
|
||
"settings.models.confirm.downloadingTitleFormat %@" = "Downloading %@";
|
||
"settings.models.confirm.body %lld" = "This download uses about %lld MB on disk. We recommend Wi‑Fi to avoid cellular data. You can delete the file anytime from On-device models to free space.";
|
||
"settings.models.confirm.cancel" = "Cancel";
|
||
"settings.models.confirm.download %lld" = "Download %lld MB";
|
||
|
||
/* v0.3.0: Personal dictionary */
|
||
"settings.personalDictionary.sectionTitle" = "Personal dictionary";
|
||
"settings.personalDictionary.title" = "Personal dictionary";
|
||
"settings.personalDictionary.summary" = "Words the LLM must preserve verbatim when polishing.";
|
||
"settings.personalDictionary.intro.title" = "About your dictionary";
|
||
"settings.personalDictionary.intro.body" = "Add words manually. Common speech-recognition mishearings are generated automatically after you save. Tap a word to edit.";
|
||
"settings.personalDictionary.empty.title" = "No words yet";
|
||
"settings.personalDictionary.empty.body" = "Add your personal dictionary to improve recognition accuracy\nSyncs across devices via iCloud";
|
||
"settings.personalDictionary.search.prompt" = "Search words";
|
||
"settings.personalDictionary.add.title" = "Add word";
|
||
"settings.personalDictionary.edit.title" = "Edit word";
|
||
"settings.personalDictionary.add.field" = "Word";
|
||
"settings.personalDictionary.add.footer" = "Common speech-recognition mishearings are generated automatically after you save.";
|
||
"settings.personalDictionary.aliases.generating" = "Generating aliases…";
|
||
"settings.personalDictionary.clearAll" = "Clear dictionary";
|
||
"settings.personalDictionary.clearAll.confirmTitle" = "Clear all dictionary words?";
|
||
"settings.personalDictionary.clearAll.message" = "This removes every word the LLM was protecting. This cannot be undone.";
|
||
"settings.personalDictionary.clearAll.confirm" = "Clear all";
|
||
"settings.personalDictionary.iCloudSync.title" = "Sync via iCloud";
|
||
"settings.personalDictionary.iCloudSync.settingsTitle" = "Personal dictionary iCloud sync";
|
||
"settings.personalDictionary.iCloudSync.subtitle" = "Keep your dictionary in sync across iPhone, iPad, and Mac. Data stays in your private iCloud account and is not used for training.";
|
||
"settings.personalDictionary.iCloudSync.error.tooLarge" = "Dictionary is too large to sync via iCloud. Remove some entries and try again.";
|
||
"settings.personalDictionary.iCloudSync.error.generic" = "Could not sync your dictionary with iCloud. Try again later.";
|
||
|
||
"settings.iCloudSync.title" = "Cross-Device iCloud Sync";
|
||
"settings.appSettings.iCloudSync.title" = "Cross-Device iCloud Sync";
|
||
"settings.appSettings.iCloudSync.subtitle" = "Sync settings, history, and API keys across devices via iCloud.";
|
||
"settings.appSettings.iCloudSync.syncNow" = "Sync Now";
|
||
"settings.appSettings.iCloudSync.syncing" = "Syncing…";
|
||
"settings.appSettings.iCloudSync.synced" = "Synced";
|
||
"settings.appSettings.iCloudSync.error.generic" = "Could not sync settings with iCloud. Try again later.";
|
||
|
||
|
||
/* Polish intensity */
|
||
"settings.polishIntensity.title" = "Polish intensity";
|
||
|
||
/* Flow session (policy fields may still sync; keep-alive is no longer shown in Settings) */
|
||
"settings.localModels.customLM.title" = "Use custom language model";
|
||
"settings.localModels.customLM.subtitle" = "Diagnostic switch. Turn off to test pure Apple on-device recognition if local ASR gets stuck or returns no speech.";
|
||
|
||
/* Cold-start / session errors (never say Picture in Picture to the user) */
|
||
"flow.coldStart.error.audioTimeout" = "The microphone did not become ready in time. It may be busy in another app. Please try again.";
|
||
"flow.session.error.unsupported" = "This device cannot keep a voice session alive.";
|
||
"flow.session.error.hostNotReady" = "The voice session is not ready yet. Stay in the app and try again.";
|
||
"flow.session.error.notPossible" = "The system cannot start the voice session right now. Keep the app in the foreground and try again.";
|
||
"flow.session.error.systemRejected" = "The voice session was rejected by the system. Please try again shortly.";
|
||
"flow.session.error.timedOut" = "The voice session did not start in time. Stay in the app and try again.";
|
||
|
||
/* Host app display names (scheme C whitelist) */
|
||
"hostApp.wechat" = "WeChat";
|
||
"hostApp.qq" = "QQ";
|
||
"hostApp.wecom" = "WeCom";
|
||
"hostApp.dingtalk" = "DingTalk";
|
||
"hostApp.lark" = "Lark";
|
||
"hostApp.telegram" = "Telegram";
|
||
"hostApp.whatsapp" = "WhatsApp";
|
||
"hostApp.line" = "LINE";
|
||
"hostApp.messenger" = "Messenger";
|
||
"hostApp.slack" = "Slack";
|
||
"hostApp.teams" = "Microsoft Teams";
|
||
"hostApp.discord" = "Discord";
|
||
"hostApp.notion" = "Notion";
|
||
"hostApp.bear" = "Bear";
|
||
"hostApp.obsidian" = "Obsidian";
|
||
"hostApp.drafts" = "Drafts";
|
||
"hostApp.gmail" = "Gmail";
|
||
"hostApp.outlook" = "Outlook";
|
||
"hostApp.chrome" = "Chrome";
|
||
"hostApp.weibo" = "Weibo";
|
||
"hostApp.xiaohongshu" = "RED";
|
||
"hostApp.signal" = "Signal";
|
||
"hostApp.kakaotalk" = "KakaoTalk";
|
||
"hostApp.viber" = "Viber";
|
||
"hostApp.zalo" = "Zalo";
|
||
"hostApp.skype" = "Skype";
|
||
"hostApp.zoom" = "Zoom";
|
||
"hostApp.things" = "Things";
|
||
"hostApp.todoist" = "Todoist";
|
||
"hostApp.evernote" = "Evernote";
|
||
"hostApp.onenote" = "OneNote";
|
||
"hostApp.spark" = "Spark";
|
||
"hostApp.firefox" = "Firefox";
|
||
"hostApp.edge" = "Edge";
|
||
"hostApp.facebook" = "Facebook";
|
||
"hostApp.instagram" = "Instagram";
|
||
"hostApp.x" = "X";
|
||
"hostApp.threads" = "Threads";
|
||
"hostApp.snapchat" = "Snapchat";
|
||
"hostApp.reddit" = "Reddit";
|
||
"hostApp.pinterest" = "Pinterest";
|
||
"hostApp.zhihu" = "Zhihu";
|
||
"hostApp.bilibili" = "Bilibili";
|
||
"hostApp.douyin" = "Douyin";
|
||
"hostApp.tiktok" = "TikTok";
|
||
"flow.warning.polishDegradedQuality" = "Polish output failed validation; inserted a conservative version.";
|
||
"flow.error.editLastInputFailed" = "Could not complete the edit. Please try again.";
|
||
"flow.error.aiQuestionFailed" = "AI response failed. Please try again.";
|
||
"flow.error.clipboardUnavailable" = "No clipboard text available. Turn on Clipboard History and copy the text first.";
|
||
"flow.error.webPageInvalid" = "This link cannot be summarized.";
|
||
"flow.error.webPageUnavailable" = "The webpage could not be loaded. It may require a login or block automated reading.";
|
||
"flow.error.webPageEmpty" = "No readable webpage content was found.";
|
||
|
||
/* Optional account center */
|
||
"account.title" = "Account";
|
||
"account.settings.section" = "Account";
|
||
"account.settings.restoring" = "Checking…";
|
||
"account.settings.signedOut" = "Not signed in";
|
||
"account.settings.signedIn" = "Signed in";
|
||
"account.settings.balance %lld" = "%lld credits";
|
||
"account.loading.session" = "Checking account status…";
|
||
"account.loading.center" = "Loading account…";
|
||
"account.signedOut.title" = "Your OSG account";
|
||
"account.signedOut.body" = "Register and invite friends to earn credits.";
|
||
"account.signedOut.localUnaffected" = "On-device features and your own API keys work without an account.";
|
||
"home.accountRewards.signedOut.title" = "Sign in for free credits";
|
||
"home.accountRewards.signedOut.summary" = "Register and invite friends to earn credits.";
|
||
"account.signIn.apple" = "Sign in with Apple";
|
||
"account.signIn.hint" = "Creates or opens your optional OSG account.";
|
||
"account.signIn.loading" = "Signing in…";
|
||
"account.error.sessionExpired" = "Your session expired. Sign in again to continue.";
|
||
"account.error.appleReauthenticationRequired" = "Sign in with Apple again to keep your account protected.";
|
||
"account.summary.section" = "Account";
|
||
"account.summary.signedIn" = "Signed in";
|
||
"account.summary.protected" = "Protected account";
|
||
"account.profile.section" = "Profile";
|
||
"account.profile.fallbackName" = "OSG User";
|
||
"account.profile.nickname" = "Nickname";
|
||
"account.profile.save" = "Save Nickname";
|
||
"account.profile.editTitle" = "Edit";
|
||
"account.profile.editMessage" = "Enter the nickname shown with your account.";
|
||
"account.error.updateProfile" = "Could not update your nickname.";
|
||
"account.summary.identifier" = "Account identifier";
|
||
"account.credits.section" = "Credits";
|
||
"account.credits.balance" = "Available credits";
|
||
"account.credits.unit" = "Available credits";
|
||
"account.credits.remaining" = "Remaining";
|
||
"account.credits.used" = "Used";
|
||
"account.credits.total" = "total credits";
|
||
"account.credits.remainingCompact" = "%@";
|
||
"account.credits.usedCompact" = "Used %@";
|
||
"account.credits.totalValueCompact" = "Total %@";
|
||
"account.credits.updating" = "Updating credits…";
|
||
"account.credits.updatedAt" = "Updated at %@";
|
||
"account.credits.updateFailedAt" = "Update failed · Showing data from %@";
|
||
"account.credits.notUpdated" = "Credits have not been updated";
|
||
"account.storekit.section" = "Add credits";
|
||
"account.storekit.credits" = "credits";
|
||
"account.storekit.purchase" = "Purchase";
|
||
"account.storekit.loading" = "Loading App Store product…";
|
||
"account.storekit.pending" = "Purchase pending approval.";
|
||
"account.storekit.succeeded" = "%lld credits added";
|
||
"account.storekit.noRestore" = "Credit packs are consumable and cannot be restored.";
|
||
"account.storekit.error.productUnavailable" = "This credit pack is not available from the App Store.";
|
||
"account.storekit.error.verification" = "The App Store could not verify this transaction.";
|
||
"account.storekit.error.server" = "The account server could not record this purchase.";
|
||
"account.storekit.error.session" = "Sign in again before purchasing credits.";
|
||
"account.storekit.error.network" = "Connect to the internet and try again.";
|
||
"account.storekit.error.conflict" = "This transaction cannot be applied to the current account.";
|
||
"account.storekit.error.unknown" = "The purchase could not be completed.";
|
||
"account.purchaseHistory.title" = "Purchase History";
|
||
"account.purchaseHistory.loading" = "Loading purchase history…";
|
||
"account.purchaseHistory.empty" = "No purchases yet";
|
||
"account.purchaseHistory.error" = "Purchase history could not be loaded. Try again.";
|
||
"account.purchaseHistory.loadMoreError" = "Could not load more purchases. Tap to retry";
|
||
"account.purchaseHistory.balanceAfter" = "Balance after %@";
|
||
"account.purchaseHistory.status.credited" = "Credited";
|
||
"account.ledger.section" = "Credit history";
|
||
"account.ledger.empty" = "No credit activity yet";
|
||
"account.ledger.defaultReason" = "Credit activity";
|
||
"account.rates.section" = "Rates";
|
||
"account.rates.empty" = "No managed-service rates available";
|
||
"account.rate.asr.seconds" = "%lld credit / %lld seconds";
|
||
"account.rate.asr.milliseconds" = "%lld credit / %lld ms";
|
||
"account.rate.llm" = "Input: %lld credit / %lld tokens · Output: %lld credit / %lld tokens";
|
||
"account.referral.section" = "Invitations";
|
||
"account.referral.yourCode" = "Your invitation code";
|
||
"account.referral.notCreated" = "Not created";
|
||
"account.rewards.title" = "Credits & Invitations";
|
||
"account.rewards.details" = "View credits and invitation details";
|
||
"account.referral.share" = "Share invitation";
|
||
"account.referral.inviteAction" = "Invite friends and earn credits";
|
||
"account.referral.rewardExplanation" = "After a friend registers through your link and completes qualifying usage, both of you can earn credits.";
|
||
"account.referral.rewardGeneric" = "Invite a friend and earn credits";
|
||
"account.referral.rewardPerFriend" = "Earn %@ credits for each successful invitation";
|
||
"account.referral.qualification" = "Granted after your friend completes qualifying usage";
|
||
"account.referral.friendRewardQualification" = "Your friend also receives %@ credits after qualifying usage";
|
||
"account.referral.shareShort" = "Share";
|
||
"account.referral.inviteTitle" = "Invite";
|
||
"account.referral.equalRewardDescription" = "Invite friends—both receive 1,000 credits";
|
||
"account.referral.equalRewardGeneric" = "For each successful invitation, both of you receive credits.";
|
||
"account.referral.summaryCompact" = "Rewarded %d · Pending %d";
|
||
"account.referral.preparingLink" = "Loading your invitation link…";
|
||
"account.referral.createCode" = "Load invitation link";
|
||
"account.referral.loadLink" = "Load invitation link";
|
||
"account.referral.loadingLink" = "Loading your invitation link…";
|
||
"account.referral.refreshingLink" = "Refreshing invitation link…";
|
||
"account.referral.error.load" = "Couldn’t load your invitation link.";
|
||
"account.referral.error.session" = "Sign in again to load your invitation link.";
|
||
"account.referral.error.network" = "Check your connection and try again.";
|
||
"account.referral.error.notFound" = "Your invitation link isn’t available yet.";
|
||
"account.referral.error.conflict" = "Your invitation link is temporarily unavailable.";
|
||
"account.referral.error.unavailable" = "The invitation service is temporarily unavailable.";
|
||
"account.referral.status.pending" = "Pending";
|
||
"account.referral.status.rewarded" = "Rewarded";
|
||
"account.referral.status.ineligible" = "Ineligible";
|
||
"account.referral.pendingAfterSignIn" = "Your invitation is saved and will be redeemed after sign-in.";
|
||
"account.security.section" = "Account controls";
|
||
"account.signOut.action" = "Sign Out";
|
||
"account.signOut.confirmTitle" = "Sign out?";
|
||
"account.signOut.confirmMessage" = "On-device features and your own API keys will keep working.";
|
||
"account.delete.action" = "Delete Account";
|
||
"account.delete.confirmTitle" = "Permanently delete this account?";
|
||
"account.delete.confirmMessage" = "Credits, invitation status, and server account data will be deleted. This cannot be undone.";
|
||
"account.delete.continue" = "Continue to Reauthenticate";
|
||
"account.delete.reauthenticateTitle" = "Confirm with Apple";
|
||
"account.delete.reauthenticateBody" = "Apple reauthentication is required before OSGKeyboard can permanently delete the account.";
|
||
"account.delete.reauthenticate" = "Continue with Apple";
|
||
"account.delete.reauthenticateHint" = "Reauthenticates and permanently deletes your OSG account.";
|
||
"account.delete.loading" = "Deleting account…";
|
||
"account.retry" = "Try Again";
|
||
"account.error.title" = "Account unavailable";
|
||
"account.error.unavailable" = "Account services are not connected in this build.";
|
||
"account.error.restore" = "Could not restore your account session.";
|
||
"account.error.signIn" = "Could not sign in. Please try again.";
|
||
"account.error.load" = "Could not load account details.";
|
||
"account.error.invalidReferralCode" = "The server returned an invalid invitation code.";
|
||
"account.error.createReferralCode" = "Could not create an invitation code.";
|
||
"account.error.signOut" = "Could not sign out. Please try again.";
|
||
"account.error.delete" = "Could not delete the account.";
|
||
"account.error.redeemReferral" = "The invitation is saved, but could not be redeemed yet.";
|
||
"account.error.appleAuthorization" = "Apple authorization could not be completed.";
|
||
"account.error.managedGateway" = "Managed access could not be prepared. Check your balance and try again.";
|
||
"account.managed.section" = "Service credentials";
|
||
"account.managed.credentialSource" = "Credential source";
|
||
"account.managed.byok" = "My API keys";
|
||
"account.managed.accountCredits" = "Account credits";
|
||
"account.managed.explanation" = "This choice is independent from local or cloud speech recognition. Account sessions remain private to the host app; the keyboard receives only a short-lived, limited grant.";
|
||
"account.managed.preparing" = "Preparing managed access…";
|
||
"settings.analytics.section" = "Privacy";
|
||
"settings.analytics.title" = "Product Analytics";
|
||
"settings.analytics.description" = "Helps improve reliability with limited first-party events. Keyboard input, audio, transcripts, prompts, model output, credentials, and personal identifiers are never collected. Turning this off deletes queued events from this device.";
|