diff --git a/src/renderer/src/components/right-sidebar/AiVaultScanProgressStrip.tsx b/src/renderer/src/components/right-sidebar/AiVaultScanProgressStrip.tsx index b9af7373ad5..1356f19487b 100644 --- a/src/renderer/src/components/right-sidebar/AiVaultScanProgressStrip.tsx +++ b/src/renderer/src/components/right-sidebar/AiVaultScanProgressStrip.tsx @@ -28,12 +28,12 @@ function fileCountLabel(count: number): string { ? translate( 'auto.components.right.sidebar.AiVaultScanProgressStrip.fileCount_one', '{{value0}} file', - { value0 } + { value0, count } ) : translate( 'auto.components.right.sidebar.AiVaultScanProgressStrip.fileCount_other', '{{value0}} files', - { value0 } + { value0, count } ) } @@ -43,12 +43,12 @@ function databaseCountLabel(count: number): string { ? translate( 'auto.components.right.sidebar.AiVaultScanProgressStrip.databaseCount_one', '{{value0}} database', - { value0 } + { value0, count } ) : translate( 'auto.components.right.sidebar.AiVaultScanProgressStrip.databaseCount_other', '{{value0}} databases', - { value0 } + { value0, count } ) } diff --git a/src/renderer/src/components/settings/ComputerUsePane.tsx b/src/renderer/src/components/settings/ComputerUsePane.tsx index 03cbecd26c8..4d94baa1070 100644 --- a/src/renderer/src/components/settings/ComputerUsePane.tsx +++ b/src/renderer/src/components/settings/ComputerUsePane.tsx @@ -123,12 +123,13 @@ export function ComputerUsePane(): React.JSX.Element { : missingCount === 1 ? translate( 'auto.components.settings.computerUseSummary.permissionsRequired_one', - '1 permission required before agents can operate app windows.' + '{{value0}} permission required before agents can operate app windows.', + { value0: missingCount, count: missingCount } ) : translate( 'auto.components.settings.computerUseSummary.permissionsRequired_other', '{{value0}} permissions required before agents can operate app windows.', - { value0: missingCount } + { value0: missingCount, count: missingCount } ) useEffect(() => { diff --git a/src/renderer/src/components/settings/OrchestrationSkillAgentCoverage.tsx b/src/renderer/src/components/settings/OrchestrationSkillAgentCoverage.tsx index c1d1f59722d..46195deed2d 100644 --- a/src/renderer/src/components/settings/OrchestrationSkillAgentCoverage.tsx +++ b/src/renderer/src/components/settings/OrchestrationSkillAgentCoverage.tsx @@ -47,12 +47,13 @@ function getAgentCoverageSummary(props: { return totalCount === 1 ? translate( 'auto.components.settings.OrchestrationSkillAgentCoverage.fullCoverage_one', - 'All 1 detected agent has the skill.' + 'All 1 detected agent has the skill.', + { value0: totalCount, count: totalCount } ) : translate( 'auto.components.settings.OrchestrationSkillAgentCoverage.fullCoverage_other', 'All {{value0}} detected agents have the skill.', - { value0: totalCount } + { value0: totalCount, count: totalCount } ) } if (noCoverage) { diff --git a/src/renderer/src/components/settings/WarpThemeImportModal.tsx b/src/renderer/src/components/settings/WarpThemeImportModal.tsx index 8026e70f13a..3613d8e0a85 100644 --- a/src/renderer/src/components/settings/WarpThemeImportModal.tsx +++ b/src/renderer/src/components/settings/WarpThemeImportModal.tsx @@ -149,12 +149,13 @@ export function WarpThemeImportModal({ {preview.themes.length === 1 ? translate( 'auto.components.settings.WarpThemeImportModal.found_theme_one', - 'Found 1 theme' + 'Found {{value0}} theme', + { value0: preview.themes.length, count: preview.themes.length } ) : translate( 'auto.components.settings.WarpThemeImportModal.found_theme_other', 'Found {{value0}} themes', - { value0: preview.themes.length } + { value0: preview.themes.length, count: preview.themes.length } )} {preview.sourceLabel ? translate( @@ -319,13 +320,14 @@ export function WarpThemeImportModal({ {selectedCount === 1 ? translate( 'auto.components.settings.WarpThemeImportModal.import_theme_one', - 'Import 1 Theme' + 'Import {{value0}} Theme', + { value0: selectedCount, count: selectedCount } ) : selectedCount > 0 ? translate( 'auto.components.settings.WarpThemeImportModal.import_theme_other', 'Import {{value0}} Themes', - { value0: selectedCount } + { value0: selectedCount, count: selectedCount } ) : translate( 'auto.components.settings.WarpThemeImportModal.import_themes', diff --git a/src/renderer/src/components/settings/useWarpThemeImport.ts b/src/renderer/src/components/settings/useWarpThemeImport.ts index 928bb8908ff..e47d1019c1a 100644 --- a/src/renderer/src/components/settings/useWarpThemeImport.ts +++ b/src/renderer/src/components/settings/useWarpThemeImport.ts @@ -131,13 +131,13 @@ export function useWarpThemeImport( overflowCount === 1 ? translate( 'auto.components.settings.useWarpThemeImport.over_limit_one', - 'Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect 1 new theme and try again.', - { value0: MAX_TERMINAL_CUSTOM_THEMES } + 'Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect {{value1}} new theme and try again.', + { value0: MAX_TERMINAL_CUSTOM_THEMES, value1: overflowCount, count: overflowCount } ) : translate( 'auto.components.settings.useWarpThemeImport.over_limit_other', 'Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect {{value1}} new themes and try again.', - { value0: MAX_TERMINAL_CUSTOM_THEMES, value1: overflowCount } + { value0: MAX_TERMINAL_CUSTOM_THEMES, value1: overflowCount, count: overflowCount } ) ) return @@ -157,12 +157,13 @@ export function useWarpThemeImport( count === 1 ? translate( 'auto.components.settings.useWarpThemeImport.imported_one', - 'Imported 1 theme' + 'Imported {{value0}} theme', + { value0: count, count } ) : translate( 'auto.components.settings.useWarpThemeImport.imported_other', 'Imported {{value0}} themes', - { value0: count } + { value0: count, count } ) ) // Reveal new themes that otherwise remain below the built-in list. diff --git a/src/renderer/src/components/sidebar/DeleteWorktreeDirtyChangeHint.tsx b/src/renderer/src/components/sidebar/DeleteWorktreeDirtyChangeHint.tsx index 6b5b590bbc0..4ceb2a64995 100644 --- a/src/renderer/src/components/sidebar/DeleteWorktreeDirtyChangeHint.tsx +++ b/src/renderer/src/components/sidebar/DeleteWorktreeDirtyChangeHint.tsx @@ -45,7 +45,7 @@ export function DeleteWorktreeDirtyChangeHint({ ? changeCount === 1 ? translate( 'auto.components.sidebar.DeleteWorktreeDirtyChangeHint.changeCount_one', - '1 uncommitted or untracked change', + '{{count}} uncommitted or untracked change', { count: changeCount } ) : translate( diff --git a/src/renderer/src/components/sidebar/ImportedWorktreesVisibilityLine.tsx b/src/renderer/src/components/sidebar/ImportedWorktreesVisibilityLine.tsx index e1420a974cb..2c66cd211d0 100644 --- a/src/renderer/src/components/sidebar/ImportedWorktreesVisibilityLine.tsx +++ b/src/renderer/src/components/sidebar/ImportedWorktreesVisibilityLine.tsx @@ -102,7 +102,7 @@ export default function ImportedWorktreesVisibilityLine({ hiddenCount === 1 ? translate( 'auto.components.sidebar.ImportedWorktreesVisibilityLine.keepHiddenAriaLabel_one', - 'Keep 1 discovered worktree hidden for {{repo}}; recover from the project menu', + 'Keep {{count}} discovered worktree hidden for {{repo}}; recover from the project menu', { count: hiddenCount, repo: repoScopeLabel } ) : translate( @@ -120,7 +120,7 @@ export default function ImportedWorktreesVisibilityLine({ ? hiddenCount === 1 ? translate( 'auto.components.sidebar.ImportedWorktreesVisibilityLine.hidingInRepo_one', - 'Hiding 1 discovered worktree in {{repo}}', + 'Hiding {{count}} discovered worktree in {{repo}}', { count: hiddenCount, repo: repoScopeLabel } ) : translate( @@ -131,7 +131,7 @@ export default function ImportedWorktreesVisibilityLine({ : hiddenCount === 1 ? translate( 'auto.components.sidebar.ImportedWorktreesVisibilityLine.hiding_one', - 'Hiding 1 discovered worktree', + 'Hiding {{count}} discovered worktree', { count: hiddenCount } ) : translate( diff --git a/src/renderer/src/components/sidebar/SetupScriptPromptCard.tsx b/src/renderer/src/components/sidebar/SetupScriptPromptCard.tsx index 1285739c8ce..f5f832edecf 100644 --- a/src/renderer/src/components/sidebar/SetupScriptPromptCard.tsx +++ b/src/renderer/src/components/sidebar/SetupScriptPromptCard.tsx @@ -270,7 +270,7 @@ function SetupScriptPromptCard(): React.JSX.Element | null { ? skippedCount === 1 ? translate( 'auto.components.sidebar.SetupScriptPromptCard.savedWithSkippedFields_one', - '1 unsupported field skipped. Saved the setup command.', + '{{count}} unsupported field skipped. Saved the setup command.', { count: skippedCount } ) : translate( diff --git a/src/renderer/src/components/sidebar/workspace-batch-action-labels.ts b/src/renderer/src/components/sidebar/workspace-batch-action-labels.ts index fce6a9438a6..d5b36a6059d 100644 --- a/src/renderer/src/components/sidebar/workspace-batch-action-labels.ts +++ b/src/renderer/src/components/sidebar/workspace-batch-action-labels.ts @@ -4,7 +4,7 @@ export function deleteWorkspacesCountLabel(count: number): string { return count === 1 ? translate( 'auto.components.sidebar.workspaceBatchActionLabels.deleteCount_one', - 'Delete 1 Workspace', + 'Delete {{count}} Workspace', { count } ) : translate( @@ -18,7 +18,7 @@ function sleepWorkspacesCountLabel(count: number): string { return count === 1 ? translate( 'auto.components.sidebar.workspaceBatchActionLabels.sleepCount_one', - 'Sleep 1 Workspace', + 'Sleep {{count}} Workspace', { count } ) : translate( diff --git a/src/renderer/src/i18n/en-runtime-required.json b/src/renderer/src/i18n/en-runtime-required.json index adc3456ae48..af72d65f939 100644 --- a/src/renderer/src/i18n/en-runtime-required.json +++ b/src/renderer/src/i18n/en-runtime-required.json @@ -308,9 +308,9 @@ "syncedServerSingular": "Synced {{count}} server" }, "WarpThemeImportModal": { - "found_theme_one": "Found 1 theme", + "found_theme_one": "Found {{value0}} theme", "found_theme_other": "Found {{value0}} themes", - "import_theme_one": "Import 1 Theme", + "import_theme_one": "Import {{value0}} Theme", "import_theme_other": "Import {{value0}} Themes" }, "agent-awake-copy": { @@ -387,7 +387,7 @@ } }, "computerUseSummary": { - "permissionsRequired_one": "1 permission required before agents can operate app windows.", + "permissionsRequired_one": "{{value0}} permission required before agents can operate app windows.", "permissionsRequired_other": "{{value0}} permissions required before agents can operate app windows." }, "sshHostServer": { @@ -427,23 +427,23 @@ } }, "useWarpThemeImport": { - "imported_one": "Imported 1 theme", + "imported_one": "Imported {{value0}} theme", "imported_other": "Imported {{value0}} themes", - "over_limit_one": "Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect 1 new theme and try again.", + "over_limit_one": "Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect {{value1}} new theme and try again.", "over_limit_other": "Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect {{value1}} new themes and try again." } }, "sidebar": { "DeleteWorktreeDirtyChangeHint": { - "changeCount_one": "1 uncommitted or untracked change", + "changeCount_one": "{{count}} uncommitted or untracked change", "changeCount_other": "{{count}} uncommitted or untracked changes" }, "ImportedWorktreesVisibilityLine": { - "hidingInRepo_one": "Hiding 1 discovered worktree in {{repo}}", + "hidingInRepo_one": "Hiding {{count}} discovered worktree in {{repo}}", "hidingInRepo_other": "Hiding {{count}} discovered worktrees in {{repo}}", - "hiding_one": "Hiding 1 discovered worktree", + "hiding_one": "Hiding {{count}} discovered worktree", "hiding_other": "Hiding {{count}} discovered worktrees", - "keepHiddenAriaLabel_one": "Keep 1 discovered worktree hidden for {{repo}}; recover from the project menu", + "keepHiddenAriaLabel_one": "Keep {{count}} discovered worktree hidden for {{repo}}; recover from the project menu", "keepHiddenAriaLabel_other": "Keep {{count}} discovered worktrees hidden for {{repo}}; recover from the project menu" }, "PreservedBranchBatchReviewDialog": { @@ -451,7 +451,7 @@ "a0f9863597_other": "Force Delete {{count}} Branches" }, "SetupScriptPromptCard": { - "savedWithSkippedFields_one": "1 unsupported field skipped. Saved the setup command.", + "savedWithSkippedFields_one": "{{count}} unsupported field skipped. Saved the setup command.", "savedWithSkippedFields_other": "{{count}} unsupported fields skipped. Saved the setup command." }, "preserved": { @@ -473,9 +473,9 @@ } }, "workspaceBatchActionLabels": { - "deleteCount_one": "Delete 1 Workspace", + "deleteCount_one": "Delete {{count}} Workspace", "deleteCount_other": "Delete {{count}} Workspaces", - "sleepCount_one": "Sleep 1 Workspace", + "sleepCount_one": "Sleep {{count}} Workspace", "sleepCount_other": "Sleep {{count}} Workspaces" } }, diff --git a/src/renderer/src/i18n/i18n.ts b/src/renderer/src/i18n/i18n.ts index f3f645e4b5e..70cafaed12d 100644 --- a/src/renderer/src/i18n/i18n.ts +++ b/src/renderer/src/i18n/i18n.ts @@ -40,12 +40,13 @@ function localeCatalogUrl(language: string): string | undefined { return Object.entries(NON_DEFAULT_LOCALE_URLS).find(([name]) => name === language)?.[1] } -async function loadLocaleCatalog(url: string): Promise> { +async function loadLocaleCatalog(language: string, url: string): Promise> { const response = await fetch(url, { cache: 'no-cache' }) if (!response.ok) { throw new Error(`Language catalog request failed: ${response.status}`) } - return response.json() + const categories = new Intl.PluralRules(language).resolvedOptions().pluralCategories + return withPluralCategoriesFromOther(await response.json(), categories) } const lazyLocaleBackend: BackendModule = { @@ -58,7 +59,7 @@ const lazyLocaleBackend: BackendModule = { callback(null, false) return } - loadLocaleCatalog(url).then( + loadLocaleCatalog(language, url).then( (catalog) => callback(null, catalog), (error) => callback(error instanceof Error ? error : new Error(String(error)), false) ) @@ -98,8 +99,12 @@ const getPluralRule = pluralResolver.getRule.bind(pluralResolver) pluralResolver.getRule = (code: string, options?: { ordinal?: boolean }) => getPluralRule(pluralLocaleByResourceLanguage.get(code) ?? code, options) +const PLURAL_SUFFIX_RE = /_(zero|one|two|few|many|other)$/ + export function translate(key: string, fallback: string, options?: TOptions): string { - const value = i18n.t(key, { defaultValue: fallback, ...options }) + // Callers name a literal `_one`/`_other` key for extraction; with a count, let CLDR pick the form. + const resolvedKey = typeof options?.count === 'number' ? key.replace(PLURAL_SUFFIX_RE, '') : key + const value = i18n.t(resolvedKey, { defaultValue: fallback, ...options }) return isPseudoLocalizationLocale(i18n.language) ? pseudoLocalizeString(value) : value } @@ -112,7 +117,7 @@ export async function loadRendererUiLanguage(language: UiLanguage): Promise pack.id === language)?.resourceLanguage ?? language } -// Packs translated from English often ship only _one/_other; reuse _other so few/many stay in-language. +// Catalogs translated from English often ship only _one/_other; reuse _other so few/many stay in-language. function withPluralCategoriesFromOther( catalog: Record, categories: readonly string[] diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 9a3294a5bfb..fd91d30fdd5 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -5374,7 +5374,7 @@ "loadedChangedPaths": "Loaded changed paths", "unresolvedConflict": "Unresolved conflict", "moreLoadedPaths": "and {{value0}} more loaded paths", - "changeCount_one": "1 uncommitted or untracked change", + "changeCount_one": "{{count}} uncommitted or untracked change", "changeCount_other": "{{count}} uncommitted or untracked changes", "changes": "Uncommitted or untracked changes" }, @@ -5403,11 +5403,11 @@ "294de4aeb2": "Show fewer", "collapseAriaLabel": "Collapse hidden worktrees for {{repo}}", "expandAriaLabel": "Expand hidden worktrees for {{repo}}", - "hiding_one": "Hiding 1 discovered worktree", + "hiding_one": "Hiding {{count}} discovered worktree", "hiding_other": "Hiding {{count}} discovered worktrees", - "hidingInRepo_one": "Hiding 1 discovered worktree in {{repo}}", + "hidingInRepo_one": "Hiding {{count}} discovered worktree in {{repo}}", "hidingInRepo_other": "Hiding {{count}} discovered worktrees in {{repo}}", - "keepHiddenAriaLabel_one": "Keep 1 discovered worktree hidden for {{repo}}; recover from the project menu", + "keepHiddenAriaLabel_one": "Keep {{count}} discovered worktree hidden for {{repo}}; recover from the project menu", "keepHiddenAriaLabel_other": "Keep {{count}} discovered worktrees hidden for {{repo}}; recover from the project menu", "keepHiddenTooltip": "Keep hidden - recover from the project menu", "repoOnHost": "{{repo}} on {{host}}" @@ -5502,7 +5502,7 @@ "d9f2db2738": "project's settings", "a5bb8c5135": "Saved in this", "savedSetupCommand": "Saved the setup command.", - "savedWithSkippedFields_one": "1 unsupported field skipped. Saved the setup command.", + "savedWithSkippedFields_one": "{{count}} unsupported field skipped. Saved the setup command.", "savedWithSkippedFields_other": "{{count}} unsupported fields skipped. Saved the setup command." }, "SetupScriptPromptCardViews": { @@ -6568,11 +6568,11 @@ "markUnread": "Mark unread" }, "workspaceBatchActionLabels": { - "deleteCount_one": "Delete 1 Workspace", + "deleteCount_one": "Delete {{count}} Workspace", "deleteCount_other": "Delete {{count}} Workspaces", "deleteSelected": "Delete Selected", "sleep": "Sleep", - "sleepCount_one": "Sleep 1 Workspace", + "sleepCount_one": "Sleep {{count}} Workspace", "sleepCount_other": "Sleep {{count}} Workspaces" }, "addRepoBusyLabels": { @@ -7433,7 +7433,7 @@ "choose_file": "Choose File", "choose_folder": "Choose Folder", "loading": "Loading Warp themes...", - "found_theme_one": "Found 1 theme", + "found_theme_one": "Found {{value0}} theme", "found_theme_other": "Found {{value0}} themes", "found_in_source": " in {{value0}}", "clear_all": "Clear all", @@ -7446,16 +7446,16 @@ "skipped_files": "Skipped files", "more_skipped_files": "{{value0}} more skipped files.", "cancel": "Cancel", - "import_theme_one": "Import 1 Theme", + "import_theme_one": "Import {{value0}} Theme", "import_theme_other": "Import {{value0}} Themes", "import_themes": "Import Themes" }, "useWarpThemeImport": { "unknown_error": "Unknown error", - "imported_one": "Imported 1 theme", + "imported_one": "Imported {{value0}} theme", "imported_other": "Imported {{value0}} themes", "import_failed": "Failed to import themes", - "over_limit_one": "Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect 1 new theme and try again.", + "over_limit_one": "Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect {{value1}} new theme and try again.", "over_limit_other": "Importing these themes would exceed the {{value0}} custom terminal theme limit. Deselect {{value1}} new themes and try again." }, "YamlThemeImportButton": { @@ -10777,7 +10777,7 @@ "readyTitle": "Computer Use is ready.", "readyDescription": "Agents can inspect and operate app windows when you ask.", "permissionsTitle": "Finish setup to use local apps.", - "permissionsRequired_one": "1 permission required before agents can operate app windows.", + "permissionsRequired_one": "{{value0}} permission required before agents can operate app windows.", "permissionsRequired_other": "{{value0}} permissions required before agents can operate app windows." }, "providerAccountScope": { diff --git a/src/renderer/src/i18n/locales/es.json b/src/renderer/src/i18n/locales/es.json index 31a0c4696eb..5b56393279f 100644 --- a/src/renderer/src/i18n/locales/es.json +++ b/src/renderer/src/i18n/locales/es.json @@ -5067,7 +5067,7 @@ "loadedChangedPaths": "Rutas modificadas cargadas", "unresolvedConflict": "Conflicto sin resolver", "moreLoadedPaths": "y {{value0}} rutas cargadas más", - "changeCount_one": "1 cambio sin confirmar o sin seguimiento", + "changeCount_one": "{{count}} cambio sin confirmar o sin seguimiento", "changeCount_other": "{{count}} cambios sin confirmar o sin seguimiento", "changes": "Cambios sin confirmar o sin seguimiento" }, @@ -5096,11 +5096,11 @@ "294de4aeb2": "Mostrar menos", "collapseAriaLabel": "Contraer worktrees ocultos de {{repo}}", "expandAriaLabel": "Expandir worktrees ocultos de {{repo}}", - "hiding_one": "Ocultando 1 worktree detectado", + "hiding_one": "Ocultando {{count}} worktree detectado", "hiding_other": "Ocultando {{count}} worktrees detectados", - "hidingInRepo_one": "Ocultando 1 worktree detectado en {{repo}}", + "hidingInRepo_one": "Ocultando {{count}} worktree detectado en {{repo}}", "hidingInRepo_other": "Ocultando {{count}} worktrees detectados en {{repo}}", - "keepHiddenAriaLabel_one": "Mantener oculto 1 worktree detectado de {{repo}}; recupéralo desde el menú del proyecto", + "keepHiddenAriaLabel_one": "Mantener oculto {{count}} worktree detectado de {{repo}}; recupéralo desde el menú del proyecto", "keepHiddenAriaLabel_other": "Mantener ocultos {{count}} worktrees detectados de {{repo}}; recupéralos desde el menú del proyecto", "keepHiddenTooltip": "Mantener oculto: recupéralo desde el menú del proyecto", "repoOnHost": "{{repo}} en {{host}}" @@ -5195,7 +5195,7 @@ "d9f2db2738": "ajustes del proyecto", "a5bb8c5135": "Guardado en este", "savedSetupCommand": "Se guardó el comando de configuración.", - "savedWithSkippedFields_one": "Se omitió 1 campo no compatible. Se guardó el comando de configuración.", + "savedWithSkippedFields_one": "Se omitió {{count}} campo no compatible. Se guardó el comando de configuración.", "savedWithSkippedFields_other": "Se omitieron {{count}} campos no compatibles. Se guardó el comando de configuración." }, "SetupScriptPromptCardViews": { @@ -6277,11 +6277,11 @@ "markUnread": "Marcar como no leído" }, "workspaceBatchActionLabels": { - "deleteCount_one": "Eliminar 1 espacio de trabajo", + "deleteCount_one": "Eliminar {{count}} espacio de trabajo", "deleteCount_other": "Eliminar {{count}} espacios de trabajo", "deleteSelected": "Eliminar seleccionados", "sleep": "Suspender", - "sleepCount_one": "Suspender 1 espacio de trabajo", + "sleepCount_one": "Suspender {{count}} espacio de trabajo", "sleepCount_other": "Suspender {{count}} espacios de trabajo" }, "addRepoBusyLabels": { @@ -10344,7 +10344,7 @@ "choose_file": "Elegir archivo", "choose_folder": "Elegir carpeta", "loading": "Cargando temas de Warp...", - "found_theme_one": "Se encontró 1 tema", + "found_theme_one": "Se encontró {{value0}} tema", "found_theme_other": "Se encontraron {{value0}} temas", "found_in_source": " en {{value0}}", "clear_all": "Borrar selección", @@ -10357,16 +10357,16 @@ "skipped_files": "Archivos omitidos", "more_skipped_files": "{{value0}} archivos omitidos más.", "cancel": "Cancelar", - "import_theme_one": "Importar 1 tema", + "import_theme_one": "Importar {{value0}} tema", "import_theme_other": "Importar {{value0}} temas", "import_themes": "Importar temas" }, "useWarpThemeImport": { "unknown_error": "Error desconocido", - "imported_one": "Se importó 1 tema", + "imported_one": "Se importó {{value0}} tema", "imported_other": "Se importaron {{value0}} temas", "import_failed": "No se pudieron importar los temas", - "over_limit_one": "Importar estos temas superaría el límite de {{value0}} temas personalizados de terminal. Deselecciona 1 tema nuevo e inténtalo de nuevo.", + "over_limit_one": "Importar estos temas superaría el límite de {{value0}} temas personalizados de terminal. Deselecciona {{value1}} tema nuevo e inténtalo de nuevo.", "over_limit_other": "Importar estos temas superaría el límite de {{value0}} temas personalizados de terminal. Deselecciona {{value1}} temas nuevos e inténtalo de nuevo." }, "YamlThemeImportButton": { @@ -10484,7 +10484,7 @@ } }, "computerUseSummary": { - "permissionsRequired_one": "Se requiere 1 permiso antes de que los agentes puedan operar ventanas de apps.", + "permissionsRequired_one": "Se requiere {{value0}} permiso antes de que los agentes puedan operar ventanas de apps.", "permissionsRequired_other": "Se requieren {{value0}} permisos antes de que los agentes puedan operar ventanas de apps.", "checkingTitle": "Comprobando el acceso a Computer Use.", "checkingDescription": "Orca está comprobando los permisos de privacidad de macOS para el helper de Computer Use.", diff --git a/src/renderer/src/i18n/locales/fr.json b/src/renderer/src/i18n/locales/fr.json index 34e55bfb01c..9d324d0c854 100644 --- a/src/renderer/src/i18n/locales/fr.json +++ b/src/renderer/src/i18n/locales/fr.json @@ -5259,7 +5259,7 @@ "loadedChangedPaths": "Chemins modifiés chargés", "unresolvedConflict": "Conflit non résolu", "moreLoadedPaths": "et {{value0}} autres chemins chargés", - "changeCount_one": "1 modification non commitée ou non suivie", + "changeCount_one": "{{count}} modification non commitée ou non suivie", "changeCount_other": "{{count}} modifications non commitées ou non suivies", "changes": "Modifications non commitées ou non suivies" }, @@ -5288,11 +5288,11 @@ "294de4aeb2": "Afficher moins", "collapseAriaLabel": "Réduire les worktrees masqués de {{repo}}", "expandAriaLabel": "Développer les worktrees masqués de {{repo}}", - "hiding_one": "1 worktree détecté masqué", + "hiding_one": "{{count}} worktree détecté masqué", "hiding_other": "{{count}} worktrees détectés masqués", - "hidingInRepo_one": "1 worktree détecté masqué dans {{repo}}", + "hidingInRepo_one": "{{count}} worktree détecté masqué dans {{repo}}", "hidingInRepo_other": "{{count}} worktrees détectés masqués dans {{repo}}", - "keepHiddenAriaLabel_one": "Garder 1 worktree détecté masqué pour {{repo}} ; récupérez-le depuis le menu du projet", + "keepHiddenAriaLabel_one": "Garder {{count}} worktree détecté masqué pour {{repo}} ; récupérez-le depuis le menu du projet", "keepHiddenAriaLabel_other": "Garder {{count}} worktrees détectés masqués pour {{repo}} ; récupérez-les depuis le menu du projet", "keepHiddenTooltip": "Garder masqué - récupérable depuis le menu du projet", "repoOnHost": "{{repo}} sur {{host}}" @@ -5387,7 +5387,7 @@ "d9f2db2738": "paramètres du projet", "a5bb8c5135": "Enregistré dans les", "savedSetupCommand": "Commande de setup enregistrée.", - "savedWithSkippedFields_one": "1 champ non pris en charge ignoré. Commande de setup enregistrée.", + "savedWithSkippedFields_one": "{{count}} champ non pris en charge ignoré. Commande de setup enregistrée.", "savedWithSkippedFields_other": "{{count}} champs non pris en charge ignorés. Commande de setup enregistrée." }, "SetupScriptPromptCardViews": { @@ -6454,11 +6454,11 @@ "markUnread": "Marquer comme non lu" }, "workspaceBatchActionLabels": { - "deleteCount_one": "Supprimer 1 espace de travail", + "deleteCount_one": "Supprimer {{count}} espace de travail", "deleteCount_other": "Supprimer {{count}} espaces de travail", "deleteSelected": "Supprimer la sélection", "sleep": "Mettre en veille", - "sleepCount_one": "Mettre en veille 1 espace de travail", + "sleepCount_one": "Mettre en veille {{count}} espace de travail", "sleepCount_other": "Mettre en veille {{count}} espaces de travail" }, "addRepoBusyLabels": { @@ -7319,7 +7319,7 @@ "choose_file": "Choisir un fichier", "choose_folder": "Choisir un dossier", "loading": "Chargement des thèmes Warp...", - "found_theme_one": "1 thème trouvé", + "found_theme_one": "{{value0}} thème trouvé", "found_theme_other": "{{value0}} thèmes trouvés", "found_in_source": " dans {{value0}}", "clear_all": "Tout effacer", @@ -7332,16 +7332,16 @@ "skipped_files": "Fichiers ignorés", "more_skipped_files": "{{value0}} autres fichiers ignorés.", "cancel": "Annuler", - "import_theme_one": "Importer 1 thème", + "import_theme_one": "Importer {{value0}} thème", "import_theme_other": "Importer {{value0}} thèmes", "import_themes": "Importer des thèmes" }, "useWarpThemeImport": { "unknown_error": "Erreur inconnue", - "imported_one": "1 thème importé", + "imported_one": "{{value0}} thème importé", "imported_other": "{{value0}} thèmes importés", "import_failed": "Échec de l'importation des thèmes", - "over_limit_one": "Importer ces thèmes dépasserait la limite de {{value0}} thèmes de terminal personnalisés. Désélectionnez 1 nouveau thème et réessayez.", + "over_limit_one": "Importer ces thèmes dépasserait la limite de {{value0}} thèmes de terminal personnalisés. Désélectionnez {{value1}} nouveau thème et réessayez.", "over_limit_other": "Importer ces thèmes dépasserait la limite de {{value0}} thèmes de terminal personnalisés. Désélectionnez {{value1}} nouveaux thèmes et réessayez." }, "YamlThemeImportButton": { @@ -10658,7 +10658,7 @@ "readyTitle": "Computer Use est prêt.", "readyDescription": "Les agents peuvent inspecter et manipuler des fenêtres d'applications à votre demande.", "permissionsTitle": "Terminez la configuration pour utiliser les applications locales.", - "permissionsRequired_one": "1 autorisation requise avant que les agents puissent manipuler des fenêtres d'applications.", + "permissionsRequired_one": "{{value0}} autorisation requise avant que les agents puissent manipuler des fenêtres d'applications.", "permissionsRequired_other": "{{value0}} autorisations requises avant que les agents puissent manipuler des fenêtres d'applications." }, "providerAccountScope": { diff --git a/src/renderer/src/i18n/locales/ja.json b/src/renderer/src/i18n/locales/ja.json index 4dc24ece62f..ed6be79b5ba 100644 --- a/src/renderer/src/i18n/locales/ja.json +++ b/src/renderer/src/i18n/locales/ja.json @@ -5033,7 +5033,7 @@ "loadedChangedPaths": "読み込まれた変更済みパス", "unresolvedConflict": "未解決の競合", "moreLoadedPaths": "ほかに読み込まれたパスが{{value0}}件", - "changeCount_one": "未コミットまたは未追跡の変更: 1 件", + "changeCount_one": "未コミットまたは未追跡の変更: {{count}} 件", "changeCount_other": "未コミットまたは未追跡の変更: {{count}} 件", "changes": "未コミットまたは未追跡の変更があります" }, @@ -5062,11 +5062,11 @@ "294de4aeb2": "表示数を減らす", "collapseAriaLabel": "{{repo}} の非表示のワークツリー一覧を折りたたむ", "expandAriaLabel": "{{repo}} の非表示のワークツリー一覧を展開", - "hiding_one": "1 件のワークツリーを非表示中", + "hiding_one": "{{count}} 件のワークツリーを非表示中", "hiding_other": "{{count}} 件のワークツリーを非表示中", - "hidingInRepo_one": "{{repo}} の 1 件のワークツリーを非表示中", + "hidingInRepo_one": "{{repo}} の {{count}} 件のワークツリーを非表示中", "hidingInRepo_other": "{{repo}} の {{count}} 件のワークツリーを非表示中", - "keepHiddenAriaLabel_one": "{{repo}} で検出されたワークツリー 1 件を非表示のままにする(プロジェクトメニューから再表示できます)", + "keepHiddenAriaLabel_one": "{{repo}} で検出されたワークツリー {{count}} 件を非表示のままにする(プロジェクトメニューから再表示できます)", "keepHiddenAriaLabel_other": "{{repo}} で検出されたワークツリー {{count}} 件を非表示のままにする(プロジェクトメニューから再表示できます)", "keepHiddenTooltip": "非表示のままにする(プロジェクトメニューから再表示できます)", "repoOnHost": "{{repo}}({{host}})" @@ -5161,7 +5161,7 @@ "d9f2db2738": "プロジェクトの設定", "a5bb8c5135": "これに保存されました", "savedSetupCommand": "セットアップコマンドを保存しました。", - "savedWithSkippedFields_one": "未対応の項目を 1 件スキップしました。セットアップコマンドを保存しました。", + "savedWithSkippedFields_one": "未対応の項目を {{count}} 件スキップしました。セットアップコマンドを保存しました。", "savedWithSkippedFields_other": "未対応の項目を {{count}} 件スキップしました。セットアップコマンドを保存しました。" }, "SetupScriptPromptCardViews": { @@ -6261,11 +6261,11 @@ "markUnread": "未読にする" }, "workspaceBatchActionLabels": { - "deleteCount_one": "1 件のワークスペースを削除", + "deleteCount_one": "{{count}} 件のワークスペースを削除", "deleteCount_other": "{{count}} 件のワークスペースを削除", "deleteSelected": "選択した項目を削除", "sleep": "スリープ", - "sleepCount_one": "1 件のワークスペースをスリープ", + "sleepCount_one": "{{count}} 件のワークスペースをスリープ", "sleepCount_other": "{{count}} 件のワークスペースをスリープ" }, "addRepoBusyLabels": { @@ -7111,7 +7111,7 @@ "choose_file": "ファイルを選択", "choose_folder": "フォルダーを選択", "loading": "Warp テーマを読み込み中…", - "found_theme_one": "1 件のテーマが見つかりました", + "found_theme_one": "{{value0}} 件のテーマが見つかりました", "found_theme_other": "{{value0}} 件のテーマが見つかりました", "found_in_source": "({{value0}})", "clear_all": "すべてクリア", @@ -7124,16 +7124,16 @@ "skipped_files": "スキップされたファイル", "more_skipped_files": "他 {{value0}} 件のファイルがスキップされました。", "cancel": "キャンセル", - "import_theme_one": "1 件のテーマをインポート", + "import_theme_one": "{{value0}} 件のテーマをインポート", "import_theme_other": "{{value0}} 件のテーマをインポート", "import_themes": "テーマをインポート" }, "useWarpThemeImport": { "unknown_error": "不明なエラー", - "imported_one": "1 件のテーマをインポートしました", + "imported_one": "{{value0}} 件のテーマをインポートしました", "imported_other": "{{value0}} 件のテーマをインポートしました", "import_failed": "テーマのインポートに失敗しました", - "over_limit_one": "これらのテーマをインポートすると、カスタムターミナルテーマの上限({{value0}} 件)を超えます。新規テーマを 1 件選択解除して、もう一度お試しください。", + "over_limit_one": "これらのテーマをインポートすると、カスタムターミナルテーマの上限({{value0}} 件)を超えます。新規テーマを {{value1}} 件選択解除して、もう一度お試しください。", "over_limit_other": "これらのテーマをインポートすると、カスタムターミナルテーマの上限({{value0}} 件)を超えます。新規テーマを {{value1}} 件選択解除して、もう一度お試しください。" }, "YamlThemeImportButton": { @@ -10468,7 +10468,7 @@ } }, "computerUseSummary": { - "permissionsRequired_one": "Agent がアプリのウィンドウを操作するには、1 件の権限が必要です。", + "permissionsRequired_one": "Agent がアプリのウィンドウを操作するには、{{value0}} 件の権限が必要です。", "permissionsRequired_other": "Agent がアプリのウィンドウを操作するには、{{value0}} 件の権限が必要です。", "checkingTitle": "コンピュータ操作へのアクセスを確認しています。", "checkingDescription": "Orca が、コンピュータ操作ヘルパーの macOS プライバシー権限を確認しています。", diff --git a/src/renderer/src/i18n/locales/ko.json b/src/renderer/src/i18n/locales/ko.json index c161a95db84..d75f5b7a55c 100644 --- a/src/renderer/src/i18n/locales/ko.json +++ b/src/renderer/src/i18n/locales/ko.json @@ -5033,7 +5033,7 @@ "loadedChangedPaths": "불러온 변경된 경로", "unresolvedConflict": "해결되지 않은 충돌", "moreLoadedPaths": "불러온 경로 {{value0}}개 더", - "changeCount_one": "커밋되지 않았거나 추적되지 않는 변경 1개", + "changeCount_one": "커밋되지 않았거나 추적되지 않는 변경 {{count}}개", "changeCount_other": "커밋되지 않았거나 추적되지 않는 변경 {{count}}개", "changes": "커밋되지 않았거나 추적되지 않는 변경 사항" }, @@ -5062,11 +5062,11 @@ "294de4aeb2": "간략히 표시", "collapseAriaLabel": "{{repo}}의 숨겨진 워크트리 접기", "expandAriaLabel": "{{repo}}의 숨겨진 워크트리 펼치기", - "hiding_one": "발견된 워크트리 1개 숨김", + "hiding_one": "발견된 워크트리 {{count}}개 숨김", "hiding_other": "발견된 워크트리 {{count}}개 숨김", - "hidingInRepo_one": "{{repo}}에서 발견된 워크트리 1개 숨김", + "hidingInRepo_one": "{{repo}}에서 발견된 워크트리 {{count}}개 숨김", "hidingInRepo_other": "{{repo}}에서 발견된 워크트리 {{count}}개 숨김", - "keepHiddenAriaLabel_one": "{{repo}}에서 발견된 워크트리 1개를 숨김 상태로 유지합니다. 프로젝트 메뉴에서 복구할 수 있습니다", + "keepHiddenAriaLabel_one": "{{repo}}에서 발견된 워크트리 {{count}}개를 숨김 상태로 유지합니다. 프로젝트 메뉴에서 복구할 수 있습니다", "keepHiddenAriaLabel_other": "{{repo}}에서 발견된 워크트리 {{count}}개를 숨김 상태로 유지합니다. 프로젝트 메뉴에서 복구할 수 있습니다", "keepHiddenTooltip": "숨김 유지 - 프로젝트 메뉴에서 복구", "repoOnHost": "{{host}}의 {{repo}}" @@ -5161,7 +5161,7 @@ "d9f2db2738": "프로젝트 설정", "a5bb8c5135": "여기에 저장됨", "savedSetupCommand": "설정 명령을 저장했습니다.", - "savedWithSkippedFields_one": "지원되지 않는 필드 1개를 건너뛰었습니다. 설정 명령을 저장했습니다.", + "savedWithSkippedFields_one": "지원되지 않는 필드 {{count}}개를 건너뛰었습니다. 설정 명령을 저장했습니다.", "savedWithSkippedFields_other": "지원되지 않는 필드 {{count}}개를 건너뛰었습니다. 설정 명령을 저장했습니다." }, "SetupScriptPromptCardViews": { @@ -6261,11 +6261,11 @@ "markUnread": "읽지 않음으로 표시" }, "workspaceBatchActionLabels": { - "deleteCount_one": "워크스페이스 1개 삭제", + "deleteCount_one": "워크스페이스 {{count}}개 삭제", "deleteCount_other": "워크스페이스 {{count}}개 삭제", "deleteSelected": "선택 항목 삭제", "sleep": "슬립", - "sleepCount_one": "워크스페이스 1개 슬립", + "sleepCount_one": "워크스페이스 {{count}}개 슬립", "sleepCount_other": "워크스페이스 {{count}}개 슬립" }, "addRepoBusyLabels": { @@ -10328,7 +10328,7 @@ "choose_file": "파일 선택", "choose_folder": "폴더 선택", "loading": "Warp 테마 로드 중...", - "found_theme_one": "테마 1개를 찾았습니다.", + "found_theme_one": "테마 {{value0}}개를 찾았습니다.", "found_theme_other": "테마 {{value0}}개를 찾았습니다.", "found_in_source": "{{value0}}에서", "clear_all": "모두 지우기", @@ -10341,16 +10341,16 @@ "skipped_files": "건너뛴 파일", "more_skipped_files": "건너뛴 파일 {{value0}}개 더 있음", "cancel": "취소", - "import_theme_one": "테마 1개 가져오기", + "import_theme_one": "테마 {{value0}}개 가져오기", "import_theme_other": "테마 {{value0}}개 가져오기", "import_themes": "테마 가져오기" }, "useWarpThemeImport": { "unknown_error": "알 수 없는 오류", - "imported_one": "테마 1개를 가져왔습니다.", + "imported_one": "테마 {{value0}}개를 가져왔습니다.", "imported_other": "테마 {{value0}}개를 가져왔습니다.", "import_failed": "테마를 가져오지 못했습니다.", - "over_limit_one": "이 테마를 가져오면 사용자 지정 터미널 테마 {{value0}}개 제한을 초과합니다. 새 테마 1개를 선택 해제하고 다시 시도하세요.", + "over_limit_one": "이 테마를 가져오면 사용자 지정 터미널 테마 {{value0}}개 제한을 초과합니다. 새 테마 {{value1}}개를 선택 해제하고 다시 시도하세요.", "over_limit_other": "이 테마들을 가져오면 사용자 지정 터미널 테마 {{value0}}개 제한을 초과합니다. 새 테마 {{value1}}개를 선택 해제하고 다시 시도하세요." }, "YamlThemeImportButton": { @@ -10468,7 +10468,7 @@ } }, "computerUseSummary": { - "permissionsRequired_one": "agents가 앱 창을 조작하려면 먼저 1 권한이 필요합니다.", + "permissionsRequired_one": "agents가 앱 창을 조작하려면 먼저 {{value0}} 권한이 필요합니다.", "permissionsRequired_other": "agents가 앱 창을 조작하려면 먼저 {{value0}} 권한이 필요합니다.", "checkingTitle": "Computer Use 액세스 확인 중입니다.", "checkingDescription": "Orca가 Computer Use 도우미의 macOS 개인정보 보호 권한을 확인하고 있습니다.", diff --git a/src/renderer/src/i18n/locales/pt.json b/src/renderer/src/i18n/locales/pt.json index c4b41c2dac5..66fd85de772 100644 --- a/src/renderer/src/i18n/locales/pt.json +++ b/src/renderer/src/i18n/locales/pt.json @@ -6007,7 +6007,7 @@ "choose_file": "Escolher Arquivo", "choose_folder": "Escolher Pasta", "loading": "Carregando temas do Warp...", - "found_theme_one": "1 tema encontrado", + "found_theme_one": "{{value0}} tema encontrado", "found_theme_other": "{{value0}} temas encontrados", "found_in_source": " em {{value0}}", "clear_all": "Limpar tudo", @@ -6020,7 +6020,7 @@ "skipped_files": "Arquivos ignorados", "more_skipped_files": "mais {{value0}} arquivos ignorados.", "cancel": "Cancelar", - "import_theme_one": "Importar 1 Tema", + "import_theme_one": "Importar {{value0}} Tema", "import_theme_other": "Importar {{value0}} Temas", "import_themes": "Importar Temas" }, @@ -7442,7 +7442,7 @@ "readyTitle": "O Uso do Computador está pronto.", "readyDescription": "Os agentes podem inspecionar e operar janelas de apps quando você solicitar.", "permissionsTitle": "Conclua a configuração para usar apps locais.", - "permissionsRequired_one": "1 permissão é necessária antes que os agentes possam operar janelas de apps.", + "permissionsRequired_one": "{{value0}} permissão é necessária antes que os agentes possam operar janelas de apps.", "permissionsRequired_other": "{{value0}} permissões são necessárias antes que os agentes possam operar janelas de apps." }, "LinearAgentSkillPane": { @@ -7652,10 +7652,10 @@ }, "useWarpThemeImport": { "unknown_error": "Erro desconhecido", - "imported_one": "1 tema importado", + "imported_one": "{{value0}} tema importado", "imported_other": "{{value0}} temas importados", "import_failed": "Falha ao importar temas", - "over_limit_one": "Importar estes temas excederia o limite de {{value0}} temas de terminal personalizados. Desmarque 1 tema novo e tente novamente.", + "over_limit_one": "Importar estes temas excederia o limite de {{value0}} temas de terminal personalizados. Desmarque {{value1}} tema novo e tente novamente.", "over_limit_other": "Importar estes temas excederia o limite de {{value0}} temas de terminal personalizados. Desmarque {{value1}} temas novos e tente novamente." }, "ManageSessionKillDialog": { @@ -10879,11 +10879,11 @@ "294de4aeb2": "Mostrar menos", "collapseAriaLabel": "Recolher worktrees ocultas de {{repo}}", "expandAriaLabel": "Expandir worktrees ocultas de {{repo}}", - "hiding_one": "Ocultando 1 worktree descoberta", + "hiding_one": "Ocultando {{count}} worktree descoberta", "hiding_other": "Ocultando {{count}} worktrees descobertas", - "hidingInRepo_one": "Ocultando 1 worktree descoberta em {{repo}}", + "hidingInRepo_one": "Ocultando {{count}} worktree descoberta em {{repo}}", "hidingInRepo_other": "Ocultando {{count}} worktrees descobertas em {{repo}}", - "keepHiddenAriaLabel_one": "Manter 1 worktree descoberta oculta para {{repo}}; recupere-a pelo menu do projeto", + "keepHiddenAriaLabel_one": "Manter {{count}} worktree descoberta oculta para {{repo}}; recupere-a pelo menu do projeto", "keepHiddenAriaLabel_other": "Manter {{count}} worktrees descobertas ocultas para {{repo}}; recupere-as pelo menu do projeto", "keepHiddenTooltip": "Manter oculto - recupere pelo menu do projeto", "repoOnHost": "{{repo}} em {{host}}" @@ -10999,7 +10999,7 @@ "d9f2db2738": "configurações do projeto", "a5bb8c5135": "Salvo nestas", "savedSetupCommand": "O comando de configuração foi salvo.", - "savedWithSkippedFields_one": "1 campo não compatível foi ignorado. O comando de configuração foi salvo.", + "savedWithSkippedFields_one": "{{count}} campo não compatível foi ignorado. O comando de configuração foi salvo.", "savedWithSkippedFields_other": "{{count}} campos não compatíveis foram ignorados. O comando de configuração foi salvo." }, "FolderWorkspaceComposerDialog": { @@ -11276,7 +11276,7 @@ "loadedChangedPaths": "Caminhos alterados carregados", "unresolvedConflict": "Conflito não resolvido", "moreLoadedPaths": "e mais {{value0}} caminhos carregados", - "changeCount_one": "1 alteração não commitada ou não rastreada", + "changeCount_one": "{{count}} alteração não commitada ou não rastreada", "changeCount_other": "{{count}} alterações não commitadas ou não rastreadas", "changes": "Alterações não commitadas ou não rastreadas" }, @@ -11393,11 +11393,11 @@ "markUnread": "Marcar como não lido" }, "workspaceBatchActionLabels": { - "deleteCount_one": "Excluir 1 Espaço de Trabalho", + "deleteCount_one": "Excluir {{count}} Espaço de Trabalho", "deleteCount_other": "Excluir {{count}} Espaços de Trabalho", "deleteSelected": "Excluir Selecionados", "sleep": "Suspender", - "sleepCount_one": "Suspender 1 Espaço de Trabalho", + "sleepCount_one": "Suspender {{count}} Espaço de Trabalho", "sleepCount_other": "Suspender {{count}} Espaços de Trabalho" }, "addRepoBusyLabels": { diff --git a/src/renderer/src/i18n/locales/zh.json b/src/renderer/src/i18n/locales/zh.json index 5c0b7b5dece..b92aa81295d 100644 --- a/src/renderer/src/i18n/locales/zh.json +++ b/src/renderer/src/i18n/locales/zh.json @@ -5033,7 +5033,7 @@ "loadedChangedPaths": "已加载的更改路径", "unresolvedConflict": "未解决的冲突", "moreLoadedPaths": "以及另外 {{value0}} 个已加载的路径", - "changeCount_one": "1 处未提交或未跟踪的更改", + "changeCount_one": "{{count}} 处未提交或未跟踪的更改", "changeCount_other": "{{count}} 处未提交或未跟踪的更改", "changes": "未提交或未跟踪的更改" }, @@ -5062,11 +5062,11 @@ "294de4aeb2": "显示较少", "collapseAriaLabel": "折叠 {{repo}} 的隐藏工作树", "expandAriaLabel": "展开 {{repo}} 的隐藏工作树", - "hiding_one": "已隐藏 1 个检测到的工作树", + "hiding_one": "已隐藏 {{count}} 个检测到的工作树", "hiding_other": "已隐藏 {{count}} 个检测到的工作树", - "hidingInRepo_one": "已隐藏 {{repo}} 中的 1 个检测到的工作树", + "hidingInRepo_one": "已隐藏 {{repo}} 中的 {{count}} 个检测到的工作树", "hidingInRepo_other": "已隐藏 {{repo}} 中的 {{count}} 个检测到的工作树", - "keepHiddenAriaLabel_one": "为 {{repo}} 保留 1 个检测到的工作树为隐藏状态;可从项目菜单恢复", + "keepHiddenAriaLabel_one": "为 {{repo}} 保留 {{count}} 个检测到的工作树为隐藏状态;可从项目菜单恢复", "keepHiddenAriaLabel_other": "为 {{repo}} 保留 {{count}} 个检测到的工作树为隐藏状态;可从项目菜单恢复", "keepHiddenTooltip": "保持隐藏 - 从项目菜单恢复", "repoOnHost": "{{host}} 上的 {{repo}}" @@ -5161,7 +5161,7 @@ "d9f2db2738": "项目的设置", "a5bb8c5135": "保存在这个", "savedSetupCommand": "已保存设置命令。", - "savedWithSkippedFields_one": "已跳过 1 个不受支持的字段。设置命令已保存。", + "savedWithSkippedFields_one": "已跳过 {{count}} 个不受支持的字段。设置命令已保存。", "savedWithSkippedFields_other": "已跳过 {{count}} 个不受支持的字段。设置命令已保存。" }, "SetupScriptPromptCardViews": { @@ -6261,11 +6261,11 @@ "markUnread": "标为未读" }, "workspaceBatchActionLabels": { - "deleteCount_one": "删除 1 个工作区", + "deleteCount_one": "删除 {{count}} 个工作区", "deleteCount_other": "删除 {{count}} 个工作区", "deleteSelected": "删除所选", "sleep": "休眠", - "sleepCount_one": "休眠 1 个工作区", + "sleepCount_one": "休眠 {{count}} 个工作区", "sleepCount_other": "休眠 {{count}} 个工作区" }, "addRepoBusyLabels": { @@ -10328,7 +10328,7 @@ "choose_file": "选择文件", "choose_folder": "选择文件夹", "loading": "正在加载 Warp 主题...", - "found_theme_one": "找到 1 个主题", + "found_theme_one": "找到 {{value0}} 个主题", "found_theme_other": "找到 {{value0}} 个主题", "found_in_source": " 位于 {{value0}}", "clear_all": "全部清除", @@ -10341,16 +10341,16 @@ "skipped_files": "已跳过文件", "more_skipped_files": "还有 {{value0}} 个已跳过的文件。", "cancel": "取消", - "import_theme_one": "导入 1 个主题", + "import_theme_one": "导入 {{value0}} 个主题", "import_theme_other": "导入 {{value0}} 个主题", "import_themes": "导入主题" }, "useWarpThemeImport": { "unknown_error": "未知错误", - "imported_one": "已导入 1 个主题", + "imported_one": "已导入 {{value0}} 个主题", "imported_other": "已导入 {{value0}} 个主题", "import_failed": "导入主题失败", - "over_limit_one": "导入这些主题会超出 {{value0}} 个自定义终端主题的上限。请取消选择 1 个新主题后重试。", + "over_limit_one": "导入这些主题会超出 {{value0}} 个自定义终端主题的上限。请取消选择 {{value1}} 个新主题后重试。", "over_limit_other": "导入这些主题会超出 {{value0}} 个自定义终端主题的上限。请取消选择 {{value1}} 个新主题后重试。" }, "YamlThemeImportButton": { @@ -10468,7 +10468,7 @@ } }, "computerUseSummary": { - "permissionsRequired_one": "在智能体可操作应用窗口前需要 1 项权限。", + "permissionsRequired_one": "在智能体可操作应用窗口前需要 {{value0}} 项权限。", "permissionsRequired_other": "在智能体可操作应用窗口前需要 {{value0}} 项权限。", "checkingTitle": "正在检查计算机控制访问权限。", "checkingDescription": "Orca 正在检查计算机控制助手的 macOS 隐私权限。", diff --git a/src/renderer/src/i18n/plugin-pack-plurals.test.ts b/src/renderer/src/i18n/plugin-pack-plurals.test.ts index c8abbfc5231..1011b6425d1 100644 --- a/src/renderer/src/i18n/plugin-pack-plurals.test.ts +++ b/src/renderer/src/i18n/plugin-pack-plurals.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it } from 'vitest' -import { i18n, setRendererPluginLanguagePacks } from './i18n' +import { i18n, setRendererPluginLanguagePacks, translate } from './i18n' import { pluginLanguageResourceId } from '../../../shared/plugins/plugin-language-pack-artifact' import { DEFAULT_LOCALE } from './supported-languages' @@ -42,4 +42,13 @@ describe('plugin pack plurals', () => { await activatePack('ru-RU', { files_one: 'one', files_other: 'other' }) expect(forms([1, 2, 5, 21])).toEqual(['one', 'other', 'other', 'one']) }) + + it('resolves literal _one/_other call sites through the pack locale plural rules', async () => { + const label = (count: number): string => + count === 1 + ? translate('files_one', '{{count}} file', { count }) + : translate('files_other', '{{count}} files', { count }) + await activatePack('ru-RU') + expect([1, 2, 5, 21].map(label)).toEqual(['one', 'few', 'many', 'one']) + }) })