947d6220ff
Resolved real conflicts introduced by translation-polish-2 (#3) and docs refresh (#4) being merged to main during development: - OSGKeyboardShared/Models/ProviderConfig.swift Add polishIntensity field alongside translationTargetLocaleId / polishScenarioId / handednessPreference. Both new fields coexist. - OSGKeyboardShared/Services/AppGroupStore.swift Keep main's translation setters; add polishIntensity setter, detectedAppContext setter, and personalDictionary getter/setter. - OSGKeyboardShared/Services/PolishingService.swift Merge v0.2.1 translate-and-polish path with v0.3.0 context-aware intelligent prompt. New polish() entry point accepts both modes; translation mode still uses TranslationPrompt, polish mode now uses buildPrompt(for:context:). - OSGKeyboard/Views/SettingsView.swift Compose localEngineSettingsSection (main) with polishIntensitySection, languageAndModelsSection, systemPromptLinkSection, personalDictionaryLinkSection (feature). - OSGKeyboardShared/{en,zh-Hans}.lproj/Shared.strings Concat scenario keys + polish intensity / app context / dictionary keys. Auto-merged without conflict: - AppGroupStore new methods (localASRBackend, etc.) - FlowSessionManager, KeyboardViewController (auto-merged) - MaterialIcon, HistoryView (auto-merged, my icons added on top) Co-authored-by: Mavis <Mavis@hkgood.dev>
81 lines
3.5 KiB
Plaintext
81 lines
3.5 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/translation needs a DeepSeek API key. Inserted raw ASR text — set PreconfiguredKeys.deepseek in the project (local engine) or API key in Settings (cloud engine).";
|
|
|
|
/* LLM providers */
|
|
"provider.openai" = "OpenAI";
|
|
"provider.deepseek" = "DeepSeek";
|
|
"provider.qwen" = "Qwen (DashScope)";
|
|
"provider.zhipu" = "Zhipu GLM";
|
|
"provider.moonshot" = "Moonshot";
|
|
"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: %@";
|
|
|
|
/* 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" = "Insert the raw ASR transcript with no LLM call.";
|
|
"polish.intensity.light.desc" = "Drop only isolated filler words and obvious duplications.";
|
|
"polish.intensity.medium.desc" = "Correct recognition errors, remove fillers, polish phrasing. Default.";
|
|
"polish.intensity.heavy.desc" = "Restructure into lists and paragraphs. 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";
|