Files
OSGKeyboard/OSGKeyboardExt/en.lproj/Keyboard.strings
T
rockyandClaude Opus 5 0023741455 feat(app): add crash visibility, memory relief, and clipboard reply work
Squashes the working tree that had accumulated on cloud-agent. Two
strands of work, kept in one commit at the maintainer's request.

Crash and stability (this session):

- Subscribe to MetricKit so crash, hang, CPU, and disk-write diagnostics
  are recorded on device. Keyboard-extension memory kills are the most
  likely way a user loses the keyboard mid-sentence and iOS does not
  classify them as crashes, so they never reach App Store Connect.
- Upload those reports to POST /v1/analytics/diagnostics from internal
  builds only (local Debug and TestFlight), reusing the analytics
  installation identifier and skipping entirely when analytics are off.
  App Store builds keep everything on device.
- Shed the Chinese engine, English lexicon, and in-flight pipeline work
  at the 40 MiB and 48 MiB budget thresholds instead of waiting for a
  system memory warning that jetsam often preempts.
- Install audio taps with the input node's live format through one
  shared adaptive resampler, so an audio-route change mid-recording no
  longer raises an uncatchable format-mismatch exception. Covers the
  dictation preview and the Mac recorder, which still used the pattern
  the Flow capture path had already moved away from.
- Harden the librime bridge: never pass a nil string across a nonnull
  boundary when a user dictionary holds malformed UTF-8, null-check the
  engine API vector, and distrust a candidate count without its array.
- Guard the expanded candidate grid against a list that shrinks while
  the collection view is still laying out against the previous count.
- Resolve localized text without the App Group so the screen shown when
  that container is missing renders its message instead of crashing on
  launch, which is the one situation it exists to handle.
- Gate CI on the App Group and Keychain wiring that the keyboard
  extension hard-depends on, with a self-test proving the check fails.

Clipboard, reply, and semantics (pre-existing working tree):

- Unify the reply center, refresh keyboard AI features, and add native
  event and reminder exporters.
- Expand clipboard semantic routing with authored corpora and a
  product-blind holdout, plus the scripts that build and validate them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 17:31:29 -07:00

414 lines
22 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* OSGKeyboard · English localization (development language) */
"OSGKeyboard" = "OSGKeyboard";
/* Onboarding */
"onboarding.welcome.subtitle" = "Tap the mic to speak, tap again to finish — polished text in any app.";
"onboarding.enable.title" = "Enable OSGKeyboard";
"onboarding.enable.step1" = "Settings → General → Keyboard → Keyboards";
"onboarding.enable.step2" = "Tap “Add New Keyboard…” and choose OSGKeyboard";
"onboarding.enable.step3" = "Tap OSGKeyboard and enable “Allow Full Access”";
"onboarding.enable.step4" = "Allow Full Access is required for the microphone and LLM calls.";
"onboarding.enable.openSettings" = "Open iOS Settings";
"onboarding.api.title" = "Choose engine";
"onboarding.api.subtitle" = "Local ASR needs no key; add an API key to enable AI polish.";
"onboarding.api.localReady.title" = "Local ASR is ready";
"onboarding.api.localReady.body" = "Recognition works on-device. Add an API key in Settings for AI polish.";
"keyboard.onboarding.practice.mic" = "Tap the mic, then tap again when done";
"keyboard.onboarding.practice.translate" = "Tap Translate, then insert the generated text";
"keyboard.onboarding.practice.reply" = "AI is drafting a ready-to-send reply for you";
"keyboard.onboarding.practice.askAI" = "Hold the mic and ask your question";
/* Common navigation */
"common.back" = "Back";
"common.next" = "Next";
"common.done" = "Done";
"common.continue" = "Continue";
"common.reset" = "Reset";
"common.cancel" = "Cancel";
"common.delete" = "Delete";
"common.space" = "Space";
"common.newline" = "Return";
"common.send" = "Send";
"keyboard.return.go" = "Go";
"keyboard.return.search" = "Search";
"keyboard.return.join" = "Join";
"keyboard.return.next" = "Next";
"keyboard.return.route" = "Route";
"keyboard.return.google" = "Google";
"keyboard.return.yahoo" = "Yahoo";
"keyboard.return.emergencyCall" = "Emergency Call";
/* Privacy footnote (onboarding welcome page) */
"privacy.audio.title" = "On-device transcription";
"privacy.audio.body" = "Powered by the on-device iOS speech engine.";
"privacy.network.title" = "Automatic text polish";
"privacy.network.body" = "AI formats and polishes your text automatically.";
"privacy.universal.title" = "Works everywhere";
"privacy.universal.body" = "Chat, email, vibe coding — just speak.";
/* Home */
"home.status.ready" = "Ready";
"home.status.setupIncomplete" = "Setup incomplete";
"home.hero.label" = "Tap to configure";
"home.action.enableInSettings" = "Enable in iOS Settings";
"home.action.editApi" = "Edit API Configuration";
"home.action.keyboardPreview" = "Keyboard Preview (Debug)";
"home.action.openSettingsA11y" = "Open OSGKeyboard settings";
/* API settings */
"api.baseUrl" = "Base URL";
"api.model" = "Model";
"api.getKey" = "Get an API key";
"api.key" = "API Key";
"api.key.placeholder" = "sk-…";
"api.key.show" = "Show";
"api.key.hide" = "Hide";
"api.connection" = "Connection";
"api.test.idle" = "Test connection";
"api.test.running" = "Testing…";
"api.test.success" = "Success · Retry";
"api.test.failure" = "Failed · Retry";
"api.test.connected" = "Connected";
"api.test.missing" = "API key missing";
"api.test.rateLimited" = "Rate limited (429)";
"api.test.http" = "HTTP %d";
"api.test.network" = "Network error";
"api.test.connectedWith" = "“%@”";
"api.test.transportWith" = "%@";
/* Settings */
"settings.title" = "Settings";
"settings.reset.title" = "Reset all settings?";
"settings.reset.message" = "API key, model, and base URL will be cleared.";
"settings.reset.confirm" = "Reset all settings";
"settings.engine.title" = "Speech transcription method";
"settings.engine.subtitle" = "Local: built-in system transcription. Cloud: ASR transcription with optional LLM polish.";
"settings.engine.local.title" = "On-device transcription";
"settings.engine.local.ios26" = "Always on-device, no network.";
"settings.engine.local.legacy" = "Transcribe with the built-in system speech service";
"settings.engine.cloud.title" = "Cloud transcription";
"settings.engine.cloud.subtitle" = "Cloud ASR transcription, with optional LLM polish";
"settings.provider.title" = "Provider";
"settings.provider.subtitle" = "Pick the LLM that polishes your dictation.";
"settings.api.title" = "API";
"settings.language.title" = "Language";
"settings.language.subtitle.cloud" = "Recognition language and text processing mode.";
"settings.language.subtitle.local" = "Recognition language.";
"settings.mode.title" = "Mode";
"settings.mode.off" = "Off";
"settings.mode.transcribe" = "Transcribe";
"settings.mode.polish" = "Polish";
"settings.systemPrompt.title" = "System Prompt";
"settings.systemPrompt.reset" = "Reset";
"settings.asrLocale" = "ASR locale";
"settings.engineBadge.ios26" = "SpeechAnalyzer — always on-device";
"settings.engineRow.title" = "Recognition engine";
"settings.onDeviceOnly.title" = "On-device only";
"settings.onDeviceOnly.body" = "Disable cloud fallback. The keyboard reports an error instead of going online.";
"settings.legend.onDevice" = "On-device";
"settings.legend.cloudFallback" = "Cloud fallback";
/* App group error */
"appGroup.error.title" = "App Group not configured";
"appGroup.error.body" = "OSGKeyboard needs an App Group to share config between the main app and the keyboard extension.";
"appGroup.error.step1" = "Create group.com.osgkeyboard.shared in the Apple Developer portal";
"appGroup.error.step2" = "Enable it for both the main app and the keyboard extension";
"appGroup.error.step3" = "Re-generate the provisioning profile and download it";
/* Keyboard preview */
"preview.title" = "Keyboard Preview";
"preview.subtitle" = "Tap Start/Stop Recording to test here. On the real keyboard, press and hold the mic disc.";
"preview.placeholder" = "Type here or tap the record button";
"preview.clear" = "Clear text";
"preview.openSettingsA11y" = "Open OSGKeyboard settings";
"preview.modeChip.cycle" = "Cycle input mode";
"preview.localeChip.cycle" = "Cycle recognition language";
/* Keyboard (ext) */
"keyboard.tab.ai" = "AI";
"keyboard.tab.voice" = "Voice";
"keyboard.tab.chinese" = "中文";
"keyboard.tab.english" = "EN";
"keyboard.tab.ai.a11y" = "Switch to AI Q&A";
"keyboard.tab.voice.a11y" = "Switch to voice input";
"keyboard.tab.chinese.a11y" = "Switch to Chinese typing";
"keyboard.tab.english.a11y" = "Switch to English typing";
"keyboard.placeholder.idle" = "Tap to talk";
"keyboard.placeholder.preparing" = "Preparing";
"keyboard.placeholder.preparingRecording" = "Preparing mic…";
"keyboard.placeholder.processing" = "Processing";
"keyboard.placeholder.error" = "Polishing failed";
"keyboard.models.notDownloaded" = "On-device models not downloaded";
"keyboard.models.downloadHint" = "Open OSGKeyboard to download models";
"keyboard.rec" = "REC";
"keyboard.space" = "Space";
"keyboard.denied.mic" = "Mic denied";
"keyboard.denied.speech" = "Speech denied";
"keyboard.openSettingsA11y" = "Open OSGKeyboard settings";
"keyboard.deniedHint" = "Opens the OSGKeyboard settings page where you can grant microphone or speech recognition access.";
"keyboard.tapToTalkA11y" = "Tap to talk";
"keyboard.undoA11y" = "Undo last input";
"keyboard.redoA11y" = "Redo";
"keyboard.copyA11y" = "Copy";
"keyboard.cutA11y" = "Cut";
"keyboard.nextKeyboardA11y" = "Next keyboard";
"keyboard.nextKeyboardA11yHint" = "Tap to switch to the next keyboard. Touch and hold to see all keyboards.";
"keyboard.typing.setupA11yHint" = "Open OSGKeyboard to finish input method setup.";
"keyboard.typing.preparingA11y" = "Preparing Chinese input";
/* Flow session (keyboard) */
"keyboard.flow.sessionInactive" = "Voice session off";
"keyboard.flow.start" = "Start";
"keyboard.flow.startA11y" = "Start voice session";
"keyboard.flow.sessionExpired" = "Voice session ended. Open OSGKeyboard to restart.";
"keyboard.flow.startingSession" = "Starting voice session…";
"keyboard.flow.transcribing" = "Transcribing…";
"keyboard.flow.resultTimeout" = "Timed out waiting for transcription. Try again.";
"keyboard.flow.hostDisconnected" = "Voice session disconnected. Open OSGKeyboard to restart.";
"keyboard.flow.manualOpenHost" = "Could not auto-open the app. Open OSGKeyboard from the Home Screen, then return.";
/* Keyboard status badges */
"keyboard.status.rec" = "REC";
"keyboard.status.recWarning" = "REC";
"keyboard.status.processing" = "···";
"keyboard.status.error" = "!";
/* Keyboard errors */
"keyboard.error.appGroupUnavailable" = "App Group not configured";
"keyboard.error.appGroupCommunication" = "App Group not configured. Reinstall and check signing.";
"keyboard.error.fullAccessRequired" = "Enable Allow Full Access for OSGKeyboard in Settings to use voice input.";
"keyboard.error.fullAccessForJump" = "Allow Full Access is required before the keyboard can open the app.";
"keyboard.error.manualOpenSettings" = "System blocked the jump. Open OSGKeyboard manually to reach Settings.";
"keyboard.error.manualOpenForFlow" = "Voice session not running. Open OSGKeyboard, then tap the mic again.";
"keyboard.error.manualOpenDictateLocal" = "System blocked the jump. Open OSGKeyboard for on-device dictation, then return.";
"keyboard.error.manualOpenDictate" = "System blocked the jump. Open OSGKeyboard to record, then return.";
"keyboard.error.llm.noApiKey" = "API key missing · configure it in the main app";
"keyboard.mic.disabled.missingApiKey" = "Fill in API key in Settings first";
"keyboard.mic.hint.missingPolishApiKey" = "Add an API key in Settings to enable polish";
"keyboard.error.llm.localPolishUnavailable" = "API key missing · inserted raw text";
"keyboard.error.llm.unauthorized" = "Invalid API key (401) · check main app settings";
"keyboard.error.llm.rateLimited" = "Rate limited (429) · try again later";
/* Legacy dictation handoff progress */
"keyboard.dictation.opening" = "Opening OSGKeyboard…";
"keyboard.dictation.openingLocal" = "Opening OSGKeyboard (on-device)…";
"keyboard.dictation.recording" = "Recording in OSGKeyboard — return here when done";
"keyboard.dictation.recordingLocal" = "Recording on-device — return here when done";
"keyboard.dictation.transcribing" = "Transcribing — return here when ready";
"keyboard.dictation.transcribingLocal" = "On-device transcribing — return here when ready";
"keyboard.dictation.failed" = "Recording failed. Try again.";
"keyboard.dictation.resultTimeout" = "Timed out waiting for dictation. Finish in OSGKeyboard and retry.";
/* Translation menu */
"keyboard.translation.offMenu" = "Don't translate";
"keyboard.translation.a11y" = "Translation";
"keyboard.translation.a11yHint" = "Toggle translation or change the target language.";
"keyboard.clipboard.a11y" = "Clipboard";
"keyboard.clipboard.a11yHint" = "Open clipboard history or enable clipboard capture.";
"keyboard.clipboard.guide.body" = "Turn on clipboard history in Settings first.";
"keyboard.clipboard.guide.cta" = "Open Settings";
"keyboard.clipboard.panel.title" = "Clipboard";
"keyboard.clipboard.panel.empty" = "No history yet";
"keyboard.clipboard.panel.fullAccessHint" = "New copies are paused because Allow Full Access is off. Existing history remains available.";
"keyboard.clipboard.panel.delete" = "Delete";
"keyboard.clipboard.panel.close" = "Close clipboard";
"keyboard.clipboard.panel.closeHint" = "Return to the keyboard.";
"keyboard.clipboard.clear.title" = "Clear clipboard history?";
"keyboard.clipboard.clear.message" = "This permanently removes all saved clipboard items from this device. This cannot be undone.";
"keyboard.clipboard.clear.confirm" = "Clear history";
"keyboard.clipboard.suggestion.dismissA11y" = "Dismiss clipboard suggestion";
"keyboard.clipboard.suggestion.dismissHint" = "Hide this clipboard suggestion strip.";
"keyboard.clipboard.paste" = "Paste";
"keyboard.voice.cancel" = "Cancel voice input";
"keyboard.voice.cancelHint" = "Discard the current recording, recognition, and polish result.";
"keyboard.scenario.a11y" = "Polish scenario";
"keyboard.scenario.a11yHint" = "Choose how dictation is polished.";
/* Mode chip labels (used in both ext + preview stub) */
"mode.off" = "Off";
"mode.transcribe" = "Transcribe";
"mode.polish" = "Polish";
/* Locale menu items (settings) */
"locale.auto" = "Auto";
"locale.zh-Hans" = "Chinese (Simplified)";
"locale.zh-Hant" = "Chinese (Traditional)";
"locale.en-US" = "English (US)";
"locale.ja-JP" = "Japanese";
"locale.ko-KR" = "Korean";
/* Voice gated until host-app onboarding finishes */
"keyboard.hint.finishSetupInApp" = "Finish setup in OSGKeyboard to use voice input.";
/* v0.3.0: AppContext chip on the keyboard top bar */
"keyboard.appContext.a11y" = "Polish context";
"keyboard.appContext.a11yHint" = "Tap to override the auto-detected input context (code, email, chat, document).";
"keyboard.appContext.chip.code" = "Code";
"keyboard.appContext.chip.email" = "Email";
"keyboard.appContext.chip.chat" = "Chat";
"keyboard.appContext.chip.document" = "Document";
"keyboard.appContext.chip.unknown" = "General";
"keyboard.appContext.menu.code" = "Code — preserve identifiers, no natural-language wrap";
"keyboard.appContext.menu.email" = "Email — polite, professional, paragraph-broken";
"keyboard.appContext.menu.chat" = "Chat — short, casual, natural tone";
"keyboard.appContext.menu.document" = "Document — long-form, structured";
"keyboard.appContext.menu.unknown" = "General — neutral tone";
/* Long-press editing of the last insertion */
"keyboard.edit.hint.available" = "Hold to edit your last input";
"keyboard.edit.error.noTarget" = "No recent input is available to edit";
"keyboard.edit.error.llmUnavailable" = "Configure an AI service in the main app first";
"keyboard.edit.error.startTimeout" = "Microphone startup timed out. Tap to retry";
"keyboard.edit.error.processing" = "Editing failed. Try again";
"keyboard.edit.error.processingTimeout" = "Editing timed out. Try again";
"keyboard.edit.error.unchanged" = "Nothing changed. Try a different instruction";
"keyboard.edit.status.preparing" = "Starting microphone…";
"keyboard.edit.status.listening" = "Listening for your editing instruction";
"keyboard.edit.status.processing" = "Editing…";
"keyboard.edit.status.review" = "Swipe to compare the original and edited text";
"keyboard.edit.status.applying" = "Applying edit…";
"keyboard.edit.page.original" = "Original";
"keyboard.edit.page.edited" = "Edited";
"keyboard.edit.helper.speak" = "Speak to edit";
"keyboard.edit.helper.finish" = "Tap to finish";
"keyboard.edit.helper.compare" = "Swipe to compare";
"keyboard.edit.helper.apply" = "Tap to apply";
"keyboard.edit.helper.append" = "Insert at cursor";
"keyboard.edit.close" = "Close edit mode";
"keyboard.edit.closeHint" = "Discard this edit and return to voice input.";
"keyboard.edit.apply" = "Apply edit";
"keyboard.edit.append" = "Insert at cursor";
"keyboard.edit.stop" = "Finish editing instruction";
/* AI question mode */
"keyboard.ai.placeholder" = "Tap the microphone to ask AI";
"keyboard.ai.hintA11yPrefix" = "Suggestion: ";
"keyboard.ai.hint" = "Insert the AI answer, then tap Send";
"keyboard.ai.listening" = "Listening…";
"keyboard.ai.recognizing" = "Recognizing your question…";
"keyboard.ai.generating" = "AI is answering…";
"keyboard.ai.thinking" = "AI is thinking…";
"keyboard.ai.send" = "Send";
"keyboard.ai.insert" = "Insert";
"keyboard.ai.inserted" = "Inserted";
"keyboard.ai.sent" = "Sent";
"keyboard.ai.cancel" = "Cancel AI question";
"keyboard.ai.cancelHint" = "Cancel the current recording, recognition, or AI request.";
"keyboard.ai.sendA11y" = "Tap once to insert the AI answer, then tap again to send in supported fields";
"keyboard.ai.startA11y" = "Start asking AI";
"keyboard.ai.stopA11y" = "Finish the question and send it to AI";
"keyboard.assistant.longPressCoach" = "Tap to dictate · Hold to ask AI";
"keyboard.assistant.autoReply.guidance.cta" = "Try AI auto-reply";
"keyboard.assistant.autoReply.guide.title" = "Let AI reply for you";
"keyboard.assistant.autoReply.guide.body" = "Turn on auto-reply and the keyboard drafts a ready-to-send reply the moment you copy a message.";
"keyboard.assistant.autoReply.guide.close" = "Not now";
"keyboard.assistant.autoReply.guide.closeHint" = "Dismiss the auto-reply suggestion.";
"keyboard.assistant.micA11y" = "Voice and AI";
"keyboard.assistant.micHint" = "Tap to dictate. Hold to ask AI.";
"keyboard.assistant.dictationAction" = "Start voice dictation";
"keyboard.assistant.aiAction" = "Ask AI";
"keyboard.assistant.space" = "Space";
"keyboard.assistant.delete" = "Delete";
"keyboard.assistant.sendHint" = "Performs the current field's Send, Search, Done, or Go action.";
"keyboard.assistant.insertPending" = "Insert retained AI answer";
"keyboard.assistant.insertTranslation" = "Insert translation";
"keyboard.assistant.insertReply" = "Insert reply";
"keyboard.assistant.discardPending" = "Discard AI answer";
"keyboard.assistant.discardPendingHint" = "Discard the answer retained because the cursor or input field changed.";
"keyboard.ai.replyVariant.ordinary" = "Ordinary";
"keyboard.ai.replyVariant.formal" = "Formal";
"keyboard.ai.replyVariant.playful" = "Relaxed & playful";
"keyboard.ai.replyVariant.invitationAccept" = "Accept";
"keyboard.ai.replyVariant.invitationDecline" = "Decline";
"keyboard.ai.replyVariant.invitationTentative" = "Decide later";
"keyboard.ai.replyVariant.taskAcknowledge" = "Acknowledge";
"keyboard.ai.replyVariant.taskClarify" = "Clarify";
"keyboard.ai.replyVariant.taskNegotiate" = "Negotiate";
"keyboard.ai.replyVariant.blessingReturn" = "Thank & return wish";
"keyboard.ai.replyVariant.blessingWarm" = "Warm";
"keyboard.ai.replyVariant.blessingPlayful" = "Lighthearted";
"keyboard.ai.replyVariant.clarificationDirect" = "Direct reply";
"keyboard.ai.replyVariant.clarificationQuestion" = "Ask key detail";
"keyboard.ai.replyVariant.clarificationConfirm" = "Confirm & ask";
"keyboard.ai.replyVariant.answerAffirmative" = "Yes";
"keyboard.ai.replyVariant.answerNegative" = "No";
"keyboard.ai.replyVariant.answerConditional" = "It depends";
"keyboard.ai.replyVariant.answerDefer" = "Need to check";
"keyboard.ai.replyVariant.insertHint" = "Insert this complete reply.";
"keyboard.assistant.dismissClipboard" = "Dismiss clipboard suggestions";
"keyboard.assistant.dismissClipboardHint" = "Hide the current clipboard summary and skills.";
"keyboard.semantic.intent.assistantCommand" = "Assistant command";
"keyboard.semantic.intent.informationQuery" = "Information query";
"keyboard.semantic.intent.systemNotification" = "System notification";
"keyboard.semantic.domain.finance" = "Finance";
"keyboard.semantic.domain.travel" = "Travel";
"keyboard.semantic.domain.calendar" = "Calendar";
"keyboard.semantic.domain.communication" = "Communication";
"keyboard.semantic.domain.media" = "Media";
"keyboard.semantic.domain.smartHome" = "Smart home";
"keyboard.semantic.domain.shopping" = "Shopping";
"keyboard.semantic.domain.dining" = "Dining";
"keyboard.semantic.domain.health" = "Health";
"keyboard.semantic.domain.weather" = "Weather";
"keyboard.semantic.domain.accountService" = "Account & service";
"keyboard.semantic.domain.generalKnowledge" = "General knowledge";
"keyboard.ai.error.missingAPIKey" = "Configure an AI service in the main app first";
"keyboard.ai.error.pipelineBusy" = "Voice input is busy. Try again shortly";
"keyboard.ai.error.startTimeout" = "Microphone startup timed out. Try again";
"keyboard.ai.error.requestTimeout" = "AI response timed out. Try again";
"keyboard.ai.error.requestFailed" = "AI response failed. Try again";
"keyboard.ai.error.clipboardUnavailable" = "This clipboard suggestion expired. Copy the text again";
"keyboard.ai.skill.reply" = "Reply";
"keyboard.ai.skill.speakAsMe" = "My words";
"keyboard.ai.skill.playfulReply" = "Playful";
"keyboard.ai.skill.replyInSourceLanguage" = "Reply";
"keyboard.ai.skill.summarize" = "Summary";
"keyboard.ai.skill.openLink" = "Open";
"keyboard.ai.skill.summarizeWebPage" = "Web summary";
"keyboard.ai.skill.callPhone" = "Call";
"keyboard.ai.skill.createContact" = "New contact";
"keyboard.ai.skill.extractConclusions" = "Conclusions";
"keyboard.ai.skill.translate" = "Translate";
"keyboard.ai.skill.acceptInvitation" = "Accept";
"keyboard.ai.skill.declineInvitation" = "Decline";
"keyboard.ai.skill.acceptTask" = "Acknowledge";
"keyboard.ai.skill.clarifyRequest" = "Clarify";
"keyboard.ai.skill.empathyReply" = "Empathy";
"keyboard.ai.skill.blessingReply" = "Reply to wishes";
"keyboard.ai.skill.askForDetails" = "Ask details";
"keyboard.ai.skill.businessReply" = "Business";
"keyboard.ai.skill.organizeList" = "Organize";
"keyboard.ai.skill.extractTodos" = "Tasks";
"keyboard.ai.skill.extractEvents" = "Events";
"keyboard.ai.skill.saveToNotes" = "Notes";
"keyboard.ai.skill.navigate" = "Navigate";
"keyboard.ai.skill.previewPolish" = "Polish";
"keyboard.ai.skill.previewIdeas" = "Ideas";
"keyboard.ai.skill.previewTone" = "Tone";
"keyboard.ai.skill.noTodos" = "No tasks in the clipboard";
"keyboard.ai.skill.noEvents" = "No date or time in the clipboard";
"keyboard.ai.skill.noAddress" = "No address in the clipboard";
"keyboard.ai.skill.noNote" = "Nothing to save to Notes";
"keyboard.ai.skill.noExportItems" = "Nothing to send to the Shortcut";
"keyboard.ai.skill.extracting" = "Finding tasks…";
"keyboard.ai.skill.extractingEvents" = "Finding events…";
"keyboard.ai.skill.extractingAddress" = "Finding an address…";
"keyboard.ai.skill.namingNote" = "Naming the note…";
"keyboard.ai.skill.runningShortcut" = "Running Shortcut…";
"keyboard.ai.skill.savingReminders" = "Adding to Reminders…";
"keyboard.ai.skill.savingEvents" = "Adding to Calendar…";
"keyboard.ai.skill.openingMaps" = "Opening Maps…";
"keyboard.ai.skill.shortcutMissing" = "Companion Shortcut not found. Reinstall it in Skills";
"keyboard.ai.skill.handoffFailed" = "Couldn’t open the app to run the Shortcut";
"keyboard.ai.skill.openLinkFailed" = "Couldn’t open this link";
"keyboard.ai.skill.callPhoneFailed" = "Couldn’t start this call";
"keyboard.ai.skill.createContactFailed" = "Couldn’t open the new contact form";
/* Key / panel accessibility labels */
"keyboard.typing.candidates.collapseA11y" = "Collapse candidates";
"keyboard.typing.candidates.expandA11y" = "More candidates";
"keyboard.key.shiftA11y" = "Shift";
"keyboard.key.deleteA11y" = "Delete";
"keyboard.key.returnA11y" = "Return";