diff --git a/src/ui/i18n/ja.rs b/src/ui/i18n/ja.rs index 2641042d..5bb1cb8c 100644 --- a/src/ui/i18n/ja.rs +++ b/src/ui/i18n/ja.rs @@ -485,8 +485,8 @@ pub fn translate_ja(key: L10nKey) -> Option<&'static str> { L10nKey::SettingsUpdateChannelDesc => { "Stable は正式リリースを、Nightly は最新のコードから毎晩ビルドされる版を追いかけます。新しい代わりに、リリース前のテストは経ていません。" } - L10nKey::SettingsUpdateChannelStable => "Stable", - L10nKey::SettingsUpdateChannelNightly => "Nightly", + L10nKey::SettingsUpdateChannelStable => "安定版", + L10nKey::SettingsUpdateChannelNightly => "ナイトリー", L10nKey::SettingsDaemonStale => "バックグラウンドサービスは {build} のままです。", L10nKey::SettingsDaemonStaleDesc => { "tty7 はその場で更新されたため、アプリは新しくなりましたが、各ペインは以前のビルドのサービスが処理しています。サービスを再起動すると新しいビルドに切り替わりますが、ペインで動いているプロセス(シェル、エージェント、SSH セッション)はすべて終了します。急ぐ必要はありません。ペインが空いているときに実行してください。" @@ -776,8 +776,8 @@ pub fn translate_ja(key: L10nKey) -> Option<&'static str> { L10nKey::ForwardLocal => "ローカル", L10nKey::ForwardRemote => "リモート", L10nKey::ForwardDynamic => "ダイナミック", - L10nKey::ForwardBindLabel => "bind", - L10nKey::ForwardToLabel => "to", + L10nKey::ForwardBindLabel => "バインド", + L10nKey::ForwardToLabel => "転送先", L10nKey::ForwardSocksLabel => "SOCKS", L10nKey::ForwardAdd => "追加", L10nKey::FileTreePlaceholderFileName => "ファイル名", diff --git a/src/ui/i18n/mod.rs b/src/ui/i18n/mod.rs index add96591..79344dcb 100644 --- a/src/ui/i18n/mod.rs +++ b/src/ui/i18n/mod.rs @@ -51,8 +51,24 @@ thread_local! { static TEST_LOCALE: std::cell::Cell> = const { std::cell::Cell::new(None) }; } -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum L10nKey { +/// Defines the key enum and, with it, the list of every key that exists. +/// +/// The parity guard used to walk a hand-maintained copy of this list, so a key +/// added without being added there was checked by nobody. There is exactly one +/// list now, and it is the one the compiler reads. +macro_rules! l10n_keys { + ($($key:ident),* $(,)?) => { + #[derive(Clone, Copy, Debug, PartialEq, Eq)] + pub enum L10nKey { $($key),* } + + impl L10nKey { + #[cfg(test)] + pub(crate) const ALL: &'static [L10nKey] = &[$(L10nKey::$key),*]; + } + }; +} + +l10n_keys! { SearchTabs, SearchFiles, SearchThemes, @@ -1092,933 +1108,67 @@ mod tests { use super::*; #[test] - fn zh_translations_cover_the_initial_keys() { - for key in [ - L10nKey::SearchTabs, - L10nKey::SearchFiles, - L10nKey::SearchThemes, - L10nKey::SearchSettings, - L10nKey::FilterHosts, - L10nKey::SearchCommandsOrHost, - L10nKey::SearchTheme, - L10nKey::Search, - L10nKey::SearchWorkspacesAndMachines, - L10nKey::SearchFonts, - L10nKey::NewFolderName, - L10nKey::NewFileName, - L10nKey::HomeNewTab, - L10nKey::HomeReopenClosedTab, - L10nKey::HomeSwitchWorkspace, - L10nKey::HomeCommandPalette, - L10nKey::HomeSplitRight, - L10nKey::HomeSplitDown, - L10nKey::HomeSettings, - L10nKey::TrayQuitStopServer, - L10nKey::Reconnect, - L10nKey::None, - L10nKey::TryAgain, - L10nKey::Refreshing, - L10nKey::Binary, - L10nKey::Delete, - L10nKey::NoMatchingCommands, - L10nKey::ConnectSshHint, - L10nKey::EditHint, - L10nKey::OpenFileFromTree, - L10nKey::FileChangedOnDisk, - L10nKey::Reload, - L10nKey::KeepMine, - L10nKey::Dismiss, - L10nKey::StoredPasswordRejected, - L10nKey::Trust, - L10nKey::Abort, - L10nKey::HostKeyOverrideMessage, - L10nKey::Override, - L10nKey::RememberKeychain, - L10nKey::Cancel, - L10nKey::Close, - L10nKey::QuitStopServerTitle, - L10nKey::QuitStopServerBody, - L10nKey::QuitAndStop, - L10nKey::CloseSshConnectionTitle, - L10nKey::CloseSshConnectionBody, - L10nKey::Keep, - L10nKey::SettingsNavAppearance, - L10nKey::SettingsNavTerminal, - L10nKey::SettingsNavInput, + fn every_key_is_translated_in_every_locale() { + // Deliberately the same in every locale. Each of these reads as + // English because English is the right answer there, not because + // nobody got to it. + const KEPT_IN_ENGLISH: &[L10nKey] = &[ + // Protocol and format names no locale translates. + L10nKey::CmdGroupSsh, L10nKey::SettingsNavSsh, - L10nKey::SettingsNavAgents, - L10nKey::SettingsNavWindowTabs, - L10nKey::SettingsNavKeybindings, - L10nKey::SettingsNavAbout, - L10nKey::SettingsHeader, - L10nKey::Reset, - L10nKey::Save, - L10nKey::Connect, - L10nKey::Download, - L10nKey::Link, - L10nKey::SettingsThemeIntroTitle, - L10nKey::SettingsThemeIntroDesc, - L10nKey::SettingsTypography, - L10nKey::SettingsFontSize, - L10nKey::SettingsFontSizeDesc, - L10nKey::SettingsLineHeight, - L10nKey::SettingsLineHeightDesc, - L10nKey::SettingsFontFamily, - L10nKey::SettingsFontFamilyDesc, - L10nKey::SettingsBoldFont, - L10nKey::SettingsBoldFontDesc, - L10nKey::SettingsItalicFont, - L10nKey::SettingsItalicFontDesc, - L10nKey::SettingsFontLigatures, - L10nKey::SettingsFontLigaturesDesc, - L10nKey::SettingsCursor, - L10nKey::SettingsCursorShape, - L10nKey::SettingsCursorShapeDesc, - L10nKey::SettingsCursorBlink, - L10nKey::SettingsCursorBlinkDesc, - L10nKey::SettingsTransparency, - L10nKey::SettingsOpacity, - L10nKey::SettingsOpacityDesc, - L10nKey::SettingsBlur, - L10nKey::SettingsBlurDesc, - L10nKey::FollowTheme, - L10nKey::SettingsDimInactivePanes, - L10nKey::SettingsDimInactivePanesDesc, - L10nKey::SettingsOpenThemesFolder, - L10nKey::SettingsChangeThemeImage, - L10nKey::SettingsChooseThemeImage, - L10nKey::SettingsRemoveThemeImage, - L10nKey::SettingsImageOpacity, - L10nKey::SettingsImageOpacityDesc, - L10nKey::SettingsEditTheme, - L10nKey::SettingsEditThemeIntro, - L10nKey::SettingsBackgroundImage, - L10nKey::SettingsBackgroundImageDesc, - L10nKey::SettingsAnsiColors, - L10nKey::SettingsCustomThemes, - L10nKey::SettingsCustomThemesIntro, - L10nKey::SettingsDuplicateToEdit, - L10nKey::SettingsHosts, - L10nKey::SettingsDefaults, - L10nKey::SettingsInheritedByEveryHost, - L10nKey::SettingsNoSavedHosts, - L10nKey::SettingsNothingMatches, - L10nKey::SettingsInTty7, - L10nKey::SettingsImportFromSshConfig, - L10nKey::SettingsExpandAllGroups, - L10nKey::SettingsNoHostsYet, - L10nKey::SettingsNothingSelected, - L10nKey::SettingsTypeAddressToConnect, - L10nKey::SettingsMoreInSshConfig, - L10nKey::SettingsAliasesLinked, - L10nKey::SettingsImportAliases, - L10nKey::SettingsImportAliasesDesc, - L10nKey::SettingsImportNow, - L10nKey::SettingsDefaultsIntro, - L10nKey::SettingsCopyAddress, - L10nKey::SettingsDuplicate, - L10nKey::SettingsForgetPassword, - L10nKey::SettingsForgotPasswordFor, - L10nKey::SettingsCouldntForgetPassword, - L10nKey::SettingsSecurity, - L10nKey::SettingsSecurityIntro, - L10nKey::SettingsVerifyHostKeys, - L10nKey::SettingsVerifyHostKeysDesc, - L10nKey::WarnBeforeClosing, - L10nKey::SettingsWarnBeforeClosingDesc, - L10nKey::SettingsNewHost, - L10nKey::SettingsName, - L10nKey::SettingsNameDesc, - L10nKey::SettingsHost, - L10nKey::SettingsHostDesc, - L10nKey::SettingsUser, - L10nKey::SettingsUserDesc, - L10nKey::SettingsAuth, - L10nKey::SettingsAuthDesc, - L10nKey::SettingsAuthModeAuto, - L10nKey::SettingsAuthModePassword, - L10nKey::SettingsAuthModeKey, - L10nKey::SettingsAuthModeAgent, + L10nKey::ForwardSocksLabel, + L10nKey::RemoteInstallShaLabel, L10nKey::SettingsAuthMode2Fa, - L10nKey::SettingsJumpHost, - L10nKey::SettingsJumpHostDesc, - L10nKey::SettingsNoneSummary, - L10nKey::SettingsNoneLower, - L10nKey::SettingsPortForwarding, - L10nKey::SettingsRulesOpenedWithConnection, - L10nKey::SettingsAddRule, - L10nKey::SettingsFwdLegendLocal, - L10nKey::SettingsFwdLegendRemote, - L10nKey::SettingsFwdLegendDynamic, - L10nKey::SettingsFwdNeedsBoth, - L10nKey::SettingsFwdNeedsListen, - L10nKey::SettingsAdvanced, - L10nKey::SettingsAdvancedSummary, - L10nKey::SettingsIdentityFiles, - L10nKey::SettingsIdentityFilesDesc, - L10nKey::SettingsAgentForwarding, - L10nKey::SettingsAgentForwardingDesc, L10nKey::SettingsProxyCommand, - L10nKey::SettingsProxyCommandDesc, - L10nKey::SettingsSocks5Proxy, - L10nKey::SettingsSocks5ProxyDesc, - L10nKey::SettingsHttpProxy, - L10nKey::SettingsHttpProxyDesc, - L10nKey::SettingsKexAlgorithms, - L10nKey::SettingsKexAlgorithmsDesc, - L10nKey::SettingsCiphers, - L10nKey::SettingsCiphersDesc, - L10nKey::SettingsMacs, - L10nKey::SettingsMacsDesc, - L10nKey::SettingsHostKeyAlgorithms, - L10nKey::SettingsHostKeyAlgorithmsDesc, - L10nKey::SettingsCompression, - L10nKey::SettingsJumpHostVia, - L10nKey::SettingsConnected, - L10nKey::SettingsProfileCopied, - L10nKey::SettingsCompressionDesc, - L10nKey::SettingsKeepaliveInterval, - L10nKey::SettingsKeepaliveIntervalDesc, - L10nKey::SettingsKeepaliveCountMax, - L10nKey::SettingsKeepaliveCountMaxDesc, - L10nKey::SettingsConnectTimeout, - L10nKey::SettingsConnectTimeoutDesc, - L10nKey::SettingsX11Forwarding, - L10nKey::SettingsX11ForwardingDesc, - L10nKey::SettingsShellIntegration, - L10nKey::SettingsShellIntegrationDesc, - L10nKey::SettingsLoginScripts, - L10nKey::SettingsLoginScriptsDesc, - L10nKey::SettingsSkipBanner, - L10nKey::SettingsSkipBannerDesc, - L10nKey::SettingsDefaultFollowsDefaults, - L10nKey::SettingsValueOn, - L10nKey::SettingsValueOff, - L10nKey::SettingsDefault, - L10nKey::SettingsOn, - L10nKey::SettingsOff, + L10nKey::SftpContextChmod, L10nKey::SettingsShell, - L10nKey::SettingsShellIntro, - L10nKey::SettingsProgram, - L10nKey::SettingsProgramDesc, - L10nKey::SettingsArguments, - L10nKey::SettingsArgumentsDesc, - L10nKey::SettingsStartIn, - L10nKey::SettingsStartInDesc, - L10nKey::SettingsCustomPath, - L10nKey::SettingsCustomPathDesc, - L10nKey::SettingsWdInherit, - L10nKey::SettingsWdHome, - L10nKey::SettingsWdCustom, - L10nKey::SettingsShellFooter, - L10nKey::SettingsScrolling, L10nKey::SettingsScrollback, - L10nKey::SettingsScrollbackDesc, - L10nKey::SettingsScrollSpeed, - L10nKey::SettingsScrollSpeedDesc, - L10nKey::SettingsMouse, - L10nKey::SettingsFocusFollowsMouseDesc, - L10nKey::SettingsHideMouseWhileTypingDesc, - L10nKey::SettingsReportMouseToAppsDesc, - L10nKey::SettingsBell, - L10nKey::SettingsTerminalBellDesc, - L10nKey::SettingsLinks, - L10nKey::SettingsDetectUrlsDesc, - L10nKey::SettingsForwardSshLoopbackLinksDesc, - L10nKey::SettingsOpenFilesWithDesc, - L10nKey::SettingsBellModeOff, - L10nKey::SettingsBellModeVisual, - L10nKey::SettingsBellModeAudible, - L10nKey::SettingsBellModeBoth, - L10nKey::SettingsPrompt, - L10nKey::SettingsPromptIntro, - L10nKey::SettingsTabCompletionDesc, - L10nKey::SettingsHistorySearchDesc, - L10nKey::SettingsSelectionClipboard, - L10nKey::SettingsSmartSelectionDesc, - L10nKey::SettingsCopyOnSelectDesc, - L10nKey::SettingsTrimTrailingSpacesDesc, - L10nKey::SettingsKeyboard, - L10nKey::SettingsOptionAsMetaDesc, - L10nKey::SettingsAgentsIntro, - L10nKey::SettingsAgentsIntroDesc, - L10nKey::SettingsReadingAgentConfig, - L10nKey::SettingsStatusNotInstalled, - L10nKey::SettingsStatusInstalled, - L10nKey::SettingsStatusOutdated, - L10nKey::SettingsInstall, - L10nKey::SettingsReinstall, - L10nKey::SettingsUpdate, - L10nKey::SettingsUninstall, - L10nKey::SettingsOfflineMachines, - L10nKey::SettingsSyncWithSystem, - L10nKey::SettingsSyncWithSystemDesc, - L10nKey::SettingsChangeTheme, - L10nKey::SettingsThemes, - L10nKey::SettingsThemePanelManual, - L10nKey::SettingsThemePanelLight, - L10nKey::SettingsThemePanelDark, - L10nKey::SettingsCustom, - L10nKey::SettingsBuiltIn, - L10nKey::SettingsDark, - L10nKey::SettingsLight, - L10nKey::SettingsActive, - L10nKey::SettingsStartupWindow, - L10nKey::SettingsStartupWindowDesc, - L10nKey::SettingsRememberWindowSize, - L10nKey::SettingsRememberWindowSizeDesc, - L10nKey::SettingsRestoreLastLayout, - L10nKey::SettingsRestoreLastLayoutDesc, - L10nKey::SettingsShowTrayIcon, - L10nKey::SettingsShowTrayIconDesc, - L10nKey::SettingsTabs, - L10nKey::SettingsNewTabPosition, - L10nKey::SettingsNewTabPositionDesc, - L10nKey::SettingsTabBarPosition, - L10nKey::SettingsTabBarPositionDesc, - L10nKey::SettingsSidebarGrouping, - L10nKey::SettingsSidebarGroupingDesc, - L10nKey::SettingsDiffPreviewFromCounts, - L10nKey::SettingsDiffPreviewFromCountsDesc, - L10nKey::SettingsNotifications, - L10nKey::SettingsNotifyOnCommandFinish, - L10nKey::SettingsNotifyOnCommandFinishDesc, - L10nKey::SettingsNotifyThreshold, - L10nKey::SettingsNotifyThresholdDesc, - L10nKey::NotifyModeNever, - L10nKey::NotifyModeUnfocused, - L10nKey::NotifyModeAlways, - L10nKey::SettingsStartupNormal, - L10nKey::SettingsStartupMaximized, - L10nKey::SettingsStartupFullscreen, - L10nKey::SettingsAfterCurrent, - L10nKey::SettingsAtEnd, - L10nKey::SettingsTop, - L10nKey::SettingsLeft, - L10nKey::SettingsByRepo, - L10nKey::SettingsFlat, - L10nKey::SettingsPreset, - L10nKey::SettingsPresetDesc, - L10nKey::SettingsPrefix, - L10nKey::SettingsPressKeys, - L10nKey::SettingsPauseToSaveEsc, - L10nKey::SettingsKeybindingsIntroDesc, - L10nKey::SettingsPrefixNote, - L10nKey::SettingsRestoreAllDefaults, - L10nKey::SettingsAboutDesc1, - L10nKey::SettingsUpdates, - L10nKey::SettingsUpdateAndRelaunch, - L10nKey::SettingsUpdateViewRelease, - L10nKey::SettingsUpdateChecking, - L10nKey::SettingsUpdateUpToDate, - L10nKey::SettingsUpdateDownloadingPercent, - L10nKey::SettingsUpdateDownloadingBytes, - L10nKey::SettingsUpdateVerifying, - L10nKey::SettingsUpdateCancel, - L10nKey::SettingsUpdateRetry, - L10nKey::SettingsUpdateDismiss, - L10nKey::SettingsUpdateDownloadManually, - L10nKey::SettingsUpdateFailedTitle, - L10nKey::SettingsUpdateReady, - L10nKey::SettingsUpdateReadyNextLaunch, - L10nKey::SettingsUpdateInstallNow, - L10nKey::SettingsUpdateDiscard, - L10nKey::SettingsAutoDownload, - L10nKey::SettingsAutoDownloadDesc, - L10nKey::SettingsUpdateChannel, - L10nKey::SettingsUpdateChannelDesc, - L10nKey::SettingsUpdateChannelStable, - L10nKey::SettingsUpdateChannelNightly, - L10nKey::SettingsDaemonStale, - L10nKey::SettingsDaemonStaleDesc, - L10nKey::SettingsDaemonStaleRestart, - L10nKey::UpdateDialogTitle, - L10nKey::UpdateDialogDetail, - L10nKey::UpdateDialogDetailManual, - L10nKey::UpdateDialogCannotSelfUpdate, - L10nKey::UpdateDialogLater, - L10nKey::UpdateDialogNextLaunch, - L10nKey::SettingsUpdateInstalling, - L10nKey::SettingsUpdateCheckNow, - L10nKey::SettingsUpdateCheckFailed, - L10nKey::SettingsUpdatePrepareFailed, - L10nKey::SettingsUpdateLaunchFailed, - L10nKey::SettingsUpdateUnsupportedMacos, - L10nKey::SettingsUpdateUnsupportedLinux, - L10nKey::SettingsUpdateLinuxPackage, - L10nKey::SettingsUpdateUnsupportedWindows, - L10nKey::SettingsUpdateWindowsAllUsers, - L10nKey::SettingsUpdateUnsupportedPlatform, - L10nKey::SettingsUpdateMissingPackage, - L10nKey::SettingsUpdateMissingChecksums, - L10nKey::SettingsVersionAvailable, - L10nKey::SettingsCheckUpdatesDesc, - L10nKey::SettingsCheckUpdatesOnLaunch, - L10nKey::SettingsCommandLine, - L10nKey::SettingsCommandLineDesc, - L10nKey::SettingsInstallCliOnPath, - L10nKey::SettingsServer, - L10nKey::SettingsServerDesc, - L10nKey::SettingsRestartServer, - L10nKey::SettingsAppHttpProxy, - L10nKey::SettingsAppHttpProxyDesc, - L10nKey::SettingsAppHttpProxyInvalid, + L10nKey::Ok, + // Pure templates: every word in them is a placeholder. + L10nKey::AppCmdSshProfileTitle, + L10nKey::HostOpsError, + L10nKey::SftpTransferProgress, + // Product names. L10nKey::SettingsAgentClaudeCode, L10nKey::SettingsAgentCodex, L10nKey::SettingsAgentCopilotCli, + L10nKey::SettingsAgentGrokBuild, L10nKey::SettingsAgentOpencode, L10nKey::SettingsAgentPi, - L10nKey::SettingsAgentGrokBuild, - L10nKey::SettingsSearchAboutKeywords, - L10nKey::SettingsSearchAppHttpProxyKeywords, - L10nKey::SettingsSearchAnsiColorsKeywords, - L10nKey::SettingsSearchArgumentsKeywords, - L10nKey::SettingsSearchBlurKeywords, - L10nKey::SettingsSearchBoldFontKeywords, - L10nKey::SettingsSearchClaudeCodeKeywords, - L10nKey::SettingsSearchCodexKeywords, - L10nKey::SettingsSearchCommandLineToolKeywords, - L10nKey::SettingsSearchCommandLineToolTitle, - L10nKey::SettingsSearchCopilotCliKeywords, - L10nKey::SettingsSearchCopyOnSelectKeywords, - L10nKey::SettingsSearchCursorBlinkKeywords, - L10nKey::SettingsSearchCursorShapeKeywords, - L10nKey::SettingsSearchCustomThemesKeywords, - L10nKey::SettingsSearchDetectUrlsKeywords, - L10nKey::SettingsSearchDiffPreviewFromCountsKeywords, - L10nKey::SettingsSearchDimInactivePanesKeywords, - L10nKey::SettingsSearchFocusFollowsMouseKeywords, - L10nKey::SettingsSearchFontFamilyKeywords, - L10nKey::SettingsSearchFontLigaturesKeywords, - L10nKey::SettingsSearchFontSizeKeywords, - L10nKey::SettingsSearchForwardSshLoopbackLinksKeywords, - L10nKey::SettingsSearchGrokBuildKeywords, - L10nKey::SettingsSearchHideMouseWhileTypingKeywords, - L10nKey::SettingsSearchHistorySearchKeywords, - L10nKey::SettingsSearchHostsKeywords, - L10nKey::SettingsSearchHowShellsWorkKeywords, - L10nKey::SettingsSearchHowShellsWorkTitle, - L10nKey::SettingsSearchItalicFontKeywords, - L10nKey::SettingsSearchKeybindingsKeywords, - L10nKey::SettingsSearchKeybindingsTitle, - L10nKey::SettingsSearchLineHeightKeywords, - L10nKey::SettingsSearchNewTabPositionKeywords, - L10nKey::SettingsSearchNotifyOnCommandFinishKeywords, - L10nKey::SettingsSearchNotifyThresholdKeywords, - L10nKey::SettingsSearchOpacityKeywords, - L10nKey::SettingsSearchOpenFilesWithKeywords, - L10nKey::SettingsSearchOpencodeKeywords, - L10nKey::SettingsSearchOptionAsMetaKeywords, - L10nKey::SettingsSearchPiKeywords, - L10nKey::SettingsSearchPortForwardingKeywords, - L10nKey::SettingsSearchProgramKeywords, - L10nKey::SettingsSearchRememberWindowSizeKeywords, - L10nKey::SettingsSearchReportMouseToAppsKeywords, - L10nKey::SettingsSearchRestoreLastLayoutKeywords, - L10nKey::SettingsSearchScrollSpeedKeywords, - L10nKey::SettingsSearchScrollbackKeywords, - L10nKey::SettingsSearchShowTrayIconKeywords, - L10nKey::SettingsSearchSidebarGroupingKeywords, - L10nKey::SettingsSearchSmartSelectionKeywords, - L10nKey::SettingsSearchStartInKeywords, - L10nKey::SettingsSearchSyncWithSystemKeywords, - L10nKey::SettingsSearchTabBarPositionKeywords, - L10nKey::SettingsSearchTabCompletionKeywords, - L10nKey::SettingsSearchTerminalBellKeywords, - L10nKey::SettingsSearchThemeKeywords, - L10nKey::SettingsSearchTrimTrailingSpacesKeywords, - L10nKey::SettingsSearchVerifyHostKeysKeywords, - L10nKey::SettingsSearchWarnBeforeClosingKeywords, - L10nKey::SettingsSearchStartupWindowKeywords, - L10nKey::SwitcherNoMatch, - L10nKey::AddSshHost, - L10nKey::ClickForNewWindow, - L10nKey::RestartServer, - L10nKey::OtherMachines, - L10nKey::Ok, - L10nKey::SftpNoTransfers, - L10nKey::SftpPanelTitleFiles, - L10nKey::SftpTooltipRefresh, - L10nKey::SftpTooltipMore, - L10nKey::SftpMenuNewFolder, - L10nKey::SftpMenuNewFile, - L10nKey::SftpMenuUpload, - L10nKey::SftpMenuGotoShellCwd, - L10nKey::SftpMenuHideTransferHistory, - L10nKey::SftpMenuTransferHistory, - L10nKey::SftpEditNewFolder, - L10nKey::SftpEditNewFile, - L10nKey::SftpEditRename, - L10nKey::SftpEditPermissions, - L10nKey::SftpLoading, - L10nKey::SftpEmptyDirectory, - L10nKey::SftpContextOpen, - L10nKey::SftpContextFollowSymlink, - L10nKey::SftpContextRename, - L10nKey::SftpContextChmod, - L10nKey::SftpTransferSummaryRunning, - L10nKey::SftpTransferSummaryFailed, - L10nKey::SftpTransferSummaryIdle, - L10nKey::SftpTransferProgress, - L10nKey::SftpTransferDone, - L10nKey::SftpTransferCancelled, - L10nKey::SftpTransferError, - L10nKey::SftpImagePasteUploadFailed, - L10nKey::ForwardPanelTitle, - L10nKey::ForwardDisconnected, - L10nKey::ForwardDisconnectedFrom, - L10nKey::ForwardTooltipAdd, - L10nKey::ForwardTooltipRemove, - L10nKey::ForwardLocal, - L10nKey::ForwardRemote, - L10nKey::ForwardDynamic, - L10nKey::ForwardBindLabel, - L10nKey::ForwardToLabel, - L10nKey::ForwardSocksLabel, - L10nKey::ForwardAdd, - L10nKey::FileTreePlaceholderFileName, - L10nKey::FileTreePlaceholderFolderName, - L10nKey::FileTreePlaceholderNewName, - L10nKey::FileTreeDeleteTitle, - L10nKey::FileTreeDeleteFolderBody, - L10nKey::FileTreeDeleteFileBody, - L10nKey::FileTreeDeleteFailed, - L10nKey::FileTreeContextOpen, - L10nKey::FileTreeContextCdHere, - L10nKey::FileTreeContextInsertPath, - L10nKey::FileTreeContextAttachAgent, - L10nKey::FileTreeContextNewFile, - L10nKey::FileTreeContextNewFolder, - L10nKey::FileTreeContextRename, - L10nKey::FileTreeContextCopyPath, - L10nKey::FileTreeContextHideDotfiles, - L10nKey::FileTreeContextShowDotfiles, - L10nKey::SshPromptNewKey, - L10nKey::SshPromptOldKey, - L10nKey::EditorCantOpen, - L10nKey::EditorCantRead, - L10nKey::EditorNotUtf8, - L10nKey::EditorSaveFailed, - L10nKey::EditorUnsavedChanges, - L10nKey::EditorDiscard, - L10nKey::EditorNoFileOpen, - L10nKey::EditorBackToTerminal, - L10nKey::EditorLnCol, - L10nKey::EditorEdit, - L10nKey::EditorPreview, - L10nKey::EditorWrapOn, - L10nKey::EditorWrapOff, - L10nKey::EditorFileTooLarge, - L10nKey::EditorBinaryFile, - L10nKey::PanelInfoTitle, - L10nKey::PanelChangesTitle, - L10nKey::PanelFilesTitle, - L10nKey::PanelNoSession, - L10nKey::PanelNoSessionHint, - L10nKey::PanelNoWorkingDirectory, - L10nKey::PanelNoWorkingDirectoryHint, - L10nKey::PanelLoading, - L10nKey::PanelNotAGitRepo, - L10nKey::PanelNotAGitRepoHint, - L10nKey::PanelNoChanges, - L10nKey::PanelNoChangesHint, - L10nKey::PanelMoreChangedFiles, - L10nKey::PanelUntracked, - L10nKey::PanelSessionSubtitle, - L10nKey::PanelProcessesSubtitle, - L10nKey::PanelPortsSubtitle, - L10nKey::PanelCwd, - L10nKey::PanelShell, - L10nKey::PanelSsh, - L10nKey::PanelBranch, - L10nKey::PanelChangesRow, - L10nKey::PanelAgent, - L10nKey::PanelAgentIdle, - L10nKey::PanelAgentWorking, - L10nKey::PanelAgentWaiting, - L10nKey::PanelAgentDone, - L10nKey::PanelRevealInFinder, - L10nKey::PanelOpenFolder, - L10nKey::WindowStop, - L10nKey::WindowDelete, - L10nKey::WindowThisWorkspace, - L10nKey::WindowConfirmTitle, - L10nKey::WindowStopUnreachable, - L10nKey::WindowDeleteUnreachable, - L10nKey::WindowStopShells, - L10nKey::WindowDeleteShells, - L10nKey::DiffReading, - L10nKey::DiffNotARepo, - L10nKey::DiffReadFailed, - L10nKey::DiffWorkingTreeClean, - L10nKey::DiffCloseTooltip, - L10nKey::DiffChangedFiles, - L10nKey::DiffUntrackedCount, - L10nKey::DiffMoreFiles, - L10nKey::DiffOversizedNotice, - L10nKey::DiffTruncatedPerFile, - L10nKey::DiffTruncatedBudget, - L10nKey::DiffUntrackedHeader, - L10nKey::DiffMoreUntracked, - L10nKey::DiffLines, - L10nKey::DiffChangedLines, - L10nKey::DiffBudgetAndCap, - L10nKey::DiffBudget, - L10nKey::DiffPerFileCap, - L10nKey::DiffUntrackedSummary, - L10nKey::PendingConnecting, - L10nKey::PendingUnreachable, - L10nKey::WorktreePromptNeedsName, - L10nKey::WorktreePromptTitle, - L10nKey::WorktreePromptName, - L10nKey::WorktreePromptBranch, - L10nKey::WorktreePromptBase, - L10nKey::WorktreePromptCreating, - L10nKey::WorktreePromptCreate, - L10nKey::AppNewWorktreeFailed, - L10nKey::HomeTimeJustNow, - L10nKey::HomeTimeMinutesAgo, - L10nKey::HomeTimeHourAgo, - L10nKey::HomeTimeHoursAgo, - L10nKey::HomeTimeYesterday, - L10nKey::HomeTimeDaysAgo, - L10nKey::HomeTimeOverWeekAgo, - L10nKey::HomeReopenNamed, - L10nKey::AppMenuAbout, - L10nKey::AppMenuCheckForUpdates, - L10nKey::AppMenuSettings, - L10nKey::AppMenuServices, - L10nKey::AppMenuHideApp, - L10nKey::AppMenuHideOthers, - L10nKey::AppMenuShowAll, - L10nKey::AppMenuQuit, - L10nKey::AppMenuFile, - L10nKey::AppMenuEdit, - L10nKey::AppMenuView, - L10nKey::AppMenuWindow, - L10nKey::AppMenuHelp, - L10nKey::AppMenuNewTab, - L10nKey::AppMenuNewWorkspace, - L10nKey::AppMenuNewWorktreeTab, - L10nKey::AppMenuSplitRight, - L10nKey::AppMenuSplitDown, - L10nKey::AppMenuRenameTab, - L10nKey::AppMenuCopyWorkingDirectory, - L10nKey::AppMenuCopySessionId, - L10nKey::AppMenuForkSession, - L10nKey::AppMenuClosePaneTab, - L10nKey::AppMenuCloseOtherTabs, - L10nKey::AppMenuCloseTabsRight, - L10nKey::AppMenuReopenClosedTab, - L10nKey::AppMenuRenameWorkspace, - L10nKey::AppMenuStopWorkspace, - L10nKey::AppMenuDeleteWorkspace, - L10nKey::AppMenuUndo, - L10nKey::AppMenuRedo, - L10nKey::AppMenuCut, - L10nKey::AppMenuCopy, - L10nKey::AppMenuPaste, - L10nKey::AppMenuSelectAll, - L10nKey::AppMenuFind, - L10nKey::AppMenuFindNext, - L10nKey::AppMenuFindPrevious, - L10nKey::AppMenuCommandPalette, - L10nKey::AppMenuIncreaseFontSize, - L10nKey::AppMenuDecreaseFontSize, - L10nKey::AppMenuResetFontSize, - L10nKey::AppMenuLeftSidebar, - L10nKey::AppMenuRightPanel, - L10nKey::AppMenuCodePanel, - L10nKey::AppMenuTabBarPosition, - L10nKey::AppMenuFocusNextPane, - L10nKey::AppMenuFocusPreviousPane, - L10nKey::AppMenuZoomPane, - L10nKey::AppMenuClearScrollback, - L10nKey::AppMenuEnterFullscreen, - L10nKey::AppMenuDocumentation, - L10nKey::AppMenuKeyboardShortcuts, - L10nKey::AppMenuJoinDiscord, - L10nKey::AppMenuReportIssue, - L10nKey::AppMenuRestartServer, - L10nKey::WindowUntitled, - L10nKey::TrayShowTty7, - L10nKey::TrayNotifications, - L10nKey::TrayAgentNeedsInput, - L10nKey::NotifyCommandFinished, - L10nKey::NotifyCommandFinishedWithCommand, - L10nKey::NotifyAgentFinished, - L10nKey::NotifyAgentWaiting, - L10nKey::NotifyTurnFinished, - L10nKey::TabTooltipMore, - L10nKey::TabTooltipShowSidebar, - L10nKey::TabTooltipHideSidebar, - L10nKey::TabTooltipHideDetailPanel, - L10nKey::TabTooltipShowDetailPanel, - L10nKey::TabUnnamedShell, - L10nKey::ShellDefault, - L10nKey::SidebarScratchGroup, - L10nKey::TabContextCloseTab, - L10nKey::TabContextCloseTabsBelow, - L10nKey::TabContextMarkUnread, - L10nKey::RemoteStripDisconnected, - L10nKey::RemoteStripConnecting, - L10nKey::RemoteStripReconnecting, - L10nKey::RemoteStripReconnectingAttempt, - L10nKey::RemoteStripPreempted, - L10nKey::RemoteStripFailed, - L10nKey::RemoteNoticePreempted, - L10nKey::RemoteNoticeDisconnected, - L10nKey::RemoteActionRetryNow, - L10nKey::RemoteActionTakeBack, - L10nKey::RemoteActionConnect, - L10nKey::RemoteActionRetry, - L10nKey::RemoteNoConnectionDetails, - L10nKey::RemoteThisComputer, - L10nKey::RemoteRestartTitle, - L10nKey::RemoteRestartBody, - L10nKey::RemoteReplaceBody, - L10nKey::RemoteRestartFailedTitle, - L10nKey::RemoteRestartFailedBody, - L10nKey::RemoteHostUnreachable, - L10nKey::RemoteInstallTitle, - L10nKey::RemoteInstallDetail, - L10nKey::RemoteInstallPathLabel, - L10nKey::RemoteInstallVersionLabel, - L10nKey::RemoteInstallSizeLabel, - L10nKey::RemoteInstallFromLabel, - L10nKey::RemoteInstallShaLabel, - L10nKey::RemoteInstallSilentUpgrades, - L10nKey::RemoteInstallBytes, - L10nKey::RemoteMismatchTitle, - L10nKey::RemoteMismatchDetail, - L10nKey::RemoteMismatchUnknownBuild, - L10nKey::RemoteMismatchUnknownBuildFromExe, - L10nKey::RemoteMismatchReplaceServer, - L10nKey::RemoteServerOutdated, - L10nKey::RemoteServerTooNew, - L10nKey::RemoteDaemonStartFailed, - L10nKey::RemoteDaemonUnreachable, - L10nKey::RemoteDaemonTooOld, - L10nKey::RemoteProfileMissing, - L10nKey::RemoteAliasMissing, - L10nKey::RemoteWslNoSsh, - L10nKey::RemoteLocalStdioNoSsh, - L10nKey::RemoteHostNotTty7, - L10nKey::RemoteWorkspaceListFailed, - L10nKey::RemoteServerRestartFailed, - L10nKey::RemoteNoRouteToHost, - L10nKey::RemoteMachineTreeUnexpectedReply, - L10nKey::RemoteMismatchVersionFromExe, - L10nKey::AppNoRunningCodingAgent, - L10nKey::SwitcherThisComputer, - L10nKey::SwitcherRestartingServer, - L10nKey::SwitcherDownloadingServerWithTotal, - L10nKey::SwitcherDownloadingServerNoTotal, - L10nKey::SwitcherCopyingServer, - L10nKey::SwitcherThisWindow, - L10nKey::SwitcherOpen, - L10nKey::SwitcherDisconnect, - L10nKey::SwitcherOpenInNewWindow, - L10nKey::SwitcherRename, - L10nKey::SwitcherPickAWorkspace, - L10nKey::SwitcherNoTabs, - L10nKey::SwitcherTabsAfterOpening, - L10nKey::SwitcherTabCount, - L10nKey::SwitcherTabCountOne, - L10nKey::SwitcherActiveTab, - L10nKey::SwitcherHoldToSwitch, - L10nKey::SshPromptPasswordFor, - L10nKey::SshPromptPassphraseFor, - L10nKey::SshPromptTwoFactor, - L10nKey::SshPromptUnknownHost, - L10nKey::SshPromptHostKeyChanged, - L10nKey::SshPromptHostKeyChangedBody, - L10nKey::SshPromptConnect, - L10nKey::SshPromptUnlock, - L10nKey::SshPromptSubmit, - L10nKey::HostOpsError, - L10nKey::TreeWindowOpenedEmpty, - L10nKey::CmdGroupTabsPanes, - L10nKey::CmdGroupWorkspaces, - L10nKey::CmdGroupView, - L10nKey::CmdGroupTerminal, - L10nKey::CmdGroupSsh, - L10nKey::CmdGroupAgents, - L10nKey::CmdGroupApplication, - L10nKey::CmdNewTab, - L10nKey::CmdNewWorktreeTab, - L10nKey::CmdNewWorktreeTabSubtitle, - L10nKey::CmdRenameTab, - L10nKey::CmdSplitRight, - L10nKey::CmdSplitDown, - L10nKey::CmdZoomPane, - L10nKey::CmdNextPane, - L10nKey::CmdPreviousPane, - L10nKey::CmdFocusPaneLeft, - L10nKey::CmdFocusPaneRight, - L10nKey::CmdFocusPaneUp, - L10nKey::CmdFocusPaneDown, - L10nKey::CmdResizePaneLeft, - L10nKey::CmdResizePaneRight, - L10nKey::CmdResizePaneUp, - L10nKey::CmdResizePaneDown, - L10nKey::CmdSwapPaneNext, - L10nKey::CmdSwapPanePrevious, - L10nKey::CmdNextTab, - L10nKey::CmdPreviousTab, - L10nKey::CmdCopyWorkingDirectory, - L10nKey::CmdCopySessionId, - L10nKey::CmdCopySessionIdSubtitle, - L10nKey::CmdForkSession, - L10nKey::CmdForkSessionSubtitle, - L10nKey::CmdMarkTabAsUnread, - L10nKey::CmdClosePaneTab, - L10nKey::CmdCloseOtherTabs, - L10nKey::CmdCloseTabsToTheRight, - L10nKey::CmdReopenClosedTab, - L10nKey::CmdNewWorkspace, - L10nKey::CmdSwitchWorkspace, - L10nKey::CmdRenameWorkspace, - L10nKey::CmdStopWorkspace, - L10nKey::CmdStopWorkspaceSubtitle, - L10nKey::CmdDeleteWorkspace, - L10nKey::CmdDeleteWorkspaceSubtitle, - L10nKey::CmdShowLeftSidebar, - L10nKey::CmdHideLeftSidebar, - L10nKey::CmdHideRightPanel, - L10nKey::CmdShowRightPanel, - L10nKey::CmdShowCodePanel, - L10nKey::CmdTabBarMoveToTop, - L10nKey::CmdTabBarMoveToLeftSidebar, - L10nKey::CmdRightPanelInfo, - L10nKey::CmdRightPanelChanges, - L10nKey::CmdRightPanelFiles, - L10nKey::CmdChangeTheme, - L10nKey::CmdResetFontSize, - L10nKey::CmdEnterFullScreen, - L10nKey::CmdClearScrollback, - L10nKey::CmdFindInTerminal, - L10nKey::CmdFindNext, - L10nKey::CmdFindPrevious, - L10nKey::CmdCopy, - L10nKey::CmdCut, - L10nKey::CmdPaste, - L10nKey::CmdSelectAll, - L10nKey::CmdSshAddConnection, - L10nKey::CmdSshManageProfiles, - L10nKey::CmdSshReconnect, - L10nKey::CmdSshRemoteFiles, - L10nKey::CmdSshPortForwarding, - L10nKey::CmdSshConnectWithInput, - L10nKey::CmdAgentSendSelection, - L10nKey::CmdAgentSendSelectionSubtitle, - L10nKey::CmdAgentSendGitDiffForReview, - L10nKey::CmdAgentSendGitDiffSubtitle, - L10nKey::CmdSettings, - L10nKey::CmdKeyboardShortcuts, - L10nKey::CmdAboutTty7, - L10nKey::CmdCheckForUpdates, - L10nKey::CmdDocumentation, - L10nKey::CmdJoinDiscord, - L10nKey::CmdReportIssue, - L10nKey::CmdRestartServer, - L10nKey::CmdRestartServerSubtitle, - L10nKey::CmdQuitTty7, - L10nKey::CmdQuitTty7Subtitle, - L10nKey::CmdQuickConnect, - L10nKey::CmdQuickConnectSaveProfile, - L10nKey::CmdRecent, - L10nKey::AppRestartServerTitle, - L10nKey::AppRestartServerMismatchDetail, - L10nKey::AppRestartServerDialectDetail, - L10nKey::AppRestartServerDialectNewerDetail, - L10nKey::AppRestartServerOldDetail, - L10nKey::AppRestart, - L10nKey::AppRestartServerNotSsh, - L10nKey::AppRestartServerBody, - L10nKey::AppWorktreeRemoveDetailDirty, - L10nKey::AppWorktreeRemoveDetailClean, - L10nKey::AppWorktreeRemoveTitle, - L10nKey::AppWorktreeDiscardAndRemove, - L10nKey::AppWorktreeRemove, - L10nKey::AppWorktreeKeep, - L10nKey::AppReopenTabFailed, - L10nKey::AppOpenTerminalFailed, - L10nKey::AppSshConnectionFailed, - L10nKey::AppSshReconnectFailed, - L10nKey::AppSplitPaneFailed, - L10nKey::AppWorktreeRemoved, - L10nKey::AppWorktreeRemoveFailed, - L10nKey::AppForkStillConnecting, - L10nKey::AppPaneNoCodingAgent, - L10nKey::AppForkNoCommand, - L10nKey::AppForkLocalOnly, - L10nKey::AppForkNoSessionId, - L10nKey::AppForkSessionIdNotToken, - L10nKey::AppForkMidTurn, - L10nKey::AppTabNoWorkingDirectory, - L10nKey::AppNothingSelected, - L10nKey::AppPaneNoKnownDirectory, - L10nKey::AppNoUncommittedChanges, - L10nKey::AppCmdSshProfileTitle, - L10nKey::AppCmdSwitchToTab, - L10nKey::AppPlaceholderDescription, - L10nKey::AppPlaceholderSshQuickConnect, - L10nKey::AppPlaceholderLoginShell, - L10nKey::AppPlaceholderNone, - L10nKey::AppPlaceholderOpenInDefaultApp, - L10nKey::AppThemeColorBackground, - L10nKey::AppThemeColorForeground, - L10nKey::AppThemeColorAccent, - L10nKey::AppThemeColorCursor, - L10nKey::AppThemeColorSelection, - L10nKey::AppAgentHooksThisComputer, - L10nKey::AppAgentHooksRemoteMachine, - L10nKey::AppAgentHooksNoHomeDir, - L10nKey::AppAgentHooksOffline, - L10nKey::AppAgentHooksHomeDirUnresolved, - L10nKey::AppAgentHooksOpFailed, - L10nKey::AppKeybindingDisplacedNote, - L10nKey::AppLocalServerName, - L10nKey::AppSshParseUnbalancedQuotes, - L10nKey::AppSshParseNoRemoteCommands, - L10nKey::AppSshParseFlagNeedsValue, - L10nKey::AppSshParseInvalidPort, - L10nKey::AppSshParseUnsupportedOption, - L10nKey::AppSshParseEnterHost, - L10nKey::AppSshParseBadHost, - L10nKey::AppMenuMinimize, - L10nKey::AppMenuZoom, - L10nKey::SwitcherStatusRestarting, - L10nKey::SwitcherStatusInstalling, - L10nKey::SwitcherStatusConnecting, - L10nKey::SwitcherStatusConnectFailed, - L10nKey::SwitcherStatusNotConnected, - L10nKey::SettingsLanguage, - L10nKey::SettingsLanguageDesc, + // A language is named in its own language on every locale's list. L10nKey::SettingsLanguageEnglish, L10nKey::SettingsLanguageChinese, L10nKey::SettingsLanguageJapanese, - L10nKey::SettingsSearchLanguageKeywords, - L10nKey::SettingsFontDefault, - L10nKey::ForwardDescriptionPlaceholder, - L10nKey::SettingsShellDefaultLoginShell, - L10nKey::SftpErrorUnexpectedReply, - L10nKey::SftpErrorUnsafeRemoteName, - L10nKey::SftpErrorInvalidOctalMode, - ] { - assert!( - translate_zh(key).is_some_and(|text| !text.is_empty()), - "missing zh translation for {key:?}" - ); - assert!( - translate_ja(key).is_some_and(|text| !text.is_empty()), - "missing ja translation for {key:?}" - ); - assert!( - !translate_en(key).is_empty(), - "missing en translation for {key:?}" - ); + // The pane-type labels are one set — shell / agent / ssh — and + // translating only the middle one would break the set. + L10nKey::PanelShell, + L10nKey::PanelAgent, + L10nKey::PanelSsh, + // "Agent" is the word the Chinese- and Japanese-speaking developer + // audience uses for these; a translation here would be less clear, + // not more. + L10nKey::CmdGroupAgents, + L10nKey::SettingsNavAgents, + L10nKey::SettingsAgentsIntro, + ]; + + for &key in L10nKey::ALL { + let en = translate_en(key); + assert!(!en.is_empty(), "missing en translation for {key:?}"); + for (name, text) in [("zh", translate_zh(key)), ("ja", translate_ja(key))] { + let text = text.unwrap_or_else(|| panic!("missing {name} translation for {key:?}")); + assert!(!text.is_empty(), "empty {name} translation for {key:?}"); + // A value identical to the English one is usually a key that + // was added and never translated. Some are deliberate — see + // the list above — and product names carry through. + // A value byte-identical to the English one is almost always + // a key that was added and never translated. The exceptions + // are listed above, with the reason. + assert!( + text != en || KEPT_IN_ENGLISH.contains(&key), + "{name} still reads the English for {key:?}: {en:?}" + ); + } } } diff --git a/src/ui/i18n/zh.rs b/src/ui/i18n/zh.rs index cd02070f..77dd7617 100644 --- a/src/ui/i18n/zh.rs +++ b/src/ui/i18n/zh.rs @@ -428,8 +428,8 @@ pub fn translate_zh(key: L10nKey) -> Option<&'static str> { L10nKey::SettingsUpdateChannelDesc => { "Stable 跟随正式发布的版本,Nightly 跟随每晚从最新代码构建的版本——更新更快,但没有经过发布测试。" } - L10nKey::SettingsUpdateChannelStable => "Stable", - L10nKey::SettingsUpdateChannelNightly => "Nightly", + L10nKey::SettingsUpdateChannelStable => "稳定版", + L10nKey::SettingsUpdateChannelNightly => "每夜构建", L10nKey::SettingsDaemonStale => "后台服务仍运行在 {build}。", L10nKey::SettingsDaemonStaleDesc => { "tty7 是原地升级的,界面已经是新版本,但各个 pane 仍由旧版本的后台服务托管。重启服务才能用上新版本,代价是 pane 里正在跑的进程全部结束——shell、agent、SSH 会话都算。不急,挑个 pane 空闲的时候再重启。"