c0c9dad149
Replace the Sherpa offline pipeline with native MLX streaming, resilient model downloads, live transcript previews, and supporting tests and documentation.
381 lines
20 KiB
Plaintext
381 lines
20 KiB
Plaintext
/* Engine status labels */
|
||
"engine.summary.local" = "On-device · %@";
|
||
"engine.summary.cloud" = "Active: %@";
|
||
"engine.summary.cloudWithModel" = "Active: %1$@ · %2$@";
|
||
"engine.asr.appleSpeech" = "Apple SpeechAnalyzer";
|
||
|
||
/* v0.2.0: flow-level warnings surfaced alongside the final transcript. */
|
||
"flow.warning.cloudPolishMissingKey" = "Cloud polish needs an API key in Settings. Inserted raw ASR text.";
|
||
"flow.warning.localPolishUnavailable" = "Built-in polish is unavailable. Inserted raw ASR text.";
|
||
"flow.warning.polishDegraded" = "Weak network — inserted raw ASR text without polish.";
|
||
|
||
/* LLM providers */
|
||
"provider.openai" = "OpenAI";
|
||
"provider.ark" = "Volcengine Ark";
|
||
"provider.deepseek" = "DeepSeek";
|
||
"provider.qwen" = "Qwen (DashScope)";
|
||
"provider.zhipu" = "Zhipu GLM";
|
||
"provider.moonshot" = "Moonshot";
|
||
"provider.siliconflow" = "SiliconFlow";
|
||
"provider.groq" = "Groq";
|
||
"provider.minimax" = "MiniMax";
|
||
"provider.mimo" = "Xiaomi MiMo";
|
||
"provider.openrouter" = "OpenRouter";
|
||
"provider.gemini" = "Google Gemini";
|
||
"provider.anthropic" = "Anthropic Claude";
|
||
"provider.xai" = "xAI Grok";
|
||
"provider.mistral" = "Mistral AI";
|
||
"provider.cometapi" = "CometAPI";
|
||
"provider.alibabaCoding" = "Alibaba Coding";
|
||
"provider.codingPlanX" = "CodingPlanX";
|
||
"provider.volcengine" = "Volcengine ASR";
|
||
"provider.bailian" = "Bailian Realtime ASR";
|
||
"provider.whisper" = "Whisper (OpenAI)";
|
||
"provider.codex_oauth" = "Codex OAuth";
|
||
"provider.custom" = "Custom";
|
||
|
||
/* LLM errors */
|
||
"error.llm.invalidURL" = "Invalid API URL. Check Base URL in Settings.";
|
||
"error.llm.noAPIKey" = "API Key is missing.";
|
||
"error.llm.http" = "API returned HTTP %lld. Try again later or contact the provider.";
|
||
"error.llm.decoding" = "Failed to parse the API response.";
|
||
"error.llm.transport" = "Network error. Check your connection and try again.";
|
||
"error.llm.rateLimited" = "Too many API requests. Please wait and try again.";
|
||
"error.llm.cancelled" = "Request cancelled.";
|
||
|
||
/* ASR errors */
|
||
"error.asr.localeUnsupported" = "Speech language assets are unavailable. Try again later or switch the recognition language.";
|
||
"error.asr.assetsNotReady" = "Speech language assets are not ready. Try again later.";
|
||
"error.asr.formatUnsupported" = "This device does not support the required audio format.";
|
||
"error.asr.noSpeech" = "No speech detected. Please try again.";
|
||
"error.asr.chunkFailed" = "Segment %lld failed: %@";
|
||
|
||
/* Cloud ASR errors */
|
||
"error.cloudASR.noAPIKey" = "API Key is missing.";
|
||
"error.cloudASR.invalidURL" = "Invalid cloud ASR endpoint.";
|
||
"error.cloudASR.http" = "Cloud ASR returned HTTP %lld.";
|
||
"error.cloudASR.httpWithMessage" = "Cloud ASR returned HTTP %lld: %@";
|
||
"error.cloudASR.decoding" = "Failed to parse cloud ASR response: %@";
|
||
"error.cloudASR.transport" = "Cloud ASR network error: %@";
|
||
"error.cloudASR.emptyTranscript" = "Cloud ASR returned an empty transcript.";
|
||
"error.cloudASR.audioTooLong" = "Audio segment is too long for this cloud ASR provider.";
|
||
"error.cloudASR.providerUnsupported" = "This provider does not support cloud speech recognition yet.";
|
||
"error.cloudASR.streamingNotImplemented" = "This provider requires streaming ASR (WebSocket), which is not available in this build yet. Try Qwen, Zhipu, Groq, or OpenAI.";
|
||
|
||
/* Provider tools */
|
||
"providerTools.error.invalidURL" = "Invalid model endpoint.";
|
||
"providerTools.error.missingAPIKey" = "API Key is missing.";
|
||
"providerTools.error.http" = "Model endpoint returned HTTP %lld.";
|
||
"providerTools.error.empty" = "No models returned.";
|
||
"providerTools.error.decoding" = "Failed to parse model list.";
|
||
"providerTools.error.transport" = "Network error while loading models.";
|
||
|
||
/* Polish scenarios */
|
||
"polishScenario.daily_chat" = "Daily Chat";
|
||
"polishScenario.social_lifestyle" = "Social Network";
|
||
"polishScenario.social_short" = "Instagram";
|
||
"polishScenario.goofy" = "Goofy";
|
||
"polishScenario.work" = "Work";
|
||
"polishScenario.document" = "Document";
|
||
"polishScenario.todo" = "TODO";
|
||
"polishScenario.custom" = "Custom";
|
||
"polishScenario.chip.daily_chat" = "Chat";
|
||
"polishScenario.chip.social_lifestyle" = "Social";
|
||
"polishScenario.chip.social_short" = "IG";
|
||
"polishScenario.chip.goofy" = "Goofy";
|
||
"polishScenario.chip.work" = "Work";
|
||
"polishScenario.chip.document" = "Doc";
|
||
"polishScenario.chip.todo" = "TODO";
|
||
"polishScenario.chip.custom" = "Custom";
|
||
|
||
/* v0.3.0: Polish intensity picker */
|
||
"polish.intensity.off" = "Off";
|
||
"polish.intensity.light" = "Light";
|
||
"polish.intensity.medium" = "Medium";
|
||
"polish.intensity.heavy" = "Heavy";
|
||
"polish.intensity.off.desc" = "No polish; inserts raw ASR unless your personal dictionary has entries, then runs ASR correction only.";
|
||
"polish.intensity.light.desc" = "Drop only isolated filler words and obvious duplications. Punctuation and structure still apply.";
|
||
"polish.intensity.medium.desc" = "Correct recognition errors, remove fillers, polish phrasing. Punctuation and structure always apply. Default.";
|
||
"polish.intensity.heavy.desc" = "Restructure into lists and paragraphs when needed. Best for meeting notes and reports.";
|
||
|
||
/* v0.3.0: Detected app context labels */
|
||
"appContext.code" = "Code";
|
||
"appContext.email" = "Email";
|
||
"appContext.chat" = "Chat";
|
||
"appContext.document" = "Document";
|
||
"appContext.unknown" = "General";
|
||
|
||
/* v0.3.0: Personal dictionary categories */
|
||
"dict.category.properNoun" = "Names & places";
|
||
"dict.category.technical" = "Technical terms";
|
||
"dict.category.acronym" = "Acronyms";
|
||
"dict.category.productName" = "Product names";
|
||
"dict.category.custom" = "Custom";
|
||
|
||
/* v0.3.0: Personal dictionary sources */
|
||
"dict.source.manual" = "Manual";
|
||
"dict.source.history" = "Auto-learned";
|
||
"dict.source.contacts" = "From Contacts";
|
||
"dict.source.recentEdit" = "From recent edit";
|
||
|
||
/* Keyboard UI (shared between extension + preview) */
|
||
"keyboard.tapToTalkA11y" = "Tap to talk";
|
||
"keyboard.translation.chip" = "Translate";
|
||
"keyboard.translation.offMenu" = "Don't translate";
|
||
"keyboard.translation.a11y" = "Translation";
|
||
"keyboard.translation.a11yHint" = "Toggle translation or change the target language.";
|
||
|
||
/* macOS app */
|
||
"mac.section.dashboard" = "Home";
|
||
"mac.section.history" = "History";
|
||
"mac.section.dictionary" = "Dictionary";
|
||
"mac.section.settings" = "Settings";
|
||
"mac.brand.subtitle" = "AI DICTATION";
|
||
"mac.brand.tagline" = "Speak it. It’s typed.";
|
||
"mac.brand.tagline.subtitle" = "Local-first · Cross-device · One-tap dictation";
|
||
"mac.devices" = "Devices";
|
||
"mac.page.history.subtitle" = "Every dictation, kept in order.";
|
||
"mac.page.dictionary.subtitle" = "Words that teach recognition your voice.";
|
||
"mac.page.settings.subtitle" = "Engine, shortcuts, and appearance.";
|
||
"mac.status.ready" = "Ready when you are…";
|
||
"mac.status.listening" = "Listening…";
|
||
"mac.status.transcribing" = "Transcribing…";
|
||
"mac.status.polishing" = "Polishing…";
|
||
"mac.status.copied" = "Copied to clipboard";
|
||
"mac.status.pasted" = "Inserted into front app";
|
||
"mac.status.copiedAndPasted" = "Copied and inserted";
|
||
"mac.status.deliveryWithNote" = "%@ — %@";
|
||
"stat.dictationTime" = "Dictation Time";
|
||
"stat.words" = "Dictation Chars";
|
||
"stat.translation" = "Translation Chars";
|
||
"stat.dictionary" = "Dictionary";
|
||
"stat.cumulativeDuration" = "Total time";
|
||
"stat.transcribed" = "Transcribed";
|
||
"stat.cumulativeTranslation" = "Translated";
|
||
"stat.customTerms" = "Custom terms";
|
||
"stat.weekChart.title" = "Last 7 days";
|
||
"stat.weekChart.caption" = "Dictation chars";
|
||
"stat.weekChart.empty" = "No dictation yet this week";
|
||
"mac.status.chipReady" = "Ready";
|
||
"mac.status.chipProcessing" = "Processing";
|
||
"mac.overlay.listening" = "Listening";
|
||
"mac.overlay.preparing" = "Starting…";
|
||
"mac.overlay.transcribing" = "Transcribing";
|
||
"mac.overlay.polishing" = "Polishing";
|
||
"mac.overlay.live" = "Live";
|
||
"mac.overlay.done" = "Done";
|
||
"mac.overlay.dragHint" = "Drag to move · double-click to reset";
|
||
"mac.record.start" = "Record";
|
||
"mac.record.stop" = "Stop";
|
||
"mac.record.pressStop" = "Press Stop";
|
||
"mac.copy" = "Copy";
|
||
"mac.openWindow" = "Open Window";
|
||
"mac.quit" = "Quit";
|
||
"mac.mode.cloud" = "Cloud Mode";
|
||
"mac.mode.local" = "Local Mode";
|
||
"mac.connected" = "Connected";
|
||
"mac.offline" = "Offline";
|
||
"mac.history.empty" = "No dictations yet";
|
||
"mac.history.emptyBody" = "Hold Option anywhere to speak — transcripts land here.";
|
||
"mac.history.select" = "Select a dictation";
|
||
"mac.history.clearTitle" = "Clear all history?";
|
||
"mac.history.clearMessage" = "This cannot be undone.";
|
||
"mac.history.clearConfirm" = "Clear all";
|
||
"mac.dict.health" = "Vocabulary Health";
|
||
"mac.dict.healthDesc" = "Custom terms that bias recognition and are never rewritten.";
|
||
"mac.dict.search" = "Search words";
|
||
"mac.dict.empty" = "No words yet";
|
||
"mac.dict.emptyBody" = "Add words on your iPhone or iPad to improve recognition accuracy. They sync here via iCloud.";
|
||
"mac.dict.noMatch" = "No matches";
|
||
"mac.cancel" = "Cancel";
|
||
"mac.delete" = "Delete";
|
||
"mac.dict.deleteTitle" = "Delete this word?";
|
||
"mac.dict.deleteMessage" = "This cannot be undone.";
|
||
"mac.hint.holdOption" = "Hold Option to dictate";
|
||
"mac.settings.cloudProvider" = "CLOUD PROVIDER";
|
||
"mac.settings.polishProvider" = "TEXT POLISH (LLM)";
|
||
"mac.settings.asrProvider" = "SPEECH RECOGNITION (ASR)";
|
||
"mac.settings.asrService" = "ASR service";
|
||
"mac.settings.asrApiKey" = "ASR API key";
|
||
"mac.settings.asrModel" = "ASR model";
|
||
"mac.settings.baseURL" = "Base URL";
|
||
"mac.settings.service" = "Service";
|
||
"mac.settings.apiKey" = "API Key";
|
||
"mac.settings.model" = "Model";
|
||
"mac.settings.modelFetchHint" = "Enter an API Key, then fetch models.";
|
||
"mac.settings.connectionCheck" = "Connection check";
|
||
"mac.settings.validate" = "Validate";
|
||
"mac.settings.fetchModels" = "Fetch models";
|
||
"mac.settings.validating" = "Validating…";
|
||
"mac.settings.validateSuccess" = "Success · Retry";
|
||
"mac.settings.validateFailure" = "Failed · Retry";
|
||
"mac.settings.loadingModels" = "Loading models…";
|
||
"mac.settings.modelsLoaded" = "%lld models loaded.";
|
||
"mac.settings.selectModel" = "Select model";
|
||
"mac.settings.modelSelected" = "Selected %@";
|
||
"mac.settings.modelsEmptyHint" = "Tap refresh to load models";
|
||
"mac.settings.thinking" = "Thinking";
|
||
"mac.settings.thinkingSubtitle" = "Slower, higher quality — recommended off";
|
||
"mac.settings.thinkingHint" = "Off by default. Enable only for slower, deeper reasoning.";
|
||
"mac.settings.volcengineAppId" = "APP ID";
|
||
"mac.settings.volcengineAccessToken" = "Access Token";
|
||
"mac.settings.volcengineResourceId" = "Resource ID";
|
||
"mac.settings.volcengineNote" = "Secret Key is not required. Resource ID defaults to volc.seedasr.sauc.duration.";
|
||
"mac.settings.recognition" = "RECOGNITION METHOD";
|
||
"mac.settings.cloudEngine" = "Cloud Engine & AI Refinement";
|
||
"mac.settings.cloudEngineDesc" = "Premium transcription via your provider's API, plus AI grammar and style polishing.";
|
||
"mac.settings.localEngine" = "Local Recognition";
|
||
"mac.settings.localEngineDesc" = "On-device transcription with a local model. High privacy, zero latency.";
|
||
"mac.settings.localSpeechFallback" = "Local Recognition (Apple Speech)";
|
||
"mac.settings.localSpeechFallbackDesc" = "On-device Apple Speech when the Qwen3 model is not installed.";
|
||
"mac.settings.about" = "About";
|
||
"mac.settings.privacyPolicy" = "Privacy Policy";
|
||
"mac.settings.thirdPartyLicenses" = "Third-Party Licenses";
|
||
"mac.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.";
|
||
"mac.settings.restartOnboarding" = "Restart First-Run Setup";
|
||
"mac.settings.general" = "General";
|
||
"mac.settings.input" = "Input & Shortcuts";
|
||
"mac.settings.recognitionLanguage" = "Recognition Language";
|
||
"mac.settings.interfaceLanguage" = "Interface Language";
|
||
"mac.settings.autoPaste" = "Auto-paste after dictation";
|
||
"mac.settings.autoPasteDesc" = "Simulate ⌘V in the front app after transcription (requires Accessibility).";
|
||
"mac.settings.hotkey" = "Global shortcut";
|
||
"mac.settings.hotkeyDesc" = "Hold Option (⌥) to dictate from any app.";
|
||
"mac.settings.hotkeyTrigger" = "Shortcut key";
|
||
"mac.settings.hotkeyTriggerDesc" = "Which Option (⌥) key starts dictation when held.";
|
||
"mac.hotkeyTrigger.rightOption" = "Right Option (⌥)";
|
||
"mac.hotkeyTrigger.leftOption" = "Left Option (⌥)";
|
||
"mac.hotkeyTrigger.eitherOption" = "Either Option key";
|
||
"mac.hint.hold.rightOption" = "Hold right Option (⌥) to dictate";
|
||
"mac.hint.hold.leftOption" = "Hold left Option (⌥) to dictate";
|
||
"mac.hint.hold.eitherOption" = "Hold either Option (⌥) to dictate";
|
||
"mac.hint.holdOption" = "Hold Option to dictate";
|
||
"mac.settings.qwen3Model" = "Qwen3 model folder";
|
||
"mac.settings.qwen3ModelDesc" = "Folder with config.json, model.safetensors, vocab.json, and merges.txt.";
|
||
"mac.settings.qwen3Browse" = "Choose folder…";
|
||
"mac.settings.qwen3Missing" = "Qwen3 model not found — using Apple Speech for now.";
|
||
"mac.settings.mlxModelMissing" = "Select a Qwen3 MLX model folder below, or choose another installed model.";
|
||
"mac.settings.selectedModelMissing" = "%@ is not installed — using Apple Speech for now.";
|
||
"mac.settings.localModelFallbackApple" = "No local model is ready — using Apple Speech for now.";
|
||
"mac.settings.accessibility" = "Accessibility Permission";
|
||
"mac.settings.accessibilityDesc" = "Required for global shortcut and auto-paste.";
|
||
"mac.settings.openAccessibility" = "Open System Settings";
|
||
"mac.settings.appearance" = "Appearance";
|
||
"mac.settings.appearanceDesc" = "Match the system, or force a light or dark look.";
|
||
"mac.appearance.system" = "System";
|
||
"mac.appearance.light" = "Light";
|
||
"mac.appearance.dark" = "Dark";
|
||
"mac.onboarding.progress" = "Step %lld of %lld";
|
||
"mac.onboarding.back" = "Back";
|
||
"mac.onboarding.next" = "Next";
|
||
"mac.onboarding.finish" = "Finish";
|
||
"mac.onboarding.skipForNow" = "Skip for now";
|
||
"mac.onboarding.welcome.title" = "Speak it. It’s typed.";
|
||
"mac.onboarding.welcome.subtitle" = "Set up dictation in a minute. Everything here can be changed later in Settings.";
|
||
"mac.onboarding.welcome.privacy" = "Your voice stays local unless you choose a cloud provider.";
|
||
"mac.onboarding.welcome.hotkey" = "Hold Option to dictate from any app.";
|
||
"mac.onboarding.welcome.local" = "Local Sherpa recognition can be prepared now or later.";
|
||
"mac.onboarding.microphone.title" = "Allow microphone access";
|
||
"mac.onboarding.microphone.subtitle" = "OSGKeyboard needs the microphone to capture your dictation audio.";
|
||
"mac.onboarding.microphone.allow" = "Allow Microphone";
|
||
"mac.onboarding.microphone.granted" = "Microphone access is granted.";
|
||
"mac.onboarding.microphone.needed" = "Microphone access is needed for recording.";
|
||
"mac.onboarding.accessibility.title" = "Enable Accessibility";
|
||
"mac.onboarding.accessibility.subtitle" = "Accessibility lets OSGKeyboard listen for the global shortcut and paste text into the front app. You can skip it and grant it later.";
|
||
"mac.onboarding.accessibility.open" = "Open System Settings";
|
||
"mac.onboarding.accessibility.granted" = "Accessibility permission is granted.";
|
||
"mac.onboarding.accessibility.needed" = "Accessibility is not enabled yet.";
|
||
"mac.onboarding.engine.title" = "Choose a recognition path";
|
||
"mac.onboarding.engine.subtitle" = "Start locally for privacy, or use your own cloud API for provider-based recognition and polish.";
|
||
"mac.onboarding.engine.localDesc" = "Private on-device recognition with Sherpa models. Falls back to Apple Speech until a model is installed.";
|
||
"mac.onboarding.engine.cloudDesc" = "Use your API key for cloud speech recognition and AI polishing.";
|
||
"mac.onboarding.cloud.title" = "Configure API access";
|
||
"mac.onboarding.cloud.subtitle" = "Pick a provider and add your key. This step is optional, so you can finish now and fill it later in Settings.";
|
||
"mac.onboarding.cloud.skipHint" = "You can leave these blank and finish setup; cloud mode will ask for a key before use.";
|
||
"mac.onboarding.model.title" = "Prepare local recognition";
|
||
"mac.onboarding.model.subtitle" = "Download the basic Sherpa runtime and default model now, or skip and continue with Apple Speech fallback.";
|
||
"mac.onboarding.model.download" = "Download Default Model";
|
||
"mac.onboarding.model.done" = "Local model is ready.";
|
||
"mac.onboarding.model.skipHint" = "Skipping is safe: Settings keeps the same download controls for later.";
|
||
"mac.onboarding.popover.title" = "Finish setup";
|
||
"mac.onboarding.popover.subtitle" = "Open the main window to choose permissions, API settings, and local model download.";
|
||
"mac.error.noAudio" = "No audio captured";
|
||
"mac.error.noCloudASR" = "Selected provider has no cloud ASR";
|
||
"mac.error.emptyTranscript" = "No speech recognized";
|
||
"mac.error.qwen3ModelMissing" = "Qwen3-ASR model not installed";
|
||
"mac.error.qwen3LoadFailed" = "Failed to load Qwen3 model: %@";
|
||
"mac.error.qwen3InferenceFailed" = "Qwen3 transcription failed: %@";
|
||
"mac.localASR.models" = "Local ASR Engine & Models";
|
||
"mac.localASR.modelsDesc" = "Models download directly. Mainland China uses the hf-mirror mirror first; elsewhere the official Hugging Face endpoint first. Interrupted downloads resume automatically and fall back across mirrors.";
|
||
"mac.localASR.downloadSource" = "Download source";
|
||
"mac.localASR.downloadSource.auto" = "Automatic (by region)";
|
||
"mac.localASR.downloadSource.hfMirror" = "hf-mirror (recommended in China)";
|
||
"mac.localASR.downloadSource.huggingface" = "Hugging Face (official)";
|
||
"mac.localASR.download" = "Download";
|
||
"mac.localASR.selectFolder" = "Choose folder";
|
||
"mac.localASR.openFolder" = "Open folder";
|
||
"mac.localASR.pause" = "Pause";
|
||
"mac.localASR.resume" = "Resume";
|
||
"mac.localASR.needsFolder" = "Folder required";
|
||
"mac.localASR.installDone" = "Install completed.";
|
||
"mac.localASR.installed" = "Installed";
|
||
"mac.localASR.notInstalled" = "Not installed";
|
||
"mac.localASR.personalDictionaryTag" = "Personal dictionary";
|
||
"mac.localASR.badge.fastest" = "Fastest";
|
||
"mac.localASR.badge.balanced" = "Most balanced";
|
||
"mac.localASR.badge.quality" = "Best quality";
|
||
"mac.localASR.hotwordsYes" = "Hotwords";
|
||
"mac.localASR.hotwordsNo" = "No hotwords";
|
||
"mac.localASR.catalogMissing" = "Local ASR catalog is missing from the app bundle.";
|
||
"mac.localASR.diagnostics" = "Last Bias Diagnostics";
|
||
"mac.localASR.diagnosticsDesc" = "Captured after your most recent local dictation.";
|
||
"mac.localASR.diagEmpty" = "No local dictation yet.";
|
||
"mac.localASR.diagBackend" = "Backend";
|
||
"mac.localASR.diagUserTerms" = "User terms";
|
||
"mac.localASR.diagBuiltinTerms" = "Builtin terms";
|
||
"mac.localASR.diagHotwords" = "Hotwords sent";
|
||
"mac.localASR.diagPrompt" = "Prompt chars";
|
||
"mac.localASR.diagTruncated" = "Prompt truncated";
|
||
"mac.localASR.delete" = "Delete";
|
||
"mac.localASR.deleteDone" = "Model deleted.";
|
||
"mac.localASR.redownload" = "Re-download";
|
||
"mac.localASR.revealInFinder" = "Reveal in Finder";
|
||
"mac.localASR.openStorage" = "Open model storage folder";
|
||
"mac.localASR.runtime" = "Local ASR runtime";
|
||
"mac.localASR.runtimeDesc" = "Installed automatically with the models above; required for Qwen3, SenseVoice, and similar models.";
|
||
"mac.localASR.phase.downloading" = "Downloading";
|
||
"mac.localASR.phase.paused" = "Paused";
|
||
"mac.localASR.phase.extracting" = "Extracting";
|
||
"mac.localASR.phase.validating" = "Validating";
|
||
"mac.localASR.phase.finalizing" = "Finalizing";
|
||
"mac.localASR.phase.failed" = "Failed";
|
||
"mac.localASR.phase.completed" = "Completed";
|
||
"mac.error.accessibilityRequired" = "Enable Accessibility for OSGKeyboard in System Settings";
|
||
"mac.foregroundApp" = "Front app: %@";
|
||
"mac.sync.settingsTitle" = "Cross-Device iCloud Sync";
|
||
"mac.sync.settingsSubtitle" = "Sync settings, history, and API keys across devices via iCloud.";
|
||
"mac.sync.syncNow" = "Sync Now";
|
||
"mac.sync.dictTitle" = "Personal dictionary iCloud sync";
|
||
"mac.sync.dictSubtitle" = "Keep your dictionary in sync across all devices.";
|
||
"mac.sync.error.generic" = "Could not sync with iCloud. Try again later.";
|
||
"mac.sync.error.dictTooLarge" = "Dictionary is too large to sync via iCloud.";
|
||
|
||
"settings.appLanguage.auto" = "Auto";
|
||
"settings.appLanguage.english" = "English";
|
||
"settings.appLanguage.chinese" = "Chinese";
|
||
|
||
/* Voluntary support tip (Consumable IAP — no feature unlock) */
|
||
"tip.title" = "Support the Developer";
|
||
"tip.body" = "OSGKeyboard is completely free with every feature unlocked. If you find it useful, you can leave an optional tip — it does not unlock anything extra.";
|
||
"tip.button" = "Tip %@";
|
||
"tip.buttonFallback" = "Send a Tip";
|
||
"tip.consumableNotice" = "Consumable in-app purchase. Tips cannot be restored (Apple policy).";
|
||
"tip.thankYou.title" = "Thank you!";
|
||
"tip.thankYou.message" = "Your support helps keep OSGKeyboard free and open for everyone.";
|
||
"tip.thankYou.past" = "You've supported us %lld time(s). Thank you!";
|
||
"tip.error.title" = "Purchase Failed";
|
||
"tip.error.productUnavailable" = "The tip product is unavailable right now. Try again later.";
|
||
"tip.error.pending" = "Your purchase is pending approval.";
|
||
"tip.error.unknown" = "The purchase could not be completed.";
|
||
"tip.alert.dismiss" = "OK";
|