diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 84e7da4..6aac0fd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -46,6 +46,7 @@ swift build -Xswiftc -strict-concurrency=complete -Xswiftc -warnings-as-errors
- Do not commit local build output, `.dmg` files, `.worktrees/`, `.build/`, API keys, tokens, or personal configuration.
- Update documentation when changing install, setup, provider, or release behavior.
- Use English for documentation and project-facing prose.
+- Interface text lives in `Sources/InkletApp/Localization/`, one file per language. Add each new key to every language file; `scripts/check-localization.sh` fails when a table is missing a key.
## Distribution And Release Changes
diff --git a/Sources/InkletApp/InkletLocalization.swift b/Sources/InkletApp/InkletLocalization.swift
index 7c44617..1b4244a 100644
--- a/Sources/InkletApp/InkletLocalization.swift
+++ b/Sources/InkletApp/InkletLocalization.swift
@@ -124,6 +124,7 @@ enum L10n {
return .english
}
+ // Each language table lives in Localization/L10n+
.swift.
static var translationTables: [InterfaceLanguage: [String: String]] {
[
.english: en,
@@ -138,3156 +139,6 @@ enum L10n {
.italian: it
]
}
-
- private static let en: [String: String] = [
- "app.menu.edit": "Edit",
- "app.menu.undo": "Undo",
- "app.menu.redo": "Redo",
- "app.menu.cut": "Cut",
- "app.menu.copy": "Copy",
- "app.menu.paste": "Paste",
- "app.menu.pasteAndMatchStyle": "Paste and Match Style",
- "app.menu.delete": "Delete",
- "app.menu.selectAll": "Select All",
- "app.menu.openPopover": "Open Inklet",
- "app.menu.settings": "Settings",
- "app.menu.about": "About Inklet",
- "app.menu.quit": "Quit",
- "app.menu.checkForUpdates": "Check for Updates…",
- "app.menu.checkingForUpdates": "Checking for Updates…",
- "update.available.title": "An Inklet update is available",
- "update.available.latestVersion": "Latest: %@ (build %@)",
- "update.available.currentVersion": "Current: %@",
- "update.available.noNotes": "View the release on GitHub for details.",
- "update.action.viewOnGitHub": "View on GitHub",
- "update.action.later": "Later",
- "update.upToDate.title": "Inklet is up to date",
- "update.upToDate.message": "You’re using %@.",
- "update.error.title": "Couldn’t check for updates",
- "update.error.message": "Try again in a moment.",
- "update.action.retry": "Retry",
- "update.action.cancel": "Cancel",
- "update.action.ok": "OK",
- "legacyMigration.notice.title": "Old Inklet data was not imported",
- "legacyMigration.notice.message": "Your previous settings and history are still preserved. You can choose the matching Inklet Data folder to import them.",
- "legacyMigration.action.importOldData": "Import Old Data…",
- "legacyMigration.panel.title": "Choose Old Inklet Data",
- "legacyMigration.panel.message": "Select the matching Inklet Data folder to import your preserved settings and history.",
- "legacyMigration.import.progress": "Importing old data…",
- "legacyMigration.import.invalidSelection": "The selected folder is not the legacy data folder for this Inklet app.",
- "legacyMigration.import.failed": "Old data could not be imported. Your previous settings and history are still preserved.",
- "legacyMigration.import.partialFailure": "Some old data could not be imported. Your previous settings and history are still preserved.",
- "legacyMigration.import.relaunching": "Inklet needs to relaunch to finish loading the imported data.",
- "legacyMigration.import.relaunchProgress": "Relaunching Inklet…",
- "legacyMigration.import.relaunchFailed": "Inklet could not relaunch. Your imported data is ready and will load the next time you open Inklet.",
- "legacyMigration.action.retryRelaunch": "Relaunch Inklet",
- "legacyMigration.action.quit": "Quit Inklet",
- "legacyMigration.settings.help": "Import your preserved settings and history from the matching Inklet Data folder.",
- "settings.section.history": "History",
- "settings.description.history": "Review successful writing and selection results, plus legacy voice results saved locally.",
- "settings.history.filter.all": "All",
- "settings.history.source.write": "Write",
- "settings.history.source.voice": "Voice",
- "settings.history.source.selection": "Selection",
- "settings.history.empty": "No saved history yet.",
- "settings.history.original": "Original",
- "settings.history.result": "Result",
- "settings.history.copyOriginal": "Copy original",
- "settings.history.copyResult": "Copy result",
- "settings.history.clear": "Clear History",
- "settings.history.clearConfirmTitle": "Clear history?",
- "settings.history.clearConfirmMessage": "This deletes all saved history records from this Mac. This cannot be undone.",
- "settings.history.cleared": "History cleared.",
- "settings.history.error.loadFailed": "Could not load history.",
- "settings.history.error.clearFailed": "Could not clear history.",
- "settings.privacy.history": "• Successful write and selection text history is saved locally; legacy voice records remain readable",
- "selection.action.translate": "Translate",
- "selection.action.pronounce": "Pronounce",
- "selection.action.translating": "Translating...",
- "selection.action.preparingPronunciation": "Preparing audio...",
- "selection.action.playingPronunciation": "Playing...",
- "selection.action.pronounceOriginal": "Play original",
- "selection.action.pronounceTranslation": "Play translation",
- "selection.action.audioLabel.original": "Original",
- "selection.action.audioLabel.translation": "Trans.",
- "selection.action.copyTranslation": "Copy translation",
- "selection.action.retry": "Retry",
- "selection.action.unsupportedTitle": "Selected text unavailable",
- "selection.action.unsupportedMessage": "The current app does not expose selected text to Inklet.",
- "selection.action.missingOpenAIKey": "Add an OpenAI API key in Settings to use AI pronunciation.",
- "selection.action.translationFailed": "Translation failed.",
- "selection.action.pronunciationFailed": "Pronunciation failed.",
- "about.tagline": "Turn rough thoughts into clear text",
- "about.website": "Website",
- "about.privacyPolicy": "Privacy Policy",
- "about.support": "Support",
- "setup.window.title": "Welcome to Inklet",
- "setup.title": "Inklet is ready",
- "setup.subtitle": "It is running in your menu bar. Grant Accessibility permission so Inklet can insert text back into the app you are using.",
- "setup.menubar.title": "Find Inklet in the menu bar",
- "setup.menubar.description": "Click the Inklet icon near the clock whenever you want to open it.",
- "setup.shortcut.title": "Use the shortcut",
- "setup.shortcut.description": "The default shortcut is %@. If it conflicts with another app, change it in Settings.",
- "setup.done": "Done",
- "language.system": "System",
- "settings.window.title": "Inklet Settings",
- "settings.sidebar.preferences": "Preferences",
- "settings.sidebar.hint": "Auto-saved · ⌘, Open",
- "settings.version": "Version %@",
- "settings.section.general": "General",
- "settings.section.writeAssistant": "Write Assistant",
- "settings.section.selectionAssistant": "Selection Assistant",
- "settings.section.providers": "Providers",
- "settings.section.selectionActions": "Selection Actions",
- "settings.section.promptModes": "Prompt Modes",
- "settings.section.about": "About",
- "settings.section.permissions": "Permissions",
- "settings.description.general": "Shared OpenAI key, interface preferences, permissions, and privacy.",
- "settings.description.writeAssistant": "Configure writing, dictation, generation behavior, and prompt modes.",
- "settings.description.selectionAssistant": "Automatic translation and pronunciation tools for selected text in other apps.",
- "settings.description.providers": "Choose an LLM provider, model, and API key.",
- "settings.description.selectionActions": "Automatic actions for selected text in other apps.",
- "settings.description.promptModes": "Manage conversion modes and system prompts shown in the popover.",
- "settings.description.about": "Keyboard shortcuts, privacy notes, and app information.",
- "settings.description.permissions": "Check the macOS permission needed to insert text.",
- "settings.row.language": "Interface Language",
- "settings.help.language": "Use System to follow your macOS language.",
- "settings.row.appearance": "Appearance",
- "settings.help.appearance": "Choose Light, Dark, or follow macOS.",
- "appearance.system": "System",
- "appearance.light": "Light",
- "appearance.dark": "Dark",
- "settings.row.hotkey": "Hotkey",
- "settings.help.hotkey": "For example: ⌥Space, Option+Space, Cmd+Space.",
- "settings.hotkey.record": "Record Shortcut",
- "settings.hotkey.recording": "Press shortcut",
- "settings.hotkey.pressKey": " key",
- "settings.row.timeout": "Timeout",
- "settings.help.timeout": "Maximum request duration.",
- "settings.seconds": "%d sec",
- "settings.row.provider": "Provider",
- "settings.help.provider": "Current provider.",
- "settings.row.openAIAPIKey": "OpenAI API Key",
- "settings.help.openAIAPIKey": "Stored locally on this Mac and shared by writing, realtime dictation, selection translation, and pronunciation. Clear the field to remove it.",
- "settings.row.apiKey": "API Key",
- "settings.help.apiKey": "Stored locally on this Mac. Clear the field to remove it.",
- "settings.row.endpoint": "Endpoint",
- "settings.help.endpoint": "Full OpenAI-compatible /chat/completions URL.",
- "settings.row.model": "Model",
- "settings.help.model.default": "Default: %@",
- "settings.group.writing": "Writing",
- "settings.group.writing.help": "Configure the Writing Assistant and its editable source draft.",
- "settings.group.dictation": "Dictation",
- "settings.group.dictation.help": "Hold the shortcut to send microphone audio to OpenAI in real time while you speak.",
- "settings.group.dictationAdvanced": "Advanced Dictation",
- "settings.row.dictationShortcut": "Hold shortcut",
- "settings.help.dictationShortcut": "Works only while the Writing Assistant source editor is active. A short press does nothing.",
- "settings.voice.shortcut.rightOption": "Right Option",
- "settings.voice.shortcut.rightCommand": "Right Command",
- "settings.voice.shortcut.leftOption": "Left Option",
- "settings.voice.shortcut.leftCommand": "Left Command",
- "settings.voice.shortcut.disabled": "Disabled",
- "settings.quickStart.voice.pressAndHold": "Hold for voice input",
- "settings.row.microphone": "Microphone",
- "settings.help.microphone": "Choose the audio input used for realtime dictation.",
- "settings.microphone.systemDefault": "System Default",
- "settings.row.fallbackSpeechModel": "Recovery model",
- "settings.help.fallbackSpeechModel": "Model used for the single recovery attempt after a realtime connection failure.",
- "dictation.hint.hold": "Hold %@ to dictate",
- "dictation.status.connecting": "Connecting…",
- "dictation.status.listening": "Listening… Release to finish",
- "dictation.status.recordingFallback": "Connection lost… Keep speaking",
- "dictation.status.finalizing": "Finishing transcription…",
- "dictation.status.recovering": "Recovering from the temporary recording…",
- "dictation.status.ready": "Dictation ready",
- "dictation.accessibility.ready": "Dictation is ready.",
- "dictation.accessibility.listening": "Dictation is listening. Release to finish.",
- "dictation.accessibility.recordingFallback": "The connection was lost. Keep speaking for recovery.",
- "dictation.accessibility.finalizing": "Finishing the dictation transcription.",
- "dictation.accessibility.recovering": "Recovering dictation from the temporary recording.",
- "dictation.accessibility.completed": "Dictation completed.",
- "dictation.accessibility.cancelled": "Dictation cancelled.",
- "dictation.accessibility.failed": "Dictation failed.",
- "dictation.accessibility.sourceEditor": "Writing source editor",
- "dictation.undo.action": "Dictation",
- "dictation.error.missingAPIKey": "Add an OpenAI API key in Settings to use dictation.",
- "dictation.error.microphonePermission": "Microphone permission is required for dictation.",
- "dictation.error.noAudioInputDevice": "No microphone or audio input device is available.",
- "dictation.error.recordingUnavailable": "Could not start audio recording.",
- "dictation.error.realtimeBufferOverflow": "Realtime audio could not keep up. Please try again.",
- "dictation.error.connection": "The realtime transcription connection failed.",
- "dictation.error.connectionTimeout": "Realtime transcription took too long to connect.",
- "dictation.error.finalTimeout": "The final realtime transcription did not arrive in time.",
- "dictation.error.fallback": "Dictation could not be recovered from the temporary recording.",
- "dictation.error.noSpeech": "No speech was recognized.",
- "settings.row.selectionActionsEnabled": "Enable Selection Actions",
- "settings.help.selectionActionsEnabled": "Show a small menu after selected text pauses briefly.",
- "settings.row.forceSelectionMode": "Force Selection",
- "settings.help.forceSelectionMode": "Fallback used when Accessibility cannot read selected text. Menu Copy does not synthesize keyboard input.",
- "settings.forceSelection.disabled": "Off",
- "settings.forceSelection.menuCopyOnly": "Menu Copy only",
- "settings.forceSelection.menuCopyThenShortcut": "Menu Copy, then Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, then Menu Copy",
- "settings.row.allowSimulatedCopyFallback": "Allow Simulated Cmd+C",
- "settings.help.allowSimulatedCopyFallback": "Sends Cmd+C to the foreground app when Menu Copy is unavailable. This may interfere with games or remote apps.",
- "settings.row.translationLanguage": "Translation Language",
- "settings.help.translationLanguage": "Language used by the selected-text Translate action.",
- "settings.row.translationPrompt": "Translate Prompt",
- "settings.help.translationPrompt": "Instructions used by the selected-text Translate action. Use {targetLanguage} for the chosen language.",
- "settings.translationPrompt.restoreDefault": "Restore Default",
- "settings.row.aiPronunciation": "AI Pronunciation Voice",
- "settings.help.aiPronunciation": "Voice used by selected-text Pronounce. Uses OpenAI text-to-speech with your OpenAI API key.",
- "settings.row.aiPronunciationSpeed": "AI Pronunciation Speed",
- "settings.help.aiPronunciationSpeed": "Playback speed used by selected-text Pronounce and voice preview.",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "Preview voice",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "Follow interface language",
- "settings.model.custom": "Custom...",
- "settings.model.refreshing": "Refreshing model list...",
- "settings.model.customized": "Custom model *",
- "settings.mode.untitled": "Untitled mode",
- "settings.mode.add": "Add Mode",
- "settings.mode.newName": "New Mode",
- "settings.mode.newDescription": "Custom transformation mode",
- "settings.mode.visible": "Visible",
- "settings.mode.hidden": "Hidden",
- "settings.mode.pick": "Select a Prompt Mode",
- "settings.mode.visibleInMenu": "Visible in menu",
- "settings.mode.visibleInMenuHelp": "Show this mode in the mode selector.",
- "settings.mode.moveUp": "Move up",
- "settings.mode.moveDown": "Move down",
- "settings.mode.dragToSort": "Drag to reorder",
- "settings.mode.delete": "Delete mode",
- "settings.mode.deleteConfirmTitle": "Delete prompt mode?",
- "settings.mode.deleteConfirmMessage": "Delete “%@”? This cannot be undone.",
- "settings.cancel": "Cancel",
- "settings.provider.configured": "Configured",
- "settings.provider.notConfigured": "Not configured",
- "settings.provider.active": "Active",
- "settings.provider.saved": "Saved",
- "settings.provider.savedLocally": "Saved locally",
- "settings.provider.pendingKey": "New key ready to save",
- "settings.provider.notLoaded": "Saved keys are not shown",
- "settings.provider.pendingSave": "Pending save",
- "settings.row.name": "Name",
- "settings.help.name": "Name shown in the popover.",
- "settings.row.description": "Description",
- "settings.help.description": "What this mode does.",
- "settings.row.systemPrompt": "Prompt",
- "settings.characters": "%d chars",
- "settings.permission.authorized": "Accessibility authorized",
- "settings.permission.required": "Accessibility permission required",
- "settings.permission.accessibility": "Accessibility",
- "settings.permission.description": "Click Open Settings, click +, choose /Applications/Inklet.app, then enable Inklet.",
- "settings.permission.open": "Open System Settings",
- "settings.permission.openShort": "Open Settings",
- "settings.systemPermissions.title": "System permissions",
- "settings.quickStart.title": "Keyboard shortcuts",
- "settings.quickStart.help": "Common actions in the popover.",
- "settings.quickStart.open": "Open Inklet",
- "settings.quickStart.submit": "Transform, or insert the result",
- "settings.quickStart.original": "Insert original text",
- "settings.quickStart.close": "Go back or close",
- "settings.privacy.title": "Privacy & Security",
- "settings.privacy.keychain": "• API keys are stored locally on this Mac",
- "settings.privacy.provider": "• Text is sent directly to OpenAI",
- "settings.privacy.voice": "• Realtime dictation audio and pronunciation text are sent directly to OpenAI; recovery recordings stay temporary and are deleted when the session ends",
- "settings.privacy.clipboard": "• Clipboard contents are restored after insertion and configured Force Selection reads",
- "settings.footer.pending": "Changes are saved automatically and apply the next time the popover opens.",
- "settings.save": "Save",
- "settings.saved": "Saved",
- "settings.error.visibleModeRequired": "Keep at least one visible mode.",
- "settings.error.promptModeRequired": "Keep at least one prompt mode.",
- "settings.error.modelRequired": "Model cannot be empty.",
- "settings.error.endpointInvalid": "Endpoint must be a valid HTTP URL.",
- "settings.error.openAccessibility": "Could not open Accessibility settings.",
- "settings.error.saveFailed": "Save failed: %@",
- "popover.input.placeholder": "Enter text to transform or insert",
- "popover.modeSearch.placeholder": "Search modes",
- "popover.modeSearch.empty": "No matching modes",
- "popover.modeSearch.select": "Select",
- "popover.modeSearch.write": "Write",
- "popover.result.title": "Result",
- "popover.result.editable": "Editable before inserting",
- "popover.result.generatedWith": "Generated with %@",
- "popover.mode.picker": "Mode",
- "popover.mode.backToModes": "Choose mode",
- "popover.status.ready": "Ready",
- "popover.status.preview": "Preview",
- "popover.action.transform": "Transform",
- "popover.action.regenerate": "Regenerate",
- "popover.action.insert": "Insert",
- "popover.action.insertOriginal": "Insert Original",
- "popover.hint.transformInsert": "Transform/Insert",
- "popover.hint.original": "Original",
- "popover.hint.newLine": "New Line",
- "popover.hint.mode": "Mode",
- "popover.hint.back": "Back",
- "popover.hint.close": "Close",
- "popover.hint.accessibility": "Shortcuts: Enter transforms or inserts, Command Enter inserts original text, Escape goes back or closes",
- "popover.busy.inserting": "Inserting...",
- "popover.busy.transforming": "Transforming...",
- "popover.error.emptyOriginal": "Enter text to insert.",
- "popover.error.missingTarget": "Could not find the target app to insert text.",
- "popover.error.missingAPIKey": "Configure the %@ API Key in Settings first.",
- "insertion.error.accessibility": "Enable Accessibility permission before inserting text.",
- "insertion.error.activation": "Could not return to the original app. Please try again.",
- "insertion.error.pasteEvent": "Could not send the paste shortcut.",
- "insertion.error.clipboardRestore": "Inserted text, but failed to restore the clipboard.",
- "error.emptySource": "Enter text to transform.",
- "error.emptyResponse": "The model returned an empty response.",
- "error.timeout": "Request timed out. Please try again.",
- "error.networkConnectionLost": "The network connection was interrupted. Please try again.",
- "error.provider.urlInvalid": "%@ request failed: invalid URL",
- "error.provider.httpUnknown": "%@ request failed: HTTP unknown",
- "error.provider.prefix": "%@ request failed: %@",
- "hotkey.error.unsupported": "Unsupported hotkey “%@”. Supported: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
- "hotkey.error.registrationFailed": "Hotkey registration failed (%d).",
- "prompt.simpleCorrectEnglish.description": "Rewrite or translate into simple, correct English",
- "prompt.chineseSummary.description": "Summarize any text into concise Simplified Chinese",
- "prompt.translateToEnglish.description": "Rewrite or translate into simple, correct English",
- "prompt.improveWriting.description": "Improve writing while keeping the original language",
- "prompt.makeConcise.description": "Shorten text while keeping the original language and key points",
- "prompt.professionalTone.description": "Rewrite with a clearer, more professional tone",
- "prompt.friendlyReply.description": "Rewrite as a natural, friendly reply",
- "prompt.custom.description": "Use your custom prompt"
- ]
-
- private static let zhHans: [String: String] = [
- "app.menu.edit": "编辑",
- "app.menu.undo": "撤销",
- "app.menu.redo": "重做",
- "app.menu.cut": "剪切",
- "app.menu.copy": "复制",
- "app.menu.paste": "粘贴",
- "app.menu.pasteAndMatchStyle": "粘贴并匹配样式",
- "app.menu.delete": "删除",
- "app.menu.selectAll": "全选",
- "app.menu.openPopover": "打开 Inklet",
- "app.menu.settings": "设置",
- "app.menu.about": "关于 Inklet",
- "app.menu.quit": "退出",
- "app.menu.checkForUpdates": "检查更新…",
- "app.menu.checkingForUpdates": "正在检查更新…",
- "update.available.title": "Inklet 有可用更新",
- "update.available.latestVersion": "最新版本:%@(构建 %@)",
- "update.available.currentVersion": "当前版本:%@",
- "update.available.noNotes": "请前往 GitHub 查看发布详情。",
- "update.action.viewOnGitHub": "在 GitHub 上查看",
- "update.action.later": "稍后",
- "update.upToDate.title": "Inklet 已是最新版本",
- "update.upToDate.message": "你正在使用 %@。",
- "update.error.title": "无法检查更新",
- "update.error.message": "请稍后重试。",
- "update.action.retry": "重试",
- "update.action.cancel": "取消",
- "update.action.ok": "好",
- "legacyMigration.notice.title": "旧版 Inklet 数据尚未导入",
- "legacyMigration.notice.message": "你之前的设置和历史记录仍被保留。你可以选择对应的 Inklet Data 文件夹进行导入。",
- "legacyMigration.action.importOldData": "导入旧数据…",
- "legacyMigration.panel.title": "选择旧版 Inklet 数据",
- "legacyMigration.panel.message": "请选择对应的 Inklet Data 文件夹,以导入仍被保留的设置和历史记录。",
- "legacyMigration.import.progress": "正在导入旧数据…",
- "legacyMigration.import.invalidSelection": "所选文件夹不是当前 Inklet 对应的旧数据文件夹。",
- "legacyMigration.import.failed": "无法导入旧数据。你之前的设置和历史记录仍被保留。",
- "legacyMigration.import.partialFailure": "部分旧数据未能导入。你之前的设置和历史记录仍被保留。",
- "legacyMigration.import.relaunching": "Inklet 需要重新启动以载入已导入的数据。",
- "legacyMigration.import.relaunchProgress": "正在重新启动…",
- "legacyMigration.import.relaunchFailed": "Inklet 无法重新启动。已导入的数据已准备就绪,将在下次打开 Inklet 时载入。",
- "legacyMigration.action.retryRelaunch": "重新启动 Inklet",
- "legacyMigration.action.quit": "退出 Inklet",
- "legacyMigration.settings.help": "从对应的 Inklet Data 文件夹导入仍被保留的设置和历史记录。",
- "settings.section.history": "历史",
- "settings.description.history": "查看保存在本机的成功写作和选区结果,以及旧版语音结果。",
- "settings.history.filter.all": "全部",
- "settings.history.source.write": "写作",
- "settings.history.source.voice": "语音",
- "settings.history.source.selection": "选区",
- "settings.history.empty": "还没有保存的历史。",
- "settings.history.original": "原文",
- "settings.history.result": "结果",
- "settings.history.copyOriginal": "复制原文",
- "settings.history.copyResult": "复制结果",
- "settings.history.clear": "清空历史",
- "settings.history.clearConfirmTitle": "清空历史?",
- "settings.history.clearConfirmMessage": "这会从这台 Mac 删除所有已保存的历史记录。此操作无法撤销。",
- "settings.history.cleared": "历史已清空。",
- "settings.history.error.loadFailed": "无法加载历史。",
- "settings.history.error.clearFailed": "无法清空历史。",
- "settings.privacy.history": "• 成功的写作和选区文本历史会保存在本机;旧版语音记录仍可读取",
- "selection.action.translate": "翻译",
- "selection.action.pronounce": "发音",
- "selection.action.translating": "正在翻译...",
- "selection.action.preparingPronunciation": "正在准备音频...",
- "selection.action.playingPronunciation": "正在播放...",
- "selection.action.pronounceOriginal": "播放原文",
- "selection.action.pronounceTranslation": "播放译文",
- "selection.action.audioLabel.original": "原文",
- "selection.action.audioLabel.translation": "译文",
- "selection.action.copyTranslation": "复制译文",
- "selection.action.retry": "重试",
- "selection.action.unsupportedTitle": "无法取得选中文本",
- "selection.action.unsupportedMessage": "当前 App 未将选中文本提供给 Inklet。",
- "selection.action.missingOpenAIKey": "请在设置中添加 OpenAI API key 以使用 AI 发音。",
- "selection.action.translationFailed": "翻译失败。",
- "selection.action.pronunciationFailed": "发音失败。",
- "about.tagline": "将粗略想法化为清晰文字",
- "about.website": "官网",
- "about.privacyPolicy": "隐私政策",
- "about.support": "支持",
- "setup.window.title": "欢迎使用 Inklet",
- "setup.title": "Inklet 已准备好",
- "setup.subtitle": "它正在菜单栏中运行。开启辅助功能权限后,Inklet 才能把文本插回你正在使用的 app。",
- "setup.menubar.title": "在菜单栏找到 Inklet",
- "setup.menubar.description": "需要打开 Inklet 时,点击屏幕右上角时钟附近的 Inklet 图标。",
- "setup.shortcut.title": "使用快捷键",
- "setup.shortcut.description": "默认快捷键是 %@。如果和其他 app 冲突,可以在设置里修改。",
- "setup.done": "完成",
- "language.system": "跟随系统",
- "settings.window.title": "Inklet 设置",
- "settings.sidebar.preferences": "偏好设置",
- "settings.sidebar.hint": "自动保存 · ⌘, 打开",
- "settings.version": "版本 %@",
- "settings.section.general": "通用",
- "settings.section.writeAssistant": "写作助手",
- "settings.section.selectionAssistant": "选区助手",
- "settings.section.providers": "模型服务商",
- "settings.section.selectionActions": "选区动作",
- "settings.section.promptModes": "Prompt 模式",
- "settings.section.about": "关于",
- "settings.section.permissions": "权限",
- "settings.description.general": "共享 OpenAI API Key、界面偏好、权限和隐私。",
- "settings.description.writeAssistant": "配置写作、听写、生成参数和 Prompt 模式。",
- "settings.description.selectionAssistant": "管理其他 App 中选中文字后的翻译和发音工具。",
- "settings.description.providers": "选择 LLM 服务商、模型和对应的 API Key。",
- "settings.description.selectionActions": "管理其他 App 中选中文本后的自动动作。",
- "settings.description.promptModes": "管理浮窗中的转换模式和系统提示词。",
- "settings.description.about": "查看键盘快捷键、隐私说明和应用信息。",
- "settings.description.permissions": "检查插入文本所需的 macOS 权限。",
- "settings.row.language": "界面语言",
- "settings.help.language": "选择 System 时跟随 macOS 语言。",
- "settings.row.appearance": "外观",
- "settings.help.appearance": "选择浅色、深色,或跟随 macOS。",
- "appearance.system": "跟随系统",
- "appearance.light": "浅色",
- "appearance.dark": "深色",
- "settings.row.hotkey": "快捷键",
- "settings.help.hotkey": "例如 ⌥Space、Option+Space、Cmd+Space。",
- "settings.hotkey.record": "录制快捷键",
- "settings.hotkey.recording": "按下快捷键",
- "settings.hotkey.pressKey": " 键",
- "settings.row.timeout": "超时时间",
- "settings.help.timeout": "请求最长等待时间。",
- "settings.seconds": "%d 秒",
- "settings.row.provider": "服务商",
- "settings.help.provider": "当前服务商。",
- "settings.row.openAIAPIKey": "OpenAI API Key",
- "settings.help.openAIAPIKey": "保存在本机,写作、实时听写、选区翻译和发音共用这一把 Key;清空输入框即可删除。",
- "settings.row.apiKey": "API Key",
- "settings.help.apiKey": "API Key 会保存在本机;清空输入框即可删除。",
- "settings.row.endpoint": "接口地址",
- "settings.help.endpoint": "完整的 OpenAI-compatible /chat/completions URL。",
- "settings.row.model": "模型",
- "settings.help.model.default": "默认:%@",
- "settings.group.writing": "写作",
- "settings.group.writing.help": "配置写作助手及其可编辑的原文草稿。",
- "settings.group.dictation": "听写",
- "settings.group.dictation.help": "说话时长按快捷键,麦克风音频会实时发送到 OpenAI。",
- "settings.group.dictationAdvanced": "高级听写",
- "settings.row.dictationShortcut": "长按快捷键",
- "settings.help.dictationShortcut": "仅在写作助手的原文编辑器处于活动状态时生效;短按不会执行任何操作。",
- "settings.voice.shortcut.rightOption": "右 Option",
- "settings.voice.shortcut.rightCommand": "右 Command",
- "settings.voice.shortcut.leftOption": "左 Option",
- "settings.voice.shortcut.leftCommand": "左 Command",
- "settings.voice.shortcut.disabled": "关闭",
- "settings.quickStart.voice.pressAndHold": "按住进行语音输入",
- "settings.row.microphone": "麦克风",
- "settings.help.microphone": "选择实时听写使用的音频输入设备。",
- "settings.microphone.systemDefault": "系统默认",
- "settings.row.fallbackSpeechModel": "恢复转写模型",
- "settings.help.fallbackSpeechModel": "实时连接失败后单次恢复尝试所使用的模型。",
- "dictation.hint.hold": "长按 %@ 开始听写",
- "dictation.status.connecting": "正在连接…",
- "dictation.status.listening": "正在听写…松开以完成",
- "dictation.status.recordingFallback": "连接已断开…可继续说话",
- "dictation.status.finalizing": "正在完成转写…",
- "dictation.status.recovering": "正在使用临时录音恢复…",
- "dictation.status.ready": "听写已就绪",
- "dictation.accessibility.ready": "听写已准备就绪。",
- "dictation.accessibility.listening": "正在听写,松开快捷键以完成。",
- "dictation.accessibility.recordingFallback": "连接已断开,可继续说话以便恢复。",
- "dictation.accessibility.finalizing": "正在完成听写转写。",
- "dictation.accessibility.recovering": "正在从临时录音恢复听写。",
- "dictation.accessibility.completed": "听写已完成。",
- "dictation.accessibility.cancelled": "听写已取消。",
- "dictation.accessibility.failed": "听写失败。",
- "dictation.accessibility.sourceEditor": "写作原文编辑器",
- "dictation.undo.action": "听写",
- "dictation.error.missingAPIKey": "请在设置中添加 OpenAI API Key 后使用听写。",
- "dictation.error.microphonePermission": "听写需要麦克风权限。",
- "dictation.error.noAudioInputDevice": "没有可用的麦克风或音频输入设备。",
- "dictation.error.recordingUnavailable": "无法开始录音。",
- "dictation.error.realtimeBufferOverflow": "实时音频处理不及,请重试。",
- "dictation.error.connection": "实时转写连接失败。",
- "dictation.error.connectionTimeout": "实时转写连接超时。",
- "dictation.error.finalTimeout": "未能及时收到最终实时转写。",
- "dictation.error.fallback": "无法使用临时录音恢复听写。",
- "dictation.error.noSpeech": "未识别到语音。",
- "settings.row.selectionActionsEnabled": "启用选区动作",
- "settings.help.selectionActionsEnabled": "选中文本并短暂停顿后显示小菜单。",
- "settings.row.forceSelectionMode": "强制取词",
- "settings.help.forceSelectionMode": "辅助功能无法读取选中文本时使用此备用方式。菜单复制不会模拟键盘输入。",
- "settings.forceSelection.disabled": "关闭",
- "settings.forceSelection.menuCopyOnly": "仅菜单复制",
- "settings.forceSelection.menuCopyThenShortcut": "先菜单复制,再 Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "先 Cmd+C,再菜单复制",
- "settings.row.allowSimulatedCopyFallback": "允许模拟 Cmd+C",
- "settings.help.allowSimulatedCopyFallback": "菜单复制不可用时向前台 App 发送 Cmd+C,可能会干扰游戏或远程应用。",
- "settings.row.translationLanguage": "翻译语言",
- "settings.help.translationLanguage": "选中文本翻译动作使用的目标语言。",
- "settings.row.translationPrompt": "翻译 Prompt",
- "settings.help.translationPrompt": "选中文本翻译动作使用的指令。用 {targetLanguage} 表示所选语言。",
- "settings.translationPrompt.restoreDefault": "恢复默认",
- "settings.row.aiPronunciation": "AI 发音声音",
- "settings.help.aiPronunciation": "选中文字后“发音”使用的声音。使用 OpenAI API key 调用 OpenAI 文本转语音。",
- "settings.row.aiPronunciationSpeed": "AI 发音速度",
- "settings.help.aiPronunciationSpeed": "选中文字“发音”和试听声音使用的播放速度。",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "试听声音",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "跟随界面语言",
- "settings.model.custom": "自定义...",
- "settings.model.refreshing": "正在刷新模型列表...",
- "settings.model.customized": "自定义模型 *",
- "settings.mode.untitled": "未命名模式",
- "settings.mode.add": "添加模式",
- "settings.mode.newName": "新模式",
- "settings.mode.newDescription": "自定义转换模式",
- "settings.mode.visible": "显示",
- "settings.mode.hidden": "隐藏",
- "settings.mode.pick": "选择一个 Prompt Mode",
- "settings.mode.visibleInMenu": "在菜单中显示",
- "settings.mode.visibleInMenuHelp": "在浮窗的模式选择器中显示该模式。",
- "settings.mode.moveUp": "上移",
- "settings.mode.moveDown": "下移",
- "settings.mode.dragToSort": "拖动排序",
- "settings.mode.delete": "删除模式",
- "settings.mode.deleteConfirmTitle": "删除这个 Prompt Mode?",
- "settings.mode.deleteConfirmMessage": "确定删除“%@”?此操作无法撤销。",
- "settings.cancel": "取消",
- "settings.provider.configured": "已配置",
- "settings.provider.notConfigured": "未配置",
- "settings.provider.active": "当前启用",
- "settings.provider.saved": "已保存",
- "settings.provider.savedLocally": "已保存到本机",
- "settings.provider.pendingKey": "新 Key 待保存",
- "settings.provider.notLoaded": "已保存的 Key 不会显示",
- "settings.provider.pendingSave": "待保存",
- "settings.row.name": "名称",
- "settings.help.name": "浮窗中显示的名称。",
- "settings.row.description": "描述",
- "settings.help.description": "模式用途说明。",
- "settings.row.systemPrompt": "Prompt",
- "settings.characters": "%d 字符",
- "settings.permission.authorized": "Accessibility 已授权",
- "settings.permission.required": "需要 Accessibility 权限",
- "settings.permission.accessibility": "辅助功能",
- "settings.permission.description": "点击“打开设置”,点 +,选择 /Applications/Inklet.app,然后开启 Inklet。",
- "settings.permission.open": "打开系统权限设置",
- "settings.permission.openShort": "打开设置",
- "settings.systemPermissions.title": "系统权限",
- "settings.quickStart.title": "键盘快捷键",
- "settings.quickStart.help": "浮窗里的常用操作。",
- "settings.quickStart.open": "打开 Inklet",
- "settings.quickStart.submit": "转换,或插入结果",
- "settings.quickStart.original": "插入原文",
- "settings.quickStart.close": "返回或关闭",
- "settings.privacy.title": "隐私与安全",
- "settings.privacy.keychain": "• API Key 保存在本机",
- "settings.privacy.provider": "• 文本会直接发送到 OpenAI",
- "settings.privacy.voice": "• 实时听写音频和发音文本会直接发送到 OpenAI;恢复录音仅临时保存在本机,并在会话结束时删除",
- "settings.privacy.clipboard": "• 插入和已配置的强制取词读取后会恢复原剪贴板内容",
- "settings.footer.pending": "更改会自动保存,并在下一次浮窗打开时应用。",
- "settings.save": "保存",
- "settings.saved": "已保存",
- "settings.error.visibleModeRequired": "至少需要保留一个可见模式。",
- "settings.error.promptModeRequired": "至少需要保留一个 Prompt 模式。",
- "settings.error.modelRequired": "Model 不能为空。",
- "settings.error.endpointInvalid": "Endpoint 必须是有效的 HTTP URL。",
- "settings.error.openAccessibility": "无法打开辅助功能设置。",
- "settings.error.saveFailed": "保存失败:%@",
- "popover.input.placeholder": "输入要转换或插入的文本",
- "popover.modeSearch.placeholder": "搜索模式",
- "popover.modeSearch.empty": "没有匹配的模式",
- "popover.modeSearch.select": "选择",
- "popover.modeSearch.write": "写作",
- "popover.result.title": "结果",
- "popover.result.editable": "可编辑后插入",
- "popover.result.generatedWith": "由 %@ 生成",
- "popover.mode.picker": "模式",
- "popover.mode.backToModes": "选择模式",
- "popover.status.ready": "就绪",
- "popover.status.preview": "预览",
- "popover.action.transform": "转换",
- "popover.action.regenerate": "重新生成",
- "popover.action.insert": "插入",
- "popover.action.insertOriginal": "插入原文",
- "popover.hint.transformInsert": "转换/插入",
- "popover.hint.original": "原文",
- "popover.hint.newLine": "换行",
- "popover.hint.mode": "模式",
- "popover.hint.back": "返回",
- "popover.hint.close": "关闭",
- "popover.hint.accessibility": "快捷键:Enter 转换或插入,Command Enter 插入原文,Escape 返回或关闭",
- "popover.busy.inserting": "正在插入...",
- "popover.busy.transforming": "正在转换...",
- "popover.error.emptyOriginal": "请输入要插入的文本。",
- "popover.error.missingTarget": "找不到要插入文本的目标应用。",
- "popover.error.missingAPIKey": "请先在设置中配置 %@ API Key。",
- "insertion.error.accessibility": "需要开启辅助功能权限后才能插入文本。",
- "insertion.error.activation": "无法切回原应用,请重试。",
- "insertion.error.pasteEvent": "无法发送粘贴快捷键。",
- "insertion.error.clipboardRestore": "插入后恢复剪贴板失败。",
- "error.emptySource": "请输入要转换的文本",
- "error.emptyResponse": "模型返回了空内容",
- "error.timeout": "请求超时,请稍后重试",
- "error.networkConnectionLost": "网络连接已中断,请重试。",
- "error.provider.urlInvalid": "%@ 请求失败:URL 无效",
- "error.provider.httpUnknown": "%@ 请求失败:HTTP unknown",
- "error.provider.prefix": "%@ 请求失败:%@",
- "hotkey.error.unsupported": "暂不支持快捷键“%@”。目前支持 ⌥Space、Option+Space、Alt+Space、⌘Space、Command+Space、Cmd+Space。",
- "hotkey.error.registrationFailed": "快捷键注册失败(%d)。",
- "prompt.simpleCorrectEnglish.description": "改写或翻译成简单、正确的英文",
- "prompt.chineseSummary.description": "把任意文本总结成简洁中文",
- "prompt.translateToEnglish.description": "改写或翻译成简单、正确的英文",
- "prompt.improveWriting.description": "保持原语言,润色语法、表达和清晰度",
- "prompt.makeConcise.description": "保持原语言,压缩文字并保留重点",
- "prompt.professionalTone.description": "改成更职业、清楚、礼貌的语气",
- "prompt.friendlyReply.description": "改成自然、友好、适合回复的表达",
- "prompt.custom.description": "使用用户自定义 prompt"
- ]
-
- private static let zhHant: [String: String] = [
- "app.menu.edit": "編輯",
- "app.menu.undo": "復原",
- "app.menu.redo": "重做",
- "app.menu.cut": "剪下",
- "app.menu.copy": "拷貝",
- "app.menu.paste": "貼上",
- "app.menu.pasteAndMatchStyle": "貼上並符合樣式",
- "app.menu.delete": "刪除",
- "app.menu.selectAll": "全選",
- "app.menu.openPopover": "開啟 Inklet",
- "app.menu.settings": "設定",
- "app.menu.about": "關於 Inklet",
- "app.menu.quit": "結束",
- "app.menu.checkForUpdates": "檢查更新…",
- "app.menu.checkingForUpdates": "正在檢查更新…",
- "update.available.title": "Inklet 有可用更新",
- "update.available.latestVersion": "最新版本:%@(組建 %@)",
- "update.available.currentVersion": "目前版本:%@",
- "update.available.noNotes": "請前往 GitHub 查看發布詳情。",
- "update.action.viewOnGitHub": "在 GitHub 上查看",
- "update.action.later": "稍後",
- "update.upToDate.title": "Inklet 已是最新版本",
- "update.upToDate.message": "你正在使用 %@。",
- "update.error.title": "無法檢查更新",
- "update.error.message": "請稍後再試。",
- "update.action.retry": "重試",
- "update.action.cancel": "取消",
- "update.action.ok": "好",
- "legacyMigration.notice.title": "舊版 Inklet 資料尚未匯入",
- "legacyMigration.notice.message": "你之前的設定和歷史記錄仍被保留。你可以選擇對應的 Inklet Data 資料夾進行匯入。",
- "legacyMigration.action.importOldData": "匯入舊資料…",
- "legacyMigration.panel.title": "選擇舊版 Inklet 資料",
- "legacyMigration.panel.message": "請選擇對應的 Inklet Data 資料夾,以匯入仍被保留的設定和歷史記錄。",
- "legacyMigration.import.progress": "正在匯入舊資料…",
- "legacyMigration.import.invalidSelection": "所選資料夾不是目前這個 Inklet 對應的舊版資料夾。",
- "legacyMigration.import.failed": "無法匯入舊資料。你之前的設定和歷史記錄仍被保留。",
- "legacyMigration.import.partialFailure": "部分舊資料未能匯入。你之前的設定和歷史記錄仍被保留。",
- "legacyMigration.import.relaunching": "Inklet 需要重新啟動,才能載入已匯入的資料。",
- "legacyMigration.import.relaunchProgress": "正在重新啟動…",
- "legacyMigration.import.relaunchFailed": "Inklet 無法重新啟動。已匯入的資料已準備就緒,將在下次開啟 Inklet 時載入。",
- "legacyMigration.action.retryRelaunch": "重新啟動 Inklet",
- "legacyMigration.action.quit": "結束 Inklet",
- "legacyMigration.settings.help": "從對應的 Inklet Data 資料夾匯入仍被保留的設定和歷史記錄。",
- "settings.section.history": "歷史",
- "settings.description.history": "查看保存在本機的寫作、選區結果及舊版語音結果。",
- "settings.history.filter.all": "全部",
- "settings.history.source.write": "寫作",
- "settings.history.source.voice": "語音",
- "settings.history.source.selection": "選區",
- "settings.history.empty": "尚無已保存歷史。",
- "settings.history.original": "原文",
- "settings.history.result": "結果",
- "settings.history.copyOriginal": "複製原文",
- "settings.history.copyResult": "複製結果",
- "settings.history.clear": "清空歷史",
- "settings.history.clearConfirmTitle": "清空歷史?",
- "settings.history.clearConfirmMessage": "這會從這台 Mac 刪除所有已保存的歷史記錄。此操作無法復原。",
- "settings.history.cleared": "歷史已清空。",
- "settings.history.error.loadFailed": "無法載入歷史。",
- "settings.history.error.clearFailed": "無法清空歷史。",
- "settings.privacy.history": "• 成功的寫作和選區文字歷史會保存在本機;舊版語音記錄仍可讀取",
- "settings.group.writing": "寫作",
- "settings.group.writing.help": "設定寫作助手及其可編輯的原文草稿。",
- "settings.group.dictation": "聽寫",
- "settings.group.dictation.help": "說話時長按快捷鍵,麥克風音訊會即時傳送到 OpenAI。",
- "settings.group.dictationAdvanced": "進階聽寫",
- "settings.row.dictationShortcut": "長按快捷鍵",
- "settings.help.dictationShortcut": "僅在寫作助手的原文編輯器處於使用中狀態時生效;短按不會執行任何操作。",
- "settings.quickStart.voice.pressAndHold": "按住進行語音輸入",
- "settings.row.microphone": "麥克風",
- "settings.help.microphone": "選擇即時聽寫使用的音訊輸入裝置。",
- "settings.microphone.systemDefault": "系統預設",
- "settings.row.fallbackSpeechModel": "復原轉寫模型",
- "settings.help.fallbackSpeechModel": "即時連線失敗後單次復原嘗試所使用的模型。",
- "dictation.hint.hold": "長按 %@ 開始聽寫",
- "dictation.status.connecting": "正在連線…",
- "dictation.status.listening": "正在聽寫…放開以完成",
- "dictation.status.recordingFallback": "連線已中斷…可繼續說話",
- "dictation.status.finalizing": "正在完成轉寫…",
- "dictation.status.recovering": "正在使用暫存錄音復原…",
- "dictation.status.ready": "聽寫已就緒",
- "dictation.accessibility.ready": "聽寫已準備就緒。",
- "dictation.accessibility.listening": "正在聽寫,放開快捷鍵以完成。",
- "dictation.accessibility.recordingFallback": "連線已中斷,可繼續說話以便復原。",
- "dictation.accessibility.finalizing": "正在完成聽寫轉寫。",
- "dictation.accessibility.recovering": "正在從暫存錄音復原聽寫。",
- "dictation.accessibility.completed": "聽寫已完成。",
- "dictation.accessibility.cancelled": "聽寫已取消。",
- "dictation.accessibility.failed": "聽寫失敗。",
- "dictation.accessibility.sourceEditor": "寫作原文編輯器",
- "dictation.undo.action": "聽寫",
- "dictation.error.missingAPIKey": "請在設定中加入 OpenAI API Key 後使用聽寫。",
- "dictation.error.microphonePermission": "聽寫需要麥克風權限。",
- "dictation.error.noAudioInputDevice": "沒有可用的麥克風或音訊輸入裝置。",
- "dictation.error.recordingUnavailable": "無法開始錄音。",
- "dictation.error.realtimeBufferOverflow": "即時音訊處理不及,請再試一次。",
- "dictation.error.connection": "即時轉寫連線失敗。",
- "dictation.error.connectionTimeout": "即時轉寫連線逾時。",
- "dictation.error.finalTimeout": "未能及時收到最終即時轉寫。",
- "dictation.error.fallback": "無法使用暫存錄音復原聽寫。",
- "dictation.error.noSpeech": "未辨識到語音。",
- "settings.privacy.voice": "• 即時聽寫音訊和發音文字會直接傳送到 OpenAI;復原錄音只會暫存於本機,並在階段結束時刪除",
- "settings.section.selectionActions": "選區動作",
- "settings.description.selectionActions": "管理在其他 App 選取文字後的自動動作。",
- "settings.row.selectionActionsEnabled": "啟用選區動作",
- "settings.help.selectionActionsEnabled": "選取文字並短暫停頓後顯示小選單。",
- "settings.row.forceSelectionMode": "強制取詞",
- "settings.help.forceSelectionMode": "輔助功能無法讀取選取文字時使用此備用方式。選單複製不會模擬鍵盤輸入。",
- "settings.forceSelection.disabled": "關閉",
- "settings.forceSelection.menuCopyOnly": "僅選單複製",
- "settings.forceSelection.menuCopyThenShortcut": "先選單複製,再 Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "先 Cmd+C,再選單複製",
- "settings.row.allowSimulatedCopyFallback": "允許模擬 Cmd+C",
- "settings.help.allowSimulatedCopyFallback": "選單複製無法使用時向前景 App 傳送 Cmd+C,可能會干擾遊戲或遠端 App。",
- "settings.row.translationLanguage": "翻譯語言",
- "settings.help.translationLanguage": "選取文字翻譯動作使用的目標語言。",
- "settings.row.translationPrompt": "翻譯 Prompt",
- "settings.help.translationPrompt": "選取文字翻譯動作使用的指令。用 {targetLanguage} 表示所選語言。",
- "settings.translationPrompt.restoreDefault": "恢復預設",
- "settings.row.aiPronunciation": "AI 發音聲音",
- "settings.help.aiPronunciation": "選取文字後「發音」使用的聲音。使用 OpenAI API key 呼叫 OpenAI 文字轉語音。",
- "settings.row.aiPronunciationSpeed": "AI 發音速度",
- "settings.help.aiPronunciationSpeed": "選取文字「發音」和試聽聲音使用的播放速度。",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "試聽聲音",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "跟隨介面語言",
- "selection.action.translate": "翻譯",
- "selection.action.pronounce": "發音",
- "selection.action.translating": "正在翻譯...",
- "selection.action.preparingPronunciation": "正在準備音訊...",
- "selection.action.playingPronunciation": "正在播放...",
- "selection.action.pronounceOriginal": "播放原文",
- "selection.action.pronounceTranslation": "播放譯文",
- "selection.action.audioLabel.original": "原文",
- "selection.action.audioLabel.translation": "譯文",
- "selection.action.copyTranslation": "複製譯文",
- "selection.action.retry": "重試",
- "selection.action.unsupportedTitle": "無法取得選取文字",
- "selection.action.unsupportedMessage": "目前 App 未將選取文字提供給 Inklet。",
- "selection.action.missingOpenAIKey": "請在設定中加入 OpenAI API key 以使用 AI 發音。",
- "selection.action.translationFailed": "翻譯失敗。",
- "selection.action.pronunciationFailed": "發音失敗。",
- "about.tagline": "將粗略想法化為清晰文字",
- "about.website": "官網",
- "about.privacyPolicy": "隱私權政策",
- "about.support": "支援",
- "language.system": "跟隨系統",
- "settings.window.title": "Inklet 設定",
- "settings.sidebar.preferences": "偏好設定",
- "settings.sidebar.hint": "自動儲存 · ⌘, 開啟",
- "settings.section.general": "一般",
- "settings.section.providers": "模型服務商",
- "settings.section.promptModes": "Prompt 模式",
- "settings.section.permissions": "權限",
- "settings.description.general": "基本行為、快捷鍵、介面語言和生成參數。",
- "settings.description.providers": "選擇 LLM 服務商、模型和對應的 API Key。",
- "settings.description.promptModes": "管理浮窗中的轉換模式和系統提示詞。",
- "settings.description.permissions": "檢查插入文字所需的 macOS 權限。",
- "settings.row.language": "介面語言",
- "settings.help.language": "選擇 System 時跟隨 macOS 語言。",
- "settings.row.hotkey": "快捷鍵",
- "settings.help.timeout": "請求最長等待時間。",
- "settings.seconds": "%d 秒",
- "settings.help.provider": "目前服務商。",
- "settings.help.apiKey": "API Key 會儲存在本機。",
- "settings.help.model.default": "預設:%@",
- "settings.mode.untitled": "未命名模式",
- "settings.mode.pick": "選擇一個 Prompt Mode",
- "settings.help.name": "浮窗中顯示的名稱。",
- "settings.help.description": "模式用途說明。",
- "settings.characters": "%d 字元",
- "settings.permission.authorized": "Accessibility 已授權",
- "settings.permission.required": "需要 Accessibility 權限",
- "settings.permission.description": "點擊「開啟設定」,點 +,選擇 /Applications/Inklet.app,然後開啟 Inklet。",
- "settings.permission.open": "開啟系統權限設定",
- "settings.footer.pending": "變更會自動儲存,並在下次浮窗開啟時套用。",
- "settings.save": "儲存",
- "settings.saved": "已儲存",
- "settings.error.visibleModeRequired": "至少需要保留一個可見模式。",
- "settings.error.modelRequired": "Model 不能為空。",
- "settings.error.openAccessibility": "無法開啟輔助使用設定。",
- "settings.error.saveFailed": "儲存失敗:%@",
- "popover.input.placeholder": "輸入要轉換或插入的文字",
- "popover.modeSearch.placeholder": "搜尋模式",
- "popover.modeSearch.empty": "沒有相符的模式",
- "popover.modeSearch.select": "選擇",
- "popover.modeSearch.write": "寫作",
- "popover.result.title": "結果",
- "popover.result.editable": "可編輯後插入",
- "popover.result.generatedWith": "由 %@ 產生",
- "popover.mode.picker": "模式",
- "popover.mode.backToModes": "選擇模式",
- "popover.action.transform": "轉換",
- "popover.action.regenerate": "重新產生",
- "popover.action.insert": "插入",
- "popover.action.insertOriginal": "插入原文",
- "popover.hint.transformInsert": "轉換/插入",
- "popover.hint.original": "原文",
- "popover.hint.accessibility": "快捷鍵:Enter 轉換或插入,Command Enter 插入原文,Escape 返回或關閉",
- "popover.busy.inserting": "正在插入...",
- "popover.busy.transforming": "正在轉換...",
- "popover.error.emptyOriginal": "請輸入要插入的文字。",
- "popover.error.missingTarget": "找不到要插入文字的目標 App。",
- "popover.error.missingAPIKey": "請先在設定中配置 %@ API Key。",
- "insertion.error.accessibility": "需要開啟 Accessibility 權限後才能插入文字。",
- "insertion.error.activation": "無法切回原 App,請重試。",
- "insertion.error.pasteEvent": "無法送出貼上快捷鍵。",
- "insertion.error.clipboardRestore": "插入後恢復剪貼簿失敗。",
- "error.emptySource": "請輸入要轉換的文字",
- "error.emptyResponse": "模型回傳了空內容",
- "error.timeout": "請求逾時,請稍後重試",
- "error.networkConnectionLost": "網路連線已中斷,請再試一次。",
- "error.provider.urlInvalid": "%@ 請求失敗:URL 無效",
- "error.provider.httpUnknown": "%@ 請求失敗:HTTP unknown",
- "error.provider.prefix": "%@ 請求失敗:%@",
- "hotkey.error.unsupported": "暫不支援快捷鍵「%@」。目前支援 ⌥Space、Option+Space、Alt+Space、⌘Space、Command+Space、Cmd+Space。",
- "hotkey.error.registrationFailed": "快捷鍵註冊失敗(%d)。",
- "prompt.custom.description": "使用你的自訂 prompt",
- "appearance.dark": "深色",
- "appearance.light": "淺色",
- "appearance.system": "系統",
- "popover.hint.back": "返回",
- "popover.hint.close": "關閉",
- "popover.hint.mode": "模式",
- "popover.hint.newLine": "換行",
- "popover.status.preview": "預覽",
- "popover.status.ready": "就緒",
- "prompt.chineseSummary.description": "將任何文字摘要為精簡的簡體中文",
- "prompt.friendlyReply.description": "改寫為自然、友善的回覆",
- "prompt.improveWriting.description": "保留原文語言並改善文筆",
- "prompt.makeConcise.description": "保留原文語言與重點並精簡文字",
- "prompt.professionalTone.description": "改寫為更清晰、專業的語氣",
- "prompt.simpleCorrectEnglish.description": "改寫或翻譯為簡單、正確的英文",
- "prompt.translateToEnglish.description": "改寫或翻譯為簡單、正確的英文",
- "settings.cancel": "取消",
- "settings.description.about": "鍵盤快捷鍵、隱私說明與應用程式資訊。",
- "settings.description.selectionAssistant": "為其他應用程式中的選取文字提供自動翻譯與發音工具。",
- "settings.description.writeAssistant": "設定寫作、聽寫、生成行為與提示模式。",
- "settings.error.endpointInvalid": "端點必須是有效的 HTTP 網址。",
- "settings.error.promptModeRequired": "請至少保留一個提示模式。",
- "settings.help.appearance": "選擇淺色、深色或跟隨 macOS。",
- "settings.help.endpoint": "完整的 OpenAI 相容 /chat/completions 網址。",
- "settings.help.hotkey": "例如:⌥Space、Option+Space、Cmd+Space。",
- "settings.help.openAIAPIKey": "儲存在這台 Mac 上,供寫作、即時聽寫、選區翻譯與發音共用。清空欄位即可移除。",
- "settings.hotkey.pressKey": " 按鍵",
- "settings.hotkey.record": "錄製快捷鍵",
- "settings.hotkey.recording": "按下快捷鍵",
- "settings.mode.add": "新增模式",
- "settings.mode.delete": "刪除模式",
- "settings.mode.deleteConfirmMessage": "要刪除「%@」嗎?此操作無法復原。",
- "settings.mode.deleteConfirmTitle": "刪除提示模式?",
- "settings.mode.dragToSort": "拖移以排序",
- "settings.mode.hidden": "已隱藏",
- "settings.mode.moveDown": "下移",
- "settings.mode.moveUp": "上移",
- "settings.mode.newDescription": "自訂文字轉換模式",
- "settings.mode.newName": "新模式",
- "settings.mode.visible": "已顯示",
- "settings.mode.visibleInMenu": "在選單中顯示",
- "settings.mode.visibleInMenuHelp": "在模式選擇器中顯示此模式。",
- "settings.model.custom": "自訂…",
- "settings.model.customized": "自訂模型 *",
- "settings.model.refreshing": "正在更新模型清單…",
- "settings.permission.accessibility": "輔助使用",
- "settings.permission.openShort": "開啟設定",
- "settings.privacy.clipboard": "• 插入文字及設定的強制取詞完成後,會還原剪貼簿內容",
- "settings.privacy.keychain": "• API 金鑰儲存在這台 Mac 上",
- "settings.privacy.provider": "• 文字直接傳送至 OpenAI",
- "settings.privacy.title": "隱私與安全性",
- "settings.provider.active": "使用中",
- "settings.provider.configured": "已設定",
- "settings.provider.notConfigured": "未設定",
- "settings.provider.notLoaded": "不顯示已儲存的金鑰",
- "settings.provider.pendingKey": "新金鑰待儲存",
- "settings.provider.pendingSave": "待儲存",
- "settings.provider.saved": "已儲存",
- "settings.provider.savedLocally": "已儲存於本機",
- "settings.quickStart.close": "返回或關閉",
- "settings.quickStart.help": "浮動視窗中的常用操作。",
- "settings.quickStart.open": "開啟 Inklet",
- "settings.quickStart.original": "插入原文",
- "settings.quickStart.submit": "轉換或插入結果",
- "settings.quickStart.title": "鍵盤快捷鍵",
- "settings.row.apiKey": "API 金鑰",
- "settings.row.appearance": "外觀",
- "settings.row.description": "說明",
- "settings.row.endpoint": "端點",
- "settings.row.model": "模型",
- "settings.row.name": "名稱",
- "settings.row.openAIAPIKey": "OpenAI API 金鑰",
- "settings.row.provider": "服務商",
- "settings.row.systemPrompt": "提示詞",
- "settings.row.timeout": "逾時",
- "settings.section.about": "關於",
- "settings.section.selectionAssistant": "選區助手",
- "settings.section.writeAssistant": "寫作助手",
- "settings.systemPermissions.title": "系統權限",
- "settings.version": "版本 %@",
- "settings.voice.shortcut.disabled": "停用",
- "settings.voice.shortcut.leftCommand": "左 Command",
- "settings.voice.shortcut.leftOption": "左 Option",
- "settings.voice.shortcut.rightCommand": "右 Command",
- "settings.voice.shortcut.rightOption": "右 Option",
- "setup.done": "完成",
- "setup.menubar.description": "隨時點選時鐘附近的 Inklet 圖示即可開啟。",
- "setup.menubar.title": "在選單列找到 Inklet",
- "setup.shortcut.description": "預設快捷鍵是 %@。如果與其他應用程式衝突,可在設定中變更。",
- "setup.shortcut.title": "使用快捷鍵",
- "setup.subtitle": "Inklet 正在選單列中執行。授予輔助使用權限,讓 Inklet 將文字插回目前使用的應用程式。",
- "setup.title": "Inklet 已就緒",
- "setup.window.title": "歡迎使用 Inklet"
- ]
-
- private static let ja: [String: String] = [
- "app.menu.edit": "編集",
- "app.menu.undo": "取り消す",
- "app.menu.redo": "やり直す",
- "app.menu.cut": "カット",
- "app.menu.copy": "コピー",
- "app.menu.paste": "ペースト",
- "app.menu.pasteAndMatchStyle": "ペーストしてスタイルを合わせる",
- "app.menu.delete": "削除",
- "app.menu.selectAll": "すべてを選択",
- "app.menu.openPopover": "Inklet を開く",
- "app.menu.settings": "設定",
- "app.menu.about": "Inklet について",
- "app.menu.quit": "終了",
- "app.menu.checkForUpdates": "アップデートを確認…",
- "app.menu.checkingForUpdates": "アップデートを確認中…",
- "update.available.title": "Inklet のアップデートがあります",
- "update.available.latestVersion": "最新: %@(ビルド %@)",
- "update.available.currentVersion": "現在: %@",
- "update.available.noNotes": "詳細はGitHubのリリースをご覧ください。",
- "update.action.viewOnGitHub": "GitHubで表示",
- "update.action.later": "後で",
- "update.upToDate.title": "Inkletは最新です",
- "update.upToDate.message": "%@ を使用しています。",
- "update.error.title": "アップデートを確認できませんでした",
- "update.error.message": "しばらくしてから、もう一度お試しください。",
- "update.action.retry": "再試行",
- "update.action.cancel": "キャンセル",
- "update.action.ok": "OK",
- "legacyMigration.notice.title": "以前の Inklet データはインポートされていません",
- "legacyMigration.notice.message": "以前の設定と履歴はそのまま保持されています。対応する Inklet Data フォルダを選択してインポートできます。",
- "legacyMigration.action.importOldData": "旧データをインポート…",
- "legacyMigration.panel.title": "以前の Inklet データを選択",
- "legacyMigration.panel.message": "保持されている設定と履歴をインポートするには、対応する Inklet Data フォルダを選択してください。",
- "legacyMigration.import.progress": "旧データを移行中…",
- "legacyMigration.import.invalidSelection": "選択したフォルダは、この Inklet アプリに対応する以前のデータフォルダではありません。",
- "legacyMigration.import.failed": "以前のデータをインポートできませんでした。設定と履歴はそのまま保持されています。",
- "legacyMigration.import.partialFailure": "一部の以前のデータをインポートできませんでした。設定と履歴はそのまま保持されています。",
- "legacyMigration.import.relaunching": "インポートしたデータの読み込みを完了するため、Inklet を再起動する必要があります。",
- "legacyMigration.import.relaunchProgress": "Inklet を再起動中…",
- "legacyMigration.import.relaunchFailed": "Inklet を再起動できませんでした。インポートしたデータは準備済みで、次回 Inklet を開いたときに読み込まれます。",
- "legacyMigration.action.retryRelaunch": "Inklet を再起動",
- "legacyMigration.action.quit": "Inklet を終了",
- "legacyMigration.settings.help": "対応する Inklet Data フォルダから、保持されている設定と履歴をインポートします。",
- "settings.section.history": "履歴",
- "settings.description.history": "ローカルに保存された文章、選択結果、以前の音声結果を確認します。",
- "settings.history.filter.all": "すべて",
- "settings.history.source.write": "文章",
- "settings.history.source.voice": "音声",
- "settings.history.source.selection": "選択",
- "settings.history.empty": "保存された履歴はまだありません。",
- "settings.history.original": "元のテキスト",
- "settings.history.result": "結果",
- "settings.history.copyOriginal": "元のテキストをコピー",
- "settings.history.copyResult": "結果をコピー",
- "settings.history.clear": "履歴を消去",
- "settings.history.clearConfirmTitle": "履歴を消去しますか?",
- "settings.history.clearConfirmMessage": "この Mac から保存済みの履歴をすべて削除します。この操作は取り消せません。",
- "settings.history.cleared": "履歴を消去しました。",
- "settings.history.error.loadFailed": "履歴を読み込めませんでした。",
- "settings.history.error.clearFailed": "履歴を消去できませんでした。",
- "settings.privacy.history": "• 文章と選択テキストの成功履歴はローカルに保存され、以前の音声履歴も引き続き確認できます",
- "settings.group.writing": "文章作成",
- "settings.group.writing.help": "Writing Assistant と編集可能な入力元の下書きを設定します。",
- "settings.group.dictation": "音声入力",
- "settings.group.dictation.help": "話している間ショートカットを押し続けると、マイク音声がリアルタイムで OpenAI に送信されます。",
- "settings.group.dictationAdvanced": "音声入力の詳細設定",
- "settings.row.dictationShortcut": "長押しショートカット",
- "settings.help.dictationShortcut": "Writing Assistant の入力元エディタがアクティブなときだけ機能します。短く押しても何も起きません。",
- "settings.quickStart.voice.pressAndHold": "押している間だけ音声入力",
- "settings.row.microphone": "マイク",
- "settings.help.microphone": "リアルタイム音声入力に使用するオーディオ入力デバイスを選択します。",
- "settings.microphone.systemDefault": "システム既定",
- "settings.row.fallbackSpeechModel": "復旧用モデル",
- "settings.help.fallbackSpeechModel": "リアルタイム接続が失敗した後の1回限りの復旧に使用するモデルです。",
- "dictation.hint.hold": "%@ を押し続けて音声入力",
- "dictation.status.connecting": "接続中…",
- "dictation.status.listening": "音声入力中…放すと完了",
- "dictation.status.recordingFallback": "接続が切れました…そのまま話せます",
- "dictation.status.finalizing": "文字起こしを完了中…",
- "dictation.status.recovering": "一時録音から復旧中…",
- "dictation.status.ready": "音声入力の準備完了",
- "dictation.accessibility.ready": "音声入力の準備ができました。",
- "dictation.accessibility.listening": "音声入力中です。放すと完了します。",
- "dictation.accessibility.recordingFallback": "接続が切れました。復旧のため、そのまま話してください。",
- "dictation.accessibility.finalizing": "音声入力の文字起こしを完了しています。",
- "dictation.accessibility.recovering": "一時録音から音声入力を復旧しています。",
- "dictation.accessibility.completed": "音声入力が完了しました。",
- "dictation.accessibility.cancelled": "音声入力をキャンセルしました。",
- "dictation.accessibility.failed": "音声入力に失敗しました。",
- "dictation.accessibility.sourceEditor": "文章入力元エディタ",
- "dictation.undo.action": "音声入力",
- "dictation.error.missingAPIKey": "音声入力を使うには、設定で OpenAI API キーを追加してください。",
- "dictation.error.microphonePermission": "音声入力にはマイクの許可が必要です。",
- "dictation.error.noAudioInputDevice": "使用できるマイクまたはオーディオ入力デバイスがありません。",
- "dictation.error.recordingUnavailable": "録音を開始できませんでした。",
- "dictation.error.realtimeBufferOverflow": "リアルタイム音声の処理が追いつきませんでした。もう一度お試しください。",
- "dictation.error.connection": "リアルタイム文字起こしへの接続に失敗しました。",
- "dictation.error.connectionTimeout": "リアルタイム文字起こしへの接続がタイムアウトしました。",
- "dictation.error.finalTimeout": "最終のリアルタイム文字起こしを時間内に受信できませんでした。",
- "dictation.error.fallback": "一時録音から音声入力を復旧できませんでした。",
- "dictation.error.noSpeech": "音声を認識できませんでした。",
- "settings.privacy.voice": "• リアルタイム音声入力の音声と発音テキストは OpenAI に直接送信され、復旧用録音はセッション終了時に削除されます",
- "settings.section.selectionActions": "選択範囲アクション",
- "settings.description.selectionActions": "ほかのアプリで選択したテキストの自動アクションを管理します。",
- "settings.row.selectionActionsEnabled": "選択範囲アクションを有効にする",
- "settings.help.selectionActionsEnabled": "テキスト選択後に少し待つと小さなメニューを表示します。",
- "settings.row.forceSelectionMode": "強制選択",
- "settings.help.forceSelectionMode": "アクセシビリティで選択テキストを読めない場合に使うフォールバックです。メニューコピーはキーボード入力をシミュレートしません。",
- "settings.forceSelection.disabled": "オフ",
- "settings.forceSelection.menuCopyOnly": "メニューコピーのみ",
- "settings.forceSelection.menuCopyThenShortcut": "メニューコピー後に Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C 後にメニューコピー",
- "settings.row.allowSimulatedCopyFallback": "Cmd+C のシミュレーションを許可",
- "settings.help.allowSimulatedCopyFallback": "メニューコピーを使えない場合、前面のアプリに Cmd+C を送信します。ゲームやリモートアプリに干渉する可能性があります。",
- "settings.row.translationLanguage": "翻訳先言語",
- "settings.help.translationLanguage": "選択テキストの翻訳アクションで使う言語です。",
- "settings.row.translationPrompt": "翻訳プロンプト",
- "settings.help.translationPrompt": "選択テキストの翻訳アクションで使う指示です。{targetLanguage} で選択言語を指定します。",
- "settings.translationPrompt.restoreDefault": "デフォルトに戻す",
- "settings.row.aiPronunciation": "AI 発音の声",
- "settings.help.aiPronunciation": "選択テキストの発音で使う声です。OpenAI API key で OpenAI text-to-speech を使用します。",
- "settings.row.aiPronunciationSpeed": "AI 発音速度",
- "settings.help.aiPronunciationSpeed": "選択テキストの発音と声のプレビューで使う再生速度です。",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "声をプレビュー",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "インターフェイスの言語に従う",
- "selection.action.translate": "翻訳",
- "selection.action.pronounce": "発音",
- "selection.action.translating": "翻訳中...",
- "selection.action.preparingPronunciation": "音声を準備中...",
- "selection.action.playingPronunciation": "再生中...",
- "selection.action.pronounceOriginal": "原文を再生",
- "selection.action.pronounceTranslation": "翻訳を再生",
- "selection.action.audioLabel.original": "原文",
- "selection.action.audioLabel.translation": "訳文",
- "selection.action.copyTranslation": "翻訳をコピー",
- "selection.action.retry": "再試行",
- "selection.action.unsupportedTitle": "選択テキストを取得できません",
- "selection.action.unsupportedMessage": "現在のアプリは選択テキストを Inklet に公開していません。",
- "selection.action.missingOpenAIKey": "AI 発音を使うには設定で OpenAI API key を追加してください。",
- "selection.action.translationFailed": "翻訳に失敗しました。",
- "selection.action.pronunciationFailed": "発音に失敗しました。",
- "about.tagline": "まとまらない思いを、明快な文章に",
- "about.website": "ウェブサイト",
- "about.privacyPolicy": "プライバシーポリシー",
- "about.support": "サポート",
- "language.system": "システムに合わせる",
- "settings.window.title": "Inklet 設定",
- "settings.sidebar.preferences": "環境設定",
- "settings.sidebar.hint": "自動保存 · ⌘, 開く",
- "settings.section.general": "一般",
- "settings.section.providers": "プロバイダー",
- "settings.section.promptModes": "Prompt モード",
- "settings.section.permissions": "権限",
- "settings.description.general": "基本動作、ショートカット、表示言語、生成パラメータ。",
- "settings.description.providers": "LLM プロバイダー、モデル、API キーを選択します。",
- "settings.description.promptModes": "ポップオーバーに表示する変換モードとシステムプロンプトを管理します。",
- "settings.description.permissions": "テキスト挿入に必要な macOS 権限を確認します。",
- "settings.row.language": "表示言語",
- "settings.help.language": "System を選ぶと macOS の言語に従います。",
- "settings.row.hotkey": "ホットキー",
- "settings.help.timeout": "リクエストの最大待ち時間。",
- "settings.seconds": "%d 秒",
- "settings.help.provider": "現在のプロバイダー。",
- "settings.help.apiKey": "この Mac にローカル保存されます。",
- "settings.help.model.default": "既定: %@",
- "settings.mode.untitled": "無題のモード",
- "settings.mode.pick": "Prompt Mode を選択",
- "settings.help.name": "ポップオーバーに表示される名前。",
- "settings.help.description": "このモードの用途。",
- "settings.characters": "%d 文字",
- "settings.permission.authorized": "Accessibility は許可済み",
- "settings.permission.required": "Accessibility 権限が必要です",
- "settings.permission.description": "「設定を開く」をクリックし、+ をクリックして /Applications/Inklet.app を選択し、Inklet を有効にします。",
- "settings.permission.open": "システム設定を開く",
- "settings.footer.pending": "変更は自動保存され、次回ポップオーバーを開いたときに適用されます。",
- "settings.save": "保存",
- "settings.saved": "保存しました",
- "settings.error.visibleModeRequired": "少なくとも 1 つの表示モードが必要です。",
- "settings.error.modelRequired": "Model は空にできません。",
- "settings.error.openAccessibility": "Accessibility 設定を開けませんでした。",
- "settings.error.saveFailed": "保存に失敗しました: %@",
- "popover.input.placeholder": "変換または挿入するテキストを入力",
- "popover.modeSearch.placeholder": "モードを検索",
- "popover.modeSearch.empty": "一致するモードがありません",
- "popover.modeSearch.select": "選択",
- "popover.modeSearch.write": "入力",
- "popover.result.title": "結果",
- "popover.result.editable": "挿入前に編集できます",
- "popover.result.generatedWith": "%@ で生成",
- "popover.mode.picker": "モード",
- "popover.mode.backToModes": "モードを選択",
- "popover.action.transform": "変換",
- "popover.action.regenerate": "再生成",
- "popover.action.insert": "挿入",
- "popover.action.insertOriginal": "原文を挿入",
- "popover.hint.transformInsert": "変換/挿入",
- "popover.hint.original": "原文",
- "popover.hint.accessibility": "ショートカット: Enter で変換または挿入、Command Enter で原文を挿入、Escape で戻るまたは閉じる",
- "popover.busy.inserting": "挿入中...",
- "popover.busy.transforming": "変換中...",
- "popover.error.emptyOriginal": "挿入するテキストを入力してください。",
- "popover.error.missingTarget": "テキストを挿入する対象アプリが見つかりません。",
- "popover.error.missingAPIKey": "先に設定で %@ API Key を設定してください。",
- "insertion.error.accessibility": "テキストを挿入するには Accessibility 権限を有効にしてください。",
- "insertion.error.activation": "元のアプリに戻れませんでした。もう一度お試しください。",
- "insertion.error.pasteEvent": "貼り付けショートカットを送信できませんでした。",
- "insertion.error.clipboardRestore": "挿入後にクリップボードを復元できませんでした。",
- "error.emptySource": "変換するテキストを入力してください",
- "error.emptyResponse": "モデルが空の応答を返しました",
- "error.timeout": "リクエストがタイムアウトしました。もう一度お試しください",
- "error.networkConnectionLost": "ネットワーク接続が中断されました。もう一度お試しください。",
- "error.provider.urlInvalid": "%@ のリクエストに失敗しました: URL が無効です",
- "error.provider.httpUnknown": "%@ のリクエストに失敗しました: HTTP unknown",
- "error.provider.prefix": "%@ のリクエストに失敗しました: %@",
- "hotkey.error.unsupported": "未対応のホットキー “%@”。対応: ⌥Space、Option+Space、Alt+Space、⌘Space、Command+Space、Cmd+Space。",
- "hotkey.error.registrationFailed": "ホットキーの登録に失敗しました(%d)。",
- "prompt.custom.description": "カスタム prompt を使用",
- "appearance.dark": "ダーク",
- "appearance.light": "ライト",
- "appearance.system": "システム",
- "popover.hint.back": "戻る",
- "popover.hint.close": "閉じる",
- "popover.hint.mode": "モード",
- "popover.hint.newLine": "改行",
- "popover.status.preview": "プレビュー",
- "popover.status.ready": "準備完了",
- "prompt.chineseSummary.description": "どんな文章も簡潔な簡体字中国語に要約",
- "prompt.friendlyReply.description": "自然で親しみやすい返信に書き換え",
- "prompt.improveWriting.description": "元の言語を維持して文章を改善",
- "prompt.makeConcise.description": "元の言語と要点を維持して文章を短縮",
- "prompt.professionalTone.description": "より明確でプロフェッショナルな文体に書き換え",
- "prompt.simpleCorrectEnglish.description": "簡単で正しい英語に書き換え・翻訳",
- "prompt.translateToEnglish.description": "簡単で正しい英語に書き換え・翻訳",
- "settings.cancel": "キャンセル",
- "settings.description.about": "キーボードショートカット、プライバシー、アプリの情報。",
- "settings.description.selectionAssistant": "他のアプリで選択したテキストの自動翻訳と読み上げ。",
- "settings.description.writeAssistant": "文章作成、音声入力、生成動作、プロンプトモードを設定します。",
- "settings.error.endpointInvalid": "エンドポイントには有効な HTTP URL を指定してください。",
- "settings.error.promptModeRequired": "プロンプトモードを少なくとも1つ残してください。",
- "settings.help.appearance": "ライト、ダーク、または macOS に合わせる設定を選択します。",
- "settings.help.endpoint": "OpenAI 互換の /chat/completions の完全な URL。",
- "settings.help.hotkey": "例:⌥Space、Option+Space、Cmd+Space。",
- "settings.help.openAIAPIKey": "この Mac に保存され、文章作成、リアルタイム音声入力、選択テキストの翻訳・読み上げに使用されます。削除するには欄を空にしてください。",
- "settings.hotkey.pressKey": " キー",
- "settings.hotkey.record": "ショートカットを記録",
- "settings.hotkey.recording": "ショートカットを入力",
- "settings.mode.add": "モードを追加",
- "settings.mode.delete": "モードを削除",
- "settings.mode.deleteConfirmMessage": "「%@」を削除しますか?この操作は取り消せません。",
- "settings.mode.deleteConfirmTitle": "プロンプトモードを削除しますか?",
- "settings.mode.dragToSort": "ドラッグして並べ替え",
- "settings.mode.hidden": "非表示",
- "settings.mode.moveDown": "下へ移動",
- "settings.mode.moveUp": "上へ移動",
- "settings.mode.newDescription": "カスタム変換モード",
- "settings.mode.newName": "新しいモード",
- "settings.mode.visible": "表示",
- "settings.mode.visibleInMenu": "メニューに表示",
- "settings.mode.visibleInMenuHelp": "このモードをモード選択画面に表示します。",
- "settings.model.custom": "カスタム…",
- "settings.model.customized": "カスタムモデル *",
- "settings.model.refreshing": "モデル一覧を更新中…",
- "settings.permission.accessibility": "アクセシビリティ",
- "settings.permission.openShort": "設定を開く",
- "settings.privacy.clipboard": "• 挿入や設定済みの強制選択読み取りの後にクリップボードの内容を復元",
- "settings.privacy.keychain": "• API キーはこの Mac に保存",
- "settings.privacy.provider": "• テキストは OpenAI に直接送信",
- "settings.privacy.title": "プライバシーとセキュリティ",
- "settings.provider.active": "使用中",
- "settings.provider.configured": "設定済み",
- "settings.provider.notConfigured": "未設定",
- "settings.provider.notLoaded": "保存済みのキーは表示されません",
- "settings.provider.pendingKey": "新しいキーは保存待ちです",
- "settings.provider.pendingSave": "保存待ち",
- "settings.provider.saved": "保存済み",
- "settings.provider.savedLocally": "この Mac に保存済み",
- "settings.quickStart.close": "戻る・閉じる",
- "settings.quickStart.help": "ポップオーバーでよく使う操作。",
- "settings.quickStart.open": "Inklet を開く",
- "settings.quickStart.original": "原文を挿入",
- "settings.quickStart.submit": "変換・結果を挿入",
- "settings.quickStart.title": "キーボードショートカット",
- "settings.row.apiKey": "API キー",
- "settings.row.appearance": "外観",
- "settings.row.description": "説明",
- "settings.row.endpoint": "エンドポイント",
- "settings.row.model": "モデル",
- "settings.row.name": "名前",
- "settings.row.openAIAPIKey": "OpenAI API キー",
- "settings.row.provider": "プロバイダー",
- "settings.row.systemPrompt": "プロンプト",
- "settings.row.timeout": "タイムアウト",
- "settings.section.about": "このアプリについて",
- "settings.section.selectionAssistant": "選択アシスタント",
- "settings.section.writeAssistant": "文章作成アシスタント",
- "settings.systemPermissions.title": "システム権限",
- "settings.version": "バージョン %@",
- "settings.voice.shortcut.disabled": "無効",
- "settings.voice.shortcut.leftCommand": "左 Command",
- "settings.voice.shortcut.leftOption": "左 Option",
- "settings.voice.shortcut.rightCommand": "右 Command",
- "settings.voice.shortcut.rightOption": "右 Option",
- "setup.done": "完了",
- "setup.menubar.description": "時計の近くにある Inklet アイコンをクリックすると、いつでも開けます。",
- "setup.menubar.title": "メニューバーで Inklet を見つける",
- "setup.shortcut.description": "デフォルトのショートカットは %@ です。他のアプリと競合する場合は、設定で変更してください。",
- "setup.shortcut.title": "ショートカットを使う",
- "setup.subtitle": "Inklet はメニューバーで動作しています。使用中のアプリにテキストを挿入できるよう、アクセシビリティ権限を許可してください。",
- "setup.title": "Inklet の準備ができました",
- "setup.window.title": "Inklet へようこそ"
- ]
-
- private static let ko: [String: String] = [
- "app.menu.edit": "편집",
- "app.menu.undo": "실행 취소",
- "app.menu.redo": "실행 복귀",
- "app.menu.cut": "오려두기",
- "app.menu.copy": "복사하기",
- "app.menu.paste": "붙여넣기",
- "app.menu.pasteAndMatchStyle": "붙여넣고 스타일 일치시킴",
- "app.menu.delete": "삭제",
- "app.menu.selectAll": "모두 선택",
- "app.menu.openPopover": "Inklet 열기",
- "app.menu.settings": "설정",
- "app.menu.about": "Inklet 정보",
- "app.menu.quit": "종료",
- "app.menu.checkForUpdates": "업데이트 확인…",
- "app.menu.checkingForUpdates": "업데이트 확인 중…",
- "update.available.title": "Inklet 업데이트가 있습니다",
- "update.available.latestVersion": "최신: %@ (빌드 %@)",
- "update.available.currentVersion": "현재: %@",
- "update.available.noNotes": "자세한 내용은 GitHub 릴리스를 확인하세요.",
- "update.action.viewOnGitHub": "GitHub에서 보기",
- "update.action.later": "나중에",
- "update.upToDate.title": "Inklet이 최신 버전입니다",
- "update.upToDate.message": "현재 %@ 버전을 사용하고 있습니다.",
- "update.error.title": "업데이트를 확인할 수 없습니다",
- "update.error.message": "잠시 후 다시 시도하세요.",
- "update.action.retry": "재시도",
- "update.action.cancel": "취소",
- "update.action.ok": "확인",
- "legacyMigration.notice.title": "이전 Inklet 데이터를 아직 가져오지 않았습니다",
- "legacyMigration.notice.message": "이전 설정과 기록은 그대로 보존되어 있습니다. 해당 Inklet Data 폴더를 선택해 가져올 수 있습니다.",
- "legacyMigration.action.importOldData": "이전 데이터 가져오기…",
- "legacyMigration.panel.title": "이전 Inklet 데이터 선택",
- "legacyMigration.panel.message": "보존된 설정과 기록을 가져오려면 해당 Inklet Data 폴더를 선택하세요.",
- "legacyMigration.import.progress": "이전 데이터 가져오는 중…",
- "legacyMigration.import.invalidSelection": "선택한 폴더는 이 Inklet 앱에 해당하는 이전 데이터 폴더가 아닙니다.",
- "legacyMigration.import.failed": "이전 데이터를 가져오지 못했습니다. 설정과 기록은 그대로 보존되어 있습니다.",
- "legacyMigration.import.partialFailure": "일부 이전 데이터를 가져오지 못했습니다. 설정과 기록은 그대로 보존되어 있습니다.",
- "legacyMigration.import.relaunching": "가져온 데이터 로드를 완료하려면 Inklet을 다시 실행해야 합니다.",
- "legacyMigration.import.relaunchProgress": "Inklet 다시 실행 중…",
- "legacyMigration.import.relaunchFailed": "Inklet을 다시 실행하지 못했습니다. 가져온 데이터는 준비되어 있으며 다음에 Inklet을 열 때 로드됩니다.",
- "legacyMigration.action.retryRelaunch": "Inklet 다시 실행",
- "legacyMigration.action.quit": "Inklet 종료",
- "legacyMigration.settings.help": "해당 Inklet Data 폴더에서 보존된 설정과 기록을 가져옵니다.",
- "settings.section.history": "기록",
- "settings.description.history": "로컬에 저장된 쓰기, 선택 결과와 이전 음성 결과를 확인합니다.",
- "settings.history.filter.all": "전체",
- "settings.history.source.write": "쓰기",
- "settings.history.source.voice": "음성",
- "settings.history.source.selection": "선택",
- "settings.history.empty": "저장된 기록이 아직 없습니다.",
- "settings.history.original": "원문",
- "settings.history.result": "결과",
- "settings.history.copyOriginal": "원문 복사",
- "settings.history.copyResult": "결과 복사",
- "settings.history.clear": "기록 지우기",
- "settings.history.clearConfirmTitle": "기록을 지울까요?",
- "settings.history.clearConfirmMessage": "이 Mac에서 저장된 모든 기록을 삭제합니다. 이 작업은 되돌릴 수 없습니다.",
- "settings.history.cleared": "기록을 지웠습니다.",
- "settings.history.error.loadFailed": "기록을 불러올 수 없습니다.",
- "settings.history.error.clearFailed": "기록을 지울 수 없습니다.",
- "settings.privacy.history": "• 성공한 쓰기와 선택 텍스트 기록은 로컬에 저장되며 이전 음성 기록도 계속 볼 수 있습니다",
- "settings.group.writing": "쓰기",
- "settings.group.writing.help": "Writing Assistant와 편집 가능한 원문 초안을 설정합니다.",
- "settings.group.dictation": "받아쓰기",
- "settings.group.dictation.help": "말하는 동안 단축키를 길게 누르면 마이크 오디오가 OpenAI로 실시간 전송됩니다.",
- "settings.group.dictationAdvanced": "고급 받아쓰기",
- "settings.row.dictationShortcut": "길게 누르기 단축키",
- "settings.help.dictationShortcut": "Writing Assistant 원문 편집기가 활성 상태일 때만 작동합니다. 짧게 누르면 아무 작업도 하지 않습니다.",
- "settings.quickStart.voice.pressAndHold": "누르는 동안 음성 입력",
- "settings.row.microphone": "마이크",
- "settings.help.microphone": "실시간 받아쓰기에 사용할 오디오 입력 장치를 선택합니다.",
- "settings.microphone.systemDefault": "시스템 기본값",
- "settings.row.fallbackSpeechModel": "복구 모델",
- "settings.help.fallbackSpeechModel": "실시간 연결 실패 후 한 번의 복구 시도에 사용하는 모델입니다.",
- "dictation.hint.hold": "%@ 길게 눌러 받아쓰기",
- "dictation.status.connecting": "연결 중…",
- "dictation.status.listening": "받아쓰기 중…놓으면 완료",
- "dictation.status.recordingFallback": "연결이 끊겼습니다…계속 말하세요",
- "dictation.status.finalizing": "전사 마무리 중…",
- "dictation.status.recovering": "임시 녹음에서 복구 중…",
- "dictation.status.ready": "받아쓰기 준비 완료",
- "dictation.accessibility.ready": "받아쓰기가 준비되었습니다.",
- "dictation.accessibility.listening": "받아쓰기 중입니다. 놓으면 완료됩니다.",
- "dictation.accessibility.recordingFallback": "연결이 끊겼습니다. 복구를 위해 계속 말씀하세요.",
- "dictation.accessibility.finalizing": "받아쓰기 전사를 마무리하는 중입니다.",
- "dictation.accessibility.recovering": "임시 녹음에서 받아쓰기를 복구하는 중입니다.",
- "dictation.accessibility.completed": "받아쓰기가 완료되었습니다.",
- "dictation.accessibility.cancelled": "받아쓰기가 취소되었습니다.",
- "dictation.accessibility.failed": "받아쓰기에 실패했습니다.",
- "dictation.accessibility.sourceEditor": "쓰기 원문 편집기",
- "dictation.undo.action": "받아쓰기",
- "dictation.error.missingAPIKey": "받아쓰기를 사용하려면 설정에서 OpenAI API 키를 추가하세요.",
- "dictation.error.microphonePermission": "받아쓰기에는 마이크 권한이 필요합니다.",
- "dictation.error.noAudioInputDevice": "사용 가능한 마이크 또는 오디오 입력 장치가 없습니다.",
- "dictation.error.recordingUnavailable": "오디오 녹음을 시작할 수 없습니다.",
- "dictation.error.realtimeBufferOverflow": "실시간 오디오 처리가 지연되었습니다. 다시 시도하세요.",
- "dictation.error.connection": "실시간 전사 연결에 실패했습니다.",
- "dictation.error.connectionTimeout": "실시간 전사 연결 시간이 초과되었습니다.",
- "dictation.error.finalTimeout": "최종 실시간 전사를 제시간에 받지 못했습니다.",
- "dictation.error.fallback": "임시 녹음에서 받아쓰기를 복구할 수 없습니다.",
- "dictation.error.noSpeech": "음성이 인식되지 않았습니다.",
- "settings.privacy.voice": "• 실시간 받아쓰기 오디오와 발음 텍스트는 OpenAI로 직접 전송되며 복구 녹음은 세션 종료 시 삭제됩니다",
- "settings.section.selectionActions": "선택 동작",
- "settings.description.selectionActions": "다른 앱에서 선택한 텍스트의 자동 동작을 관리합니다.",
- "settings.row.selectionActionsEnabled": "선택 동작 활성화",
- "settings.help.selectionActionsEnabled": "텍스트 선택 후 잠시 멈추면 작은 메뉴를 표시합니다.",
- "settings.row.forceSelectionMode": "강제 선택",
- "settings.help.forceSelectionMode": "손쉬운 사용으로 선택 텍스트를 읽을 수 없을 때 사용하는 대체 방식입니다. 메뉴 복사는 키보드 입력을 시뮬레이션하지 않습니다.",
- "settings.forceSelection.disabled": "끄기",
- "settings.forceSelection.menuCopyOnly": "메뉴 복사만",
- "settings.forceSelection.menuCopyThenShortcut": "메뉴 복사 후 Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C 후 메뉴 복사",
- "settings.row.allowSimulatedCopyFallback": "Cmd+C 시뮬레이션 허용",
- "settings.help.allowSimulatedCopyFallback": "메뉴 복사를 사용할 수 없을 때 전면 앱에 Cmd+C를 보냅니다. 게임이나 원격 앱을 방해할 수 있습니다.",
- "settings.row.translationLanguage": "번역 언어",
- "settings.help.translationLanguage": "선택 텍스트 번역에 사용할 대상 언어입니다.",
- "settings.row.translationPrompt": "번역 프롬프트",
- "settings.help.translationPrompt": "선택 텍스트 번역에 사용할 지시입니다. {targetLanguage}로 선택한 언어를 넣습니다.",
- "settings.translationPrompt.restoreDefault": "기본값 복원",
- "settings.row.aiPronunciation": "AI 발음 음성",
- "settings.help.aiPronunciation": "선택한 텍스트의 발음에 사용할 음성입니다. OpenAI API key로 OpenAI text-to-speech를 사용합니다.",
- "settings.row.aiPronunciationSpeed": "AI 발음 속도",
- "settings.help.aiPronunciationSpeed": "선택 텍스트 발음과 음성 미리 듣기에 사용할 재생 속도입니다.",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "음성 미리 듣기",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "인터페이스 언어 따르기",
- "selection.action.translate": "번역",
- "selection.action.pronounce": "발음",
- "selection.action.translating": "번역 중...",
- "selection.action.preparingPronunciation": "오디오 준비 중...",
- "selection.action.playingPronunciation": "재생 중...",
- "selection.action.pronounceOriginal": "원문 재생",
- "selection.action.pronounceTranslation": "번역 재생",
- "selection.action.audioLabel.original": "원문",
- "selection.action.audioLabel.translation": "번역",
- "selection.action.copyTranslation": "번역 복사",
- "selection.action.retry": "다시 시도",
- "selection.action.unsupportedTitle": "선택한 텍스트를 사용할 수 없음",
- "selection.action.unsupportedMessage": "현재 앱은 선택한 텍스트를 Inklet에 제공하지 않습니다.",
- "selection.action.missingOpenAIKey": "AI 발음을 사용하려면 설정에서 OpenAI API key를 추가하세요.",
- "selection.action.translationFailed": "번역에 실패했습니다.",
- "selection.action.pronunciationFailed": "발음에 실패했습니다.",
- "about.tagline": "다듬어지지 않은 생각을 명확한 글로",
- "about.website": "웹사이트",
- "about.privacyPolicy": "개인정보 처리방침",
- "about.support": "지원",
- "language.system": "시스템 따르기",
- "settings.window.title": "Inklet 설정",
- "settings.sidebar.preferences": "환경설정",
- "settings.sidebar.hint": "자동 저장 · ⌘, 열기",
- "settings.section.general": "일반",
- "settings.section.providers": "Provider",
- "settings.section.promptModes": "프롬프트 모드",
- "settings.section.permissions": "권한",
- "settings.description.general": "기본 동작, 단축키, 인터페이스 언어, 생성 파라미터.",
- "settings.description.providers": "LLM provider, model, API key를 선택합니다.",
- "settings.description.promptModes": "팝오버에 표시되는 변환 모드와 시스템 프롬프트를 관리합니다.",
- "settings.description.permissions": "텍스트 삽입에 필요한 macOS 권한을 확인합니다.",
- "settings.row.language": "인터페이스 언어",
- "settings.help.language": "System을 선택하면 macOS 언어를 따릅니다.",
- "settings.row.hotkey": "단축키",
- "settings.help.timeout": "요청 최대 대기 시간.",
- "settings.seconds": "%d초",
- "settings.help.provider": "현재 provider.",
- "settings.help.apiKey": "이 Mac에 로컬로 저장됩니다.",
- "settings.help.model.default": "기본값: %@",
- "settings.mode.untitled": "이름 없는 모드",
- "settings.mode.pick": "Prompt Mode 선택",
- "settings.help.name": "팝오버에 표시되는 이름.",
- "settings.help.description": "이 모드의 용도.",
- "settings.characters": "%d자",
- "settings.permission.authorized": "Accessibility 권한 허용됨",
- "settings.permission.required": "Accessibility 권한 필요",
- "settings.permission.description": "설정 열기를 클릭하고 +를 클릭한 다음 /Applications/Inklet.app을 선택하고 Inklet을 활성화하세요.",
- "settings.permission.open": "시스템 설정 열기",
- "settings.footer.pending": "변경 사항은 자동 저장되며 다음 팝오버부터 적용됩니다.",
- "settings.save": "저장",
- "settings.saved": "저장됨",
- "settings.error.visibleModeRequired": "표시되는 모드를 하나 이상 유지하세요.",
- "settings.error.modelRequired": "Model은 비워 둘 수 없습니다.",
- "settings.error.openAccessibility": "Accessibility 설정을 열 수 없습니다.",
- "settings.error.saveFailed": "저장 실패: %@",
- "popover.input.placeholder": "변환하거나 삽입할 텍스트 입력",
- "popover.modeSearch.placeholder": "모드 검색",
- "popover.modeSearch.empty": "일치하는 모드 없음",
- "popover.modeSearch.select": "선택",
- "popover.modeSearch.write": "작성",
- "popover.result.title": "결과",
- "popover.result.editable": "삽입 전 편집 가능",
- "popover.result.generatedWith": "%@로 생성",
- "popover.mode.picker": "모드",
- "popover.mode.backToModes": "모드 선택",
- "popover.action.transform": "변환",
- "popover.action.regenerate": "다시 생성",
- "popover.action.insert": "삽입",
- "popover.action.insertOriginal": "원문 삽입",
- "popover.hint.transformInsert": "변환/삽입",
- "popover.hint.original": "원문",
- "popover.hint.accessibility": "단축키: Enter 변환 또는 삽입, Command Enter 원문 삽입, Escape 뒤로 또는 닫기",
- "popover.busy.inserting": "삽입 중...",
- "popover.busy.transforming": "변환 중...",
- "popover.error.emptyOriginal": "삽입할 텍스트를 입력하세요.",
- "popover.error.missingTarget": "텍스트를 삽입할 대상 앱을 찾을 수 없습니다.",
- "popover.error.missingAPIKey": "먼저 설정에서 %@ API Key를 설정하세요.",
- "insertion.error.accessibility": "텍스트를 삽입하려면 Accessibility 권한을 활성화하세요.",
- "insertion.error.activation": "원래 앱으로 돌아갈 수 없습니다. 다시 시도하세요.",
- "insertion.error.pasteEvent": "붙여넣기 단축키를 보낼 수 없습니다.",
- "insertion.error.clipboardRestore": "삽입 후 클립보드를 복원하지 못했습니다.",
- "error.emptySource": "변환할 텍스트를 입력하세요",
- "error.emptyResponse": "모델이 빈 응답을 반환했습니다",
- "error.timeout": "요청 시간이 초과되었습니다. 다시 시도하세요",
- "error.networkConnectionLost": "네트워크 연결이 중단되었습니다. 다시 시도하세요.",
- "error.provider.urlInvalid": "%@ 요청 실패: URL이 유효하지 않습니다",
- "error.provider.httpUnknown": "%@ 요청 실패: HTTP unknown",
- "error.provider.prefix": "%@ 요청 실패: %@",
- "hotkey.error.unsupported": "지원하지 않는 단축키 “%@”. 지원: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
- "hotkey.error.registrationFailed": "단축키 등록 실패(%d).",
- "prompt.custom.description": "사용자 지정 prompt 사용",
- "appearance.dark": "다크",
- "appearance.light": "라이트",
- "appearance.system": "시스템",
- "popover.hint.back": "뒤로",
- "popover.hint.close": "닫기",
- "popover.hint.mode": "모드",
- "popover.hint.newLine": "줄 바꿈",
- "popover.status.preview": "미리 보기",
- "popover.status.ready": "준비됨",
- "prompt.chineseSummary.description": "모든 텍스트를 간결한 중국어 간체로 요약",
- "prompt.friendlyReply.description": "자연스럽고 친근한 답변으로 다시 작성",
- "prompt.improveWriting.description": "원래 언어를 유지하며 글 다듬기",
- "prompt.makeConcise.description": "원래 언어와 핵심 내용을 유지하며 텍스트 줄이기",
- "prompt.professionalTone.description": "더 명확하고 전문적인 어조로 다시 작성",
- "prompt.simpleCorrectEnglish.description": "쉽고 정확한 영어로 다시 작성하거나 번역",
- "prompt.translateToEnglish.description": "쉽고 정확한 영어로 다시 작성하거나 번역",
- "settings.cancel": "취소",
- "settings.description.about": "키보드 단축키, 개인정보 보호 및 앱 정보입니다.",
- "settings.description.selectionAssistant": "다른 앱에서 선택한 텍스트를 자동으로 번역하고 읽어 줍니다.",
- "settings.description.writeAssistant": "글쓰기, 받아쓰기, 생성 동작 및 프롬프트 모드를 설정합니다.",
- "settings.error.endpointInvalid": "엔드포인트는 유효한 HTTP URL이어야 합니다.",
- "settings.error.promptModeRequired": "프롬프트 모드를 하나 이상 유지하세요.",
- "settings.help.appearance": "라이트, 다크 또는 macOS 설정 따르기를 선택하세요.",
- "settings.help.endpoint": "OpenAI 호환 /chat/completions 전체 URL입니다.",
- "settings.help.hotkey": "예: ⌥Space, Option+Space, Cmd+Space.",
- "settings.help.openAIAPIKey": "이 Mac에 저장되며 글쓰기, 실시간 받아쓰기, 선택 영역 번역 및 발음에 함께 사용됩니다. 필드를 비우면 삭제됩니다.",
- "settings.hotkey.pressKey": " 키",
- "settings.hotkey.record": "단축키 기록",
- "settings.hotkey.recording": "단축키 누르기",
- "settings.mode.add": "모드 추가",
- "settings.mode.delete": "모드 삭제",
- "settings.mode.deleteConfirmMessage": "“%@”을(를) 삭제할까요? 이 작업은 되돌릴 수 없습니다.",
- "settings.mode.deleteConfirmTitle": "프롬프트 모드를 삭제할까요?",
- "settings.mode.dragToSort": "드래그하여 순서 변경",
- "settings.mode.hidden": "숨김",
- "settings.mode.moveDown": "아래로 이동",
- "settings.mode.moveUp": "위로 이동",
- "settings.mode.newDescription": "사용자 지정 변환 모드",
- "settings.mode.newName": "새 모드",
- "settings.mode.visible": "표시",
- "settings.mode.visibleInMenu": "메뉴에 표시",
- "settings.mode.visibleInMenuHelp": "모드 선택기에 이 모드를 표시합니다.",
- "settings.model.custom": "사용자 지정…",
- "settings.model.customized": "사용자 지정 모델 *",
- "settings.model.refreshing": "모델 목록 새로 고침 중…",
- "settings.permission.accessibility": "손쉬운 사용",
- "settings.permission.openShort": "설정 열기",
- "settings.privacy.clipboard": "• 텍스트 삽입 및 설정된 강제 선택 읽기 후 클립보드 내용 복원",
- "settings.privacy.keychain": "• API 키는 이 Mac에 저장",
- "settings.privacy.provider": "• 텍스트는 OpenAI로 직접 전송",
- "settings.privacy.title": "개인정보 보호 및 보안",
- "settings.provider.active": "사용 중",
- "settings.provider.configured": "설정됨",
- "settings.provider.notConfigured": "설정 안 됨",
- "settings.provider.notLoaded": "저장된 키는 표시되지 않음",
- "settings.provider.pendingKey": "새 키 저장 대기 중",
- "settings.provider.pendingSave": "저장 대기 중",
- "settings.provider.saved": "저장됨",
- "settings.provider.savedLocally": "로컬에 저장됨",
- "settings.quickStart.close": "뒤로 이동 또는 닫기",
- "settings.quickStart.help": "팝오버에서 자주 사용하는 동작입니다.",
- "settings.quickStart.open": "Inklet 열기",
- "settings.quickStart.original": "원문 삽입",
- "settings.quickStart.submit": "변환 또는 결과 삽입",
- "settings.quickStart.title": "키보드 단축키",
- "settings.row.apiKey": "API 키",
- "settings.row.appearance": "모양",
- "settings.row.description": "설명",
- "settings.row.endpoint": "엔드포인트",
- "settings.row.model": "모델",
- "settings.row.name": "이름",
- "settings.row.openAIAPIKey": "OpenAI API 키",
- "settings.row.provider": "제공업체",
- "settings.row.systemPrompt": "프롬프트",
- "settings.row.timeout": "시간 제한",
- "settings.section.about": "정보",
- "settings.section.selectionAssistant": "선택 도우미",
- "settings.section.writeAssistant": "글쓰기 도우미",
- "settings.systemPermissions.title": "시스템 권한",
- "settings.version": "버전 %@",
- "settings.voice.shortcut.disabled": "비활성화",
- "settings.voice.shortcut.leftCommand": "왼쪽 Command",
- "settings.voice.shortcut.leftOption": "왼쪽 Option",
- "settings.voice.shortcut.rightCommand": "오른쪽 Command",
- "settings.voice.shortcut.rightOption": "오른쪽 Option",
- "setup.done": "완료",
- "setup.menubar.description": "시계 근처의 Inklet 아이콘을 클릭하면 언제든 열 수 있습니다.",
- "setup.menubar.title": "메뉴 막대에서 Inklet 찾기",
- "setup.shortcut.description": "기본 단축키는 %@입니다. 다른 앱과 충돌하면 설정에서 변경하세요.",
- "setup.shortcut.title": "단축키 사용",
- "setup.subtitle": "Inklet이 메뉴 막대에서 실행 중입니다. 사용 중인 앱에 텍스트를 삽입할 수 있도록 손쉬운 사용 권한을 허용하세요.",
- "setup.title": "Inklet이 준비되었습니다",
- "setup.window.title": "Inklet에 오신 것을 환영합니다"
- ]
-
- private static let es: [String: String] = [
- "app.menu.edit": "Edición",
- "app.menu.undo": "Deshacer",
- "app.menu.redo": "Rehacer",
- "app.menu.cut": "Cortar",
- "app.menu.copy": "Copiar",
- "app.menu.paste": "Pegar",
- "app.menu.pasteAndMatchStyle": "Pegar con el mismo estilo",
- "app.menu.delete": "Eliminar",
- "app.menu.selectAll": "Seleccionar todo",
- "app.menu.openPopover": "Abrir Inklet",
- "app.menu.settings": "Ajustes",
- "app.menu.about": "Acerca de Inklet",
- "app.menu.quit": "Salir",
- "app.menu.checkForUpdates": "Buscar actualizaciones…",
- "app.menu.checkingForUpdates": "Buscando actualizaciones…",
- "update.available.title": "Hay una actualización de Inklet disponible",
- "update.available.latestVersion": "Última: %@ (compilación %@)",
- "update.available.currentVersion": "Actual: %@",
- "update.available.noNotes": "Consulta la versión en GitHub para obtener más detalles.",
- "update.action.viewOnGitHub": "Ver en GitHub",
- "update.action.later": "Más tarde",
- "update.upToDate.title": "Inklet está actualizado",
- "update.upToDate.message": "Estás usando %@.",
- "update.error.title": "No se pudieron buscar actualizaciones",
- "update.error.message": "Inténtalo de nuevo dentro de unos instantes.",
- "update.action.retry": "Reintentar",
- "update.action.cancel": "Cancelar",
- "update.action.ok": "Aceptar",
- "legacyMigration.notice.title": "Los datos anteriores de Inklet no se importaron",
- "legacyMigration.notice.message": "Tus ajustes y tu historial anteriores siguen conservados. Puedes elegir la carpeta Inklet Data correspondiente para importarlos.",
- "legacyMigration.action.importOldData": "Importar datos…",
- "legacyMigration.panel.title": "Seleccionar los datos anteriores de Inklet",
- "legacyMigration.panel.message": "Selecciona la carpeta Inklet Data correspondiente para importar los ajustes y el historial conservados.",
- "legacyMigration.import.progress": "Importando datos…",
- "legacyMigration.import.invalidSelection": "La carpeta seleccionada no es la carpeta de datos anteriores correspondiente a esta app de Inklet.",
- "legacyMigration.import.failed": "No se pudieron importar los datos anteriores. Tus ajustes y tu historial siguen conservados.",
- "legacyMigration.import.partialFailure": "No se pudieron importar algunos datos anteriores. Tus ajustes y tu historial siguen conservados.",
- "legacyMigration.import.relaunching": "Inklet debe reiniciarse para terminar de cargar los datos importados.",
- "legacyMigration.import.relaunchProgress": "Reiniciando Inklet…",
- "legacyMigration.import.relaunchFailed": "Inklet no pudo reiniciarse. Los datos importados están listos y se cargarán la próxima vez que abras Inklet.",
- "legacyMigration.action.retryRelaunch": "Reiniciar Inklet",
- "legacyMigration.action.quit": "Salir de Inklet",
- "legacyMigration.settings.help": "Importa tus ajustes y tu historial conservados desde la carpeta Inklet Data correspondiente.",
- "settings.section.history": "Historial",
- "settings.description.history": "Revisa los resultados de escritura y selección, además de los resultados de voz antiguos guardados localmente.",
- "settings.history.filter.all": "Todo",
- "settings.history.source.write": "Escritura",
- "settings.history.source.voice": "Voz",
- "settings.history.source.selection": "Selección",
- "settings.history.empty": "Aún no hay historial guardado.",
- "settings.history.original": "Original",
- "settings.history.result": "Resultado",
- "settings.history.copyOriginal": "Copiar original",
- "settings.history.copyResult": "Copiar resultado",
- "settings.history.clear": "Borrar historial",
- "settings.history.clearConfirmTitle": "¿Borrar historial?",
- "settings.history.clearConfirmMessage": "Esto elimina de este Mac todos los registros guardados. No se puede deshacer.",
- "settings.history.cleared": "Historial borrado.",
- "settings.history.error.loadFailed": "No se pudo cargar el historial.",
- "settings.history.error.clearFailed": "No se pudo borrar el historial.",
- "settings.privacy.history": "• El historial correcto de escritura y selección se guarda localmente; el historial de voz antiguo sigue disponible",
- "settings.group.writing": "Escritura",
- "settings.group.writing.help": "Configura Writing Assistant y su borrador de origen editable.",
- "settings.group.dictation": "Dictado",
- "settings.group.dictation.help": "Mantén pulsado el atajo mientras hablas para enviar el audio del micrófono a OpenAI en tiempo real.",
- "settings.group.dictationAdvanced": "Dictado avanzado",
- "settings.row.dictationShortcut": "Atajo al mantener pulsado",
- "settings.help.dictationShortcut": "Solo funciona cuando el editor de origen de Writing Assistant está activo. Una pulsación breve no hace nada.",
- "settings.quickStart.voice.pressAndHold": "Mantener para entrada de voz",
- "settings.row.microphone": "Micrófono",
- "settings.help.microphone": "Elige la entrada de audio usada para el dictado en tiempo real.",
- "settings.microphone.systemDefault": "Sistema predeterminado",
- "settings.row.fallbackSpeechModel": "Modelo de recuperación",
- "settings.help.fallbackSpeechModel": "Modelo usado para el único intento de recuperación tras fallar la conexión en tiempo real.",
- "dictation.hint.hold": "Mantén %@ para dictar",
- "dictation.status.connecting": "Conectando…",
- "dictation.status.listening": "Escuchando… Suelta para terminar",
- "dictation.status.recordingFallback": "Conexión perdida… Sigue hablando",
- "dictation.status.finalizing": "Terminando la transcripción…",
- "dictation.status.recovering": "Recuperando desde la grabación temporal…",
- "dictation.status.ready": "Dictado listo",
- "dictation.accessibility.ready": "El dictado está listo.",
- "dictation.accessibility.listening": "El dictado está escuchando. Suelta para terminar.",
- "dictation.accessibility.recordingFallback": "Se perdió la conexión. Sigue hablando para poder recuperar.",
- "dictation.accessibility.finalizing": "Terminando la transcripción del dictado.",
- "dictation.accessibility.recovering": "Recuperando el dictado desde la grabación temporal.",
- "dictation.accessibility.completed": "Dictado completado.",
- "dictation.accessibility.cancelled": "Dictado cancelado.",
- "dictation.accessibility.failed": "El dictado ha fallado.",
- "dictation.accessibility.sourceEditor": "Editor de origen de escritura",
- "dictation.undo.action": "Dictado",
- "dictation.error.missingAPIKey": "Añade una clave API de OpenAI en Ajustes para usar el dictado.",
- "dictation.error.microphonePermission": "El dictado necesita permiso para usar el micrófono.",
- "dictation.error.noAudioInputDevice": "No hay micrófono ni dispositivo de entrada de audio disponible.",
- "dictation.error.recordingUnavailable": "No se pudo iniciar la grabación de audio.",
- "dictation.error.realtimeBufferOverflow": "No se pudo procesar el audio en tiempo real a tiempo. Inténtalo de nuevo.",
- "dictation.error.connection": "Falló la conexión de transcripción en tiempo real.",
- "dictation.error.connectionTimeout": "La conexión de transcripción en tiempo real agotó el tiempo de espera.",
- "dictation.error.finalTimeout": "La transcripción final en tiempo real no llegó a tiempo.",
- "dictation.error.fallback": "No se pudo recuperar el dictado desde la grabación temporal.",
- "dictation.error.noSpeech": "No se reconoció ninguna voz.",
- "settings.privacy.voice": "• El audio de dictado en tiempo real y el texto de pronunciación se envían directamente a OpenAI; las grabaciones de recuperación se eliminan al terminar la sesión",
- "settings.section.selectionActions": "Acciones de selección",
- "settings.description.selectionActions": "Gestiona acciones automáticas para texto seleccionado en otras apps.",
- "settings.row.selectionActionsEnabled": "Activar acciones de selección",
- "settings.help.selectionActionsEnabled": "Muestra un menú pequeño tras una breve pausa al seleccionar texto.",
- "settings.row.forceSelectionMode": "Selección forzada",
- "settings.help.forceSelectionMode": "Alternativa cuando Accesibilidad no puede leer el texto seleccionado. Copiar desde el menú no simula entradas de teclado.",
- "settings.forceSelection.disabled": "Desactivada",
- "settings.forceSelection.menuCopyOnly": "Solo copiar desde menú",
- "settings.forceSelection.menuCopyThenShortcut": "Menú Copiar, luego Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, luego menú Copiar",
- "settings.row.allowSimulatedCopyFallback": "Permitir Cmd+C simulado",
- "settings.help.allowSimulatedCopyFallback": "Envía Cmd+C a la app en primer plano si Copiar desde el menú no está disponible. Puede interferir con juegos o apps remotas.",
- "settings.row.translationLanguage": "Idioma de traducción",
- "settings.help.translationLanguage": "Idioma usado por la acción Traducir del texto seleccionado.",
- "settings.row.translationPrompt": "Prompt de traducción",
- "settings.help.translationPrompt": "Instrucciones para Traducir texto seleccionado. Usa {targetLanguage} para el idioma elegido.",
- "settings.translationPrompt.restoreDefault": "Restaurar predeterminado",
- "settings.row.aiPronunciation": "Voz de pronunciación con IA",
- "settings.help.aiPronunciation": "Voz usada por Pronunciar en el texto seleccionado. Usa OpenAI text-to-speech con tu OpenAI API key.",
- "settings.row.aiPronunciationSpeed": "Velocidad de pronunciación IA",
- "settings.help.aiPronunciationSpeed": "Velocidad de reproducción para Pronunciar texto seleccionado y la vista previa de voz.",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "Previsualizar voz",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "Seguir idioma de la interfaz",
- "selection.action.translate": "Traducir",
- "selection.action.pronounce": "Pronunciar",
- "selection.action.translating": "Traduciendo...",
- "selection.action.preparingPronunciation": "Preparando audio...",
- "selection.action.playingPronunciation": "Reproduciendo...",
- "selection.action.pronounceOriginal": "Reproducir original",
- "selection.action.pronounceTranslation": "Reproducir traduccion",
- "selection.action.audioLabel.original": "Orig.",
- "selection.action.audioLabel.translation": "Trad.",
- "selection.action.copyTranslation": "Copiar traducción",
- "selection.action.retry": "Reintentar",
- "selection.action.unsupportedTitle": "Texto seleccionado no disponible",
- "selection.action.unsupportedMessage": "La app actual no expone el texto seleccionado a Inklet.",
- "selection.action.missingOpenAIKey": "Añade una OpenAI API key en Ajustes para usar la pronunciación con IA.",
- "selection.action.translationFailed": "La traducción falló.",
- "selection.action.pronunciationFailed": "La pronunciación falló.",
- "about.tagline": "Convierte tus ideas en textos claros",
- "about.website": "Sitio web",
- "about.privacyPolicy": "Política de privacidad",
- "about.support": "Soporte",
- "language.system": "Sistema",
- "settings.window.title": "Ajustes de Inklet",
- "settings.sidebar.preferences": "Preferencias",
- "settings.sidebar.hint": "Autoguardado · ⌘, Abrir",
- "settings.section.general": "General",
- "settings.section.providers": "Proveedores",
- "settings.section.promptModes": "Modos de prompt",
- "settings.section.permissions": "Permisos",
- "settings.description.general": "Comportamiento básico, atajo, idioma de la interfaz y parámetros de generación.",
- "settings.description.providers": "Elige proveedor LLM, modelo y API key.",
- "settings.description.promptModes": "Gestiona modos de conversión y prompts del sistema.",
- "settings.description.permissions": "Comprueba el permiso de macOS necesario para insertar texto.",
- "settings.row.language": "Idioma de interfaz",
- "settings.help.language": "System sigue el idioma de macOS.",
- "settings.row.hotkey": "Atajo",
- "settings.help.timeout": "Duración máxima de la solicitud.",
- "settings.seconds": "%d s",
- "settings.help.provider": "Proveedor actual.",
- "settings.help.apiKey": "Se guarda localmente en este Mac.",
- "settings.help.model.default": "Predeterminado: %@",
- "settings.mode.untitled": "Modo sin título",
- "settings.mode.pick": "Selecciona un modo de prompt",
- "settings.help.name": "Nombre mostrado en el panel.",
- "settings.help.description": "Qué hace este modo.",
- "settings.characters": "%d caracteres",
- "settings.permission.authorized": "Accessibility autorizado",
- "settings.permission.required": "Se requiere permiso de Accessibility",
- "settings.permission.description": "Haz clic en Abrir ajustes, pulsa +, elige /Applications/Inklet.app y activa Inklet.",
- "settings.permission.open": "Abrir ajustes del sistema",
- "settings.footer.pending": "Los cambios se guardan automáticamente y se aplican la próxima vez que abras el panel.",
- "settings.save": "Guardar",
- "settings.saved": "Guardado",
- "settings.error.visibleModeRequired": "Mantén al menos un modo visible.",
- "settings.error.modelRequired": "Model no puede estar vacío.",
- "settings.error.openAccessibility": "No se pudo abrir Accessibility.",
- "settings.error.saveFailed": "Error al guardar: %@",
- "popover.input.placeholder": "Escribe texto para transformar o insertar",
- "popover.modeSearch.placeholder": "Buscar modos",
- "popover.modeSearch.empty": "No hay modos coincidentes",
- "popover.modeSearch.select": "Seleccionar",
- "popover.modeSearch.write": "Escribir",
- "popover.result.title": "Resultado",
- "popover.result.editable": "Editable antes de insertar",
- "popover.result.generatedWith": "Generado con %@",
- "popover.mode.picker": "Modo",
- "popover.mode.backToModes": "Elegir modo",
- "popover.action.transform": "Transformar",
- "popover.action.regenerate": "Regenerar",
- "popover.action.insert": "Insertar",
- "popover.action.insertOriginal": "Insertar original",
- "popover.hint.transformInsert": "Transformar/Insertar",
- "popover.hint.original": "Original",
- "popover.hint.accessibility": "Atajos: Enter transforma o inserta, Command Enter inserta el original, Escape vuelve o cierra",
- "popover.busy.inserting": "Insertando...",
- "popover.busy.transforming": "Transformando...",
- "popover.error.emptyOriginal": "Escribe texto para insertar.",
- "popover.error.missingTarget": "No se encontró la app de destino para insertar texto.",
- "popover.error.missingAPIKey": "Configura la API Key de %@ en Ajustes.",
- "insertion.error.accessibility": "Activa el permiso de Accessibility antes de insertar texto.",
- "insertion.error.activation": "No se pudo volver a la app original. Inténtalo de nuevo.",
- "insertion.error.pasteEvent": "No se pudo enviar el atajo de pegar.",
- "insertion.error.clipboardRestore": "Se insertó el texto, pero no se pudo restaurar el portapapeles.",
- "error.emptySource": "Escribe texto para transformar.",
- "error.emptyResponse": "El modelo devolvió una respuesta vacía.",
- "error.timeout": "La solicitud agotó el tiempo. Inténtalo de nuevo.",
- "error.networkConnectionLost": "Se interrumpió la conexión de red. Inténtalo de nuevo.",
- "error.provider.urlInvalid": "La solicitud a %@ falló: URL no válida",
- "error.provider.httpUnknown": "La solicitud a %@ falló: HTTP unknown",
- "error.provider.prefix": "La solicitud a %@ falló: %@",
- "hotkey.error.unsupported": "Atajo no compatible “%@”. Compatibles: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
- "hotkey.error.registrationFailed": "Error al registrar el atajo (%d).",
- "prompt.custom.description": "Usa tu prompt personalizado",
- "appearance.dark": "Oscuro",
- "appearance.light": "Claro",
- "appearance.system": "Sistema",
- "popover.hint.back": "Volver",
- "popover.hint.close": "Cerrar",
- "popover.hint.mode": "Modo",
- "popover.hint.newLine": "Nueva línea",
- "popover.status.preview": "Vista previa",
- "popover.status.ready": "Listo",
- "prompt.chineseSummary.description": "Resume cualquier texto en chino simplificado de forma concisa",
- "prompt.friendlyReply.description": "Reescribe como una respuesta natural y amable",
- "prompt.improveWriting.description": "Mejora la redacción manteniendo el idioma original",
- "prompt.makeConcise.description": "Acorta el texto manteniendo el idioma original y los puntos clave",
- "prompt.professionalTone.description": "Reescribe con un tono más claro y profesional",
- "prompt.simpleCorrectEnglish.description": "Reescribe o traduce a un inglés sencillo y correcto",
- "prompt.translateToEnglish.description": "Reescribe o traduce a un inglés sencillo y correcto",
- "settings.cancel": "Cancelar",
- "settings.description.about": "Atajos de teclado, notas de privacidad e información de la app.",
- "settings.description.selectionAssistant": "Herramientas de traducción y pronunciación para el texto seleccionado en otras apps.",
- "settings.description.writeAssistant": "Configura la escritura, el dictado, la generación y los modos de instrucciones.",
- "settings.error.endpointInvalid": "El endpoint debe ser una URL HTTP válida.",
- "settings.error.promptModeRequired": "Mantén al menos un modo de instrucciones.",
- "settings.help.appearance": "Elige claro, oscuro o seguir macOS.",
- "settings.help.endpoint": "URL completa de /chat/completions compatible con OpenAI.",
- "settings.help.hotkey": "Por ejemplo: ⌥Space, Option+Space, Cmd+Space.",
- "settings.help.openAIAPIKey": "Se guarda en este Mac y se comparte entre escritura, dictado en tiempo real, traducción y pronunciación. Vacía el campo para eliminarla.",
- "settings.hotkey.pressKey": " tecla",
- "settings.hotkey.record": "Grabar atajo",
- "settings.hotkey.recording": "Pulsa el atajo",
- "settings.mode.add": "Añadir modo",
- "settings.mode.delete": "Eliminar modo",
- "settings.mode.deleteConfirmMessage": "¿Eliminar «%@»? Esta acción no se puede deshacer.",
- "settings.mode.deleteConfirmTitle": "¿Eliminar el modo de instrucciones?",
- "settings.mode.dragToSort": "Arrastra para reordenar",
- "settings.mode.hidden": "Oculto",
- "settings.mode.moveDown": "Mover abajo",
- "settings.mode.moveUp": "Mover arriba",
- "settings.mode.newDescription": "Modo de transformación personalizado",
- "settings.mode.newName": "Nuevo modo",
- "settings.mode.visible": "Visible",
- "settings.mode.visibleInMenu": "Mostrar en el menú",
- "settings.mode.visibleInMenuHelp": "Muestra este modo en el selector de modos.",
- "settings.model.custom": "Personalizado…",
- "settings.model.customized": "Modelo personalizado *",
- "settings.model.refreshing": "Actualizando modelos…",
- "settings.permission.accessibility": "Accesibilidad",
- "settings.permission.openShort": "Abrir ajustes",
- "settings.privacy.clipboard": "• El portapapeles se restaura tras la inserción y la lectura mediante selección forzada",
- "settings.privacy.keychain": "• Las claves API se guardan en este Mac",
- "settings.privacy.provider": "• El texto se envía directamente a OpenAI",
- "settings.privacy.title": "Privacidad y seguridad",
- "settings.provider.active": "Activo",
- "settings.provider.configured": "Configurado",
- "settings.provider.notConfigured": "Sin configurar",
- "settings.provider.notLoaded": "Las claves guardadas no se muestran",
- "settings.provider.pendingKey": "Nueva clave lista para guardar",
- "settings.provider.pendingSave": "Pendiente de guardar",
- "settings.provider.saved": "Guardado",
- "settings.provider.savedLocally": "Guardado localmente",
- "settings.quickStart.close": "Volver o cerrar",
- "settings.quickStart.help": "Acciones habituales en la ventana emergente.",
- "settings.quickStart.open": "Abrir Inklet",
- "settings.quickStart.original": "Insertar texto original",
- "settings.quickStart.submit": "Transformar o insertar el resultado",
- "settings.quickStart.title": "Atajos de teclado",
- "settings.row.apiKey": "Clave API",
- "settings.row.appearance": "Apariencia",
- "settings.row.description": "Descripción",
- "settings.row.endpoint": "Endpoint",
- "settings.row.model": "Modelo",
- "settings.row.name": "Nombre",
- "settings.row.openAIAPIKey": "Clave API de OpenAI",
- "settings.row.provider": "Proveedor",
- "settings.row.systemPrompt": "Instrucciones",
- "settings.row.timeout": "Tiempo de espera",
- "settings.section.about": "Acerca de",
- "settings.section.selectionAssistant": "Asistente de selección",
- "settings.section.writeAssistant": "Asistente de escritura",
- "settings.systemPermissions.title": "Permisos del sistema",
- "settings.version": "Versión %@",
- "settings.voice.shortcut.disabled": "Desactivado",
- "settings.voice.shortcut.leftCommand": "Command izquierdo",
- "settings.voice.shortcut.leftOption": "Option izquierdo",
- "settings.voice.shortcut.rightCommand": "Command derecho",
- "settings.voice.shortcut.rightOption": "Option derecho",
- "setup.done": "Listo",
- "setup.menubar.description": "Haz clic en el icono de Inklet junto al reloj para abrirlo cuando quieras.",
- "setup.menubar.title": "Encuentra Inklet en la barra de menús",
- "setup.shortcut.description": "El atajo predeterminado es %@. Si entra en conflicto con otra app, cámbialo en Ajustes.",
- "setup.shortcut.title": "Usa el atajo",
- "setup.subtitle": "Inklet está en la barra de menús. Concede permiso de Accesibilidad para que pueda insertar texto en la app que estés usando.",
- "setup.title": "Inklet está listo",
- "setup.window.title": "Te damos la bienvenida a Inklet"
- ]
-
- private static let fr: [String: String] = [
- "app.menu.edit": "Édition",
- "app.menu.undo": "Annuler",
- "app.menu.redo": "Rétablir",
- "app.menu.cut": "Couper",
- "app.menu.copy": "Copier",
- "app.menu.paste": "Coller",
- "app.menu.pasteAndMatchStyle": "Coller et adapter le style",
- "app.menu.delete": "Supprimer",
- "app.menu.selectAll": "Tout sélectionner",
- "app.menu.openPopover": "Ouvrir Inklet",
- "app.menu.settings": "Réglages",
- "app.menu.about": "À propos de Inklet",
- "app.menu.quit": "Quitter",
- "app.menu.checkForUpdates": "Rechercher des mises à jour…",
- "app.menu.checkingForUpdates": "Recherche des mises à jour…",
- "update.available.title": "Une mise à jour d’Inklet est disponible",
- "update.available.latestVersion": "Dernière version : %@ (build %@)",
- "update.available.currentVersion": "Actuelle : %@",
- "update.available.noNotes": "Consultez la publication sur GitHub pour plus de détails.",
- "update.action.viewOnGitHub": "Voir sur GitHub",
- "update.action.later": "Plus tard",
- "update.upToDate.title": "Inklet est à jour",
- "update.upToDate.message": "Vous utilisez %@.",
- "update.error.title": "Impossible de rechercher les mises à jour",
- "update.error.message": "Réessayez dans quelques instants.",
- "update.action.retry": "Réessayer",
- "update.action.cancel": "Annuler",
- "update.action.ok": "OK",
- "legacyMigration.notice.title": "Les anciennes données d’Inklet n’ont pas été importées",
- "legacyMigration.notice.message": "Vos réglages et votre historique précédents sont toujours conservés. Vous pouvez choisir le dossier Inklet Data correspondant pour les importer.",
- "legacyMigration.action.importOldData": "Importer les données",
- "legacyMigration.panel.title": "Choisir les anciennes données d’Inklet",
- "legacyMigration.panel.message": "Sélectionnez le dossier Inklet Data correspondant pour importer les réglages et l’historique conservés.",
- "legacyMigration.import.progress": "Import en cours…",
- "legacyMigration.import.invalidSelection": "Le dossier sélectionné n’est pas le dossier des anciennes données correspondant à cette application Inklet.",
- "legacyMigration.import.failed": "Impossible d’importer les anciennes données. Vos réglages et votre historique sont toujours conservés.",
- "legacyMigration.import.partialFailure": "Certaines anciennes données n’ont pas pu être importées. Vos réglages et votre historique sont toujours conservés.",
- "legacyMigration.import.relaunching": "Inklet doit redémarrer pour terminer le chargement des données importées.",
- "legacyMigration.import.relaunchProgress": "Inklet redémarre…",
- "legacyMigration.import.relaunchFailed": "Inklet n’a pas pu redémarrer. Les données importées sont prêtes et seront chargées à la prochaine ouverture d’Inklet.",
- "legacyMigration.action.retryRelaunch": "Redémarrer Inklet",
- "legacyMigration.action.quit": "Quitter Inklet",
- "legacyMigration.settings.help": "Importez vos réglages et votre historique conservés depuis le dossier Inklet Data correspondant.",
- "settings.section.history": "Historique",
- "settings.description.history": "Consultez les résultats d’écriture et de sélection, ainsi que les anciens résultats vocaux enregistrés localement.",
- "settings.history.filter.all": "Tout",
- "settings.history.source.write": "Écriture",
- "settings.history.source.voice": "Voix",
- "settings.history.source.selection": "Sélection",
- "settings.history.empty": "Aucun historique enregistré pour le moment.",
- "settings.history.original": "Original",
- "settings.history.result": "Résultat",
- "settings.history.copyOriginal": "Copier l’original",
- "settings.history.copyResult": "Copier le résultat",
- "settings.history.clear": "Effacer l’historique",
- "settings.history.clearConfirmTitle": "Effacer l’historique ?",
- "settings.history.clearConfirmMessage": "Tous les enregistrements d’historique de ce Mac seront supprimés. Cette action est irréversible.",
- "settings.history.cleared": "Historique effacé.",
- "settings.history.error.loadFailed": "Impossible de charger l’historique.",
- "settings.history.error.clearFailed": "Impossible d’effacer l’historique.",
- "settings.privacy.history": "• L’historique réussi d’écriture et de sélection est enregistré localement ; l’ancien historique vocal reste accessible",
- "settings.group.writing": "Écriture",
- "settings.group.writing.help": "Configurez Writing Assistant et son brouillon source modifiable.",
- "settings.group.dictation": "Dictée",
- "settings.group.dictation.help": "Maintenez le raccourci pendant que vous parlez pour envoyer le son du micro à OpenAI en temps réel.",
- "settings.group.dictationAdvanced": "Dictée avancée",
- "settings.row.dictationShortcut": "Raccourci à maintenir",
- "settings.help.dictationShortcut": "Fonctionne uniquement lorsque l’éditeur source de Writing Assistant est actif. Un appui bref ne fait rien.",
- "settings.quickStart.voice.pressAndHold": "Maintenir pour l’entrée vocale",
- "settings.row.microphone": "Micro",
- "settings.help.microphone": "Choisissez l’entrée audio utilisée pour la dictée en temps réel.",
- "settings.microphone.systemDefault": "Système par défaut",
- "settings.row.fallbackSpeechModel": "Modèle de récupération",
- "settings.help.fallbackSpeechModel": "Modèle utilisé pour l’unique tentative de récupération après l’échec de la connexion en temps réel.",
- "dictation.hint.hold": "Maintenez %@ pour dicter",
- "dictation.status.connecting": "Connexion…",
- "dictation.status.listening": "Écoute… Relâchez pour terminer",
- "dictation.status.recordingFallback": "Connexion perdue… Continuez à parler",
- "dictation.status.finalizing": "Finalisation de la transcription…",
- "dictation.status.recovering": "Récupération depuis l’enregistrement temporaire…",
- "dictation.status.ready": "Dictée prête",
- "dictation.accessibility.ready": "La dictée est prête.",
- "dictation.accessibility.listening": "La dictée écoute. Relâchez pour terminer.",
- "dictation.accessibility.recordingFallback": "La connexion a été perdue. Continuez à parler pour permettre la récupération.",
- "dictation.accessibility.finalizing": "Finalisation de la transcription de la dictée.",
- "dictation.accessibility.recovering": "Récupération de la dictée depuis l’enregistrement temporaire.",
- "dictation.accessibility.completed": "Dictée terminée.",
- "dictation.accessibility.cancelled": "Dictée annulée.",
- "dictation.accessibility.failed": "Échec de la dictée.",
- "dictation.accessibility.sourceEditor": "Éditeur source d’écriture",
- "dictation.undo.action": "Dictée",
- "dictation.error.missingAPIKey": "Ajoutez une clé API OpenAI dans Réglages pour utiliser la dictée.",
- "dictation.error.microphonePermission": "La dictée nécessite l’autorisation d’utiliser le micro.",
- "dictation.error.noAudioInputDevice": "Aucun micro ou périphérique d’entrée audio n’est disponible.",
- "dictation.error.recordingUnavailable": "Impossible de démarrer l’enregistrement audio.",
- "dictation.error.realtimeBufferOverflow": "Le traitement audio en temps réel n’a pas suivi. Réessayez.",
- "dictation.error.connection": "La connexion de transcription en temps réel a échoué.",
- "dictation.error.connectionTimeout": "La connexion de transcription en temps réel a expiré.",
- "dictation.error.finalTimeout": "La transcription finale en temps réel n’est pas arrivée à temps.",
- "dictation.error.fallback": "Impossible de récupérer la dictée depuis l’enregistrement temporaire.",
- "dictation.error.noSpeech": "Aucune parole n’a été reconnue.",
- "settings.privacy.voice": "• Le son de dictée en temps réel et le texte de prononciation sont envoyés directement à OpenAI ; les enregistrements de récupération sont supprimés à la fin de la session",
- "settings.section.selectionActions": "Actions de sélection",
- "settings.description.selectionActions": "Gère les actions automatiques pour le texte sélectionné dans d'autres apps.",
- "settings.row.selectionActionsEnabled": "Activer les actions de sélection",
- "settings.help.selectionActionsEnabled": "Affiche un petit menu après une brève pause sur du texte sélectionné.",
- "settings.row.forceSelectionMode": "Sélection forcée",
- "settings.help.forceSelectionMode": "Solution de secours quand Accessibilité ne peut pas lire le texte sélectionné. La copie par menu ne simule pas de saisie clavier.",
- "settings.forceSelection.disabled": "Désactivée",
- "settings.forceSelection.menuCopyOnly": "Menu Copier uniquement",
- "settings.forceSelection.menuCopyThenShortcut": "Menu Copier, puis Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, puis menu Copier",
- "settings.row.allowSimulatedCopyFallback": "Autoriser la simulation de Cmd+C",
- "settings.help.allowSimulatedCopyFallback": "Envoie Cmd+C à l’app au premier plan si la copie par menu est indisponible. Cela peut perturber les jeux ou apps distantes.",
- "settings.row.translationLanguage": "Langue de traduction",
- "settings.help.translationLanguage": "Langue utilisée par l'action Traduire du texte sélectionné.",
- "settings.row.translationPrompt": "Prompt de traduction",
- "settings.help.translationPrompt": "Instructions de l'action Traduire le texte sélectionné. Utilisez {targetLanguage} pour la langue choisie.",
- "settings.translationPrompt.restoreDefault": "Rétablir par défaut",
- "settings.row.aiPronunciation": "Voix de prononciation IA",
- "settings.help.aiPronunciation": "Voix utilisée par Prononcer pour le texte sélectionné. Utilise OpenAI text-to-speech avec votre OpenAI API key.",
- "settings.row.aiPronunciationSpeed": "Vitesse de prononciation IA",
- "settings.help.aiPronunciationSpeed": "Vitesse de lecture utilisée pour Prononcer le texte sélectionné et l'apercu de la voix.",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "Apercu de la voix",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "Suivre la langue de l'interface",
- "selection.action.translate": "Traduire",
- "selection.action.pronounce": "Prononcer",
- "selection.action.translating": "Traduction...",
- "selection.action.preparingPronunciation": "Préparation audio...",
- "selection.action.playingPronunciation": "Lecture...",
- "selection.action.pronounceOriginal": "Lire l'original",
- "selection.action.pronounceTranslation": "Lire la traduction",
- "selection.action.audioLabel.original": "Orig.",
- "selection.action.audioLabel.translation": "Trad.",
- "selection.action.copyTranslation": "Copier la traduction",
- "selection.action.retry": "Réessayer",
- "selection.action.unsupportedTitle": "Texte sélectionné indisponible",
- "selection.action.unsupportedMessage": "L'app actuelle n'expose pas le texte sélectionné à Inklet.",
- "selection.action.missingOpenAIKey": "Ajoutez une OpenAI API key dans Réglages pour utiliser la prononciation IA.",
- "selection.action.translationFailed": "La traduction a échoué.",
- "selection.action.pronunciationFailed": "La prononciation a échoué.",
- "about.tagline": "Transformez vos idées en textes clairs",
- "about.website": "Site web",
- "about.privacyPolicy": "Politique de confidentialité",
- "about.support": "Assistance",
- "language.system": "Système",
- "settings.window.title": "Réglages de Inklet",
- "settings.sidebar.preferences": "Préférences",
- "settings.sidebar.hint": "Auto-enregistré · ⌘, Ouvrir",
- "settings.section.general": "Général",
- "settings.section.providers": "Fournisseurs",
- "settings.section.promptModes": "Modes de prompt",
- "settings.section.permissions": "Autorisations",
- "settings.description.general": "Comportement, raccourci, langue d’interface et paramètres de génération.",
- "settings.description.providers": "Choisissez un fournisseur LLM, un modèle et une clé API.",
- "settings.description.promptModes": "Gérez les modes de conversion et les prompts système.",
- "settings.description.permissions": "Vérifiez l’autorisation macOS nécessaire pour insérer du texte.",
- "settings.row.language": "Langue de l’interface",
- "settings.help.language": "System suit la langue de macOS.",
- "settings.row.hotkey": "Raccourci",
- "settings.help.timeout": "Durée maximale de la requête.",
- "settings.seconds": "%d s",
- "settings.help.provider": "Fournisseur actuel.",
- "settings.help.apiKey": "Enregistrée localement sur ce Mac.",
- "settings.help.model.default": "Par défaut : %@",
- "settings.mode.untitled": "Mode sans titre",
- "settings.mode.pick": "Sélectionnez un mode de prompt",
- "settings.help.name": "Nom affiché dans le panneau.",
- "settings.help.description": "Rôle de ce mode.",
- "settings.characters": "%d caractères",
- "settings.permission.authorized": "Accessibility autorisé",
- "settings.permission.required": "Autorisation Accessibility requise",
- "settings.permission.description": "Cliquez sur Ouvrir les réglages, puis sur +, choisissez /Applications/Inklet.app et activez Inklet.",
- "settings.permission.open": "Ouvrir les réglages système",
- "settings.footer.pending": "Les changements sont enregistrés automatiquement et s’appliquent à la prochaine ouverture du panneau.",
- "settings.save": "Enregistrer",
- "settings.saved": "Enregistré",
- "settings.error.visibleModeRequired": "Conservez au moins un mode visible.",
- "settings.error.modelRequired": "Model ne peut pas être vide.",
- "settings.error.openAccessibility": "Impossible d’ouvrir les réglages Accessibility.",
- "settings.error.saveFailed": "Échec de l’enregistrement : %@",
- "popover.input.placeholder": "Saisissez le texte à transformer ou insérer",
- "popover.modeSearch.placeholder": "Rechercher des modes",
- "popover.modeSearch.empty": "Aucun mode correspondant",
- "popover.modeSearch.select": "Sélectionner",
- "popover.modeSearch.write": "Écrire",
- "popover.result.title": "Résultat",
- "popover.result.editable": "Modifiable avant insertion",
- "popover.result.generatedWith": "Généré avec %@",
- "popover.mode.picker": "Mode",
- "popover.mode.backToModes": "Choisir un mode",
- "popover.action.transform": "Transformer",
- "popover.action.regenerate": "Régénérer",
- "popover.action.insert": "Insérer",
- "popover.action.insertOriginal": "Insérer l’original",
- "popover.hint.transformInsert": "Transformer/Insérer",
- "popover.hint.original": "Original",
- "popover.hint.accessibility": "Raccourcis : Enter transforme ou insère, Command Enter insère l’original, Escape revient ou ferme",
- "popover.busy.inserting": "Insertion...",
- "popover.busy.transforming": "Transformation...",
- "popover.error.emptyOriginal": "Saisissez le texte à insérer.",
- "popover.error.missingTarget": "Impossible de trouver l’app cible pour insérer le texte.",
- "popover.error.missingAPIKey": "Configurez la clé API %@ dans les réglages.",
- "insertion.error.accessibility": "Activez l’autorisation Accessibility avant d’insérer du texte.",
- "insertion.error.activation": "Impossible de revenir à l’app d’origine. Réessayez.",
- "insertion.error.pasteEvent": "Impossible d’envoyer le raccourci Coller.",
- "insertion.error.clipboardRestore": "Texte inséré, mais restauration du presse-papiers impossible.",
- "error.emptySource": "Saisissez le texte à transformer.",
- "error.emptyResponse": "Le modèle a renvoyé une réponse vide.",
- "error.timeout": "La requête a expiré. Réessayez.",
- "error.networkConnectionLost": "La connexion réseau a été interrompue. Réessayez.",
- "error.provider.urlInvalid": "La requête %@ a échoué : URL invalide",
- "error.provider.httpUnknown": "La requête %@ a échoué : HTTP unknown",
- "error.provider.prefix": "La requête %@ a échoué : %@",
- "hotkey.error.unsupported": "Raccourci non pris en charge “%@”. Pris en charge : ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
- "hotkey.error.registrationFailed": "Échec d’enregistrement du raccourci (%d).",
- "prompt.custom.description": "Utilise votre prompt personnalisé",
- "appearance.dark": "Sombre",
- "appearance.light": "Clair",
- "appearance.system": "Système",
- "popover.hint.back": "Retour",
- "popover.hint.close": "Fermer",
- "popover.hint.mode": "Mode",
- "popover.hint.newLine": "Nouvelle ligne",
- "popover.status.preview": "Aperçu",
- "popover.status.ready": "Prêt",
- "prompt.chineseSummary.description": "Résumer tout texte en chinois simplifié de façon concise",
- "prompt.friendlyReply.description": "Reformuler en une réponse naturelle et amicale",
- "prompt.improveWriting.description": "Améliorer la rédaction en conservant la langue d’origine",
- "prompt.makeConcise.description": "Raccourcir le texte en conservant la langue d’origine et les points clés",
- "prompt.professionalTone.description": "Reformuler dans un ton plus clair et professionnel",
- "prompt.simpleCorrectEnglish.description": "Reformuler ou traduire en anglais simple et correct",
- "prompt.translateToEnglish.description": "Reformuler ou traduire en anglais simple et correct",
- "settings.cancel": "Annuler",
- "settings.description.about": "Raccourcis clavier, confidentialité et informations sur l’app.",
- "settings.description.selectionAssistant": "Outils de traduction et de prononciation du texte sélectionné dans d’autres apps.",
- "settings.description.writeAssistant": "Configurer la rédaction, la dictée, la génération et les modes d’instructions.",
- "settings.error.endpointInvalid": "Le point de terminaison doit être une URL HTTP valide.",
- "settings.error.promptModeRequired": "Conservez au moins un mode d’instructions.",
- "settings.help.appearance": "Choisir Clair, Sombre ou suivre macOS.",
- "settings.help.endpoint": "URL complète de /chat/completions compatible avec OpenAI.",
- "settings.help.hotkey": "Par exemple : ⌥Space, Option+Space, Cmd+Space.",
- "settings.help.openAIAPIKey": "Stockée sur ce Mac et partagée par la rédaction, la dictée en temps réel, la traduction et la prononciation. Videz le champ pour la supprimer.",
- "settings.hotkey.pressKey": " touche",
- "settings.hotkey.record": "Enregistrer un raccourci",
- "settings.hotkey.recording": "Appuyez sur le raccourci",
- "settings.mode.add": "Ajouter un mode",
- "settings.mode.delete": "Supprimer le mode",
- "settings.mode.deleteConfirmMessage": "Supprimer « %@ » ? Cette action est irréversible.",
- "settings.mode.deleteConfirmTitle": "Supprimer le mode d’instructions ?",
- "settings.mode.dragToSort": "Faire glisser pour réorganiser",
- "settings.mode.hidden": "Masqué",
- "settings.mode.moveDown": "Déplacer vers le bas",
- "settings.mode.moveUp": "Déplacer vers le haut",
- "settings.mode.newDescription": "Mode de transformation personnalisé",
- "settings.mode.newName": "Nouveau mode",
- "settings.mode.visible": "Visible",
- "settings.mode.visibleInMenu": "Afficher dans le menu",
- "settings.mode.visibleInMenuHelp": "Afficher ce mode dans le sélecteur de modes.",
- "settings.model.custom": "Personnalisé…",
- "settings.model.customized": "Modèle personnalisé *",
- "settings.model.refreshing": "Actualisation des modèles…",
- "settings.permission.accessibility": "Accessibilité",
- "settings.permission.openShort": "Ouvrir les réglages",
- "settings.privacy.clipboard": "• Le presse-papiers est restauré après l’insertion et la lecture par sélection forcée",
- "settings.privacy.keychain": "• Les clés API sont stockées sur ce Mac",
- "settings.privacy.provider": "• Le texte est envoyé directement à OpenAI",
- "settings.privacy.title": "Confidentialité et sécurité",
- "settings.provider.active": "Actif",
- "settings.provider.configured": "Configuré",
- "settings.provider.notConfigured": "Non configuré",
- "settings.provider.notLoaded": "Les clés enregistrées ne sont pas affichées",
- "settings.provider.pendingKey": "Nouvelle clé prête à être enregistrée",
- "settings.provider.pendingSave": "En attente d’enregistrement",
- "settings.provider.saved": "Enregistré",
- "settings.provider.savedLocally": "Enregistré localement",
- "settings.quickStart.close": "Revenir ou fermer",
- "settings.quickStart.help": "Actions courantes dans la fenêtre contextuelle.",
- "settings.quickStart.open": "Ouvrir Inklet",
- "settings.quickStart.original": "Insérer le texte original",
- "settings.quickStart.submit": "Transformer ou insérer le résultat",
- "settings.quickStart.title": "Raccourcis clavier",
- "settings.row.apiKey": "Clé API",
- "settings.row.appearance": "Apparence",
- "settings.row.description": "Description",
- "settings.row.endpoint": "Point de terminaison",
- "settings.row.model": "Modèle",
- "settings.row.name": "Nom",
- "settings.row.openAIAPIKey": "Clé API OpenAI",
- "settings.row.provider": "Fournisseur",
- "settings.row.systemPrompt": "Instructions",
- "settings.row.timeout": "Délai d’attente",
- "settings.section.about": "À propos",
- "settings.section.selectionAssistant": "Assistant de sélection",
- "settings.section.writeAssistant": "Assistant de rédaction",
- "settings.systemPermissions.title": "Autorisations système",
- "settings.version": "Version %@",
- "settings.voice.shortcut.disabled": "Désactivé",
- "settings.voice.shortcut.leftCommand": "Command gauche",
- "settings.voice.shortcut.leftOption": "Option gauche",
- "settings.voice.shortcut.rightCommand": "Command droit",
- "settings.voice.shortcut.rightOption": "Option droit",
- "setup.done": "Terminé",
- "setup.menubar.description": "Cliquez sur l’icône Inklet près de l’horloge pour l’ouvrir à tout moment.",
- "setup.menubar.title": "Retrouvez Inklet dans la barre des menus",
- "setup.shortcut.description": "Le raccourci par défaut est %@. En cas de conflit avec une autre app, modifiez-le dans les réglages.",
- "setup.shortcut.title": "Utilisez le raccourci",
- "setup.subtitle": "Inklet s’exécute dans la barre des menus. Autorisez l’accessibilité pour qu’il puisse insérer du texte dans l’app que vous utilisez.",
- "setup.title": "Inklet est prêt",
- "setup.window.title": "Bienvenue dans Inklet"
- ]
-
- private static let de: [String: String] = [
- "app.menu.edit": "Bearbeiten",
- "app.menu.undo": "Widerrufen",
- "app.menu.redo": "Wiederholen",
- "app.menu.cut": "Ausschneiden",
- "app.menu.copy": "Kopieren",
- "app.menu.paste": "Einsetzen",
- "app.menu.pasteAndMatchStyle": "Einsetzen und Stil anpassen",
- "app.menu.delete": "Löschen",
- "app.menu.selectAll": "Alles auswählen",
- "app.menu.openPopover": "Inklet öffnen",
- "app.menu.settings": "Einstellungen",
- "app.menu.about": "Über Inklet",
- "app.menu.quit": "Beenden",
- "app.menu.checkForUpdates": "Nach Updates suchen…",
- "app.menu.checkingForUpdates": "Updates werden gesucht…",
- "update.available.title": "Ein Inklet-Update ist verfügbar",
- "update.available.latestVersion": "Neueste: %@ (Build %@)",
- "update.available.currentVersion": "Aktuell: %@",
- "update.available.noNotes": "Details finden Sie auf GitHub.",
- "update.action.viewOnGitHub": "Auf GitHub anzeigen",
- "update.action.later": "Später",
- "update.upToDate.title": "Inklet ist auf dem neuesten Stand",
- "update.upToDate.message": "Sie verwenden %@.",
- "update.error.title": "Updates konnten nicht überprüft werden",
- "update.error.message": "Versuchen Sie es in Kürze erneut.",
- "update.action.retry": "Erneut versuchen",
- "update.action.cancel": "Abbrechen",
- "update.action.ok": "OK",
- "legacyMigration.notice.title": "Alte Inklet-Daten wurden nicht importiert",
- "legacyMigration.notice.message": "Ihre bisherigen Einstellungen und Ihr Verlauf sind weiterhin erhalten. Sie können den passenden Ordner „Inklet Data“ auswählen, um sie zu importieren.",
- "legacyMigration.action.importOldData": "Altdaten importieren",
- "legacyMigration.panel.title": "Alte Inklet-Daten auswählen",
- "legacyMigration.panel.message": "Wählen Sie den passenden Ordner „Inklet Data“, um die erhaltenen Einstellungen und den Verlauf zu importieren.",
- "legacyMigration.import.progress": "Datenimport läuft…",
- "legacyMigration.import.invalidSelection": "Der ausgewählte Ordner ist nicht der zu dieser Inklet-App gehörende alte Datenordner.",
- "legacyMigration.import.failed": "Die alten Daten konnten nicht importiert werden. Ihre Einstellungen und Ihr Verlauf sind weiterhin erhalten.",
- "legacyMigration.import.partialFailure": "Einige alte Daten konnten nicht importiert werden. Ihre Einstellungen und Ihr Verlauf sind weiterhin erhalten.",
- "legacyMigration.import.relaunching": "Inklet muss neu gestartet werden, um die importierten Daten vollständig zu laden.",
- "legacyMigration.import.relaunchProgress": "Inklet startet neu…",
- "legacyMigration.import.relaunchFailed": "Inklet konnte nicht neu gestartet werden. Die importierten Daten sind bereit und werden beim nächsten Öffnen von Inklet geladen.",
- "legacyMigration.action.retryRelaunch": "Inklet neu starten",
- "legacyMigration.action.quit": "Inklet beenden",
- "legacyMigration.settings.help": "Importieren Sie Ihre erhaltenen Einstellungen und Ihren Verlauf aus dem passenden Ordner „Inklet Data“.",
- "settings.section.history": "Verlauf",
- "settings.description.history": "Lokal gespeicherte Schreib- und Auswahlergebnisse sowie frühere Sprachergebnisse anzeigen.",
- "settings.history.filter.all": "Alle",
- "settings.history.source.write": "Schreiben",
- "settings.history.source.voice": "Sprache",
- "settings.history.source.selection": "Auswahl",
- "settings.history.empty": "Noch kein gespeicherter Verlauf.",
- "settings.history.original": "Original",
- "settings.history.result": "Ergebnis",
- "settings.history.copyOriginal": "Original kopieren",
- "settings.history.copyResult": "Ergebnis kopieren",
- "settings.history.clear": "Verlauf löschen",
- "settings.history.clearConfirmTitle": "Verlauf löschen?",
- "settings.history.clearConfirmMessage": "Alle gespeicherten Verlaufseinträge werden von diesem Mac gelöscht. Dies kann nicht rückgängig gemacht werden.",
- "settings.history.cleared": "Verlauf gelöscht.",
- "settings.history.error.loadFailed": "Verlauf konnte nicht geladen werden.",
- "settings.history.error.clearFailed": "Verlauf konnte nicht gelöscht werden.",
- "settings.privacy.history": "• Erfolgreicher Schreib- und Auswahlverlauf wird lokal gespeichert; ältere Spracheinträge bleiben lesbar",
- "settings.group.writing": "Schreiben",
- "settings.group.writing.help": "Writing Assistant und den bearbeitbaren Quellentwurf konfigurieren.",
- "settings.group.dictation": "Diktat",
- "settings.group.dictation.help": "Halten Sie beim Sprechen das Kürzel gedrückt, um Mikrofon-Audio in Echtzeit an OpenAI zu senden.",
- "settings.group.dictationAdvanced": "Erweitertes Diktat",
- "settings.row.dictationShortcut": "Haltekürzel",
- "settings.help.dictationShortcut": "Funktioniert nur, wenn der Quelleditor von Writing Assistant aktiv ist. Ein kurzer Tastendruck bewirkt nichts.",
- "settings.quickStart.voice.pressAndHold": "Für Spracheingabe halten",
- "settings.row.microphone": "Mikrofon",
- "settings.help.microphone": "Wählen Sie den Audioeingang für das Echtzeitdiktat.",
- "settings.microphone.systemDefault": "Systemstandard",
- "settings.row.fallbackSpeechModel": "Wiederherstellungsmodell",
- "settings.help.fallbackSpeechModel": "Modell für den einmaligen Wiederherstellungsversuch nach Ausfall der Echtzeitverbindung.",
- "dictation.hint.hold": "%@ halten, um zu diktieren",
- "dictation.status.connecting": "Verbindung wird hergestellt…",
- "dictation.status.listening": "Diktat läuft… Zum Beenden loslassen",
- "dictation.status.recordingFallback": "Verbindung verloren… Sprechen Sie weiter",
- "dictation.status.finalizing": "Transkription wird abgeschlossen…",
- "dictation.status.recovering": "Wiederherstellung aus der temporären Aufnahme…",
- "dictation.status.ready": "Diktat bereit",
- "dictation.accessibility.ready": "Das Diktat ist bereit.",
- "dictation.accessibility.listening": "Das Diktat hört zu. Zum Beenden loslassen.",
- "dictation.accessibility.recordingFallback": "Die Verbindung wurde getrennt. Sprechen Sie für die Wiederherstellung weiter.",
- "dictation.accessibility.finalizing": "Die Diktattranskription wird abgeschlossen.",
- "dictation.accessibility.recovering": "Das Diktat wird aus der temporären Aufnahme wiederhergestellt.",
- "dictation.accessibility.completed": "Diktat abgeschlossen.",
- "dictation.accessibility.cancelled": "Diktat abgebrochen.",
- "dictation.accessibility.failed": "Diktat fehlgeschlagen.",
- "dictation.accessibility.sourceEditor": "Schreib-Quelleditor",
- "dictation.undo.action": "Diktat",
- "dictation.error.missingAPIKey": "Fügen Sie in den Einstellungen einen OpenAI API-Schlüssel hinzu, um Diktat zu verwenden.",
- "dictation.error.microphonePermission": "Für Diktat ist die Mikrofonberechtigung erforderlich.",
- "dictation.error.noAudioInputDevice": "Kein Mikrofon oder Audioeingabegerät verfügbar.",
- "dictation.error.recordingUnavailable": "Die Audioaufnahme konnte nicht gestartet werden.",
- "dictation.error.realtimeBufferOverflow": "Die Echtzeit-Audioverarbeitung konnte nicht Schritt halten. Versuchen Sie es erneut.",
- "dictation.error.connection": "Die Echtzeit-Transkriptionsverbindung ist fehlgeschlagen.",
- "dictation.error.connectionTimeout": "Zeitüberschreitung beim Aufbau der Echtzeit-Transkriptionsverbindung.",
- "dictation.error.finalTimeout": "Die endgültige Echtzeit-Transkription ist nicht rechtzeitig eingetroffen.",
- "dictation.error.fallback": "Das Diktat konnte nicht aus der temporären Aufnahme wiederhergestellt werden.",
- "dictation.error.noSpeech": "Es wurde keine Sprache erkannt.",
- "settings.privacy.voice": "• Echtzeit-Diktataudio und Aussprachetext werden direkt an OpenAI gesendet; Wiederherstellungsaufnahmen werden am Ende der Sitzung gelöscht",
- "settings.section.selectionActions": "Auswahlaktionen",
- "settings.description.selectionActions": "Automatische Aktionen für ausgewählten Text in anderen Apps verwalten.",
- "settings.row.selectionActionsEnabled": "Auswahlaktionen aktivieren",
- "settings.help.selectionActionsEnabled": "Zeigt nach einer kurzen Pause über ausgewähltem Text ein kleines Menü.",
- "settings.row.forceSelectionMode": "Erzwungene Auswahl",
- "settings.help.forceSelectionMode": "Fallback, wenn Bedienungshilfen ausgewählten Text nicht lesen können. Menükopie simuliert keine Tastatureingabe.",
- "settings.forceSelection.disabled": "Aus",
- "settings.forceSelection.menuCopyOnly": "Nur Menükopie",
- "settings.forceSelection.menuCopyThenShortcut": "Menükopie, dann Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, dann Menükopie",
- "settings.row.allowSimulatedCopyFallback": "Simuliertes Cmd+C erlauben",
- "settings.help.allowSimulatedCopyFallback": "Sendet Cmd+C an die Vordergrund-App, wenn Menükopie nicht verfügbar ist. Dies kann Spiele oder Remote-Apps stören.",
- "settings.row.translationLanguage": "Übersetzungssprache",
- "settings.help.translationLanguage": "Sprache für die Übersetzen-Aktion bei ausgewähltem Text.",
- "settings.row.translationPrompt": "Übersetzungsprompt",
- "settings.help.translationPrompt": "Anweisungen für Übersetzen bei ausgewähltem Text. {targetLanguage} steht für die gewählte Sprache.",
- "settings.translationPrompt.restoreDefault": "Standard wiederherstellen",
- "settings.row.aiPronunciation": "KI-Aussprache-Stimme",
- "settings.help.aiPronunciation": "Stimme für die Aussprache ausgewählten Texts. Verwendet OpenAI text-to-speech mit Ihrem OpenAI API key.",
- "settings.row.aiPronunciationSpeed": "KI-Aussprachetempo",
- "settings.help.aiPronunciationSpeed": "Wiedergabetempo für Aussprache ausgewählten Texts und die Stimmvorschau.",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "Stimme testen",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "Oberflächensprache verwenden",
- "selection.action.translate": "Übersetzen",
- "selection.action.pronounce": "Aussprechen",
- "selection.action.translating": "Übersetzen...",
- "selection.action.preparingPronunciation": "Audio vorbereiten...",
- "selection.action.playingPronunciation": "Wiedergabe...",
- "selection.action.pronounceOriginal": "Original abspielen",
- "selection.action.pronounceTranslation": "Ubersetzung abspielen",
- "selection.action.audioLabel.original": "Orig.",
- "selection.action.audioLabel.translation": "Ubers.",
- "selection.action.copyTranslation": "Übersetzung kopieren",
- "selection.action.retry": "Erneut versuchen",
- "selection.action.unsupportedTitle": "Ausgewählter Text nicht verfügbar",
- "selection.action.unsupportedMessage": "Die aktuelle App stellt ausgewählten Text nicht für Inklet bereit.",
- "selection.action.missingOpenAIKey": "Fügen Sie in den Einstellungen einen OpenAI API key hinzu, um KI-Aussprache zu verwenden.",
- "selection.action.translationFailed": "Übersetzung fehlgeschlagen.",
- "selection.action.pronunciationFailed": "Aussprache fehlgeschlagen.",
- "about.tagline": "Aus ersten Gedanken werden klare Texte",
- "about.website": "Website",
- "about.privacyPolicy": "Datenschutz",
- "about.support": "Support",
- "language.system": "System",
- "settings.window.title": "Inklet Einstellungen",
- "settings.sidebar.preferences": "Einstellungen",
- "settings.sidebar.hint": "Automatisch gespeichert · ⌘, Öffnen",
- "settings.section.general": "Allgemein",
- "settings.section.providers": "Anbieter",
- "settings.section.promptModes": "Prompt-Modi",
- "settings.section.permissions": "Berechtigungen",
- "settings.description.general": "Grundverhalten, Tastenkürzel, Sprache und Generierungsparameter.",
- "settings.description.providers": "LLM-Anbieter, Modell und API-Key auswählen.",
- "settings.description.promptModes": "Konvertierungsmodi und System-Prompts verwalten.",
- "settings.description.permissions": "macOS-Berechtigung zum Einfügen von Text prüfen.",
- "settings.row.language": "Sprache",
- "settings.help.language": "System folgt der macOS-Sprache.",
- "settings.row.hotkey": "Tastenkürzel",
- "settings.help.timeout": "Maximale Dauer der Anfrage.",
- "settings.seconds": "%d s",
- "settings.help.provider": "Aktueller Anbieter.",
- "settings.help.apiKey": "Wird lokal auf diesem Mac gespeichert.",
- "settings.help.model.default": "Standard: %@",
- "settings.mode.untitled": "Unbenannter Modus",
- "settings.mode.pick": "Prompt-Modus auswählen",
- "settings.help.name": "Name im Popover.",
- "settings.help.description": "Was dieser Modus tut.",
- "settings.characters": "%d Zeichen",
- "settings.permission.authorized": "Accessibility autorisiert",
- "settings.permission.required": "Accessibility-Berechtigung erforderlich",
- "settings.permission.description": "Klicken Sie auf Einstellungen öffnen, dann auf +, wählen Sie /Applications/Inklet.app und aktivieren Sie Inklet.",
- "settings.permission.open": "Systemeinstellungen öffnen",
- "settings.footer.pending": "Änderungen werden automatisch gespeichert und gelten beim nächsten Öffnen des Popovers.",
- "settings.save": "Speichern",
- "settings.saved": "Gespeichert",
- "settings.error.visibleModeRequired": "Mindestens ein sichtbarer Modus ist erforderlich.",
- "settings.error.modelRequired": "Model darf nicht leer sein.",
- "settings.error.openAccessibility": "Accessibility-Einstellungen konnten nicht geöffnet werden.",
- "settings.error.saveFailed": "Speichern fehlgeschlagen: %@",
- "popover.input.placeholder": "Text zum Umwandeln oder Einfügen eingeben",
- "popover.modeSearch.placeholder": "Modi suchen",
- "popover.modeSearch.empty": "Keine passenden Modi",
- "popover.modeSearch.select": "Auswählen",
- "popover.modeSearch.write": "Schreiben",
- "popover.result.title": "Ergebnis",
- "popover.result.editable": "Vor dem Einfügen bearbeitbar",
- "popover.result.generatedWith": "Mit %@ erstellt",
- "popover.mode.picker": "Modus",
- "popover.mode.backToModes": "Modus wählen",
- "popover.action.transform": "Umwandeln",
- "popover.action.regenerate": "Neu generieren",
- "popover.action.insert": "Einfügen",
- "popover.action.insertOriginal": "Original einfügen",
- "popover.hint.transformInsert": "Umwandeln/Einfügen",
- "popover.hint.original": "Original",
- "popover.hint.accessibility": "Kürzel: Enter wandelt um oder fügt ein, Command Enter fügt Original ein, Escape zurück oder schließen",
- "popover.busy.inserting": "Einfügen...",
- "popover.busy.transforming": "Umwandeln...",
- "popover.error.emptyOriginal": "Text zum Einfügen eingeben.",
- "popover.error.missingTarget": "Ziel-App zum Einfügen wurde nicht gefunden.",
- "popover.error.missingAPIKey": "%@ API-Key zuerst in den Einstellungen konfigurieren.",
- "insertion.error.accessibility": "Accessibility-Berechtigung vor dem Einfügen aktivieren.",
- "insertion.error.activation": "Rückkehr zur ursprünglichen App fehlgeschlagen. Bitte erneut versuchen.",
- "insertion.error.pasteEvent": "Einfüge-Kürzel konnte nicht gesendet werden.",
- "insertion.error.clipboardRestore": "Text eingefügt, aber Zwischenablage konnte nicht wiederhergestellt werden.",
- "error.emptySource": "Text zum Umwandeln eingeben.",
- "error.emptyResponse": "Das Modell hat eine leere Antwort zurückgegeben.",
- "error.timeout": "Anfrage abgelaufen. Bitte erneut versuchen.",
- "error.networkConnectionLost": "Die Netzwerkverbindung wurde unterbrochen. Bitte erneut versuchen.",
- "error.provider.urlInvalid": "%@ Anfrage fehlgeschlagen: ungültige URL",
- "error.provider.httpUnknown": "%@ Anfrage fehlgeschlagen: HTTP unknown",
- "error.provider.prefix": "%@ Anfrage fehlgeschlagen: %@",
- "hotkey.error.unsupported": "Nicht unterstütztes Tastenkürzel “%@”. Unterstützt: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
- "hotkey.error.registrationFailed": "Registrierung des Tastenkürzels fehlgeschlagen (%d).",
- "prompt.custom.description": "Verwendet Ihren eigenen prompt",
- "appearance.dark": "Dunkel",
- "appearance.light": "Hell",
- "appearance.system": "System",
- "popover.hint.back": "Zurück",
- "popover.hint.close": "Schließen",
- "popover.hint.mode": "Modus",
- "popover.hint.newLine": "Neue Zeile",
- "popover.status.preview": "Vorschau",
- "popover.status.ready": "Bereit",
- "prompt.chineseSummary.description": "Beliebigen Text kurz auf vereinfachtem Chinesisch zusammenfassen",
- "prompt.friendlyReply.description": "Als natürliche, freundliche Antwort umformulieren",
- "prompt.improveWriting.description": "Text verbessern und die ursprüngliche Sprache beibehalten",
- "prompt.makeConcise.description": "Text kürzen und die ursprüngliche Sprache sowie Kernaussagen beibehalten",
- "prompt.professionalTone.description": "Klarer und professioneller formulieren",
- "prompt.simpleCorrectEnglish.description": "In einfaches, korrektes Englisch umformulieren oder übersetzen",
- "prompt.translateToEnglish.description": "In einfaches, korrektes Englisch umformulieren oder übersetzen",
- "settings.cancel": "Abbrechen",
- "settings.description.about": "Tastaturkurzbefehle, Datenschutzhinweise und App-Informationen.",
- "settings.description.selectionAssistant": "Automatische Übersetzung und Aussprache für ausgewählten Text in anderen Apps.",
- "settings.description.writeAssistant": "Schreiben, Diktieren, Textgenerierung und Prompt-Modi konfigurieren.",
- "settings.error.endpointInvalid": "Der Endpunkt muss eine gültige HTTP-URL sein.",
- "settings.error.promptModeRequired": "Mindestens einen Prompt-Modus beibehalten.",
- "settings.help.appearance": "Hell, Dunkel oder die macOS-Einstellung wählen.",
- "settings.help.endpoint": "Vollständige OpenAI-kompatible /chat/completions-URL.",
- "settings.help.hotkey": "Zum Beispiel: ⌥Space, Option+Space, Cmd+Space.",
- "settings.help.openAIAPIKey": "Wird auf diesem Mac gespeichert und für Schreiben, Echtzeitdiktat, Übersetzung und Aussprache verwendet. Zum Entfernen das Feld leeren.",
- "settings.hotkey.pressKey": " Taste",
- "settings.hotkey.record": "Kurzbefehl aufnehmen",
- "settings.hotkey.recording": "Kurzbefehl drücken",
- "settings.mode.add": "Modus hinzufügen",
- "settings.mode.delete": "Modus löschen",
- "settings.mode.deleteConfirmMessage": "„%@“ löschen? Dies kann nicht rückgängig gemacht werden.",
- "settings.mode.deleteConfirmTitle": "Prompt-Modus löschen?",
- "settings.mode.dragToSort": "Zum Sortieren ziehen",
- "settings.mode.hidden": "Ausgeblendet",
- "settings.mode.moveDown": "Nach unten",
- "settings.mode.moveUp": "Nach oben",
- "settings.mode.newDescription": "Eigener Umwandlungsmodus",
- "settings.mode.newName": "Neuer Modus",
- "settings.mode.visible": "Sichtbar",
- "settings.mode.visibleInMenu": "Im Menü anzeigen",
- "settings.mode.visibleInMenuHelp": "Diesen Modus in der Modusauswahl anzeigen.",
- "settings.model.custom": "Benutzerdefiniert…",
- "settings.model.customized": "Eigenes Modell *",
- "settings.model.refreshing": "Modellliste wird aktualisiert…",
- "settings.permission.accessibility": "Bedienungshilfen",
- "settings.permission.openShort": "Einstellungen öffnen",
- "settings.privacy.clipboard": "• Zwischenablage wird nach dem Einfügen und konfigurierten erzwungenen Auslesen wiederhergestellt",
- "settings.privacy.keychain": "• API-Schlüssel werden auf diesem Mac gespeichert",
- "settings.privacy.provider": "• Text wird direkt an OpenAI gesendet",
- "settings.privacy.title": "Datenschutz & Sicherheit",
- "settings.provider.active": "Aktiv",
- "settings.provider.configured": "Konfiguriert",
- "settings.provider.notConfigured": "Nicht konfiguriert",
- "settings.provider.notLoaded": "Gespeicherte Schlüssel werden nicht angezeigt",
- "settings.provider.pendingKey": "Neuer Schlüssel bereit zum Speichern",
- "settings.provider.pendingSave": "Speichern ausstehend",
- "settings.provider.saved": "Gespeichert",
- "settings.provider.savedLocally": "Lokal gespeichert",
- "settings.quickStart.close": "Zurück oder schließen",
- "settings.quickStart.help": "Häufige Aktionen im Popover.",
- "settings.quickStart.open": "Inklet öffnen",
- "settings.quickStart.original": "Originaltext einfügen",
- "settings.quickStart.submit": "Umwandeln oder Ergebnis einfügen",
- "settings.quickStart.title": "Tastaturkurzbefehle",
- "settings.row.apiKey": "API-Schlüssel",
- "settings.row.appearance": "Erscheinungsbild",
- "settings.row.description": "Beschreibung",
- "settings.row.endpoint": "Endpunkt",
- "settings.row.model": "Modell",
- "settings.row.name": "Name",
- "settings.row.openAIAPIKey": "OpenAI-API-Schlüssel",
- "settings.row.provider": "Anbieter",
- "settings.row.systemPrompt": "Prompt",
- "settings.row.timeout": "Zeitlimit",
- "settings.section.about": "Über Inklet",
- "settings.section.selectionAssistant": "Auswahlassistent",
- "settings.section.writeAssistant": "Schreibassistent",
- "settings.systemPermissions.title": "Systemberechtigungen",
- "settings.version": "Version %@",
- "settings.voice.shortcut.disabled": "Deaktiviert",
- "settings.voice.shortcut.leftCommand": "Linke Command-Taste",
- "settings.voice.shortcut.leftOption": "Linke Option-Taste",
- "settings.voice.shortcut.rightCommand": "Rechte Command-Taste",
- "settings.voice.shortcut.rightOption": "Rechte Option-Taste",
- "setup.done": "Fertig",
- "setup.menubar.description": "Zum Öffnen auf das Inklet-Symbol neben der Uhr klicken.",
- "setup.menubar.title": "Inklet in der Menüleiste finden",
- "setup.shortcut.description": "Der Standardkurzbefehl ist %@. Bei einem Konflikt mit einer anderen App lässt er sich in den Einstellungen ändern.",
- "setup.shortcut.title": "Kurzbefehl verwenden",
- "setup.subtitle": "Inklet läuft in der Menüleiste. Erlauben Sie den Zugriff auf Bedienungshilfen, damit Inklet Text in die verwendete App einfügen kann.",
- "setup.title": "Inklet ist bereit",
- "setup.window.title": "Willkommen bei Inklet"
- ]
-
- private static let pt: [String: String] = [
- "app.menu.edit": "Editar",
- "app.menu.undo": "Desfazer",
- "app.menu.redo": "Refazer",
- "app.menu.cut": "Recortar",
- "app.menu.copy": "Copiar",
- "app.menu.paste": "Colar",
- "app.menu.pasteAndMatchStyle": "Colar e Combinar Estilo",
- "app.menu.delete": "Apagar",
- "app.menu.selectAll": "Selecionar Tudo",
- "app.menu.openPopover": "Abrir Inklet",
- "app.menu.settings": "Ajustes",
- "app.menu.about": "Sobre o Inklet",
- "app.menu.quit": "Sair",
- "app.menu.checkForUpdates": "Buscar atualizações…",
- "app.menu.checkingForUpdates": "Buscando atualizações…",
- "update.available.title": "Há uma atualização do Inklet disponível",
- "update.available.latestVersion": "Mais recente: %@ (compilação %@)",
- "update.available.currentVersion": "Atual: %@",
- "update.available.noNotes": "Veja a versão no GitHub para obter detalhes.",
- "update.action.viewOnGitHub": "Ver no GitHub",
- "update.action.later": "Mais tarde",
- "update.upToDate.title": "Inklet está atualizado",
- "update.upToDate.message": "Você está usando %@.",
- "update.error.title": "Não foi possível buscar atualizações",
- "update.error.message": "Tente novamente em instantes.",
- "update.action.retry": "Tentar novamente",
- "update.action.cancel": "Cancelar",
- "update.action.ok": "OK",
- "legacyMigration.notice.title": "Os dados antigos do Inklet não foram importados",
- "legacyMigration.notice.message": "Suas configurações e seu histórico anteriores continuam preservados. Você pode escolher a pasta Inklet Data correspondente para importá-los.",
- "legacyMigration.action.importOldData": "Importar dados…",
- "legacyMigration.panel.title": "Selecionar dados antigos do Inklet",
- "legacyMigration.panel.message": "Selecione a pasta Inklet Data correspondente para importar as configurações e o histórico preservados.",
- "legacyMigration.import.progress": "Importando dados…",
- "legacyMigration.import.invalidSelection": "A pasta selecionada não é a pasta de dados antigos correspondente a este aplicativo Inklet.",
- "legacyMigration.import.failed": "Não foi possível importar os dados antigos. Suas configurações e seu histórico continuam preservados.",
- "legacyMigration.import.partialFailure": "Não foi possível importar alguns dados antigos. Suas configurações e seu histórico continuam preservados.",
- "legacyMigration.import.relaunching": "O Inklet precisa ser reiniciado para concluir o carregamento dos dados importados.",
- "legacyMigration.import.relaunchProgress": "Reiniciando o Inklet…",
- "legacyMigration.import.relaunchFailed": "Não foi possível reiniciar o Inklet. Os dados importados estão prontos e serão carregados na próxima vez que você abrir o Inklet.",
- "legacyMigration.action.retryRelaunch": "Reiniciar o Inklet",
- "legacyMigration.action.quit": "Sair do Inklet",
- "legacyMigration.settings.help": "Importe suas configurações e seu histórico preservados da pasta Inklet Data correspondente.",
- "settings.section.history": "Histórico",
- "settings.description.history": "Revise resultados de escrita e seleção, além de resultados antigos de voz salvos localmente.",
- "settings.history.filter.all": "Tudo",
- "settings.history.source.write": "Escrita",
- "settings.history.source.voice": "Voz",
- "settings.history.source.selection": "Seleção",
- "settings.history.empty": "Ainda não há histórico salvo.",
- "settings.history.original": "Original",
- "settings.history.result": "Resultado",
- "settings.history.copyOriginal": "Copiar original",
- "settings.history.copyResult": "Copiar resultado",
- "settings.history.clear": "Limpar histórico",
- "settings.history.clearConfirmTitle": "Limpar histórico?",
- "settings.history.clearConfirmMessage": "Isso exclui deste Mac todos os registros de histórico salvos. Esta ação não pode ser desfeita.",
- "settings.history.cleared": "Histórico limpo.",
- "settings.history.error.loadFailed": "Não foi possível carregar o histórico.",
- "settings.history.error.clearFailed": "Não foi possível limpar o histórico.",
- "settings.privacy.history": "• O histórico bem-sucedido de escrita e seleção fica salvo localmente; o histórico antigo de voz continua disponível",
- "settings.group.writing": "Escrita",
- "settings.group.writing.help": "Configure o Writing Assistant e seu rascunho de origem editável.",
- "settings.group.dictation": "Ditado",
- "settings.group.dictation.help": "Segure o atalho enquanto fala para enviar o áudio do microfone à OpenAI em tempo real.",
- "settings.group.dictationAdvanced": "Ditado avançado",
- "settings.row.dictationShortcut": "Atalho ao segurar",
- "settings.help.dictationShortcut": "Funciona somente quando o editor de origem do Writing Assistant está ativo. Um toque curto não faz nada.",
- "settings.quickStart.voice.pressAndHold": "Segurar para entrada de voz",
- "settings.row.microphone": "Microfone",
- "settings.help.microphone": "Escolha a entrada de áudio usada para ditado em tempo real.",
- "settings.microphone.systemDefault": "Padrão do sistema",
- "settings.row.fallbackSpeechModel": "Modelo de recuperação",
- "settings.help.fallbackSpeechModel": "Modelo usado na única tentativa de recuperação após falha da conexão em tempo real.",
- "dictation.hint.hold": "Segure %@ para ditar",
- "dictation.status.connecting": "Conectando…",
- "dictation.status.listening": "Ouvindo… Solte para concluir",
- "dictation.status.recordingFallback": "Conexão perdida… Continue falando",
- "dictation.status.finalizing": "Finalizando transcrição…",
- "dictation.status.recovering": "Recuperando da gravação temporária…",
- "dictation.status.ready": "Ditado pronto",
- "dictation.accessibility.ready": "O ditado está pronto.",
- "dictation.accessibility.listening": "O ditado está ouvindo. Solte para concluir.",
- "dictation.accessibility.recordingFallback": "A conexão foi perdida. Continue falando para permitir a recuperação.",
- "dictation.accessibility.finalizing": "Finalizando a transcrição do ditado.",
- "dictation.accessibility.recovering": "Recuperando o ditado da gravação temporária.",
- "dictation.accessibility.completed": "Ditado concluído.",
- "dictation.accessibility.cancelled": "Ditado cancelado.",
- "dictation.accessibility.failed": "Falha no ditado.",
- "dictation.accessibility.sourceEditor": "Editor de origem da escrita",
- "dictation.undo.action": "Ditado",
- "dictation.error.missingAPIKey": "Adicione uma chave de API da OpenAI nos Ajustes para usar o ditado.",
- "dictation.error.microphonePermission": "O ditado exige permissão para usar o microfone.",
- "dictation.error.noAudioInputDevice": "Nenhum microfone ou dispositivo de entrada de áudio está disponível.",
- "dictation.error.recordingUnavailable": "Não foi possível iniciar a gravação de áudio.",
- "dictation.error.realtimeBufferOverflow": "O processamento do áudio em tempo real não acompanhou. Tente novamente.",
- "dictation.error.connection": "Falha na conexão de transcrição em tempo real.",
- "dictation.error.connectionTimeout": "A conexão de transcrição em tempo real expirou.",
- "dictation.error.finalTimeout": "A transcrição final em tempo real não chegou a tempo.",
- "dictation.error.fallback": "Não foi possível recuperar o ditado da gravação temporária.",
- "dictation.error.noSpeech": "Nenhuma fala foi reconhecida.",
- "settings.privacy.voice": "• O áudio do ditado em tempo real e o texto de pronúncia são enviados diretamente à OpenAI; gravações de recuperação são apagadas no fim da sessão",
- "settings.section.selectionActions": "Ações de seleção",
- "settings.description.selectionActions": "Gerencie ações automáticas para texto selecionado em outros apps.",
- "settings.row.selectionActionsEnabled": "Ativar ações de seleção",
- "settings.help.selectionActionsEnabled": "Mostra um pequeno menu após uma breve pausa ao selecionar texto.",
- "settings.row.forceSelectionMode": "Seleção forçada",
- "settings.help.forceSelectionMode": "Alternativa quando Acessibilidade não consegue ler o texto selecionado. A cópia pelo menu não simula entrada de teclado.",
- "settings.forceSelection.disabled": "Desativada",
- "settings.forceSelection.menuCopyOnly": "Só copiar pelo menu",
- "settings.forceSelection.menuCopyThenShortcut": "Menu Copiar, depois Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, depois menu Copiar",
- "settings.row.allowSimulatedCopyFallback": "Permitir Cmd+C simulado",
- "settings.help.allowSimulatedCopyFallback": "Envia Cmd+C ao app em primeiro plano quando a cópia pelo menu não está disponível. Pode interferir em jogos ou apps remotos.",
- "settings.row.translationLanguage": "Idioma de tradução",
- "settings.help.translationLanguage": "Idioma usado pela ação Traduzir do texto selecionado.",
- "settings.row.translationPrompt": "Prompt de tradução",
- "settings.help.translationPrompt": "Instruções para Traduzir texto selecionado. Use {targetLanguage} para o idioma escolhido.",
- "settings.translationPrompt.restoreDefault": "Restaurar padrão",
- "settings.row.aiPronunciation": "Voz de pronúncia com IA",
- "settings.help.aiPronunciation": "Voz usada por Pronunciar no texto selecionado. Usa OpenAI text-to-speech com sua OpenAI API key.",
- "settings.row.aiPronunciationSpeed": "Velocidade da pronúncia com IA",
- "settings.help.aiPronunciationSpeed": "Velocidade de reprodução usada para Pronunciar texto selecionado e pré-visualizar a voz.",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "Previsualizar voz",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "Seguir idioma da interface",
- "selection.action.translate": "Traduzir",
- "selection.action.pronounce": "Pronunciar",
- "selection.action.translating": "Traduzindo...",
- "selection.action.preparingPronunciation": "Preparando áudio...",
- "selection.action.playingPronunciation": "Reproduzindo...",
- "selection.action.pronounceOriginal": "Reproduzir original",
- "selection.action.pronounceTranslation": "Reproduzir traducao",
- "selection.action.audioLabel.original": "Orig.",
- "selection.action.audioLabel.translation": "Trad.",
- "selection.action.copyTranslation": "Copiar tradução",
- "selection.action.retry": "Tentar novamente",
- "selection.action.unsupportedTitle": "Texto selecionado indisponível",
- "selection.action.unsupportedMessage": "O app atual não expõe o texto selecionado ao Inklet.",
- "selection.action.missingOpenAIKey": "Adicione uma OpenAI API key nos Ajustes para usar pronúncia com IA.",
- "selection.action.translationFailed": "Falha na tradução.",
- "selection.action.pronunciationFailed": "Falha na pronúncia.",
- "about.tagline": "Transforme suas ideias em textos claros",
- "about.website": "Site",
- "about.privacyPolicy": "Política de privacidade",
- "about.support": "Suporte",
- "language.system": "Sistema",
- "settings.window.title": "Ajustes do Inklet",
- "settings.sidebar.preferences": "Preferências",
- "settings.sidebar.hint": "Salvo automaticamente · ⌘, Abrir",
- "settings.section.general": "Geral",
- "settings.section.providers": "Provedores",
- "settings.section.promptModes": "Modos de prompt",
- "settings.section.permissions": "Permissões",
- "settings.description.general": "Comportamento, atalho, idioma da interface e parâmetros de geração.",
- "settings.description.providers": "Escolha provedor LLM, modelo e API key.",
- "settings.description.promptModes": "Gerencie modos de conversão e prompts do sistema.",
- "settings.description.permissions": "Verifique a permissão do macOS necessária para inserir texto.",
- "settings.row.language": "Idioma da interface",
- "settings.help.language": "System segue o idioma do macOS.",
- "settings.row.hotkey": "Atalho",
- "settings.help.timeout": "Duração máxima da solicitação.",
- "settings.seconds": "%d s",
- "settings.help.provider": "Provedor atual.",
- "settings.help.apiKey": "Salva localmente neste Mac.",
- "settings.help.model.default": "Padrão: %@",
- "settings.mode.untitled": "Modo sem título",
- "settings.mode.pick": "Selecione um modo de prompt",
- "settings.help.name": "Nome mostrado no painel.",
- "settings.help.description": "O que este modo faz.",
- "settings.characters": "%d caracteres",
- "settings.permission.authorized": "Accessibility autorizado",
- "settings.permission.required": "Permissão Accessibility necessária",
- "settings.permission.description": "Clique em Abrir Ajustes, clique em +, escolha /Applications/Inklet.app e ative o Inklet.",
- "settings.permission.open": "Abrir Ajustes do Sistema",
- "settings.footer.pending": "As alterações são salvas automaticamente e se aplicam na próxima vez que o painel abrir.",
- "settings.save": "Salvar",
- "settings.saved": "Salvo",
- "settings.error.visibleModeRequired": "Mantenha pelo menos um modo visível.",
- "settings.error.modelRequired": "Model não pode estar vazio.",
- "settings.error.openAccessibility": "Não foi possível abrir Accessibility.",
- "settings.error.saveFailed": "Falha ao salvar: %@",
- "popover.input.placeholder": "Digite texto para transformar ou inserir",
- "popover.modeSearch.placeholder": "Buscar modos",
- "popover.modeSearch.empty": "Nenhum modo correspondente",
- "popover.modeSearch.select": "Selecionar",
- "popover.modeSearch.write": "Escrever",
- "popover.result.title": "Resultado",
- "popover.result.editable": "Editável antes de inserir",
- "popover.result.generatedWith": "Gerado com %@",
- "popover.mode.picker": "Modo",
- "popover.mode.backToModes": "Escolher modo",
- "popover.action.transform": "Transformar",
- "popover.action.regenerate": "Gerar novamente",
- "popover.action.insert": "Inserir",
- "popover.action.insertOriginal": "Inserir original",
- "popover.hint.transformInsert": "Transformar/Inserir",
- "popover.hint.original": "Original",
- "popover.hint.accessibility": "Atalhos: Enter transforma ou insere, Command Enter insere o original, Escape volta ou fecha",
- "popover.busy.inserting": "Inserindo...",
- "popover.busy.transforming": "Transformando...",
- "popover.error.emptyOriginal": "Digite texto para inserir.",
- "popover.error.missingTarget": "Não foi possível encontrar o app de destino.",
- "popover.error.missingAPIKey": "Configure a API Key de %@ nos Ajustes.",
- "insertion.error.accessibility": "Ative a permissão Accessibility antes de inserir texto.",
- "insertion.error.activation": "Não foi possível voltar ao app original. Tente novamente.",
- "insertion.error.pasteEvent": "Não foi possível enviar o atalho de colar.",
- "insertion.error.clipboardRestore": "Texto inserido, mas não foi possível restaurar a área de transferência.",
- "error.emptySource": "Digite texto para transformar.",
- "error.emptyResponse": "O modelo retornou uma resposta vazia.",
- "error.timeout": "A solicitação expirou. Tente novamente.",
- "error.networkConnectionLost": "A conexão de rede foi interrompida. Tente novamente.",
- "error.provider.urlInvalid": "A solicitação %@ falhou: URL inválida",
- "error.provider.httpUnknown": "A solicitação %@ falhou: HTTP unknown",
- "error.provider.prefix": "A solicitação %@ falhou: %@",
- "hotkey.error.unsupported": "Atalho não suportado “%@”. Suportados: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
- "hotkey.error.registrationFailed": "Falha ao registrar atalho (%d).",
- "prompt.custom.description": "Usa seu prompt personalizado",
- "appearance.dark": "Escuro",
- "appearance.light": "Claro",
- "appearance.system": "Sistema",
- "popover.hint.back": "Voltar",
- "popover.hint.close": "Fechar",
- "popover.hint.mode": "Modo",
- "popover.hint.newLine": "Nova linha",
- "popover.status.preview": "Prévia",
- "popover.status.ready": "Pronto",
- "prompt.chineseSummary.description": "Resume qualquer texto de forma concisa em chinês simplificado",
- "prompt.friendlyReply.description": "Reescreve como uma resposta natural e amigável",
- "prompt.improveWriting.description": "Melhora a escrita mantendo o idioma original",
- "prompt.makeConcise.description": "Encurta o texto mantendo o idioma original e os pontos principais",
- "prompt.professionalTone.description": "Reescreve com um tom mais claro e profissional",
- "prompt.simpleCorrectEnglish.description": "Reescreve ou traduz para um inglês simples e correto",
- "prompt.translateToEnglish.description": "Reescreve ou traduz para um inglês simples e correto",
- "settings.cancel": "Cancelar",
- "settings.description.about": "Atalhos de teclado, notas de privacidade e informações do app.",
- "settings.description.selectionAssistant": "Ferramentas de tradução e pronúncia para texto selecionado em outros apps.",
- "settings.description.writeAssistant": "Configure a escrita, o ditado, a geração e os modos de instruções.",
- "settings.error.endpointInvalid": "O endpoint deve ser um URL HTTP válido.",
- "settings.error.promptModeRequired": "Mantenha pelo menos um modo de instruções.",
- "settings.help.appearance": "Escolha Claro, Escuro ou seguir o macOS.",
- "settings.help.endpoint": "URL completo de /chat/completions compatível com OpenAI.",
- "settings.help.hotkey": "Por exemplo: ⌥Space, Option+Space, Cmd+Space.",
- "settings.help.openAIAPIKey": "Armazenada neste Mac e compartilhada entre escrita, ditado em tempo real, tradução e pronúncia. Esvazie o campo para removê-la.",
- "settings.hotkey.pressKey": " tecla",
- "settings.hotkey.record": "Gravar atalho",
- "settings.hotkey.recording": "Pressione o atalho",
- "settings.mode.add": "Adicionar modo",
- "settings.mode.delete": "Excluir modo",
- "settings.mode.deleteConfirmMessage": "Excluir “%@”? Esta ação não pode ser desfeita.",
- "settings.mode.deleteConfirmTitle": "Excluir modo de instruções?",
- "settings.mode.dragToSort": "Arraste para reordenar",
- "settings.mode.hidden": "Oculto",
- "settings.mode.moveDown": "Mover para baixo",
- "settings.mode.moveUp": "Mover para cima",
- "settings.mode.newDescription": "Modo de transformação personalizado",
- "settings.mode.newName": "Novo modo",
- "settings.mode.visible": "Visível",
- "settings.mode.visibleInMenu": "Mostrar no menu",
- "settings.mode.visibleInMenuHelp": "Mostra este modo no seletor de modos.",
- "settings.model.custom": "Personalizado…",
- "settings.model.customized": "Modelo personalizado *",
- "settings.model.refreshing": "Atualizando modelos…",
- "settings.permission.accessibility": "Acessibilidade",
- "settings.permission.openShort": "Abrir ajustes",
- "settings.privacy.clipboard": "• A área de transferência é restaurada após a inserção e a leitura por seleção forçada",
- "settings.privacy.keychain": "• As chaves de API são armazenadas neste Mac",
- "settings.privacy.provider": "• O texto é enviado diretamente à OpenAI",
- "settings.privacy.title": "Privacidade e segurança",
- "settings.provider.active": "Ativo",
- "settings.provider.configured": "Configurado",
- "settings.provider.notConfigured": "Não configurado",
- "settings.provider.notLoaded": "As chaves salvas não são exibidas",
- "settings.provider.pendingKey": "Nova chave pronta para salvar",
- "settings.provider.pendingSave": "Aguardando salvamento",
- "settings.provider.saved": "Salvo",
- "settings.provider.savedLocally": "Salvo localmente",
- "settings.quickStart.close": "Voltar ou fechar",
- "settings.quickStart.help": "Ações comuns na janela pop-up.",
- "settings.quickStart.open": "Abrir Inklet",
- "settings.quickStart.original": "Inserir texto original",
- "settings.quickStart.submit": "Transformar ou inserir o resultado",
- "settings.quickStart.title": "Atalhos de teclado",
- "settings.row.apiKey": "Chave de API",
- "settings.row.appearance": "Aparência",
- "settings.row.description": "Descrição",
- "settings.row.endpoint": "Endpoint",
- "settings.row.model": "Modelo",
- "settings.row.name": "Nome",
- "settings.row.openAIAPIKey": "Chave de API OpenAI",
- "settings.row.provider": "Provedor",
- "settings.row.systemPrompt": "Instruções",
- "settings.row.timeout": "Tempo limite",
- "settings.section.about": "Sobre",
- "settings.section.selectionAssistant": "Assistente de seleção",
- "settings.section.writeAssistant": "Assistente de escrita",
- "settings.systemPermissions.title": "Permissões do sistema",
- "settings.version": "Versão %@",
- "settings.voice.shortcut.disabled": "Desativado",
- "settings.voice.shortcut.leftCommand": "Command esquerdo",
- "settings.voice.shortcut.leftOption": "Option esquerdo",
- "settings.voice.shortcut.rightCommand": "Command direito",
- "settings.voice.shortcut.rightOption": "Option direito",
- "setup.done": "Concluído",
- "setup.menubar.description": "Clique no ícone do Inklet perto do relógio sempre que quiser abri-lo.",
- "setup.menubar.title": "Encontre o Inklet na barra de menus",
- "setup.shortcut.description": "O atalho padrão é %@. Se houver conflito com outro app, altere-o nos Ajustes.",
- "setup.shortcut.title": "Use o atalho",
- "setup.subtitle": "O Inklet está na barra de menus. Conceda a permissão de Acessibilidade para que ele possa inserir texto no app em uso.",
- "setup.title": "O Inklet está pronto",
- "setup.window.title": "Boas-vindas ao Inklet"
- ]
-
- private static let it: [String: String] = [
- "app.menu.edit": "Modifica",
- "app.menu.undo": "Annulla",
- "app.menu.redo": "Ripristina",
- "app.menu.cut": "Taglia",
- "app.menu.copy": "Copia",
- "app.menu.paste": "Incolla",
- "app.menu.pasteAndMatchStyle": "Incolla e adatta lo stile",
- "app.menu.delete": "Elimina",
- "app.menu.selectAll": "Seleziona tutto",
- "app.menu.openPopover": "Apri Inklet",
- "app.menu.settings": "Impostazioni",
- "app.menu.about": "Informazioni su Inklet",
- "app.menu.quit": "Esci",
- "app.menu.checkForUpdates": "Cerca aggiornamenti…",
- "app.menu.checkingForUpdates": "Ricerca aggiornamenti…",
- "update.available.title": "È disponibile un aggiornamento di Inklet",
- "update.available.latestVersion": "Più recente: %@ (build %@)",
- "update.available.currentVersion": "Attuale: %@",
- "update.available.noNotes": "Visualizza la release su GitHub per i dettagli.",
- "update.action.viewOnGitHub": "Visualizza su GitHub",
- "update.action.later": "Più tardi",
- "update.upToDate.title": "Inklet è aggiornato",
- "update.upToDate.message": "Stai usando %@.",
- "update.error.title": "Impossibile cercare aggiornamenti",
- "update.error.message": "Riprova tra poco.",
- "update.action.retry": "Riprova",
- "update.action.cancel": "Annulla",
- "update.action.ok": "OK",
- "legacyMigration.notice.title": "I vecchi dati di Inklet non sono stati importati",
- "legacyMigration.notice.message": "Le impostazioni e la cronologia precedenti sono ancora conservate. Puoi scegliere la cartella Inklet Data corrispondente per importarle.",
- "legacyMigration.action.importOldData": "Importa vecchi dati…",
- "legacyMigration.panel.title": "Seleziona i vecchi dati di Inklet",
- "legacyMigration.panel.message": "Seleziona la cartella Inklet Data corrispondente per importare le impostazioni e la cronologia conservate.",
- "legacyMigration.import.progress": "Importazione in corso",
- "legacyMigration.import.invalidSelection": "La cartella selezionata non è la cartella dei vecchi dati corrispondente a questa applicazione Inklet.",
- "legacyMigration.import.failed": "Impossibile importare i vecchi dati. Le impostazioni e la cronologia sono ancora conservate.",
- "legacyMigration.import.partialFailure": "Non è stato possibile importare alcuni vecchi dati. Le impostazioni e la cronologia sono ancora conservate.",
- "legacyMigration.import.relaunching": "Inklet deve essere riavviato per completare il caricamento dei dati importati.",
- "legacyMigration.import.relaunchProgress": "Riavvio di Inklet…",
- "legacyMigration.import.relaunchFailed": "Non è stato possibile riavviare Inklet. I dati importati sono pronti e verranno caricati alla prossima apertura di Inklet.",
- "legacyMigration.action.retryRelaunch": "Riavvia Inklet",
- "legacyMigration.action.quit": "Esci da Inklet",
- "legacyMigration.settings.help": "Importa le impostazioni e la cronologia conservate dalla cartella Inklet Data corrispondente.",
- "settings.section.history": "Cronologia",
- "settings.description.history": "Rivedi i risultati di scrittura e selezione, oltre ai vecchi risultati vocali salvati localmente.",
- "settings.history.filter.all": "Tutto",
- "settings.history.source.write": "Scrittura",
- "settings.history.source.voice": "Voce",
- "settings.history.source.selection": "Selezione",
- "settings.history.empty": "Nessuna cronologia salvata.",
- "settings.history.original": "Originale",
- "settings.history.result": "Risultato",
- "settings.history.copyOriginal": "Copia originale",
- "settings.history.copyResult": "Copia risultato",
- "settings.history.clear": "Cancella cronologia",
- "settings.history.clearConfirmTitle": "Cancellare la cronologia?",
- "settings.history.clearConfirmMessage": "Questo elimina da questo Mac tutti i record salvati della cronologia. L’azione non può essere annullata.",
- "settings.history.cleared": "Cronologia cancellata.",
- "settings.history.error.loadFailed": "Impossibile caricare la cronologia.",
- "settings.history.error.clearFailed": "Impossibile cancellare la cronologia.",
- "settings.privacy.history": "• La cronologia riuscita di scrittura e selezione viene salvata localmente; la vecchia cronologia vocale resta consultabile",
- "settings.group.writing": "Scrittura",
- "settings.group.writing.help": "Configura Writing Assistant e la relativa bozza sorgente modificabile.",
- "settings.group.dictation": "Dettatura",
- "settings.group.dictation.help": "Tieni premuta la scorciatoia mentre parli per inviare l’audio del microfono a OpenAI in tempo reale.",
- "settings.group.dictationAdvanced": "Dettatura avanzata",
- "settings.row.dictationShortcut": "Scorciatoia da tenere premuta",
- "settings.help.dictationShortcut": "Funziona solo quando l’editor sorgente di Writing Assistant è attivo. Una pressione breve non esegue alcuna azione.",
- "settings.quickStart.voice.pressAndHold": "Tieni premuto per input vocale",
- "settings.row.microphone": "Microfono",
- "settings.help.microphone": "Scegli l’ingresso audio usato per la dettatura in tempo reale.",
- "settings.microphone.systemDefault": "Predefinito di sistema",
- "settings.row.fallbackSpeechModel": "Modello di recupero",
- "settings.help.fallbackSpeechModel": "Modello usato per l’unico tentativo di recupero dopo un errore della connessione in tempo reale.",
- "dictation.hint.hold": "Tieni premuto %@ per dettare",
- "dictation.status.connecting": "Connessione…",
- "dictation.status.listening": "In ascolto… Rilascia per terminare",
- "dictation.status.recordingFallback": "Connessione persa… Continua a parlare",
- "dictation.status.finalizing": "Completamento della trascrizione…",
- "dictation.status.recovering": "Recupero dalla registrazione temporanea…",
- "dictation.status.ready": "Dettatura pronta",
- "dictation.accessibility.ready": "La dettatura è pronta.",
- "dictation.accessibility.listening": "La dettatura è in ascolto. Rilascia per terminare.",
- "dictation.accessibility.recordingFallback": "La connessione è stata persa. Continua a parlare per consentire il recupero.",
- "dictation.accessibility.finalizing": "Completamento della trascrizione della dettatura.",
- "dictation.accessibility.recovering": "Recupero della dettatura dalla registrazione temporanea.",
- "dictation.accessibility.completed": "Dettatura completata.",
- "dictation.accessibility.cancelled": "Dettatura annullata.",
- "dictation.accessibility.failed": "Dettatura non riuscita.",
- "dictation.accessibility.sourceEditor": "Editor sorgente di scrittura",
- "dictation.undo.action": "Dettatura",
- "dictation.error.missingAPIKey": "Aggiungi una chiave API OpenAI nelle Impostazioni per usare la dettatura.",
- "dictation.error.microphonePermission": "La dettatura richiede l’autorizzazione del microfono.",
- "dictation.error.noAudioInputDevice": "Non è disponibile alcun microfono o dispositivo di ingresso audio.",
- "dictation.error.recordingUnavailable": "Impossibile avviare la registrazione audio.",
- "dictation.error.realtimeBufferOverflow": "L’elaborazione dell’audio in tempo reale non è riuscita a tenere il passo. Riprova.",
- "dictation.error.connection": "La connessione per la trascrizione in tempo reale non è riuscita.",
- "dictation.error.connectionTimeout": "La connessione per la trascrizione in tempo reale è scaduta.",
- "dictation.error.finalTimeout": "La trascrizione finale in tempo reale non è arrivata in tempo.",
- "dictation.error.fallback": "Impossibile recuperare la dettatura dalla registrazione temporanea.",
- "dictation.error.noSpeech": "Non è stato riconosciuto alcun parlato.",
- "settings.privacy.voice": "• L’audio della dettatura in tempo reale e il testo di pronuncia vengono inviati direttamente a OpenAI; le registrazioni di recupero vengono eliminate al termine della sessione",
- "settings.section.selectionActions": "Azioni di selezione",
- "settings.description.selectionActions": "Gestisci azioni automatiche per il testo selezionato in altre app.",
- "settings.row.selectionActionsEnabled": "Abilita azioni di selezione",
- "settings.help.selectionActionsEnabled": "Mostra un piccolo menu dopo una breve pausa sul testo selezionato.",
- "settings.row.forceSelectionMode": "Selezione forzata",
- "settings.help.forceSelectionMode": "Alternativa quando Accessibilità non riesce a leggere il testo selezionato. La copia dal menu non simula input da tastiera.",
- "settings.forceSelection.disabled": "Disattivata",
- "settings.forceSelection.menuCopyOnly": "Solo copia dal menu",
- "settings.forceSelection.menuCopyThenShortcut": "Menu Copia, poi Cmd+C",
- "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, poi menu Copia",
- "settings.row.allowSimulatedCopyFallback": "Consenti Cmd+C simulato",
- "settings.help.allowSimulatedCopyFallback": "Invia Cmd+C all’app in primo piano quando Copia dal menu non è disponibile. Può interferire con giochi o app remote.",
- "settings.row.translationLanguage": "Lingua di traduzione",
- "settings.help.translationLanguage": "Lingua usata dall'azione Traduci sul testo selezionato.",
- "settings.row.translationPrompt": "Prompt di traduzione",
- "settings.help.translationPrompt": "Istruzioni per Traduci sul testo selezionato. Usa {targetLanguage} per la lingua scelta.",
- "settings.translationPrompt.restoreDefault": "Ripristina predefinito",
- "settings.row.aiPronunciation": "Voce pronuncia IA",
- "settings.help.aiPronunciation": "Voce usata da Pronuncia per il testo selezionato. Usa OpenAI text-to-speech con la tua OpenAI API key.",
- "settings.row.aiPronunciationSpeed": "Velocita pronuncia IA",
- "settings.help.aiPronunciationSpeed": "Velocita di riproduzione usata per Pronuncia del testo selezionato e anteprima voce.",
- "settings.aiPronunciation.speedValue": "%.2fx",
- "settings.aiPronunciation.preview": "Anteprima voce",
- "settings.aiPronunciation.openAI": "OpenAI TTS",
- "selection.language.followInterface": "Segui lingua dell'interfaccia",
- "selection.action.translate": "Traduci",
- "selection.action.pronounce": "Pronuncia",
- "selection.action.translating": "Traduzione...",
- "selection.action.preparingPronunciation": "Preparazione audio...",
- "selection.action.playingPronunciation": "Riproduzione...",
- "selection.action.pronounceOriginal": "Riproduci originale",
- "selection.action.pronounceTranslation": "Riproduci traduzione",
- "selection.action.audioLabel.original": "Orig.",
- "selection.action.audioLabel.translation": "Trad.",
- "selection.action.copyTranslation": "Copia traduzione",
- "selection.action.retry": "Riprova",
- "selection.action.unsupportedTitle": "Testo selezionato non disponibile",
- "selection.action.unsupportedMessage": "L'app attuale non espone il testo selezionato a Inklet.",
- "selection.action.missingOpenAIKey": "Aggiungi una OpenAI API key nelle Impostazioni per usare la pronuncia IA.",
- "selection.action.translationFailed": "Traduzione non riuscita.",
- "selection.action.pronunciationFailed": "Pronuncia non riuscita.",
- "about.tagline": "Trasforma le tue idee in testi chiari",
- "about.website": "Sito web",
- "about.privacyPolicy": "Informativa sulla privacy",
- "about.support": "Supporto",
- "language.system": "Sistema",
- "settings.window.title": "Impostazioni Inklet",
- "settings.sidebar.preferences": "Preferenze",
- "settings.sidebar.hint": "Salvataggio automatico · ⌘, Apri",
- "settings.section.general": "Generale",
- "settings.section.providers": "Provider",
- "settings.section.promptModes": "Modalità prompt",
- "settings.section.permissions": "Permessi",
- "settings.description.general": "Comportamento, scorciatoia, lingua dell’interfaccia e parametri di generazione.",
- "settings.description.providers": "Scegli provider LLM, modello e API key.",
- "settings.description.promptModes": "Gestisci modalità di conversione e prompt di sistema.",
- "settings.description.permissions": "Controlla il permesso macOS necessario per inserire testo.",
- "settings.row.language": "Lingua interfaccia",
- "settings.help.language": "System segue la lingua di macOS.",
- "settings.row.hotkey": "Scorciatoia",
- "settings.help.timeout": "Durata massima della richiesta.",
- "settings.seconds": "%d s",
- "settings.help.provider": "Provider attuale.",
- "settings.help.apiKey": "Salvata localmente su questo Mac.",
- "settings.help.model.default": "Predefinito: %@",
- "settings.mode.untitled": "Modalità senza titolo",
- "settings.mode.pick": "Seleziona una modalità prompt",
- "settings.help.name": "Nome mostrato nel pannello.",
- "settings.help.description": "Cosa fa questa modalità.",
- "settings.characters": "%d caratteri",
- "settings.permission.authorized": "Accessibility autorizzato",
- "settings.permission.required": "Permesso Accessibility richiesto",
- "settings.permission.description": "Fai clic su Apri Impostazioni, fai clic su +, scegli /Applications/Inklet.app e abilita Inklet.",
- "settings.permission.open": "Apri Impostazioni di Sistema",
- "settings.footer.pending": "Le modifiche vengono salvate automaticamente e si applicano alla prossima apertura del pannello.",
- "settings.save": "Salva",
- "settings.saved": "Salvato",
- "settings.error.visibleModeRequired": "Mantieni almeno una modalità visibile.",
- "settings.error.modelRequired": "Model non può essere vuoto.",
- "settings.error.openAccessibility": "Impossibile aprire Accessibility.",
- "settings.error.saveFailed": "Salvataggio non riuscito: %@",
- "popover.input.placeholder": "Inserisci testo da trasformare o inserire",
- "popover.modeSearch.placeholder": "Cerca modalità",
- "popover.modeSearch.empty": "Nessuna modalità corrispondente",
- "popover.modeSearch.select": "Seleziona",
- "popover.modeSearch.write": "Scrivi",
- "popover.result.title": "Risultato",
- "popover.result.editable": "Modificabile prima dell’inserimento",
- "popover.result.generatedWith": "Generato con %@",
- "popover.mode.picker": "Modalità",
- "popover.mode.backToModes": "Scegli modalità",
- "popover.action.transform": "Trasforma",
- "popover.action.regenerate": "Rigenera",
- "popover.action.insert": "Inserisci",
- "popover.action.insertOriginal": "Inserisci originale",
- "popover.hint.transformInsert": "Trasforma/Inserisci",
- "popover.hint.original": "Originale",
- "popover.hint.accessibility": "Scorciatoie: Enter trasforma o inserisce, Command Enter inserisce l’originale, Escape torna indietro o chiude",
- "popover.busy.inserting": "Inserimento...",
- "popover.busy.transforming": "Trasformazione...",
- "popover.error.emptyOriginal": "Inserisci testo da inserire.",
- "popover.error.missingTarget": "Impossibile trovare l’app di destinazione.",
- "popover.error.missingAPIKey": "Configura la API Key di %@ nelle Impostazioni.",
- "insertion.error.accessibility": "Abilita il permesso Accessibility prima di inserire testo.",
- "insertion.error.activation": "Impossibile tornare all’app originale. Riprova.",
- "insertion.error.pasteEvent": "Impossibile inviare la scorciatoia Incolla.",
- "insertion.error.clipboardRestore": "Testo inserito, ma impossibile ripristinare gli appunti.",
- "error.emptySource": "Inserisci testo da trasformare.",
- "error.emptyResponse": "Il modello ha restituito una risposta vuota.",
- "error.timeout": "La richiesta è scaduta. Riprova.",
- "error.networkConnectionLost": "La connessione di rete è stata interrotta. Riprova.",
- "error.provider.urlInvalid": "Richiesta %@ non riuscita: URL non valido",
- "error.provider.httpUnknown": "Richiesta %@ non riuscita: HTTP unknown",
- "error.provider.prefix": "Richiesta %@ non riuscita: %@",
- "hotkey.error.unsupported": "Scorciatoia non supportata “%@”. Supportate: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
- "hotkey.error.registrationFailed": "Registrazione scorciatoia non riuscita (%d).",
- "prompt.custom.description": "Usa il tuo prompt personalizzato",
- "appearance.dark": "Scuro",
- "appearance.light": "Chiaro",
- "appearance.system": "Sistema",
- "popover.hint.back": "Indietro",
- "popover.hint.close": "Chiudi",
- "popover.hint.mode": "Modalità",
- "popover.hint.newLine": "Nuova riga",
- "popover.status.preview": "Anteprima",
- "popover.status.ready": "Pronto",
- "prompt.chineseSummary.description": "Riassumi qualsiasi testo in cinese semplificato in modo conciso",
- "prompt.friendlyReply.description": "Riscrivi come una risposta naturale e cordiale",
- "prompt.improveWriting.description": "Migliora la scrittura mantenendo la lingua originale",
- "prompt.makeConcise.description": "Abbrevia il testo mantenendo la lingua originale e i punti chiave",
- "prompt.professionalTone.description": "Riscrivi con un tono più chiaro e professionale",
- "prompt.simpleCorrectEnglish.description": "Riscrivi o traduci in un inglese semplice e corretto",
- "prompt.translateToEnglish.description": "Riscrivi o traduci in un inglese semplice e corretto",
- "settings.cancel": "Annulla",
- "settings.description.about": "Scorciatoie da tastiera, privacy e informazioni sull’app.",
- "settings.description.selectionAssistant": "Strumenti di traduzione e pronuncia per il testo selezionato in altre app.",
- "settings.description.writeAssistant": "Configura scrittura, dettatura, generazione e modalità dei prompt.",
- "settings.error.endpointInvalid": "L’endpoint deve essere un URL HTTP valido.",
- "settings.error.promptModeRequired": "Mantieni almeno una modalità di prompt.",
- "settings.help.appearance": "Scegli Chiaro, Scuro o segui macOS.",
- "settings.help.endpoint": "URL completo di /chat/completions compatibile con OpenAI.",
- "settings.help.hotkey": "Ad esempio: ⌥Space, Option+Space, Cmd+Space.",
- "settings.help.openAIAPIKey": "Memorizzata su questo Mac e condivisa tra scrittura, dettatura in tempo reale, traduzione e pronuncia. Svuota il campo per rimuoverla.",
- "settings.hotkey.pressKey": " tasto",
- "settings.hotkey.record": "Registra scorciatoia",
- "settings.hotkey.recording": "Premi la scorciatoia",
- "settings.mode.add": "Aggiungi modalità",
- "settings.mode.delete": "Elimina modalità",
- "settings.mode.deleteConfirmMessage": "Eliminare “%@”? Questa azione non può essere annullata.",
- "settings.mode.deleteConfirmTitle": "Eliminare la modalità di prompt?",
- "settings.mode.dragToSort": "Trascina per riordinare",
- "settings.mode.hidden": "Nascosto",
- "settings.mode.moveDown": "Sposta giù",
- "settings.mode.moveUp": "Sposta su",
- "settings.mode.newDescription": "Modalità di trasformazione personalizzata",
- "settings.mode.newName": "Nuova modalità",
- "settings.mode.visible": "Visibile",
- "settings.mode.visibleInMenu": "Mostra nel menu",
- "settings.mode.visibleInMenuHelp": "Mostra questa modalità nel selettore.",
- "settings.model.custom": "Personalizzato…",
- "settings.model.customized": "Modello personalizzato *",
- "settings.model.refreshing": "Aggiornamento modelli…",
- "settings.permission.accessibility": "Accessibilità",
- "settings.permission.openShort": "Apri impostazioni",
- "settings.privacy.clipboard": "• Gli appunti vengono ripristinati dopo l’inserimento e la lettura tramite selezione forzata",
- "settings.privacy.keychain": "• Le chiavi API sono memorizzate su questo Mac",
- "settings.privacy.provider": "• Il testo viene inviato direttamente a OpenAI",
- "settings.privacy.title": "Privacy e sicurezza",
- "settings.provider.active": "Attivo",
- "settings.provider.configured": "Configurato",
- "settings.provider.notConfigured": "Non configurato",
- "settings.provider.notLoaded": "Le chiavi salvate non vengono mostrate",
- "settings.provider.pendingKey": "Nuova chiave pronta per il salvataggio",
- "settings.provider.pendingSave": "In attesa di salvataggio",
- "settings.provider.saved": "Salvato",
- "settings.provider.savedLocally": "Salvato localmente",
- "settings.quickStart.close": "Torna indietro o chiudi",
- "settings.quickStart.help": "Azioni comuni nel popover.",
- "settings.quickStart.open": "Apri Inklet",
- "settings.quickStart.original": "Inserisci testo originale",
- "settings.quickStart.submit": "Trasforma o inserisci il risultato",
- "settings.quickStart.title": "Scorciatoie da tastiera",
- "settings.row.apiKey": "Chiave API",
- "settings.row.appearance": "Aspetto",
- "settings.row.description": "Descrizione",
- "settings.row.endpoint": "Endpoint",
- "settings.row.model": "Modello",
- "settings.row.name": "Nome",
- "settings.row.openAIAPIKey": "Chiave API OpenAI",
- "settings.row.provider": "Fornitore",
- "settings.row.systemPrompt": "Prompt",
- "settings.row.timeout": "Tempo limite",
- "settings.section.about": "Informazioni",
- "settings.section.selectionAssistant": "Assistente di selezione",
- "settings.section.writeAssistant": "Assistente di scrittura",
- "settings.systemPermissions.title": "Permessi di sistema",
- "settings.version": "Versione %@",
- "settings.voice.shortcut.disabled": "Disattivato",
- "settings.voice.shortcut.leftCommand": "Command sinistro",
- "settings.voice.shortcut.leftOption": "Option sinistro",
- "settings.voice.shortcut.rightCommand": "Command destro",
- "settings.voice.shortcut.rightOption": "Option destro",
- "setup.done": "Fine",
- "setup.menubar.description": "Fai clic sull’icona di Inklet accanto all’orologio per aprirlo quando vuoi.",
- "setup.menubar.title": "Trova Inklet nella barra dei menu",
- "setup.shortcut.description": "La scorciatoia predefinita è %@. Se è in conflitto con un’altra app, cambiala nelle Impostazioni.",
- "setup.shortcut.title": "Usa la scorciatoia",
- "setup.subtitle": "Inklet è nella barra dei menu. Concedi il permesso di Accessibilità per inserire testo nell’app che stai usando.",
- "setup.title": "Inklet è pronto",
- "setup.window.title": "Benvenuto in Inklet"
- ]
}
extension Notification.Name {
diff --git a/Sources/InkletApp/Localization/L10n+de.swift b/Sources/InkletApp/Localization/L10n+de.swift
new file mode 100644
index 0000000..2de09d8
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+de.swift
@@ -0,0 +1,317 @@
+// German interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let de: [String: String] = [
+ "app.menu.edit": "Bearbeiten",
+ "app.menu.undo": "Widerrufen",
+ "app.menu.redo": "Wiederholen",
+ "app.menu.cut": "Ausschneiden",
+ "app.menu.copy": "Kopieren",
+ "app.menu.paste": "Einsetzen",
+ "app.menu.pasteAndMatchStyle": "Einsetzen und Stil anpassen",
+ "app.menu.delete": "Löschen",
+ "app.menu.selectAll": "Alles auswählen",
+ "app.menu.openPopover": "Inklet öffnen",
+ "app.menu.settings": "Einstellungen",
+ "app.menu.about": "Über Inklet",
+ "app.menu.quit": "Beenden",
+ "app.menu.checkForUpdates": "Nach Updates suchen…",
+ "app.menu.checkingForUpdates": "Updates werden gesucht…",
+ "update.available.title": "Ein Inklet-Update ist verfügbar",
+ "update.available.latestVersion": "Neueste: %@ (Build %@)",
+ "update.available.currentVersion": "Aktuell: %@",
+ "update.available.noNotes": "Details finden Sie auf GitHub.",
+ "update.action.viewOnGitHub": "Auf GitHub anzeigen",
+ "update.action.later": "Später",
+ "update.upToDate.title": "Inklet ist auf dem neuesten Stand",
+ "update.upToDate.message": "Sie verwenden %@.",
+ "update.error.title": "Updates konnten nicht überprüft werden",
+ "update.error.message": "Versuchen Sie es in Kürze erneut.",
+ "update.action.retry": "Erneut versuchen",
+ "update.action.cancel": "Abbrechen",
+ "update.action.ok": "OK",
+ "legacyMigration.notice.title": "Alte Inklet-Daten wurden nicht importiert",
+ "legacyMigration.notice.message": "Ihre bisherigen Einstellungen und Ihr Verlauf sind weiterhin erhalten. Sie können den passenden Ordner „Inklet Data“ auswählen, um sie zu importieren.",
+ "legacyMigration.action.importOldData": "Altdaten importieren",
+ "legacyMigration.panel.title": "Alte Inklet-Daten auswählen",
+ "legacyMigration.panel.message": "Wählen Sie den passenden Ordner „Inklet Data“, um die erhaltenen Einstellungen und den Verlauf zu importieren.",
+ "legacyMigration.import.progress": "Datenimport läuft…",
+ "legacyMigration.import.invalidSelection": "Der ausgewählte Ordner ist nicht der zu dieser Inklet-App gehörende alte Datenordner.",
+ "legacyMigration.import.failed": "Die alten Daten konnten nicht importiert werden. Ihre Einstellungen und Ihr Verlauf sind weiterhin erhalten.",
+ "legacyMigration.import.partialFailure": "Einige alte Daten konnten nicht importiert werden. Ihre Einstellungen und Ihr Verlauf sind weiterhin erhalten.",
+ "legacyMigration.import.relaunching": "Inklet muss neu gestartet werden, um die importierten Daten vollständig zu laden.",
+ "legacyMigration.import.relaunchProgress": "Inklet startet neu…",
+ "legacyMigration.import.relaunchFailed": "Inklet konnte nicht neu gestartet werden. Die importierten Daten sind bereit und werden beim nächsten Öffnen von Inklet geladen.",
+ "legacyMigration.action.retryRelaunch": "Inklet neu starten",
+ "legacyMigration.action.quit": "Inklet beenden",
+ "legacyMigration.settings.help": "Importieren Sie Ihre erhaltenen Einstellungen und Ihren Verlauf aus dem passenden Ordner „Inklet Data“.",
+ "settings.section.history": "Verlauf",
+ "settings.description.history": "Lokal gespeicherte Schreib- und Auswahlergebnisse sowie frühere Sprachergebnisse anzeigen.",
+ "settings.history.filter.all": "Alle",
+ "settings.history.source.write": "Schreiben",
+ "settings.history.source.voice": "Sprache",
+ "settings.history.source.selection": "Auswahl",
+ "settings.history.empty": "Noch kein gespeicherter Verlauf.",
+ "settings.history.original": "Original",
+ "settings.history.result": "Ergebnis",
+ "settings.history.copyOriginal": "Original kopieren",
+ "settings.history.copyResult": "Ergebnis kopieren",
+ "settings.history.clear": "Verlauf löschen",
+ "settings.history.clearConfirmTitle": "Verlauf löschen?",
+ "settings.history.clearConfirmMessage": "Alle gespeicherten Verlaufseinträge werden von diesem Mac gelöscht. Dies kann nicht rückgängig gemacht werden.",
+ "settings.history.cleared": "Verlauf gelöscht.",
+ "settings.history.error.loadFailed": "Verlauf konnte nicht geladen werden.",
+ "settings.history.error.clearFailed": "Verlauf konnte nicht gelöscht werden.",
+ "settings.privacy.history": "• Erfolgreicher Schreib- und Auswahlverlauf wird lokal gespeichert; ältere Spracheinträge bleiben lesbar",
+ "settings.group.writing": "Schreiben",
+ "settings.group.writing.help": "Writing Assistant und den bearbeitbaren Quellentwurf konfigurieren.",
+ "settings.group.dictation": "Diktat",
+ "settings.group.dictation.help": "Halten Sie beim Sprechen das Kürzel gedrückt, um Mikrofon-Audio in Echtzeit an OpenAI zu senden.",
+ "settings.group.dictationAdvanced": "Erweitertes Diktat",
+ "settings.row.dictationShortcut": "Haltekürzel",
+ "settings.help.dictationShortcut": "Funktioniert nur, wenn der Quelleditor von Writing Assistant aktiv ist. Ein kurzer Tastendruck bewirkt nichts.",
+ "settings.quickStart.voice.pressAndHold": "Für Spracheingabe halten",
+ "settings.row.microphone": "Mikrofon",
+ "settings.help.microphone": "Wählen Sie den Audioeingang für das Echtzeitdiktat.",
+ "settings.microphone.systemDefault": "Systemstandard",
+ "settings.row.fallbackSpeechModel": "Wiederherstellungsmodell",
+ "settings.help.fallbackSpeechModel": "Modell für den einmaligen Wiederherstellungsversuch nach Ausfall der Echtzeitverbindung.",
+ "dictation.hint.hold": "%@ halten, um zu diktieren",
+ "dictation.status.connecting": "Verbindung wird hergestellt…",
+ "dictation.status.listening": "Diktat läuft… Zum Beenden loslassen",
+ "dictation.status.recordingFallback": "Verbindung verloren… Sprechen Sie weiter",
+ "dictation.status.finalizing": "Transkription wird abgeschlossen…",
+ "dictation.status.recovering": "Wiederherstellung aus der temporären Aufnahme…",
+ "dictation.status.ready": "Diktat bereit",
+ "dictation.accessibility.ready": "Das Diktat ist bereit.",
+ "dictation.accessibility.listening": "Das Diktat hört zu. Zum Beenden loslassen.",
+ "dictation.accessibility.recordingFallback": "Die Verbindung wurde getrennt. Sprechen Sie für die Wiederherstellung weiter.",
+ "dictation.accessibility.finalizing": "Die Diktattranskription wird abgeschlossen.",
+ "dictation.accessibility.recovering": "Das Diktat wird aus der temporären Aufnahme wiederhergestellt.",
+ "dictation.accessibility.completed": "Diktat abgeschlossen.",
+ "dictation.accessibility.cancelled": "Diktat abgebrochen.",
+ "dictation.accessibility.failed": "Diktat fehlgeschlagen.",
+ "dictation.accessibility.sourceEditor": "Schreib-Quelleditor",
+ "dictation.undo.action": "Diktat",
+ "dictation.error.missingAPIKey": "Fügen Sie in den Einstellungen einen OpenAI API-Schlüssel hinzu, um Diktat zu verwenden.",
+ "dictation.error.microphonePermission": "Für Diktat ist die Mikrofonberechtigung erforderlich.",
+ "dictation.error.noAudioInputDevice": "Kein Mikrofon oder Audioeingabegerät verfügbar.",
+ "dictation.error.recordingUnavailable": "Die Audioaufnahme konnte nicht gestartet werden.",
+ "dictation.error.realtimeBufferOverflow": "Die Echtzeit-Audioverarbeitung konnte nicht Schritt halten. Versuchen Sie es erneut.",
+ "dictation.error.connection": "Die Echtzeit-Transkriptionsverbindung ist fehlgeschlagen.",
+ "dictation.error.connectionTimeout": "Zeitüberschreitung beim Aufbau der Echtzeit-Transkriptionsverbindung.",
+ "dictation.error.finalTimeout": "Die endgültige Echtzeit-Transkription ist nicht rechtzeitig eingetroffen.",
+ "dictation.error.fallback": "Das Diktat konnte nicht aus der temporären Aufnahme wiederhergestellt werden.",
+ "dictation.error.noSpeech": "Es wurde keine Sprache erkannt.",
+ "settings.privacy.voice": "• Echtzeit-Diktataudio und Aussprachetext werden direkt an OpenAI gesendet; Wiederherstellungsaufnahmen werden am Ende der Sitzung gelöscht",
+ "settings.section.selectionActions": "Auswahlaktionen",
+ "settings.description.selectionActions": "Automatische Aktionen für ausgewählten Text in anderen Apps verwalten.",
+ "settings.row.selectionActionsEnabled": "Auswahlaktionen aktivieren",
+ "settings.help.selectionActionsEnabled": "Zeigt nach einer kurzen Pause über ausgewähltem Text ein kleines Menü.",
+ "settings.row.forceSelectionMode": "Erzwungene Auswahl",
+ "settings.help.forceSelectionMode": "Fallback, wenn Bedienungshilfen ausgewählten Text nicht lesen können. Menükopie simuliert keine Tastatureingabe.",
+ "settings.forceSelection.disabled": "Aus",
+ "settings.forceSelection.menuCopyOnly": "Nur Menükopie",
+ "settings.forceSelection.menuCopyThenShortcut": "Menükopie, dann Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, dann Menükopie",
+ "settings.row.allowSimulatedCopyFallback": "Simuliertes Cmd+C erlauben",
+ "settings.help.allowSimulatedCopyFallback": "Sendet Cmd+C an die Vordergrund-App, wenn Menükopie nicht verfügbar ist. Dies kann Spiele oder Remote-Apps stören.",
+ "settings.row.translationLanguage": "Übersetzungssprache",
+ "settings.help.translationLanguage": "Sprache für die Übersetzen-Aktion bei ausgewähltem Text.",
+ "settings.row.translationPrompt": "Übersetzungsprompt",
+ "settings.help.translationPrompt": "Anweisungen für Übersetzen bei ausgewähltem Text. {targetLanguage} steht für die gewählte Sprache.",
+ "settings.translationPrompt.restoreDefault": "Standard wiederherstellen",
+ "settings.row.aiPronunciation": "KI-Aussprache-Stimme",
+ "settings.help.aiPronunciation": "Stimme für die Aussprache ausgewählten Texts. Verwendet OpenAI text-to-speech mit Ihrem OpenAI API key.",
+ "settings.row.aiPronunciationSpeed": "KI-Aussprachetempo",
+ "settings.help.aiPronunciationSpeed": "Wiedergabetempo für Aussprache ausgewählten Texts und die Stimmvorschau.",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "Stimme testen",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "Oberflächensprache verwenden",
+ "selection.action.translate": "Übersetzen",
+ "selection.action.pronounce": "Aussprechen",
+ "selection.action.translating": "Übersetzen...",
+ "selection.action.preparingPronunciation": "Audio vorbereiten...",
+ "selection.action.playingPronunciation": "Wiedergabe...",
+ "selection.action.pronounceOriginal": "Original abspielen",
+ "selection.action.pronounceTranslation": "Ubersetzung abspielen",
+ "selection.action.audioLabel.original": "Orig.",
+ "selection.action.audioLabel.translation": "Ubers.",
+ "selection.action.copyTranslation": "Übersetzung kopieren",
+ "selection.action.retry": "Erneut versuchen",
+ "selection.action.unsupportedTitle": "Ausgewählter Text nicht verfügbar",
+ "selection.action.unsupportedMessage": "Die aktuelle App stellt ausgewählten Text nicht für Inklet bereit.",
+ "selection.action.missingOpenAIKey": "Fügen Sie in den Einstellungen einen OpenAI API key hinzu, um KI-Aussprache zu verwenden.",
+ "selection.action.translationFailed": "Übersetzung fehlgeschlagen.",
+ "selection.action.pronunciationFailed": "Aussprache fehlgeschlagen.",
+ "about.tagline": "Aus ersten Gedanken werden klare Texte",
+ "about.website": "Website",
+ "about.privacyPolicy": "Datenschutz",
+ "about.support": "Support",
+ "language.system": "System",
+ "settings.window.title": "Inklet Einstellungen",
+ "settings.sidebar.preferences": "Einstellungen",
+ "settings.sidebar.hint": "Automatisch gespeichert · ⌘, Öffnen",
+ "settings.section.general": "Allgemein",
+ "settings.section.providers": "Anbieter",
+ "settings.section.promptModes": "Prompt-Modi",
+ "settings.section.permissions": "Berechtigungen",
+ "settings.description.general": "Grundverhalten, Tastenkürzel, Sprache und Generierungsparameter.",
+ "settings.description.providers": "LLM-Anbieter, Modell und API-Key auswählen.",
+ "settings.description.promptModes": "Konvertierungsmodi und System-Prompts verwalten.",
+ "settings.description.permissions": "macOS-Berechtigung zum Einfügen von Text prüfen.",
+ "settings.row.language": "Sprache",
+ "settings.help.language": "System folgt der macOS-Sprache.",
+ "settings.row.hotkey": "Tastenkürzel",
+ "settings.help.timeout": "Maximale Dauer der Anfrage.",
+ "settings.seconds": "%d s",
+ "settings.help.provider": "Aktueller Anbieter.",
+ "settings.help.apiKey": "Wird lokal auf diesem Mac gespeichert.",
+ "settings.help.model.default": "Standard: %@",
+ "settings.mode.untitled": "Unbenannter Modus",
+ "settings.mode.pick": "Prompt-Modus auswählen",
+ "settings.help.name": "Name im Popover.",
+ "settings.help.description": "Was dieser Modus tut.",
+ "settings.characters": "%d Zeichen",
+ "settings.permission.authorized": "Accessibility autorisiert",
+ "settings.permission.required": "Accessibility-Berechtigung erforderlich",
+ "settings.permission.description": "Klicken Sie auf Einstellungen öffnen, dann auf +, wählen Sie /Applications/Inklet.app und aktivieren Sie Inklet.",
+ "settings.permission.open": "Systemeinstellungen öffnen",
+ "settings.footer.pending": "Änderungen werden automatisch gespeichert und gelten beim nächsten Öffnen des Popovers.",
+ "settings.save": "Speichern",
+ "settings.saved": "Gespeichert",
+ "settings.error.visibleModeRequired": "Mindestens ein sichtbarer Modus ist erforderlich.",
+ "settings.error.modelRequired": "Model darf nicht leer sein.",
+ "settings.error.openAccessibility": "Accessibility-Einstellungen konnten nicht geöffnet werden.",
+ "settings.error.saveFailed": "Speichern fehlgeschlagen: %@",
+ "popover.input.placeholder": "Text zum Umwandeln oder Einfügen eingeben",
+ "popover.modeSearch.placeholder": "Modi suchen",
+ "popover.modeSearch.empty": "Keine passenden Modi",
+ "popover.modeSearch.select": "Auswählen",
+ "popover.modeSearch.write": "Schreiben",
+ "popover.result.title": "Ergebnis",
+ "popover.result.editable": "Vor dem Einfügen bearbeitbar",
+ "popover.result.generatedWith": "Mit %@ erstellt",
+ "popover.mode.picker": "Modus",
+ "popover.mode.backToModes": "Modus wählen",
+ "popover.action.transform": "Umwandeln",
+ "popover.action.regenerate": "Neu generieren",
+ "popover.action.insert": "Einfügen",
+ "popover.action.insertOriginal": "Original einfügen",
+ "popover.hint.transformInsert": "Umwandeln/Einfügen",
+ "popover.hint.original": "Original",
+ "popover.hint.accessibility": "Kürzel: Enter wandelt um oder fügt ein, Command Enter fügt Original ein, Escape zurück oder schließen",
+ "popover.busy.inserting": "Einfügen...",
+ "popover.busy.transforming": "Umwandeln...",
+ "popover.error.emptyOriginal": "Text zum Einfügen eingeben.",
+ "popover.error.missingTarget": "Ziel-App zum Einfügen wurde nicht gefunden.",
+ "popover.error.missingAPIKey": "%@ API-Key zuerst in den Einstellungen konfigurieren.",
+ "insertion.error.accessibility": "Accessibility-Berechtigung vor dem Einfügen aktivieren.",
+ "insertion.error.activation": "Rückkehr zur ursprünglichen App fehlgeschlagen. Bitte erneut versuchen.",
+ "insertion.error.pasteEvent": "Einfüge-Kürzel konnte nicht gesendet werden.",
+ "insertion.error.clipboardRestore": "Text eingefügt, aber Zwischenablage konnte nicht wiederhergestellt werden.",
+ "error.emptySource": "Text zum Umwandeln eingeben.",
+ "error.emptyResponse": "Das Modell hat eine leere Antwort zurückgegeben.",
+ "error.timeout": "Anfrage abgelaufen. Bitte erneut versuchen.",
+ "error.networkConnectionLost": "Die Netzwerkverbindung wurde unterbrochen. Bitte erneut versuchen.",
+ "error.provider.urlInvalid": "%@ Anfrage fehlgeschlagen: ungültige URL",
+ "error.provider.httpUnknown": "%@ Anfrage fehlgeschlagen: HTTP unknown",
+ "error.provider.prefix": "%@ Anfrage fehlgeschlagen: %@",
+ "hotkey.error.unsupported": "Nicht unterstütztes Tastenkürzel “%@”. Unterstützt: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
+ "hotkey.error.registrationFailed": "Registrierung des Tastenkürzels fehlgeschlagen (%d).",
+ "prompt.custom.description": "Verwendet Ihren eigenen prompt",
+ "appearance.dark": "Dunkel",
+ "appearance.light": "Hell",
+ "appearance.system": "System",
+ "popover.hint.back": "Zurück",
+ "popover.hint.close": "Schließen",
+ "popover.hint.mode": "Modus",
+ "popover.hint.newLine": "Neue Zeile",
+ "popover.status.preview": "Vorschau",
+ "popover.status.ready": "Bereit",
+ "prompt.chineseSummary.description": "Beliebigen Text kurz auf vereinfachtem Chinesisch zusammenfassen",
+ "prompt.friendlyReply.description": "Als natürliche, freundliche Antwort umformulieren",
+ "prompt.improveWriting.description": "Text verbessern und die ursprüngliche Sprache beibehalten",
+ "prompt.makeConcise.description": "Text kürzen und die ursprüngliche Sprache sowie Kernaussagen beibehalten",
+ "prompt.professionalTone.description": "Klarer und professioneller formulieren",
+ "prompt.simpleCorrectEnglish.description": "In einfaches, korrektes Englisch umformulieren oder übersetzen",
+ "prompt.translateToEnglish.description": "In einfaches, korrektes Englisch umformulieren oder übersetzen",
+ "settings.cancel": "Abbrechen",
+ "settings.description.about": "Tastaturkurzbefehle, Datenschutzhinweise und App-Informationen.",
+ "settings.description.selectionAssistant": "Automatische Übersetzung und Aussprache für ausgewählten Text in anderen Apps.",
+ "settings.description.writeAssistant": "Schreiben, Diktieren, Textgenerierung und Prompt-Modi konfigurieren.",
+ "settings.error.endpointInvalid": "Der Endpunkt muss eine gültige HTTP-URL sein.",
+ "settings.error.promptModeRequired": "Mindestens einen Prompt-Modus beibehalten.",
+ "settings.help.appearance": "Hell, Dunkel oder die macOS-Einstellung wählen.",
+ "settings.help.endpoint": "Vollständige OpenAI-kompatible /chat/completions-URL.",
+ "settings.help.hotkey": "Zum Beispiel: ⌥Space, Option+Space, Cmd+Space.",
+ "settings.help.openAIAPIKey": "Wird auf diesem Mac gespeichert und für Schreiben, Echtzeitdiktat, Übersetzung und Aussprache verwendet. Zum Entfernen das Feld leeren.",
+ "settings.hotkey.pressKey": " Taste",
+ "settings.hotkey.record": "Kurzbefehl aufnehmen",
+ "settings.hotkey.recording": "Kurzbefehl drücken",
+ "settings.mode.add": "Modus hinzufügen",
+ "settings.mode.delete": "Modus löschen",
+ "settings.mode.deleteConfirmMessage": "„%@“ löschen? Dies kann nicht rückgängig gemacht werden.",
+ "settings.mode.deleteConfirmTitle": "Prompt-Modus löschen?",
+ "settings.mode.dragToSort": "Zum Sortieren ziehen",
+ "settings.mode.hidden": "Ausgeblendet",
+ "settings.mode.moveDown": "Nach unten",
+ "settings.mode.moveUp": "Nach oben",
+ "settings.mode.newDescription": "Eigener Umwandlungsmodus",
+ "settings.mode.newName": "Neuer Modus",
+ "settings.mode.visible": "Sichtbar",
+ "settings.mode.visibleInMenu": "Im Menü anzeigen",
+ "settings.mode.visibleInMenuHelp": "Diesen Modus in der Modusauswahl anzeigen.",
+ "settings.model.custom": "Benutzerdefiniert…",
+ "settings.model.customized": "Eigenes Modell *",
+ "settings.model.refreshing": "Modellliste wird aktualisiert…",
+ "settings.permission.accessibility": "Bedienungshilfen",
+ "settings.permission.openShort": "Einstellungen öffnen",
+ "settings.privacy.clipboard": "• Zwischenablage wird nach dem Einfügen und konfigurierten erzwungenen Auslesen wiederhergestellt",
+ "settings.privacy.keychain": "• API-Schlüssel werden auf diesem Mac gespeichert",
+ "settings.privacy.provider": "• Text wird direkt an OpenAI gesendet",
+ "settings.privacy.title": "Datenschutz & Sicherheit",
+ "settings.provider.active": "Aktiv",
+ "settings.provider.configured": "Konfiguriert",
+ "settings.provider.notConfigured": "Nicht konfiguriert",
+ "settings.provider.notLoaded": "Gespeicherte Schlüssel werden nicht angezeigt",
+ "settings.provider.pendingKey": "Neuer Schlüssel bereit zum Speichern",
+ "settings.provider.pendingSave": "Speichern ausstehend",
+ "settings.provider.saved": "Gespeichert",
+ "settings.provider.savedLocally": "Lokal gespeichert",
+ "settings.quickStart.close": "Zurück oder schließen",
+ "settings.quickStart.help": "Häufige Aktionen im Popover.",
+ "settings.quickStart.open": "Inklet öffnen",
+ "settings.quickStart.original": "Originaltext einfügen",
+ "settings.quickStart.submit": "Umwandeln oder Ergebnis einfügen",
+ "settings.quickStart.title": "Tastaturkurzbefehle",
+ "settings.row.apiKey": "API-Schlüssel",
+ "settings.row.appearance": "Erscheinungsbild",
+ "settings.row.description": "Beschreibung",
+ "settings.row.endpoint": "Endpunkt",
+ "settings.row.model": "Modell",
+ "settings.row.name": "Name",
+ "settings.row.openAIAPIKey": "OpenAI-API-Schlüssel",
+ "settings.row.provider": "Anbieter",
+ "settings.row.systemPrompt": "Prompt",
+ "settings.row.timeout": "Zeitlimit",
+ "settings.section.about": "Über Inklet",
+ "settings.section.selectionAssistant": "Auswahlassistent",
+ "settings.section.writeAssistant": "Schreibassistent",
+ "settings.systemPermissions.title": "Systemberechtigungen",
+ "settings.version": "Version %@",
+ "settings.voice.shortcut.disabled": "Deaktiviert",
+ "settings.voice.shortcut.leftCommand": "Linke Command-Taste",
+ "settings.voice.shortcut.leftOption": "Linke Option-Taste",
+ "settings.voice.shortcut.rightCommand": "Rechte Command-Taste",
+ "settings.voice.shortcut.rightOption": "Rechte Option-Taste",
+ "setup.done": "Fertig",
+ "setup.menubar.description": "Zum Öffnen auf das Inklet-Symbol neben der Uhr klicken.",
+ "setup.menubar.title": "Inklet in der Menüleiste finden",
+ "setup.shortcut.description": "Der Standardkurzbefehl ist %@. Bei einem Konflikt mit einer anderen App lässt er sich in den Einstellungen ändern.",
+ "setup.shortcut.title": "Kurzbefehl verwenden",
+ "setup.subtitle": "Inklet läuft in der Menüleiste. Erlauben Sie den Zugriff auf Bedienungshilfen, damit Inklet Text in die verwendete App einfügen kann.",
+ "setup.title": "Inklet ist bereit",
+ "setup.window.title": "Willkommen bei Inklet"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+en.swift b/Sources/InkletApp/Localization/L10n+en.swift
new file mode 100644
index 0000000..5cedf40
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+en.swift
@@ -0,0 +1,317 @@
+// English interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let en: [String: String] = [
+ "app.menu.edit": "Edit",
+ "app.menu.undo": "Undo",
+ "app.menu.redo": "Redo",
+ "app.menu.cut": "Cut",
+ "app.menu.copy": "Copy",
+ "app.menu.paste": "Paste",
+ "app.menu.pasteAndMatchStyle": "Paste and Match Style",
+ "app.menu.delete": "Delete",
+ "app.menu.selectAll": "Select All",
+ "app.menu.openPopover": "Open Inklet",
+ "app.menu.settings": "Settings",
+ "app.menu.about": "About Inklet",
+ "app.menu.quit": "Quit",
+ "app.menu.checkForUpdates": "Check for Updates…",
+ "app.menu.checkingForUpdates": "Checking for Updates…",
+ "update.available.title": "An Inklet update is available",
+ "update.available.latestVersion": "Latest: %@ (build %@)",
+ "update.available.currentVersion": "Current: %@",
+ "update.available.noNotes": "View the release on GitHub for details.",
+ "update.action.viewOnGitHub": "View on GitHub",
+ "update.action.later": "Later",
+ "update.upToDate.title": "Inklet is up to date",
+ "update.upToDate.message": "You’re using %@.",
+ "update.error.title": "Couldn’t check for updates",
+ "update.error.message": "Try again in a moment.",
+ "update.action.retry": "Retry",
+ "update.action.cancel": "Cancel",
+ "update.action.ok": "OK",
+ "legacyMigration.notice.title": "Old Inklet data was not imported",
+ "legacyMigration.notice.message": "Your previous settings and history are still preserved. You can choose the matching Inklet Data folder to import them.",
+ "legacyMigration.action.importOldData": "Import Old Data…",
+ "legacyMigration.panel.title": "Choose Old Inklet Data",
+ "legacyMigration.panel.message": "Select the matching Inklet Data folder to import your preserved settings and history.",
+ "legacyMigration.import.progress": "Importing old data…",
+ "legacyMigration.import.invalidSelection": "The selected folder is not the legacy data folder for this Inklet app.",
+ "legacyMigration.import.failed": "Old data could not be imported. Your previous settings and history are still preserved.",
+ "legacyMigration.import.partialFailure": "Some old data could not be imported. Your previous settings and history are still preserved.",
+ "legacyMigration.import.relaunching": "Inklet needs to relaunch to finish loading the imported data.",
+ "legacyMigration.import.relaunchProgress": "Relaunching Inklet…",
+ "legacyMigration.import.relaunchFailed": "Inklet could not relaunch. Your imported data is ready and will load the next time you open Inklet.",
+ "legacyMigration.action.retryRelaunch": "Relaunch Inklet",
+ "legacyMigration.action.quit": "Quit Inklet",
+ "legacyMigration.settings.help": "Import your preserved settings and history from the matching Inklet Data folder.",
+ "settings.section.history": "History",
+ "settings.description.history": "Review successful writing and selection results, plus legacy voice results saved locally.",
+ "settings.history.filter.all": "All",
+ "settings.history.source.write": "Write",
+ "settings.history.source.voice": "Voice",
+ "settings.history.source.selection": "Selection",
+ "settings.history.empty": "No saved history yet.",
+ "settings.history.original": "Original",
+ "settings.history.result": "Result",
+ "settings.history.copyOriginal": "Copy original",
+ "settings.history.copyResult": "Copy result",
+ "settings.history.clear": "Clear History",
+ "settings.history.clearConfirmTitle": "Clear history?",
+ "settings.history.clearConfirmMessage": "This deletes all saved history records from this Mac. This cannot be undone.",
+ "settings.history.cleared": "History cleared.",
+ "settings.history.error.loadFailed": "Could not load history.",
+ "settings.history.error.clearFailed": "Could not clear history.",
+ "settings.privacy.history": "• Successful write and selection text history is saved locally; legacy voice records remain readable",
+ "selection.action.translate": "Translate",
+ "selection.action.pronounce": "Pronounce",
+ "selection.action.translating": "Translating...",
+ "selection.action.preparingPronunciation": "Preparing audio...",
+ "selection.action.playingPronunciation": "Playing...",
+ "selection.action.pronounceOriginal": "Play original",
+ "selection.action.pronounceTranslation": "Play translation",
+ "selection.action.audioLabel.original": "Original",
+ "selection.action.audioLabel.translation": "Trans.",
+ "selection.action.copyTranslation": "Copy translation",
+ "selection.action.retry": "Retry",
+ "selection.action.unsupportedTitle": "Selected text unavailable",
+ "selection.action.unsupportedMessage": "The current app does not expose selected text to Inklet.",
+ "selection.action.missingOpenAIKey": "Add an OpenAI API key in Settings to use AI pronunciation.",
+ "selection.action.translationFailed": "Translation failed.",
+ "selection.action.pronunciationFailed": "Pronunciation failed.",
+ "about.tagline": "Turn rough thoughts into clear text",
+ "about.website": "Website",
+ "about.privacyPolicy": "Privacy Policy",
+ "about.support": "Support",
+ "setup.window.title": "Welcome to Inklet",
+ "setup.title": "Inklet is ready",
+ "setup.subtitle": "It is running in your menu bar. Grant Accessibility permission so Inklet can insert text back into the app you are using.",
+ "setup.menubar.title": "Find Inklet in the menu bar",
+ "setup.menubar.description": "Click the Inklet icon near the clock whenever you want to open it.",
+ "setup.shortcut.title": "Use the shortcut",
+ "setup.shortcut.description": "The default shortcut is %@. If it conflicts with another app, change it in Settings.",
+ "setup.done": "Done",
+ "language.system": "System",
+ "settings.window.title": "Inklet Settings",
+ "settings.sidebar.preferences": "Preferences",
+ "settings.sidebar.hint": "Auto-saved · ⌘, Open",
+ "settings.version": "Version %@",
+ "settings.section.general": "General",
+ "settings.section.writeAssistant": "Write Assistant",
+ "settings.section.selectionAssistant": "Selection Assistant",
+ "settings.section.providers": "Providers",
+ "settings.section.selectionActions": "Selection Actions",
+ "settings.section.promptModes": "Prompt Modes",
+ "settings.section.about": "About",
+ "settings.section.permissions": "Permissions",
+ "settings.description.general": "Shared OpenAI key, interface preferences, permissions, and privacy.",
+ "settings.description.writeAssistant": "Configure writing, dictation, generation behavior, and prompt modes.",
+ "settings.description.selectionAssistant": "Automatic translation and pronunciation tools for selected text in other apps.",
+ "settings.description.providers": "Choose an LLM provider, model, and API key.",
+ "settings.description.selectionActions": "Automatic actions for selected text in other apps.",
+ "settings.description.promptModes": "Manage conversion modes and system prompts shown in the popover.",
+ "settings.description.about": "Keyboard shortcuts, privacy notes, and app information.",
+ "settings.description.permissions": "Check the macOS permission needed to insert text.",
+ "settings.row.language": "Interface Language",
+ "settings.help.language": "Use System to follow your macOS language.",
+ "settings.row.appearance": "Appearance",
+ "settings.help.appearance": "Choose Light, Dark, or follow macOS.",
+ "appearance.system": "System",
+ "appearance.light": "Light",
+ "appearance.dark": "Dark",
+ "settings.row.hotkey": "Hotkey",
+ "settings.help.hotkey": "For example: ⌥Space, Option+Space, Cmd+Space.",
+ "settings.hotkey.record": "Record Shortcut",
+ "settings.hotkey.recording": "Press shortcut",
+ "settings.hotkey.pressKey": " key",
+ "settings.row.timeout": "Timeout",
+ "settings.help.timeout": "Maximum request duration.",
+ "settings.seconds": "%d sec",
+ "settings.row.provider": "Provider",
+ "settings.help.provider": "Current provider.",
+ "settings.row.openAIAPIKey": "OpenAI API Key",
+ "settings.help.openAIAPIKey": "Stored locally on this Mac and shared by writing, realtime dictation, selection translation, and pronunciation. Clear the field to remove it.",
+ "settings.row.apiKey": "API Key",
+ "settings.help.apiKey": "Stored locally on this Mac. Clear the field to remove it.",
+ "settings.row.endpoint": "Endpoint",
+ "settings.help.endpoint": "Full OpenAI-compatible /chat/completions URL.",
+ "settings.row.model": "Model",
+ "settings.help.model.default": "Default: %@",
+ "settings.group.writing": "Writing",
+ "settings.group.writing.help": "Configure the Writing Assistant and its editable source draft.",
+ "settings.group.dictation": "Dictation",
+ "settings.group.dictation.help": "Hold the shortcut to send microphone audio to OpenAI in real time while you speak.",
+ "settings.group.dictationAdvanced": "Advanced Dictation",
+ "settings.row.dictationShortcut": "Hold shortcut",
+ "settings.help.dictationShortcut": "Works only while the Writing Assistant source editor is active. A short press does nothing.",
+ "settings.voice.shortcut.rightOption": "Right Option",
+ "settings.voice.shortcut.rightCommand": "Right Command",
+ "settings.voice.shortcut.leftOption": "Left Option",
+ "settings.voice.shortcut.leftCommand": "Left Command",
+ "settings.voice.shortcut.disabled": "Disabled",
+ "settings.quickStart.voice.pressAndHold": "Hold for voice input",
+ "settings.row.microphone": "Microphone",
+ "settings.help.microphone": "Choose the audio input used for realtime dictation.",
+ "settings.microphone.systemDefault": "System Default",
+ "settings.row.fallbackSpeechModel": "Recovery model",
+ "settings.help.fallbackSpeechModel": "Model used for the single recovery attempt after a realtime connection failure.",
+ "dictation.hint.hold": "Hold %@ to dictate",
+ "dictation.status.connecting": "Connecting…",
+ "dictation.status.listening": "Listening… Release to finish",
+ "dictation.status.recordingFallback": "Connection lost… Keep speaking",
+ "dictation.status.finalizing": "Finishing transcription…",
+ "dictation.status.recovering": "Recovering from the temporary recording…",
+ "dictation.status.ready": "Dictation ready",
+ "dictation.accessibility.ready": "Dictation is ready.",
+ "dictation.accessibility.listening": "Dictation is listening. Release to finish.",
+ "dictation.accessibility.recordingFallback": "The connection was lost. Keep speaking for recovery.",
+ "dictation.accessibility.finalizing": "Finishing the dictation transcription.",
+ "dictation.accessibility.recovering": "Recovering dictation from the temporary recording.",
+ "dictation.accessibility.completed": "Dictation completed.",
+ "dictation.accessibility.cancelled": "Dictation cancelled.",
+ "dictation.accessibility.failed": "Dictation failed.",
+ "dictation.accessibility.sourceEditor": "Writing source editor",
+ "dictation.undo.action": "Dictation",
+ "dictation.error.missingAPIKey": "Add an OpenAI API key in Settings to use dictation.",
+ "dictation.error.microphonePermission": "Microphone permission is required for dictation.",
+ "dictation.error.noAudioInputDevice": "No microphone or audio input device is available.",
+ "dictation.error.recordingUnavailable": "Could not start audio recording.",
+ "dictation.error.realtimeBufferOverflow": "Realtime audio could not keep up. Please try again.",
+ "dictation.error.connection": "The realtime transcription connection failed.",
+ "dictation.error.connectionTimeout": "Realtime transcription took too long to connect.",
+ "dictation.error.finalTimeout": "The final realtime transcription did not arrive in time.",
+ "dictation.error.fallback": "Dictation could not be recovered from the temporary recording.",
+ "dictation.error.noSpeech": "No speech was recognized.",
+ "settings.row.selectionActionsEnabled": "Enable Selection Actions",
+ "settings.help.selectionActionsEnabled": "Show a small menu after selected text pauses briefly.",
+ "settings.row.forceSelectionMode": "Force Selection",
+ "settings.help.forceSelectionMode": "Fallback used when Accessibility cannot read selected text. Menu Copy does not synthesize keyboard input.",
+ "settings.forceSelection.disabled": "Off",
+ "settings.forceSelection.menuCopyOnly": "Menu Copy only",
+ "settings.forceSelection.menuCopyThenShortcut": "Menu Copy, then Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, then Menu Copy",
+ "settings.row.allowSimulatedCopyFallback": "Allow Simulated Cmd+C",
+ "settings.help.allowSimulatedCopyFallback": "Sends Cmd+C to the foreground app when Menu Copy is unavailable. This may interfere with games or remote apps.",
+ "settings.row.translationLanguage": "Translation Language",
+ "settings.help.translationLanguage": "Language used by the selected-text Translate action.",
+ "settings.row.translationPrompt": "Translate Prompt",
+ "settings.help.translationPrompt": "Instructions used by the selected-text Translate action. Use {targetLanguage} for the chosen language.",
+ "settings.translationPrompt.restoreDefault": "Restore Default",
+ "settings.row.aiPronunciation": "AI Pronunciation Voice",
+ "settings.help.aiPronunciation": "Voice used by selected-text Pronounce. Uses OpenAI text-to-speech with your OpenAI API key.",
+ "settings.row.aiPronunciationSpeed": "AI Pronunciation Speed",
+ "settings.help.aiPronunciationSpeed": "Playback speed used by selected-text Pronounce and voice preview.",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "Preview voice",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "Follow interface language",
+ "settings.model.custom": "Custom...",
+ "settings.model.refreshing": "Refreshing model list...",
+ "settings.model.customized": "Custom model *",
+ "settings.mode.untitled": "Untitled mode",
+ "settings.mode.add": "Add Mode",
+ "settings.mode.newName": "New Mode",
+ "settings.mode.newDescription": "Custom transformation mode",
+ "settings.mode.visible": "Visible",
+ "settings.mode.hidden": "Hidden",
+ "settings.mode.pick": "Select a Prompt Mode",
+ "settings.mode.visibleInMenu": "Visible in menu",
+ "settings.mode.visibleInMenuHelp": "Show this mode in the mode selector.",
+ "settings.mode.moveUp": "Move up",
+ "settings.mode.moveDown": "Move down",
+ "settings.mode.dragToSort": "Drag to reorder",
+ "settings.mode.delete": "Delete mode",
+ "settings.mode.deleteConfirmTitle": "Delete prompt mode?",
+ "settings.mode.deleteConfirmMessage": "Delete “%@”? This cannot be undone.",
+ "settings.cancel": "Cancel",
+ "settings.provider.configured": "Configured",
+ "settings.provider.notConfigured": "Not configured",
+ "settings.provider.active": "Active",
+ "settings.provider.saved": "Saved",
+ "settings.provider.savedLocally": "Saved locally",
+ "settings.provider.pendingKey": "New key ready to save",
+ "settings.provider.notLoaded": "Saved keys are not shown",
+ "settings.provider.pendingSave": "Pending save",
+ "settings.row.name": "Name",
+ "settings.help.name": "Name shown in the popover.",
+ "settings.row.description": "Description",
+ "settings.help.description": "What this mode does.",
+ "settings.row.systemPrompt": "Prompt",
+ "settings.characters": "%d chars",
+ "settings.permission.authorized": "Accessibility authorized",
+ "settings.permission.required": "Accessibility permission required",
+ "settings.permission.accessibility": "Accessibility",
+ "settings.permission.description": "Click Open Settings, click +, choose /Applications/Inklet.app, then enable Inklet.",
+ "settings.permission.open": "Open System Settings",
+ "settings.permission.openShort": "Open Settings",
+ "settings.systemPermissions.title": "System permissions",
+ "settings.quickStart.title": "Keyboard shortcuts",
+ "settings.quickStart.help": "Common actions in the popover.",
+ "settings.quickStart.open": "Open Inklet",
+ "settings.quickStart.submit": "Transform, or insert the result",
+ "settings.quickStart.original": "Insert original text",
+ "settings.quickStart.close": "Go back or close",
+ "settings.privacy.title": "Privacy & Security",
+ "settings.privacy.keychain": "• API keys are stored locally on this Mac",
+ "settings.privacy.provider": "• Text is sent directly to OpenAI",
+ "settings.privacy.voice": "• Realtime dictation audio and pronunciation text are sent directly to OpenAI; recovery recordings stay temporary and are deleted when the session ends",
+ "settings.privacy.clipboard": "• Clipboard contents are restored after insertion and configured Force Selection reads",
+ "settings.footer.pending": "Changes are saved automatically and apply the next time the popover opens.",
+ "settings.save": "Save",
+ "settings.saved": "Saved",
+ "settings.error.visibleModeRequired": "Keep at least one visible mode.",
+ "settings.error.promptModeRequired": "Keep at least one prompt mode.",
+ "settings.error.modelRequired": "Model cannot be empty.",
+ "settings.error.endpointInvalid": "Endpoint must be a valid HTTP URL.",
+ "settings.error.openAccessibility": "Could not open Accessibility settings.",
+ "settings.error.saveFailed": "Save failed: %@",
+ "popover.input.placeholder": "Enter text to transform or insert",
+ "popover.modeSearch.placeholder": "Search modes",
+ "popover.modeSearch.empty": "No matching modes",
+ "popover.modeSearch.select": "Select",
+ "popover.modeSearch.write": "Write",
+ "popover.result.title": "Result",
+ "popover.result.editable": "Editable before inserting",
+ "popover.result.generatedWith": "Generated with %@",
+ "popover.mode.picker": "Mode",
+ "popover.mode.backToModes": "Choose mode",
+ "popover.status.ready": "Ready",
+ "popover.status.preview": "Preview",
+ "popover.action.transform": "Transform",
+ "popover.action.regenerate": "Regenerate",
+ "popover.action.insert": "Insert",
+ "popover.action.insertOriginal": "Insert Original",
+ "popover.hint.transformInsert": "Transform/Insert",
+ "popover.hint.original": "Original",
+ "popover.hint.newLine": "New Line",
+ "popover.hint.mode": "Mode",
+ "popover.hint.back": "Back",
+ "popover.hint.close": "Close",
+ "popover.hint.accessibility": "Shortcuts: Enter transforms or inserts, Command Enter inserts original text, Escape goes back or closes",
+ "popover.busy.inserting": "Inserting...",
+ "popover.busy.transforming": "Transforming...",
+ "popover.error.emptyOriginal": "Enter text to insert.",
+ "popover.error.missingTarget": "Could not find the target app to insert text.",
+ "popover.error.missingAPIKey": "Configure the %@ API Key in Settings first.",
+ "insertion.error.accessibility": "Enable Accessibility permission before inserting text.",
+ "insertion.error.activation": "Could not return to the original app. Please try again.",
+ "insertion.error.pasteEvent": "Could not send the paste shortcut.",
+ "insertion.error.clipboardRestore": "Inserted text, but failed to restore the clipboard.",
+ "error.emptySource": "Enter text to transform.",
+ "error.emptyResponse": "The model returned an empty response.",
+ "error.timeout": "Request timed out. Please try again.",
+ "error.networkConnectionLost": "The network connection was interrupted. Please try again.",
+ "error.provider.urlInvalid": "%@ request failed: invalid URL",
+ "error.provider.httpUnknown": "%@ request failed: HTTP unknown",
+ "error.provider.prefix": "%@ request failed: %@",
+ "hotkey.error.unsupported": "Unsupported hotkey “%@”. Supported: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
+ "hotkey.error.registrationFailed": "Hotkey registration failed (%d).",
+ "prompt.simpleCorrectEnglish.description": "Rewrite or translate into simple, correct English",
+ "prompt.chineseSummary.description": "Summarize any text into concise Simplified Chinese",
+ "prompt.translateToEnglish.description": "Rewrite or translate into simple, correct English",
+ "prompt.improveWriting.description": "Improve writing while keeping the original language",
+ "prompt.makeConcise.description": "Shorten text while keeping the original language and key points",
+ "prompt.professionalTone.description": "Rewrite with a clearer, more professional tone",
+ "prompt.friendlyReply.description": "Rewrite as a natural, friendly reply",
+ "prompt.custom.description": "Use your custom prompt"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+es.swift b/Sources/InkletApp/Localization/L10n+es.swift
new file mode 100644
index 0000000..ce1cb97
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+es.swift
@@ -0,0 +1,317 @@
+// Spanish interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let es: [String: String] = [
+ "app.menu.edit": "Edición",
+ "app.menu.undo": "Deshacer",
+ "app.menu.redo": "Rehacer",
+ "app.menu.cut": "Cortar",
+ "app.menu.copy": "Copiar",
+ "app.menu.paste": "Pegar",
+ "app.menu.pasteAndMatchStyle": "Pegar con el mismo estilo",
+ "app.menu.delete": "Eliminar",
+ "app.menu.selectAll": "Seleccionar todo",
+ "app.menu.openPopover": "Abrir Inklet",
+ "app.menu.settings": "Ajustes",
+ "app.menu.about": "Acerca de Inklet",
+ "app.menu.quit": "Salir",
+ "app.menu.checkForUpdates": "Buscar actualizaciones…",
+ "app.menu.checkingForUpdates": "Buscando actualizaciones…",
+ "update.available.title": "Hay una actualización de Inklet disponible",
+ "update.available.latestVersion": "Última: %@ (compilación %@)",
+ "update.available.currentVersion": "Actual: %@",
+ "update.available.noNotes": "Consulta la versión en GitHub para obtener más detalles.",
+ "update.action.viewOnGitHub": "Ver en GitHub",
+ "update.action.later": "Más tarde",
+ "update.upToDate.title": "Inklet está actualizado",
+ "update.upToDate.message": "Estás usando %@.",
+ "update.error.title": "No se pudieron buscar actualizaciones",
+ "update.error.message": "Inténtalo de nuevo dentro de unos instantes.",
+ "update.action.retry": "Reintentar",
+ "update.action.cancel": "Cancelar",
+ "update.action.ok": "Aceptar",
+ "legacyMigration.notice.title": "Los datos anteriores de Inklet no se importaron",
+ "legacyMigration.notice.message": "Tus ajustes y tu historial anteriores siguen conservados. Puedes elegir la carpeta Inklet Data correspondiente para importarlos.",
+ "legacyMigration.action.importOldData": "Importar datos…",
+ "legacyMigration.panel.title": "Seleccionar los datos anteriores de Inklet",
+ "legacyMigration.panel.message": "Selecciona la carpeta Inklet Data correspondiente para importar los ajustes y el historial conservados.",
+ "legacyMigration.import.progress": "Importando datos…",
+ "legacyMigration.import.invalidSelection": "La carpeta seleccionada no es la carpeta de datos anteriores correspondiente a esta app de Inklet.",
+ "legacyMigration.import.failed": "No se pudieron importar los datos anteriores. Tus ajustes y tu historial siguen conservados.",
+ "legacyMigration.import.partialFailure": "No se pudieron importar algunos datos anteriores. Tus ajustes y tu historial siguen conservados.",
+ "legacyMigration.import.relaunching": "Inklet debe reiniciarse para terminar de cargar los datos importados.",
+ "legacyMigration.import.relaunchProgress": "Reiniciando Inklet…",
+ "legacyMigration.import.relaunchFailed": "Inklet no pudo reiniciarse. Los datos importados están listos y se cargarán la próxima vez que abras Inklet.",
+ "legacyMigration.action.retryRelaunch": "Reiniciar Inklet",
+ "legacyMigration.action.quit": "Salir de Inklet",
+ "legacyMigration.settings.help": "Importa tus ajustes y tu historial conservados desde la carpeta Inklet Data correspondiente.",
+ "settings.section.history": "Historial",
+ "settings.description.history": "Revisa los resultados de escritura y selección, además de los resultados de voz antiguos guardados localmente.",
+ "settings.history.filter.all": "Todo",
+ "settings.history.source.write": "Escritura",
+ "settings.history.source.voice": "Voz",
+ "settings.history.source.selection": "Selección",
+ "settings.history.empty": "Aún no hay historial guardado.",
+ "settings.history.original": "Original",
+ "settings.history.result": "Resultado",
+ "settings.history.copyOriginal": "Copiar original",
+ "settings.history.copyResult": "Copiar resultado",
+ "settings.history.clear": "Borrar historial",
+ "settings.history.clearConfirmTitle": "¿Borrar historial?",
+ "settings.history.clearConfirmMessage": "Esto elimina de este Mac todos los registros guardados. No se puede deshacer.",
+ "settings.history.cleared": "Historial borrado.",
+ "settings.history.error.loadFailed": "No se pudo cargar el historial.",
+ "settings.history.error.clearFailed": "No se pudo borrar el historial.",
+ "settings.privacy.history": "• El historial correcto de escritura y selección se guarda localmente; el historial de voz antiguo sigue disponible",
+ "settings.group.writing": "Escritura",
+ "settings.group.writing.help": "Configura Writing Assistant y su borrador de origen editable.",
+ "settings.group.dictation": "Dictado",
+ "settings.group.dictation.help": "Mantén pulsado el atajo mientras hablas para enviar el audio del micrófono a OpenAI en tiempo real.",
+ "settings.group.dictationAdvanced": "Dictado avanzado",
+ "settings.row.dictationShortcut": "Atajo al mantener pulsado",
+ "settings.help.dictationShortcut": "Solo funciona cuando el editor de origen de Writing Assistant está activo. Una pulsación breve no hace nada.",
+ "settings.quickStart.voice.pressAndHold": "Mantener para entrada de voz",
+ "settings.row.microphone": "Micrófono",
+ "settings.help.microphone": "Elige la entrada de audio usada para el dictado en tiempo real.",
+ "settings.microphone.systemDefault": "Sistema predeterminado",
+ "settings.row.fallbackSpeechModel": "Modelo de recuperación",
+ "settings.help.fallbackSpeechModel": "Modelo usado para el único intento de recuperación tras fallar la conexión en tiempo real.",
+ "dictation.hint.hold": "Mantén %@ para dictar",
+ "dictation.status.connecting": "Conectando…",
+ "dictation.status.listening": "Escuchando… Suelta para terminar",
+ "dictation.status.recordingFallback": "Conexión perdida… Sigue hablando",
+ "dictation.status.finalizing": "Terminando la transcripción…",
+ "dictation.status.recovering": "Recuperando desde la grabación temporal…",
+ "dictation.status.ready": "Dictado listo",
+ "dictation.accessibility.ready": "El dictado está listo.",
+ "dictation.accessibility.listening": "El dictado está escuchando. Suelta para terminar.",
+ "dictation.accessibility.recordingFallback": "Se perdió la conexión. Sigue hablando para poder recuperar.",
+ "dictation.accessibility.finalizing": "Terminando la transcripción del dictado.",
+ "dictation.accessibility.recovering": "Recuperando el dictado desde la grabación temporal.",
+ "dictation.accessibility.completed": "Dictado completado.",
+ "dictation.accessibility.cancelled": "Dictado cancelado.",
+ "dictation.accessibility.failed": "El dictado ha fallado.",
+ "dictation.accessibility.sourceEditor": "Editor de origen de escritura",
+ "dictation.undo.action": "Dictado",
+ "dictation.error.missingAPIKey": "Añade una clave API de OpenAI en Ajustes para usar el dictado.",
+ "dictation.error.microphonePermission": "El dictado necesita permiso para usar el micrófono.",
+ "dictation.error.noAudioInputDevice": "No hay micrófono ni dispositivo de entrada de audio disponible.",
+ "dictation.error.recordingUnavailable": "No se pudo iniciar la grabación de audio.",
+ "dictation.error.realtimeBufferOverflow": "No se pudo procesar el audio en tiempo real a tiempo. Inténtalo de nuevo.",
+ "dictation.error.connection": "Falló la conexión de transcripción en tiempo real.",
+ "dictation.error.connectionTimeout": "La conexión de transcripción en tiempo real agotó el tiempo de espera.",
+ "dictation.error.finalTimeout": "La transcripción final en tiempo real no llegó a tiempo.",
+ "dictation.error.fallback": "No se pudo recuperar el dictado desde la grabación temporal.",
+ "dictation.error.noSpeech": "No se reconoció ninguna voz.",
+ "settings.privacy.voice": "• El audio de dictado en tiempo real y el texto de pronunciación se envían directamente a OpenAI; las grabaciones de recuperación se eliminan al terminar la sesión",
+ "settings.section.selectionActions": "Acciones de selección",
+ "settings.description.selectionActions": "Gestiona acciones automáticas para texto seleccionado en otras apps.",
+ "settings.row.selectionActionsEnabled": "Activar acciones de selección",
+ "settings.help.selectionActionsEnabled": "Muestra un menú pequeño tras una breve pausa al seleccionar texto.",
+ "settings.row.forceSelectionMode": "Selección forzada",
+ "settings.help.forceSelectionMode": "Alternativa cuando Accesibilidad no puede leer el texto seleccionado. Copiar desde el menú no simula entradas de teclado.",
+ "settings.forceSelection.disabled": "Desactivada",
+ "settings.forceSelection.menuCopyOnly": "Solo copiar desde menú",
+ "settings.forceSelection.menuCopyThenShortcut": "Menú Copiar, luego Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, luego menú Copiar",
+ "settings.row.allowSimulatedCopyFallback": "Permitir Cmd+C simulado",
+ "settings.help.allowSimulatedCopyFallback": "Envía Cmd+C a la app en primer plano si Copiar desde el menú no está disponible. Puede interferir con juegos o apps remotas.",
+ "settings.row.translationLanguage": "Idioma de traducción",
+ "settings.help.translationLanguage": "Idioma usado por la acción Traducir del texto seleccionado.",
+ "settings.row.translationPrompt": "Prompt de traducción",
+ "settings.help.translationPrompt": "Instrucciones para Traducir texto seleccionado. Usa {targetLanguage} para el idioma elegido.",
+ "settings.translationPrompt.restoreDefault": "Restaurar predeterminado",
+ "settings.row.aiPronunciation": "Voz de pronunciación con IA",
+ "settings.help.aiPronunciation": "Voz usada por Pronunciar en el texto seleccionado. Usa OpenAI text-to-speech con tu OpenAI API key.",
+ "settings.row.aiPronunciationSpeed": "Velocidad de pronunciación IA",
+ "settings.help.aiPronunciationSpeed": "Velocidad de reproducción para Pronunciar texto seleccionado y la vista previa de voz.",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "Previsualizar voz",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "Seguir idioma de la interfaz",
+ "selection.action.translate": "Traducir",
+ "selection.action.pronounce": "Pronunciar",
+ "selection.action.translating": "Traduciendo...",
+ "selection.action.preparingPronunciation": "Preparando audio...",
+ "selection.action.playingPronunciation": "Reproduciendo...",
+ "selection.action.pronounceOriginal": "Reproducir original",
+ "selection.action.pronounceTranslation": "Reproducir traduccion",
+ "selection.action.audioLabel.original": "Orig.",
+ "selection.action.audioLabel.translation": "Trad.",
+ "selection.action.copyTranslation": "Copiar traducción",
+ "selection.action.retry": "Reintentar",
+ "selection.action.unsupportedTitle": "Texto seleccionado no disponible",
+ "selection.action.unsupportedMessage": "La app actual no expone el texto seleccionado a Inklet.",
+ "selection.action.missingOpenAIKey": "Añade una OpenAI API key en Ajustes para usar la pronunciación con IA.",
+ "selection.action.translationFailed": "La traducción falló.",
+ "selection.action.pronunciationFailed": "La pronunciación falló.",
+ "about.tagline": "Convierte tus ideas en textos claros",
+ "about.website": "Sitio web",
+ "about.privacyPolicy": "Política de privacidad",
+ "about.support": "Soporte",
+ "language.system": "Sistema",
+ "settings.window.title": "Ajustes de Inklet",
+ "settings.sidebar.preferences": "Preferencias",
+ "settings.sidebar.hint": "Autoguardado · ⌘, Abrir",
+ "settings.section.general": "General",
+ "settings.section.providers": "Proveedores",
+ "settings.section.promptModes": "Modos de prompt",
+ "settings.section.permissions": "Permisos",
+ "settings.description.general": "Comportamiento básico, atajo, idioma de la interfaz y parámetros de generación.",
+ "settings.description.providers": "Elige proveedor LLM, modelo y API key.",
+ "settings.description.promptModes": "Gestiona modos de conversión y prompts del sistema.",
+ "settings.description.permissions": "Comprueba el permiso de macOS necesario para insertar texto.",
+ "settings.row.language": "Idioma de interfaz",
+ "settings.help.language": "System sigue el idioma de macOS.",
+ "settings.row.hotkey": "Atajo",
+ "settings.help.timeout": "Duración máxima de la solicitud.",
+ "settings.seconds": "%d s",
+ "settings.help.provider": "Proveedor actual.",
+ "settings.help.apiKey": "Se guarda localmente en este Mac.",
+ "settings.help.model.default": "Predeterminado: %@",
+ "settings.mode.untitled": "Modo sin título",
+ "settings.mode.pick": "Selecciona un modo de prompt",
+ "settings.help.name": "Nombre mostrado en el panel.",
+ "settings.help.description": "Qué hace este modo.",
+ "settings.characters": "%d caracteres",
+ "settings.permission.authorized": "Accessibility autorizado",
+ "settings.permission.required": "Se requiere permiso de Accessibility",
+ "settings.permission.description": "Haz clic en Abrir ajustes, pulsa +, elige /Applications/Inklet.app y activa Inklet.",
+ "settings.permission.open": "Abrir ajustes del sistema",
+ "settings.footer.pending": "Los cambios se guardan automáticamente y se aplican la próxima vez que abras el panel.",
+ "settings.save": "Guardar",
+ "settings.saved": "Guardado",
+ "settings.error.visibleModeRequired": "Mantén al menos un modo visible.",
+ "settings.error.modelRequired": "Model no puede estar vacío.",
+ "settings.error.openAccessibility": "No se pudo abrir Accessibility.",
+ "settings.error.saveFailed": "Error al guardar: %@",
+ "popover.input.placeholder": "Escribe texto para transformar o insertar",
+ "popover.modeSearch.placeholder": "Buscar modos",
+ "popover.modeSearch.empty": "No hay modos coincidentes",
+ "popover.modeSearch.select": "Seleccionar",
+ "popover.modeSearch.write": "Escribir",
+ "popover.result.title": "Resultado",
+ "popover.result.editable": "Editable antes de insertar",
+ "popover.result.generatedWith": "Generado con %@",
+ "popover.mode.picker": "Modo",
+ "popover.mode.backToModes": "Elegir modo",
+ "popover.action.transform": "Transformar",
+ "popover.action.regenerate": "Regenerar",
+ "popover.action.insert": "Insertar",
+ "popover.action.insertOriginal": "Insertar original",
+ "popover.hint.transformInsert": "Transformar/Insertar",
+ "popover.hint.original": "Original",
+ "popover.hint.accessibility": "Atajos: Enter transforma o inserta, Command Enter inserta el original, Escape vuelve o cierra",
+ "popover.busy.inserting": "Insertando...",
+ "popover.busy.transforming": "Transformando...",
+ "popover.error.emptyOriginal": "Escribe texto para insertar.",
+ "popover.error.missingTarget": "No se encontró la app de destino para insertar texto.",
+ "popover.error.missingAPIKey": "Configura la API Key de %@ en Ajustes.",
+ "insertion.error.accessibility": "Activa el permiso de Accessibility antes de insertar texto.",
+ "insertion.error.activation": "No se pudo volver a la app original. Inténtalo de nuevo.",
+ "insertion.error.pasteEvent": "No se pudo enviar el atajo de pegar.",
+ "insertion.error.clipboardRestore": "Se insertó el texto, pero no se pudo restaurar el portapapeles.",
+ "error.emptySource": "Escribe texto para transformar.",
+ "error.emptyResponse": "El modelo devolvió una respuesta vacía.",
+ "error.timeout": "La solicitud agotó el tiempo. Inténtalo de nuevo.",
+ "error.networkConnectionLost": "Se interrumpió la conexión de red. Inténtalo de nuevo.",
+ "error.provider.urlInvalid": "La solicitud a %@ falló: URL no válida",
+ "error.provider.httpUnknown": "La solicitud a %@ falló: HTTP unknown",
+ "error.provider.prefix": "La solicitud a %@ falló: %@",
+ "hotkey.error.unsupported": "Atajo no compatible “%@”. Compatibles: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
+ "hotkey.error.registrationFailed": "Error al registrar el atajo (%d).",
+ "prompt.custom.description": "Usa tu prompt personalizado",
+ "appearance.dark": "Oscuro",
+ "appearance.light": "Claro",
+ "appearance.system": "Sistema",
+ "popover.hint.back": "Volver",
+ "popover.hint.close": "Cerrar",
+ "popover.hint.mode": "Modo",
+ "popover.hint.newLine": "Nueva línea",
+ "popover.status.preview": "Vista previa",
+ "popover.status.ready": "Listo",
+ "prompt.chineseSummary.description": "Resume cualquier texto en chino simplificado de forma concisa",
+ "prompt.friendlyReply.description": "Reescribe como una respuesta natural y amable",
+ "prompt.improveWriting.description": "Mejora la redacción manteniendo el idioma original",
+ "prompt.makeConcise.description": "Acorta el texto manteniendo el idioma original y los puntos clave",
+ "prompt.professionalTone.description": "Reescribe con un tono más claro y profesional",
+ "prompt.simpleCorrectEnglish.description": "Reescribe o traduce a un inglés sencillo y correcto",
+ "prompt.translateToEnglish.description": "Reescribe o traduce a un inglés sencillo y correcto",
+ "settings.cancel": "Cancelar",
+ "settings.description.about": "Atajos de teclado, notas de privacidad e información de la app.",
+ "settings.description.selectionAssistant": "Herramientas de traducción y pronunciación para el texto seleccionado en otras apps.",
+ "settings.description.writeAssistant": "Configura la escritura, el dictado, la generación y los modos de instrucciones.",
+ "settings.error.endpointInvalid": "El endpoint debe ser una URL HTTP válida.",
+ "settings.error.promptModeRequired": "Mantén al menos un modo de instrucciones.",
+ "settings.help.appearance": "Elige claro, oscuro o seguir macOS.",
+ "settings.help.endpoint": "URL completa de /chat/completions compatible con OpenAI.",
+ "settings.help.hotkey": "Por ejemplo: ⌥Space, Option+Space, Cmd+Space.",
+ "settings.help.openAIAPIKey": "Se guarda en este Mac y se comparte entre escritura, dictado en tiempo real, traducción y pronunciación. Vacía el campo para eliminarla.",
+ "settings.hotkey.pressKey": " tecla",
+ "settings.hotkey.record": "Grabar atajo",
+ "settings.hotkey.recording": "Pulsa el atajo",
+ "settings.mode.add": "Añadir modo",
+ "settings.mode.delete": "Eliminar modo",
+ "settings.mode.deleteConfirmMessage": "¿Eliminar «%@»? Esta acción no se puede deshacer.",
+ "settings.mode.deleteConfirmTitle": "¿Eliminar el modo de instrucciones?",
+ "settings.mode.dragToSort": "Arrastra para reordenar",
+ "settings.mode.hidden": "Oculto",
+ "settings.mode.moveDown": "Mover abajo",
+ "settings.mode.moveUp": "Mover arriba",
+ "settings.mode.newDescription": "Modo de transformación personalizado",
+ "settings.mode.newName": "Nuevo modo",
+ "settings.mode.visible": "Visible",
+ "settings.mode.visibleInMenu": "Mostrar en el menú",
+ "settings.mode.visibleInMenuHelp": "Muestra este modo en el selector de modos.",
+ "settings.model.custom": "Personalizado…",
+ "settings.model.customized": "Modelo personalizado *",
+ "settings.model.refreshing": "Actualizando modelos…",
+ "settings.permission.accessibility": "Accesibilidad",
+ "settings.permission.openShort": "Abrir ajustes",
+ "settings.privacy.clipboard": "• El portapapeles se restaura tras la inserción y la lectura mediante selección forzada",
+ "settings.privacy.keychain": "• Las claves API se guardan en este Mac",
+ "settings.privacy.provider": "• El texto se envía directamente a OpenAI",
+ "settings.privacy.title": "Privacidad y seguridad",
+ "settings.provider.active": "Activo",
+ "settings.provider.configured": "Configurado",
+ "settings.provider.notConfigured": "Sin configurar",
+ "settings.provider.notLoaded": "Las claves guardadas no se muestran",
+ "settings.provider.pendingKey": "Nueva clave lista para guardar",
+ "settings.provider.pendingSave": "Pendiente de guardar",
+ "settings.provider.saved": "Guardado",
+ "settings.provider.savedLocally": "Guardado localmente",
+ "settings.quickStart.close": "Volver o cerrar",
+ "settings.quickStart.help": "Acciones habituales en la ventana emergente.",
+ "settings.quickStart.open": "Abrir Inklet",
+ "settings.quickStart.original": "Insertar texto original",
+ "settings.quickStart.submit": "Transformar o insertar el resultado",
+ "settings.quickStart.title": "Atajos de teclado",
+ "settings.row.apiKey": "Clave API",
+ "settings.row.appearance": "Apariencia",
+ "settings.row.description": "Descripción",
+ "settings.row.endpoint": "Endpoint",
+ "settings.row.model": "Modelo",
+ "settings.row.name": "Nombre",
+ "settings.row.openAIAPIKey": "Clave API de OpenAI",
+ "settings.row.provider": "Proveedor",
+ "settings.row.systemPrompt": "Instrucciones",
+ "settings.row.timeout": "Tiempo de espera",
+ "settings.section.about": "Acerca de",
+ "settings.section.selectionAssistant": "Asistente de selección",
+ "settings.section.writeAssistant": "Asistente de escritura",
+ "settings.systemPermissions.title": "Permisos del sistema",
+ "settings.version": "Versión %@",
+ "settings.voice.shortcut.disabled": "Desactivado",
+ "settings.voice.shortcut.leftCommand": "Command izquierdo",
+ "settings.voice.shortcut.leftOption": "Option izquierdo",
+ "settings.voice.shortcut.rightCommand": "Command derecho",
+ "settings.voice.shortcut.rightOption": "Option derecho",
+ "setup.done": "Listo",
+ "setup.menubar.description": "Haz clic en el icono de Inklet junto al reloj para abrirlo cuando quieras.",
+ "setup.menubar.title": "Encuentra Inklet en la barra de menús",
+ "setup.shortcut.description": "El atajo predeterminado es %@. Si entra en conflicto con otra app, cámbialo en Ajustes.",
+ "setup.shortcut.title": "Usa el atajo",
+ "setup.subtitle": "Inklet está en la barra de menús. Concede permiso de Accesibilidad para que pueda insertar texto en la app que estés usando.",
+ "setup.title": "Inklet está listo",
+ "setup.window.title": "Te damos la bienvenida a Inklet"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+fr.swift b/Sources/InkletApp/Localization/L10n+fr.swift
new file mode 100644
index 0000000..2843e81
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+fr.swift
@@ -0,0 +1,317 @@
+// French interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let fr: [String: String] = [
+ "app.menu.edit": "Édition",
+ "app.menu.undo": "Annuler",
+ "app.menu.redo": "Rétablir",
+ "app.menu.cut": "Couper",
+ "app.menu.copy": "Copier",
+ "app.menu.paste": "Coller",
+ "app.menu.pasteAndMatchStyle": "Coller et adapter le style",
+ "app.menu.delete": "Supprimer",
+ "app.menu.selectAll": "Tout sélectionner",
+ "app.menu.openPopover": "Ouvrir Inklet",
+ "app.menu.settings": "Réglages",
+ "app.menu.about": "À propos de Inklet",
+ "app.menu.quit": "Quitter",
+ "app.menu.checkForUpdates": "Rechercher des mises à jour…",
+ "app.menu.checkingForUpdates": "Recherche des mises à jour…",
+ "update.available.title": "Une mise à jour d’Inklet est disponible",
+ "update.available.latestVersion": "Dernière version : %@ (build %@)",
+ "update.available.currentVersion": "Actuelle : %@",
+ "update.available.noNotes": "Consultez la publication sur GitHub pour plus de détails.",
+ "update.action.viewOnGitHub": "Voir sur GitHub",
+ "update.action.later": "Plus tard",
+ "update.upToDate.title": "Inklet est à jour",
+ "update.upToDate.message": "Vous utilisez %@.",
+ "update.error.title": "Impossible de rechercher les mises à jour",
+ "update.error.message": "Réessayez dans quelques instants.",
+ "update.action.retry": "Réessayer",
+ "update.action.cancel": "Annuler",
+ "update.action.ok": "OK",
+ "legacyMigration.notice.title": "Les anciennes données d’Inklet n’ont pas été importées",
+ "legacyMigration.notice.message": "Vos réglages et votre historique précédents sont toujours conservés. Vous pouvez choisir le dossier Inklet Data correspondant pour les importer.",
+ "legacyMigration.action.importOldData": "Importer les données",
+ "legacyMigration.panel.title": "Choisir les anciennes données d’Inklet",
+ "legacyMigration.panel.message": "Sélectionnez le dossier Inklet Data correspondant pour importer les réglages et l’historique conservés.",
+ "legacyMigration.import.progress": "Import en cours…",
+ "legacyMigration.import.invalidSelection": "Le dossier sélectionné n’est pas le dossier des anciennes données correspondant à cette application Inklet.",
+ "legacyMigration.import.failed": "Impossible d’importer les anciennes données. Vos réglages et votre historique sont toujours conservés.",
+ "legacyMigration.import.partialFailure": "Certaines anciennes données n’ont pas pu être importées. Vos réglages et votre historique sont toujours conservés.",
+ "legacyMigration.import.relaunching": "Inklet doit redémarrer pour terminer le chargement des données importées.",
+ "legacyMigration.import.relaunchProgress": "Inklet redémarre…",
+ "legacyMigration.import.relaunchFailed": "Inklet n’a pas pu redémarrer. Les données importées sont prêtes et seront chargées à la prochaine ouverture d’Inklet.",
+ "legacyMigration.action.retryRelaunch": "Redémarrer Inklet",
+ "legacyMigration.action.quit": "Quitter Inklet",
+ "legacyMigration.settings.help": "Importez vos réglages et votre historique conservés depuis le dossier Inklet Data correspondant.",
+ "settings.section.history": "Historique",
+ "settings.description.history": "Consultez les résultats d’écriture et de sélection, ainsi que les anciens résultats vocaux enregistrés localement.",
+ "settings.history.filter.all": "Tout",
+ "settings.history.source.write": "Écriture",
+ "settings.history.source.voice": "Voix",
+ "settings.history.source.selection": "Sélection",
+ "settings.history.empty": "Aucun historique enregistré pour le moment.",
+ "settings.history.original": "Original",
+ "settings.history.result": "Résultat",
+ "settings.history.copyOriginal": "Copier l’original",
+ "settings.history.copyResult": "Copier le résultat",
+ "settings.history.clear": "Effacer l’historique",
+ "settings.history.clearConfirmTitle": "Effacer l’historique ?",
+ "settings.history.clearConfirmMessage": "Tous les enregistrements d’historique de ce Mac seront supprimés. Cette action est irréversible.",
+ "settings.history.cleared": "Historique effacé.",
+ "settings.history.error.loadFailed": "Impossible de charger l’historique.",
+ "settings.history.error.clearFailed": "Impossible d’effacer l’historique.",
+ "settings.privacy.history": "• L’historique réussi d’écriture et de sélection est enregistré localement ; l’ancien historique vocal reste accessible",
+ "settings.group.writing": "Écriture",
+ "settings.group.writing.help": "Configurez Writing Assistant et son brouillon source modifiable.",
+ "settings.group.dictation": "Dictée",
+ "settings.group.dictation.help": "Maintenez le raccourci pendant que vous parlez pour envoyer le son du micro à OpenAI en temps réel.",
+ "settings.group.dictationAdvanced": "Dictée avancée",
+ "settings.row.dictationShortcut": "Raccourci à maintenir",
+ "settings.help.dictationShortcut": "Fonctionne uniquement lorsque l’éditeur source de Writing Assistant est actif. Un appui bref ne fait rien.",
+ "settings.quickStart.voice.pressAndHold": "Maintenir pour l’entrée vocale",
+ "settings.row.microphone": "Micro",
+ "settings.help.microphone": "Choisissez l’entrée audio utilisée pour la dictée en temps réel.",
+ "settings.microphone.systemDefault": "Système par défaut",
+ "settings.row.fallbackSpeechModel": "Modèle de récupération",
+ "settings.help.fallbackSpeechModel": "Modèle utilisé pour l’unique tentative de récupération après l’échec de la connexion en temps réel.",
+ "dictation.hint.hold": "Maintenez %@ pour dicter",
+ "dictation.status.connecting": "Connexion…",
+ "dictation.status.listening": "Écoute… Relâchez pour terminer",
+ "dictation.status.recordingFallback": "Connexion perdue… Continuez à parler",
+ "dictation.status.finalizing": "Finalisation de la transcription…",
+ "dictation.status.recovering": "Récupération depuis l’enregistrement temporaire…",
+ "dictation.status.ready": "Dictée prête",
+ "dictation.accessibility.ready": "La dictée est prête.",
+ "dictation.accessibility.listening": "La dictée écoute. Relâchez pour terminer.",
+ "dictation.accessibility.recordingFallback": "La connexion a été perdue. Continuez à parler pour permettre la récupération.",
+ "dictation.accessibility.finalizing": "Finalisation de la transcription de la dictée.",
+ "dictation.accessibility.recovering": "Récupération de la dictée depuis l’enregistrement temporaire.",
+ "dictation.accessibility.completed": "Dictée terminée.",
+ "dictation.accessibility.cancelled": "Dictée annulée.",
+ "dictation.accessibility.failed": "Échec de la dictée.",
+ "dictation.accessibility.sourceEditor": "Éditeur source d’écriture",
+ "dictation.undo.action": "Dictée",
+ "dictation.error.missingAPIKey": "Ajoutez une clé API OpenAI dans Réglages pour utiliser la dictée.",
+ "dictation.error.microphonePermission": "La dictée nécessite l’autorisation d’utiliser le micro.",
+ "dictation.error.noAudioInputDevice": "Aucun micro ou périphérique d’entrée audio n’est disponible.",
+ "dictation.error.recordingUnavailable": "Impossible de démarrer l’enregistrement audio.",
+ "dictation.error.realtimeBufferOverflow": "Le traitement audio en temps réel n’a pas suivi. Réessayez.",
+ "dictation.error.connection": "La connexion de transcription en temps réel a échoué.",
+ "dictation.error.connectionTimeout": "La connexion de transcription en temps réel a expiré.",
+ "dictation.error.finalTimeout": "La transcription finale en temps réel n’est pas arrivée à temps.",
+ "dictation.error.fallback": "Impossible de récupérer la dictée depuis l’enregistrement temporaire.",
+ "dictation.error.noSpeech": "Aucune parole n’a été reconnue.",
+ "settings.privacy.voice": "• Le son de dictée en temps réel et le texte de prononciation sont envoyés directement à OpenAI ; les enregistrements de récupération sont supprimés à la fin de la session",
+ "settings.section.selectionActions": "Actions de sélection",
+ "settings.description.selectionActions": "Gère les actions automatiques pour le texte sélectionné dans d'autres apps.",
+ "settings.row.selectionActionsEnabled": "Activer les actions de sélection",
+ "settings.help.selectionActionsEnabled": "Affiche un petit menu après une brève pause sur du texte sélectionné.",
+ "settings.row.forceSelectionMode": "Sélection forcée",
+ "settings.help.forceSelectionMode": "Solution de secours quand Accessibilité ne peut pas lire le texte sélectionné. La copie par menu ne simule pas de saisie clavier.",
+ "settings.forceSelection.disabled": "Désactivée",
+ "settings.forceSelection.menuCopyOnly": "Menu Copier uniquement",
+ "settings.forceSelection.menuCopyThenShortcut": "Menu Copier, puis Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, puis menu Copier",
+ "settings.row.allowSimulatedCopyFallback": "Autoriser la simulation de Cmd+C",
+ "settings.help.allowSimulatedCopyFallback": "Envoie Cmd+C à l’app au premier plan si la copie par menu est indisponible. Cela peut perturber les jeux ou apps distantes.",
+ "settings.row.translationLanguage": "Langue de traduction",
+ "settings.help.translationLanguage": "Langue utilisée par l'action Traduire du texte sélectionné.",
+ "settings.row.translationPrompt": "Prompt de traduction",
+ "settings.help.translationPrompt": "Instructions de l'action Traduire le texte sélectionné. Utilisez {targetLanguage} pour la langue choisie.",
+ "settings.translationPrompt.restoreDefault": "Rétablir par défaut",
+ "settings.row.aiPronunciation": "Voix de prononciation IA",
+ "settings.help.aiPronunciation": "Voix utilisée par Prononcer pour le texte sélectionné. Utilise OpenAI text-to-speech avec votre OpenAI API key.",
+ "settings.row.aiPronunciationSpeed": "Vitesse de prononciation IA",
+ "settings.help.aiPronunciationSpeed": "Vitesse de lecture utilisée pour Prononcer le texte sélectionné et l'apercu de la voix.",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "Apercu de la voix",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "Suivre la langue de l'interface",
+ "selection.action.translate": "Traduire",
+ "selection.action.pronounce": "Prononcer",
+ "selection.action.translating": "Traduction...",
+ "selection.action.preparingPronunciation": "Préparation audio...",
+ "selection.action.playingPronunciation": "Lecture...",
+ "selection.action.pronounceOriginal": "Lire l'original",
+ "selection.action.pronounceTranslation": "Lire la traduction",
+ "selection.action.audioLabel.original": "Orig.",
+ "selection.action.audioLabel.translation": "Trad.",
+ "selection.action.copyTranslation": "Copier la traduction",
+ "selection.action.retry": "Réessayer",
+ "selection.action.unsupportedTitle": "Texte sélectionné indisponible",
+ "selection.action.unsupportedMessage": "L'app actuelle n'expose pas le texte sélectionné à Inklet.",
+ "selection.action.missingOpenAIKey": "Ajoutez une OpenAI API key dans Réglages pour utiliser la prononciation IA.",
+ "selection.action.translationFailed": "La traduction a échoué.",
+ "selection.action.pronunciationFailed": "La prononciation a échoué.",
+ "about.tagline": "Transformez vos idées en textes clairs",
+ "about.website": "Site web",
+ "about.privacyPolicy": "Politique de confidentialité",
+ "about.support": "Assistance",
+ "language.system": "Système",
+ "settings.window.title": "Réglages de Inklet",
+ "settings.sidebar.preferences": "Préférences",
+ "settings.sidebar.hint": "Auto-enregistré · ⌘, Ouvrir",
+ "settings.section.general": "Général",
+ "settings.section.providers": "Fournisseurs",
+ "settings.section.promptModes": "Modes de prompt",
+ "settings.section.permissions": "Autorisations",
+ "settings.description.general": "Comportement, raccourci, langue d’interface et paramètres de génération.",
+ "settings.description.providers": "Choisissez un fournisseur LLM, un modèle et une clé API.",
+ "settings.description.promptModes": "Gérez les modes de conversion et les prompts système.",
+ "settings.description.permissions": "Vérifiez l’autorisation macOS nécessaire pour insérer du texte.",
+ "settings.row.language": "Langue de l’interface",
+ "settings.help.language": "System suit la langue de macOS.",
+ "settings.row.hotkey": "Raccourci",
+ "settings.help.timeout": "Durée maximale de la requête.",
+ "settings.seconds": "%d s",
+ "settings.help.provider": "Fournisseur actuel.",
+ "settings.help.apiKey": "Enregistrée localement sur ce Mac.",
+ "settings.help.model.default": "Par défaut : %@",
+ "settings.mode.untitled": "Mode sans titre",
+ "settings.mode.pick": "Sélectionnez un mode de prompt",
+ "settings.help.name": "Nom affiché dans le panneau.",
+ "settings.help.description": "Rôle de ce mode.",
+ "settings.characters": "%d caractères",
+ "settings.permission.authorized": "Accessibility autorisé",
+ "settings.permission.required": "Autorisation Accessibility requise",
+ "settings.permission.description": "Cliquez sur Ouvrir les réglages, puis sur +, choisissez /Applications/Inklet.app et activez Inklet.",
+ "settings.permission.open": "Ouvrir les réglages système",
+ "settings.footer.pending": "Les changements sont enregistrés automatiquement et s’appliquent à la prochaine ouverture du panneau.",
+ "settings.save": "Enregistrer",
+ "settings.saved": "Enregistré",
+ "settings.error.visibleModeRequired": "Conservez au moins un mode visible.",
+ "settings.error.modelRequired": "Model ne peut pas être vide.",
+ "settings.error.openAccessibility": "Impossible d’ouvrir les réglages Accessibility.",
+ "settings.error.saveFailed": "Échec de l’enregistrement : %@",
+ "popover.input.placeholder": "Saisissez le texte à transformer ou insérer",
+ "popover.modeSearch.placeholder": "Rechercher des modes",
+ "popover.modeSearch.empty": "Aucun mode correspondant",
+ "popover.modeSearch.select": "Sélectionner",
+ "popover.modeSearch.write": "Écrire",
+ "popover.result.title": "Résultat",
+ "popover.result.editable": "Modifiable avant insertion",
+ "popover.result.generatedWith": "Généré avec %@",
+ "popover.mode.picker": "Mode",
+ "popover.mode.backToModes": "Choisir un mode",
+ "popover.action.transform": "Transformer",
+ "popover.action.regenerate": "Régénérer",
+ "popover.action.insert": "Insérer",
+ "popover.action.insertOriginal": "Insérer l’original",
+ "popover.hint.transformInsert": "Transformer/Insérer",
+ "popover.hint.original": "Original",
+ "popover.hint.accessibility": "Raccourcis : Enter transforme ou insère, Command Enter insère l’original, Escape revient ou ferme",
+ "popover.busy.inserting": "Insertion...",
+ "popover.busy.transforming": "Transformation...",
+ "popover.error.emptyOriginal": "Saisissez le texte à insérer.",
+ "popover.error.missingTarget": "Impossible de trouver l’app cible pour insérer le texte.",
+ "popover.error.missingAPIKey": "Configurez la clé API %@ dans les réglages.",
+ "insertion.error.accessibility": "Activez l’autorisation Accessibility avant d’insérer du texte.",
+ "insertion.error.activation": "Impossible de revenir à l’app d’origine. Réessayez.",
+ "insertion.error.pasteEvent": "Impossible d’envoyer le raccourci Coller.",
+ "insertion.error.clipboardRestore": "Texte inséré, mais restauration du presse-papiers impossible.",
+ "error.emptySource": "Saisissez le texte à transformer.",
+ "error.emptyResponse": "Le modèle a renvoyé une réponse vide.",
+ "error.timeout": "La requête a expiré. Réessayez.",
+ "error.networkConnectionLost": "La connexion réseau a été interrompue. Réessayez.",
+ "error.provider.urlInvalid": "La requête %@ a échoué : URL invalide",
+ "error.provider.httpUnknown": "La requête %@ a échoué : HTTP unknown",
+ "error.provider.prefix": "La requête %@ a échoué : %@",
+ "hotkey.error.unsupported": "Raccourci non pris en charge “%@”. Pris en charge : ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
+ "hotkey.error.registrationFailed": "Échec d’enregistrement du raccourci (%d).",
+ "prompt.custom.description": "Utilise votre prompt personnalisé",
+ "appearance.dark": "Sombre",
+ "appearance.light": "Clair",
+ "appearance.system": "Système",
+ "popover.hint.back": "Retour",
+ "popover.hint.close": "Fermer",
+ "popover.hint.mode": "Mode",
+ "popover.hint.newLine": "Nouvelle ligne",
+ "popover.status.preview": "Aperçu",
+ "popover.status.ready": "Prêt",
+ "prompt.chineseSummary.description": "Résumer tout texte en chinois simplifié de façon concise",
+ "prompt.friendlyReply.description": "Reformuler en une réponse naturelle et amicale",
+ "prompt.improveWriting.description": "Améliorer la rédaction en conservant la langue d’origine",
+ "prompt.makeConcise.description": "Raccourcir le texte en conservant la langue d’origine et les points clés",
+ "prompt.professionalTone.description": "Reformuler dans un ton plus clair et professionnel",
+ "prompt.simpleCorrectEnglish.description": "Reformuler ou traduire en anglais simple et correct",
+ "prompt.translateToEnglish.description": "Reformuler ou traduire en anglais simple et correct",
+ "settings.cancel": "Annuler",
+ "settings.description.about": "Raccourcis clavier, confidentialité et informations sur l’app.",
+ "settings.description.selectionAssistant": "Outils de traduction et de prononciation du texte sélectionné dans d’autres apps.",
+ "settings.description.writeAssistant": "Configurer la rédaction, la dictée, la génération et les modes d’instructions.",
+ "settings.error.endpointInvalid": "Le point de terminaison doit être une URL HTTP valide.",
+ "settings.error.promptModeRequired": "Conservez au moins un mode d’instructions.",
+ "settings.help.appearance": "Choisir Clair, Sombre ou suivre macOS.",
+ "settings.help.endpoint": "URL complète de /chat/completions compatible avec OpenAI.",
+ "settings.help.hotkey": "Par exemple : ⌥Space, Option+Space, Cmd+Space.",
+ "settings.help.openAIAPIKey": "Stockée sur ce Mac et partagée par la rédaction, la dictée en temps réel, la traduction et la prononciation. Videz le champ pour la supprimer.",
+ "settings.hotkey.pressKey": " touche",
+ "settings.hotkey.record": "Enregistrer un raccourci",
+ "settings.hotkey.recording": "Appuyez sur le raccourci",
+ "settings.mode.add": "Ajouter un mode",
+ "settings.mode.delete": "Supprimer le mode",
+ "settings.mode.deleteConfirmMessage": "Supprimer « %@ » ? Cette action est irréversible.",
+ "settings.mode.deleteConfirmTitle": "Supprimer le mode d’instructions ?",
+ "settings.mode.dragToSort": "Faire glisser pour réorganiser",
+ "settings.mode.hidden": "Masqué",
+ "settings.mode.moveDown": "Déplacer vers le bas",
+ "settings.mode.moveUp": "Déplacer vers le haut",
+ "settings.mode.newDescription": "Mode de transformation personnalisé",
+ "settings.mode.newName": "Nouveau mode",
+ "settings.mode.visible": "Visible",
+ "settings.mode.visibleInMenu": "Afficher dans le menu",
+ "settings.mode.visibleInMenuHelp": "Afficher ce mode dans le sélecteur de modes.",
+ "settings.model.custom": "Personnalisé…",
+ "settings.model.customized": "Modèle personnalisé *",
+ "settings.model.refreshing": "Actualisation des modèles…",
+ "settings.permission.accessibility": "Accessibilité",
+ "settings.permission.openShort": "Ouvrir les réglages",
+ "settings.privacy.clipboard": "• Le presse-papiers est restauré après l’insertion et la lecture par sélection forcée",
+ "settings.privacy.keychain": "• Les clés API sont stockées sur ce Mac",
+ "settings.privacy.provider": "• Le texte est envoyé directement à OpenAI",
+ "settings.privacy.title": "Confidentialité et sécurité",
+ "settings.provider.active": "Actif",
+ "settings.provider.configured": "Configuré",
+ "settings.provider.notConfigured": "Non configuré",
+ "settings.provider.notLoaded": "Les clés enregistrées ne sont pas affichées",
+ "settings.provider.pendingKey": "Nouvelle clé prête à être enregistrée",
+ "settings.provider.pendingSave": "En attente d’enregistrement",
+ "settings.provider.saved": "Enregistré",
+ "settings.provider.savedLocally": "Enregistré localement",
+ "settings.quickStart.close": "Revenir ou fermer",
+ "settings.quickStart.help": "Actions courantes dans la fenêtre contextuelle.",
+ "settings.quickStart.open": "Ouvrir Inklet",
+ "settings.quickStart.original": "Insérer le texte original",
+ "settings.quickStart.submit": "Transformer ou insérer le résultat",
+ "settings.quickStart.title": "Raccourcis clavier",
+ "settings.row.apiKey": "Clé API",
+ "settings.row.appearance": "Apparence",
+ "settings.row.description": "Description",
+ "settings.row.endpoint": "Point de terminaison",
+ "settings.row.model": "Modèle",
+ "settings.row.name": "Nom",
+ "settings.row.openAIAPIKey": "Clé API OpenAI",
+ "settings.row.provider": "Fournisseur",
+ "settings.row.systemPrompt": "Instructions",
+ "settings.row.timeout": "Délai d’attente",
+ "settings.section.about": "À propos",
+ "settings.section.selectionAssistant": "Assistant de sélection",
+ "settings.section.writeAssistant": "Assistant de rédaction",
+ "settings.systemPermissions.title": "Autorisations système",
+ "settings.version": "Version %@",
+ "settings.voice.shortcut.disabled": "Désactivé",
+ "settings.voice.shortcut.leftCommand": "Command gauche",
+ "settings.voice.shortcut.leftOption": "Option gauche",
+ "settings.voice.shortcut.rightCommand": "Command droit",
+ "settings.voice.shortcut.rightOption": "Option droit",
+ "setup.done": "Terminé",
+ "setup.menubar.description": "Cliquez sur l’icône Inklet près de l’horloge pour l’ouvrir à tout moment.",
+ "setup.menubar.title": "Retrouvez Inklet dans la barre des menus",
+ "setup.shortcut.description": "Le raccourci par défaut est %@. En cas de conflit avec une autre app, modifiez-le dans les réglages.",
+ "setup.shortcut.title": "Utilisez le raccourci",
+ "setup.subtitle": "Inklet s’exécute dans la barre des menus. Autorisez l’accessibilité pour qu’il puisse insérer du texte dans l’app que vous utilisez.",
+ "setup.title": "Inklet est prêt",
+ "setup.window.title": "Bienvenue dans Inklet"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+it.swift b/Sources/InkletApp/Localization/L10n+it.swift
new file mode 100644
index 0000000..7063a9d
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+it.swift
@@ -0,0 +1,317 @@
+// Italian interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let it: [String: String] = [
+ "app.menu.edit": "Modifica",
+ "app.menu.undo": "Annulla",
+ "app.menu.redo": "Ripristina",
+ "app.menu.cut": "Taglia",
+ "app.menu.copy": "Copia",
+ "app.menu.paste": "Incolla",
+ "app.menu.pasteAndMatchStyle": "Incolla e adatta lo stile",
+ "app.menu.delete": "Elimina",
+ "app.menu.selectAll": "Seleziona tutto",
+ "app.menu.openPopover": "Apri Inklet",
+ "app.menu.settings": "Impostazioni",
+ "app.menu.about": "Informazioni su Inklet",
+ "app.menu.quit": "Esci",
+ "app.menu.checkForUpdates": "Cerca aggiornamenti…",
+ "app.menu.checkingForUpdates": "Ricerca aggiornamenti…",
+ "update.available.title": "È disponibile un aggiornamento di Inklet",
+ "update.available.latestVersion": "Più recente: %@ (build %@)",
+ "update.available.currentVersion": "Attuale: %@",
+ "update.available.noNotes": "Visualizza la release su GitHub per i dettagli.",
+ "update.action.viewOnGitHub": "Visualizza su GitHub",
+ "update.action.later": "Più tardi",
+ "update.upToDate.title": "Inklet è aggiornato",
+ "update.upToDate.message": "Stai usando %@.",
+ "update.error.title": "Impossibile cercare aggiornamenti",
+ "update.error.message": "Riprova tra poco.",
+ "update.action.retry": "Riprova",
+ "update.action.cancel": "Annulla",
+ "update.action.ok": "OK",
+ "legacyMigration.notice.title": "I vecchi dati di Inklet non sono stati importati",
+ "legacyMigration.notice.message": "Le impostazioni e la cronologia precedenti sono ancora conservate. Puoi scegliere la cartella Inklet Data corrispondente per importarle.",
+ "legacyMigration.action.importOldData": "Importa vecchi dati…",
+ "legacyMigration.panel.title": "Seleziona i vecchi dati di Inklet",
+ "legacyMigration.panel.message": "Seleziona la cartella Inklet Data corrispondente per importare le impostazioni e la cronologia conservate.",
+ "legacyMigration.import.progress": "Importazione in corso",
+ "legacyMigration.import.invalidSelection": "La cartella selezionata non è la cartella dei vecchi dati corrispondente a questa applicazione Inklet.",
+ "legacyMigration.import.failed": "Impossibile importare i vecchi dati. Le impostazioni e la cronologia sono ancora conservate.",
+ "legacyMigration.import.partialFailure": "Non è stato possibile importare alcuni vecchi dati. Le impostazioni e la cronologia sono ancora conservate.",
+ "legacyMigration.import.relaunching": "Inklet deve essere riavviato per completare il caricamento dei dati importati.",
+ "legacyMigration.import.relaunchProgress": "Riavvio di Inklet…",
+ "legacyMigration.import.relaunchFailed": "Non è stato possibile riavviare Inklet. I dati importati sono pronti e verranno caricati alla prossima apertura di Inklet.",
+ "legacyMigration.action.retryRelaunch": "Riavvia Inklet",
+ "legacyMigration.action.quit": "Esci da Inklet",
+ "legacyMigration.settings.help": "Importa le impostazioni e la cronologia conservate dalla cartella Inklet Data corrispondente.",
+ "settings.section.history": "Cronologia",
+ "settings.description.history": "Rivedi i risultati di scrittura e selezione, oltre ai vecchi risultati vocali salvati localmente.",
+ "settings.history.filter.all": "Tutto",
+ "settings.history.source.write": "Scrittura",
+ "settings.history.source.voice": "Voce",
+ "settings.history.source.selection": "Selezione",
+ "settings.history.empty": "Nessuna cronologia salvata.",
+ "settings.history.original": "Originale",
+ "settings.history.result": "Risultato",
+ "settings.history.copyOriginal": "Copia originale",
+ "settings.history.copyResult": "Copia risultato",
+ "settings.history.clear": "Cancella cronologia",
+ "settings.history.clearConfirmTitle": "Cancellare la cronologia?",
+ "settings.history.clearConfirmMessage": "Questo elimina da questo Mac tutti i record salvati della cronologia. L’azione non può essere annullata.",
+ "settings.history.cleared": "Cronologia cancellata.",
+ "settings.history.error.loadFailed": "Impossibile caricare la cronologia.",
+ "settings.history.error.clearFailed": "Impossibile cancellare la cronologia.",
+ "settings.privacy.history": "• La cronologia riuscita di scrittura e selezione viene salvata localmente; la vecchia cronologia vocale resta consultabile",
+ "settings.group.writing": "Scrittura",
+ "settings.group.writing.help": "Configura Writing Assistant e la relativa bozza sorgente modificabile.",
+ "settings.group.dictation": "Dettatura",
+ "settings.group.dictation.help": "Tieni premuta la scorciatoia mentre parli per inviare l’audio del microfono a OpenAI in tempo reale.",
+ "settings.group.dictationAdvanced": "Dettatura avanzata",
+ "settings.row.dictationShortcut": "Scorciatoia da tenere premuta",
+ "settings.help.dictationShortcut": "Funziona solo quando l’editor sorgente di Writing Assistant è attivo. Una pressione breve non esegue alcuna azione.",
+ "settings.quickStart.voice.pressAndHold": "Tieni premuto per input vocale",
+ "settings.row.microphone": "Microfono",
+ "settings.help.microphone": "Scegli l’ingresso audio usato per la dettatura in tempo reale.",
+ "settings.microphone.systemDefault": "Predefinito di sistema",
+ "settings.row.fallbackSpeechModel": "Modello di recupero",
+ "settings.help.fallbackSpeechModel": "Modello usato per l’unico tentativo di recupero dopo un errore della connessione in tempo reale.",
+ "dictation.hint.hold": "Tieni premuto %@ per dettare",
+ "dictation.status.connecting": "Connessione…",
+ "dictation.status.listening": "In ascolto… Rilascia per terminare",
+ "dictation.status.recordingFallback": "Connessione persa… Continua a parlare",
+ "dictation.status.finalizing": "Completamento della trascrizione…",
+ "dictation.status.recovering": "Recupero dalla registrazione temporanea…",
+ "dictation.status.ready": "Dettatura pronta",
+ "dictation.accessibility.ready": "La dettatura è pronta.",
+ "dictation.accessibility.listening": "La dettatura è in ascolto. Rilascia per terminare.",
+ "dictation.accessibility.recordingFallback": "La connessione è stata persa. Continua a parlare per consentire il recupero.",
+ "dictation.accessibility.finalizing": "Completamento della trascrizione della dettatura.",
+ "dictation.accessibility.recovering": "Recupero della dettatura dalla registrazione temporanea.",
+ "dictation.accessibility.completed": "Dettatura completata.",
+ "dictation.accessibility.cancelled": "Dettatura annullata.",
+ "dictation.accessibility.failed": "Dettatura non riuscita.",
+ "dictation.accessibility.sourceEditor": "Editor sorgente di scrittura",
+ "dictation.undo.action": "Dettatura",
+ "dictation.error.missingAPIKey": "Aggiungi una chiave API OpenAI nelle Impostazioni per usare la dettatura.",
+ "dictation.error.microphonePermission": "La dettatura richiede l’autorizzazione del microfono.",
+ "dictation.error.noAudioInputDevice": "Non è disponibile alcun microfono o dispositivo di ingresso audio.",
+ "dictation.error.recordingUnavailable": "Impossibile avviare la registrazione audio.",
+ "dictation.error.realtimeBufferOverflow": "L’elaborazione dell’audio in tempo reale non è riuscita a tenere il passo. Riprova.",
+ "dictation.error.connection": "La connessione per la trascrizione in tempo reale non è riuscita.",
+ "dictation.error.connectionTimeout": "La connessione per la trascrizione in tempo reale è scaduta.",
+ "dictation.error.finalTimeout": "La trascrizione finale in tempo reale non è arrivata in tempo.",
+ "dictation.error.fallback": "Impossibile recuperare la dettatura dalla registrazione temporanea.",
+ "dictation.error.noSpeech": "Non è stato riconosciuto alcun parlato.",
+ "settings.privacy.voice": "• L’audio della dettatura in tempo reale e il testo di pronuncia vengono inviati direttamente a OpenAI; le registrazioni di recupero vengono eliminate al termine della sessione",
+ "settings.section.selectionActions": "Azioni di selezione",
+ "settings.description.selectionActions": "Gestisci azioni automatiche per il testo selezionato in altre app.",
+ "settings.row.selectionActionsEnabled": "Abilita azioni di selezione",
+ "settings.help.selectionActionsEnabled": "Mostra un piccolo menu dopo una breve pausa sul testo selezionato.",
+ "settings.row.forceSelectionMode": "Selezione forzata",
+ "settings.help.forceSelectionMode": "Alternativa quando Accessibilità non riesce a leggere il testo selezionato. La copia dal menu non simula input da tastiera.",
+ "settings.forceSelection.disabled": "Disattivata",
+ "settings.forceSelection.menuCopyOnly": "Solo copia dal menu",
+ "settings.forceSelection.menuCopyThenShortcut": "Menu Copia, poi Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, poi menu Copia",
+ "settings.row.allowSimulatedCopyFallback": "Consenti Cmd+C simulato",
+ "settings.help.allowSimulatedCopyFallback": "Invia Cmd+C all’app in primo piano quando Copia dal menu non è disponibile. Può interferire con giochi o app remote.",
+ "settings.row.translationLanguage": "Lingua di traduzione",
+ "settings.help.translationLanguage": "Lingua usata dall'azione Traduci sul testo selezionato.",
+ "settings.row.translationPrompt": "Prompt di traduzione",
+ "settings.help.translationPrompt": "Istruzioni per Traduci sul testo selezionato. Usa {targetLanguage} per la lingua scelta.",
+ "settings.translationPrompt.restoreDefault": "Ripristina predefinito",
+ "settings.row.aiPronunciation": "Voce pronuncia IA",
+ "settings.help.aiPronunciation": "Voce usata da Pronuncia per il testo selezionato. Usa OpenAI text-to-speech con la tua OpenAI API key.",
+ "settings.row.aiPronunciationSpeed": "Velocita pronuncia IA",
+ "settings.help.aiPronunciationSpeed": "Velocita di riproduzione usata per Pronuncia del testo selezionato e anteprima voce.",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "Anteprima voce",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "Segui lingua dell'interfaccia",
+ "selection.action.translate": "Traduci",
+ "selection.action.pronounce": "Pronuncia",
+ "selection.action.translating": "Traduzione...",
+ "selection.action.preparingPronunciation": "Preparazione audio...",
+ "selection.action.playingPronunciation": "Riproduzione...",
+ "selection.action.pronounceOriginal": "Riproduci originale",
+ "selection.action.pronounceTranslation": "Riproduci traduzione",
+ "selection.action.audioLabel.original": "Orig.",
+ "selection.action.audioLabel.translation": "Trad.",
+ "selection.action.copyTranslation": "Copia traduzione",
+ "selection.action.retry": "Riprova",
+ "selection.action.unsupportedTitle": "Testo selezionato non disponibile",
+ "selection.action.unsupportedMessage": "L'app attuale non espone il testo selezionato a Inklet.",
+ "selection.action.missingOpenAIKey": "Aggiungi una OpenAI API key nelle Impostazioni per usare la pronuncia IA.",
+ "selection.action.translationFailed": "Traduzione non riuscita.",
+ "selection.action.pronunciationFailed": "Pronuncia non riuscita.",
+ "about.tagline": "Trasforma le tue idee in testi chiari",
+ "about.website": "Sito web",
+ "about.privacyPolicy": "Informativa sulla privacy",
+ "about.support": "Supporto",
+ "language.system": "Sistema",
+ "settings.window.title": "Impostazioni Inklet",
+ "settings.sidebar.preferences": "Preferenze",
+ "settings.sidebar.hint": "Salvataggio automatico · ⌘, Apri",
+ "settings.section.general": "Generale",
+ "settings.section.providers": "Provider",
+ "settings.section.promptModes": "Modalità prompt",
+ "settings.section.permissions": "Permessi",
+ "settings.description.general": "Comportamento, scorciatoia, lingua dell’interfaccia e parametri di generazione.",
+ "settings.description.providers": "Scegli provider LLM, modello e API key.",
+ "settings.description.promptModes": "Gestisci modalità di conversione e prompt di sistema.",
+ "settings.description.permissions": "Controlla il permesso macOS necessario per inserire testo.",
+ "settings.row.language": "Lingua interfaccia",
+ "settings.help.language": "System segue la lingua di macOS.",
+ "settings.row.hotkey": "Scorciatoia",
+ "settings.help.timeout": "Durata massima della richiesta.",
+ "settings.seconds": "%d s",
+ "settings.help.provider": "Provider attuale.",
+ "settings.help.apiKey": "Salvata localmente su questo Mac.",
+ "settings.help.model.default": "Predefinito: %@",
+ "settings.mode.untitled": "Modalità senza titolo",
+ "settings.mode.pick": "Seleziona una modalità prompt",
+ "settings.help.name": "Nome mostrato nel pannello.",
+ "settings.help.description": "Cosa fa questa modalità.",
+ "settings.characters": "%d caratteri",
+ "settings.permission.authorized": "Accessibility autorizzato",
+ "settings.permission.required": "Permesso Accessibility richiesto",
+ "settings.permission.description": "Fai clic su Apri Impostazioni, fai clic su +, scegli /Applications/Inklet.app e abilita Inklet.",
+ "settings.permission.open": "Apri Impostazioni di Sistema",
+ "settings.footer.pending": "Le modifiche vengono salvate automaticamente e si applicano alla prossima apertura del pannello.",
+ "settings.save": "Salva",
+ "settings.saved": "Salvato",
+ "settings.error.visibleModeRequired": "Mantieni almeno una modalità visibile.",
+ "settings.error.modelRequired": "Model non può essere vuoto.",
+ "settings.error.openAccessibility": "Impossibile aprire Accessibility.",
+ "settings.error.saveFailed": "Salvataggio non riuscito: %@",
+ "popover.input.placeholder": "Inserisci testo da trasformare o inserire",
+ "popover.modeSearch.placeholder": "Cerca modalità",
+ "popover.modeSearch.empty": "Nessuna modalità corrispondente",
+ "popover.modeSearch.select": "Seleziona",
+ "popover.modeSearch.write": "Scrivi",
+ "popover.result.title": "Risultato",
+ "popover.result.editable": "Modificabile prima dell’inserimento",
+ "popover.result.generatedWith": "Generato con %@",
+ "popover.mode.picker": "Modalità",
+ "popover.mode.backToModes": "Scegli modalità",
+ "popover.action.transform": "Trasforma",
+ "popover.action.regenerate": "Rigenera",
+ "popover.action.insert": "Inserisci",
+ "popover.action.insertOriginal": "Inserisci originale",
+ "popover.hint.transformInsert": "Trasforma/Inserisci",
+ "popover.hint.original": "Originale",
+ "popover.hint.accessibility": "Scorciatoie: Enter trasforma o inserisce, Command Enter inserisce l’originale, Escape torna indietro o chiude",
+ "popover.busy.inserting": "Inserimento...",
+ "popover.busy.transforming": "Trasformazione...",
+ "popover.error.emptyOriginal": "Inserisci testo da inserire.",
+ "popover.error.missingTarget": "Impossibile trovare l’app di destinazione.",
+ "popover.error.missingAPIKey": "Configura la API Key di %@ nelle Impostazioni.",
+ "insertion.error.accessibility": "Abilita il permesso Accessibility prima di inserire testo.",
+ "insertion.error.activation": "Impossibile tornare all’app originale. Riprova.",
+ "insertion.error.pasteEvent": "Impossibile inviare la scorciatoia Incolla.",
+ "insertion.error.clipboardRestore": "Testo inserito, ma impossibile ripristinare gli appunti.",
+ "error.emptySource": "Inserisci testo da trasformare.",
+ "error.emptyResponse": "Il modello ha restituito una risposta vuota.",
+ "error.timeout": "La richiesta è scaduta. Riprova.",
+ "error.networkConnectionLost": "La connessione di rete è stata interrotta. Riprova.",
+ "error.provider.urlInvalid": "Richiesta %@ non riuscita: URL non valido",
+ "error.provider.httpUnknown": "Richiesta %@ non riuscita: HTTP unknown",
+ "error.provider.prefix": "Richiesta %@ non riuscita: %@",
+ "hotkey.error.unsupported": "Scorciatoia non supportata “%@”. Supportate: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
+ "hotkey.error.registrationFailed": "Registrazione scorciatoia non riuscita (%d).",
+ "prompt.custom.description": "Usa il tuo prompt personalizzato",
+ "appearance.dark": "Scuro",
+ "appearance.light": "Chiaro",
+ "appearance.system": "Sistema",
+ "popover.hint.back": "Indietro",
+ "popover.hint.close": "Chiudi",
+ "popover.hint.mode": "Modalità",
+ "popover.hint.newLine": "Nuova riga",
+ "popover.status.preview": "Anteprima",
+ "popover.status.ready": "Pronto",
+ "prompt.chineseSummary.description": "Riassumi qualsiasi testo in cinese semplificato in modo conciso",
+ "prompt.friendlyReply.description": "Riscrivi come una risposta naturale e cordiale",
+ "prompt.improveWriting.description": "Migliora la scrittura mantenendo la lingua originale",
+ "prompt.makeConcise.description": "Abbrevia il testo mantenendo la lingua originale e i punti chiave",
+ "prompt.professionalTone.description": "Riscrivi con un tono più chiaro e professionale",
+ "prompt.simpleCorrectEnglish.description": "Riscrivi o traduci in un inglese semplice e corretto",
+ "prompt.translateToEnglish.description": "Riscrivi o traduci in un inglese semplice e corretto",
+ "settings.cancel": "Annulla",
+ "settings.description.about": "Scorciatoie da tastiera, privacy e informazioni sull’app.",
+ "settings.description.selectionAssistant": "Strumenti di traduzione e pronuncia per il testo selezionato in altre app.",
+ "settings.description.writeAssistant": "Configura scrittura, dettatura, generazione e modalità dei prompt.",
+ "settings.error.endpointInvalid": "L’endpoint deve essere un URL HTTP valido.",
+ "settings.error.promptModeRequired": "Mantieni almeno una modalità di prompt.",
+ "settings.help.appearance": "Scegli Chiaro, Scuro o segui macOS.",
+ "settings.help.endpoint": "URL completo di /chat/completions compatibile con OpenAI.",
+ "settings.help.hotkey": "Ad esempio: ⌥Space, Option+Space, Cmd+Space.",
+ "settings.help.openAIAPIKey": "Memorizzata su questo Mac e condivisa tra scrittura, dettatura in tempo reale, traduzione e pronuncia. Svuota il campo per rimuoverla.",
+ "settings.hotkey.pressKey": " tasto",
+ "settings.hotkey.record": "Registra scorciatoia",
+ "settings.hotkey.recording": "Premi la scorciatoia",
+ "settings.mode.add": "Aggiungi modalità",
+ "settings.mode.delete": "Elimina modalità",
+ "settings.mode.deleteConfirmMessage": "Eliminare “%@”? Questa azione non può essere annullata.",
+ "settings.mode.deleteConfirmTitle": "Eliminare la modalità di prompt?",
+ "settings.mode.dragToSort": "Trascina per riordinare",
+ "settings.mode.hidden": "Nascosto",
+ "settings.mode.moveDown": "Sposta giù",
+ "settings.mode.moveUp": "Sposta su",
+ "settings.mode.newDescription": "Modalità di trasformazione personalizzata",
+ "settings.mode.newName": "Nuova modalità",
+ "settings.mode.visible": "Visibile",
+ "settings.mode.visibleInMenu": "Mostra nel menu",
+ "settings.mode.visibleInMenuHelp": "Mostra questa modalità nel selettore.",
+ "settings.model.custom": "Personalizzato…",
+ "settings.model.customized": "Modello personalizzato *",
+ "settings.model.refreshing": "Aggiornamento modelli…",
+ "settings.permission.accessibility": "Accessibilità",
+ "settings.permission.openShort": "Apri impostazioni",
+ "settings.privacy.clipboard": "• Gli appunti vengono ripristinati dopo l’inserimento e la lettura tramite selezione forzata",
+ "settings.privacy.keychain": "• Le chiavi API sono memorizzate su questo Mac",
+ "settings.privacy.provider": "• Il testo viene inviato direttamente a OpenAI",
+ "settings.privacy.title": "Privacy e sicurezza",
+ "settings.provider.active": "Attivo",
+ "settings.provider.configured": "Configurato",
+ "settings.provider.notConfigured": "Non configurato",
+ "settings.provider.notLoaded": "Le chiavi salvate non vengono mostrate",
+ "settings.provider.pendingKey": "Nuova chiave pronta per il salvataggio",
+ "settings.provider.pendingSave": "In attesa di salvataggio",
+ "settings.provider.saved": "Salvato",
+ "settings.provider.savedLocally": "Salvato localmente",
+ "settings.quickStart.close": "Torna indietro o chiudi",
+ "settings.quickStart.help": "Azioni comuni nel popover.",
+ "settings.quickStart.open": "Apri Inklet",
+ "settings.quickStart.original": "Inserisci testo originale",
+ "settings.quickStart.submit": "Trasforma o inserisci il risultato",
+ "settings.quickStart.title": "Scorciatoie da tastiera",
+ "settings.row.apiKey": "Chiave API",
+ "settings.row.appearance": "Aspetto",
+ "settings.row.description": "Descrizione",
+ "settings.row.endpoint": "Endpoint",
+ "settings.row.model": "Modello",
+ "settings.row.name": "Nome",
+ "settings.row.openAIAPIKey": "Chiave API OpenAI",
+ "settings.row.provider": "Fornitore",
+ "settings.row.systemPrompt": "Prompt",
+ "settings.row.timeout": "Tempo limite",
+ "settings.section.about": "Informazioni",
+ "settings.section.selectionAssistant": "Assistente di selezione",
+ "settings.section.writeAssistant": "Assistente di scrittura",
+ "settings.systemPermissions.title": "Permessi di sistema",
+ "settings.version": "Versione %@",
+ "settings.voice.shortcut.disabled": "Disattivato",
+ "settings.voice.shortcut.leftCommand": "Command sinistro",
+ "settings.voice.shortcut.leftOption": "Option sinistro",
+ "settings.voice.shortcut.rightCommand": "Command destro",
+ "settings.voice.shortcut.rightOption": "Option destro",
+ "setup.done": "Fine",
+ "setup.menubar.description": "Fai clic sull’icona di Inklet accanto all’orologio per aprirlo quando vuoi.",
+ "setup.menubar.title": "Trova Inklet nella barra dei menu",
+ "setup.shortcut.description": "La scorciatoia predefinita è %@. Se è in conflitto con un’altra app, cambiala nelle Impostazioni.",
+ "setup.shortcut.title": "Usa la scorciatoia",
+ "setup.subtitle": "Inklet è nella barra dei menu. Concedi il permesso di Accessibilità per inserire testo nell’app che stai usando.",
+ "setup.title": "Inklet è pronto",
+ "setup.window.title": "Benvenuto in Inklet"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+ja.swift b/Sources/InkletApp/Localization/L10n+ja.swift
new file mode 100644
index 0000000..5b36dc6
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+ja.swift
@@ -0,0 +1,317 @@
+// Japanese interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let ja: [String: String] = [
+ "app.menu.edit": "編集",
+ "app.menu.undo": "取り消す",
+ "app.menu.redo": "やり直す",
+ "app.menu.cut": "カット",
+ "app.menu.copy": "コピー",
+ "app.menu.paste": "ペースト",
+ "app.menu.pasteAndMatchStyle": "ペーストしてスタイルを合わせる",
+ "app.menu.delete": "削除",
+ "app.menu.selectAll": "すべてを選択",
+ "app.menu.openPopover": "Inklet を開く",
+ "app.menu.settings": "設定",
+ "app.menu.about": "Inklet について",
+ "app.menu.quit": "終了",
+ "app.menu.checkForUpdates": "アップデートを確認…",
+ "app.menu.checkingForUpdates": "アップデートを確認中…",
+ "update.available.title": "Inklet のアップデートがあります",
+ "update.available.latestVersion": "最新: %@(ビルド %@)",
+ "update.available.currentVersion": "現在: %@",
+ "update.available.noNotes": "詳細はGitHubのリリースをご覧ください。",
+ "update.action.viewOnGitHub": "GitHubで表示",
+ "update.action.later": "後で",
+ "update.upToDate.title": "Inkletは最新です",
+ "update.upToDate.message": "%@ を使用しています。",
+ "update.error.title": "アップデートを確認できませんでした",
+ "update.error.message": "しばらくしてから、もう一度お試しください。",
+ "update.action.retry": "再試行",
+ "update.action.cancel": "キャンセル",
+ "update.action.ok": "OK",
+ "legacyMigration.notice.title": "以前の Inklet データはインポートされていません",
+ "legacyMigration.notice.message": "以前の設定と履歴はそのまま保持されています。対応する Inklet Data フォルダを選択してインポートできます。",
+ "legacyMigration.action.importOldData": "旧データをインポート…",
+ "legacyMigration.panel.title": "以前の Inklet データを選択",
+ "legacyMigration.panel.message": "保持されている設定と履歴をインポートするには、対応する Inklet Data フォルダを選択してください。",
+ "legacyMigration.import.progress": "旧データを移行中…",
+ "legacyMigration.import.invalidSelection": "選択したフォルダは、この Inklet アプリに対応する以前のデータフォルダではありません。",
+ "legacyMigration.import.failed": "以前のデータをインポートできませんでした。設定と履歴はそのまま保持されています。",
+ "legacyMigration.import.partialFailure": "一部の以前のデータをインポートできませんでした。設定と履歴はそのまま保持されています。",
+ "legacyMigration.import.relaunching": "インポートしたデータの読み込みを完了するため、Inklet を再起動する必要があります。",
+ "legacyMigration.import.relaunchProgress": "Inklet を再起動中…",
+ "legacyMigration.import.relaunchFailed": "Inklet を再起動できませんでした。インポートしたデータは準備済みで、次回 Inklet を開いたときに読み込まれます。",
+ "legacyMigration.action.retryRelaunch": "Inklet を再起動",
+ "legacyMigration.action.quit": "Inklet を終了",
+ "legacyMigration.settings.help": "対応する Inklet Data フォルダから、保持されている設定と履歴をインポートします。",
+ "settings.section.history": "履歴",
+ "settings.description.history": "ローカルに保存された文章、選択結果、以前の音声結果を確認します。",
+ "settings.history.filter.all": "すべて",
+ "settings.history.source.write": "文章",
+ "settings.history.source.voice": "音声",
+ "settings.history.source.selection": "選択",
+ "settings.history.empty": "保存された履歴はまだありません。",
+ "settings.history.original": "元のテキスト",
+ "settings.history.result": "結果",
+ "settings.history.copyOriginal": "元のテキストをコピー",
+ "settings.history.copyResult": "結果をコピー",
+ "settings.history.clear": "履歴を消去",
+ "settings.history.clearConfirmTitle": "履歴を消去しますか?",
+ "settings.history.clearConfirmMessage": "この Mac から保存済みの履歴をすべて削除します。この操作は取り消せません。",
+ "settings.history.cleared": "履歴を消去しました。",
+ "settings.history.error.loadFailed": "履歴を読み込めませんでした。",
+ "settings.history.error.clearFailed": "履歴を消去できませんでした。",
+ "settings.privacy.history": "• 文章と選択テキストの成功履歴はローカルに保存され、以前の音声履歴も引き続き確認できます",
+ "settings.group.writing": "文章作成",
+ "settings.group.writing.help": "Writing Assistant と編集可能な入力元の下書きを設定します。",
+ "settings.group.dictation": "音声入力",
+ "settings.group.dictation.help": "話している間ショートカットを押し続けると、マイク音声がリアルタイムで OpenAI に送信されます。",
+ "settings.group.dictationAdvanced": "音声入力の詳細設定",
+ "settings.row.dictationShortcut": "長押しショートカット",
+ "settings.help.dictationShortcut": "Writing Assistant の入力元エディタがアクティブなときだけ機能します。短く押しても何も起きません。",
+ "settings.quickStart.voice.pressAndHold": "押している間だけ音声入力",
+ "settings.row.microphone": "マイク",
+ "settings.help.microphone": "リアルタイム音声入力に使用するオーディオ入力デバイスを選択します。",
+ "settings.microphone.systemDefault": "システム既定",
+ "settings.row.fallbackSpeechModel": "復旧用モデル",
+ "settings.help.fallbackSpeechModel": "リアルタイム接続が失敗した後の1回限りの復旧に使用するモデルです。",
+ "dictation.hint.hold": "%@ を押し続けて音声入力",
+ "dictation.status.connecting": "接続中…",
+ "dictation.status.listening": "音声入力中…放すと完了",
+ "dictation.status.recordingFallback": "接続が切れました…そのまま話せます",
+ "dictation.status.finalizing": "文字起こしを完了中…",
+ "dictation.status.recovering": "一時録音から復旧中…",
+ "dictation.status.ready": "音声入力の準備完了",
+ "dictation.accessibility.ready": "音声入力の準備ができました。",
+ "dictation.accessibility.listening": "音声入力中です。放すと完了します。",
+ "dictation.accessibility.recordingFallback": "接続が切れました。復旧のため、そのまま話してください。",
+ "dictation.accessibility.finalizing": "音声入力の文字起こしを完了しています。",
+ "dictation.accessibility.recovering": "一時録音から音声入力を復旧しています。",
+ "dictation.accessibility.completed": "音声入力が完了しました。",
+ "dictation.accessibility.cancelled": "音声入力をキャンセルしました。",
+ "dictation.accessibility.failed": "音声入力に失敗しました。",
+ "dictation.accessibility.sourceEditor": "文章入力元エディタ",
+ "dictation.undo.action": "音声入力",
+ "dictation.error.missingAPIKey": "音声入力を使うには、設定で OpenAI API キーを追加してください。",
+ "dictation.error.microphonePermission": "音声入力にはマイクの許可が必要です。",
+ "dictation.error.noAudioInputDevice": "使用できるマイクまたはオーディオ入力デバイスがありません。",
+ "dictation.error.recordingUnavailable": "録音を開始できませんでした。",
+ "dictation.error.realtimeBufferOverflow": "リアルタイム音声の処理が追いつきませんでした。もう一度お試しください。",
+ "dictation.error.connection": "リアルタイム文字起こしへの接続に失敗しました。",
+ "dictation.error.connectionTimeout": "リアルタイム文字起こしへの接続がタイムアウトしました。",
+ "dictation.error.finalTimeout": "最終のリアルタイム文字起こしを時間内に受信できませんでした。",
+ "dictation.error.fallback": "一時録音から音声入力を復旧できませんでした。",
+ "dictation.error.noSpeech": "音声を認識できませんでした。",
+ "settings.privacy.voice": "• リアルタイム音声入力の音声と発音テキストは OpenAI に直接送信され、復旧用録音はセッション終了時に削除されます",
+ "settings.section.selectionActions": "選択範囲アクション",
+ "settings.description.selectionActions": "ほかのアプリで選択したテキストの自動アクションを管理します。",
+ "settings.row.selectionActionsEnabled": "選択範囲アクションを有効にする",
+ "settings.help.selectionActionsEnabled": "テキスト選択後に少し待つと小さなメニューを表示します。",
+ "settings.row.forceSelectionMode": "強制選択",
+ "settings.help.forceSelectionMode": "アクセシビリティで選択テキストを読めない場合に使うフォールバックです。メニューコピーはキーボード入力をシミュレートしません。",
+ "settings.forceSelection.disabled": "オフ",
+ "settings.forceSelection.menuCopyOnly": "メニューコピーのみ",
+ "settings.forceSelection.menuCopyThenShortcut": "メニューコピー後に Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C 後にメニューコピー",
+ "settings.row.allowSimulatedCopyFallback": "Cmd+C のシミュレーションを許可",
+ "settings.help.allowSimulatedCopyFallback": "メニューコピーを使えない場合、前面のアプリに Cmd+C を送信します。ゲームやリモートアプリに干渉する可能性があります。",
+ "settings.row.translationLanguage": "翻訳先言語",
+ "settings.help.translationLanguage": "選択テキストの翻訳アクションで使う言語です。",
+ "settings.row.translationPrompt": "翻訳プロンプト",
+ "settings.help.translationPrompt": "選択テキストの翻訳アクションで使う指示です。{targetLanguage} で選択言語を指定します。",
+ "settings.translationPrompt.restoreDefault": "デフォルトに戻す",
+ "settings.row.aiPronunciation": "AI 発音の声",
+ "settings.help.aiPronunciation": "選択テキストの発音で使う声です。OpenAI API key で OpenAI text-to-speech を使用します。",
+ "settings.row.aiPronunciationSpeed": "AI 発音速度",
+ "settings.help.aiPronunciationSpeed": "選択テキストの発音と声のプレビューで使う再生速度です。",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "声をプレビュー",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "インターフェイスの言語に従う",
+ "selection.action.translate": "翻訳",
+ "selection.action.pronounce": "発音",
+ "selection.action.translating": "翻訳中...",
+ "selection.action.preparingPronunciation": "音声を準備中...",
+ "selection.action.playingPronunciation": "再生中...",
+ "selection.action.pronounceOriginal": "原文を再生",
+ "selection.action.pronounceTranslation": "翻訳を再生",
+ "selection.action.audioLabel.original": "原文",
+ "selection.action.audioLabel.translation": "訳文",
+ "selection.action.copyTranslation": "翻訳をコピー",
+ "selection.action.retry": "再試行",
+ "selection.action.unsupportedTitle": "選択テキストを取得できません",
+ "selection.action.unsupportedMessage": "現在のアプリは選択テキストを Inklet に公開していません。",
+ "selection.action.missingOpenAIKey": "AI 発音を使うには設定で OpenAI API key を追加してください。",
+ "selection.action.translationFailed": "翻訳に失敗しました。",
+ "selection.action.pronunciationFailed": "発音に失敗しました。",
+ "about.tagline": "まとまらない思いを、明快な文章に",
+ "about.website": "ウェブサイト",
+ "about.privacyPolicy": "プライバシーポリシー",
+ "about.support": "サポート",
+ "language.system": "システムに合わせる",
+ "settings.window.title": "Inklet 設定",
+ "settings.sidebar.preferences": "環境設定",
+ "settings.sidebar.hint": "自動保存 · ⌘, 開く",
+ "settings.section.general": "一般",
+ "settings.section.providers": "プロバイダー",
+ "settings.section.promptModes": "Prompt モード",
+ "settings.section.permissions": "権限",
+ "settings.description.general": "基本動作、ショートカット、表示言語、生成パラメータ。",
+ "settings.description.providers": "LLM プロバイダー、モデル、API キーを選択します。",
+ "settings.description.promptModes": "ポップオーバーに表示する変換モードとシステムプロンプトを管理します。",
+ "settings.description.permissions": "テキスト挿入に必要な macOS 権限を確認します。",
+ "settings.row.language": "表示言語",
+ "settings.help.language": "System を選ぶと macOS の言語に従います。",
+ "settings.row.hotkey": "ホットキー",
+ "settings.help.timeout": "リクエストの最大待ち時間。",
+ "settings.seconds": "%d 秒",
+ "settings.help.provider": "現在のプロバイダー。",
+ "settings.help.apiKey": "この Mac にローカル保存されます。",
+ "settings.help.model.default": "既定: %@",
+ "settings.mode.untitled": "無題のモード",
+ "settings.mode.pick": "Prompt Mode を選択",
+ "settings.help.name": "ポップオーバーに表示される名前。",
+ "settings.help.description": "このモードの用途。",
+ "settings.characters": "%d 文字",
+ "settings.permission.authorized": "Accessibility は許可済み",
+ "settings.permission.required": "Accessibility 権限が必要です",
+ "settings.permission.description": "「設定を開く」をクリックし、+ をクリックして /Applications/Inklet.app を選択し、Inklet を有効にします。",
+ "settings.permission.open": "システム設定を開く",
+ "settings.footer.pending": "変更は自動保存され、次回ポップオーバーを開いたときに適用されます。",
+ "settings.save": "保存",
+ "settings.saved": "保存しました",
+ "settings.error.visibleModeRequired": "少なくとも 1 つの表示モードが必要です。",
+ "settings.error.modelRequired": "Model は空にできません。",
+ "settings.error.openAccessibility": "Accessibility 設定を開けませんでした。",
+ "settings.error.saveFailed": "保存に失敗しました: %@",
+ "popover.input.placeholder": "変換または挿入するテキストを入力",
+ "popover.modeSearch.placeholder": "モードを検索",
+ "popover.modeSearch.empty": "一致するモードがありません",
+ "popover.modeSearch.select": "選択",
+ "popover.modeSearch.write": "入力",
+ "popover.result.title": "結果",
+ "popover.result.editable": "挿入前に編集できます",
+ "popover.result.generatedWith": "%@ で生成",
+ "popover.mode.picker": "モード",
+ "popover.mode.backToModes": "モードを選択",
+ "popover.action.transform": "変換",
+ "popover.action.regenerate": "再生成",
+ "popover.action.insert": "挿入",
+ "popover.action.insertOriginal": "原文を挿入",
+ "popover.hint.transformInsert": "変換/挿入",
+ "popover.hint.original": "原文",
+ "popover.hint.accessibility": "ショートカット: Enter で変換または挿入、Command Enter で原文を挿入、Escape で戻るまたは閉じる",
+ "popover.busy.inserting": "挿入中...",
+ "popover.busy.transforming": "変換中...",
+ "popover.error.emptyOriginal": "挿入するテキストを入力してください。",
+ "popover.error.missingTarget": "テキストを挿入する対象アプリが見つかりません。",
+ "popover.error.missingAPIKey": "先に設定で %@ API Key を設定してください。",
+ "insertion.error.accessibility": "テキストを挿入するには Accessibility 権限を有効にしてください。",
+ "insertion.error.activation": "元のアプリに戻れませんでした。もう一度お試しください。",
+ "insertion.error.pasteEvent": "貼り付けショートカットを送信できませんでした。",
+ "insertion.error.clipboardRestore": "挿入後にクリップボードを復元できませんでした。",
+ "error.emptySource": "変換するテキストを入力してください",
+ "error.emptyResponse": "モデルが空の応答を返しました",
+ "error.timeout": "リクエストがタイムアウトしました。もう一度お試しください",
+ "error.networkConnectionLost": "ネットワーク接続が中断されました。もう一度お試しください。",
+ "error.provider.urlInvalid": "%@ のリクエストに失敗しました: URL が無効です",
+ "error.provider.httpUnknown": "%@ のリクエストに失敗しました: HTTP unknown",
+ "error.provider.prefix": "%@ のリクエストに失敗しました: %@",
+ "hotkey.error.unsupported": "未対応のホットキー “%@”。対応: ⌥Space、Option+Space、Alt+Space、⌘Space、Command+Space、Cmd+Space。",
+ "hotkey.error.registrationFailed": "ホットキーの登録に失敗しました(%d)。",
+ "prompt.custom.description": "カスタム prompt を使用",
+ "appearance.dark": "ダーク",
+ "appearance.light": "ライト",
+ "appearance.system": "システム",
+ "popover.hint.back": "戻る",
+ "popover.hint.close": "閉じる",
+ "popover.hint.mode": "モード",
+ "popover.hint.newLine": "改行",
+ "popover.status.preview": "プレビュー",
+ "popover.status.ready": "準備完了",
+ "prompt.chineseSummary.description": "どんな文章も簡潔な簡体字中国語に要約",
+ "prompt.friendlyReply.description": "自然で親しみやすい返信に書き換え",
+ "prompt.improveWriting.description": "元の言語を維持して文章を改善",
+ "prompt.makeConcise.description": "元の言語と要点を維持して文章を短縮",
+ "prompt.professionalTone.description": "より明確でプロフェッショナルな文体に書き換え",
+ "prompt.simpleCorrectEnglish.description": "簡単で正しい英語に書き換え・翻訳",
+ "prompt.translateToEnglish.description": "簡単で正しい英語に書き換え・翻訳",
+ "settings.cancel": "キャンセル",
+ "settings.description.about": "キーボードショートカット、プライバシー、アプリの情報。",
+ "settings.description.selectionAssistant": "他のアプリで選択したテキストの自動翻訳と読み上げ。",
+ "settings.description.writeAssistant": "文章作成、音声入力、生成動作、プロンプトモードを設定します。",
+ "settings.error.endpointInvalid": "エンドポイントには有効な HTTP URL を指定してください。",
+ "settings.error.promptModeRequired": "プロンプトモードを少なくとも1つ残してください。",
+ "settings.help.appearance": "ライト、ダーク、または macOS に合わせる設定を選択します。",
+ "settings.help.endpoint": "OpenAI 互換の /chat/completions の完全な URL。",
+ "settings.help.hotkey": "例:⌥Space、Option+Space、Cmd+Space。",
+ "settings.help.openAIAPIKey": "この Mac に保存され、文章作成、リアルタイム音声入力、選択テキストの翻訳・読み上げに使用されます。削除するには欄を空にしてください。",
+ "settings.hotkey.pressKey": " キー",
+ "settings.hotkey.record": "ショートカットを記録",
+ "settings.hotkey.recording": "ショートカットを入力",
+ "settings.mode.add": "モードを追加",
+ "settings.mode.delete": "モードを削除",
+ "settings.mode.deleteConfirmMessage": "「%@」を削除しますか?この操作は取り消せません。",
+ "settings.mode.deleteConfirmTitle": "プロンプトモードを削除しますか?",
+ "settings.mode.dragToSort": "ドラッグして並べ替え",
+ "settings.mode.hidden": "非表示",
+ "settings.mode.moveDown": "下へ移動",
+ "settings.mode.moveUp": "上へ移動",
+ "settings.mode.newDescription": "カスタム変換モード",
+ "settings.mode.newName": "新しいモード",
+ "settings.mode.visible": "表示",
+ "settings.mode.visibleInMenu": "メニューに表示",
+ "settings.mode.visibleInMenuHelp": "このモードをモード選択画面に表示します。",
+ "settings.model.custom": "カスタム…",
+ "settings.model.customized": "カスタムモデル *",
+ "settings.model.refreshing": "モデル一覧を更新中…",
+ "settings.permission.accessibility": "アクセシビリティ",
+ "settings.permission.openShort": "設定を開く",
+ "settings.privacy.clipboard": "• 挿入や設定済みの強制選択読み取りの後にクリップボードの内容を復元",
+ "settings.privacy.keychain": "• API キーはこの Mac に保存",
+ "settings.privacy.provider": "• テキストは OpenAI に直接送信",
+ "settings.privacy.title": "プライバシーとセキュリティ",
+ "settings.provider.active": "使用中",
+ "settings.provider.configured": "設定済み",
+ "settings.provider.notConfigured": "未設定",
+ "settings.provider.notLoaded": "保存済みのキーは表示されません",
+ "settings.provider.pendingKey": "新しいキーは保存待ちです",
+ "settings.provider.pendingSave": "保存待ち",
+ "settings.provider.saved": "保存済み",
+ "settings.provider.savedLocally": "この Mac に保存済み",
+ "settings.quickStart.close": "戻る・閉じる",
+ "settings.quickStart.help": "ポップオーバーでよく使う操作。",
+ "settings.quickStart.open": "Inklet を開く",
+ "settings.quickStart.original": "原文を挿入",
+ "settings.quickStart.submit": "変換・結果を挿入",
+ "settings.quickStart.title": "キーボードショートカット",
+ "settings.row.apiKey": "API キー",
+ "settings.row.appearance": "外観",
+ "settings.row.description": "説明",
+ "settings.row.endpoint": "エンドポイント",
+ "settings.row.model": "モデル",
+ "settings.row.name": "名前",
+ "settings.row.openAIAPIKey": "OpenAI API キー",
+ "settings.row.provider": "プロバイダー",
+ "settings.row.systemPrompt": "プロンプト",
+ "settings.row.timeout": "タイムアウト",
+ "settings.section.about": "このアプリについて",
+ "settings.section.selectionAssistant": "選択アシスタント",
+ "settings.section.writeAssistant": "文章作成アシスタント",
+ "settings.systemPermissions.title": "システム権限",
+ "settings.version": "バージョン %@",
+ "settings.voice.shortcut.disabled": "無効",
+ "settings.voice.shortcut.leftCommand": "左 Command",
+ "settings.voice.shortcut.leftOption": "左 Option",
+ "settings.voice.shortcut.rightCommand": "右 Command",
+ "settings.voice.shortcut.rightOption": "右 Option",
+ "setup.done": "完了",
+ "setup.menubar.description": "時計の近くにある Inklet アイコンをクリックすると、いつでも開けます。",
+ "setup.menubar.title": "メニューバーで Inklet を見つける",
+ "setup.shortcut.description": "デフォルトのショートカットは %@ です。他のアプリと競合する場合は、設定で変更してください。",
+ "setup.shortcut.title": "ショートカットを使う",
+ "setup.subtitle": "Inklet はメニューバーで動作しています。使用中のアプリにテキストを挿入できるよう、アクセシビリティ権限を許可してください。",
+ "setup.title": "Inklet の準備ができました",
+ "setup.window.title": "Inklet へようこそ"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+ko.swift b/Sources/InkletApp/Localization/L10n+ko.swift
new file mode 100644
index 0000000..41d3602
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+ko.swift
@@ -0,0 +1,317 @@
+// Korean interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let ko: [String: String] = [
+ "app.menu.edit": "편집",
+ "app.menu.undo": "실행 취소",
+ "app.menu.redo": "실행 복귀",
+ "app.menu.cut": "오려두기",
+ "app.menu.copy": "복사하기",
+ "app.menu.paste": "붙여넣기",
+ "app.menu.pasteAndMatchStyle": "붙여넣고 스타일 일치시킴",
+ "app.menu.delete": "삭제",
+ "app.menu.selectAll": "모두 선택",
+ "app.menu.openPopover": "Inklet 열기",
+ "app.menu.settings": "설정",
+ "app.menu.about": "Inklet 정보",
+ "app.menu.quit": "종료",
+ "app.menu.checkForUpdates": "업데이트 확인…",
+ "app.menu.checkingForUpdates": "업데이트 확인 중…",
+ "update.available.title": "Inklet 업데이트가 있습니다",
+ "update.available.latestVersion": "최신: %@ (빌드 %@)",
+ "update.available.currentVersion": "현재: %@",
+ "update.available.noNotes": "자세한 내용은 GitHub 릴리스를 확인하세요.",
+ "update.action.viewOnGitHub": "GitHub에서 보기",
+ "update.action.later": "나중에",
+ "update.upToDate.title": "Inklet이 최신 버전입니다",
+ "update.upToDate.message": "현재 %@ 버전을 사용하고 있습니다.",
+ "update.error.title": "업데이트를 확인할 수 없습니다",
+ "update.error.message": "잠시 후 다시 시도하세요.",
+ "update.action.retry": "재시도",
+ "update.action.cancel": "취소",
+ "update.action.ok": "확인",
+ "legacyMigration.notice.title": "이전 Inklet 데이터를 아직 가져오지 않았습니다",
+ "legacyMigration.notice.message": "이전 설정과 기록은 그대로 보존되어 있습니다. 해당 Inklet Data 폴더를 선택해 가져올 수 있습니다.",
+ "legacyMigration.action.importOldData": "이전 데이터 가져오기…",
+ "legacyMigration.panel.title": "이전 Inklet 데이터 선택",
+ "legacyMigration.panel.message": "보존된 설정과 기록을 가져오려면 해당 Inklet Data 폴더를 선택하세요.",
+ "legacyMigration.import.progress": "이전 데이터 가져오는 중…",
+ "legacyMigration.import.invalidSelection": "선택한 폴더는 이 Inklet 앱에 해당하는 이전 데이터 폴더가 아닙니다.",
+ "legacyMigration.import.failed": "이전 데이터를 가져오지 못했습니다. 설정과 기록은 그대로 보존되어 있습니다.",
+ "legacyMigration.import.partialFailure": "일부 이전 데이터를 가져오지 못했습니다. 설정과 기록은 그대로 보존되어 있습니다.",
+ "legacyMigration.import.relaunching": "가져온 데이터 로드를 완료하려면 Inklet을 다시 실행해야 합니다.",
+ "legacyMigration.import.relaunchProgress": "Inklet 다시 실행 중…",
+ "legacyMigration.import.relaunchFailed": "Inklet을 다시 실행하지 못했습니다. 가져온 데이터는 준비되어 있으며 다음에 Inklet을 열 때 로드됩니다.",
+ "legacyMigration.action.retryRelaunch": "Inklet 다시 실행",
+ "legacyMigration.action.quit": "Inklet 종료",
+ "legacyMigration.settings.help": "해당 Inklet Data 폴더에서 보존된 설정과 기록을 가져옵니다.",
+ "settings.section.history": "기록",
+ "settings.description.history": "로컬에 저장된 쓰기, 선택 결과와 이전 음성 결과를 확인합니다.",
+ "settings.history.filter.all": "전체",
+ "settings.history.source.write": "쓰기",
+ "settings.history.source.voice": "음성",
+ "settings.history.source.selection": "선택",
+ "settings.history.empty": "저장된 기록이 아직 없습니다.",
+ "settings.history.original": "원문",
+ "settings.history.result": "결과",
+ "settings.history.copyOriginal": "원문 복사",
+ "settings.history.copyResult": "결과 복사",
+ "settings.history.clear": "기록 지우기",
+ "settings.history.clearConfirmTitle": "기록을 지울까요?",
+ "settings.history.clearConfirmMessage": "이 Mac에서 저장된 모든 기록을 삭제합니다. 이 작업은 되돌릴 수 없습니다.",
+ "settings.history.cleared": "기록을 지웠습니다.",
+ "settings.history.error.loadFailed": "기록을 불러올 수 없습니다.",
+ "settings.history.error.clearFailed": "기록을 지울 수 없습니다.",
+ "settings.privacy.history": "• 성공한 쓰기와 선택 텍스트 기록은 로컬에 저장되며 이전 음성 기록도 계속 볼 수 있습니다",
+ "settings.group.writing": "쓰기",
+ "settings.group.writing.help": "Writing Assistant와 편집 가능한 원문 초안을 설정합니다.",
+ "settings.group.dictation": "받아쓰기",
+ "settings.group.dictation.help": "말하는 동안 단축키를 길게 누르면 마이크 오디오가 OpenAI로 실시간 전송됩니다.",
+ "settings.group.dictationAdvanced": "고급 받아쓰기",
+ "settings.row.dictationShortcut": "길게 누르기 단축키",
+ "settings.help.dictationShortcut": "Writing Assistant 원문 편집기가 활성 상태일 때만 작동합니다. 짧게 누르면 아무 작업도 하지 않습니다.",
+ "settings.quickStart.voice.pressAndHold": "누르는 동안 음성 입력",
+ "settings.row.microphone": "마이크",
+ "settings.help.microphone": "실시간 받아쓰기에 사용할 오디오 입력 장치를 선택합니다.",
+ "settings.microphone.systemDefault": "시스템 기본값",
+ "settings.row.fallbackSpeechModel": "복구 모델",
+ "settings.help.fallbackSpeechModel": "실시간 연결 실패 후 한 번의 복구 시도에 사용하는 모델입니다.",
+ "dictation.hint.hold": "%@ 길게 눌러 받아쓰기",
+ "dictation.status.connecting": "연결 중…",
+ "dictation.status.listening": "받아쓰기 중…놓으면 완료",
+ "dictation.status.recordingFallback": "연결이 끊겼습니다…계속 말하세요",
+ "dictation.status.finalizing": "전사 마무리 중…",
+ "dictation.status.recovering": "임시 녹음에서 복구 중…",
+ "dictation.status.ready": "받아쓰기 준비 완료",
+ "dictation.accessibility.ready": "받아쓰기가 준비되었습니다.",
+ "dictation.accessibility.listening": "받아쓰기 중입니다. 놓으면 완료됩니다.",
+ "dictation.accessibility.recordingFallback": "연결이 끊겼습니다. 복구를 위해 계속 말씀하세요.",
+ "dictation.accessibility.finalizing": "받아쓰기 전사를 마무리하는 중입니다.",
+ "dictation.accessibility.recovering": "임시 녹음에서 받아쓰기를 복구하는 중입니다.",
+ "dictation.accessibility.completed": "받아쓰기가 완료되었습니다.",
+ "dictation.accessibility.cancelled": "받아쓰기가 취소되었습니다.",
+ "dictation.accessibility.failed": "받아쓰기에 실패했습니다.",
+ "dictation.accessibility.sourceEditor": "쓰기 원문 편집기",
+ "dictation.undo.action": "받아쓰기",
+ "dictation.error.missingAPIKey": "받아쓰기를 사용하려면 설정에서 OpenAI API 키를 추가하세요.",
+ "dictation.error.microphonePermission": "받아쓰기에는 마이크 권한이 필요합니다.",
+ "dictation.error.noAudioInputDevice": "사용 가능한 마이크 또는 오디오 입력 장치가 없습니다.",
+ "dictation.error.recordingUnavailable": "오디오 녹음을 시작할 수 없습니다.",
+ "dictation.error.realtimeBufferOverflow": "실시간 오디오 처리가 지연되었습니다. 다시 시도하세요.",
+ "dictation.error.connection": "실시간 전사 연결에 실패했습니다.",
+ "dictation.error.connectionTimeout": "실시간 전사 연결 시간이 초과되었습니다.",
+ "dictation.error.finalTimeout": "최종 실시간 전사를 제시간에 받지 못했습니다.",
+ "dictation.error.fallback": "임시 녹음에서 받아쓰기를 복구할 수 없습니다.",
+ "dictation.error.noSpeech": "음성이 인식되지 않았습니다.",
+ "settings.privacy.voice": "• 실시간 받아쓰기 오디오와 발음 텍스트는 OpenAI로 직접 전송되며 복구 녹음은 세션 종료 시 삭제됩니다",
+ "settings.section.selectionActions": "선택 동작",
+ "settings.description.selectionActions": "다른 앱에서 선택한 텍스트의 자동 동작을 관리합니다.",
+ "settings.row.selectionActionsEnabled": "선택 동작 활성화",
+ "settings.help.selectionActionsEnabled": "텍스트 선택 후 잠시 멈추면 작은 메뉴를 표시합니다.",
+ "settings.row.forceSelectionMode": "강제 선택",
+ "settings.help.forceSelectionMode": "손쉬운 사용으로 선택 텍스트를 읽을 수 없을 때 사용하는 대체 방식입니다. 메뉴 복사는 키보드 입력을 시뮬레이션하지 않습니다.",
+ "settings.forceSelection.disabled": "끄기",
+ "settings.forceSelection.menuCopyOnly": "메뉴 복사만",
+ "settings.forceSelection.menuCopyThenShortcut": "메뉴 복사 후 Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C 후 메뉴 복사",
+ "settings.row.allowSimulatedCopyFallback": "Cmd+C 시뮬레이션 허용",
+ "settings.help.allowSimulatedCopyFallback": "메뉴 복사를 사용할 수 없을 때 전면 앱에 Cmd+C를 보냅니다. 게임이나 원격 앱을 방해할 수 있습니다.",
+ "settings.row.translationLanguage": "번역 언어",
+ "settings.help.translationLanguage": "선택 텍스트 번역에 사용할 대상 언어입니다.",
+ "settings.row.translationPrompt": "번역 프롬프트",
+ "settings.help.translationPrompt": "선택 텍스트 번역에 사용할 지시입니다. {targetLanguage}로 선택한 언어를 넣습니다.",
+ "settings.translationPrompt.restoreDefault": "기본값 복원",
+ "settings.row.aiPronunciation": "AI 발음 음성",
+ "settings.help.aiPronunciation": "선택한 텍스트의 발음에 사용할 음성입니다. OpenAI API key로 OpenAI text-to-speech를 사용합니다.",
+ "settings.row.aiPronunciationSpeed": "AI 발음 속도",
+ "settings.help.aiPronunciationSpeed": "선택 텍스트 발음과 음성 미리 듣기에 사용할 재생 속도입니다.",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "음성 미리 듣기",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "인터페이스 언어 따르기",
+ "selection.action.translate": "번역",
+ "selection.action.pronounce": "발음",
+ "selection.action.translating": "번역 중...",
+ "selection.action.preparingPronunciation": "오디오 준비 중...",
+ "selection.action.playingPronunciation": "재생 중...",
+ "selection.action.pronounceOriginal": "원문 재생",
+ "selection.action.pronounceTranslation": "번역 재생",
+ "selection.action.audioLabel.original": "원문",
+ "selection.action.audioLabel.translation": "번역",
+ "selection.action.copyTranslation": "번역 복사",
+ "selection.action.retry": "다시 시도",
+ "selection.action.unsupportedTitle": "선택한 텍스트를 사용할 수 없음",
+ "selection.action.unsupportedMessage": "현재 앱은 선택한 텍스트를 Inklet에 제공하지 않습니다.",
+ "selection.action.missingOpenAIKey": "AI 발음을 사용하려면 설정에서 OpenAI API key를 추가하세요.",
+ "selection.action.translationFailed": "번역에 실패했습니다.",
+ "selection.action.pronunciationFailed": "발음에 실패했습니다.",
+ "about.tagline": "다듬어지지 않은 생각을 명확한 글로",
+ "about.website": "웹사이트",
+ "about.privacyPolicy": "개인정보 처리방침",
+ "about.support": "지원",
+ "language.system": "시스템 따르기",
+ "settings.window.title": "Inklet 설정",
+ "settings.sidebar.preferences": "환경설정",
+ "settings.sidebar.hint": "자동 저장 · ⌘, 열기",
+ "settings.section.general": "일반",
+ "settings.section.providers": "Provider",
+ "settings.section.promptModes": "프롬프트 모드",
+ "settings.section.permissions": "권한",
+ "settings.description.general": "기본 동작, 단축키, 인터페이스 언어, 생성 파라미터.",
+ "settings.description.providers": "LLM provider, model, API key를 선택합니다.",
+ "settings.description.promptModes": "팝오버에 표시되는 변환 모드와 시스템 프롬프트를 관리합니다.",
+ "settings.description.permissions": "텍스트 삽입에 필요한 macOS 권한을 확인합니다.",
+ "settings.row.language": "인터페이스 언어",
+ "settings.help.language": "System을 선택하면 macOS 언어를 따릅니다.",
+ "settings.row.hotkey": "단축키",
+ "settings.help.timeout": "요청 최대 대기 시간.",
+ "settings.seconds": "%d초",
+ "settings.help.provider": "현재 provider.",
+ "settings.help.apiKey": "이 Mac에 로컬로 저장됩니다.",
+ "settings.help.model.default": "기본값: %@",
+ "settings.mode.untitled": "이름 없는 모드",
+ "settings.mode.pick": "Prompt Mode 선택",
+ "settings.help.name": "팝오버에 표시되는 이름.",
+ "settings.help.description": "이 모드의 용도.",
+ "settings.characters": "%d자",
+ "settings.permission.authorized": "Accessibility 권한 허용됨",
+ "settings.permission.required": "Accessibility 권한 필요",
+ "settings.permission.description": "설정 열기를 클릭하고 +를 클릭한 다음 /Applications/Inklet.app을 선택하고 Inklet을 활성화하세요.",
+ "settings.permission.open": "시스템 설정 열기",
+ "settings.footer.pending": "변경 사항은 자동 저장되며 다음 팝오버부터 적용됩니다.",
+ "settings.save": "저장",
+ "settings.saved": "저장됨",
+ "settings.error.visibleModeRequired": "표시되는 모드를 하나 이상 유지하세요.",
+ "settings.error.modelRequired": "Model은 비워 둘 수 없습니다.",
+ "settings.error.openAccessibility": "Accessibility 설정을 열 수 없습니다.",
+ "settings.error.saveFailed": "저장 실패: %@",
+ "popover.input.placeholder": "변환하거나 삽입할 텍스트 입력",
+ "popover.modeSearch.placeholder": "모드 검색",
+ "popover.modeSearch.empty": "일치하는 모드 없음",
+ "popover.modeSearch.select": "선택",
+ "popover.modeSearch.write": "작성",
+ "popover.result.title": "결과",
+ "popover.result.editable": "삽입 전 편집 가능",
+ "popover.result.generatedWith": "%@로 생성",
+ "popover.mode.picker": "모드",
+ "popover.mode.backToModes": "모드 선택",
+ "popover.action.transform": "변환",
+ "popover.action.regenerate": "다시 생성",
+ "popover.action.insert": "삽입",
+ "popover.action.insertOriginal": "원문 삽입",
+ "popover.hint.transformInsert": "변환/삽입",
+ "popover.hint.original": "원문",
+ "popover.hint.accessibility": "단축키: Enter 변환 또는 삽입, Command Enter 원문 삽입, Escape 뒤로 또는 닫기",
+ "popover.busy.inserting": "삽입 중...",
+ "popover.busy.transforming": "변환 중...",
+ "popover.error.emptyOriginal": "삽입할 텍스트를 입력하세요.",
+ "popover.error.missingTarget": "텍스트를 삽입할 대상 앱을 찾을 수 없습니다.",
+ "popover.error.missingAPIKey": "먼저 설정에서 %@ API Key를 설정하세요.",
+ "insertion.error.accessibility": "텍스트를 삽입하려면 Accessibility 권한을 활성화하세요.",
+ "insertion.error.activation": "원래 앱으로 돌아갈 수 없습니다. 다시 시도하세요.",
+ "insertion.error.pasteEvent": "붙여넣기 단축키를 보낼 수 없습니다.",
+ "insertion.error.clipboardRestore": "삽입 후 클립보드를 복원하지 못했습니다.",
+ "error.emptySource": "변환할 텍스트를 입력하세요",
+ "error.emptyResponse": "모델이 빈 응답을 반환했습니다",
+ "error.timeout": "요청 시간이 초과되었습니다. 다시 시도하세요",
+ "error.networkConnectionLost": "네트워크 연결이 중단되었습니다. 다시 시도하세요.",
+ "error.provider.urlInvalid": "%@ 요청 실패: URL이 유효하지 않습니다",
+ "error.provider.httpUnknown": "%@ 요청 실패: HTTP unknown",
+ "error.provider.prefix": "%@ 요청 실패: %@",
+ "hotkey.error.unsupported": "지원하지 않는 단축키 “%@”. 지원: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
+ "hotkey.error.registrationFailed": "단축키 등록 실패(%d).",
+ "prompt.custom.description": "사용자 지정 prompt 사용",
+ "appearance.dark": "다크",
+ "appearance.light": "라이트",
+ "appearance.system": "시스템",
+ "popover.hint.back": "뒤로",
+ "popover.hint.close": "닫기",
+ "popover.hint.mode": "모드",
+ "popover.hint.newLine": "줄 바꿈",
+ "popover.status.preview": "미리 보기",
+ "popover.status.ready": "준비됨",
+ "prompt.chineseSummary.description": "모든 텍스트를 간결한 중국어 간체로 요약",
+ "prompt.friendlyReply.description": "자연스럽고 친근한 답변으로 다시 작성",
+ "prompt.improveWriting.description": "원래 언어를 유지하며 글 다듬기",
+ "prompt.makeConcise.description": "원래 언어와 핵심 내용을 유지하며 텍스트 줄이기",
+ "prompt.professionalTone.description": "더 명확하고 전문적인 어조로 다시 작성",
+ "prompt.simpleCorrectEnglish.description": "쉽고 정확한 영어로 다시 작성하거나 번역",
+ "prompt.translateToEnglish.description": "쉽고 정확한 영어로 다시 작성하거나 번역",
+ "settings.cancel": "취소",
+ "settings.description.about": "키보드 단축키, 개인정보 보호 및 앱 정보입니다.",
+ "settings.description.selectionAssistant": "다른 앱에서 선택한 텍스트를 자동으로 번역하고 읽어 줍니다.",
+ "settings.description.writeAssistant": "글쓰기, 받아쓰기, 생성 동작 및 프롬프트 모드를 설정합니다.",
+ "settings.error.endpointInvalid": "엔드포인트는 유효한 HTTP URL이어야 합니다.",
+ "settings.error.promptModeRequired": "프롬프트 모드를 하나 이상 유지하세요.",
+ "settings.help.appearance": "라이트, 다크 또는 macOS 설정 따르기를 선택하세요.",
+ "settings.help.endpoint": "OpenAI 호환 /chat/completions 전체 URL입니다.",
+ "settings.help.hotkey": "예: ⌥Space, Option+Space, Cmd+Space.",
+ "settings.help.openAIAPIKey": "이 Mac에 저장되며 글쓰기, 실시간 받아쓰기, 선택 영역 번역 및 발음에 함께 사용됩니다. 필드를 비우면 삭제됩니다.",
+ "settings.hotkey.pressKey": " 키",
+ "settings.hotkey.record": "단축키 기록",
+ "settings.hotkey.recording": "단축키 누르기",
+ "settings.mode.add": "모드 추가",
+ "settings.mode.delete": "모드 삭제",
+ "settings.mode.deleteConfirmMessage": "“%@”을(를) 삭제할까요? 이 작업은 되돌릴 수 없습니다.",
+ "settings.mode.deleteConfirmTitle": "프롬프트 모드를 삭제할까요?",
+ "settings.mode.dragToSort": "드래그하여 순서 변경",
+ "settings.mode.hidden": "숨김",
+ "settings.mode.moveDown": "아래로 이동",
+ "settings.mode.moveUp": "위로 이동",
+ "settings.mode.newDescription": "사용자 지정 변환 모드",
+ "settings.mode.newName": "새 모드",
+ "settings.mode.visible": "표시",
+ "settings.mode.visibleInMenu": "메뉴에 표시",
+ "settings.mode.visibleInMenuHelp": "모드 선택기에 이 모드를 표시합니다.",
+ "settings.model.custom": "사용자 지정…",
+ "settings.model.customized": "사용자 지정 모델 *",
+ "settings.model.refreshing": "모델 목록 새로 고침 중…",
+ "settings.permission.accessibility": "손쉬운 사용",
+ "settings.permission.openShort": "설정 열기",
+ "settings.privacy.clipboard": "• 텍스트 삽입 및 설정된 강제 선택 읽기 후 클립보드 내용 복원",
+ "settings.privacy.keychain": "• API 키는 이 Mac에 저장",
+ "settings.privacy.provider": "• 텍스트는 OpenAI로 직접 전송",
+ "settings.privacy.title": "개인정보 보호 및 보안",
+ "settings.provider.active": "사용 중",
+ "settings.provider.configured": "설정됨",
+ "settings.provider.notConfigured": "설정 안 됨",
+ "settings.provider.notLoaded": "저장된 키는 표시되지 않음",
+ "settings.provider.pendingKey": "새 키 저장 대기 중",
+ "settings.provider.pendingSave": "저장 대기 중",
+ "settings.provider.saved": "저장됨",
+ "settings.provider.savedLocally": "로컬에 저장됨",
+ "settings.quickStart.close": "뒤로 이동 또는 닫기",
+ "settings.quickStart.help": "팝오버에서 자주 사용하는 동작입니다.",
+ "settings.quickStart.open": "Inklet 열기",
+ "settings.quickStart.original": "원문 삽입",
+ "settings.quickStart.submit": "변환 또는 결과 삽입",
+ "settings.quickStart.title": "키보드 단축키",
+ "settings.row.apiKey": "API 키",
+ "settings.row.appearance": "모양",
+ "settings.row.description": "설명",
+ "settings.row.endpoint": "엔드포인트",
+ "settings.row.model": "모델",
+ "settings.row.name": "이름",
+ "settings.row.openAIAPIKey": "OpenAI API 키",
+ "settings.row.provider": "제공업체",
+ "settings.row.systemPrompt": "프롬프트",
+ "settings.row.timeout": "시간 제한",
+ "settings.section.about": "정보",
+ "settings.section.selectionAssistant": "선택 도우미",
+ "settings.section.writeAssistant": "글쓰기 도우미",
+ "settings.systemPermissions.title": "시스템 권한",
+ "settings.version": "버전 %@",
+ "settings.voice.shortcut.disabled": "비활성화",
+ "settings.voice.shortcut.leftCommand": "왼쪽 Command",
+ "settings.voice.shortcut.leftOption": "왼쪽 Option",
+ "settings.voice.shortcut.rightCommand": "오른쪽 Command",
+ "settings.voice.shortcut.rightOption": "오른쪽 Option",
+ "setup.done": "완료",
+ "setup.menubar.description": "시계 근처의 Inklet 아이콘을 클릭하면 언제든 열 수 있습니다.",
+ "setup.menubar.title": "메뉴 막대에서 Inklet 찾기",
+ "setup.shortcut.description": "기본 단축키는 %@입니다. 다른 앱과 충돌하면 설정에서 변경하세요.",
+ "setup.shortcut.title": "단축키 사용",
+ "setup.subtitle": "Inklet이 메뉴 막대에서 실행 중입니다. 사용 중인 앱에 텍스트를 삽입할 수 있도록 손쉬운 사용 권한을 허용하세요.",
+ "setup.title": "Inklet이 준비되었습니다",
+ "setup.window.title": "Inklet에 오신 것을 환영합니다"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+pt.swift b/Sources/InkletApp/Localization/L10n+pt.swift
new file mode 100644
index 0000000..e57d6b8
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+pt.swift
@@ -0,0 +1,317 @@
+// Portuguese interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let pt: [String: String] = [
+ "app.menu.edit": "Editar",
+ "app.menu.undo": "Desfazer",
+ "app.menu.redo": "Refazer",
+ "app.menu.cut": "Recortar",
+ "app.menu.copy": "Copiar",
+ "app.menu.paste": "Colar",
+ "app.menu.pasteAndMatchStyle": "Colar e Combinar Estilo",
+ "app.menu.delete": "Apagar",
+ "app.menu.selectAll": "Selecionar Tudo",
+ "app.menu.openPopover": "Abrir Inklet",
+ "app.menu.settings": "Ajustes",
+ "app.menu.about": "Sobre o Inklet",
+ "app.menu.quit": "Sair",
+ "app.menu.checkForUpdates": "Buscar atualizações…",
+ "app.menu.checkingForUpdates": "Buscando atualizações…",
+ "update.available.title": "Há uma atualização do Inklet disponível",
+ "update.available.latestVersion": "Mais recente: %@ (compilação %@)",
+ "update.available.currentVersion": "Atual: %@",
+ "update.available.noNotes": "Veja a versão no GitHub para obter detalhes.",
+ "update.action.viewOnGitHub": "Ver no GitHub",
+ "update.action.later": "Mais tarde",
+ "update.upToDate.title": "Inklet está atualizado",
+ "update.upToDate.message": "Você está usando %@.",
+ "update.error.title": "Não foi possível buscar atualizações",
+ "update.error.message": "Tente novamente em instantes.",
+ "update.action.retry": "Tentar novamente",
+ "update.action.cancel": "Cancelar",
+ "update.action.ok": "OK",
+ "legacyMigration.notice.title": "Os dados antigos do Inklet não foram importados",
+ "legacyMigration.notice.message": "Suas configurações e seu histórico anteriores continuam preservados. Você pode escolher a pasta Inklet Data correspondente para importá-los.",
+ "legacyMigration.action.importOldData": "Importar dados…",
+ "legacyMigration.panel.title": "Selecionar dados antigos do Inklet",
+ "legacyMigration.panel.message": "Selecione a pasta Inklet Data correspondente para importar as configurações e o histórico preservados.",
+ "legacyMigration.import.progress": "Importando dados…",
+ "legacyMigration.import.invalidSelection": "A pasta selecionada não é a pasta de dados antigos correspondente a este aplicativo Inklet.",
+ "legacyMigration.import.failed": "Não foi possível importar os dados antigos. Suas configurações e seu histórico continuam preservados.",
+ "legacyMigration.import.partialFailure": "Não foi possível importar alguns dados antigos. Suas configurações e seu histórico continuam preservados.",
+ "legacyMigration.import.relaunching": "O Inklet precisa ser reiniciado para concluir o carregamento dos dados importados.",
+ "legacyMigration.import.relaunchProgress": "Reiniciando o Inklet…",
+ "legacyMigration.import.relaunchFailed": "Não foi possível reiniciar o Inklet. Os dados importados estão prontos e serão carregados na próxima vez que você abrir o Inklet.",
+ "legacyMigration.action.retryRelaunch": "Reiniciar o Inklet",
+ "legacyMigration.action.quit": "Sair do Inklet",
+ "legacyMigration.settings.help": "Importe suas configurações e seu histórico preservados da pasta Inklet Data correspondente.",
+ "settings.section.history": "Histórico",
+ "settings.description.history": "Revise resultados de escrita e seleção, além de resultados antigos de voz salvos localmente.",
+ "settings.history.filter.all": "Tudo",
+ "settings.history.source.write": "Escrita",
+ "settings.history.source.voice": "Voz",
+ "settings.history.source.selection": "Seleção",
+ "settings.history.empty": "Ainda não há histórico salvo.",
+ "settings.history.original": "Original",
+ "settings.history.result": "Resultado",
+ "settings.history.copyOriginal": "Copiar original",
+ "settings.history.copyResult": "Copiar resultado",
+ "settings.history.clear": "Limpar histórico",
+ "settings.history.clearConfirmTitle": "Limpar histórico?",
+ "settings.history.clearConfirmMessage": "Isso exclui deste Mac todos os registros de histórico salvos. Esta ação não pode ser desfeita.",
+ "settings.history.cleared": "Histórico limpo.",
+ "settings.history.error.loadFailed": "Não foi possível carregar o histórico.",
+ "settings.history.error.clearFailed": "Não foi possível limpar o histórico.",
+ "settings.privacy.history": "• O histórico bem-sucedido de escrita e seleção fica salvo localmente; o histórico antigo de voz continua disponível",
+ "settings.group.writing": "Escrita",
+ "settings.group.writing.help": "Configure o Writing Assistant e seu rascunho de origem editável.",
+ "settings.group.dictation": "Ditado",
+ "settings.group.dictation.help": "Segure o atalho enquanto fala para enviar o áudio do microfone à OpenAI em tempo real.",
+ "settings.group.dictationAdvanced": "Ditado avançado",
+ "settings.row.dictationShortcut": "Atalho ao segurar",
+ "settings.help.dictationShortcut": "Funciona somente quando o editor de origem do Writing Assistant está ativo. Um toque curto não faz nada.",
+ "settings.quickStart.voice.pressAndHold": "Segurar para entrada de voz",
+ "settings.row.microphone": "Microfone",
+ "settings.help.microphone": "Escolha a entrada de áudio usada para ditado em tempo real.",
+ "settings.microphone.systemDefault": "Padrão do sistema",
+ "settings.row.fallbackSpeechModel": "Modelo de recuperação",
+ "settings.help.fallbackSpeechModel": "Modelo usado na única tentativa de recuperação após falha da conexão em tempo real.",
+ "dictation.hint.hold": "Segure %@ para ditar",
+ "dictation.status.connecting": "Conectando…",
+ "dictation.status.listening": "Ouvindo… Solte para concluir",
+ "dictation.status.recordingFallback": "Conexão perdida… Continue falando",
+ "dictation.status.finalizing": "Finalizando transcrição…",
+ "dictation.status.recovering": "Recuperando da gravação temporária…",
+ "dictation.status.ready": "Ditado pronto",
+ "dictation.accessibility.ready": "O ditado está pronto.",
+ "dictation.accessibility.listening": "O ditado está ouvindo. Solte para concluir.",
+ "dictation.accessibility.recordingFallback": "A conexão foi perdida. Continue falando para permitir a recuperação.",
+ "dictation.accessibility.finalizing": "Finalizando a transcrição do ditado.",
+ "dictation.accessibility.recovering": "Recuperando o ditado da gravação temporária.",
+ "dictation.accessibility.completed": "Ditado concluído.",
+ "dictation.accessibility.cancelled": "Ditado cancelado.",
+ "dictation.accessibility.failed": "Falha no ditado.",
+ "dictation.accessibility.sourceEditor": "Editor de origem da escrita",
+ "dictation.undo.action": "Ditado",
+ "dictation.error.missingAPIKey": "Adicione uma chave de API da OpenAI nos Ajustes para usar o ditado.",
+ "dictation.error.microphonePermission": "O ditado exige permissão para usar o microfone.",
+ "dictation.error.noAudioInputDevice": "Nenhum microfone ou dispositivo de entrada de áudio está disponível.",
+ "dictation.error.recordingUnavailable": "Não foi possível iniciar a gravação de áudio.",
+ "dictation.error.realtimeBufferOverflow": "O processamento do áudio em tempo real não acompanhou. Tente novamente.",
+ "dictation.error.connection": "Falha na conexão de transcrição em tempo real.",
+ "dictation.error.connectionTimeout": "A conexão de transcrição em tempo real expirou.",
+ "dictation.error.finalTimeout": "A transcrição final em tempo real não chegou a tempo.",
+ "dictation.error.fallback": "Não foi possível recuperar o ditado da gravação temporária.",
+ "dictation.error.noSpeech": "Nenhuma fala foi reconhecida.",
+ "settings.privacy.voice": "• O áudio do ditado em tempo real e o texto de pronúncia são enviados diretamente à OpenAI; gravações de recuperação são apagadas no fim da sessão",
+ "settings.section.selectionActions": "Ações de seleção",
+ "settings.description.selectionActions": "Gerencie ações automáticas para texto selecionado em outros apps.",
+ "settings.row.selectionActionsEnabled": "Ativar ações de seleção",
+ "settings.help.selectionActionsEnabled": "Mostra um pequeno menu após uma breve pausa ao selecionar texto.",
+ "settings.row.forceSelectionMode": "Seleção forçada",
+ "settings.help.forceSelectionMode": "Alternativa quando Acessibilidade não consegue ler o texto selecionado. A cópia pelo menu não simula entrada de teclado.",
+ "settings.forceSelection.disabled": "Desativada",
+ "settings.forceSelection.menuCopyOnly": "Só copiar pelo menu",
+ "settings.forceSelection.menuCopyThenShortcut": "Menu Copiar, depois Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "Cmd+C, depois menu Copiar",
+ "settings.row.allowSimulatedCopyFallback": "Permitir Cmd+C simulado",
+ "settings.help.allowSimulatedCopyFallback": "Envia Cmd+C ao app em primeiro plano quando a cópia pelo menu não está disponível. Pode interferir em jogos ou apps remotos.",
+ "settings.row.translationLanguage": "Idioma de tradução",
+ "settings.help.translationLanguage": "Idioma usado pela ação Traduzir do texto selecionado.",
+ "settings.row.translationPrompt": "Prompt de tradução",
+ "settings.help.translationPrompt": "Instruções para Traduzir texto selecionado. Use {targetLanguage} para o idioma escolhido.",
+ "settings.translationPrompt.restoreDefault": "Restaurar padrão",
+ "settings.row.aiPronunciation": "Voz de pronúncia com IA",
+ "settings.help.aiPronunciation": "Voz usada por Pronunciar no texto selecionado. Usa OpenAI text-to-speech com sua OpenAI API key.",
+ "settings.row.aiPronunciationSpeed": "Velocidade da pronúncia com IA",
+ "settings.help.aiPronunciationSpeed": "Velocidade de reprodução usada para Pronunciar texto selecionado e pré-visualizar a voz.",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "Previsualizar voz",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "Seguir idioma da interface",
+ "selection.action.translate": "Traduzir",
+ "selection.action.pronounce": "Pronunciar",
+ "selection.action.translating": "Traduzindo...",
+ "selection.action.preparingPronunciation": "Preparando áudio...",
+ "selection.action.playingPronunciation": "Reproduzindo...",
+ "selection.action.pronounceOriginal": "Reproduzir original",
+ "selection.action.pronounceTranslation": "Reproduzir traducao",
+ "selection.action.audioLabel.original": "Orig.",
+ "selection.action.audioLabel.translation": "Trad.",
+ "selection.action.copyTranslation": "Copiar tradução",
+ "selection.action.retry": "Tentar novamente",
+ "selection.action.unsupportedTitle": "Texto selecionado indisponível",
+ "selection.action.unsupportedMessage": "O app atual não expõe o texto selecionado ao Inklet.",
+ "selection.action.missingOpenAIKey": "Adicione uma OpenAI API key nos Ajustes para usar pronúncia com IA.",
+ "selection.action.translationFailed": "Falha na tradução.",
+ "selection.action.pronunciationFailed": "Falha na pronúncia.",
+ "about.tagline": "Transforme suas ideias em textos claros",
+ "about.website": "Site",
+ "about.privacyPolicy": "Política de privacidade",
+ "about.support": "Suporte",
+ "language.system": "Sistema",
+ "settings.window.title": "Ajustes do Inklet",
+ "settings.sidebar.preferences": "Preferências",
+ "settings.sidebar.hint": "Salvo automaticamente · ⌘, Abrir",
+ "settings.section.general": "Geral",
+ "settings.section.providers": "Provedores",
+ "settings.section.promptModes": "Modos de prompt",
+ "settings.section.permissions": "Permissões",
+ "settings.description.general": "Comportamento, atalho, idioma da interface e parâmetros de geração.",
+ "settings.description.providers": "Escolha provedor LLM, modelo e API key.",
+ "settings.description.promptModes": "Gerencie modos de conversão e prompts do sistema.",
+ "settings.description.permissions": "Verifique a permissão do macOS necessária para inserir texto.",
+ "settings.row.language": "Idioma da interface",
+ "settings.help.language": "System segue o idioma do macOS.",
+ "settings.row.hotkey": "Atalho",
+ "settings.help.timeout": "Duração máxima da solicitação.",
+ "settings.seconds": "%d s",
+ "settings.help.provider": "Provedor atual.",
+ "settings.help.apiKey": "Salva localmente neste Mac.",
+ "settings.help.model.default": "Padrão: %@",
+ "settings.mode.untitled": "Modo sem título",
+ "settings.mode.pick": "Selecione um modo de prompt",
+ "settings.help.name": "Nome mostrado no painel.",
+ "settings.help.description": "O que este modo faz.",
+ "settings.characters": "%d caracteres",
+ "settings.permission.authorized": "Accessibility autorizado",
+ "settings.permission.required": "Permissão Accessibility necessária",
+ "settings.permission.description": "Clique em Abrir Ajustes, clique em +, escolha /Applications/Inklet.app e ative o Inklet.",
+ "settings.permission.open": "Abrir Ajustes do Sistema",
+ "settings.footer.pending": "As alterações são salvas automaticamente e se aplicam na próxima vez que o painel abrir.",
+ "settings.save": "Salvar",
+ "settings.saved": "Salvo",
+ "settings.error.visibleModeRequired": "Mantenha pelo menos um modo visível.",
+ "settings.error.modelRequired": "Model não pode estar vazio.",
+ "settings.error.openAccessibility": "Não foi possível abrir Accessibility.",
+ "settings.error.saveFailed": "Falha ao salvar: %@",
+ "popover.input.placeholder": "Digite texto para transformar ou inserir",
+ "popover.modeSearch.placeholder": "Buscar modos",
+ "popover.modeSearch.empty": "Nenhum modo correspondente",
+ "popover.modeSearch.select": "Selecionar",
+ "popover.modeSearch.write": "Escrever",
+ "popover.result.title": "Resultado",
+ "popover.result.editable": "Editável antes de inserir",
+ "popover.result.generatedWith": "Gerado com %@",
+ "popover.mode.picker": "Modo",
+ "popover.mode.backToModes": "Escolher modo",
+ "popover.action.transform": "Transformar",
+ "popover.action.regenerate": "Gerar novamente",
+ "popover.action.insert": "Inserir",
+ "popover.action.insertOriginal": "Inserir original",
+ "popover.hint.transformInsert": "Transformar/Inserir",
+ "popover.hint.original": "Original",
+ "popover.hint.accessibility": "Atalhos: Enter transforma ou insere, Command Enter insere o original, Escape volta ou fecha",
+ "popover.busy.inserting": "Inserindo...",
+ "popover.busy.transforming": "Transformando...",
+ "popover.error.emptyOriginal": "Digite texto para inserir.",
+ "popover.error.missingTarget": "Não foi possível encontrar o app de destino.",
+ "popover.error.missingAPIKey": "Configure a API Key de %@ nos Ajustes.",
+ "insertion.error.accessibility": "Ative a permissão Accessibility antes de inserir texto.",
+ "insertion.error.activation": "Não foi possível voltar ao app original. Tente novamente.",
+ "insertion.error.pasteEvent": "Não foi possível enviar o atalho de colar.",
+ "insertion.error.clipboardRestore": "Texto inserido, mas não foi possível restaurar a área de transferência.",
+ "error.emptySource": "Digite texto para transformar.",
+ "error.emptyResponse": "O modelo retornou uma resposta vazia.",
+ "error.timeout": "A solicitação expirou. Tente novamente.",
+ "error.networkConnectionLost": "A conexão de rede foi interrompida. Tente novamente.",
+ "error.provider.urlInvalid": "A solicitação %@ falhou: URL inválida",
+ "error.provider.httpUnknown": "A solicitação %@ falhou: HTTP unknown",
+ "error.provider.prefix": "A solicitação %@ falhou: %@",
+ "hotkey.error.unsupported": "Atalho não suportado “%@”. Suportados: ⌥Space, Option+Space, Alt+Space, ⌘Space, Command+Space, Cmd+Space.",
+ "hotkey.error.registrationFailed": "Falha ao registrar atalho (%d).",
+ "prompt.custom.description": "Usa seu prompt personalizado",
+ "appearance.dark": "Escuro",
+ "appearance.light": "Claro",
+ "appearance.system": "Sistema",
+ "popover.hint.back": "Voltar",
+ "popover.hint.close": "Fechar",
+ "popover.hint.mode": "Modo",
+ "popover.hint.newLine": "Nova linha",
+ "popover.status.preview": "Prévia",
+ "popover.status.ready": "Pronto",
+ "prompt.chineseSummary.description": "Resume qualquer texto de forma concisa em chinês simplificado",
+ "prompt.friendlyReply.description": "Reescreve como uma resposta natural e amigável",
+ "prompt.improveWriting.description": "Melhora a escrita mantendo o idioma original",
+ "prompt.makeConcise.description": "Encurta o texto mantendo o idioma original e os pontos principais",
+ "prompt.professionalTone.description": "Reescreve com um tom mais claro e profissional",
+ "prompt.simpleCorrectEnglish.description": "Reescreve ou traduz para um inglês simples e correto",
+ "prompt.translateToEnglish.description": "Reescreve ou traduz para um inglês simples e correto",
+ "settings.cancel": "Cancelar",
+ "settings.description.about": "Atalhos de teclado, notas de privacidade e informações do app.",
+ "settings.description.selectionAssistant": "Ferramentas de tradução e pronúncia para texto selecionado em outros apps.",
+ "settings.description.writeAssistant": "Configure a escrita, o ditado, a geração e os modos de instruções.",
+ "settings.error.endpointInvalid": "O endpoint deve ser um URL HTTP válido.",
+ "settings.error.promptModeRequired": "Mantenha pelo menos um modo de instruções.",
+ "settings.help.appearance": "Escolha Claro, Escuro ou seguir o macOS.",
+ "settings.help.endpoint": "URL completo de /chat/completions compatível com OpenAI.",
+ "settings.help.hotkey": "Por exemplo: ⌥Space, Option+Space, Cmd+Space.",
+ "settings.help.openAIAPIKey": "Armazenada neste Mac e compartilhada entre escrita, ditado em tempo real, tradução e pronúncia. Esvazie o campo para removê-la.",
+ "settings.hotkey.pressKey": " tecla",
+ "settings.hotkey.record": "Gravar atalho",
+ "settings.hotkey.recording": "Pressione o atalho",
+ "settings.mode.add": "Adicionar modo",
+ "settings.mode.delete": "Excluir modo",
+ "settings.mode.deleteConfirmMessage": "Excluir “%@”? Esta ação não pode ser desfeita.",
+ "settings.mode.deleteConfirmTitle": "Excluir modo de instruções?",
+ "settings.mode.dragToSort": "Arraste para reordenar",
+ "settings.mode.hidden": "Oculto",
+ "settings.mode.moveDown": "Mover para baixo",
+ "settings.mode.moveUp": "Mover para cima",
+ "settings.mode.newDescription": "Modo de transformação personalizado",
+ "settings.mode.newName": "Novo modo",
+ "settings.mode.visible": "Visível",
+ "settings.mode.visibleInMenu": "Mostrar no menu",
+ "settings.mode.visibleInMenuHelp": "Mostra este modo no seletor de modos.",
+ "settings.model.custom": "Personalizado…",
+ "settings.model.customized": "Modelo personalizado *",
+ "settings.model.refreshing": "Atualizando modelos…",
+ "settings.permission.accessibility": "Acessibilidade",
+ "settings.permission.openShort": "Abrir ajustes",
+ "settings.privacy.clipboard": "• A área de transferência é restaurada após a inserção e a leitura por seleção forçada",
+ "settings.privacy.keychain": "• As chaves de API são armazenadas neste Mac",
+ "settings.privacy.provider": "• O texto é enviado diretamente à OpenAI",
+ "settings.privacy.title": "Privacidade e segurança",
+ "settings.provider.active": "Ativo",
+ "settings.provider.configured": "Configurado",
+ "settings.provider.notConfigured": "Não configurado",
+ "settings.provider.notLoaded": "As chaves salvas não são exibidas",
+ "settings.provider.pendingKey": "Nova chave pronta para salvar",
+ "settings.provider.pendingSave": "Aguardando salvamento",
+ "settings.provider.saved": "Salvo",
+ "settings.provider.savedLocally": "Salvo localmente",
+ "settings.quickStart.close": "Voltar ou fechar",
+ "settings.quickStart.help": "Ações comuns na janela pop-up.",
+ "settings.quickStart.open": "Abrir Inklet",
+ "settings.quickStart.original": "Inserir texto original",
+ "settings.quickStart.submit": "Transformar ou inserir o resultado",
+ "settings.quickStart.title": "Atalhos de teclado",
+ "settings.row.apiKey": "Chave de API",
+ "settings.row.appearance": "Aparência",
+ "settings.row.description": "Descrição",
+ "settings.row.endpoint": "Endpoint",
+ "settings.row.model": "Modelo",
+ "settings.row.name": "Nome",
+ "settings.row.openAIAPIKey": "Chave de API OpenAI",
+ "settings.row.provider": "Provedor",
+ "settings.row.systemPrompt": "Instruções",
+ "settings.row.timeout": "Tempo limite",
+ "settings.section.about": "Sobre",
+ "settings.section.selectionAssistant": "Assistente de seleção",
+ "settings.section.writeAssistant": "Assistente de escrita",
+ "settings.systemPermissions.title": "Permissões do sistema",
+ "settings.version": "Versão %@",
+ "settings.voice.shortcut.disabled": "Desativado",
+ "settings.voice.shortcut.leftCommand": "Command esquerdo",
+ "settings.voice.shortcut.leftOption": "Option esquerdo",
+ "settings.voice.shortcut.rightCommand": "Command direito",
+ "settings.voice.shortcut.rightOption": "Option direito",
+ "setup.done": "Concluído",
+ "setup.menubar.description": "Clique no ícone do Inklet perto do relógio sempre que quiser abri-lo.",
+ "setup.menubar.title": "Encontre o Inklet na barra de menus",
+ "setup.shortcut.description": "O atalho padrão é %@. Se houver conflito com outro app, altere-o nos Ajustes.",
+ "setup.shortcut.title": "Use o atalho",
+ "setup.subtitle": "O Inklet está na barra de menus. Conceda a permissão de Acessibilidade para que ele possa inserir texto no app em uso.",
+ "setup.title": "O Inklet está pronto",
+ "setup.window.title": "Boas-vindas ao Inklet"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+zhHans.swift b/Sources/InkletApp/Localization/L10n+zhHans.swift
new file mode 100644
index 0000000..cbbf283
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+zhHans.swift
@@ -0,0 +1,317 @@
+// Simplified Chinese interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let zhHans: [String: String] = [
+ "app.menu.edit": "编辑",
+ "app.menu.undo": "撤销",
+ "app.menu.redo": "重做",
+ "app.menu.cut": "剪切",
+ "app.menu.copy": "复制",
+ "app.menu.paste": "粘贴",
+ "app.menu.pasteAndMatchStyle": "粘贴并匹配样式",
+ "app.menu.delete": "删除",
+ "app.menu.selectAll": "全选",
+ "app.menu.openPopover": "打开 Inklet",
+ "app.menu.settings": "设置",
+ "app.menu.about": "关于 Inklet",
+ "app.menu.quit": "退出",
+ "app.menu.checkForUpdates": "检查更新…",
+ "app.menu.checkingForUpdates": "正在检查更新…",
+ "update.available.title": "Inklet 有可用更新",
+ "update.available.latestVersion": "最新版本:%@(构建 %@)",
+ "update.available.currentVersion": "当前版本:%@",
+ "update.available.noNotes": "请前往 GitHub 查看发布详情。",
+ "update.action.viewOnGitHub": "在 GitHub 上查看",
+ "update.action.later": "稍后",
+ "update.upToDate.title": "Inklet 已是最新版本",
+ "update.upToDate.message": "你正在使用 %@。",
+ "update.error.title": "无法检查更新",
+ "update.error.message": "请稍后重试。",
+ "update.action.retry": "重试",
+ "update.action.cancel": "取消",
+ "update.action.ok": "好",
+ "legacyMigration.notice.title": "旧版 Inklet 数据尚未导入",
+ "legacyMigration.notice.message": "你之前的设置和历史记录仍被保留。你可以选择对应的 Inklet Data 文件夹进行导入。",
+ "legacyMigration.action.importOldData": "导入旧数据…",
+ "legacyMigration.panel.title": "选择旧版 Inklet 数据",
+ "legacyMigration.panel.message": "请选择对应的 Inklet Data 文件夹,以导入仍被保留的设置和历史记录。",
+ "legacyMigration.import.progress": "正在导入旧数据…",
+ "legacyMigration.import.invalidSelection": "所选文件夹不是当前 Inklet 对应的旧数据文件夹。",
+ "legacyMigration.import.failed": "无法导入旧数据。你之前的设置和历史记录仍被保留。",
+ "legacyMigration.import.partialFailure": "部分旧数据未能导入。你之前的设置和历史记录仍被保留。",
+ "legacyMigration.import.relaunching": "Inklet 需要重新启动以载入已导入的数据。",
+ "legacyMigration.import.relaunchProgress": "正在重新启动…",
+ "legacyMigration.import.relaunchFailed": "Inklet 无法重新启动。已导入的数据已准备就绪,将在下次打开 Inklet 时载入。",
+ "legacyMigration.action.retryRelaunch": "重新启动 Inklet",
+ "legacyMigration.action.quit": "退出 Inklet",
+ "legacyMigration.settings.help": "从对应的 Inklet Data 文件夹导入仍被保留的设置和历史记录。",
+ "settings.section.history": "历史",
+ "settings.description.history": "查看保存在本机的成功写作和选区结果,以及旧版语音结果。",
+ "settings.history.filter.all": "全部",
+ "settings.history.source.write": "写作",
+ "settings.history.source.voice": "语音",
+ "settings.history.source.selection": "选区",
+ "settings.history.empty": "还没有保存的历史。",
+ "settings.history.original": "原文",
+ "settings.history.result": "结果",
+ "settings.history.copyOriginal": "复制原文",
+ "settings.history.copyResult": "复制结果",
+ "settings.history.clear": "清空历史",
+ "settings.history.clearConfirmTitle": "清空历史?",
+ "settings.history.clearConfirmMessage": "这会从这台 Mac 删除所有已保存的历史记录。此操作无法撤销。",
+ "settings.history.cleared": "历史已清空。",
+ "settings.history.error.loadFailed": "无法加载历史。",
+ "settings.history.error.clearFailed": "无法清空历史。",
+ "settings.privacy.history": "• 成功的写作和选区文本历史会保存在本机;旧版语音记录仍可读取",
+ "selection.action.translate": "翻译",
+ "selection.action.pronounce": "发音",
+ "selection.action.translating": "正在翻译...",
+ "selection.action.preparingPronunciation": "正在准备音频...",
+ "selection.action.playingPronunciation": "正在播放...",
+ "selection.action.pronounceOriginal": "播放原文",
+ "selection.action.pronounceTranslation": "播放译文",
+ "selection.action.audioLabel.original": "原文",
+ "selection.action.audioLabel.translation": "译文",
+ "selection.action.copyTranslation": "复制译文",
+ "selection.action.retry": "重试",
+ "selection.action.unsupportedTitle": "无法取得选中文本",
+ "selection.action.unsupportedMessage": "当前 App 未将选中文本提供给 Inklet。",
+ "selection.action.missingOpenAIKey": "请在设置中添加 OpenAI API key 以使用 AI 发音。",
+ "selection.action.translationFailed": "翻译失败。",
+ "selection.action.pronunciationFailed": "发音失败。",
+ "about.tagline": "将粗略想法化为清晰文字",
+ "about.website": "官网",
+ "about.privacyPolicy": "隐私政策",
+ "about.support": "支持",
+ "setup.window.title": "欢迎使用 Inklet",
+ "setup.title": "Inklet 已准备好",
+ "setup.subtitle": "它正在菜单栏中运行。开启辅助功能权限后,Inklet 才能把文本插回你正在使用的 app。",
+ "setup.menubar.title": "在菜单栏找到 Inklet",
+ "setup.menubar.description": "需要打开 Inklet 时,点击屏幕右上角时钟附近的 Inklet 图标。",
+ "setup.shortcut.title": "使用快捷键",
+ "setup.shortcut.description": "默认快捷键是 %@。如果和其他 app 冲突,可以在设置里修改。",
+ "setup.done": "完成",
+ "language.system": "跟随系统",
+ "settings.window.title": "Inklet 设置",
+ "settings.sidebar.preferences": "偏好设置",
+ "settings.sidebar.hint": "自动保存 · ⌘, 打开",
+ "settings.version": "版本 %@",
+ "settings.section.general": "通用",
+ "settings.section.writeAssistant": "写作助手",
+ "settings.section.selectionAssistant": "选区助手",
+ "settings.section.providers": "模型服务商",
+ "settings.section.selectionActions": "选区动作",
+ "settings.section.promptModes": "Prompt 模式",
+ "settings.section.about": "关于",
+ "settings.section.permissions": "权限",
+ "settings.description.general": "共享 OpenAI API Key、界面偏好、权限和隐私。",
+ "settings.description.writeAssistant": "配置写作、听写、生成参数和 Prompt 模式。",
+ "settings.description.selectionAssistant": "管理其他 App 中选中文字后的翻译和发音工具。",
+ "settings.description.providers": "选择 LLM 服务商、模型和对应的 API Key。",
+ "settings.description.selectionActions": "管理其他 App 中选中文本后的自动动作。",
+ "settings.description.promptModes": "管理浮窗中的转换模式和系统提示词。",
+ "settings.description.about": "查看键盘快捷键、隐私说明和应用信息。",
+ "settings.description.permissions": "检查插入文本所需的 macOS 权限。",
+ "settings.row.language": "界面语言",
+ "settings.help.language": "选择 System 时跟随 macOS 语言。",
+ "settings.row.appearance": "外观",
+ "settings.help.appearance": "选择浅色、深色,或跟随 macOS。",
+ "appearance.system": "跟随系统",
+ "appearance.light": "浅色",
+ "appearance.dark": "深色",
+ "settings.row.hotkey": "快捷键",
+ "settings.help.hotkey": "例如 ⌥Space、Option+Space、Cmd+Space。",
+ "settings.hotkey.record": "录制快捷键",
+ "settings.hotkey.recording": "按下快捷键",
+ "settings.hotkey.pressKey": " 键",
+ "settings.row.timeout": "超时时间",
+ "settings.help.timeout": "请求最长等待时间。",
+ "settings.seconds": "%d 秒",
+ "settings.row.provider": "服务商",
+ "settings.help.provider": "当前服务商。",
+ "settings.row.openAIAPIKey": "OpenAI API Key",
+ "settings.help.openAIAPIKey": "保存在本机,写作、实时听写、选区翻译和发音共用这一把 Key;清空输入框即可删除。",
+ "settings.row.apiKey": "API Key",
+ "settings.help.apiKey": "API Key 会保存在本机;清空输入框即可删除。",
+ "settings.row.endpoint": "接口地址",
+ "settings.help.endpoint": "完整的 OpenAI-compatible /chat/completions URL。",
+ "settings.row.model": "模型",
+ "settings.help.model.default": "默认:%@",
+ "settings.group.writing": "写作",
+ "settings.group.writing.help": "配置写作助手及其可编辑的原文草稿。",
+ "settings.group.dictation": "听写",
+ "settings.group.dictation.help": "说话时长按快捷键,麦克风音频会实时发送到 OpenAI。",
+ "settings.group.dictationAdvanced": "高级听写",
+ "settings.row.dictationShortcut": "长按快捷键",
+ "settings.help.dictationShortcut": "仅在写作助手的原文编辑器处于活动状态时生效;短按不会执行任何操作。",
+ "settings.voice.shortcut.rightOption": "右 Option",
+ "settings.voice.shortcut.rightCommand": "右 Command",
+ "settings.voice.shortcut.leftOption": "左 Option",
+ "settings.voice.shortcut.leftCommand": "左 Command",
+ "settings.voice.shortcut.disabled": "关闭",
+ "settings.quickStart.voice.pressAndHold": "按住进行语音输入",
+ "settings.row.microphone": "麦克风",
+ "settings.help.microphone": "选择实时听写使用的音频输入设备。",
+ "settings.microphone.systemDefault": "系统默认",
+ "settings.row.fallbackSpeechModel": "恢复转写模型",
+ "settings.help.fallbackSpeechModel": "实时连接失败后单次恢复尝试所使用的模型。",
+ "dictation.hint.hold": "长按 %@ 开始听写",
+ "dictation.status.connecting": "正在连接…",
+ "dictation.status.listening": "正在听写…松开以完成",
+ "dictation.status.recordingFallback": "连接已断开…可继续说话",
+ "dictation.status.finalizing": "正在完成转写…",
+ "dictation.status.recovering": "正在使用临时录音恢复…",
+ "dictation.status.ready": "听写已就绪",
+ "dictation.accessibility.ready": "听写已准备就绪。",
+ "dictation.accessibility.listening": "正在听写,松开快捷键以完成。",
+ "dictation.accessibility.recordingFallback": "连接已断开,可继续说话以便恢复。",
+ "dictation.accessibility.finalizing": "正在完成听写转写。",
+ "dictation.accessibility.recovering": "正在从临时录音恢复听写。",
+ "dictation.accessibility.completed": "听写已完成。",
+ "dictation.accessibility.cancelled": "听写已取消。",
+ "dictation.accessibility.failed": "听写失败。",
+ "dictation.accessibility.sourceEditor": "写作原文编辑器",
+ "dictation.undo.action": "听写",
+ "dictation.error.missingAPIKey": "请在设置中添加 OpenAI API Key 后使用听写。",
+ "dictation.error.microphonePermission": "听写需要麦克风权限。",
+ "dictation.error.noAudioInputDevice": "没有可用的麦克风或音频输入设备。",
+ "dictation.error.recordingUnavailable": "无法开始录音。",
+ "dictation.error.realtimeBufferOverflow": "实时音频处理不及,请重试。",
+ "dictation.error.connection": "实时转写连接失败。",
+ "dictation.error.connectionTimeout": "实时转写连接超时。",
+ "dictation.error.finalTimeout": "未能及时收到最终实时转写。",
+ "dictation.error.fallback": "无法使用临时录音恢复听写。",
+ "dictation.error.noSpeech": "未识别到语音。",
+ "settings.row.selectionActionsEnabled": "启用选区动作",
+ "settings.help.selectionActionsEnabled": "选中文本并短暂停顿后显示小菜单。",
+ "settings.row.forceSelectionMode": "强制取词",
+ "settings.help.forceSelectionMode": "辅助功能无法读取选中文本时使用此备用方式。菜单复制不会模拟键盘输入。",
+ "settings.forceSelection.disabled": "关闭",
+ "settings.forceSelection.menuCopyOnly": "仅菜单复制",
+ "settings.forceSelection.menuCopyThenShortcut": "先菜单复制,再 Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "先 Cmd+C,再菜单复制",
+ "settings.row.allowSimulatedCopyFallback": "允许模拟 Cmd+C",
+ "settings.help.allowSimulatedCopyFallback": "菜单复制不可用时向前台 App 发送 Cmd+C,可能会干扰游戏或远程应用。",
+ "settings.row.translationLanguage": "翻译语言",
+ "settings.help.translationLanguage": "选中文本翻译动作使用的目标语言。",
+ "settings.row.translationPrompt": "翻译 Prompt",
+ "settings.help.translationPrompt": "选中文本翻译动作使用的指令。用 {targetLanguage} 表示所选语言。",
+ "settings.translationPrompt.restoreDefault": "恢复默认",
+ "settings.row.aiPronunciation": "AI 发音声音",
+ "settings.help.aiPronunciation": "选中文字后“发音”使用的声音。使用 OpenAI API key 调用 OpenAI 文本转语音。",
+ "settings.row.aiPronunciationSpeed": "AI 发音速度",
+ "settings.help.aiPronunciationSpeed": "选中文字“发音”和试听声音使用的播放速度。",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "试听声音",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "跟随界面语言",
+ "settings.model.custom": "自定义...",
+ "settings.model.refreshing": "正在刷新模型列表...",
+ "settings.model.customized": "自定义模型 *",
+ "settings.mode.untitled": "未命名模式",
+ "settings.mode.add": "添加模式",
+ "settings.mode.newName": "新模式",
+ "settings.mode.newDescription": "自定义转换模式",
+ "settings.mode.visible": "显示",
+ "settings.mode.hidden": "隐藏",
+ "settings.mode.pick": "选择一个 Prompt Mode",
+ "settings.mode.visibleInMenu": "在菜单中显示",
+ "settings.mode.visibleInMenuHelp": "在浮窗的模式选择器中显示该模式。",
+ "settings.mode.moveUp": "上移",
+ "settings.mode.moveDown": "下移",
+ "settings.mode.dragToSort": "拖动排序",
+ "settings.mode.delete": "删除模式",
+ "settings.mode.deleteConfirmTitle": "删除这个 Prompt Mode?",
+ "settings.mode.deleteConfirmMessage": "确定删除“%@”?此操作无法撤销。",
+ "settings.cancel": "取消",
+ "settings.provider.configured": "已配置",
+ "settings.provider.notConfigured": "未配置",
+ "settings.provider.active": "当前启用",
+ "settings.provider.saved": "已保存",
+ "settings.provider.savedLocally": "已保存到本机",
+ "settings.provider.pendingKey": "新 Key 待保存",
+ "settings.provider.notLoaded": "已保存的 Key 不会显示",
+ "settings.provider.pendingSave": "待保存",
+ "settings.row.name": "名称",
+ "settings.help.name": "浮窗中显示的名称。",
+ "settings.row.description": "描述",
+ "settings.help.description": "模式用途说明。",
+ "settings.row.systemPrompt": "Prompt",
+ "settings.characters": "%d 字符",
+ "settings.permission.authorized": "Accessibility 已授权",
+ "settings.permission.required": "需要 Accessibility 权限",
+ "settings.permission.accessibility": "辅助功能",
+ "settings.permission.description": "点击“打开设置”,点 +,选择 /Applications/Inklet.app,然后开启 Inklet。",
+ "settings.permission.open": "打开系统权限设置",
+ "settings.permission.openShort": "打开设置",
+ "settings.systemPermissions.title": "系统权限",
+ "settings.quickStart.title": "键盘快捷键",
+ "settings.quickStart.help": "浮窗里的常用操作。",
+ "settings.quickStart.open": "打开 Inklet",
+ "settings.quickStart.submit": "转换,或插入结果",
+ "settings.quickStart.original": "插入原文",
+ "settings.quickStart.close": "返回或关闭",
+ "settings.privacy.title": "隐私与安全",
+ "settings.privacy.keychain": "• API Key 保存在本机",
+ "settings.privacy.provider": "• 文本会直接发送到 OpenAI",
+ "settings.privacy.voice": "• 实时听写音频和发音文本会直接发送到 OpenAI;恢复录音仅临时保存在本机,并在会话结束时删除",
+ "settings.privacy.clipboard": "• 插入和已配置的强制取词读取后会恢复原剪贴板内容",
+ "settings.footer.pending": "更改会自动保存,并在下一次浮窗打开时应用。",
+ "settings.save": "保存",
+ "settings.saved": "已保存",
+ "settings.error.visibleModeRequired": "至少需要保留一个可见模式。",
+ "settings.error.promptModeRequired": "至少需要保留一个 Prompt 模式。",
+ "settings.error.modelRequired": "Model 不能为空。",
+ "settings.error.endpointInvalid": "Endpoint 必须是有效的 HTTP URL。",
+ "settings.error.openAccessibility": "无法打开辅助功能设置。",
+ "settings.error.saveFailed": "保存失败:%@",
+ "popover.input.placeholder": "输入要转换或插入的文本",
+ "popover.modeSearch.placeholder": "搜索模式",
+ "popover.modeSearch.empty": "没有匹配的模式",
+ "popover.modeSearch.select": "选择",
+ "popover.modeSearch.write": "写作",
+ "popover.result.title": "结果",
+ "popover.result.editable": "可编辑后插入",
+ "popover.result.generatedWith": "由 %@ 生成",
+ "popover.mode.picker": "模式",
+ "popover.mode.backToModes": "选择模式",
+ "popover.status.ready": "就绪",
+ "popover.status.preview": "预览",
+ "popover.action.transform": "转换",
+ "popover.action.regenerate": "重新生成",
+ "popover.action.insert": "插入",
+ "popover.action.insertOriginal": "插入原文",
+ "popover.hint.transformInsert": "转换/插入",
+ "popover.hint.original": "原文",
+ "popover.hint.newLine": "换行",
+ "popover.hint.mode": "模式",
+ "popover.hint.back": "返回",
+ "popover.hint.close": "关闭",
+ "popover.hint.accessibility": "快捷键:Enter 转换或插入,Command Enter 插入原文,Escape 返回或关闭",
+ "popover.busy.inserting": "正在插入...",
+ "popover.busy.transforming": "正在转换...",
+ "popover.error.emptyOriginal": "请输入要插入的文本。",
+ "popover.error.missingTarget": "找不到要插入文本的目标应用。",
+ "popover.error.missingAPIKey": "请先在设置中配置 %@ API Key。",
+ "insertion.error.accessibility": "需要开启辅助功能权限后才能插入文本。",
+ "insertion.error.activation": "无法切回原应用,请重试。",
+ "insertion.error.pasteEvent": "无法发送粘贴快捷键。",
+ "insertion.error.clipboardRestore": "插入后恢复剪贴板失败。",
+ "error.emptySource": "请输入要转换的文本",
+ "error.emptyResponse": "模型返回了空内容",
+ "error.timeout": "请求超时,请稍后重试",
+ "error.networkConnectionLost": "网络连接已中断,请重试。",
+ "error.provider.urlInvalid": "%@ 请求失败:URL 无效",
+ "error.provider.httpUnknown": "%@ 请求失败:HTTP unknown",
+ "error.provider.prefix": "%@ 请求失败:%@",
+ "hotkey.error.unsupported": "暂不支持快捷键“%@”。目前支持 ⌥Space、Option+Space、Alt+Space、⌘Space、Command+Space、Cmd+Space。",
+ "hotkey.error.registrationFailed": "快捷键注册失败(%d)。",
+ "prompt.simpleCorrectEnglish.description": "改写或翻译成简单、正确的英文",
+ "prompt.chineseSummary.description": "把任意文本总结成简洁中文",
+ "prompt.translateToEnglish.description": "改写或翻译成简单、正确的英文",
+ "prompt.improveWriting.description": "保持原语言,润色语法、表达和清晰度",
+ "prompt.makeConcise.description": "保持原语言,压缩文字并保留重点",
+ "prompt.professionalTone.description": "改成更职业、清楚、礼貌的语气",
+ "prompt.friendlyReply.description": "改成自然、友好、适合回复的表达",
+ "prompt.custom.description": "使用用户自定义 prompt"
+ ]
+}
diff --git a/Sources/InkletApp/Localization/L10n+zhHant.swift b/Sources/InkletApp/Localization/L10n+zhHant.swift
new file mode 100644
index 0000000..8120176
--- /dev/null
+++ b/Sources/InkletApp/Localization/L10n+zhHant.swift
@@ -0,0 +1,317 @@
+// Traditional Chinese interface text. Every table defines the same keys as `en`.
+extension L10n {
+ static let zhHant: [String: String] = [
+ "app.menu.edit": "編輯",
+ "app.menu.undo": "復原",
+ "app.menu.redo": "重做",
+ "app.menu.cut": "剪下",
+ "app.menu.copy": "拷貝",
+ "app.menu.paste": "貼上",
+ "app.menu.pasteAndMatchStyle": "貼上並符合樣式",
+ "app.menu.delete": "刪除",
+ "app.menu.selectAll": "全選",
+ "app.menu.openPopover": "開啟 Inklet",
+ "app.menu.settings": "設定",
+ "app.menu.about": "關於 Inklet",
+ "app.menu.quit": "結束",
+ "app.menu.checkForUpdates": "檢查更新…",
+ "app.menu.checkingForUpdates": "正在檢查更新…",
+ "update.available.title": "Inklet 有可用更新",
+ "update.available.latestVersion": "最新版本:%@(組建 %@)",
+ "update.available.currentVersion": "目前版本:%@",
+ "update.available.noNotes": "請前往 GitHub 查看發布詳情。",
+ "update.action.viewOnGitHub": "在 GitHub 上查看",
+ "update.action.later": "稍後",
+ "update.upToDate.title": "Inklet 已是最新版本",
+ "update.upToDate.message": "你正在使用 %@。",
+ "update.error.title": "無法檢查更新",
+ "update.error.message": "請稍後再試。",
+ "update.action.retry": "重試",
+ "update.action.cancel": "取消",
+ "update.action.ok": "好",
+ "legacyMigration.notice.title": "舊版 Inklet 資料尚未匯入",
+ "legacyMigration.notice.message": "你之前的設定和歷史記錄仍被保留。你可以選擇對應的 Inklet Data 資料夾進行匯入。",
+ "legacyMigration.action.importOldData": "匯入舊資料…",
+ "legacyMigration.panel.title": "選擇舊版 Inklet 資料",
+ "legacyMigration.panel.message": "請選擇對應的 Inklet Data 資料夾,以匯入仍被保留的設定和歷史記錄。",
+ "legacyMigration.import.progress": "正在匯入舊資料…",
+ "legacyMigration.import.invalidSelection": "所選資料夾不是目前這個 Inklet 對應的舊版資料夾。",
+ "legacyMigration.import.failed": "無法匯入舊資料。你之前的設定和歷史記錄仍被保留。",
+ "legacyMigration.import.partialFailure": "部分舊資料未能匯入。你之前的設定和歷史記錄仍被保留。",
+ "legacyMigration.import.relaunching": "Inklet 需要重新啟動,才能載入已匯入的資料。",
+ "legacyMigration.import.relaunchProgress": "正在重新啟動…",
+ "legacyMigration.import.relaunchFailed": "Inklet 無法重新啟動。已匯入的資料已準備就緒,將在下次開啟 Inklet 時載入。",
+ "legacyMigration.action.retryRelaunch": "重新啟動 Inklet",
+ "legacyMigration.action.quit": "結束 Inklet",
+ "legacyMigration.settings.help": "從對應的 Inklet Data 資料夾匯入仍被保留的設定和歷史記錄。",
+ "settings.section.history": "歷史",
+ "settings.description.history": "查看保存在本機的寫作、選區結果及舊版語音結果。",
+ "settings.history.filter.all": "全部",
+ "settings.history.source.write": "寫作",
+ "settings.history.source.voice": "語音",
+ "settings.history.source.selection": "選區",
+ "settings.history.empty": "尚無已保存歷史。",
+ "settings.history.original": "原文",
+ "settings.history.result": "結果",
+ "settings.history.copyOriginal": "複製原文",
+ "settings.history.copyResult": "複製結果",
+ "settings.history.clear": "清空歷史",
+ "settings.history.clearConfirmTitle": "清空歷史?",
+ "settings.history.clearConfirmMessage": "這會從這台 Mac 刪除所有已保存的歷史記錄。此操作無法復原。",
+ "settings.history.cleared": "歷史已清空。",
+ "settings.history.error.loadFailed": "無法載入歷史。",
+ "settings.history.error.clearFailed": "無法清空歷史。",
+ "settings.privacy.history": "• 成功的寫作和選區文字歷史會保存在本機;舊版語音記錄仍可讀取",
+ "settings.group.writing": "寫作",
+ "settings.group.writing.help": "設定寫作助手及其可編輯的原文草稿。",
+ "settings.group.dictation": "聽寫",
+ "settings.group.dictation.help": "說話時長按快捷鍵,麥克風音訊會即時傳送到 OpenAI。",
+ "settings.group.dictationAdvanced": "進階聽寫",
+ "settings.row.dictationShortcut": "長按快捷鍵",
+ "settings.help.dictationShortcut": "僅在寫作助手的原文編輯器處於使用中狀態時生效;短按不會執行任何操作。",
+ "settings.quickStart.voice.pressAndHold": "按住進行語音輸入",
+ "settings.row.microphone": "麥克風",
+ "settings.help.microphone": "選擇即時聽寫使用的音訊輸入裝置。",
+ "settings.microphone.systemDefault": "系統預設",
+ "settings.row.fallbackSpeechModel": "復原轉寫模型",
+ "settings.help.fallbackSpeechModel": "即時連線失敗後單次復原嘗試所使用的模型。",
+ "dictation.hint.hold": "長按 %@ 開始聽寫",
+ "dictation.status.connecting": "正在連線…",
+ "dictation.status.listening": "正在聽寫…放開以完成",
+ "dictation.status.recordingFallback": "連線已中斷…可繼續說話",
+ "dictation.status.finalizing": "正在完成轉寫…",
+ "dictation.status.recovering": "正在使用暫存錄音復原…",
+ "dictation.status.ready": "聽寫已就緒",
+ "dictation.accessibility.ready": "聽寫已準備就緒。",
+ "dictation.accessibility.listening": "正在聽寫,放開快捷鍵以完成。",
+ "dictation.accessibility.recordingFallback": "連線已中斷,可繼續說話以便復原。",
+ "dictation.accessibility.finalizing": "正在完成聽寫轉寫。",
+ "dictation.accessibility.recovering": "正在從暫存錄音復原聽寫。",
+ "dictation.accessibility.completed": "聽寫已完成。",
+ "dictation.accessibility.cancelled": "聽寫已取消。",
+ "dictation.accessibility.failed": "聽寫失敗。",
+ "dictation.accessibility.sourceEditor": "寫作原文編輯器",
+ "dictation.undo.action": "聽寫",
+ "dictation.error.missingAPIKey": "請在設定中加入 OpenAI API Key 後使用聽寫。",
+ "dictation.error.microphonePermission": "聽寫需要麥克風權限。",
+ "dictation.error.noAudioInputDevice": "沒有可用的麥克風或音訊輸入裝置。",
+ "dictation.error.recordingUnavailable": "無法開始錄音。",
+ "dictation.error.realtimeBufferOverflow": "即時音訊處理不及,請再試一次。",
+ "dictation.error.connection": "即時轉寫連線失敗。",
+ "dictation.error.connectionTimeout": "即時轉寫連線逾時。",
+ "dictation.error.finalTimeout": "未能及時收到最終即時轉寫。",
+ "dictation.error.fallback": "無法使用暫存錄音復原聽寫。",
+ "dictation.error.noSpeech": "未辨識到語音。",
+ "settings.privacy.voice": "• 即時聽寫音訊和發音文字會直接傳送到 OpenAI;復原錄音只會暫存於本機,並在階段結束時刪除",
+ "settings.section.selectionActions": "選區動作",
+ "settings.description.selectionActions": "管理在其他 App 選取文字後的自動動作。",
+ "settings.row.selectionActionsEnabled": "啟用選區動作",
+ "settings.help.selectionActionsEnabled": "選取文字並短暫停頓後顯示小選單。",
+ "settings.row.forceSelectionMode": "強制取詞",
+ "settings.help.forceSelectionMode": "輔助功能無法讀取選取文字時使用此備用方式。選單複製不會模擬鍵盤輸入。",
+ "settings.forceSelection.disabled": "關閉",
+ "settings.forceSelection.menuCopyOnly": "僅選單複製",
+ "settings.forceSelection.menuCopyThenShortcut": "先選單複製,再 Cmd+C",
+ "settings.forceSelection.shortcutThenMenuCopy": "先 Cmd+C,再選單複製",
+ "settings.row.allowSimulatedCopyFallback": "允許模擬 Cmd+C",
+ "settings.help.allowSimulatedCopyFallback": "選單複製無法使用時向前景 App 傳送 Cmd+C,可能會干擾遊戲或遠端 App。",
+ "settings.row.translationLanguage": "翻譯語言",
+ "settings.help.translationLanguage": "選取文字翻譯動作使用的目標語言。",
+ "settings.row.translationPrompt": "翻譯 Prompt",
+ "settings.help.translationPrompt": "選取文字翻譯動作使用的指令。用 {targetLanguage} 表示所選語言。",
+ "settings.translationPrompt.restoreDefault": "恢復預設",
+ "settings.row.aiPronunciation": "AI 發音聲音",
+ "settings.help.aiPronunciation": "選取文字後「發音」使用的聲音。使用 OpenAI API key 呼叫 OpenAI 文字轉語音。",
+ "settings.row.aiPronunciationSpeed": "AI 發音速度",
+ "settings.help.aiPronunciationSpeed": "選取文字「發音」和試聽聲音使用的播放速度。",
+ "settings.aiPronunciation.speedValue": "%.2fx",
+ "settings.aiPronunciation.preview": "試聽聲音",
+ "settings.aiPronunciation.openAI": "OpenAI TTS",
+ "selection.language.followInterface": "跟隨介面語言",
+ "selection.action.translate": "翻譯",
+ "selection.action.pronounce": "發音",
+ "selection.action.translating": "正在翻譯...",
+ "selection.action.preparingPronunciation": "正在準備音訊...",
+ "selection.action.playingPronunciation": "正在播放...",
+ "selection.action.pronounceOriginal": "播放原文",
+ "selection.action.pronounceTranslation": "播放譯文",
+ "selection.action.audioLabel.original": "原文",
+ "selection.action.audioLabel.translation": "譯文",
+ "selection.action.copyTranslation": "複製譯文",
+ "selection.action.retry": "重試",
+ "selection.action.unsupportedTitle": "無法取得選取文字",
+ "selection.action.unsupportedMessage": "目前 App 未將選取文字提供給 Inklet。",
+ "selection.action.missingOpenAIKey": "請在設定中加入 OpenAI API key 以使用 AI 發音。",
+ "selection.action.translationFailed": "翻譯失敗。",
+ "selection.action.pronunciationFailed": "發音失敗。",
+ "about.tagline": "將粗略想法化為清晰文字",
+ "about.website": "官網",
+ "about.privacyPolicy": "隱私權政策",
+ "about.support": "支援",
+ "language.system": "跟隨系統",
+ "settings.window.title": "Inklet 設定",
+ "settings.sidebar.preferences": "偏好設定",
+ "settings.sidebar.hint": "自動儲存 · ⌘, 開啟",
+ "settings.section.general": "一般",
+ "settings.section.providers": "模型服務商",
+ "settings.section.promptModes": "Prompt 模式",
+ "settings.section.permissions": "權限",
+ "settings.description.general": "基本行為、快捷鍵、介面語言和生成參數。",
+ "settings.description.providers": "選擇 LLM 服務商、模型和對應的 API Key。",
+ "settings.description.promptModes": "管理浮窗中的轉換模式和系統提示詞。",
+ "settings.description.permissions": "檢查插入文字所需的 macOS 權限。",
+ "settings.row.language": "介面語言",
+ "settings.help.language": "選擇 System 時跟隨 macOS 語言。",
+ "settings.row.hotkey": "快捷鍵",
+ "settings.help.timeout": "請求最長等待時間。",
+ "settings.seconds": "%d 秒",
+ "settings.help.provider": "目前服務商。",
+ "settings.help.apiKey": "API Key 會儲存在本機。",
+ "settings.help.model.default": "預設:%@",
+ "settings.mode.untitled": "未命名模式",
+ "settings.mode.pick": "選擇一個 Prompt Mode",
+ "settings.help.name": "浮窗中顯示的名稱。",
+ "settings.help.description": "模式用途說明。",
+ "settings.characters": "%d 字元",
+ "settings.permission.authorized": "Accessibility 已授權",
+ "settings.permission.required": "需要 Accessibility 權限",
+ "settings.permission.description": "點擊「開啟設定」,點 +,選擇 /Applications/Inklet.app,然後開啟 Inklet。",
+ "settings.permission.open": "開啟系統權限設定",
+ "settings.footer.pending": "變更會自動儲存,並在下次浮窗開啟時套用。",
+ "settings.save": "儲存",
+ "settings.saved": "已儲存",
+ "settings.error.visibleModeRequired": "至少需要保留一個可見模式。",
+ "settings.error.modelRequired": "Model 不能為空。",
+ "settings.error.openAccessibility": "無法開啟輔助使用設定。",
+ "settings.error.saveFailed": "儲存失敗:%@",
+ "popover.input.placeholder": "輸入要轉換或插入的文字",
+ "popover.modeSearch.placeholder": "搜尋模式",
+ "popover.modeSearch.empty": "沒有相符的模式",
+ "popover.modeSearch.select": "選擇",
+ "popover.modeSearch.write": "寫作",
+ "popover.result.title": "結果",
+ "popover.result.editable": "可編輯後插入",
+ "popover.result.generatedWith": "由 %@ 產生",
+ "popover.mode.picker": "模式",
+ "popover.mode.backToModes": "選擇模式",
+ "popover.action.transform": "轉換",
+ "popover.action.regenerate": "重新產生",
+ "popover.action.insert": "插入",
+ "popover.action.insertOriginal": "插入原文",
+ "popover.hint.transformInsert": "轉換/插入",
+ "popover.hint.original": "原文",
+ "popover.hint.accessibility": "快捷鍵:Enter 轉換或插入,Command Enter 插入原文,Escape 返回或關閉",
+ "popover.busy.inserting": "正在插入...",
+ "popover.busy.transforming": "正在轉換...",
+ "popover.error.emptyOriginal": "請輸入要插入的文字。",
+ "popover.error.missingTarget": "找不到要插入文字的目標 App。",
+ "popover.error.missingAPIKey": "請先在設定中配置 %@ API Key。",
+ "insertion.error.accessibility": "需要開啟 Accessibility 權限後才能插入文字。",
+ "insertion.error.activation": "無法切回原 App,請重試。",
+ "insertion.error.pasteEvent": "無法送出貼上快捷鍵。",
+ "insertion.error.clipboardRestore": "插入後恢復剪貼簿失敗。",
+ "error.emptySource": "請輸入要轉換的文字",
+ "error.emptyResponse": "模型回傳了空內容",
+ "error.timeout": "請求逾時,請稍後重試",
+ "error.networkConnectionLost": "網路連線已中斷,請再試一次。",
+ "error.provider.urlInvalid": "%@ 請求失敗:URL 無效",
+ "error.provider.httpUnknown": "%@ 請求失敗:HTTP unknown",
+ "error.provider.prefix": "%@ 請求失敗:%@",
+ "hotkey.error.unsupported": "暫不支援快捷鍵「%@」。目前支援 ⌥Space、Option+Space、Alt+Space、⌘Space、Command+Space、Cmd+Space。",
+ "hotkey.error.registrationFailed": "快捷鍵註冊失敗(%d)。",
+ "prompt.custom.description": "使用你的自訂 prompt",
+ "appearance.dark": "深色",
+ "appearance.light": "淺色",
+ "appearance.system": "系統",
+ "popover.hint.back": "返回",
+ "popover.hint.close": "關閉",
+ "popover.hint.mode": "模式",
+ "popover.hint.newLine": "換行",
+ "popover.status.preview": "預覽",
+ "popover.status.ready": "就緒",
+ "prompt.chineseSummary.description": "將任何文字摘要為精簡的簡體中文",
+ "prompt.friendlyReply.description": "改寫為自然、友善的回覆",
+ "prompt.improveWriting.description": "保留原文語言並改善文筆",
+ "prompt.makeConcise.description": "保留原文語言與重點並精簡文字",
+ "prompt.professionalTone.description": "改寫為更清晰、專業的語氣",
+ "prompt.simpleCorrectEnglish.description": "改寫或翻譯為簡單、正確的英文",
+ "prompt.translateToEnglish.description": "改寫或翻譯為簡單、正確的英文",
+ "settings.cancel": "取消",
+ "settings.description.about": "鍵盤快捷鍵、隱私說明與應用程式資訊。",
+ "settings.description.selectionAssistant": "為其他應用程式中的選取文字提供自動翻譯與發音工具。",
+ "settings.description.writeAssistant": "設定寫作、聽寫、生成行為與提示模式。",
+ "settings.error.endpointInvalid": "端點必須是有效的 HTTP 網址。",
+ "settings.error.promptModeRequired": "請至少保留一個提示模式。",
+ "settings.help.appearance": "選擇淺色、深色或跟隨 macOS。",
+ "settings.help.endpoint": "完整的 OpenAI 相容 /chat/completions 網址。",
+ "settings.help.hotkey": "例如:⌥Space、Option+Space、Cmd+Space。",
+ "settings.help.openAIAPIKey": "儲存在這台 Mac 上,供寫作、即時聽寫、選區翻譯與發音共用。清空欄位即可移除。",
+ "settings.hotkey.pressKey": " 按鍵",
+ "settings.hotkey.record": "錄製快捷鍵",
+ "settings.hotkey.recording": "按下快捷鍵",
+ "settings.mode.add": "新增模式",
+ "settings.mode.delete": "刪除模式",
+ "settings.mode.deleteConfirmMessage": "要刪除「%@」嗎?此操作無法復原。",
+ "settings.mode.deleteConfirmTitle": "刪除提示模式?",
+ "settings.mode.dragToSort": "拖移以排序",
+ "settings.mode.hidden": "已隱藏",
+ "settings.mode.moveDown": "下移",
+ "settings.mode.moveUp": "上移",
+ "settings.mode.newDescription": "自訂文字轉換模式",
+ "settings.mode.newName": "新模式",
+ "settings.mode.visible": "已顯示",
+ "settings.mode.visibleInMenu": "在選單中顯示",
+ "settings.mode.visibleInMenuHelp": "在模式選擇器中顯示此模式。",
+ "settings.model.custom": "自訂…",
+ "settings.model.customized": "自訂模型 *",
+ "settings.model.refreshing": "正在更新模型清單…",
+ "settings.permission.accessibility": "輔助使用",
+ "settings.permission.openShort": "開啟設定",
+ "settings.privacy.clipboard": "• 插入文字及設定的強制取詞完成後,會還原剪貼簿內容",
+ "settings.privacy.keychain": "• API 金鑰儲存在這台 Mac 上",
+ "settings.privacy.provider": "• 文字直接傳送至 OpenAI",
+ "settings.privacy.title": "隱私與安全性",
+ "settings.provider.active": "使用中",
+ "settings.provider.configured": "已設定",
+ "settings.provider.notConfigured": "未設定",
+ "settings.provider.notLoaded": "不顯示已儲存的金鑰",
+ "settings.provider.pendingKey": "新金鑰待儲存",
+ "settings.provider.pendingSave": "待儲存",
+ "settings.provider.saved": "已儲存",
+ "settings.provider.savedLocally": "已儲存於本機",
+ "settings.quickStart.close": "返回或關閉",
+ "settings.quickStart.help": "浮動視窗中的常用操作。",
+ "settings.quickStart.open": "開啟 Inklet",
+ "settings.quickStart.original": "插入原文",
+ "settings.quickStart.submit": "轉換或插入結果",
+ "settings.quickStart.title": "鍵盤快捷鍵",
+ "settings.row.apiKey": "API 金鑰",
+ "settings.row.appearance": "外觀",
+ "settings.row.description": "說明",
+ "settings.row.endpoint": "端點",
+ "settings.row.model": "模型",
+ "settings.row.name": "名稱",
+ "settings.row.openAIAPIKey": "OpenAI API 金鑰",
+ "settings.row.provider": "服務商",
+ "settings.row.systemPrompt": "提示詞",
+ "settings.row.timeout": "逾時",
+ "settings.section.about": "關於",
+ "settings.section.selectionAssistant": "選區助手",
+ "settings.section.writeAssistant": "寫作助手",
+ "settings.systemPermissions.title": "系統權限",
+ "settings.version": "版本 %@",
+ "settings.voice.shortcut.disabled": "停用",
+ "settings.voice.shortcut.leftCommand": "左 Command",
+ "settings.voice.shortcut.leftOption": "左 Option",
+ "settings.voice.shortcut.rightCommand": "右 Command",
+ "settings.voice.shortcut.rightOption": "右 Option",
+ "setup.done": "完成",
+ "setup.menubar.description": "隨時點選時鐘附近的 Inklet 圖示即可開啟。",
+ "setup.menubar.title": "在選單列找到 Inklet",
+ "setup.shortcut.description": "預設快捷鍵是 %@。如果與其他應用程式衝突,可在設定中變更。",
+ "setup.shortcut.title": "使用快捷鍵",
+ "setup.subtitle": "Inklet 正在選單列中執行。授予輔助使用權限,讓 Inklet 將文字插回目前使用的應用程式。",
+ "setup.title": "Inklet 已就緒",
+ "setup.window.title": "歡迎使用 Inklet"
+ ]
+}
diff --git a/Tests/InkletCoreTests/LegacyMigrationLocalizationTests.swift b/Tests/InkletCoreTests/LegacyMigrationLocalizationTests.swift
index 2e23412..c7c7f0b 100644
--- a/Tests/InkletCoreTests/LegacyMigrationLocalizationTests.swift
+++ b/Tests/InkletCoreTests/LegacyMigrationLocalizationTests.swift
@@ -251,9 +251,7 @@ final class LegacyMigrationLocalizationTests: XCTestCase {
}
private func parsedLanguageTables() throws -> [String: [LocalizationEntry]] {
- let packageRoot = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
- let localizationURL = packageRoot.appendingPathComponent("Sources/InkletApp/InkletLocalization.swift")
- let source = try String(contentsOf: localizationURL, encoding: .utf8)
+ let source = try LocalizationSourceFixture.source()
return try Dictionary(uniqueKeysWithValues: languageTables.map { language in
(language.symbol, try migrationEntries(in: language.symbol, source: source))
})
@@ -277,7 +275,7 @@ final class LegacyMigrationLocalizationTests: XCTestCase {
}
private func migrationEntries(in table: String, source: String) throws -> [LocalizationEntry] {
- let startMarker = "private static let \(table): [String: String] = ["
+ let startMarker = " static let \(table): [String: String] = ["
let startRange = try XCTUnwrap(source.range(of: startMarker), "Missing \(table) localization table")
let remainder = source[startRange.upperBound...]
let endRange = try XCTUnwrap(remainder.range(of: "\n ]"), "Unterminated \(table) localization table")
diff --git a/Tests/InkletCoreTests/LocalizationSourceFixture.swift b/Tests/InkletCoreTests/LocalizationSourceFixture.swift
new file mode 100644
index 0000000..9633690
--- /dev/null
+++ b/Tests/InkletCoreTests/LocalizationSourceFixture.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+/// Source text of the localization layer: `InkletLocalization.swift` followed by
+/// every language table under `Localization/`, in `L10n.translationTables` order.
+enum LocalizationSourceFixture {
+ static let tableIDs = ["en", "zhHans", "zhHant", "ja", "ko", "es", "fr", "de", "pt", "it"]
+
+ static func source() throws -> String {
+ let appSources = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
+ .appendingPathComponent("Sources/InkletApp")
+ let files = [appSources.appendingPathComponent("InkletLocalization.swift")]
+ + tableIDs.map { appSources.appendingPathComponent("Localization/L10n+\($0).swift") }
+ return try files.map { try String(contentsOf: $0, encoding: .utf8) }.joined(separator: "\n")
+ }
+}
diff --git a/Tests/InkletCoreTests/SettingsViewSourceTests.swift b/Tests/InkletCoreTests/SettingsViewSourceTests.swift
index d4e6819..c8c1cce 100644
--- a/Tests/InkletCoreTests/SettingsViewSourceTests.swift
+++ b/Tests/InkletCoreTests/SettingsViewSourceTests.swift
@@ -13,9 +13,7 @@ final class SettingsViewSourceTests: XCTestCase {
}
func testTemperatureLocalizationKeysAreRemoved() throws {
- let packageRoot = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
- let sourceURL = packageRoot.appendingPathComponent("Sources/InkletApp/InkletLocalization.swift")
- let source = try String(contentsOf: sourceURL, encoding: .utf8)
+ let source = try LocalizationSourceFixture.source()
XCTAssertFalse(source.contains("settings.row.temperature"))
XCTAssertFalse(source.contains("settings.help.temperature"))
diff --git a/Tests/InkletCoreTests/UpdateCheckLocalizationTests.swift b/Tests/InkletCoreTests/UpdateCheckLocalizationTests.swift
index 5abb62d..24e7735 100644
--- a/Tests/InkletCoreTests/UpdateCheckLocalizationTests.swift
+++ b/Tests/InkletCoreTests/UpdateCheckLocalizationTests.swift
@@ -151,13 +151,11 @@ final class UpdateCheckLocalizationTests: XCTestCase {
}
private func localizationSource() throws -> String {
- let path = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
- .appendingPathComponent("Sources/InkletApp/InkletLocalization.swift")
- return try String(contentsOf: path, encoding: .utf8)
+ try LocalizationSourceFixture.source()
}
private func localizationTableIDs(in source: String) throws -> [String] {
- let regex = try NSRegularExpression(pattern: #"^[ \t]*private[ \t]+static[ \t]+let[ \t]+([A-Za-z_][A-Za-z0-9_]*):[ \t]*\[String:[ \t]*String\][ \t]*=[ \t]*\["#, options: .anchorsMatchLines)
+ let regex = try NSRegularExpression(pattern: #"^[ \t]*static[ \t]+let[ \t]+([A-Za-z_][A-Za-z0-9_]*):[ \t]*\[String:[ \t]*String\][ \t]*=[ \t]*\["#, options: .anchorsMatchLines)
let range = NSRange(source.startIndex.. String {
- let declaration = " private static let \(tableID): [String: String] = ["
+ let declaration = " static let \(tableID): [String: String] = ["
let start = try XCTUnwrap(source.range(of: declaration)).upperBound
let end = try XCTUnwrap(source.range(of: "\n ]", range: start.. String {
- try sourceFile("Sources/InkletApp/InkletLocalization.swift")
+ try LocalizationSourceFixture.source()
}
private func sourceFile(_ relativePath: String) throws -> String {
@@ -243,7 +243,7 @@ final class WritingDictationLocalizationTests: XCTestCase {
private func localizationTableIDs(in source: String) throws -> [String] {
let regex = try NSRegularExpression(
- pattern: #"^[ \t]*private[ \t]+static[ \t]+let[ \t]+([A-Za-z_][A-Za-z0-9_]*):[ \t]*\[String:[ \t]*String\][ \t]*=[ \t]*\["#,
+ pattern: #"^[ \t]*static[ \t]+let[ \t]+([A-Za-z_][A-Za-z0-9_]*):[ \t]*\[String:[ \t]*String\][ \t]*=[ \t]*\["#,
options: .anchorsMatchLines
)
let sourceRange = NSRange(source.startIndex.. String {
- let declaration = " private static let \(tableID): [String: String] = ["
+ let declaration = " static let \(tableID): [String: String] = ["
let declarationRange = try XCTUnwrap(
source.range(of: declaration),
"Missing localization table declaration for \(tableID)"
diff --git a/Tests/InkletCoreTests/WritingModeLauncherLocalizationTests.swift b/Tests/InkletCoreTests/WritingModeLauncherLocalizationTests.swift
index d2b8905..ea0dded 100644
--- a/Tests/InkletCoreTests/WritingModeLauncherLocalizationTests.swift
+++ b/Tests/InkletCoreTests/WritingModeLauncherLocalizationTests.swift
@@ -215,14 +215,12 @@ final class WritingModeLauncherLocalizationTests: XCTestCase {
}
private func localizationSource() throws -> String {
- let packageRoot = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
- let localizationURL = packageRoot.appendingPathComponent("Sources/InkletApp/InkletLocalization.swift")
- return try String(contentsOf: localizationURL, encoding: .utf8)
+ try LocalizationSourceFixture.source()
}
private func localizationTableIDs(in source: String) throws -> [String] {
let regex = try NSRegularExpression(
- pattern: #"^[ \t]*private[ \t]+static[ \t]+let[ \t]+([A-Za-z_][A-Za-z0-9_]*):[ \t]*\[String:[ \t]*String\][ \t]*=[ \t]*\["#,
+ pattern: #"^[ \t]*static[ \t]+let[ \t]+([A-Za-z_][A-Za-z0-9_]*):[ \t]*\[String:[ \t]*String\][ \t]*=[ \t]*\["#,
options: .anchorsMatchLines
)
let sourceRange = NSRange(source.startIndex.. String {
- let declaration = " private static let \(tableID): [String: String] = ["
+ let declaration = " static let \(tableID): [String: String] = ["
let declarationRange = try XCTUnwrap(
source.range(of: declaration),
"Missing localization table declaration for \(tableID)"