956331a2af
Release the current PiP reliability, polish style, macOS dictionary, and UI updates.
543 lines
30 KiB
Plaintext
543 lines
30 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.api.title" = "Choose Engine";
|
||
"onboarding.api.localModels.hint" = "Local engine uses built-in on-device speech recognition — no API key needed.";
|
||
"onboarding.polish.title" = "Text polish (LLM)";
|
||
"onboarding.polish.subtitle" = "Cleans up the transcript after recognition. Can differ from the ASR provider.";
|
||
"onboarding.polish.localHint" = "Built-in polish is included. Add your own API key here to override.";
|
||
"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.";
|
||
"settings.reset.confirm" = "Reset all settings";
|
||
"settings.engine.title" = "Speech transcription method";
|
||
"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.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.resourceId" = "Resource ID";
|
||
"settings.asr.volcengine.note" = "Secret Key is not required. Resource ID defaults to 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" = "OSGKeyboard Built-in";
|
||
"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.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.cursorDragNavigation.title" = "Drag beside mic to move cursor";
|
||
"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" = "In Cloud polish mode, transcribed text is sent to the API endpoint you configure (e.g. OpenAI or your own server). OSGKeyboard does not operate servers and does not store transcripts in the cloud.";
|
||
"settings.privacy.cloud.alert.title" = "Audio leaves your device";
|
||
"settings.privacy.cloud.alert.message" = "The cloud engine uploads your voice recordings to the third-party ASR provider you configure, and sends the transcript to its API for polish. That provider's privacy policy applies. OSGKeyboard never stores data on our servers. Continue?";
|
||
"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.placeholder.localBadge" = "On-device";
|
||
"keyboard.placeholder.cloudBadge" = "Cloud";
|
||
"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 engine needs an API key. Open the Settings tab.";
|
||
"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.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.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" = "Keyboard";
|
||
"tab.history" = "History";
|
||
"tab.dictionary" = "Dictionary";
|
||
"tab.styles" = "Styles";
|
||
"tab.settings" = "Settings";
|
||
|
||
/* 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.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.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 that invite conversation while respecting boundaries.";
|
||
"polishStyles.chat.description" = "Short, natural messages without a formal tone.";
|
||
"polishStyles.custom.description" = "Custom complete writing personality";
|
||
"polishStyles.copyName" = "%@ Copy";
|
||
"polishStyles.editor.name" = "Name";
|
||
"polishStyles.editor.namePlaceholder" = "Style name";
|
||
"polishStyles.editor.prompt" = "Complete prompt";
|
||
"polishStyles.editor.hint" = "Use {{DICTIONARY}} where the personal dictionary should be inserted. System safety, rewrite intensity, and output rules are appended automatically.";
|
||
"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";
|
||
"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.usageCount" = "%lld uses";
|
||
"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.";
|
||
|
||
/* v0.3.0: Polish intensity */
|
||
"settings.polishIntensity.title" = "Polish intensity";
|
||
|
||
/* Flow session policy */
|
||
"settings.flow.title" = "Voice session";
|
||
"settings.flow.keepAlive.title" = "Keep-alive mode";
|
||
"settings.flow.keepAlive.liveActivity" = "Dynamic Island";
|
||
"settings.flow.keepAlive.liveActivity.subtitle" = "Continuous mic session with inactivity timeout.";
|
||
"settings.flow.keepAlive.pictureInPicture" = "Picture in Picture";
|
||
"settings.flow.keepAlive.pictureInPicture.subtitle" = "Waveform PiP keeps the app alive; mic is released between utterances.";
|
||
"settings.flow.keepAlive.pictureInPicture.note" = "Picture in Picture stays active until you close it. Skip app switch is always on in this mode.";
|
||
"settings.flow.keepAlive.activeSession.title" = "End the current session first";
|
||
"settings.flow.keepAlive.activeSession.message" = "Stop the active voice session before changing keep-alive mode.";
|
||
"settings.flow.skipAppSwitch.title" = "Skip app switch";
|
||
"settings.flow.skipAppSwitch.subtitle" = "After a cold start, try to return to the app you came from.";
|
||
"settings.flow.inactivity.title" = "End session after inactivity";
|
||
"settings.flow.inactivity.1m" = "1 minute";
|
||
"settings.flow.inactivity.5m" = "5 minutes";
|
||
"settings.flow.inactivity.10m" = "10 minutes";
|
||
"settings.flow.inactivity.30m" = "30 minutes";
|
||
"settings.flow.inactivity.3h" = "3 hours";
|
||
"settings.flow.inactivity.12h" = "12 hours";
|
||
"settings.flow.inactivity.24h" = "24 hours";
|
||
"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 handoff (scheme B) */
|
||
"flow.coldStart.title" = "Voice is ready";
|
||
"flow.coldStart.preparing" = "Getting voice ready";
|
||
"flow.coldStart.preparing.pip" = "Starting Picture in Picture";
|
||
"flow.coldStart.preparingHint" = "Keep OSGKeyboard open for a moment while we start the microphone session.";
|
||
"flow.coldStart.preparingHint.pip" = "Keep OSGKeyboard open while Picture in Picture starts. Then return to the keyboard to speak.";
|
||
"flow.coldStart.permission.title" = "Permission required";
|
||
"flow.coldStart.audio.title" = "Voice could not start";
|
||
"flow.coldStart.pip.title" = "Picture in Picture could not start";
|
||
"flow.coldStart.error.audioTimeout" = "The microphone did not become ready in time. It may be busy in another app. Please try again.";
|
||
"flow.pip.error.unavailable" = "Picture in Picture could not start. Stay in the app and try again.";
|
||
"flow.pip.error.unsupported" = "This device does not support Picture in Picture.";
|
||
"flow.pip.error.hostNotReady" = "The Picture in Picture surface is not ready yet. Stay in the app and try again.";
|
||
"flow.pip.error.notPossible" = "The system cannot start Picture in Picture right now. Keep the app in the foreground and try again.";
|
||
"flow.pip.error.systemRejected" = "Picture in Picture was rejected by the system. Please try again shortly.";
|
||
"flow.pip.error.timedOut" = "Picture in Picture did not appear in time. Stay in the app and try again.";
|
||
"flow.coldStart.action.settings" = "Open Settings";
|
||
"flow.coldStart.action.retry" = "Try Again";
|
||
"flow.coldStart.swipeHint" = "Swipe right along the bottom bar\nto return to your previous app.";
|
||
"flow.coldStart.swipeAccessibility" = "Swipe right along the bottom bar to return";
|
||
"flow.coldStart.tapToDismiss" = "Tap anywhere to close";
|
||
"flow.coldStart.return.named" = "Return to %@";
|
||
"flow.coldStart.return.generic" = "Return to app";
|
||
|
||
/* 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";
|