use std::borrow::Cow;
use unicode_segmentation::UnicodeSegmentation;
use unicode_width::{UnicodeWidthChar, UnicodeWidthStr};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Locale {
En,
Ja,
ZhHans,
ZhHant,
PtBr,
Es419,
Vi,
Ko,
Ca,
De,
Fr,
Id,
Hi,
Ru,
Uk,
}
impl Locale {
pub fn tag(self) -> &'static str {
match self {
Self::En => "en",
Self::Ja => "ja",
Self::ZhHans => "zh-Hans",
Self::ZhHant => "zh-Hant",
Self::PtBr => "pt-BR",
Self::Es419 => "es-419",
Self::Vi => "vi",
Self::Ko => "ko",
Self::Ca => "ca",
Self::De => "de",
Self::Fr => "fr",
Self::Id => "id",
Self::Hi => "hi",
Self::Ru => "ru",
Self::Uk => "uk",
}
}
pub fn translation_target_name(self) -> &'static str {
match self {
Self::En => "English",
Self::Ja => "Japanese (日本語)",
Self::ZhHans => "Simplified Chinese (简体中文)",
Self::ZhHant => "Traditional Chinese (繁體中文)",
Self::PtBr => "Brazilian Portuguese (Português do Brasil)",
Self::Es419 => "Latin American Spanish (Español latinoamericano)",
Self::Vi => "Vietnamese (Tiếng Việt)",
Self::Ko => "Korean (한국어)",
Self::Ca => "Catalan (Català)",
Self::De => "German (Deutsch)",
Self::Fr => "French (Français)",
Self::Id => "Indonesian (Bahasa Indonesia)",
Self::Hi => "Hindi (हिन्दी)",
Self::Ru => "Russian (Русский)",
Self::Uk => "Ukrainian (Українська)",
}
}
pub fn shipped() -> &'static [Self] {
&[
Self::En,
Self::Ja,
Self::ZhHans,
Self::ZhHant,
Self::PtBr,
Self::Es419,
Self::Vi,
Self::Ko,
Self::Ca,
Self::De,
Self::Fr,
Self::Id,
Self::Hi,
Self::Ru,
Self::Uk,
]
}
pub fn shipped_complete() -> &'static [Self] {
&[
Self::En,
Self::Ja,
Self::ZhHans,
Self::ZhHant,
Self::PtBr,
Self::Es419,
Self::Vi,
Self::Ko,
Self::Ca,
Self::De,
Self::Fr,
Self::Id,
Self::Hi,
Self::Ru,
Self::Uk,
]
}
#[must_use]
pub fn is_partial_pack(self) -> bool {
false
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageId {
ComposerPlaceholder,
ComposerOperatePlaceholder,
ComposerDispatchFailedRestored,
DispatchFailedQueued,
DispatchFailedInitial,
HistorySearchPlaceholder,
HistorySearchTitle,
HistoryHintMove,
HistoryHintAccept,
HistoryHintRestore,
HistoryNoMatches,
TranscriptReasoningExpand,
TelemetryNoticeHeadline,
TelemetryNoticeBody,
TelemetryNoticeCompactBody,
TelemetryNoticeChoiceKeep,
TelemetryNoticeChoiceDisable,
TelemetryNoticeActionChoose,
TelemetryNoticeActionConfirm,
TelemetryNoticeActionExit,
TelemetryNoticeReceiptEnabled,
TelemetryNoticeReceiptDisabled,
TelemetryNoticeReceiptEnabledUnsaved,
TelemetryNoticeReceiptDisabledUnsaved,
StatusPickerTitle,
StatusPickerInstruction,
StatusPickerActionToggle,
StatusPickerActionAll,
StatusPickerActionNone,
StatusPickerActionSave,
StatusPickerActionCancel,
HotbarSetupTitle,
HotbarSetupSourceApp,
HotbarSetupSourceSlash,
HotbarSetupSourceMcp,
HotbarSetupSourceSkill,
HotbarSetupSourcePlugin,
HotbarSetupStatusDisabled,
HotbarSetupStatusPrefill,
HotbarSetupStatusReady,
HotbarSetupDirtyModified,
HotbarSetupDirtyClean,
HotbarSetupNoAction,
HotbarSetupStatusLine,
HotbarSetupSlotOutOfRange,
HotbarSetupNoActionSelected,
HotbarSetupCannotAssign,
HotbarSetupNoActions,
HotbarSetupRecommended,
HotbarSetupEmptySlot,
HotbarSetupHelp,
HotbarActionVoiceToggleName,
HotbarActionVoiceToggleDescription,
HotbarActionSessionCompactName,
HotbarActionSessionCompactDescription,
HotbarActionModePlanName,
HotbarActionModePlanDescription,
HotbarActionModeAgentName,
HotbarActionModeAgentDescription,
HotbarActionModeYoloName,
HotbarActionModeYoloDescription,
HotbarActionModeOperateName,
HotbarActionModeOperateDescription,
HotbarActionReasoningCycleName,
HotbarActionReasoningCycleDescription,
HotbarActionReasoningCycleAutoDisabled,
HotbarActionSidebarToggleName,
HotbarActionSidebarToggleDescription,
HotbarActionFileTreeToggleName,
HotbarActionFileTreeToggleDescription,
HotbarActionPaletteOpenName,
HotbarActionPaletteOpenDescription,
HotbarActionTrustToggleName,
HotbarActionTrustToggleDescription,
CommandPaletteTitle,
CommandPaletteSubtitle,
ConfigTitle,
ConfigSubtitle,
ConfigModalTitle,
ConfigSearchPlaceholder,
ConfigNoSettings,
ConfigNoMatchesPrefix,
ConfigFilteredSettings,
ConfigShowing,
ConfigFooterDefault,
ConfigFooterScrollable,
ConfigFooterFiltered,
ConfigSectionProvider,
ConfigSectionModel,
ConfigSectionPermissions,
ConfigSectionNetwork,
ConfigSectionDisplay,
ConfigSectionComposer,
ConfigSectionSidebar,
ConfigSectionHistory,
ConfigSectionMcp,
ConfigSectionFleet,
ConfigSectionWorkflow,
ConfigSectionSession,
ConfigSectionLegacy,
ConfigSectionExperimental,
ConfigScopeSession,
ConfigScopeSaved,
ConfigEditCancelled,
ConfigEditTitlePrefix,
ConfigEditScopeLabel,
ConfigEditCurrentLabel,
ConfigEditHintLabel,
ConfigEditNewLabel,
ConfigEditFooter,
ConfigLocalePartialBadge,
ConfigLocalePartialDetail,
ConfigRowEffective,
ConfigDefaultValue,
ConfigDefaultReasoning,
ConfigUnavailable,
ConfigLabelProvider,
ConfigLabelBaseUrlDeepseek,
ConfigLabelProviderUrl,
ConfigHintProviderUrl,
ConfigLabelModel,
ConfigLabelFastModel,
ConfigLabelDefaultModel,
ConfigLabelReasoningEffort,
ConfigLabelApprovalMode,
ConfigLabelPermissionPosture,
ConfigLabelApprovalPolicy,
ConfigLabelManagedApprovalPolicy,
ConfigLabelDefaultMode,
ConfigLabelAllowShell,
ConfigLabelManagedAllowShell,
ConfigLabelStreamTimeout,
ConfigLabelTheme,
ConfigLabelLocale,
ConfigLabelBackground,
ConfigLabelOceanTreatment,
ConfigLabelWorkSurfacePlacement,
ConfigLabelTopHeight,
ConfigLabelSideWidth,
ConfigLabelCalmMode,
ConfigLabelLowMotion,
ConfigLabelFancyAnimations,
ConfigLabelLaunchScreen,
ConfigLabelShowThinking,
ConfigLabelThinkingHighlight,
ConfigLabelShowToolDetails,
ConfigLabelInlineDiffs,
ConfigLabelStatusIndicator,
ConfigLabelSynchronizedOutput,
ConfigLabelCostCurrency,
ConfigLabelTranscriptSpacing,
ConfigLabelToolCollapse,
ConfigLabelComposerDensity,
ConfigLabelComposerBorder,
ConfigLabelComposerMultilineMode,
ConfigLabelComposerVimMode,
ConfigLabelBracketedPaste,
ConfigLabelPasteBurstDetection,
ConfigLabelMentionMenuLimit,
ConfigLabelMentionMenuBehavior,
ConfigLabelMentionWalkDepth,
ConfigLabelWorkspaceFollowSymlinks,
ConfigLabelSidebarWidth,
ConfigLabelSidebarFocus,
ConfigLabelContextPanel,
ConfigLabelSessionsRail,
ConfigLabelSessionAutoResume,
ConfigLabelAutoCompact,
ConfigLabelAutoCompactThreshold,
ConfigLabelMaxHistory,
ConfigLabelMcpConfigPath,
ConfigLabelFleetSpawnDepth,
ConfigLabelGoalCommand,
ConfigLabelWorkflow,
ConfigLabelFeaturePrefix,
ConfigColumnSetting,
ConfigColumnValue,
ConfigColumnScope,
ConfigActionOpenProvider,
ConfigActionOpenModel,
ConfigActionToggle,
ConfigActionChoose,
ConfigActionEdit,
ConfigActionReadOnly,
ModelPickerAutoNetworkHint,
ModelPickerAutoNetworkActiveProviderHint,
ModelPickerAutoLocalHint,
ModelPickerAutoLastRoute,
AutoRouteSelectedToast,
CloudCodeSystemPromptUnsupported,
HelpTitle,
HelpSubtitle,
HelpFilterPlaceholder,
HelpFilterPrefix,
HelpNoMatches,
HelpSlashCommands,
HelpKeybindings,
HelpUserCommands,
HelpSkills,
HelpFooterTypeFilter,
HelpFooterMove,
HelpFooterJump,
HelpFooterClose,
CmdAttachDescription,
CmdAnchorDescription,
CmdCacheDescription,
CmdPreviewRequestDescription,
CmdToolsDescription,
CmdTurnInspectDescription,
CmdChangeDescription,
CmdEffortDescription,
CmdChangeHeader,
CmdChangeTranslationQueued,
CmdChangeTranslationUnavailable,
CmdChangePreviousVersion,
CmdBalanceDescription,
CmdClearDescription,
CmdCompactDescription,
CmdPurgeDescription,
CmdConfigDescription,
CmdPermissionsDescription,
PermissionsListHeader,
PermissionsNoRules,
PermissionsFileMissing,
PermissionsFileEmpty,
PermissionsFilePresent,
PermissionsRuleEntry,
PermissionsMatchExactCommand,
PermissionsMatchCommandPrefix,
PermissionsMatchExactPath,
PermissionsMatchAnyInvocation,
PermissionsScopeGlobal,
PermissionsScopeRepo,
PermissionsAppliesHere,
PermissionsInactiveHere,
PermissionsRemovePreview,
PermissionsRemoved,
PermissionsUsage,
PermissionsRuleNotFound,
AutoReviewReceiptGuardianAllowed,
AutoReviewReceiptGuardianDenied,
AutoReviewReceiptGuardianUnavailable,
AutoReviewReceiptDeterministicBlocked,
AutoReviewReceiptHeld,
FooterHintEscInterrupt,
PermissionsPostureHeader,
PermissionsPostureAsk,
PermissionsPostureAuto,
PermissionsPostureBypass,
PermissionsPostureNever,
PermissionsReceiptsNote,
PermissionsOperationFailed,
CmdAuthDescription,
CmdConstitutionDescription,
CmdContextDescription,
CmdCostDescription,
CmdDiffDescription,
CmdEditDescription,
CmdExitDescription,
CmdExportDescription,
CmdFeedbackDescription,
CmdHfDescription,
CmdHelpDescription,
CmdProfileDescription,
CmdHomeDescription,
CmdHooksDescription,
CmdAgentDescription,
CmdGoalDescription,
GoalReceiptSet,
GoalStatusIdleHint,
CmdInitDescription,
CmdJobsDescription,
CmdLinksDescription,
CmdLoadDescription,
CmdLogoutDescription,
CmdMcpDescription,
McpRecommendedUnknownId,
McpRecommendationsSafety,
McpRecommendationGithub,
McpRecommendationChrome,
CmdMemoryDescription,
CmdPluginDescription,
PluginKimiUsage,
PluginKimiManagedRootHeading,
PluginKimiNoneFound,
PluginKimiLicenseUnspecified,
PluginKimiApplicable,
PluginKimiNotApplicable,
PluginKimiCandidateSummary,
PluginKimiCandidateDetails,
PluginKimiRejectedHeading,
PluginKimiInspectionFooter,
PluginKimiCandidateMissing,
PluginKimiCandidateChanged,
PluginKimiHomeMissing,
PluginKimiRootInspectFailed,
PluginKimiRootMustBeDirectory,
PluginKimiRootCanonicalizeFailed,
PluginKimiRootListFailed,
PluginKimiEntryReadFailed,
PluginKimiEntryLimit,
PluginKimiEntryInspectFailed,
PluginKimiEntryLinksRefused,
PluginKimiEntryOutsideRoot,
PluginKimiEntryCanonicalizeFailed,
PluginKimiManifestUnreadable,
PluginKimiManifestMustBeFile,
PluginKimiManifestInvalid,
PluginKimiDirectoryNameMismatch,
PluginKimiHashUnavailable,
PluginKimiRollbackDestinationMissing,
PluginKimiMismatchRemoved,
PluginKimiMismatchRollbackFailed,
PluginKimiUserPluginDirectory,
PluginKimiMarketplaceZipUnsupported,
PluginKimiMarketplaceRemoteUnsupported,
PluginKimiMarketplaceGzipTarball,
CmdPluginBundleUsage,
CmdPluginBundleNoneFound,
CmdPluginBundleListHeader,
CmdPluginLegacyListHeader,
CmdPluginBundleNotFound,
CmdPluginBundleReloaded,
CmdPluginBundleDetail,
CmdPluginBundleDiagnosticsHeader,
CmdPluginBundleMutationSuccess,
CmdPluginActionFailed,
CmdPluginNoneFound,
CmdPluginNotFound,
CmdPluginListHeader,
CmdPluginDetailDescription,
CmdPluginDetailSchema,
CmdPluginDetailApproval,
CmdPluginDetailPath,
CmdModeDescription,
CmdModelDescription,
CmdModelsDescription,
CmdModelDbDescription,
CmdNetworkDescription,
CmdUpdateDescription,
CmdNoteDescription,
CmdThemeDescription,
CmdProviderDescription,
CmdQueueDescription,
CmdQueueUsage,
CmdQueueDraftHeader,
CmdQueueNoMessages,
CmdQueueListHeader,
CmdQueueTip,
CmdQueueAlreadyEditing,
CmdQueueNotFound,
CmdQueueEditingStatus,
CmdQueueEditingMessage,
CmdQueueDropped,
CmdQueueAlreadyEmpty,
CmdQueueCleared,
CmdQueueMissingIndex,
CmdQueueIndexPositive,
CmdQueueIndexMin,
CmdRelayDescription,
CmdRemoteControlDescription,
CmdRemoteEnvDescription,
CmdRemoteEnvOverview,
CmdRemoteEnvOpening,
CmdRemoteEnvUnavailable,
CmdRemoteEnvSourceCustodyPolicy,
CmdRemoteEnvBrowserLabel,
CmdRenameDescription,
CmdTitleDescription,
CmdRestoreDescription,
CmdRetryDescription,
CmdReviewDescription,
CmdRlmDescription,
CmdSaveDescription,
CmdForkDescription,
CmdNewDescription,
CmdSessionsDescription,
CmdTreeDescription,
CmdBranchDescription,
CmdResumeDescription,
CmdSettingsDescription,
CmdSidebarDescription,
CmdSkillDescription,
CmdSkillsDescription,
CmdStashDescription,
CmdStatusDescription,
CmdStatuslineDescription,
CmdStructcopyDescription,
CmdStructcopyKindTurn,
CmdStructcopyKindTool,
CmdStructcopyKindPlan,
CmdStructcopyKindWorkflow,
CmdStructcopyUsageError,
CmdStructcopyUnavailable,
CmdStructcopyBusy,
CmdStructcopyPrepareFailed,
CmdStructcopyClipboardQueued,
CmdStructcopyClipboardAccepted,
CmdStructcopyClipboardFailed,
CmdStructcopyReceiptTooLarge,
CmdFleetDescription,
CmdLaneDescription,
CmdWorkflowDescription,
CmdHotbarDescription,
CmdSetupDescription,
CmdSubagentsDescription,
CmdAdvisorDescription,
CmdSystemDescription,
CmdAutomationDescription,
CmdTaskDescription,
CmdTokensDescription,
CmdTranslateDescription,
CmdTranslateOff,
CmdTranslateOn,
TranslationInProgress,
TranslationComplete,
TranslationFailed,
CmdTrustDescription,
CmdLspDescription,
CmdShareDescription,
CmdWorkspaceDescription,
CmdUndoDescription,
CmdVerboseDescription,
CmdCacheAdvice,
CmdCacheFootnote,
CmdCacheHeader,
CmdCacheNoData,
CmdCacheTotals,
CmdCostReport,
CmdCostReportSubtotal,
CmdCostReportUnknown,
CmdCostUnknownValue,
CmdCostEstimateOnly,
CmdCostCoverage,
CmdCostCoverageUnknownLegacy,
CmdCostUnpricedTurns,
CmdCostUnpricedClasses,
CmdCostPricingProvenance,
CmdCostLivePricingDowngraded,
CmdCostLivePricingUnavailable,
CmdCostRoutesHeader,
CmdTokensCacheWriteTotal,
CmdTokensCacheBoth,
CmdTokensCacheHitOnly,
CmdTokensCacheMissOnly,
CmdTokensContextUnknownWindow,
CmdTokensContextWithWindow,
CmdTokensNotReported,
CmdTokensReport,
FooterAgentSingular,
FooterAgentsPlural,
HeaderAgentsChip,
FooterPressCtrlCAgain,
FooterWorking,
FooterBalancePrefix,
HelpSectionActions,
HelpSectionClipboard,
HelpSectionEditing,
HelpSectionHelp,
HelpSectionModes,
HelpSectionNavigation,
HelpSectionSessions,
KbScrollTranscript,
KbNavigateHistory,
KbScrollTranscriptAlt,
KbBrowseHistory,
KbScrollPage,
KbJumpTopBottom,
KbJumpTopBottomEmpty,
KbJumpToolBlocks,
KbMoveCursor,
KbJumpLineStartEnd,
KbDeleteChar,
KbDeleteWord,
KbYank,
KbToggleFileTree,
KbSelectText,
KbSelectAllDraft,
KbClearDraft,
KbRestoreClearedDraft,
KbStashDraft,
KbSearchHistory,
KbInsertNewline,
KbSendDraft,
KbSteerCurrentTurn,
KbCloseMenu,
KbCancelOrExit,
KbShellControls,
KbExitEmpty,
KbCommandPalette,
KbSettings,
KbCancelBackgroundShellJobs,
KbFuzzyFilePicker,
KbCompactInspector,
KbCompactContext,
KbLastMessagePager,
KbSelectedDetails,
KbToolDetailsPager,
KbReasoningDetail,
KbTurnInspector,
KbExternalEditor,
KbLiveTranscript,
KbBacktrackMessage,
KbCompleteCycleModes,
KbCycleThinking,
KbCyclePermissions,
KbJumpPlanAgentYolo,
KbAltJumpPlanAgentYolo,
KbFocusSidebar,
KbSessionPicker,
KbTerminalPaste,
KbPasteAttach,
KbCopySelection,
ClipboardSshPasteHint,
KbContextMenu,
KbAttachPath,
KbHelpOverlay,
KbToggleHelp,
KbToggleHelpSlash,
HelpUsageLabel,
HelpAliasesLabel,
SettingsTitle,
SettingsConfigFile,
ClearConversation,
ClearConversationBusy,
ModelChanged,
LinksProjectTitle,
LinksDocumentation,
LinksCommunity,
LinksGitHub,
LinksManagedApp,
LinksManagedAppNote,
LinksTitle,
LinksDashboard,
LinksDocs,
LinksKimiCodeRouteNote,
LinksTip,
SubagentsFetching,
HelpUnknownCommand,
HomeDashboardTitle,
HomeModel,
HomeMode,
HomeWorkspace,
HomeHistory,
HomeTokens,
HomeQueued,
HomeSubagents,
HomeSkill,
HomeQuickActions,
HomeQuickLinks,
HomeQuickSkills,
HomeQuickConfig,
HomeQuickSettings,
HomeQuickModel,
HomeQuickSubagents,
HomeQuickTaskList,
HomeQuickHelp,
HomeModeTips,
HomeAgentModeTip,
HomeAgentModeReviewTip,
HomeAgentModeYoloTip,
HomeYoloModeTip,
HomeYoloModeCaution,
HomePlanModeTip,
HomePlanModeChecklistTip,
HomeOperateModeTip,
HomeOperateModeFleetTip,
HomeGoalModeTip,
OnboardWelcomeVersion,
OnboardWelcomeLead,
OnboardWelcomeSetupBlurb,
OnboardWelcomeSteps,
OnboardWelcomeStepLanguage,
OnboardWelcomeStepAppearance,
OnboardWelcomeStepApiKey,
OnboardWelcomeStepTrust,
OnboardWelcomeStepMentalModels,
OnboardWelcomeStepTips,
OnboardWelcomeDefaults,
OnboardWelcomeEnter,
OnboardWelcomeExit,
OnboardLanguageTitle,
OnboardLanguageBlurb,
OnboardLanguageFooter,
OnboardProviderTitle,
OnboardProviderBlurb,
OnboardProviderFooter,
OnboardApiKeyTitle,
OnboardApiKeyStep1,
OnboardApiKeyStep2,
OnboardApiKeyLocalHint,
OnboardApiKeySavedHint,
OnboardApiKeyFormatHint,
KimiCodePlanApiKeyHint,
KimiCodePlanRouteHint,
KimiCodePlanNoImportHint,
StepfunBillingRouteTitle,
StepfunBillingRouteIntro,
StepfunBillingRoutePaygOption,
StepfunBillingRoutePlanOption,
StepfunPlanApiKeyHint,
StepfunPlanRouteHint,
OnboardApiKeyPlaceholder,
OnboardApiKeyLabel,
OnboardApiKeyFooter,
OnboardApiKeyRejectedEnv,
OnboardTrustTitle,
OnboardTrustQuestion,
OnboardTrustLocationPrefix,
OnboardTrustRiskHint,
OnboardTrustEffectHint,
OnboardTrustFooterPrefix,
OnboardTrustFooterMiddle,
OnboardTrustFooterUntrustedMiddle,
OnboardTrustFooterSuffix,
OnboardTrustEnterHint,
OnboardTrustUntrustedNotice,
OnboardMentalTitle,
OnboardMentalModesLabel,
OnboardMentalPlanHint,
OnboardMentalActHint,
OnboardMentalOperateHint,
OnboardMentalPermissionLabel,
OnboardMentalCurrentLabel,
OnboardMentalConstitution,
OnboardMentalCycleMode,
OnboardMentalCyclePermission,
OnboardMentalContinue,
OnboardMentalBack,
OnboardAppearanceTitle,
OnboardAppearanceBlurb,
OnboardAppearanceFooter,
OnboardOfflineOption,
OnboardOfflineNotice,
OnboardOfflineTipsLine,
OnboardTipsTitle,
OnboardTipsLine1,
OnboardTipsLine2,
OnboardTipsLine3,
OnboardTipsLine4,
OnboardTipsDoctorPrefix,
OnboardTipsDoctorSuffix,
OnboardTipsFooterEnter,
OnboardTipsFooterAction,
SetupWizardTitle,
SetupWizardWhy,
SetupWizardProgress,
SetupActionBack,
SetupActionContinue,
SetupActionSkip,
SetupActionRetry,
SetupActionScrollBody,
SetupActionGuided,
SetupActionTuneGuided,
SetupActionModelDraft,
SetupActionFreeform,
SetupActionKeepExisting,
SetupActionProvider,
SetupActionModel,
SetupActionFleet,
SetupActionHotbar,
SetupActionRemote,
SetupActionMode,
SetupActionConfig,
SetupActionRuntimePreset,
SetupActionApplyRuntimePreset,
SetupActionUseBundled,
SetupActionDefer,
SetupActionCancel,
SetupStatusNotStarted,
SetupStatusRecommended,
SetupStatusOptional,
SetupStatusDeferred,
SetupStatusInProgress,
SetupStatusNeedsAction,
SetupStatusVerified,
SetupStatusSkipped,
SetupStatusFailed,
SetupStepLanguageTitle,
SetupStepLanguageWhy,
SetupStepProviderModelTitle,
SetupStepProviderModelWhy,
SetupStepTrustSandboxTitle,
SetupStepTrustSandboxWhy,
SetupStepOperateFleetTitle,
SetupStepOperateFleetWhy,
SetupStepToolsMcpTitle,
SetupStepToolsMcpWhy,
SetupStepHotbarTitle,
SetupStepHotbarWhy,
SetupStepRemoteRuntimeTitle,
SetupStepRemoteRuntimeWhy,
SetupStepPersistenceTitle,
SetupStepPersistenceWhy,
SetupStepConstitutionTitle,
SetupStepConstitutionWhy,
SetupStepVerificationTitle,
SetupStepVerificationWhy,
SetupCheckpointLayerOrder,
SetupCheckpointDoneBundled,
SetupCheckpointDoneGuided,
SetupCheckpointDoneKept,
SetupCheckpointDeferred,
SetupStepSkipped,
SetupStepRetryRecorded,
SetupLanguageReviewed,
SetupConstitutionChoiceLabel,
SetupConstitutionSourceLabel,
SetupConstitutionValidityLabel,
SetupConstitutionPreviewLabel,
SetupConstitutionExistingLabel,
SetupConstitutionExpertOverrideLabel,
SetupConstitutionGuidedHint,
SetupConstitutionGuidedAnswersHint,
SetupConstitutionPurposeLabel,
SetupConstitutionAutonomyLabel,
SetupConstitutionEvidenceLabel,
SetupConstitutionCommunicationLabel,
SetupConstitutionPrivacyLabel,
SetupConstitutionPrinciplesLabel,
SetupCardRouteLabel,
SetupCardModelLabel,
SetupCardAuthLabel,
SetupCardHealthLabel,
SetupCardIntentLabel,
SetupCardApprovalLabel,
SetupCardShellLabel,
SetupCardTrustLabel,
SetupCardSandboxLabel,
SetupCardNetworkLabel,
SetupOperateRuntimeLabel,
SetupOperateRosterLabel,
SetupOperateConcurrencyLabel,
SetupOperateReadinessLabel,
SetupOperateReviewHint,
SetupOperateReviewed,
SetupOperateNeedsActionSaved,
SetupHotbarBindingsLabel,
SetupHotbarActionsLabel,
SetupHotbarReviewHint,
SetupHotbarReviewed,
SetupToolsMcpServersLabel,
SetupToolsMcpSkillsLabel,
SetupToolsMcpToolsLabel,
SetupToolsMcpPluginsLabel,
SetupToolsMcpHotbarLabel,
SetupToolsMcpReviewHint,
SetupToolsMcpReviewed,
SetupToolsMcpNeedsActionSaved,
SetupToolsMcpPreviewTitle,
SetupToolsMcpOnRampText,
SetupToolsMcpDshLabel,
SetupToolsMcpDshRow,
SetupRemoteCloudsLabel,
SetupRemoteBridgesLabel,
SetupRemoteProvidersLabel,
SetupRemoteModeLabel,
SetupRemoteModeLocalOnly,
SetupRemoteModeRuntimeApi,
SetupRemoteModeMobileLan,
SetupRemoteModeChatBridge,
SetupRemoteStatusDisabled,
SetupRemoteStatusReady,
SetupRemoteStatusNeedsAction,
SetupRemoteReviewHint,
SetupRemotePreviewTitle,
SetupRemoteReviewed,
SetupPersistenceHomeLabel,
SetupPersistenceConfigLabel,
SetupPersistenceStateLabel,
SetupPersistenceConstitutionLabel,
SetupPersistenceMemoryLabel,
SetupPersistenceNotesLabel,
SetupPersistenceReviewHint,
SetupPersistenceReviewed,
SetupProviderModelReadyHint,
SetupProviderModelNeedsActionHint,
SetupProviderModelReviewed,
SetupProviderModelNeedsActionSaved,
SetupRuntimePostureBoundary,
SetupRuntimePostureReviewHint,
SetupRuntimePostureReviewed,
SetupRuntimePresetSelectedLabel,
SetupRuntimePresetDiffLabel,
SetupRuntimePresetAskFirstTitle,
SetupRuntimePresetAskFirstDescription,
SetupRuntimePresetNormalAgentTitle,
SetupRuntimePresetNormalAgentDescription,
SetupRuntimePresetHighTrustTitle,
SetupRuntimePresetHighTrustDescription,
SetupRuntimePresetPreviewTitle,
SetupRuntimePresetSafetyFloor,
SetupRuntimePresetApplyHint,
SetupRuntimePresetApplied,
SetupRuntimeProjectOverrideLabel,
SetupRuntimeProjectOverrideNone,
SetupReportFirstRunLabel,
SetupReportUpdateLabel,
SetupReportOperateLabel,
SetupReportSourceLabel,
SetupReportAutonomyLabel,
SetupReportRuntimePostureLabel,
SetupReportPersisted,
SetupReportInherited,
SetupReportReady,
SetupReportRequired,
SetupReportOptional,
SetupReportRowsLabel,
SetupReportNextActionLabel,
SetupReportNextActionNone,
SetupReportNextActionConstitution,
SetupReportNextActionProvider,
SetupReportNextActionRuntime,
SetupReportNextActionOperate,
SetupReportNextActionRequired,
SetupReportRecorded,
CtxMenuTitle,
CtxMenuCopySelection,
CtxMenuCopySelectionDesc,
CtxMenuOpenSelection,
CtxMenuOpenSelectionDesc,
CtxMenuClearSelection,
CtxMenuOpenDetails,
CtxMenuCopyMessage,
CtxMenuCopyMessageDesc,
CtxMenuOpenInEditor,
CtxMenuOpenInEditorDesc,
CtxMenuShowCell,
CtxMenuShowCellDesc,
CtxMenuHideCell,
CtxMenuHideCellDesc,
CtxMenuShowHidden,
CtxMenuShowHiddenDesc,
CtxMenuPaste,
CtxMenuPasteDesc,
CtxMenuCmdPalette,
CtxMenuCmdPaletteDesc,
CtxMenuContextInspector,
CtxMenuContextInspectorDesc,
CtxMenuHelp,
CtxMenuHelpDesc,
CtxMenuWindowPin,
CtxMenuWindowUnpin,
CtxMenuWindowPinDesc,
CmdPinDescription,
WindowPinActive,
WindowPinReleased,
FanoutCounts,
AppModeAgent,
AppModeAuto,
AppModeYolo,
AppModePlan,
AppModeOperate,
AppModeAgentHint,
AppModeAutoHint,
AppModePlanHint,
AppModeYoloHint,
AppModeOperateHint,
VimModeNormal,
VimModeInsert,
VimModeVisual,
ApprovalRiskReview,
ApprovalRiskElevated,
ApprovalRiskDestructive,
ApprovalCategorySafe,
ApprovalCategoryFileWrite,
ApprovalCategoryShell,
ApprovalCategoryNetwork,
ApprovalCategoryMcpRead,
ApprovalCategoryMcpAction,
ApprovalCategoryAgent,
ApprovalCategoryUnknown,
ApprovalFieldType,
ApprovalFieldAbout,
ApprovalFieldImpact,
ApprovalFieldParams,
ApprovalOptionApproveOnce,
ApprovalOptionApproveAlways,
ApprovalOptionAllowExactRepo,
ApprovalSaveAskRuleHint,
ApprovalOptionDeny,
ApprovalOptionAbortTurn,
ApprovalBlockTitle,
ApprovalControlsHint,
ApprovalTruncationHint,
ApprovalFullAccessPolicyBlocked,
AutoReviewQuestionSkipped,
ApprovalChooseHint,
ApprovalChooseAction,
ApprovalIntentLabel,
ApprovalMoreLines,
ApprovalAutoDeniedSession,
ElevationTitleSandboxDenied,
ElevationTitleRequired,
ElevationFieldTool,
ElevationFieldCmd,
ElevationFieldReason,
ElevationImpactHeader,
ElevationImpactNetwork,
ElevationImpactWrite,
ElevationImpactFullAccess,
ElevationPromptProceed,
ElevationOptionNetwork,
ElevationOptionWrite,
ElevationOptionFullAccess,
ElevationOptionAbort,
ElevationOptionNetworkDesc,
ElevationOptionWriteDesc,
ElevationOptionFullAccessDesc,
ElevationOptionAbortDesc,
ContextAutoCompacting,
ContextManualCompacting,
ContextCompactionQueued,
ContextCompactionAlreadyRunning,
ContextCompactionQueueFull,
ContextCompactionQueueClosed,
ContextCompactionRouteInvalid,
CtxInspTitle,
CtxInspSessionContext,
CtxInspSystemPrompt,
CtxInspReferences,
CtxInspRecentTools,
CtxInspModel,
CtxInspWorkspace,
CtxInspSession,
CtxInspContext,
CtxInspTranscript,
CtxInspWorkspaceStatus,
CtxInspNotSampledYet,
CtxInspOk,
CtxInspHigh,
CtxInspCritical,
CtxInspIncluded,
CtxInspAttached,
CtxInspNotIncluded,
CtxInspOutputCaptured,
CtxInspNoOutputYet,
CtxInspNoSystemPrompt,
CtxInspNoReferences,
CtxInspNoToolActivity,
CtxInspVHint,
CtxInspCells,
CtxInspApiMessages,
CtxInspActive,
CtxInspCell,
CtxInspMoreReferences,
CtxInspStablePrefix,
CtxInspVolatileWorkingSet,
CtxInspFirstLine,
CtxInspTotal,
CtxInspTextPromptLayers,
CtxInspSingleTextBlob,
CtxInspBlocks,
CtxInspBlock,
CtxInspTokens,
CtxInspLayers,
CtxInspNone,
CtxInspEmpty,
CtxInspCacheFriendly,
CtxInspChangesByTurn,
CtxInspStablePrefixOnly,
CtxInspCacheTip,
ToolFamilyRead,
ToolFamilyPatch,
ToolFamilyRun,
ToolFamilyFind,
ToolFamilyDelegate,
ToolFamilyFanout,
ToolFamilyRlm,
ToolFamilyVerify,
ToolFamilyThink,
ToolFamilyGeneric,
CmdVoiceDescription,
CmdVoiceSendDescription,
CmdVoiceControlDescription,
VoiceEnabled,
VoiceDisabled,
VoiceSendEnabled,
VoiceSendDisabled,
VoiceControlEnabled,
VoiceControlDisabled,
VoiceErrNoAuth,
VoiceErrNoRecorder,
VoiceErrNetwork,
VoiceErrEmptySend,
VoiceErrTooShort,
VoiceRecording,
VoiceProcessing,
VoiceTranscribed,
NotificationTurnComplete,
NotificationSubagentComplete,
NotificationSubagentFailed,
NotificationSubagentInterrupted,
NotificationSubagentCancelled,
NotificationSubagentBudgetExhausted,
FooterWorkedChip,
FleetDraftTitle,
FleetDraftHeader,
SetupRemoteOnRampText,
ApprovalDescSafe,
ApprovalDescFileWrite,
ApprovalDescShell,
ApprovalDescNetwork,
ApprovalDescMcpRead,
ApprovalDescMcpAction,
ApprovalDescAgent,
ApprovalDescUnknown,
ApprovalImpactSafe,
ApprovalImpactFileWrite,
ApprovalImpactShell,
ApprovalImpactNetwork,
ApprovalImpactMcpRead,
ApprovalImpactMcpAction,
ApprovalImpactAgent,
ApprovalImpactUnknown,
ApprovalLabelCommand,
ApprovalLabelDir,
ApprovalLabelFile,
ApprovalLabelPreview,
ApprovalLabelProposedContent,
ApprovalLabelReplaceThis,
ApprovalLabelWithThis,
ApprovalLabelReplacementContent,
ApprovalLabelPath,
ApprovalLabelTarget,
ApprovalLabelInput,
ApprovalLabelAction,
ApprovalLabelType,
ApprovalLabelPrompt,
ApprovalLabelAbout,
ApprovalLabelImpact,
SetupConstitutionFileNotChecked,
SetupConstitutionFileMissing,
SetupConstitutionFileLoadedSelected,
SetupConstitutionFileLoadedInactive,
SetupConstitutionFileLoadedUnselected,
SetupConstitutionFileEmpty,
SetupConstitutionFileInvalid,
SetupConstitutionFileUnreadable,
SetupConstitutionFilePathError,
SetupExpertOverrideNotChecked,
SetupExpertOverrideMissing,
SetupExpertOverrideActive,
SetupExpertOverrideDisabled,
SetupExpertOverrideEmpty,
SetupExpertOverrideUnreadable,
SetupExpertOverridePathError,
SetupAutonomyUnspecified,
SetupGuidedPurposeCoding,
SetupGuidedPurposeResearch,
SetupGuidedPurposeOperations,
SetupGuidedPurposeMixed,
SetupGuidedPurposeAboutCoding,
SetupGuidedPurposeAboutResearch,
SetupGuidedPurposeAboutOperations,
SetupGuidedPurposeAboutMixed,
SetupGuidedStyleCoding,
SetupGuidedStyleResearch,
SetupGuidedStyleOperations,
SetupGuidedStyleMixed,
SetupGuidedEvidenceAssumptions,
SetupGuidedEvidenceTestsAndReceipts,
SetupGuidedEvidenceReleaseReceipts,
SetupGuidedNotes,
LaunchMenuNewSession,
LaunchMenuNewWorktree,
LaunchMenuResumeSession,
LaunchMenuChangelog,
LaunchMenuQuit,
LaunchMenuUnavailable,
LaunchMenuSavedCount,
LaunchWorktreePrompt,
LaunchWorktreeNeedsGit,
LaunchWorktreeNameLabel,
LaunchHintMove,
LaunchHintOpen,
LaunchTipFlags,
LaunchSavedSessionSingular,
LaunchSavedSessionsPlural,
LaunchCreatingWorktree,
LaunchWorktreeFailed,
LaunchNoSavedSessions,
PhaseIdle,
PhaseDraft,
PhaseWorking,
PhaseReasoning,
PhaseReading,
PhaseUsingTool,
PhaseVerifying,
PhaseWaitingOnYou,
PhaseDone,
PhaseFailed,
PhaseFinishing,
ChipModeAct,
ChipModePlan,
ChipModeOperate,
ChipPermissionReadOnly,
ChipPermissionAsk,
ChipPermissionAuto,
ChipPermissionFullAccess,
ChipPermissionNever,
FooterHintKeys,
FooterHintOutput,
FooterHintContext,
SessionMetricsTurn,
SessionMetricsTurns,
SessionMetricsStep,
SessionMetricsSteps,
SessionMetricsLlm,
SessionMetricsTools,
SessionMetricsTtft,
SessionMetricsTokensPerSecond,
SessionMetricsCache,
SessionMetricsInput,
SessionMetricsStatusLine,
EmptyStateNoGit,
EmptyStateMcpLabel,
EmptyStateFleetLabel,
EmptyStateFleetSetupLabel,
EmptyStateHelpConnector,
EmptyStateHelpHint,
SessionsSurfaceTitle,
SessionsPaneTitle,
SessionsHistoryPaneTitle,
SessionsActionResume,
SessionsActionSearch,
SessionsActionSort,
SessionsActionRename,
SessionsActionAllWorkspaces,
SessionsActionDelete,
SessionsActionClose,
SessionsScopeSortHeader,
SessionsEmptyTitle,
SessionsEmptyHint,
SessionsShowingAllWorkspaces,
SessionsScopedToWorkspace,
SessionsNewTitlePrompt,
SessionsDeletePrompt,
SessionsConfirmDelete,
SessionsNewSessionTitle,
SessionsOpenedHistory,
SessionsSortStatus,
SessionsSortRecent,
SessionsSortName,
SessionsSortSize,
SessionsSearchPrompt,
SessionsDeleteFailed,
SessionsDeleted,
SessionsNoSelection,
SessionsTitleLength,
SessionsOpenFailed,
SessionsLoadFailed,
SessionsRenameFailed,
SessionsRenamed,
SessionsRailTitle,
SessionsRailEmpty,
SessionsRailBrowseAll,
SessionsRailShowingCount,
SessionsRailUnavailable,
SessionsActionArchive,
SessionsActionShowArchived,
SessionsArchived,
SessionsRestored,
SessionsArchiveFailed,
SessionsShowingArchived,
SessionsHidingArchived,
SessionsArchivedCompact,
SessionsNoResults,
SessionsDirectoryFailed,
SessionsPreviewFailed,
SessionsDeleteCancelled,
SessionsRenameCancelled,
SessionsShowingRange,
SessionsMessageCountCompact,
SessionsForkCompact,
SessionsUnknownMode,
SessionsPreviewTitle,
SessionsPreviewUpdated,
SessionsPreviewMessagesModel,
SessionsPreviewMode,
SessionsToolCall,
SessionsToolError,
SessionsToolResult,
SessionsServerTool,
SessionsImage,
SessionsTimeJustNow,
SessionsTimeMinutesAgo,
SessionsTimeHoursAgo,
SessionsTimeDaysAgo,
CtxInspRowSystemPrompt,
CtxInspRowMessages,
CtxInspRowFree,
CtxInspFreeTokensDetail,
CtxInspDrillTitle,
CtxInspSurfaceTitle,
CtxInspActionSelect,
CtxInspActionDrillDown,
CtxInspActionClose,
CtxInspUsedTokens,
CtxInspAutoCompactAt,
CtxInspRowTokens,
RouteSurfaceTitle,
RouteBrowseCatalog,
RouteActionType,
RouteActionSearchAnyModel,
RoutePanelHeader,
RouteProviderLabel,
RouteModelFirstAtomic,
PickerActionMove,
PickerActionSwitch,
PickerActionApply,
PickerActionSetStartupDefault,
PickerActionCancel,
PickerActionClear,
PickerActionClearSearch,
PickerActionBrowseAll,
PickerActionCustom,
PickerActionJump,
PickerActionEditKey,
PickerActionModels,
PickerActionUnavailable,
PickerActionSetKey,
PickerActionConfigured,
RouteNoModels,
RouteNoModelMatch,
ProviderNoMatchesTitle,
ProviderNoMatchesHint,
ProviderNoConfiguredTitle,
ProviderNoConfiguredHint,
ProviderNoCatalogModels,
ProviderExternalActionRevoke,
ProviderExternalActionChoices,
ProviderExternalActionReuseGrok,
ProviderExternalHintCodexReview,
ProviderExternalHintXaiReview,
ProviderExternalHintXaiApiKey,
XaiAuthChoiceTitle,
XaiAuthChoiceIntro,
XaiAuthChoiceApiKeyOption,
XaiAuthChoiceDeviceOAuthOption,
ProviderExternalDetailScope,
ProviderExternalDormant,
ProviderExternalOwnerPath,
ProviderExternalPinnedPathWarning,
ProviderExternalSemanticsRevoke,
ProviderExternalRevoke,
ProviderExternalChoiceTitle,
ProviderExternalActionChoose,
ProviderExternalChoiceIntro,
ProviderExternalDisabledLabel,
ProviderExternalDisabledDetail,
ProviderExternalReadOnlyLabel,
ProviderExternalReadOnlyDetail,
ProviderExternalReadOnlySemantics,
ProviderExternalManagedLabel,
ProviderExternalManagedDetail,
ProviderExternalConfirmTitle,
ProviderExternalActionGrant,
ProviderExternalOwnerLabel,
ProviderExternalExactPathLabel,
ProviderExternalSemanticsLabel,
ProviderExternalRejectUnsafe,
ProviderExternalRevokeLabel,
ProviderExternalGrantedToast,
ProviderExternalSaveFailedToast,
ProviderExternalRevokedToast,
ProviderExternalRevokeFailedToast,
ThemeSurfaceTitle,
ThemeTreatmentOmbreUnavailable,
ThemeTreatmentFlatActive,
ThemeTreatmentOmbreActive,
FleetRosterHeaderLabel,
FleetRosterTabRoster,
FleetRosterTabSetup,
FleetRosterWorkers,
FleetRosterMembersCount,
FleetRosterOperatorFirst,
FleetRosterOperatorRow,
FleetReadyNotice,
FleetProfileIdentityVerifyFailed,
FleetProfileIdConflict,
FleetProfileProviderUnconfigured,
FleetDestStepTitle,
FleetDestStepSubtitle,
FleetDestProjectLabel,
FleetDestPersonalLabel,
FleetDestProjectSummary,
FleetDestPersonalSummary,
FleetDestProjectDescription,
FleetDestPersonalDescription,
FleetDestPathLine,
FleetDestUnavailable,
FleetDestReasonNoProjectConfig,
FleetDestReasonWorkspaceMissing,
FleetDestReasonHomeUnavailable,
FleetDestWillReplace,
FleetDestOverridesProject,
FleetDestOverridesPersonal,
FleetDestOverridesBuiltIn,
FleetSavesToChip,
FleetSavesToUndecided,
FleetActionSaveProject,
FleetActionSavePersonal,
FleetActionReplaceProject,
FleetActionReplacePersonal,
FleetActionConfirmReplace,
FleetActionChangeDestination,
FleetActionBack,
FleetReviewSavesTo,
FleetModelRowBlockedNotice,
FleetDestProjectDisabledSave,
WorkflowStatusWaiting,
WorkflowDebrief,
WorkflowTranscriptDetails,
WorkflowReceiptRole,
WorkflowReceiptReasoning,
WorkflowReceiptVia,
WorkflowReceiptTokens,
WorkflowReceiptTools,
WorkflowReceiptDuration,
WorkflowReceiptUnknown,
WorkflowReceiptProviderReported,
WorkflowReceiptEstimated,
SidebarTasksLabel,
SidebarTodoLabel,
SidebarStopControl,
SidebarDestructiveArmed,
WorkSurfaceTodoProgress,
WorkSurfaceStopConfirmHint,
CoordinationWorkTitle,
CoordinationSummaryDecisions,
CoordinationSummaryContentions,
CoordinationSummaryReconciled,
CoordinationSchema,
CoordinationSequence,
CoordinationPerSectionLimit,
CoordinationDecisionsHeading,
CoordinationNone,
CoordinationNoneValue,
CoordinationStatus,
CoordinationOwner,
CoordinationVersion,
CoordinationWriteClaimsHeading,
CoordinationIsolated,
CoordinationSharedWorkspace,
CoordinationPaths,
CoordinationContracts,
CoordinationContentionsHeading,
CoordinationClaimant,
CoordinationDisposition,
CoordinationNeutralReconciliationHeading,
CoordinationCandidates,
CoordinationRetry,
CoordinationReviewer,
CoordinationVerifier,
CoordinationVerification,
CoordinationContextProjectionsHeading,
CoordinationContextDecisions,
CoordinationBytes,
CoordinationDeduplicated,
CoordinationOmitted,
CoordinationActiveHotPathsHeading,
CoordinationActiveClaims,
CoordinationMetricsNoteHeading,
CoordinationMetricsNoAuthoritativeSource,
CoordinationStatusProposed,
CoordinationStatusAccepted,
CoordinationStatusSuperseded,
ComposerSlashMenuHint,
ApprovalRepoLawBadge,
ApprovalRepoLawTitle,
ApprovalRepoLawWarning,
ApprovalRepoLawRuleLabel,
FilePickerMatchSingular,
FilePickerMatchesPlural,
FilePickerScanning,
BehavioralTipPlanning,
BehavioralTipBackgroundReceipt,
BehavioralTipClearedInput,
BehavioralTipMcpValidation,
BehavioralTipRepeatedCommand,
BehavioralTipDurableStateWritten,
BehavioralTipTodoWrite,
SettingLockedDuringTurn,
SettingSubjectMode,
SettingSubjectThinking,
SettingSubjectModel,
SettingSubjectModelAndThinking,
SettingSubjectProvider,
SettingSubjectPermissions,
ThinkingControlledByAutoRouting,
SavedAsStartupDefault,
ModeAlreadyActiveSavedAsDefault,
StartupDefaultNotSaved,
StartupDefaultSubjectMode,
StartupDefaultSubjectThinking,
StartupDefaultSubjectModel,
StartupDefaultSubjectAll,
AutomationUsage,
AutomationManagerUnavailable,
AutomationListFailed,
AutomationActionFailed,
AutomationEmpty,
AutomationListHeading,
AutomationNoun,
AutomationStatusLabel,
AutomationStatusActive,
AutomationStatusPaused,
AutomationRunStatusQueued,
AutomationRunStatusRunning,
AutomationRunStatusCompleted,
AutomationRunStatusFailed,
AutomationRunStatusCanceled,
AutomationActionInspect,
AutomationActionPause,
AutomationActionResume,
AutomationActionDelete,
AutomationActionRun,
AutomationActionPaused,
AutomationActionResumed,
AutomationNextLabel,
AutomationNameLabel,
AutomationPromptLabel,
AutomationCwdLabel,
AutomationModeLabel,
AutomationAllowShellLabel,
AutomationTrustModeLabel,
AutomationAutoApproveLabel,
AutomationRruleLabel,
AutomationDeliveryLabel,
AutomationLastLabel,
AutomationRecentRunsLabel,
AutomationNoRuns,
AutomationRunsUnavailable,
AutomationTaskLabel,
AutomationMutationReceipt,
AutomationRunEnqueued,
AutomationDeletePreview,
AutomationDeleteConfirmationStale,
AutomationDeleted,
WhaleStateResting,
WhaleStateThinking,
WhaleStateWorking,
WhaleStateWaiting,
WhaleStateBlocked,
WhaleStateOffline,
WhaleAnimalScout,
WhaleAnimalPatch,
WhaleAnimalHarbor,
WhaleAnimalEcho,
WhaleAnimalKeel,
WhaleAnimalLantern,
WhaleAnimalPlain,
WhaleJobScout,
WhaleJobPatch,
WhaleJobHarbor,
WhaleJobEcho,
WhaleJobKeel,
WhaleJobLantern,
WhaleJobPlain,
AgentFocusOpened,
AgentFocusClosed,
AgentFocusBanner,
AgentFocusPosture,
AgentFocusPostureWrites,
AgentFocusPostureReadOnly,
AgentFocusPostureNetwork,
AgentFocusPostureNoNetwork,
AgentFocusPostureShellFull,
AgentFocusPostureShellReadOnly,
AgentFocusPostureShellNone,
AgentFocusComposerChip,
AgentFocusPlaceholder,
AgentFocusNoTranscript,
AgentFocusOmitted,
AgentFocusFollowUpDelivered,
AgentFocusFollowUpQueued,
AgentFocusFollowUpContinued,
AgentFocusFollowUpFailed,
FooterHintForAgents,
FooterHintToManage,
AgentRailQueuedCount,
}
#[allow(dead_code)]
pub const ALL_MESSAGE_IDS: &[MessageId] = &[
MessageId::ComposerPlaceholder,
MessageId::ComposerOperatePlaceholder,
MessageId::ComposerDispatchFailedRestored,
MessageId::DispatchFailedQueued,
MessageId::DispatchFailedInitial,
MessageId::HistorySearchPlaceholder,
MessageId::HistorySearchTitle,
MessageId::HistoryHintMove,
MessageId::HistoryHintAccept,
MessageId::HistoryHintRestore,
MessageId::HistoryNoMatches,
MessageId::TranscriptReasoningExpand,
MessageId::TelemetryNoticeHeadline,
MessageId::TelemetryNoticeBody,
MessageId::TelemetryNoticeCompactBody,
MessageId::TelemetryNoticeChoiceKeep,
MessageId::TelemetryNoticeChoiceDisable,
MessageId::TelemetryNoticeActionChoose,
MessageId::TelemetryNoticeActionConfirm,
MessageId::TelemetryNoticeActionExit,
MessageId::TelemetryNoticeReceiptEnabled,
MessageId::TelemetryNoticeReceiptDisabled,
MessageId::TelemetryNoticeReceiptEnabledUnsaved,
MessageId::TelemetryNoticeReceiptDisabledUnsaved,
MessageId::StatusPickerTitle,
MessageId::StatusPickerInstruction,
MessageId::StatusPickerActionToggle,
MessageId::StatusPickerActionAll,
MessageId::StatusPickerActionNone,
MessageId::StatusPickerActionSave,
MessageId::StatusPickerActionCancel,
MessageId::HotbarSetupTitle,
MessageId::HotbarSetupSourceApp,
MessageId::HotbarSetupSourceSlash,
MessageId::HotbarSetupSourceMcp,
MessageId::HotbarSetupSourceSkill,
MessageId::HotbarSetupSourcePlugin,
MessageId::HotbarSetupStatusDisabled,
MessageId::HotbarSetupStatusPrefill,
MessageId::HotbarSetupStatusReady,
MessageId::HotbarSetupDirtyModified,
MessageId::HotbarSetupDirtyClean,
MessageId::HotbarSetupNoAction,
MessageId::HotbarSetupStatusLine,
MessageId::HotbarSetupSlotOutOfRange,
MessageId::HotbarSetupNoActionSelected,
MessageId::HotbarSetupCannotAssign,
MessageId::HotbarSetupNoActions,
MessageId::HotbarSetupRecommended,
MessageId::HotbarSetupEmptySlot,
MessageId::HotbarSetupHelp,
MessageId::HotbarActionVoiceToggleName,
MessageId::HotbarActionVoiceToggleDescription,
MessageId::HotbarActionSessionCompactName,
MessageId::HotbarActionSessionCompactDescription,
MessageId::HotbarActionModePlanName,
MessageId::HotbarActionModePlanDescription,
MessageId::HotbarActionModeAgentName,
MessageId::HotbarActionModeAgentDescription,
MessageId::HotbarActionModeYoloName,
MessageId::HotbarActionModeYoloDescription,
MessageId::HotbarActionModeOperateName,
MessageId::HotbarActionModeOperateDescription,
MessageId::HotbarActionReasoningCycleName,
MessageId::HotbarActionReasoningCycleDescription,
MessageId::HotbarActionReasoningCycleAutoDisabled,
MessageId::HotbarActionSidebarToggleName,
MessageId::HotbarActionSidebarToggleDescription,
MessageId::HotbarActionFileTreeToggleName,
MessageId::HotbarActionFileTreeToggleDescription,
MessageId::HotbarActionPaletteOpenName,
MessageId::HotbarActionPaletteOpenDescription,
MessageId::HotbarActionTrustToggleName,
MessageId::HotbarActionTrustToggleDescription,
MessageId::CommandPaletteTitle,
MessageId::CommandPaletteSubtitle,
MessageId::ConfigTitle,
MessageId::ConfigSubtitle,
MessageId::ConfigModalTitle,
MessageId::ConfigSearchPlaceholder,
MessageId::ConfigNoSettings,
MessageId::ConfigNoMatchesPrefix,
MessageId::ConfigFilteredSettings,
MessageId::ConfigShowing,
MessageId::ConfigFooterDefault,
MessageId::ConfigFooterScrollable,
MessageId::ConfigFooterFiltered,
MessageId::ConfigSectionProvider,
MessageId::ConfigSectionModel,
MessageId::ConfigSectionPermissions,
MessageId::ConfigSectionNetwork,
MessageId::ConfigSectionDisplay,
MessageId::ConfigSectionComposer,
MessageId::ConfigSectionSidebar,
MessageId::ConfigSectionHistory,
MessageId::ConfigSectionMcp,
MessageId::ConfigSectionFleet,
MessageId::ConfigSectionWorkflow,
MessageId::ConfigSectionSession,
MessageId::ConfigSectionLegacy,
MessageId::ConfigSectionExperimental,
MessageId::ConfigScopeSession,
MessageId::ConfigScopeSaved,
MessageId::ConfigEditCancelled,
MessageId::ConfigEditTitlePrefix,
MessageId::ConfigEditScopeLabel,
MessageId::ConfigEditCurrentLabel,
MessageId::ConfigEditHintLabel,
MessageId::ConfigEditNewLabel,
MessageId::ConfigEditFooter,
MessageId::ConfigLocalePartialBadge,
MessageId::ConfigLocalePartialDetail,
MessageId::ConfigRowEffective,
MessageId::ConfigDefaultValue,
MessageId::ConfigDefaultReasoning,
MessageId::ConfigUnavailable,
MessageId::ConfigLabelProvider,
MessageId::ConfigLabelBaseUrlDeepseek,
MessageId::ConfigLabelProviderUrl,
MessageId::ConfigHintProviderUrl,
MessageId::ConfigLabelModel,
MessageId::ConfigLabelFastModel,
MessageId::ConfigLabelDefaultModel,
MessageId::ConfigLabelReasoningEffort,
MessageId::ConfigLabelApprovalMode,
MessageId::ConfigLabelPermissionPosture,
MessageId::ConfigLabelApprovalPolicy,
MessageId::ConfigLabelManagedApprovalPolicy,
MessageId::ConfigLabelDefaultMode,
MessageId::ConfigLabelAllowShell,
MessageId::ConfigLabelManagedAllowShell,
MessageId::ConfigLabelStreamTimeout,
MessageId::ConfigLabelTheme,
MessageId::ConfigLabelLocale,
MessageId::ConfigLabelBackground,
MessageId::ConfigLabelOceanTreatment,
MessageId::ConfigLabelWorkSurfacePlacement,
MessageId::ConfigLabelTopHeight,
MessageId::ConfigLabelSideWidth,
MessageId::ConfigLabelCalmMode,
MessageId::ConfigLabelLowMotion,
MessageId::ConfigLabelFancyAnimations,
MessageId::ConfigLabelLaunchScreen,
MessageId::ConfigLabelShowThinking,
MessageId::ConfigLabelThinkingHighlight,
MessageId::ConfigLabelShowToolDetails,
MessageId::ConfigLabelInlineDiffs,
MessageId::ConfigLabelStatusIndicator,
MessageId::ConfigLabelSynchronizedOutput,
MessageId::ConfigLabelCostCurrency,
MessageId::ConfigLabelTranscriptSpacing,
MessageId::ConfigLabelToolCollapse,
MessageId::ConfigLabelComposerDensity,
MessageId::ConfigLabelComposerBorder,
MessageId::ConfigLabelComposerMultilineMode,
MessageId::ConfigLabelComposerVimMode,
MessageId::ConfigLabelBracketedPaste,
MessageId::ConfigLabelPasteBurstDetection,
MessageId::ConfigLabelMentionMenuLimit,
MessageId::ConfigLabelMentionMenuBehavior,
MessageId::ConfigLabelMentionWalkDepth,
MessageId::ConfigLabelWorkspaceFollowSymlinks,
MessageId::ConfigLabelSidebarWidth,
MessageId::ConfigLabelSidebarFocus,
MessageId::ConfigLabelContextPanel,
MessageId::ConfigLabelSessionsRail,
MessageId::ConfigLabelSessionAutoResume,
MessageId::ConfigLabelAutoCompact,
MessageId::ConfigLabelAutoCompactThreshold,
MessageId::ConfigLabelMaxHistory,
MessageId::ConfigLabelMcpConfigPath,
MessageId::ConfigLabelFleetSpawnDepth,
MessageId::ConfigLabelGoalCommand,
MessageId::ConfigLabelWorkflow,
MessageId::ConfigLabelFeaturePrefix,
MessageId::ConfigColumnSetting,
MessageId::ConfigColumnValue,
MessageId::ConfigColumnScope,
MessageId::ConfigActionOpenProvider,
MessageId::ConfigActionOpenModel,
MessageId::ConfigActionToggle,
MessageId::ConfigActionChoose,
MessageId::ConfigActionEdit,
MessageId::ConfigActionReadOnly,
MessageId::ModelPickerAutoNetworkHint,
MessageId::ModelPickerAutoNetworkActiveProviderHint,
MessageId::ModelPickerAutoLocalHint,
MessageId::ModelPickerAutoLastRoute,
MessageId::AutoRouteSelectedToast,
MessageId::CloudCodeSystemPromptUnsupported,
MessageId::HelpTitle,
MessageId::HelpSubtitle,
MessageId::HelpFilterPlaceholder,
MessageId::HelpFilterPrefix,
MessageId::HelpNoMatches,
MessageId::HelpSlashCommands,
MessageId::HelpKeybindings,
MessageId::HelpUserCommands,
MessageId::HelpSkills,
MessageId::HelpFooterTypeFilter,
MessageId::HelpFooterMove,
MessageId::HelpFooterJump,
MessageId::HelpFooterClose,
MessageId::CmdAnchorDescription,
MessageId::CmdAttachDescription,
MessageId::CmdBalanceDescription,
MessageId::CmdCacheDescription,
MessageId::CmdPreviewRequestDescription,
MessageId::CmdToolsDescription,
MessageId::CmdEffortDescription,
MessageId::CmdTurnInspectDescription,
MessageId::CmdClearDescription,
MessageId::CmdCompactDescription,
MessageId::CmdPurgeDescription,
MessageId::CmdConfigDescription,
MessageId::CmdPermissionsDescription,
MessageId::PermissionsListHeader,
MessageId::PermissionsNoRules,
MessageId::PermissionsFileMissing,
MessageId::PermissionsFileEmpty,
MessageId::PermissionsFilePresent,
MessageId::PermissionsRuleEntry,
MessageId::PermissionsMatchExactCommand,
MessageId::PermissionsMatchCommandPrefix,
MessageId::PermissionsMatchExactPath,
MessageId::PermissionsMatchAnyInvocation,
MessageId::PermissionsScopeGlobal,
MessageId::PermissionsScopeRepo,
MessageId::PermissionsAppliesHere,
MessageId::PermissionsInactiveHere,
MessageId::PermissionsRemovePreview,
MessageId::PermissionsRemoved,
MessageId::PermissionsUsage,
MessageId::PermissionsRuleNotFound,
MessageId::AutoReviewReceiptGuardianAllowed,
MessageId::AutoReviewReceiptGuardianDenied,
MessageId::AutoReviewReceiptGuardianUnavailable,
MessageId::AutoReviewReceiptDeterministicBlocked,
MessageId::AutoReviewReceiptHeld,
MessageId::FooterHintEscInterrupt,
MessageId::PermissionsPostureHeader,
MessageId::PermissionsPostureAsk,
MessageId::PermissionsPostureAuto,
MessageId::PermissionsPostureBypass,
MessageId::PermissionsPostureNever,
MessageId::PermissionsReceiptsNote,
MessageId::PermissionsOperationFailed,
MessageId::CmdAuthDescription,
MessageId::CmdConstitutionDescription,
MessageId::CmdContextDescription,
MessageId::CmdCostDescription,
MessageId::CmdDiffDescription,
MessageId::CmdEditDescription,
MessageId::CmdExitDescription,
MessageId::CmdExportDescription,
MessageId::CmdFeedbackDescription,
MessageId::CmdForkDescription,
MessageId::CmdTreeDescription,
MessageId::CmdBranchDescription,
MessageId::CmdResumeDescription,
MessageId::CmdGoalDescription,
MessageId::GoalReceiptSet,
MessageId::GoalStatusIdleHint,
MessageId::CmdThemeDescription,
MessageId::CmdHfDescription,
MessageId::CmdHelpDescription,
MessageId::CmdProfileDescription,
MessageId::CmdHomeDescription,
MessageId::CmdHooksDescription,
MessageId::CmdAgentDescription,
MessageId::CmdInitDescription,
MessageId::CmdJobsDescription,
MessageId::CmdLinksDescription,
MessageId::CmdLoadDescription,
MessageId::CmdLogoutDescription,
MessageId::CmdMcpDescription,
MessageId::McpRecommendedUnknownId,
MessageId::McpRecommendationsSafety,
MessageId::McpRecommendationGithub,
MessageId::McpRecommendationChrome,
MessageId::CmdPluginDescription,
MessageId::PluginKimiUsage,
MessageId::PluginKimiManagedRootHeading,
MessageId::PluginKimiNoneFound,
MessageId::PluginKimiLicenseUnspecified,
MessageId::PluginKimiApplicable,
MessageId::PluginKimiNotApplicable,
MessageId::PluginKimiCandidateSummary,
MessageId::PluginKimiCandidateDetails,
MessageId::PluginKimiRejectedHeading,
MessageId::PluginKimiInspectionFooter,
MessageId::PluginKimiCandidateMissing,
MessageId::PluginKimiCandidateChanged,
MessageId::PluginKimiHomeMissing,
MessageId::PluginKimiRootInspectFailed,
MessageId::PluginKimiRootMustBeDirectory,
MessageId::PluginKimiRootCanonicalizeFailed,
MessageId::PluginKimiRootListFailed,
MessageId::PluginKimiEntryReadFailed,
MessageId::PluginKimiEntryLimit,
MessageId::PluginKimiEntryInspectFailed,
MessageId::PluginKimiEntryLinksRefused,
MessageId::PluginKimiEntryOutsideRoot,
MessageId::PluginKimiEntryCanonicalizeFailed,
MessageId::PluginKimiManifestUnreadable,
MessageId::PluginKimiManifestMustBeFile,
MessageId::PluginKimiManifestInvalid,
MessageId::PluginKimiDirectoryNameMismatch,
MessageId::PluginKimiHashUnavailable,
MessageId::PluginKimiRollbackDestinationMissing,
MessageId::PluginKimiMismatchRemoved,
MessageId::PluginKimiMismatchRollbackFailed,
MessageId::PluginKimiUserPluginDirectory,
MessageId::PluginKimiMarketplaceZipUnsupported,
MessageId::PluginKimiMarketplaceRemoteUnsupported,
MessageId::PluginKimiMarketplaceGzipTarball,
MessageId::CmdPluginBundleUsage,
MessageId::CmdPluginBundleNoneFound,
MessageId::CmdPluginBundleListHeader,
MessageId::CmdPluginLegacyListHeader,
MessageId::CmdPluginBundleNotFound,
MessageId::CmdPluginBundleReloaded,
MessageId::CmdPluginBundleDetail,
MessageId::CmdPluginBundleDiagnosticsHeader,
MessageId::CmdPluginBundleMutationSuccess,
MessageId::CmdPluginActionFailed,
MessageId::CmdPluginNoneFound,
MessageId::CmdPluginNotFound,
MessageId::CmdPluginListHeader,
MessageId::CmdPluginDetailDescription,
MessageId::CmdPluginDetailSchema,
MessageId::CmdPluginDetailApproval,
MessageId::CmdPluginDetailPath,
MessageId::CmdMemoryDescription,
MessageId::CmdModeDescription,
MessageId::CmdModelDescription,
MessageId::CmdModelsDescription,
MessageId::CmdModelDbDescription,
MessageId::CmdNetworkDescription,
MessageId::CmdUpdateDescription,
MessageId::CmdNoteDescription,
MessageId::CmdProviderDescription,
MessageId::CmdQueueDescription,
MessageId::CmdQueueUsage,
MessageId::CmdQueueDraftHeader,
MessageId::CmdQueueNoMessages,
MessageId::CmdQueueListHeader,
MessageId::CmdQueueTip,
MessageId::CmdQueueAlreadyEditing,
MessageId::CmdQueueNotFound,
MessageId::CmdQueueEditingStatus,
MessageId::CmdQueueEditingMessage,
MessageId::CmdQueueDropped,
MessageId::CmdQueueAlreadyEmpty,
MessageId::CmdQueueCleared,
MessageId::CmdQueueMissingIndex,
MessageId::CmdQueueIndexPositive,
MessageId::CmdQueueIndexMin,
MessageId::CmdRelayDescription,
MessageId::CmdRemoteControlDescription,
MessageId::CmdRemoteEnvDescription,
MessageId::CmdRemoteEnvOverview,
MessageId::CmdRemoteEnvOpening,
MessageId::CmdRemoteEnvUnavailable,
MessageId::CmdRemoteEnvSourceCustodyPolicy,
MessageId::CmdRemoteEnvBrowserLabel,
MessageId::CmdRenameDescription,
MessageId::CmdTitleDescription,
MessageId::CmdRestoreDescription,
MessageId::CmdRetryDescription,
MessageId::CmdReviewDescription,
MessageId::CmdRlmDescription,
MessageId::CmdSaveDescription,
MessageId::CmdNewDescription,
MessageId::CmdSessionsDescription,
MessageId::CmdSettingsDescription,
MessageId::CmdSidebarDescription,
MessageId::CmdSkillDescription,
MessageId::CmdSkillsDescription,
MessageId::CmdStashDescription,
MessageId::CmdStatusDescription,
MessageId::CmdStatuslineDescription,
MessageId::CmdStructcopyDescription,
MessageId::CmdStructcopyKindTurn,
MessageId::CmdStructcopyKindTool,
MessageId::CmdStructcopyKindPlan,
MessageId::CmdStructcopyKindWorkflow,
MessageId::CmdStructcopyUsageError,
MessageId::CmdStructcopyUnavailable,
MessageId::CmdStructcopyBusy,
MessageId::CmdStructcopyPrepareFailed,
MessageId::CmdStructcopyClipboardQueued,
MessageId::CmdStructcopyClipboardAccepted,
MessageId::CmdStructcopyClipboardFailed,
MessageId::CmdStructcopyReceiptTooLarge,
MessageId::CmdFleetDescription,
MessageId::CmdLaneDescription,
MessageId::CmdWorkflowDescription,
MessageId::CmdHotbarDescription,
MessageId::CmdSetupDescription,
MessageId::CmdSubagentsDescription,
MessageId::CmdAdvisorDescription,
MessageId::CmdSystemDescription,
MessageId::CmdAutomationDescription,
MessageId::CmdTaskDescription,
MessageId::CmdTokensDescription,
MessageId::CmdTranslateDescription,
MessageId::CmdTranslateOff,
MessageId::CmdTranslateOn,
MessageId::TranslationInProgress,
MessageId::TranslationComplete,
MessageId::TranslationFailed,
MessageId::CmdTrustDescription,
MessageId::CmdLspDescription,
MessageId::CmdShareDescription,
MessageId::CmdWorkspaceDescription,
MessageId::CmdUndoDescription,
MessageId::CmdVerboseDescription,
MessageId::CmdCacheAdvice,
MessageId::CmdCacheFootnote,
MessageId::CmdCacheHeader,
MessageId::CmdCacheNoData,
MessageId::CmdCacheTotals,
MessageId::CmdChangeDescription,
MessageId::CmdChangeHeader,
MessageId::CmdChangeTranslationQueued,
MessageId::CmdChangeTranslationUnavailable,
MessageId::CmdChangePreviousVersion,
MessageId::CmdCostReport,
MessageId::CmdCostReportSubtotal,
MessageId::CmdCostReportUnknown,
MessageId::CmdCostUnknownValue,
MessageId::CmdCostEstimateOnly,
MessageId::CmdCostCoverage,
MessageId::CmdCostCoverageUnknownLegacy,
MessageId::CmdCostUnpricedTurns,
MessageId::CmdCostUnpricedClasses,
MessageId::CmdCostPricingProvenance,
MessageId::CmdCostLivePricingDowngraded,
MessageId::CmdCostLivePricingUnavailable,
MessageId::CmdCostRoutesHeader,
MessageId::CmdTokensCacheWriteTotal,
MessageId::CmdTokensCacheBoth,
MessageId::CmdTokensCacheHitOnly,
MessageId::CmdTokensCacheMissOnly,
MessageId::CmdTokensContextUnknownWindow,
MessageId::CmdTokensContextWithWindow,
MessageId::CmdTokensNotReported,
MessageId::CmdTokensReport,
MessageId::FooterAgentSingular,
MessageId::FooterAgentsPlural,
MessageId::HeaderAgentsChip,
MessageId::FooterPressCtrlCAgain,
MessageId::FooterWorking,
MessageId::FooterBalancePrefix,
MessageId::HelpSectionActions,
MessageId::HelpSectionClipboard,
MessageId::HelpSectionEditing,
MessageId::HelpSectionHelp,
MessageId::HelpSectionModes,
MessageId::HelpSectionNavigation,
MessageId::HelpSectionSessions,
MessageId::KbScrollTranscript,
MessageId::KbNavigateHistory,
MessageId::KbScrollTranscriptAlt,
MessageId::KbBrowseHistory,
MessageId::KbScrollPage,
MessageId::KbJumpTopBottom,
MessageId::KbJumpTopBottomEmpty,
MessageId::KbJumpToolBlocks,
MessageId::KbMoveCursor,
MessageId::KbJumpLineStartEnd,
MessageId::KbDeleteChar,
MessageId::KbDeleteWord,
MessageId::KbYank,
MessageId::KbToggleFileTree,
MessageId::KbSelectText,
MessageId::KbSelectAllDraft,
MessageId::KbClearDraft,
MessageId::KbRestoreClearedDraft,
MessageId::KbStashDraft,
MessageId::KbSearchHistory,
MessageId::KbInsertNewline,
MessageId::KbSendDraft,
MessageId::KbSteerCurrentTurn,
MessageId::KbCloseMenu,
MessageId::KbCancelOrExit,
MessageId::KbShellControls,
MessageId::KbExitEmpty,
MessageId::KbCommandPalette,
MessageId::KbSettings,
MessageId::KbCancelBackgroundShellJobs,
MessageId::KbFuzzyFilePicker,
MessageId::KbCompactInspector,
MessageId::KbCompactContext,
MessageId::KbLastMessagePager,
MessageId::KbSelectedDetails,
MessageId::KbToolDetailsPager,
MessageId::KbReasoningDetail,
MessageId::KbTurnInspector,
MessageId::KbExternalEditor,
MessageId::KbLiveTranscript,
MessageId::KbBacktrackMessage,
MessageId::KbCompleteCycleModes,
MessageId::KbCycleThinking,
MessageId::KbCyclePermissions,
MessageId::KbJumpPlanAgentYolo,
MessageId::KbAltJumpPlanAgentYolo,
MessageId::KbFocusSidebar,
MessageId::KbSessionPicker,
MessageId::KbTerminalPaste,
MessageId::KbPasteAttach,
MessageId::KbCopySelection,
MessageId::ClipboardSshPasteHint,
MessageId::KbContextMenu,
MessageId::KbAttachPath,
MessageId::KbHelpOverlay,
MessageId::KbToggleHelp,
MessageId::KbToggleHelpSlash,
MessageId::HelpUsageLabel,
MessageId::HelpAliasesLabel,
MessageId::SettingsTitle,
MessageId::SettingsConfigFile,
MessageId::ClearConversation,
MessageId::ClearConversationBusy,
MessageId::ModelChanged,
MessageId::LinksProjectTitle,
MessageId::LinksDocumentation,
MessageId::LinksCommunity,
MessageId::LinksGitHub,
MessageId::LinksManagedApp,
MessageId::LinksManagedAppNote,
MessageId::LinksTitle,
MessageId::LinksDashboard,
MessageId::LinksDocs,
MessageId::LinksKimiCodeRouteNote,
MessageId::LinksTip,
MessageId::SubagentsFetching,
MessageId::HelpUnknownCommand,
MessageId::HomeDashboardTitle,
MessageId::HomeModel,
MessageId::HomeMode,
MessageId::HomeWorkspace,
MessageId::HomeHistory,
MessageId::HomeTokens,
MessageId::HomeQueued,
MessageId::HomeSubagents,
MessageId::HomeSkill,
MessageId::HomeQuickActions,
MessageId::HomeQuickLinks,
MessageId::HomeQuickSkills,
MessageId::HomeQuickConfig,
MessageId::HomeQuickSettings,
MessageId::HomeQuickModel,
MessageId::HomeQuickSubagents,
MessageId::HomeQuickTaskList,
MessageId::HomeQuickHelp,
MessageId::HomeModeTips,
MessageId::HomeAgentModeTip,
MessageId::HomeAgentModeReviewTip,
MessageId::HomeAgentModeYoloTip,
MessageId::HomeYoloModeTip,
MessageId::HomeYoloModeCaution,
MessageId::HomePlanModeTip,
MessageId::HomePlanModeChecklistTip,
MessageId::HomeOperateModeTip,
MessageId::HomeOperateModeFleetTip,
MessageId::HomeGoalModeTip,
MessageId::OnboardWelcomeVersion,
MessageId::OnboardWelcomeLead,
MessageId::OnboardWelcomeSetupBlurb,
MessageId::OnboardWelcomeSteps,
MessageId::OnboardWelcomeStepLanguage,
MessageId::OnboardWelcomeStepAppearance,
MessageId::OnboardWelcomeStepApiKey,
MessageId::OnboardWelcomeStepTrust,
MessageId::OnboardWelcomeStepMentalModels,
MessageId::OnboardWelcomeStepTips,
MessageId::OnboardWelcomeDefaults,
MessageId::OnboardWelcomeEnter,
MessageId::OnboardWelcomeExit,
MessageId::OnboardLanguageTitle,
MessageId::OnboardLanguageBlurb,
MessageId::OnboardLanguageFooter,
MessageId::OnboardProviderTitle,
MessageId::OnboardProviderBlurb,
MessageId::OnboardProviderFooter,
MessageId::OnboardApiKeyTitle,
MessageId::OnboardApiKeyStep1,
MessageId::OnboardApiKeyStep2,
MessageId::OnboardApiKeyLocalHint,
MessageId::OnboardApiKeySavedHint,
MessageId::OnboardApiKeyFormatHint,
MessageId::KimiCodePlanApiKeyHint,
MessageId::KimiCodePlanRouteHint,
MessageId::KimiCodePlanNoImportHint,
MessageId::StepfunBillingRouteTitle,
MessageId::StepfunBillingRouteIntro,
MessageId::StepfunBillingRoutePaygOption,
MessageId::StepfunBillingRoutePlanOption,
MessageId::StepfunPlanApiKeyHint,
MessageId::StepfunPlanRouteHint,
MessageId::OnboardApiKeyPlaceholder,
MessageId::OnboardApiKeyLabel,
MessageId::OnboardApiKeyFooter,
MessageId::OnboardApiKeyRejectedEnv,
MessageId::OnboardTrustTitle,
MessageId::OnboardTrustQuestion,
MessageId::OnboardTrustLocationPrefix,
MessageId::OnboardTrustRiskHint,
MessageId::OnboardTrustEffectHint,
MessageId::OnboardTrustFooterPrefix,
MessageId::OnboardTrustFooterMiddle,
MessageId::OnboardTrustFooterUntrustedMiddle,
MessageId::OnboardTrustFooterSuffix,
MessageId::OnboardTrustEnterHint,
MessageId::OnboardTrustUntrustedNotice,
MessageId::OnboardMentalTitle,
MessageId::OnboardMentalModesLabel,
MessageId::OnboardMentalPlanHint,
MessageId::OnboardMentalActHint,
MessageId::OnboardMentalOperateHint,
MessageId::OnboardMentalPermissionLabel,
MessageId::OnboardMentalCurrentLabel,
MessageId::OnboardMentalConstitution,
MessageId::OnboardMentalCycleMode,
MessageId::OnboardMentalCyclePermission,
MessageId::OnboardMentalContinue,
MessageId::OnboardMentalBack,
MessageId::OnboardAppearanceTitle,
MessageId::OnboardAppearanceBlurb,
MessageId::OnboardAppearanceFooter,
MessageId::OnboardOfflineOption,
MessageId::OnboardOfflineNotice,
MessageId::OnboardOfflineTipsLine,
MessageId::OnboardTipsTitle,
MessageId::OnboardTipsLine1,
MessageId::OnboardTipsLine2,
MessageId::OnboardTipsLine3,
MessageId::OnboardTipsLine4,
MessageId::OnboardTipsDoctorPrefix,
MessageId::OnboardTipsDoctorSuffix,
MessageId::OnboardTipsFooterEnter,
MessageId::OnboardTipsFooterAction,
MessageId::SetupWizardTitle,
MessageId::SetupWizardWhy,
MessageId::SetupWizardProgress,
MessageId::SetupActionBack,
MessageId::SetupActionContinue,
MessageId::SetupActionSkip,
MessageId::SetupActionRetry,
MessageId::SetupActionScrollBody,
MessageId::SetupActionGuided,
MessageId::SetupActionTuneGuided,
MessageId::SetupActionModelDraft,
MessageId::SetupActionFreeform,
MessageId::SetupActionKeepExisting,
MessageId::SetupActionProvider,
MessageId::SetupActionModel,
MessageId::SetupActionFleet,
MessageId::SetupActionHotbar,
MessageId::SetupActionRemote,
MessageId::SetupActionMode,
MessageId::SetupActionConfig,
MessageId::SetupActionRuntimePreset,
MessageId::SetupActionApplyRuntimePreset,
MessageId::SetupActionUseBundled,
MessageId::SetupActionDefer,
MessageId::SetupActionCancel,
MessageId::SetupStatusNotStarted,
MessageId::SetupStatusRecommended,
MessageId::SetupStatusOptional,
MessageId::SetupStatusDeferred,
MessageId::SetupStatusInProgress,
MessageId::SetupStatusNeedsAction,
MessageId::SetupStatusVerified,
MessageId::SetupStatusSkipped,
MessageId::SetupStatusFailed,
MessageId::SetupStepLanguageTitle,
MessageId::SetupStepLanguageWhy,
MessageId::SetupStepProviderModelTitle,
MessageId::SetupStepProviderModelWhy,
MessageId::SetupStepTrustSandboxTitle,
MessageId::SetupStepTrustSandboxWhy,
MessageId::SetupStepOperateFleetTitle,
MessageId::SetupStepOperateFleetWhy,
MessageId::SetupStepToolsMcpTitle,
MessageId::SetupStepToolsMcpWhy,
MessageId::SetupStepHotbarTitle,
MessageId::SetupStepHotbarWhy,
MessageId::SetupStepRemoteRuntimeTitle,
MessageId::SetupStepRemoteRuntimeWhy,
MessageId::SetupStepPersistenceTitle,
MessageId::SetupStepPersistenceWhy,
MessageId::SetupStepConstitutionTitle,
MessageId::SetupStepConstitutionWhy,
MessageId::SetupStepVerificationTitle,
MessageId::SetupStepVerificationWhy,
MessageId::SetupCheckpointLayerOrder,
MessageId::SetupCheckpointDoneBundled,
MessageId::SetupCheckpointDoneGuided,
MessageId::SetupCheckpointDoneKept,
MessageId::SetupCheckpointDeferred,
MessageId::SetupStepSkipped,
MessageId::SetupStepRetryRecorded,
MessageId::SetupLanguageReviewed,
MessageId::SetupConstitutionChoiceLabel,
MessageId::SetupConstitutionSourceLabel,
MessageId::SetupConstitutionValidityLabel,
MessageId::SetupConstitutionPreviewLabel,
MessageId::SetupConstitutionExistingLabel,
MessageId::SetupConstitutionExpertOverrideLabel,
MessageId::SetupConstitutionGuidedHint,
MessageId::SetupConstitutionGuidedAnswersHint,
MessageId::SetupConstitutionPurposeLabel,
MessageId::SetupConstitutionAutonomyLabel,
MessageId::SetupConstitutionEvidenceLabel,
MessageId::SetupConstitutionCommunicationLabel,
MessageId::SetupConstitutionPrivacyLabel,
MessageId::SetupConstitutionPrinciplesLabel,
MessageId::SetupCardRouteLabel,
MessageId::SetupCardModelLabel,
MessageId::SetupCardAuthLabel,
MessageId::SetupCardHealthLabel,
MessageId::SetupCardIntentLabel,
MessageId::SetupCardApprovalLabel,
MessageId::SetupCardShellLabel,
MessageId::SetupCardTrustLabel,
MessageId::SetupCardSandboxLabel,
MessageId::SetupCardNetworkLabel,
MessageId::SetupOperateRuntimeLabel,
MessageId::SetupOperateRosterLabel,
MessageId::SetupOperateConcurrencyLabel,
MessageId::SetupOperateReadinessLabel,
MessageId::SetupOperateReviewHint,
MessageId::SetupOperateReviewed,
MessageId::SetupOperateNeedsActionSaved,
MessageId::SetupHotbarBindingsLabel,
MessageId::SetupHotbarActionsLabel,
MessageId::SetupHotbarReviewHint,
MessageId::SetupHotbarReviewed,
MessageId::SetupToolsMcpServersLabel,
MessageId::SetupToolsMcpSkillsLabel,
MessageId::SetupToolsMcpToolsLabel,
MessageId::SetupToolsMcpPluginsLabel,
MessageId::SetupToolsMcpHotbarLabel,
MessageId::SetupToolsMcpReviewHint,
MessageId::SetupToolsMcpReviewed,
MessageId::SetupToolsMcpNeedsActionSaved,
MessageId::SetupToolsMcpPreviewTitle,
MessageId::SetupToolsMcpOnRampText,
MessageId::SetupToolsMcpDshLabel,
MessageId::SetupToolsMcpDshRow,
MessageId::SetupRemoteCloudsLabel,
MessageId::SetupRemoteBridgesLabel,
MessageId::SetupRemoteProvidersLabel,
MessageId::SetupRemoteModeLabel,
MessageId::SetupRemoteModeLocalOnly,
MessageId::SetupRemoteModeRuntimeApi,
MessageId::SetupRemoteModeMobileLan,
MessageId::SetupRemoteModeChatBridge,
MessageId::SetupRemoteStatusDisabled,
MessageId::SetupRemoteStatusReady,
MessageId::SetupRemoteStatusNeedsAction,
MessageId::SetupRemoteReviewHint,
MessageId::SetupRemotePreviewTitle,
MessageId::SetupRemoteReviewed,
MessageId::SetupPersistenceHomeLabel,
MessageId::SetupPersistenceConfigLabel,
MessageId::SetupPersistenceStateLabel,
MessageId::SetupPersistenceConstitutionLabel,
MessageId::SetupPersistenceMemoryLabel,
MessageId::SetupPersistenceNotesLabel,
MessageId::SetupPersistenceReviewHint,
MessageId::SetupPersistenceReviewed,
MessageId::SetupProviderModelReadyHint,
MessageId::SetupProviderModelNeedsActionHint,
MessageId::SetupProviderModelReviewed,
MessageId::SetupProviderModelNeedsActionSaved,
MessageId::SetupRuntimePostureBoundary,
MessageId::SetupRuntimePostureReviewHint,
MessageId::SetupRuntimePostureReviewed,
MessageId::SetupRuntimePresetSelectedLabel,
MessageId::SetupRuntimePresetDiffLabel,
MessageId::SetupRuntimePresetAskFirstTitle,
MessageId::SetupRuntimePresetAskFirstDescription,
MessageId::SetupRuntimePresetNormalAgentTitle,
MessageId::SetupRuntimePresetNormalAgentDescription,
MessageId::SetupRuntimePresetHighTrustTitle,
MessageId::SetupRuntimePresetHighTrustDescription,
MessageId::SetupRuntimePresetPreviewTitle,
MessageId::SetupRuntimePresetSafetyFloor,
MessageId::SetupRuntimePresetApplyHint,
MessageId::SetupRuntimePresetApplied,
MessageId::SetupRuntimeProjectOverrideLabel,
MessageId::SetupRuntimeProjectOverrideNone,
MessageId::SetupReportFirstRunLabel,
MessageId::SetupReportUpdateLabel,
MessageId::SetupReportOperateLabel,
MessageId::SetupReportSourceLabel,
MessageId::SetupReportAutonomyLabel,
MessageId::SetupReportRuntimePostureLabel,
MessageId::SetupReportPersisted,
MessageId::SetupReportInherited,
MessageId::SetupReportReady,
MessageId::SetupReportRequired,
MessageId::SetupReportOptional,
MessageId::SetupReportRowsLabel,
MessageId::SetupReportNextActionLabel,
MessageId::SetupReportNextActionNone,
MessageId::SetupReportNextActionConstitution,
MessageId::SetupReportNextActionProvider,
MessageId::SetupReportNextActionRuntime,
MessageId::SetupReportNextActionOperate,
MessageId::SetupReportNextActionRequired,
MessageId::SetupReportRecorded,
MessageId::CtxMenuTitle,
MessageId::CtxMenuCopySelection,
MessageId::CtxMenuCopySelectionDesc,
MessageId::CtxMenuOpenSelection,
MessageId::CtxMenuOpenSelectionDesc,
MessageId::CtxMenuClearSelection,
MessageId::CtxMenuOpenDetails,
MessageId::CtxMenuCopyMessage,
MessageId::CtxMenuCopyMessageDesc,
MessageId::CtxMenuOpenInEditor,
MessageId::CtxMenuOpenInEditorDesc,
MessageId::CtxMenuShowCell,
MessageId::CtxMenuShowCellDesc,
MessageId::CtxMenuHideCell,
MessageId::CtxMenuHideCellDesc,
MessageId::CtxMenuShowHidden,
MessageId::CtxMenuShowHiddenDesc,
MessageId::CtxMenuPaste,
MessageId::CtxMenuPasteDesc,
MessageId::CtxMenuCmdPalette,
MessageId::CtxMenuCmdPaletteDesc,
MessageId::CtxMenuContextInspector,
MessageId::CtxMenuContextInspectorDesc,
MessageId::CtxMenuHelp,
MessageId::CtxMenuHelpDesc,
MessageId::CtxMenuWindowPin,
MessageId::CtxMenuWindowUnpin,
MessageId::CtxMenuWindowPinDesc,
MessageId::CmdPinDescription,
MessageId::WindowPinActive,
MessageId::WindowPinReleased,
MessageId::FanoutCounts,
MessageId::AppModeAgent,
MessageId::AppModeAuto,
MessageId::AppModeYolo,
MessageId::AppModePlan,
MessageId::AppModeOperate,
MessageId::AppModeAgentHint,
MessageId::AppModeAutoHint,
MessageId::AppModePlanHint,
MessageId::AppModeYoloHint,
MessageId::AppModeOperateHint,
MessageId::VimModeNormal,
MessageId::VimModeInsert,
MessageId::VimModeVisual,
MessageId::ApprovalRiskReview,
MessageId::ApprovalRiskElevated,
MessageId::ApprovalRiskDestructive,
MessageId::ApprovalCategorySafe,
MessageId::ApprovalCategoryFileWrite,
MessageId::ApprovalCategoryShell,
MessageId::ApprovalCategoryNetwork,
MessageId::ApprovalCategoryMcpRead,
MessageId::ApprovalCategoryMcpAction,
MessageId::ApprovalCategoryAgent,
MessageId::ApprovalCategoryUnknown,
MessageId::ApprovalFieldType,
MessageId::ApprovalFieldAbout,
MessageId::ApprovalFieldImpact,
MessageId::ApprovalFieldParams,
MessageId::ApprovalOptionApproveOnce,
MessageId::ApprovalOptionApproveAlways,
MessageId::ApprovalOptionAllowExactRepo,
MessageId::ApprovalSaveAskRuleHint,
MessageId::ApprovalOptionDeny,
MessageId::ApprovalOptionAbortTurn,
MessageId::ApprovalBlockTitle,
MessageId::ApprovalControlsHint,
MessageId::ApprovalTruncationHint,
MessageId::ApprovalFullAccessPolicyBlocked,
MessageId::AutoReviewQuestionSkipped,
MessageId::ApprovalChooseHint,
MessageId::ApprovalChooseAction,
MessageId::ApprovalIntentLabel,
MessageId::ApprovalMoreLines,
MessageId::ApprovalAutoDeniedSession,
MessageId::ElevationTitleSandboxDenied,
MessageId::ElevationTitleRequired,
MessageId::ElevationFieldTool,
MessageId::ElevationFieldCmd,
MessageId::ElevationFieldReason,
MessageId::ElevationImpactHeader,
MessageId::ElevationImpactNetwork,
MessageId::ElevationImpactWrite,
MessageId::ElevationImpactFullAccess,
MessageId::ElevationPromptProceed,
MessageId::ElevationOptionNetwork,
MessageId::ElevationOptionWrite,
MessageId::ElevationOptionFullAccess,
MessageId::ElevationOptionAbort,
MessageId::ElevationOptionNetworkDesc,
MessageId::ElevationOptionWriteDesc,
MessageId::ElevationOptionFullAccessDesc,
MessageId::ElevationOptionAbortDesc,
MessageId::ContextAutoCompacting,
MessageId::ContextManualCompacting,
MessageId::ContextCompactionQueued,
MessageId::ContextCompactionAlreadyRunning,
MessageId::ContextCompactionQueueFull,
MessageId::ContextCompactionQueueClosed,
MessageId::ContextCompactionRouteInvalid,
MessageId::CtxInspTitle,
MessageId::CtxInspSessionContext,
MessageId::CtxInspSystemPrompt,
MessageId::CtxInspReferences,
MessageId::CtxInspRecentTools,
MessageId::CtxInspModel,
MessageId::CtxInspWorkspace,
MessageId::CtxInspSession,
MessageId::CtxInspContext,
MessageId::CtxInspTranscript,
MessageId::CtxInspWorkspaceStatus,
MessageId::CtxInspNotSampledYet,
MessageId::CtxInspOk,
MessageId::CtxInspHigh,
MessageId::CtxInspCritical,
MessageId::CtxInspIncluded,
MessageId::CtxInspAttached,
MessageId::CtxInspNotIncluded,
MessageId::CtxInspOutputCaptured,
MessageId::CtxInspNoOutputYet,
MessageId::CtxInspNoSystemPrompt,
MessageId::CtxInspNoReferences,
MessageId::CtxInspNoToolActivity,
MessageId::CtxInspVHint,
MessageId::CtxInspCells,
MessageId::CtxInspApiMessages,
MessageId::CtxInspActive,
MessageId::CtxInspCell,
MessageId::CtxInspMoreReferences,
MessageId::CtxInspStablePrefix,
MessageId::CtxInspVolatileWorkingSet,
MessageId::CtxInspFirstLine,
MessageId::CtxInspTotal,
MessageId::CtxInspTextPromptLayers,
MessageId::CtxInspSingleTextBlob,
MessageId::CtxInspBlocks,
MessageId::CtxInspBlock,
MessageId::CtxInspTokens,
MessageId::CtxInspLayers,
MessageId::CtxInspNone,
MessageId::CtxInspEmpty,
MessageId::CtxInspCacheFriendly,
MessageId::CtxInspChangesByTurn,
MessageId::CtxInspStablePrefixOnly,
MessageId::CtxInspCacheTip,
MessageId::ToolFamilyRead,
MessageId::ToolFamilyPatch,
MessageId::ToolFamilyRun,
MessageId::ToolFamilyFind,
MessageId::ToolFamilyDelegate,
MessageId::ToolFamilyFanout,
MessageId::ToolFamilyRlm,
MessageId::ToolFamilyVerify,
MessageId::ToolFamilyThink,
MessageId::ToolFamilyGeneric,
MessageId::CmdVoiceDescription,
MessageId::CmdVoiceSendDescription,
MessageId::CmdVoiceControlDescription,
MessageId::VoiceEnabled,
MessageId::VoiceDisabled,
MessageId::VoiceSendEnabled,
MessageId::VoiceSendDisabled,
MessageId::VoiceControlEnabled,
MessageId::VoiceControlDisabled,
MessageId::VoiceErrNoAuth,
MessageId::VoiceErrNoRecorder,
MessageId::VoiceErrNetwork,
MessageId::VoiceErrEmptySend,
MessageId::VoiceErrTooShort,
MessageId::VoiceRecording,
MessageId::VoiceProcessing,
MessageId::VoiceTranscribed,
MessageId::NotificationTurnComplete,
MessageId::NotificationSubagentComplete,
MessageId::NotificationSubagentFailed,
MessageId::NotificationSubagentInterrupted,
MessageId::NotificationSubagentCancelled,
MessageId::NotificationSubagentBudgetExhausted,
MessageId::FooterWorkedChip,
MessageId::FleetDraftTitle,
MessageId::FleetDraftHeader,
MessageId::SetupRemoteOnRampText,
MessageId::ApprovalDescSafe,
MessageId::ApprovalDescFileWrite,
MessageId::ApprovalDescShell,
MessageId::ApprovalDescNetwork,
MessageId::ApprovalDescMcpRead,
MessageId::ApprovalDescMcpAction,
MessageId::ApprovalDescAgent,
MessageId::ApprovalDescUnknown,
MessageId::ApprovalImpactSafe,
MessageId::ApprovalImpactFileWrite,
MessageId::ApprovalImpactShell,
MessageId::ApprovalImpactNetwork,
MessageId::ApprovalImpactMcpRead,
MessageId::ApprovalImpactMcpAction,
MessageId::ApprovalImpactAgent,
MessageId::ApprovalImpactUnknown,
MessageId::ApprovalLabelCommand,
MessageId::ApprovalLabelDir,
MessageId::ApprovalLabelFile,
MessageId::ApprovalLabelPreview,
MessageId::ApprovalLabelProposedContent,
MessageId::ApprovalLabelReplaceThis,
MessageId::ApprovalLabelWithThis,
MessageId::ApprovalLabelReplacementContent,
MessageId::ApprovalLabelPath,
MessageId::ApprovalLabelTarget,
MessageId::ApprovalLabelInput,
MessageId::ApprovalLabelAction,
MessageId::ApprovalLabelType,
MessageId::ApprovalLabelPrompt,
MessageId::ApprovalLabelAbout,
MessageId::ApprovalLabelImpact,
MessageId::SetupConstitutionFileNotChecked,
MessageId::SetupConstitutionFileMissing,
MessageId::SetupConstitutionFileLoadedSelected,
MessageId::SetupConstitutionFileLoadedInactive,
MessageId::SetupConstitutionFileLoadedUnselected,
MessageId::SetupConstitutionFileEmpty,
MessageId::SetupConstitutionFileInvalid,
MessageId::SetupConstitutionFileUnreadable,
MessageId::SetupConstitutionFilePathError,
MessageId::SetupExpertOverrideNotChecked,
MessageId::SetupExpertOverrideMissing,
MessageId::SetupExpertOverrideActive,
MessageId::SetupExpertOverrideDisabled,
MessageId::SetupExpertOverrideEmpty,
MessageId::SetupExpertOverrideUnreadable,
MessageId::SetupExpertOverridePathError,
MessageId::SetupAutonomyUnspecified,
MessageId::SetupGuidedPurposeCoding,
MessageId::SetupGuidedPurposeResearch,
MessageId::SetupGuidedPurposeOperations,
MessageId::SetupGuidedPurposeMixed,
MessageId::SetupGuidedPurposeAboutCoding,
MessageId::SetupGuidedPurposeAboutResearch,
MessageId::SetupGuidedPurposeAboutOperations,
MessageId::SetupGuidedPurposeAboutMixed,
MessageId::SetupGuidedStyleCoding,
MessageId::SetupGuidedStyleResearch,
MessageId::SetupGuidedStyleOperations,
MessageId::SetupGuidedStyleMixed,
MessageId::SetupGuidedEvidenceAssumptions,
MessageId::SetupGuidedEvidenceTestsAndReceipts,
MessageId::SetupGuidedEvidenceReleaseReceipts,
MessageId::SetupGuidedNotes,
MessageId::LaunchMenuNewSession,
MessageId::LaunchMenuNewWorktree,
MessageId::LaunchMenuResumeSession,
MessageId::LaunchMenuChangelog,
MessageId::LaunchMenuQuit,
MessageId::LaunchMenuUnavailable,
MessageId::LaunchMenuSavedCount,
MessageId::LaunchWorktreePrompt,
MessageId::LaunchWorktreeNeedsGit,
MessageId::LaunchWorktreeNameLabel,
MessageId::LaunchHintMove,
MessageId::LaunchHintOpen,
MessageId::LaunchTipFlags,
MessageId::LaunchSavedSessionSingular,
MessageId::LaunchSavedSessionsPlural,
MessageId::LaunchCreatingWorktree,
MessageId::LaunchWorktreeFailed,
MessageId::LaunchNoSavedSessions,
MessageId::PhaseIdle,
MessageId::PhaseDraft,
MessageId::PhaseWorking,
MessageId::PhaseReasoning,
MessageId::PhaseReading,
MessageId::PhaseUsingTool,
MessageId::PhaseVerifying,
MessageId::PhaseWaitingOnYou,
MessageId::PhaseDone,
MessageId::PhaseFailed,
MessageId::PhaseFinishing,
MessageId::ChipModeAct,
MessageId::ChipModePlan,
MessageId::ChipModeOperate,
MessageId::ChipPermissionReadOnly,
MessageId::ChipPermissionAsk,
MessageId::ChipPermissionAuto,
MessageId::ChipPermissionFullAccess,
MessageId::ChipPermissionNever,
MessageId::FooterHintKeys,
MessageId::FooterHintOutput,
MessageId::FooterHintContext,
MessageId::SessionMetricsTurn,
MessageId::SessionMetricsTurns,
MessageId::SessionMetricsStep,
MessageId::SessionMetricsSteps,
MessageId::SessionMetricsLlm,
MessageId::SessionMetricsTools,
MessageId::SessionMetricsTtft,
MessageId::SessionMetricsTokensPerSecond,
MessageId::SessionMetricsCache,
MessageId::SessionMetricsInput,
MessageId::SessionMetricsStatusLine,
MessageId::EmptyStateNoGit,
MessageId::EmptyStateMcpLabel,
MessageId::EmptyStateFleetLabel,
MessageId::EmptyStateFleetSetupLabel,
MessageId::EmptyStateHelpConnector,
MessageId::EmptyStateHelpHint,
MessageId::SessionsSurfaceTitle,
MessageId::SessionsPaneTitle,
MessageId::SessionsHistoryPaneTitle,
MessageId::SessionsActionResume,
MessageId::SessionsActionSearch,
MessageId::SessionsActionSort,
MessageId::SessionsActionRename,
MessageId::SessionsActionAllWorkspaces,
MessageId::SessionsActionDelete,
MessageId::SessionsActionClose,
MessageId::SessionsScopeSortHeader,
MessageId::SessionsEmptyTitle,
MessageId::SessionsEmptyHint,
MessageId::SessionsShowingAllWorkspaces,
MessageId::SessionsScopedToWorkspace,
MessageId::SessionsNewTitlePrompt,
MessageId::SessionsDeletePrompt,
MessageId::SessionsConfirmDelete,
MessageId::SessionsNewSessionTitle,
MessageId::SessionsOpenedHistory,
MessageId::SessionsSortStatus,
MessageId::SessionsSortRecent,
MessageId::SessionsSortName,
MessageId::SessionsSortSize,
MessageId::SessionsSearchPrompt,
MessageId::SessionsDeleteFailed,
MessageId::SessionsDeleted,
MessageId::SessionsNoSelection,
MessageId::SessionsTitleLength,
MessageId::SessionsOpenFailed,
MessageId::SessionsLoadFailed,
MessageId::SessionsRenameFailed,
MessageId::SessionsRenamed,
MessageId::SessionsRailTitle,
MessageId::SessionsRailEmpty,
MessageId::SessionsRailBrowseAll,
MessageId::SessionsRailShowingCount,
MessageId::SessionsRailUnavailable,
MessageId::SessionsActionArchive,
MessageId::SessionsActionShowArchived,
MessageId::SessionsArchived,
MessageId::SessionsRestored,
MessageId::SessionsArchiveFailed,
MessageId::SessionsShowingArchived,
MessageId::SessionsHidingArchived,
MessageId::SessionsArchivedCompact,
MessageId::SessionsNoResults,
MessageId::SessionsDirectoryFailed,
MessageId::SessionsPreviewFailed,
MessageId::SessionsDeleteCancelled,
MessageId::SessionsRenameCancelled,
MessageId::SessionsShowingRange,
MessageId::SessionsMessageCountCompact,
MessageId::SessionsForkCompact,
MessageId::SessionsUnknownMode,
MessageId::SessionsPreviewTitle,
MessageId::SessionsPreviewUpdated,
MessageId::SessionsPreviewMessagesModel,
MessageId::SessionsPreviewMode,
MessageId::SessionsToolCall,
MessageId::SessionsToolError,
MessageId::SessionsToolResult,
MessageId::SessionsServerTool,
MessageId::SessionsImage,
MessageId::SessionsTimeJustNow,
MessageId::SessionsTimeMinutesAgo,
MessageId::SessionsTimeHoursAgo,
MessageId::SessionsTimeDaysAgo,
MessageId::CtxInspRowSystemPrompt,
MessageId::CtxInspRowMessages,
MessageId::CtxInspRowFree,
MessageId::CtxInspFreeTokensDetail,
MessageId::CtxInspDrillTitle,
MessageId::CtxInspSurfaceTitle,
MessageId::CtxInspActionSelect,
MessageId::CtxInspActionDrillDown,
MessageId::CtxInspActionClose,
MessageId::CtxInspUsedTokens,
MessageId::CtxInspAutoCompactAt,
MessageId::CtxInspRowTokens,
MessageId::RouteSurfaceTitle,
MessageId::RouteBrowseCatalog,
MessageId::RouteActionType,
MessageId::RouteActionSearchAnyModel,
MessageId::RoutePanelHeader,
MessageId::RouteProviderLabel,
MessageId::RouteModelFirstAtomic,
MessageId::PickerActionMove,
MessageId::PickerActionSwitch,
MessageId::PickerActionApply,
MessageId::PickerActionSetStartupDefault,
MessageId::PickerActionCancel,
MessageId::PickerActionClear,
MessageId::PickerActionClearSearch,
MessageId::PickerActionBrowseAll,
MessageId::PickerActionCustom,
MessageId::PickerActionJump,
MessageId::PickerActionEditKey,
MessageId::PickerActionModels,
MessageId::PickerActionUnavailable,
MessageId::PickerActionSetKey,
MessageId::PickerActionConfigured,
MessageId::RouteNoModels,
MessageId::RouteNoModelMatch,
MessageId::ProviderNoMatchesTitle,
MessageId::ProviderNoMatchesHint,
MessageId::ProviderNoConfiguredTitle,
MessageId::ProviderNoConfiguredHint,
MessageId::ProviderNoCatalogModels,
MessageId::ProviderExternalActionRevoke,
MessageId::ProviderExternalActionChoices,
MessageId::ProviderExternalActionReuseGrok,
MessageId::ProviderExternalHintCodexReview,
MessageId::ProviderExternalHintXaiReview,
MessageId::ProviderExternalHintXaiApiKey,
MessageId::XaiAuthChoiceTitle,
MessageId::XaiAuthChoiceIntro,
MessageId::XaiAuthChoiceApiKeyOption,
MessageId::XaiAuthChoiceDeviceOAuthOption,
MessageId::ProviderExternalDetailScope,
MessageId::ProviderExternalDormant,
MessageId::ProviderExternalOwnerPath,
MessageId::ProviderExternalPinnedPathWarning,
MessageId::ProviderExternalSemanticsRevoke,
MessageId::ProviderExternalRevoke,
MessageId::ProviderExternalChoiceTitle,
MessageId::ProviderExternalActionChoose,
MessageId::ProviderExternalChoiceIntro,
MessageId::ProviderExternalDisabledLabel,
MessageId::ProviderExternalDisabledDetail,
MessageId::ProviderExternalReadOnlyLabel,
MessageId::ProviderExternalReadOnlyDetail,
MessageId::ProviderExternalReadOnlySemantics,
MessageId::ProviderExternalManagedLabel,
MessageId::ProviderExternalManagedDetail,
MessageId::ProviderExternalConfirmTitle,
MessageId::ProviderExternalActionGrant,
MessageId::ProviderExternalOwnerLabel,
MessageId::ProviderExternalExactPathLabel,
MessageId::ProviderExternalSemanticsLabel,
MessageId::ProviderExternalRejectUnsafe,
MessageId::ProviderExternalRevokeLabel,
MessageId::ProviderExternalGrantedToast,
MessageId::ProviderExternalSaveFailedToast,
MessageId::ProviderExternalRevokedToast,
MessageId::ProviderExternalRevokeFailedToast,
MessageId::ThemeSurfaceTitle,
MessageId::ThemeTreatmentOmbreUnavailable,
MessageId::ThemeTreatmentFlatActive,
MessageId::ThemeTreatmentOmbreActive,
MessageId::FleetRosterHeaderLabel,
MessageId::FleetRosterTabRoster,
MessageId::FleetRosterTabSetup,
MessageId::FleetRosterWorkers,
MessageId::FleetRosterMembersCount,
MessageId::FleetRosterOperatorFirst,
MessageId::FleetRosterOperatorRow,
MessageId::FleetReadyNotice,
MessageId::FleetProfileIdentityVerifyFailed,
MessageId::FleetProfileIdConflict,
MessageId::FleetProfileProviderUnconfigured,
MessageId::FleetDestStepTitle,
MessageId::FleetDestStepSubtitle,
MessageId::FleetDestProjectLabel,
MessageId::FleetDestPersonalLabel,
MessageId::FleetDestProjectSummary,
MessageId::FleetDestPersonalSummary,
MessageId::FleetDestProjectDescription,
MessageId::FleetDestPersonalDescription,
MessageId::FleetDestPathLine,
MessageId::FleetDestUnavailable,
MessageId::FleetDestReasonNoProjectConfig,
MessageId::FleetDestReasonWorkspaceMissing,
MessageId::FleetDestReasonHomeUnavailable,
MessageId::FleetDestWillReplace,
MessageId::FleetDestOverridesProject,
MessageId::FleetDestOverridesPersonal,
MessageId::FleetDestOverridesBuiltIn,
MessageId::FleetSavesToChip,
MessageId::FleetSavesToUndecided,
MessageId::FleetActionSaveProject,
MessageId::FleetActionSavePersonal,
MessageId::FleetActionReplaceProject,
MessageId::FleetActionReplacePersonal,
MessageId::FleetActionConfirmReplace,
MessageId::FleetActionChangeDestination,
MessageId::FleetActionBack,
MessageId::FleetReviewSavesTo,
MessageId::FleetModelRowBlockedNotice,
MessageId::FleetDestProjectDisabledSave,
MessageId::WorkflowStatusWaiting,
MessageId::WorkflowDebrief,
MessageId::WorkflowTranscriptDetails,
MessageId::WorkflowReceiptRole,
MessageId::WorkflowReceiptReasoning,
MessageId::WorkflowReceiptVia,
MessageId::WorkflowReceiptTokens,
MessageId::WorkflowReceiptTools,
MessageId::WorkflowReceiptDuration,
MessageId::WorkflowReceiptUnknown,
MessageId::WorkflowReceiptProviderReported,
MessageId::WorkflowReceiptEstimated,
MessageId::SidebarTasksLabel,
MessageId::SidebarTodoLabel,
MessageId::SidebarStopControl,
MessageId::SidebarDestructiveArmed,
MessageId::WorkSurfaceTodoProgress,
MessageId::WorkSurfaceStopConfirmHint,
MessageId::CoordinationWorkTitle,
MessageId::CoordinationSummaryDecisions,
MessageId::CoordinationSummaryContentions,
MessageId::CoordinationSummaryReconciled,
MessageId::CoordinationSchema,
MessageId::CoordinationSequence,
MessageId::CoordinationPerSectionLimit,
MessageId::CoordinationDecisionsHeading,
MessageId::CoordinationNone,
MessageId::CoordinationNoneValue,
MessageId::CoordinationStatus,
MessageId::CoordinationOwner,
MessageId::CoordinationVersion,
MessageId::CoordinationWriteClaimsHeading,
MessageId::CoordinationIsolated,
MessageId::CoordinationSharedWorkspace,
MessageId::CoordinationPaths,
MessageId::CoordinationContracts,
MessageId::CoordinationContentionsHeading,
MessageId::CoordinationClaimant,
MessageId::CoordinationDisposition,
MessageId::CoordinationNeutralReconciliationHeading,
MessageId::CoordinationCandidates,
MessageId::CoordinationRetry,
MessageId::CoordinationReviewer,
MessageId::CoordinationVerifier,
MessageId::CoordinationVerification,
MessageId::CoordinationContextProjectionsHeading,
MessageId::CoordinationContextDecisions,
MessageId::CoordinationBytes,
MessageId::CoordinationDeduplicated,
MessageId::CoordinationOmitted,
MessageId::CoordinationActiveHotPathsHeading,
MessageId::CoordinationActiveClaims,
MessageId::CoordinationMetricsNoteHeading,
MessageId::CoordinationMetricsNoAuthoritativeSource,
MessageId::CoordinationStatusProposed,
MessageId::CoordinationStatusAccepted,
MessageId::CoordinationStatusSuperseded,
MessageId::ComposerSlashMenuHint,
MessageId::ApprovalRepoLawBadge,
MessageId::ApprovalRepoLawTitle,
MessageId::ApprovalRepoLawWarning,
MessageId::ApprovalRepoLawRuleLabel,
MessageId::FilePickerMatchSingular,
MessageId::FilePickerMatchesPlural,
MessageId::FilePickerScanning,
MessageId::BehavioralTipPlanning,
MessageId::BehavioralTipBackgroundReceipt,
MessageId::BehavioralTipClearedInput,
MessageId::BehavioralTipMcpValidation,
MessageId::BehavioralTipRepeatedCommand,
MessageId::BehavioralTipDurableStateWritten,
MessageId::BehavioralTipTodoWrite,
MessageId::SettingLockedDuringTurn,
MessageId::SettingSubjectMode,
MessageId::SettingSubjectThinking,
MessageId::SettingSubjectModel,
MessageId::SettingSubjectModelAndThinking,
MessageId::SettingSubjectProvider,
MessageId::SettingSubjectPermissions,
MessageId::ThinkingControlledByAutoRouting,
MessageId::SavedAsStartupDefault,
MessageId::ModeAlreadyActiveSavedAsDefault,
MessageId::StartupDefaultNotSaved,
MessageId::StartupDefaultSubjectMode,
MessageId::StartupDefaultSubjectThinking,
MessageId::StartupDefaultSubjectModel,
MessageId::StartupDefaultSubjectAll,
MessageId::AutomationUsage,
MessageId::AutomationManagerUnavailable,
MessageId::AutomationListFailed,
MessageId::AutomationActionFailed,
MessageId::AutomationEmpty,
MessageId::AutomationListHeading,
MessageId::AutomationNoun,
MessageId::AutomationStatusLabel,
MessageId::AutomationStatusActive,
MessageId::AutomationStatusPaused,
MessageId::AutomationRunStatusQueued,
MessageId::AutomationRunStatusRunning,
MessageId::AutomationRunStatusCompleted,
MessageId::AutomationRunStatusFailed,
MessageId::AutomationRunStatusCanceled,
MessageId::AutomationActionInspect,
MessageId::AutomationActionPause,
MessageId::AutomationActionResume,
MessageId::AutomationActionDelete,
MessageId::AutomationActionRun,
MessageId::AutomationActionPaused,
MessageId::AutomationActionResumed,
MessageId::AutomationNextLabel,
MessageId::AutomationNameLabel,
MessageId::AutomationPromptLabel,
MessageId::AutomationCwdLabel,
MessageId::AutomationModeLabel,
MessageId::AutomationAllowShellLabel,
MessageId::AutomationTrustModeLabel,
MessageId::AutomationAutoApproveLabel,
MessageId::AutomationRruleLabel,
MessageId::AutomationDeliveryLabel,
MessageId::AutomationLastLabel,
MessageId::AutomationRecentRunsLabel,
MessageId::AutomationNoRuns,
MessageId::AutomationRunsUnavailable,
MessageId::AutomationTaskLabel,
MessageId::AutomationMutationReceipt,
MessageId::AutomationRunEnqueued,
MessageId::AutomationDeletePreview,
MessageId::AutomationDeleteConfirmationStale,
MessageId::AutomationDeleted,
MessageId::WhaleStateResting,
MessageId::WhaleStateThinking,
MessageId::WhaleStateWorking,
MessageId::WhaleStateWaiting,
MessageId::WhaleStateBlocked,
MessageId::WhaleStateOffline,
MessageId::WhaleAnimalScout,
MessageId::WhaleAnimalPatch,
MessageId::WhaleAnimalHarbor,
MessageId::WhaleAnimalEcho,
MessageId::WhaleAnimalKeel,
MessageId::WhaleAnimalLantern,
MessageId::WhaleAnimalPlain,
MessageId::WhaleJobScout,
MessageId::WhaleJobPatch,
MessageId::WhaleJobHarbor,
MessageId::WhaleJobEcho,
MessageId::WhaleJobKeel,
MessageId::WhaleJobLantern,
MessageId::WhaleJobPlain,
MessageId::AgentFocusOpened,
MessageId::AgentFocusClosed,
MessageId::AgentFocusBanner,
MessageId::AgentFocusPosture,
MessageId::AgentFocusPostureWrites,
MessageId::AgentFocusPostureReadOnly,
MessageId::AgentFocusPostureNetwork,
MessageId::AgentFocusPostureNoNetwork,
MessageId::AgentFocusPostureShellFull,
MessageId::AgentFocusPostureShellReadOnly,
MessageId::AgentFocusPostureShellNone,
MessageId::AgentFocusComposerChip,
MessageId::AgentFocusPlaceholder,
MessageId::AgentFocusNoTranscript,
MessageId::AgentFocusOmitted,
MessageId::AgentFocusFollowUpDelivered,
MessageId::AgentFocusFollowUpQueued,
MessageId::AgentFocusFollowUpContinued,
MessageId::AgentFocusFollowUpFailed,
MessageId::FooterHintForAgents,
MessageId::FooterHintToManage,
MessageId::AgentRailQueuedCount,
];
pub fn tr(locale: Locale, id: MessageId) -> Cow<'static, str> {
rust_i18n::t!(format!("{id:?}"), locale = locale.tag())
}
pub fn thinking_translation_placeholder(locale: Locale) -> &'static str {
match locale {
Locale::En => "Thinking; translating when complete...",
Locale::Ja => "思考中です。完了後に日本語へ翻訳します...",
Locale::ZhHans => "正在思考,完成后翻译为简体中文...",
Locale::ZhHant => "正在思考,完成後翻譯為繁體中文...",
Locale::PtBr => "Pensando; traduzindo ao concluir...",
Locale::Es419 => "Pensando; traduciendo al finalizar...",
Locale::Vi => "Đang suy nghĩ; sẽ dịch sau khi hoàn thành...",
Locale::Ko => "생각하는 중입니다. 완료되면 번역합니다...",
Locale::Ca => "S'està pensant; es traduirà en acabar...",
Locale::De => "Denkt nach; Übersetzung folgt nach Abschluss...",
Locale::Fr => "Réflexion en cours ; traduction à la fin...",
Locale::Id => "Sedang berpikir; akan diterjemahkan setelah selesai...",
Locale::Hi => "सोच रहा है; पूरा होने पर अनुवाद होगा...",
Locale::Ru => "Идут размышления; перевод будет после завершения...",
Locale::Uk => "Тривають роздуми; переклад буде після завершення...",
}
}
pub fn thinking_translation_in_progress(locale: Locale) -> &'static str {
match locale {
Locale::En => "Translating thinking content...",
Locale::Ja => "思考内容を翻訳中...",
Locale::ZhHans => "正在翻译思考内容...",
Locale::ZhHant => "正在翻譯思考內容...",
Locale::PtBr => "Traduzindo o conteúdo de raciocínio...",
Locale::Es419 => "Traduciendo el contenido de razonamiento...",
Locale::Vi => "Đang dịch nội dung suy nghĩ...",
Locale::Ko => "생각 내용을 번역하는 중...",
Locale::Ca => "S'està traduint el contingut del raonament...",
Locale::De => "Denkinhalte werden übersetzt...",
Locale::Fr => "Traduction du contenu de réflexion...",
Locale::Id => "Menerjemahkan konten pemikiran...",
Locale::Hi => "विचार सामग्री का अनुवाद हो रहा है...",
Locale::Ru => "Перевод содержимого рассуждений...",
Locale::Uk => "Переклад вмісту міркувань...",
}
}
pub fn thinking_translation_complete(locale: Locale) -> &'static str {
match locale {
Locale::En => "Thinking translation complete",
Locale::Ja => "思考内容の翻訳が完了しました",
Locale::ZhHans => "思考内容翻译完成",
Locale::ZhHant => "思考內容翻譯完成",
Locale::PtBr => "Tradução do raciocínio concluída",
Locale::Es419 => "Traducción del razonamiento completada",
Locale::Vi => "Đã dịch xong nội dung suy nghĩ",
Locale::Ko => "생각 내용 번역 완료",
Locale::Ca => "Traducció del raonament completada",
Locale::De => "Übersetzung der Denkinhalte abgeschlossen",
Locale::Fr => "Traduction de la réflexion terminée",
Locale::Id => "Terjemahan pemikiran selesai",
Locale::Hi => "विचार अनुवाद पूरा हुआ",
Locale::Ru => "Перевод рассуждений завершён",
Locale::Uk => "Переклад міркувань завершено",
}
}
pub fn thinking_translation_failed(locale: Locale) -> &'static str {
match locale {
Locale::En => "Thinking translation failed",
Locale::Ja => "思考内容の翻訳に失敗しました",
Locale::ZhHans => "思考内容翻译失败",
Locale::ZhHant => "思考內容翻譯失敗",
Locale::PtBr => "Falha ao traduzir o raciocínio",
Locale::Es419 => "Falló la traducción del razonamiento",
Locale::Vi => "Dịch nội dung suy nghĩ thất bại",
Locale::Ko => "생각 내용 번역 실패",
Locale::Ca => "Ha fallat la traducció del raonament",
Locale::De => "Übersetzung der Denkinhalte fehlgeschlagen",
Locale::Fr => "Échec de la traduction de la réflexion",
Locale::Id => "Terjemahan pemikiran gagal",
Locale::Hi => "विचार अनुवाद विफल",
Locale::Ru => "Не удалось перевести рассуждения",
Locale::Uk => "Не вдалося перекласти міркування",
}
}
pub fn hidden_translation_failed(locale: Locale) -> &'static str {
match locale {
Locale::En => "Translation failed; original text is hidden.",
Locale::Ja => "翻訳に失敗しました。原文は非表示です。",
Locale::ZhHans => "翻译失败,原文已隐藏。",
Locale::ZhHant => "翻譯失敗,原文已隱藏。",
Locale::PtBr => "A tradução falhou; o texto original está oculto.",
Locale::Es419 => "La traducción falló; el texto original está oculto.",
Locale::Vi => "Dịch thất bại; văn bản gốc đã bị ẩn.",
Locale::Ko => "번역에 실패했습니다. 원문은 숨겨져 있습니다.",
Locale::Ca => "La traducció ha fallat; el text original està amagat.",
Locale::De => "Übersetzung fehlgeschlagen; der Originaltext ist ausgeblendet.",
Locale::Fr => "La traduction a échoué ; le texte original est masqué.",
Locale::Id => "Terjemahan gagal; teks asli disembunyikan.",
Locale::Hi => "अनुवाद विफल; मूल पाठ छिपा हुआ है.",
Locale::Ru => "Перевод не удался; исходный текст скрыт.",
Locale::Uk => "Переклад не вдався; оригінальний текст приховано.",
}
}
pub fn normalize_configured_locale(input: &str) -> Option<&'static str> {
let normalized = normalize_locale_input(input);
if matches!(normalized.as_str(), "" | "auto" | "system") {
return Some("auto");
}
parse_locale(&normalized).map(Locale::tag)
}
#[must_use]
pub fn configured_locale_is_partial_pack(input: &str) -> bool {
let normalized = normalize_locale_input(input);
if matches!(normalized.as_str(), "" | "auto" | "system") {
return false;
}
parse_locale(&normalized).is_some_and(|locale| {
Locale::shipped().contains(&locale)
&& locale.is_partial_pack()
&& !Locale::shipped_complete().contains(&locale)
})
}
#[must_use]
pub fn configured_locale_values(separator: &str) -> String {
let mut out = String::from("auto");
for locale in Locale::shipped() {
out.push_str(separator);
out.push_str(locale.tag());
}
out
}
pub fn resolve_locale(setting: &str) -> Locale {
resolve_locale_with_env(setting, |key| std::env::var(key).ok())
}
pub fn resolve_locale_with_env<F>(setting: &str, env: F) -> Locale
where
F: Fn(&str) -> Option<String>,
{
let normalized = normalize_locale_input(setting);
if !matches!(normalized.as_str(), "" | "auto" | "system") {
return parse_locale(&normalized).unwrap_or(Locale::En);
}
for key in ["LC_ALL", "LC_MESSAGES", "LANG"] {
if let Some(value) = env(key)
&& let Some(locale) = parse_locale(&normalize_locale_input(&value))
{
return locale;
}
}
Locale::En
}
#[allow(dead_code)]
pub fn truncate_to_width(text: &str, max_width: usize) -> String {
if max_width == 0 {
return String::new();
}
if text.width() <= max_width {
return text.to_string();
}
let ellipsis_width = '…'.width().unwrap_or(1);
if max_width <= ellipsis_width {
return "…".to_string();
}
let limit = max_width - ellipsis_width;
let mut out = String::new();
let mut width = 0usize;
for cluster in text.graphemes(true) {
let cluster_width = UnicodeWidthStr::width(cluster);
if width + cluster_width > limit {
break;
}
out.push_str(cluster);
width += cluster_width;
}
out.push('…');
out
}
fn normalize_locale_input(input: &str) -> String {
input
.split('.')
.next()
.unwrap_or(input)
.split('@')
.next()
.unwrap_or(input)
.trim()
.replace('_', "-")
.to_lowercase()
}
fn parse_locale(value: &str) -> Option<Locale> {
if value == "c" || value == "posix" || value.starts_with("en") {
return Some(Locale::En);
}
if value.starts_with("ja") {
return Some(Locale::Ja);
}
if value.starts_with("zh") {
if value.contains("hant")
|| value.contains("-tw")
|| value.contains("-hk")
|| value.contains("-mo")
{
return Some(Locale::ZhHant);
}
return Some(Locale::ZhHans);
}
if value.starts_with("pt") || value == "br" {
return Some(Locale::PtBr);
}
if value.starts_with("es") {
return Some(Locale::Es419);
}
if value.starts_with("vi") {
return Some(Locale::Vi);
}
if value.starts_with("ko") {
return Some(Locale::Ko);
}
if value.starts_with("ca") {
return Some(Locale::Ca);
}
if value.starts_with("de") {
return Some(Locale::De);
}
if value.starts_with("fr") {
return Some(Locale::Fr);
}
if value.starts_with("id") {
return Some(Locale::Id);
}
if value.starts_with("hi") {
return Some(Locale::Hi);
}
if value.starts_with("ru") {
return Some(Locale::Ru);
}
if value.starts_with("uk") {
return Some(Locale::Uk);
}
None
}
#[cfg(test)]
mod tests {
use super::*;
use ratatui::{
buffer::Buffer,
layout::Rect,
widgets::{Paragraph, Widget, Wrap},
};
#[test]
fn locale_setting_normalizes_supported_tags() {
assert_eq!(normalize_configured_locale("auto"), Some("auto"));
assert_eq!(normalize_configured_locale("ja_JP.UTF-8"), Some("ja"));
assert_eq!(normalize_configured_locale("zh-CN"), Some("zh-Hans"));
assert_eq!(normalize_configured_locale("zh-TW"), Some("zh-Hant"));
assert_eq!(normalize_configured_locale("zh_HK.UTF-8"), Some("zh-Hant"));
assert_eq!(normalize_configured_locale("pt"), Some("pt-BR"));
assert_eq!(normalize_configured_locale("pt-PT"), Some("pt-BR"));
assert_eq!(normalize_configured_locale("es"), Some("es-419"));
assert_eq!(normalize_configured_locale("es-MX"), Some("es-419"));
assert_eq!(normalize_configured_locale("ca-ES"), Some("ca"));
assert_eq!(normalize_configured_locale("de_DE.UTF-8"), Some("de"));
assert_eq!(normalize_configured_locale("fr-FR"), Some("fr"));
assert_eq!(normalize_configured_locale("id-ID"), Some("id"));
assert_eq!(normalize_configured_locale("hi_IN.UTF-8"), Some("hi"));
assert_eq!(normalize_configured_locale("ru-RU"), Some("ru"));
assert_eq!(normalize_configured_locale("uk_UA.UTF-8"), Some("uk"));
}
#[test]
fn partial_pack_status_tracks_the_shipped_locale_registry() {
assert!(!configured_locale_is_partial_pack("auto"));
assert!(!configured_locale_is_partial_pack("system"));
assert!(!configured_locale_is_partial_pack("zh-Hant"));
assert!(!configured_locale_is_partial_pack("zh_TW.UTF-8"));
assert!(!configured_locale_is_partial_pack("vi"));
assert!(!configured_locale_is_partial_pack("ko"));
for locale in Locale::shipped() {
assert_eq!(
configured_locale_is_partial_pack(locale.tag()),
locale.is_partial_pack(),
"{} partial-pack classification drifted",
locale.tag()
);
assert_ne!(
Locale::shipped_complete().contains(locale),
locale.is_partial_pack(),
"{} must be exactly one of complete or partial",
locale.tag()
);
}
}
#[test]
fn locale_resolution_uses_config_then_environment_then_english() {
assert_eq!(
resolve_locale_with_env("ja", |_| Some("pt_BR.UTF-8".to_string())),
Locale::Ja
);
assert_eq!(
resolve_locale_with_env("auto", |key| {
(key == "LANG").then(|| "zh_CN.UTF-8".to_string())
}),
Locale::ZhHans
);
assert_eq!(
resolve_locale_with_env("auto", |key| {
(key == "LANG").then(|| "zh_TW.UTF-8".to_string())
}),
Locale::ZhHant
);
assert_eq!(resolve_locale_with_env("auto", |_| None), Locale::En);
}
pub fn missing_message_ids(locale: Locale) -> Vec<MessageId> {
ALL_MESSAGE_IDS
.iter()
.copied()
.filter(|id| tr(locale, *id).eq(&format!("{id:?}")))
.collect()
}
fn locale_json_source(locale: Locale) -> &'static str {
match locale {
Locale::En => include_str!("../locales/en.json"),
Locale::Ja => include_str!("../locales/ja.json"),
Locale::ZhHans => include_str!("../locales/zh-Hans.json"),
Locale::ZhHant => include_str!("../locales/zh-Hant.json"),
Locale::PtBr => include_str!("../locales/pt-BR.json"),
Locale::Es419 => include_str!("../locales/es-419.json"),
Locale::Vi => include_str!("../locales/vi.json"),
Locale::Ko => include_str!("../locales/ko.json"),
Locale::Ca => include_str!("../locales/ca.json"),
Locale::De => include_str!("../locales/de.json"),
Locale::Fr => include_str!("../locales/fr.json"),
Locale::Id => include_str!("../locales/id.json"),
Locale::Hi => include_str!("../locales/hi.json"),
Locale::Ru => include_str!("../locales/ru.json"),
Locale::Uk => include_str!("../locales/uk.json"),
}
}
#[test]
fn shipped_complete_packs_have_no_missing_core_messages() {
for locale in Locale::shipped_complete() {
assert!(
missing_message_ids(*locale).is_empty(),
"{} is missing messages",
locale.tag()
);
}
}
#[test]
fn work_stop_confirmation_is_explicitly_localized() {
for locale in Locale::shipped_complete() {
if *locale == Locale::En {
continue;
}
assert_ne!(tr(*locale, MessageId::SidebarStopControl), "stop");
assert_ne!(
tr(*locale, MessageId::WorkSurfaceStopConfirmHint),
"confirm stop · Esc cancels"
);
}
}
#[test]
fn coordination_work_chrome_is_explicitly_localized() {
for locale in Locale::shipped_complete() {
if *locale == Locale::En {
continue;
}
assert_ne!(
tr(*locale, MessageId::CoordinationWorkTitle),
tr(Locale::En, MessageId::CoordinationWorkTitle),
"{} fell back to the English Coordination Work title",
locale.tag()
);
assert_ne!(
tr(*locale, MessageId::CoordinationMetricsNoAuthoritativeSource),
tr(
Locale::En,
MessageId::CoordinationMetricsNoAuthoritativeSource
),
"{} fell back to the English coordination metrics note",
locale.tag()
);
}
}
fn raw_locale_messages(locale: Locale) -> serde_json::Map<String, serde_json::Value> {
serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(locale_json_source(
locale,
))
.unwrap_or_else(|err| panic!("{} locale json should parse: {err}", locale.tag()))
}
fn raw_locale_keys(locale: Locale) -> std::collections::BTreeSet<String> {
raw_locale_messages(locale).keys().cloned().collect()
}
fn message_placeholders(value: &str) -> std::collections::BTreeSet<String> {
value
.split('{')
.skip(1)
.filter_map(|suffix| suffix.split_once('}').map(|(name, _)| name.to_string()))
.collect()
}
#[test]
fn coordination_complete_packs_have_raw_key_and_placeholder_parity() {
let english = raw_locale_messages(Locale::En);
let coordination_keys = english
.keys()
.filter(|key| key.starts_with("Coordination"))
.collect::<Vec<_>>();
assert_eq!(coordination_keys.len(), 39);
for locale in Locale::shipped_complete() {
let pack = raw_locale_messages(*locale);
for key in &coordination_keys {
let english_value = english
.get(*key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("English {key} must be a string"));
let translated = pack
.get(*key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
assert_eq!(
message_placeholders(translated),
message_placeholders(english_value),
"{} changed placeholders for {key}",
locale.tag()
);
}
}
}
#[test]
fn automation_complete_packs_have_raw_key_and_placeholder_parity() {
let english = raw_locale_messages(Locale::En);
let automation_keys = english
.keys()
.filter(|key| key.starts_with("Automation"))
.collect::<Vec<_>>();
assert_eq!(automation_keys.len(), 42);
for locale in Locale::shipped_complete() {
let pack = raw_locale_messages(*locale);
for key in &automation_keys {
let english_value = english
.get(*key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("English {key} must be a string"));
let translated = pack
.get(*key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
assert_eq!(
message_placeholders(translated),
message_placeholders(english_value),
"{} changed placeholders for {key}",
locale.tag()
);
}
}
}
#[test]
fn cost_copy_has_raw_key_and_placeholder_parity_across_complete_packs() {
let english = raw_locale_messages(Locale::En);
let cost_keys = english
.keys()
.filter(|key| key.starts_with("CmdCost") || key.starts_with("CmdTokensCache"))
.cloned()
.collect::<Vec<_>>();
assert!(
cost_keys.len() >= 12,
"expected the full CmdCost*/CmdTokensCache* set, found {cost_keys:?}"
);
for required in [
"CmdCostEstimateOnly",
"CmdCostCoverage",
"CmdCostCoverageUnknownLegacy",
"CmdCostUnpricedTurns",
"CmdCostUnpricedClasses",
"CmdCostPricingProvenance",
"CmdCostLivePricingDowngraded",
"CmdCostLivePricingUnavailable",
"CmdCostRoutesHeader",
"CmdTokensCacheWriteTotal",
] {
assert!(
cost_keys.iter().any(|key| key == required),
"{required} is missing from en.json"
);
}
for locale in Locale::shipped_complete() {
let pack = raw_locale_messages(*locale);
for key in &cost_keys {
let english_value = english
.get(key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("English {key} must be a string"));
let translated = pack
.get(key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
assert_eq!(
message_placeholders(translated),
message_placeholders(english_value),
"{} changed placeholders for {key}",
locale.tag()
);
}
}
}
#[test]
fn every_complete_pack_localizes_the_subtotal_and_audited_route_copy() {
for locale in Locale::shipped_complete()
.iter()
.filter(|locale| **locale != Locale::En)
{
for id in [
MessageId::CmdCostReportSubtotal,
MessageId::CmdCostReportUnknown,
MessageId::CmdCostRoutesHeader,
MessageId::CmdCostUnknownValue,
MessageId::CmdCostCoverageUnknownLegacy,
] {
let localized = tr(*locale, id);
let english = tr(Locale::En, id);
assert!(
!localized.trim().is_empty(),
"{} has empty copy for {id:?}",
locale.tag()
);
assert_ne!(
localized,
english,
"{} still ships the English string for {id:?}",
locale.tag()
);
}
let subtotal = tr(*locale, MessageId::CmdCostReportSubtotal);
assert!(
subtotal.contains("{cost}"),
"{} subtotal headline lost its amount",
locale.tag()
);
assert_ne!(
subtotal,
tr(*locale, MessageId::CmdCostReport),
"{} cannot distinguish a subtotal from a complete total",
locale.tag()
);
let unknown = tr(*locale, MessageId::CmdCostReportUnknown);
assert!(
!unknown.contains("{cost}"),
"{} unknown headline must not interpolate an amount",
locale.tag()
);
}
}
#[test]
fn every_complete_pack_marks_the_cost_total_as_an_estimate() {
for locale in Locale::shipped_complete() {
let disclaimer = tr(*locale, MessageId::CmdCostEstimateOnly);
assert!(
!disclaimer.trim().is_empty(),
"{} has no cost estimate disclaimer",
locale.tag()
);
let coverage = tr(*locale, MessageId::CmdCostCoverage);
assert!(
coverage.contains("{priced}") && coverage.contains("{turns}"),
"{} coverage line lost its counts",
locale.tag()
);
}
}
#[test]
fn message_id_list_english_pack_stay_in_exact_sync() {
let en = raw_locale_keys(Locale::En);
let ids: std::collections::BTreeSet<String> =
ALL_MESSAGE_IDS.iter().map(|id| format!("{id:?}")).collect();
assert_eq!(
ids.len(),
ALL_MESSAGE_IDS.len(),
"ALL_MESSAGE_IDS contains duplicates"
);
let unlisted: Vec<_> = en.difference(&ids).collect();
assert!(
unlisted.is_empty(),
"en.json keys absent from ALL_MESSAGE_IDS — every parity test is blind to them: {unlisted:?}"
);
let untranslatable: Vec<_> = ids.difference(&en).collect();
assert!(
untranslatable.is_empty(),
"ALL_MESSAGE_IDS entries without an en.json string: {untranslatable:?}"
);
}
#[test]
fn shipped_complete_packs_have_raw_key_parity_with_english() {
let en = raw_locale_keys(Locale::En);
for locale in Locale::shipped_complete() {
if *locale == Locale::En {
continue;
}
let pack = raw_locale_keys(*locale);
let missing: Vec<_> = en.difference(&pack).collect();
assert!(
missing.is_empty(),
"{} claims completeness but lacks {} key(s); the English fallback hides these at runtime: {missing:?}",
locale.tag(),
missing.len()
);
let extra: Vec<_> = pack.difference(&en).collect();
assert!(
extra.is_empty(),
"{} defines key(s) en.json lacks: {extra:?}",
locale.tag()
);
}
}
#[test]
fn remote_env_strings_are_explicitly_localized_in_every_complete_pack() {
let ids = [
MessageId::CmdRemoteEnvDescription,
MessageId::CmdRemoteEnvOverview,
MessageId::CmdRemoteEnvOpening,
MessageId::CmdRemoteEnvUnavailable,
MessageId::CmdRemoteEnvSourceCustodyPolicy,
MessageId::CmdRemoteEnvBrowserLabel,
];
for locale in Locale::shipped_complete() {
let messages = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
locale_json_source(*locale),
)
.unwrap_or_else(|err| panic!("{} locale JSON should parse: {err}", locale.tag()));
for id in ids {
let key = format!("{id:?}");
let value = messages
.get(&key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("{} must explicitly define {key}", locale.tag()));
assert!(
!value.trim().is_empty(),
"{} {key} must not be empty",
locale.tag()
);
}
}
}
#[test]
fn todo_write_tip_is_localized_and_keeps_the_command_placeholder() {
let english = tr(Locale::En, MessageId::BehavioralTipTodoWrite);
assert!(english.contains("{command}"));
for locale in Locale::shipped_complete() {
let tip = tr(*locale, MessageId::BehavioralTipTodoWrite);
assert!(
tip.contains("{command}"),
"{} todo_write tip must compose the command in code",
locale.tag()
);
if *locale != Locale::En {
assert_ne!(
tip,
english,
"{} todo_write tip must be translated instead of copying English",
locale.tag()
);
}
}
}
#[test]
fn zh_hant_has_reached_en_parity_and_is_complete() {
assert!(
!Locale::ZhHant.is_partial_pack(),
"zh-Hant is now a complete pack and must not be marked partial"
);
assert!(
Locale::shipped_complete().contains(&Locale::ZhHant),
"zh-Hant must be included in shipped_complete now that it has full en.json parity"
);
let en_keys = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
locale_json_source(Locale::En),
)
.expect("en locale json");
let zh_hant_keys = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
locale_json_source(Locale::ZhHant),
)
.expect("zh-Hant locale json");
assert_eq!(
zh_hant_keys.len(),
en_keys.len(),
"zh-Hant must have the same number of keys as en.json"
);
}
#[test]
fn shipped_setup_strings_are_explicitly_localized() {
let setup_keys = ALL_MESSAGE_IDS
.iter()
.map(|id| format!("{id:?}"))
.filter(|id| id.starts_with("Setup"))
.collect::<Vec<_>>();
for locale in Locale::shipped_complete() {
let messages = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
locale_json_source(*locale),
)
.unwrap_or_else(|err| panic!("{} locale json should parse: {err}", locale.tag()));
for key in &setup_keys {
assert!(
messages.contains_key(key),
"{} should define {key} explicitly",
locale.tag()
);
}
}
}
#[test]
fn zh_hans_constitution_copy_uses_charter_term() {
let messages = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
locale_json_source(Locale::ZhHans),
)
.expect("zh-Hans locale json");
for (key, value) in &messages {
let Some(value) = value.as_str() else {
continue;
};
for literal_metaphor in ["宪法", "教义", "自由原则", "仓库法则"] {
assert!(
!value.contains(literal_metaphor),
"zh-Hans {key} should use functional terminology instead of {literal_metaphor}: {value}"
);
}
}
let setup_intro = tr(Locale::ZhHans, MessageId::SetupStepConstitutionWhy);
assert!(setup_intro.contains("Codewhale"));
assert!(setup_intro.contains("宪章"));
assert!(!setup_intro.contains("代码"));
let welcome = tr(Locale::ZhHans, MessageId::OnboardWelcomeLead);
assert!(welcome.contains("Codewhale"));
assert!(!welcome.contains("代码"));
assert!(tr(Locale::ZhHans, MessageId::OnboardTipsLine2).contains("/constitution"));
assert!(
tr(
Locale::ZhHans,
MessageId::SetupConstitutionFileLoadedUnselected
)
.contains("constitution.json")
);
}
#[test]
fn route_and_provider_picker_strings_are_translated_in_complete_locales() {
let ids = [
MessageId::PickerActionMove,
MessageId::PickerActionSwitch,
MessageId::PickerActionApply,
MessageId::PickerActionSetStartupDefault,
MessageId::PickerActionCancel,
MessageId::PickerActionClear,
MessageId::PickerActionClearSearch,
MessageId::PickerActionBrowseAll,
MessageId::PickerActionCustom,
MessageId::PickerActionJump,
MessageId::PickerActionEditKey,
MessageId::PickerActionModels,
MessageId::PickerActionConfigured,
MessageId::RouteNoModels,
MessageId::RouteNoModelMatch,
MessageId::ProviderNoMatchesTitle,
MessageId::ProviderNoMatchesHint,
MessageId::ProviderNoConfiguredTitle,
MessageId::ProviderNoConfiguredHint,
MessageId::ProviderNoCatalogModels,
MessageId::ConfigHintProviderUrl,
MessageId::CloudCodeSystemPromptUnsupported,
MessageId::SessionsOpenedHistory,
MessageId::SessionsTimeJustNow,
];
for locale in Locale::shipped_complete() {
if *locale == Locale::En {
continue;
}
for id in ids {
let localized = tr(*locale, id);
assert!(!localized.is_empty(), "{} empty for {id:?}", locale.tag());
if matches!((*locale, id), (Locale::Ca, MessageId::PickerActionModels)) {
continue;
}
assert_ne!(
localized,
tr(Locale::En, id),
"{} should translate {id:?}",
locale.tag()
);
}
}
}
#[test]
fn empty_state_and_operate_composer_strings_are_translated_in_complete_locales() {
let ids = [
MessageId::ComposerOperatePlaceholder,
MessageId::EmptyStateHelpConnector,
];
for locale in Locale::shipped_complete() {
if *locale == Locale::En {
continue;
}
for id in ids {
let localized = tr(*locale, id);
assert!(!localized.is_empty(), "{} empty for {id:?}", locale.tag());
assert_ne!(
localized,
tr(Locale::En, id),
"{} should translate {id:?}",
locale.tag()
);
}
}
}
#[test]
fn kimi_import_and_new_mcp_recommendations_have_complete_locale_parity() {
let ids = [
MessageId::McpRecommendedUnknownId,
MessageId::McpRecommendationsSafety,
MessageId::McpRecommendationGithub,
MessageId::McpRecommendationChrome,
MessageId::PluginKimiUsage,
MessageId::PluginKimiManagedRootHeading,
MessageId::PluginKimiNoneFound,
MessageId::PluginKimiLicenseUnspecified,
MessageId::PluginKimiApplicable,
MessageId::PluginKimiNotApplicable,
MessageId::PluginKimiCandidateSummary,
MessageId::PluginKimiCandidateDetails,
MessageId::PluginKimiRejectedHeading,
MessageId::PluginKimiInspectionFooter,
MessageId::PluginKimiCandidateMissing,
MessageId::PluginKimiCandidateChanged,
MessageId::PluginKimiHomeMissing,
MessageId::PluginKimiRootInspectFailed,
MessageId::PluginKimiRootMustBeDirectory,
MessageId::PluginKimiRootCanonicalizeFailed,
MessageId::PluginKimiRootListFailed,
MessageId::PluginKimiEntryReadFailed,
MessageId::PluginKimiEntryLimit,
MessageId::PluginKimiEntryInspectFailed,
MessageId::PluginKimiEntryLinksRefused,
MessageId::PluginKimiEntryOutsideRoot,
MessageId::PluginKimiEntryCanonicalizeFailed,
MessageId::PluginKimiManifestUnreadable,
MessageId::PluginKimiManifestMustBeFile,
MessageId::PluginKimiManifestInvalid,
MessageId::PluginKimiDirectoryNameMismatch,
MessageId::PluginKimiHashUnavailable,
MessageId::PluginKimiRollbackDestinationMissing,
MessageId::PluginKimiMismatchRemoved,
MessageId::PluginKimiMismatchRollbackFailed,
MessageId::PluginKimiUserPluginDirectory,
MessageId::PluginKimiMarketplaceZipUnsupported,
MessageId::PluginKimiMarketplaceRemoteUnsupported,
MessageId::PluginKimiMarketplaceGzipTarball,
];
let english = raw_locale_messages(Locale::En);
for locale in Locale::shipped_complete() {
let pack = raw_locale_messages(*locale);
for id in ids {
let key = format!("{id:?}");
let english_value = english
.get(&key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("English pack is missing {key}"));
let translated = pack
.get(&key)
.and_then(serde_json::Value::as_str)
.unwrap_or_else(|| panic!("{} is missing {key}", locale.tag()));
assert_eq!(
message_placeholders(translated),
message_placeholders(english_value),
"{} changed placeholders for {key}",
locale.tag()
);
if *locale != Locale::En {
assert_ne!(
translated,
english_value,
"{} must translate {key} instead of copying English",
locale.tag()
);
}
}
}
}
#[test]
fn mode_picker_strings_are_translated_in_non_english_locales() {
let sentences = [
MessageId::AppModeAgentHint,
MessageId::AppModeAutoHint,
MessageId::AppModePlanHint,
MessageId::AppModeYoloHint,
MessageId::AppModeOperateHint,
];
for locale in Locale::shipped_complete() {
if *locale == Locale::En {
continue;
}
for id in sentences {
let localized = tr(*locale, id);
assert!(!localized.is_empty(), "{} empty for {id:?}", locale.tag());
assert_ne!(
localized,
tr(Locale::En, id),
"{} should translate {id:?}",
locale.tag()
);
}
}
}
#[test]
fn zh_hant_hotbar_command_and_keybinding_strings_are_native() {
for id in [
MessageId::CmdHotbarDescription,
MessageId::KbJumpPlanAgentYolo,
MessageId::KbAltJumpPlanAgentYolo,
] {
let localized = tr(Locale::ZhHant, id);
assert!(!localized.is_empty(), "zh-Hant empty for {id:?}");
assert_ne!(
localized,
tr(Locale::En, id),
"zh-Hant should translate {id:?}"
);
}
}
#[test]
fn unsupported_locale_falls_back_to_english() {
assert_eq!(
resolve_locale_with_env("ar", |_| None),
Locale::En,
"Arabic is planned for QA but not shipped in the v0.7.6 core pack"
);
}
#[test]
fn provider_description_is_present_for_all_locales() {
for locale in Locale::shipped_complete() {
let description = tr(*locale, MessageId::CmdProviderDescription);
assert!(
!description.is_empty(),
"{} provider description should not be empty",
locale.tag()
);
assert!(
!description.contains("codewhale |"),
"{} provider description should not name codewhale as a backend: {description}",
locale.tag()
);
}
}
#[test]
fn width_truncation_handles_cjk_rtl_indic_and_latin_samples() {
let samples = [
("zh-Hans", "输入以筛选配置"),
("ar", "تصفية الإعدادات"),
("hi", "सेटिंग खोजें"),
("pt-BR", "configurações filtradas"),
];
for (tag, sample) in samples {
let truncated = truncate_to_width(sample, 12);
assert!(
truncated.width() <= 12,
"{tag} sample overflowed: {truncated:?}"
);
}
}
#[test]
fn planned_script_samples_render_in_narrow_terminal_buffer() {
let samples = [
("CJK", "输入以筛选配置"),
("RTL", "تصفية الإعدادات"),
("Indic", "सेटिंग खोजें"),
("Latin Global South", "configurações filtradas"),
];
for (label, sample) in samples {
let area = Rect::new(0, 0, 18, 4);
let mut buf = Buffer::empty(area);
Paragraph::new(sample)
.wrap(Wrap { trim: false })
.render(area, &mut buf);
let dump = buffer_text(&buf, area);
assert!(
dump.chars().any(|ch| !ch.is_whitespace()),
"{label} sample produced an empty render"
);
}
}
fn buffer_text(buf: &Buffer, area: Rect) -> String {
let mut out = String::new();
for y in area.top()..area.bottom() {
for x in area.left()..area.right() {
out.push_str(buf[(x, y)].symbol());
}
out.push('\n');
}
out
}
fn visible_row_text(buf: &Buffer, area: Rect, y: u16) -> String {
let mut out = String::new();
let mut skip_cells = 0usize;
for x in area.left()..area.right() {
if skip_cells > 0 {
skip_cells -= 1;
continue;
}
let symbol = buf[(x, y)].symbol();
out.push_str(symbol);
skip_cells = UnicodeWidthStr::width(symbol).saturating_sub(1);
}
out
}
#[test]
fn truncate_to_width_clips_cjk_by_display_width_and_keeps_prefix_intact() {
let title = "项目报告结果"; assert_eq!(truncate_to_width(title, 12), title);
let out = truncate_to_width("数据库迁移任务结果", 7); assert!(
UnicodeWidthStr::width(out.as_str()) <= 7,
"{out:?} overflowed"
);
assert!(out.ends_with('…'), "expected ellipsis, got {out:?}");
assert!(!out.contains('\u{FFFD}'), "split a wide glyph: {out:?}");
let body = out.strip_suffix('…').unwrap_or(&out);
assert!(
body.chars()
.map(|c| UnicodeWidthChar::width(c).unwrap_or(0))
.sum::<usize>()
<= 6,
"body exceeded budget-minus-ellipsis: {out:?}"
);
let row = "running 数据库迁移任务结果预览测试";
let out = truncate_to_width(row, 16);
assert!(
out.starts_with("running"),
"semantic prefix dropped: {out:?}"
);
assert!(UnicodeWidthStr::width(out.as_str()) <= 16);
assert!(!out.contains('\u{FFFD}'));
}
#[test]
fn truncate_to_width_never_splits_combining_marks_or_emoji() {
let cafe = "cafe\u{0301}"; assert_eq!(truncate_to_width(cafe, 10), cafe);
let out = truncate_to_width("cafe\u{0301} overflow here", 6);
assert!(UnicodeWidthStr::width(out.as_str()) <= 6);
assert!(!out.contains('\u{FFFD}'));
let out = truncate_to_width("\u{1F433}\u{1F433}\u{1F433} whales everywhere", 5);
assert!(UnicodeWidthStr::width(out.as_str()) <= 5);
assert!(!out.contains('\u{FFFD}'));
}
#[test]
fn narrow_and_medium_terminal_wraps_mixed_width_rows_without_overflow() {
let fixtures = [
"Task: 数据库迁移任务 — verify provider routing for issue #3488",
"抹香鲸 is running codex/issue-3439-zhipu-glm-fixture @ issue-3439",
"满員電車🫠 — full-width punctuation:『』【】 mixes with ASCII ids",
];
for width in [40usize, 80] {
for fixture in fixtures {
let out = truncate_to_width(fixture, width);
assert!(
UnicodeWidthStr::width(out.as_str()) <= width,
"width={width}: truncated row overflowed: {out:?}"
);
assert!(
!out.contains('\u{FFFD}'),
"width={width}: split a glyph: {out:?}"
);
}
for fixture in fixtures {
let area = Rect::new(0, 0, width as u16, 6);
let mut buf = Buffer::empty(area);
Paragraph::new(fixture)
.wrap(Wrap { trim: false })
.render(area, &mut buf);
let mut saw_text = false;
for (row_idx, y) in (area.top()..area.bottom()).enumerate() {
let row = visible_row_text(&buf, area, y);
let trimmed = row.trim_end_matches('\u{0}').trim_end();
assert!(
UnicodeWidthStr::width(trimmed) <= width,
"width={width} row {row_idx}: wrapped row overflowed ({} cols): {trimmed:?}",
UnicodeWidthStr::width(trimmed)
);
saw_text |= trimmed.chars().any(|ch| !ch.is_whitespace());
}
assert!(
saw_text,
"width={width}: mixed fixture produced an empty render"
);
}
}
}
fn has_cyrillic(value: &str) -> bool {
value
.chars()
.any(|ch| ('\u{0400}'..='\u{04FF}').contains(&ch))
}
fn has_devanagari(value: &str) -> bool {
value
.chars()
.any(|ch| ('\u{0900}'..='\u{097F}').contains(&ch))
}
fn latin_words_in_translated_copy(value: &str) -> Vec<String> {
const ALLOWED: &[&str] = &[
"codewhale",
"deepseek",
"fleet",
"plan",
"act",
"operate",
"ask",
"auto",
"review",
"full",
"access",
"enter",
"esc",
"alt",
"ctrl",
"shift",
"tab",
"space",
"backspace",
"delete",
"api",
"json",
"toml",
"yaml",
"yml",
"tui",
"ci",
"cd",
"mcp",
"url",
"uri",
"dns",
"ssh",
"http",
"https",
"git",
"github",
"gitee",
"openai",
"anthropic",
"gemini",
"kimi",
"codex",
"claude",
"vllm",
"ollama",
"sglang",
"npm",
"rust",
"cargo",
"linux",
"macos",
"windows",
"id",
"ok",
"true",
"false",
"utf",
"ascii",
"cli",
"ui",
"md",
"ai",
"llm",
"gpt",
"faq",
"docs",
"admin",
"oauth",
"ssl",
"tls",
"jwt",
"svg",
"png",
"wasm",
"app",
"slash",
"skill",
"plugin",
"shell",
];
let mut scrubbed = String::with_capacity(value.len());
let mut chars = value.chars();
let mut in_backtick = false;
let mut in_brace = false;
for ch in chars.by_ref() {
match ch {
'`' => in_backtick = !in_backtick,
'{' if !in_backtick => in_brace = true,
'}' if in_brace => in_brace = false,
_ if !in_backtick && !in_brace => scrubbed.push(ch),
_ => {}
}
}
scrubbed
.split(|c: char| !c.is_ascii_alphanumeric() && c != '-' && c != '/')
.filter(|token| token.len() >= 2)
.filter(|token| !token.contains('/') && !token.contains("://"))
.filter(|token| token.is_ascii())
.filter(|token| !token.chars().any(|c| c.is_ascii_digit()))
.filter(|token| !token.chars().all(|c| c.is_ascii_uppercase()))
.filter(|token| !ALLOWED.contains(&token.to_ascii_lowercase().as_str()))
.map(str::to_string)
.collect()
}
const SCRIPT_FIXTURE_IDS: &[MessageId] = &[
MessageId::ComposerPlaceholder,
MessageId::HistorySearchTitle,
MessageId::HistorySearchPlaceholder,
MessageId::StatusPickerTitle,
MessageId::StatusPickerInstruction,
MessageId::ConfigTitle,
MessageId::CommandPaletteTitle,
MessageId::AppModeAgentHint,
MessageId::AppModePlanHint,
MessageId::RouteNoModels,
MessageId::ProviderNoMatchesTitle,
MessageId::SessionsOpenedHistory,
];
#[test]
fn cyrillic_packs_have_script_purity_and_no_mixed_language_fixtures() {
for locale in [Locale::Ru, Locale::Uk] {
let messages = raw_locale_messages(locale);
let total = messages.len();
let with_cyrillic = messages
.values()
.filter(|v| v.as_str().is_some_and(has_cyrillic))
.count();
assert!(
with_cyrillic * 100 >= total * 85,
"{}: only {with_cyrillic}/{total} values contain Cyrillic — pack looks under-translated",
locale.tag()
);
for (key, value) in &messages {
let Some(value) = value.as_str() else {
continue;
};
if locale == Locale::Uk {
assert!(
!value.chars().any(|c| "ыэъЫЭЪ".contains(c)),
"uk {key} contains a Russian-only letter: {value}"
);
} else {
assert!(
!value.chars().any(|c| "іІїЇєЄґҐ".contains(c)),
"ru {key} contains a Ukrainian-only letter: {value}"
);
}
}
for id in SCRIPT_FIXTURE_IDS {
let value = tr(locale, *id);
assert!(
has_cyrillic(&value),
"{} {id:?} fixture has no Cyrillic: {value}",
locale.tag()
);
let leaked = latin_words_in_translated_copy(&value);
assert!(
leaked.is_empty(),
"{} {id:?} mixes Latin prose into Cyrillic copy: {leaked:?} in {value}",
locale.tag()
);
}
}
for id in [
MessageId::ComposerPlaceholder,
MessageId::StatusPickerInstruction,
MessageId::AppModeAgentHint,
MessageId::AppModePlanHint,
MessageId::ProviderNoMatchesTitle,
] {
assert_ne!(
tr(Locale::Ru, id),
tr(Locale::Uk, id),
"ru and uk share an identical sentence for {id:?} — one pack was copied from the other"
);
}
}
#[test]
fn hindi_pack_uses_devanagari_for_prose_fixtures() {
let messages = raw_locale_messages(Locale::Hi);
let total = messages.len();
let with_devanagari = messages
.values()
.filter(|v| v.as_str().is_some_and(has_devanagari))
.count();
assert!(
with_devanagari * 100 >= total * 80,
"hi: only {with_devanagari}/{total} values contain Devanagari — pack looks under-translated"
);
for id in SCRIPT_FIXTURE_IDS {
let value = tr(Locale::Hi, *id);
assert!(
has_devanagari(&value),
"hi {id:?} fixture has no Devanagari: {value}"
);
let leaked = latin_words_in_translated_copy(&value);
assert!(
leaked.is_empty(),
"hi {id:?} mixes Latin prose into Devanagari copy: {leaked:?} in {value}"
);
}
}
#[test]
fn no_shipped_locale_renders_a_missing_message_marker() {
for locale in Locale::shipped() {
assert!(
missing_message_ids(*locale).is_empty(),
"{} renders raw message ids (missing-marker UI)",
locale.tag()
);
}
}
#[test]
fn truncate_to_width_never_splits_devanagari_clusters() {
let conjuncts = "क्षत्रिय ज्ञान श्रृंखला प्रत्यक्ष";
for budget in [1usize, 2, 3, 5, 7, 40, 60, 80] {
let out = truncate_to_width(conjuncts, budget);
assert!(
UnicodeWidthStr::width(out.as_str()) <= budget,
"budget={budget}: overflowed: {out:?}"
);
assert!(!out.contains('\u{FFFD}'), "budget={budget}: {out:?}");
let body = out.strip_suffix('…').unwrap_or(&out);
assert!(
!body.ends_with('\u{094D}'),
"budget={budget}: dangling virama: {out:?}"
);
assert!(
!body.ends_with('\u{200D}'),
"budget={budget}: dangling ZWJ: {out:?}"
);
if let Some(last) = body.chars().last() {
let cp = last as u32;
let combining = (0x0900..=0x0903).contains(&cp) || (0x093A..=0x094F).contains(&cp);
assert!(
!combining,
"budget={budget}: trailing combining mark: {out:?}"
);
}
}
}
#[test]
fn cyrillic_latin_extended_and_devanagari_rows_wrap_within_terminal_columns() {
let fixtures = [
(
"ru",
"Задача: миграция базы данных — проверка маршрутизации провайдера #3092",
),
(
"uk",
"Завдання: міграція бази даних — перевірка маршрутизації провайдера #4791",
),
(
"de",
"Aufgabe: Datenbankmigration — Anbieter-Routing für #4788 prüfen",
),
(
"fr",
"Tâche : migration de la base — vérifier le routage fournisseur #4788",
),
(
"ca",
"Tasca: migració de la base de dades — comprovar l'encaminament #4788",
),
(
"id",
"Tugas: migrasi basis data — periksa perutean penyedia untuk #4789",
),
("hi", "कार्य: डेटाबेस माइग्रेशन — प्रदाता रूटिंग की जांच करें #4790"),
];
for width in [40usize, 60, 80] {
for (tag, fixture) in fixtures {
let out = truncate_to_width(fixture, width);
assert!(
UnicodeWidthStr::width(out.as_str()) <= width,
"{tag} width={width}: truncated row overflowed: {out:?}"
);
assert!(
!out.contains('\u{FFFD}'),
"{tag} width={width}: split a glyph: {out:?}"
);
let area = Rect::new(0, 0, width as u16, 6);
let mut buf = Buffer::empty(area);
Paragraph::new(fixture)
.wrap(Wrap { trim: false })
.render(area, &mut buf);
let mut saw_text = false;
for (row_idx, y) in (area.top()..area.bottom()).enumerate() {
let row = visible_row_text(&buf, area, y);
let trimmed = row.trim_end_matches('\u{0}').trim_end();
assert!(
UnicodeWidthStr::width(trimmed) <= width,
"{tag} width={width} row {row_idx}: wrapped row overflowed ({} cols): {trimmed:?}",
UnicodeWidthStr::width(trimmed)
);
saw_text |= trimmed.chars().any(|ch| !ch.is_whitespace());
}
assert!(
saw_text,
"{tag} width={width}: fixture produced an empty render"
);
}
}
}
}