fix(i18n): resolve count strings with each language's plural rules (#34693)

* fix(i18n): resolve count strings with each language's plural rules

translate() now resolves a literal _one/_other key passed a numeric count
through its plural family, so i18next picks the CLDR form for the active
language or plugin pack. Built-in catalogs fill missing plural categories
(e.g. many in es/fr/pt) from _other so large counts stay in-language.
_one strings that hardcoded 1 now interpolate the count.

Closes #12106

* fix(i18n): pass value0 to fullCoverage_one so one-form languages interpolate the count

Languages with a single plural category (ja/ko/zh) now resolve count 1 to fullCoverage_other, which interpolates {{value0}}.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
This commit is contained in:
OrcaWin
2026-10-27 20:51:09 -07:00
committed by GitHub
co-authored by OrcaWin
parent ea6c69be9a
commit 2db73d5e47
19 changed files with 146 additions and 127 deletions
@@ -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 }
)
}
@@ -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(() => {
@@ -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) {
@@ -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',
@@ -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.
@@ -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(
@@ -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(
@@ -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(
@@ -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(
+12 -12
View File
@@ -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"
}
},
+11 -6
View File
@@ -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<Record<string, unknown>> {
async function loadLocaleCatalog(language: string, url: string): Promise<Record<string, unknown>> {
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<stri
: resourceLanguage
const url = localeCatalogUrl(locale)
if (url && !i18n.hasResourceBundle(locale, 'translation')) {
const catalog = await withTimeout(loadLocaleCatalog(url), 5000, null)
const catalog = await withTimeout(loadLocaleCatalog(locale, url), 5000, null)
if (catalog === null) {
throw new Error('Language catalog unavailable')
}
@@ -154,7 +159,7 @@ export function resolveRendererResourceLanguage(language: string): string {
return pluginLanguagePacks.find((pack) => 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<string, unknown>,
categories: readonly string[]
+12 -12
View File
@@ -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": {
+12 -12
View File
@@ -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.",
+12 -12
View File
@@ -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": {
+12 -12
View File
@@ -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 プライバシー権限を確認しています。",
+12 -12
View File
@@ -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 개인정보 보호 권한을 확인하고 있습니다.",
+12 -12
View File
@@ -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": {
+12 -12
View File
@@ -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 隐私权限。",
@@ -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'])
})
})