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)"