diff --git a/packages/cli/src/commands/extensions/disable.ts b/packages/cli/src/commands/extensions/disable.ts index 35be4aa8c..92ebd6fa8 100644 --- a/packages/cli/src/commands/extensions/disable.ts +++ b/packages/cli/src/commands/extensions/disable.ts @@ -8,6 +8,7 @@ import { type CommandModule } from 'yargs'; import { SettingScope } from '../../config/settings.js'; import { getErrorMessage } from '../../utils/errors.js'; import { getExtensionManager } from './utils.js'; +import { t } from '../../i18n/index.js'; interface DisableArgs { name: string; @@ -23,7 +24,10 @@ export async function handleDisable(args: DisableArgs) { extensionManager.disableExtension(args.name, SettingScope.User); } console.log( - `Extension "${args.name}" successfully disabled for scope "${args.scope}".`, + t('Extension "{{name}}" successfully disabled for scope "{{scope}}".', { + name: args.name, + scope: args.scope || SettingScope.User, + }), ); } catch (error) { console.error(getErrorMessage(error)); @@ -33,15 +37,15 @@ export async function handleDisable(args: DisableArgs) { export const disableCommand: CommandModule = { command: 'disable [--scope] ', - describe: 'Disables an extension.', + describe: t('Disables an extension.'), builder: (yargs) => yargs .positional('name', { - describe: 'The name of the extension to disable.', + describe: t('The name of the extension to disable.'), type: 'string', }) .option('scope', { - describe: 'The scope to disable the extenison in.', + describe: t('The scope to disable the extenison in.'), type: 'string', default: SettingScope.User, }) @@ -53,11 +57,12 @@ export const disableCommand: CommandModule = { .includes((argv.scope as string).toLowerCase()) ) { throw new Error( - `Invalid scope: ${argv.scope}. Please use one of ${Object.values( - SettingScope, - ) - .map((s) => s.toLowerCase()) - .join(', ')}.`, + t('Invalid scope: {{scope}}. Please use one of {{scopes}}.', { + scope: argv.scope as string, + scopes: Object.values(SettingScope) + .map((s) => s.toLowerCase()) + .join(', '), + }), ); } return true; diff --git a/packages/cli/src/commands/extensions/enable.ts b/packages/cli/src/commands/extensions/enable.ts index 228610527..b36e50ac9 100644 --- a/packages/cli/src/commands/extensions/enable.ts +++ b/packages/cli/src/commands/extensions/enable.ts @@ -8,6 +8,7 @@ import { type CommandModule } from 'yargs'; import { FatalConfigError, getErrorMessage } from '@qwen-code/qwen-code-core'; import { SettingScope } from '../../config/settings.js'; import { getExtensionManager } from './utils.js'; +import { t } from '../../i18n/index.js'; interface EnableArgs { name: string; @@ -25,11 +26,16 @@ export async function handleEnable(args: EnableArgs) { } if (args.scope) { console.log( - `Extension "${args.name}" successfully enabled for scope "${args.scope}".`, + t('Extension "{{name}}" successfully enabled for scope "{{scope}}".', { + name: args.name, + scope: args.scope, + }), ); } else { console.log( - `Extension "${args.name}" successfully enabled in all scopes.`, + t('Extension "{{name}}" successfully enabled in all scopes.', { + name: args.name, + }), ); } } catch (error) { @@ -39,16 +45,17 @@ export async function handleEnable(args: EnableArgs) { export const enableCommand: CommandModule = { command: 'enable [--scope] ', - describe: 'Enables an extension.', + describe: t('Enables an extension.'), builder: (yargs) => yargs .positional('name', { - describe: 'The name of the extension to enable.', + describe: t('The name of the extension to enable.'), type: 'string', }) .option('scope', { - describe: + describe: t( 'The scope to enable the extenison in. If not set, will be enabled in all scopes.', + ), type: 'string', }) .check((argv) => { @@ -59,11 +66,12 @@ export const enableCommand: CommandModule = { .includes((argv.scope as string).toLowerCase()) ) { throw new Error( - `Invalid scope: ${argv.scope}. Please use one of ${Object.values( - SettingScope, - ) - .map((s) => s.toLowerCase()) - .join(', ')}.`, + t('Invalid scope: {{scope}}. Please use one of {{scopes}}.', { + scope: argv.scope as string, + scopes: Object.values(SettingScope) + .map((s) => s.toLowerCase()) + .join(', '), + }), ); } return true; diff --git a/packages/cli/src/commands/extensions/install.ts b/packages/cli/src/commands/extensions/install.ts index 64b89003c..6a9ce4929 100644 --- a/packages/cli/src/commands/extensions/install.ts +++ b/packages/cli/src/commands/extensions/install.ts @@ -17,6 +17,7 @@ import { requestConsentOrFail, requestConsentNonInteractive, } from './consent.js'; +import { t } from '../../i18n/index.js'; interface InstallArgs { source: string; @@ -36,7 +37,9 @@ export async function handleInstall(args: InstallArgs) { ) { if (args.ref || args.autoUpdate) { throw new Error( - '--ref and --auto-update are not applicable for marketplace extensions.', + t( + '--ref and --auto-update are not applicable for marketplace extensions.', + ), ); } } @@ -64,7 +67,9 @@ export async function handleInstall(args: InstallArgs) { requestConsent, ); console.log( - `Extension "${extension.name}" installed successfully and enabled.`, + t('Extension "{{name}}" installed successfully and enabled.', { + name: extension.name, + }), ); } catch (error) { console.error(getErrorMessage(error)); @@ -74,37 +79,40 @@ export async function handleInstall(args: InstallArgs) { export const installCommand: CommandModule = { command: 'install ', - describe: + describe: t( 'Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).', + ), builder: (yargs) => yargs .positional('source', { - describe: + describe: t( 'The github URL, local path, or marketplace source (marketplace-url:plugin-name) of the extension to install.', + ), type: 'string', demandOption: true, }) .option('ref', { - describe: 'The git ref to install from.', + describe: t('The git ref to install from.'), type: 'string', }) .option('auto-update', { - describe: 'Enable auto-update for this extension.', + describe: t('Enable auto-update for this extension.'), type: 'boolean', }) .option('pre-release', { - describe: 'Enable pre-release versions for this extension.', + describe: t('Enable pre-release versions for this extension.'), type: 'boolean', }) .option('consent', { - describe: + describe: t( 'Acknowledge the security risks of installing an extension and skip the confirmation prompt.', + ), type: 'boolean', default: false, }) .check((argv) => { if (!argv.source) { - throw new Error('The source argument must be provided.'); + throw new Error(t('The source argument must be provided.')); } return true; }), diff --git a/packages/cli/src/commands/extensions/link.ts b/packages/cli/src/commands/extensions/link.ts index 5baeee3f2..545899cda 100644 --- a/packages/cli/src/commands/extensions/link.ts +++ b/packages/cli/src/commands/extensions/link.ts @@ -12,6 +12,7 @@ import { requestConsentOrFail, } from './consent.js'; import { getExtensionManager } from './utils.js'; +import { t } from '../../i18n/index.js'; interface InstallArgs { path: string; @@ -30,11 +31,13 @@ export async function handleLink(args: InstallArgs) { requestConsentOrFail.bind(null, requestConsentNonInteractive), ); if (!extension) { - console.log('Link extension failed to install.'); + console.log(t('Link extension failed to install.')); return; } console.log( - `Extension "${extension.name}" linked successfully and enabled.`, + t('Extension "{{name}}" linked successfully and enabled.', { + name: extension.name, + }), ); } catch (error) { console.error(getErrorMessage(error)); @@ -44,12 +47,13 @@ export async function handleLink(args: InstallArgs) { export const linkCommand: CommandModule = { command: 'link ', - describe: + describe: t( 'Links an extension from a local path. Updates made to the local path will always be reflected.', + ), builder: (yargs) => yargs .positional('path', { - describe: 'The name of the extension to link.', + describe: t('The name of the extension to link.'), type: 'string', }) .check((_) => true), diff --git a/packages/cli/src/commands/extensions/list.ts b/packages/cli/src/commands/extensions/list.ts index ef6545f20..9f8a3a7f6 100644 --- a/packages/cli/src/commands/extensions/list.ts +++ b/packages/cli/src/commands/extensions/list.ts @@ -7,6 +7,7 @@ import type { CommandModule } from 'yargs'; import { getErrorMessage } from '../../utils/errors.js'; import { getExtensionManager } from './utils.js'; +import { t } from '../../i18n/index.js'; export async function handleList() { try { @@ -14,7 +15,7 @@ export async function handleList() { const extensions = extensionManager.getLoadedExtensions(); if (!extensions || extensions.length === 0) { - console.log('No extensions installed.'); + console.log(t('No extensions installed.')); return; } console.log( @@ -32,7 +33,7 @@ export async function handleList() { export const listCommand: CommandModule = { command: 'list', - describe: 'Lists installed extensions.', + describe: t('Lists installed extensions.'), builder: (yargs) => yargs, handler: async () => { await handleList(); diff --git a/packages/cli/src/commands/extensions/settings.ts b/packages/cli/src/commands/extensions/settings.ts index edcdadfd9..49baf2cc4 100644 --- a/packages/cli/src/commands/extensions/settings.ts +++ b/packages/cli/src/commands/extensions/settings.ts @@ -12,6 +12,7 @@ import { promptForSetting, updateSetting, } from '@qwen-code/qwen-code-core'; +import { t } from '../../i18n/index.js'; // --- SET COMMAND --- interface SetArgs { @@ -22,21 +23,21 @@ interface SetArgs { const setCommand: CommandModule = { command: 'set [--scope] ', - describe: 'Set a specific setting for an extension.', + describe: t('Set a specific setting for an extension.'), builder: (yargs) => yargs .positional('name', { - describe: 'Name of the extension to configure.', + describe: t('Name of the extension to configure.'), type: 'string', demandOption: true, }) .positional('setting', { - describe: 'The setting to configure (name or env var).', + describe: t('The setting to configure (name or env var).'), type: 'string', demandOption: true, }) .option('scope', { - describe: 'The scope to set the setting in.', + describe: t('The scope to set the setting in.'), type: 'string', choices: ['user', 'workspace'], default: 'user', @@ -49,7 +50,7 @@ const setCommand: CommandModule = { if (!extensions || extensions.length === 0) return; const extension = extensions.find((e) => e.name === name); if (!extension) { - console.log(`Extension "${name}" not found.`); + console.log(t('Extension "{{name}}" not found.', { name })); return; } await updateSetting( @@ -69,10 +70,10 @@ interface ListArgs { const listCommand: CommandModule = { command: 'list ', - describe: 'List all settings for an extension.', + describe: t('List all settings for an extension.'), builder: (yargs) => yargs.positional('name', { - describe: 'Name of the extension.', + describe: t('Name of the extension.'), type: 'string', demandOption: true, }), @@ -84,11 +85,13 @@ const listCommand: CommandModule = { if (!extensions || extensions.length === 0) return; const extension = extensions.find((e) => e.name === name); if (!extension) { - console.log(`Extension "${name}" not found.`); + console.log(t('Extension "{{name}}" not found.', { name })); return; } if (!extension || !extension.settings || extension.settings.length === 0) { - console.log(`Extension "${name}" has no settings to configure.`); + console.log( + t('Extension "{{name}}" has no settings to configure.', { name }), + ); return; } @@ -104,29 +107,29 @@ const listCommand: CommandModule = { ); const mergedSettings = { ...userSettings, ...workspaceSettings }; - console.log(`Settings for "${name}":`); + console.log(t('Settings for "{{name}}":', { name })); for (const setting of extension.settings) { const value = mergedSettings[setting.envVar]; let displayValue: string; let scopeInfo = ''; if (workspaceSettings[setting.envVar] !== undefined) { - scopeInfo = ' (workspace)'; + scopeInfo = ' ' + t('(workspace)'); } else if (userSettings[setting.envVar] !== undefined) { - scopeInfo = ' (user)'; + scopeInfo = ' ' + t('(user)'); } if (value === undefined) { - displayValue = '[not set]'; + displayValue = t('[not set]'); } else if (setting.sensitive) { - displayValue = '[value stored in keychain]'; + displayValue = t('[value stored in keychain]'); } else { displayValue = value; } console.log(` - ${setting.name} (${setting.envVar})`); - console.log(` Description: ${setting.description}`); - console.log(` Value: ${displayValue}${scopeInfo}`); + console.log(` ${t('Description:')} ${setting.description}`); + console.log(` ${t('Value:')} ${displayValue}${scopeInfo}`); } }, }; @@ -134,12 +137,12 @@ const listCommand: CommandModule = { // --- SETTINGS COMMAND --- export const settingsCommand: CommandModule = { command: 'settings ', - describe: 'Manage extension settings.', + describe: t('Manage extension settings.'), builder: (yargs) => yargs .command(setCommand) .command(listCommand) - .demandCommand(1, 'You need to specify a command (set or list).') + .demandCommand(1, t('You need to specify a command (set or list).')) .version(false), handler: () => { // This handler is not called when a subcommand is provided. diff --git a/packages/cli/src/commands/extensions/uninstall.ts b/packages/cli/src/commands/extensions/uninstall.ts index 9d40f9d55..980472a68 100644 --- a/packages/cli/src/commands/extensions/uninstall.ts +++ b/packages/cli/src/commands/extensions/uninstall.ts @@ -13,6 +13,7 @@ import { } from './consent.js'; import { isWorkspaceTrusted } from '../../config/trustedFolders.js'; import { loadSettings } from '../../config/settings.js'; +import { t } from '../../i18n/index.js'; interface UninstallArgs { name: string; // can be extension name or source URL. @@ -33,7 +34,9 @@ export async function handleUninstall(args: UninstallArgs) { }); await extensionManager.refreshCache(); await extensionManager.uninstallExtension(args.name, false); - console.log(`Extension "${args.name}" successfully uninstalled.`); + console.log( + t('Extension "{{name}}" successfully uninstalled.', { name: args.name }), + ); } catch (error) { console.error(getErrorMessage(error)); process.exit(1); @@ -42,17 +45,19 @@ export async function handleUninstall(args: UninstallArgs) { export const uninstallCommand: CommandModule = { command: 'uninstall ', - describe: 'Uninstalls an extension.', + describe: t('Uninstalls an extension.'), builder: (yargs) => yargs .positional('name', { - describe: 'The name or source path of the extension to uninstall.', + describe: t('The name or source path of the extension to uninstall.'), type: 'string', }) .check((argv) => { if (!argv.name) { throw new Error( - 'Please include the name of the extension to uninstall as a positional argument.', + t( + 'Please include the name of the extension to uninstall as a positional argument.', + ), ); } return true; diff --git a/packages/cli/src/commands/extensions/update.ts b/packages/cli/src/commands/extensions/update.ts index d254cac5a..9325a25f1 100644 --- a/packages/cli/src/commands/extensions/update.ts +++ b/packages/cli/src/commands/extensions/update.ts @@ -12,6 +12,7 @@ import { type ExtensionUpdateInfo, } from '@qwen-code/qwen-code-core'; import { getExtensionManager } from './utils.js'; +import { t } from '../../i18n/index.js'; interface UpdateArgs { name?: string; @@ -19,7 +20,14 @@ interface UpdateArgs { } const updateOutput = (info: ExtensionUpdateInfo) => - `Extension "${info.name}" successfully updated: ${info.originalVersion} → ${info.updatedVersion}.`; + t( + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.', + { + name: info.name, + oldVersion: info.originalVersion, + newVersion: info.updatedVersion, + }, + ); export async function handleUpdate(args: UpdateArgs) { const extensionManager = await getExtensionManager(); @@ -31,12 +39,15 @@ export async function handleUpdate(args: UpdateArgs) { (extension) => extension.name === args.name, ); if (!extension) { - console.log(`Extension "${args.name}" not found.`); + console.log(t('Extension "{{name}}" not found.', { name: args.name })); return; } if (!extension.installMetadata) { console.log( - `Unable to install extension "${args.name}" due to missing install metadata`, + t( + 'Unable to install extension "{{name}}" due to missing install metadata', + { name: args.name }, + ), ); return; } @@ -45,7 +56,9 @@ export async function handleUpdate(args: UpdateArgs) { extensionManager, ); if (updateState !== ExtensionUpdateState.UPDATE_AVAILABLE) { - console.log(`Extension "${args.name}" is already up to date.`); + console.log( + t('Extension "{{name}}" is already up to date.', { name: args.name }), + ); return; } // TODO(chrstnb): we should list extensions if the requested extension is not installed. @@ -59,10 +72,19 @@ export async function handleUpdate(args: UpdateArgs) { updatedExtensionInfo.updatedVersion ) { console.log( - `Extension "${args.name}" successfully updated: ${updatedExtensionInfo.originalVersion} → ${updatedExtensionInfo.updatedVersion}.`, + t( + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.', + { + name: args.name, + oldVersion: updatedExtensionInfo.originalVersion, + newVersion: updatedExtensionInfo.updatedVersion, + }, + ), ); } else { - console.log(`Extension "${args.name}" is already up to date.`); + console.log( + t('Extension "{{name}}" is already up to date.', { name: args.name }), + ); } } catch (error) { console.error(getErrorMessage(error)); @@ -87,7 +109,7 @@ export async function handleUpdate(args: UpdateArgs) { (info) => info.originalVersion !== info.updatedVersion, ); if (updateInfos.length === 0) { - console.log('No extensions to update.'); + console.log(t('No extensions to update.')); return; } console.log(updateInfos.map((info) => updateOutput(info)).join('\n')); @@ -99,22 +121,25 @@ export async function handleUpdate(args: UpdateArgs) { export const updateCommand: CommandModule = { command: 'update [] [--all]', - describe: + describe: t( 'Updates all extensions or a named extension to the latest version.', + ), builder: (yargs) => yargs .positional('name', { - describe: 'The name of the extension to update.', + describe: t('The name of the extension to update.'), type: 'string', }) .option('all', { - describe: 'Update all extensions.', + describe: t('Update all extensions.'), type: 'boolean', }) .conflicts('name', 'all') .check((argv) => { if (!argv.all && !argv.name) { - throw new Error('Either an extension name or --all must be provided'); + throw new Error( + t('Either an extension name or --all must be provided'), + ); } return true; }), diff --git a/packages/cli/src/i18n/locales/de.js b/packages/cli/src/i18n/locales/de.js index ba36414c6..b96ddda61 100644 --- a/packages/cli/src/i18n/locales/de.js +++ b/packages/cli/src/i18n/locales/de.js @@ -412,6 +412,91 @@ export default { 'Diese Erweiterung wird folgende Unteragenten installieren:', 'Installation cancelled for "{{name}}".': 'Installation von "{{name}}" abgebrochen.', + '--ref and --auto-update are not applicable for marketplace extensions.': + '--ref und --auto-update sind nicht anwendbar für Marketplace-Erweiterungen.', + 'Extension "{{name}}" installed successfully and enabled.': + 'Erweiterung "{{name}}" erfolgreich installiert und aktiviert.', + 'Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).': + 'Installiert eine Erweiterung von einer Git-Repository-URL, einem lokalen Pfad oder dem Claude-Marketplace (marketplace-url:plugin-name).', + 'The github URL, local path, or marketplace source (marketplace-url:plugin-name) of the extension to install.': + 'Die GitHub-URL, der lokale Pfad oder die Marketplace-Quelle (marketplace-url:plugin-name) der zu installierenden Erweiterung.', + 'The git ref to install from.': 'Die Git-Referenz für die Installation.', + 'Enable auto-update for this extension.': + 'Automatisches Update für diese Erweiterung aktivieren.', + 'Enable pre-release versions for this extension.': + 'Pre-Release-Versionen für diese Erweiterung aktivieren.', + 'Acknowledge the security risks of installing an extension and skip the confirmation prompt.': + 'Sicherheitsrisiken der Erweiterungsinstallation bestätigen und Bestätigungsaufforderung überspringen.', + 'The source argument must be provided.': + 'Das Quellargument muss angegeben werden.', + 'Extension "{{name}}" successfully uninstalled.': + 'Erweiterung "{{name}}" erfolgreich deinstalliert.', + 'Uninstalls an extension.': 'Deinstalliert eine Erweiterung.', + 'The name or source path of the extension to uninstall.': + 'Der Name oder Quellpfad der zu deinstallierenden Erweiterung.', + 'Please include the name of the extension to uninstall as a positional argument.': + 'Bitte geben Sie den Namen der zu deinstallierenden Erweiterung als Positionsargument an.', + 'Enables an extension.': 'Aktiviert eine Erweiterung.', + 'The name of the extension to enable.': + 'Der Name der zu aktivierenden Erweiterung.', + 'The scope to enable the extenison in. If not set, will be enabled in all scopes.': + 'Der Bereich, in dem die Erweiterung aktiviert werden soll. Wenn nicht gesetzt, wird sie in allen Bereichen aktiviert.', + 'Extension "{{name}}" successfully enabled for scope "{{scope}}".': + 'Erweiterung "{{name}}" erfolgreich für Bereich "{{scope}}" aktiviert.', + 'Extension "{{name}}" successfully enabled in all scopes.': + 'Erweiterung "{{name}}" erfolgreich in allen Bereichen aktiviert.', + 'Invalid scope: {{scope}}. Please use one of {{scopes}}.': + 'Ungültiger Bereich: {{scope}}. Bitte verwenden Sie einen von {{scopes}}.', + 'Disables an extension.': 'Deaktiviert eine Erweiterung.', + 'The name of the extension to disable.': + 'Der Name der zu deaktivierenden Erweiterung.', + 'The scope to disable the extenison in.': + 'Der Bereich, in dem die Erweiterung deaktiviert werden soll.', + 'Extension "{{name}}" successfully disabled for scope "{{scope}}".': + 'Erweiterung "{{name}}" erfolgreich für Bereich "{{scope}}" deaktiviert.', + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.': + 'Erweiterung "{{name}}" erfolgreich aktualisiert: {{oldVersion}} → {{newVersion}}.', + 'Unable to install extension "{{name}}" due to missing install metadata': + 'Erweiterung "{{name}}" kann aufgrund fehlender Installationsmetadaten nicht installiert werden', + 'Extension "{{name}}" is already up to date.': + 'Erweiterung "{{name}}" ist bereits aktuell.', + 'Updates all extensions or a named extension to the latest version.': + 'Aktualisiert alle Erweiterungen oder eine benannte Erweiterung auf die neueste Version.', + 'The name of the extension to update.': + 'Der Name der zu aktualisierenden Erweiterung.', + 'Update all extensions.': 'Alle Erweiterungen aktualisieren.', + 'Either an extension name or --all must be provided': + 'Entweder ein Erweiterungsname oder --all muss angegeben werden', + 'Lists installed extensions.': 'Listet installierte Erweiterungen auf.', + 'Link extension failed to install.': + 'Verknüpfte Erweiterung konnte nicht installiert werden.', + 'Extension "{{name}}" linked successfully and enabled.': + 'Erweiterung "{{name}}" erfolgreich verknüpft und aktiviert.', + 'Links an extension from a local path. Updates made to the local path will always be reflected.': + 'Verknüpft eine Erweiterung von einem lokalen Pfad. Änderungen am lokalen Pfad werden immer widergespiegelt.', + 'The name of the extension to link.': + 'Der Name der zu verknüpfenden Erweiterung.', + 'Set a specific setting for an extension.': + 'Legt eine bestimmte Einstellung für eine Erweiterung fest.', + 'Name of the extension to configure.': + 'Name der zu konfigurierenden Erweiterung.', + 'The setting to configure (name or env var).': + 'Die zu konfigurierende Einstellung (Name oder Umgebungsvariable).', + 'The scope to set the setting in.': + 'Der Bereich, in dem die Einstellung gesetzt werden soll.', + 'List all settings for an extension.': + 'Listet alle Einstellungen einer Erweiterung auf.', + 'Name of the extension.': 'Name der Erweiterung.', + 'Extension "{{name}}" has no settings to configure.': + 'Erweiterung "{{name}}" hat keine zu konfigurierenden Einstellungen.', + 'Settings for "{{name}}":': 'Einstellungen für "{{name}}":', + '(workspace)': '(Arbeitsbereich)', + '(user)': '(Benutzer)', + '[not set]': '[nicht gesetzt]', + '[value stored in keychain]': '[Wert in Schlüsselbund gespeichert]', + 'Manage extension settings.': 'Erweiterungseinstellungen verwalten.', + 'You need to specify a command (set or list).': + 'Sie müssen einen Befehl angeben (set oder list).', 'manage IDE integration': 'IDE-Integration verwalten', 'check status of IDE integration': 'Status der IDE-Integration prüfen', 'install required IDE companion for {{ideName}}': diff --git a/packages/cli/src/i18n/locales/en.js b/packages/cli/src/i18n/locales/en.js index 8736a1ae3..08c6ed5d0 100644 --- a/packages/cli/src/i18n/locales/en.js +++ b/packages/cli/src/i18n/locales/en.js @@ -406,6 +406,85 @@ export default { 'This extension will install the following subagents:', 'Installation cancelled for "{{name}}".': 'Installation cancelled for "{{name}}".', + '--ref and --auto-update are not applicable for marketplace extensions.': + '--ref and --auto-update are not applicable for marketplace extensions.', + 'Extension "{{name}}" installed successfully and enabled.': + 'Extension "{{name}}" installed successfully and enabled.', + 'Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).': + 'Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).', + 'The github URL, local path, or marketplace source (marketplace-url:plugin-name) of the extension to install.': + 'The github URL, local path, or marketplace source (marketplace-url:plugin-name) of the extension to install.', + 'The git ref to install from.': 'The git ref to install from.', + 'Enable auto-update for this extension.': + 'Enable auto-update for this extension.', + 'Enable pre-release versions for this extension.': + 'Enable pre-release versions for this extension.', + 'Acknowledge the security risks of installing an extension and skip the confirmation prompt.': + 'Acknowledge the security risks of installing an extension and skip the confirmation prompt.', + 'The source argument must be provided.': + 'The source argument must be provided.', + 'Extension "{{name}}" successfully uninstalled.': + 'Extension "{{name}}" successfully uninstalled.', + 'Uninstalls an extension.': 'Uninstalls an extension.', + 'The name or source path of the extension to uninstall.': + 'The name or source path of the extension to uninstall.', + 'Please include the name of the extension to uninstall as a positional argument.': + 'Please include the name of the extension to uninstall as a positional argument.', + 'Enables an extension.': 'Enables an extension.', + 'The name of the extension to enable.': + 'The name of the extension to enable.', + 'The scope to enable the extenison in. If not set, will be enabled in all scopes.': + 'The scope to enable the extenison in. If not set, will be enabled in all scopes.', + 'Extension "{{name}}" successfully enabled for scope "{{scope}}".': + 'Extension "{{name}}" successfully enabled for scope "{{scope}}".', + 'Extension "{{name}}" successfully enabled in all scopes.': + 'Extension "{{name}}" successfully enabled in all scopes.', + 'Invalid scope: {{scope}}. Please use one of {{scopes}}.': + 'Invalid scope: {{scope}}. Please use one of {{scopes}}.', + 'Disables an extension.': 'Disables an extension.', + 'The name of the extension to disable.': + 'The name of the extension to disable.', + 'The scope to disable the extenison in.': + 'The scope to disable the extenison in.', + 'Extension "{{name}}" successfully disabled for scope "{{scope}}".': + 'Extension "{{name}}" successfully disabled for scope "{{scope}}".', + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.': + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.', + 'Unable to install extension "{{name}}" due to missing install metadata': + 'Unable to install extension "{{name}}" due to missing install metadata', + 'Extension "{{name}}" is already up to date.': + 'Extension "{{name}}" is already up to date.', + 'Updates all extensions or a named extension to the latest version.': + 'Updates all extensions or a named extension to the latest version.', + 'Update all extensions.': 'Update all extensions.', + 'Either an extension name or --all must be provided': + 'Either an extension name or --all must be provided', + 'Lists installed extensions.': 'Lists installed extensions.', + 'Link extension failed to install.': 'Link extension failed to install.', + 'Extension "{{name}}" linked successfully and enabled.': + 'Extension "{{name}}" linked successfully and enabled.', + 'Links an extension from a local path. Updates made to the local path will always be reflected.': + 'Links an extension from a local path. Updates made to the local path will always be reflected.', + 'The name of the extension to link.': 'The name of the extension to link.', + 'Set a specific setting for an extension.': + 'Set a specific setting for an extension.', + 'Name of the extension to configure.': 'Name of the extension to configure.', + 'The setting to configure (name or env var).': + 'The setting to configure (name or env var).', + 'The scope to set the setting in.': 'The scope to set the setting in.', + 'List all settings for an extension.': 'List all settings for an extension.', + 'Name of the extension.': 'Name of the extension.', + 'Extension "{{name}}" has no settings to configure.': + 'Extension "{{name}}" has no settings to configure.', + 'Settings for "{{name}}":': 'Settings for "{{name}}":', + '(workspace)': '(workspace)', + '(user)': '(user)', + '[not set]': '[not set]', + '[value stored in keychain]': '[value stored in keychain]', + 'Value:': 'Value:', + 'Manage extension settings.': 'Manage extension settings.', + 'You need to specify a command (set or list).': + 'You need to specify a command (set or list).', 'manage IDE integration': 'manage IDE integration', 'check status of IDE integration': 'check status of IDE integration', 'install required IDE companion for {{ideName}}': diff --git a/packages/cli/src/i18n/locales/ru.js b/packages/cli/src/i18n/locales/ru.js index 596db3b08..42e2fa2ca 100644 --- a/packages/cli/src/i18n/locales/ru.js +++ b/packages/cli/src/i18n/locales/ru.js @@ -410,6 +410,84 @@ export default { 'This extension will install the following subagents:': 'Это расширение установит следующие подагенты:', 'Installation cancelled for "{{name}}".': 'Установка "{{name}}" отменена.', + '--ref and --auto-update are not applicable for marketplace extensions.': + '--ref и --auto-update неприменимы для расширений из маркетплейса.', + 'Extension "{{name}}" installed successfully and enabled.': + 'Расширение "{{name}}" успешно установлено и включено.', + 'Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).': + 'Устанавливает расширение из URL Git-репозитория, локального пути или маркетплейса Claude (marketplace-url:plugin-name).', + 'The github URL, local path, or marketplace source (marketplace-url:plugin-name) of the extension to install.': + 'URL GitHub, локальный путь или источник в маркетплейсе (marketplace-url:plugin-name) устанавливаемого расширения.', + 'The git ref to install from.': 'Git-ссылка для установки.', + 'Enable auto-update for this extension.': + 'Включить автообновление для этого расширения.', + 'Enable pre-release versions for this extension.': + 'Включить пре-релизные версии для этого расширения.', + 'Acknowledge the security risks of installing an extension and skip the confirmation prompt.': + 'Подтвердить риски безопасности установки расширения и пропустить запрос подтверждения.', + 'The source argument must be provided.': + 'Необходимо указать аргумент источника.', + 'Extension "{{name}}" successfully uninstalled.': + 'Расширение "{{name}}" успешно удалено.', + 'Uninstalls an extension.': 'Удаляет расширение.', + 'The name or source path of the extension to uninstall.': + 'Имя или путь к источнику удаляемого расширения.', + 'Please include the name of the extension to uninstall as a positional argument.': + 'Пожалуйста, укажите имя удаляемого расширения как позиционный аргумент.', + 'Enables an extension.': 'Включает расширение.', + 'The name of the extension to enable.': 'Имя включаемого расширения.', + 'The scope to enable the extenison in. If not set, will be enabled in all scopes.': + 'Область для включения расширения. Если не задана, будет включено во всех областях.', + 'Extension "{{name}}" successfully enabled for scope "{{scope}}".': + 'Расширение "{{name}}" успешно включено для области "{{scope}}".', + 'Extension "{{name}}" successfully enabled in all scopes.': + 'Расширение "{{name}}" успешно включено во всех областях.', + 'Invalid scope: {{scope}}. Please use one of {{scopes}}.': + 'Недопустимая область: {{scope}}. Пожалуйста, используйте одну из {{scopes}}.', + 'Disables an extension.': 'Отключает расширение.', + 'The name of the extension to disable.': 'Имя отключаемого расширения.', + 'The scope to disable the extenison in.': + 'Область для отключения расширения.', + 'Extension "{{name}}" successfully disabled for scope "{{scope}}".': + 'Расширение "{{name}}" успешно отключено для области "{{scope}}".', + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.': + 'Расширение "{{name}}" успешно обновлено: {{oldVersion}} → {{newVersion}}.', + 'Unable to install extension "{{name}}" due to missing install metadata': + 'Невозможно установить расширение "{{name}}" из-за отсутствия метаданных установки', + 'Extension "{{name}}" is already up to date.': + 'Расширение "{{name}}" уже актуально.', + 'Updates all extensions or a named extension to the latest version.': + 'Обновляет все расширения или указанное расширение до последней версии.', + 'The name of the extension to update.': 'Имя обновляемого расширения.', + 'Update all extensions.': 'Обновить все расширения.', + 'Either an extension name or --all must be provided': + 'Необходимо указать имя расширения или --all', + 'Lists installed extensions.': 'Показывает установленные расширения.', + 'Link extension failed to install.': + 'Не удалось установить связанное расширение.', + 'Extension "{{name}}" linked successfully and enabled.': + 'Расширение "{{name}}" успешно связано и включено.', + 'Links an extension from a local path. Updates made to the local path will always be reflected.': + 'Связывает расширение из локального пути. Изменения в локальном пути будут всегда отражаться.', + 'The name of the extension to link.': 'Имя связываемого расширения.', + 'Set a specific setting for an extension.': + 'Установить конкретную настройку для расширения.', + 'Name of the extension to configure.': 'Имя настраиваемого расширения.', + 'The setting to configure (name or env var).': + 'Настройка для конфигурирования (имя или переменная окружения).', + 'The scope to set the setting in.': 'Область для установки настройки.', + 'List all settings for an extension.': 'Показать все настройки расширения.', + 'Name of the extension.': 'Имя расширения.', + 'Extension "{{name}}" has no settings to configure.': + 'Расширение "{{name}}" не имеет настроек для конфигурирования.', + 'Settings for "{{name}}":': 'Настройки для "{{name}}":', + '(workspace)': '(рабочее пространство)', + '(user)': '(пользователь)', + '[not set]': '[не задано]', + '[value stored in keychain]': '[значение хранится в связке ключей]', + 'Manage extension settings.': 'Управление настройками расширений.', + 'You need to specify a command (set or list).': + 'Необходимо указать команду (set или list).', 'manage IDE integration': 'Управление интеграцией с IDE', 'check status of IDE integration': 'Проверить статус интеграции с IDE', 'install required IDE companion for {{ideName}}': diff --git a/packages/cli/src/i18n/locales/zh.js b/packages/cli/src/i18n/locales/zh.js index f8f3f4924..c33b47ed5 100644 --- a/packages/cli/src/i18n/locales/zh.js +++ b/packages/cli/src/i18n/locales/zh.js @@ -388,6 +388,78 @@ export default { 'This extension will install the following subagents:': '此扩展将安装以下子代理:', 'Installation cancelled for "{{name}}".': '已取消安装 "{{name}}"。', + '--ref and --auto-update are not applicable for marketplace extensions.': + '--ref 和 --auto-update 不适用于市场扩展。', + 'Extension "{{name}}" installed successfully and enabled.': + '扩展 "{{name}}" 安装成功并已启用。', + 'Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).': + '从 Git 仓库 URL、本地路径或 Claude 市场(marketplace-url:plugin-name)安装扩展。', + 'The github URL, local path, or marketplace source (marketplace-url:plugin-name) of the extension to install.': + '要安装的扩展的 GitHub URL、本地路径或市场源(marketplace-url:plugin-name)。', + 'The git ref to install from.': '要安装的 Git 引用。', + 'Enable auto-update for this extension.': '为此扩展启用自动更新。', + 'Enable pre-release versions for this extension.': '为此扩展启用预发布版本。', + 'Acknowledge the security risks of installing an extension and skip the confirmation prompt.': + '确认安装扩展的安全风险并跳过确认提示。', + 'The source argument must be provided.': '必须提供来源参数。', + 'Extension "{{name}}" successfully uninstalled.': + '扩展 "{{name}}" 卸载成功。', + 'Uninstalls an extension.': '卸载扩展。', + 'The name or source path of the extension to uninstall.': + '要卸载的扩展的名称或源路径。', + 'Please include the name of the extension to uninstall as a positional argument.': + '请将要卸载的扩展名称作为位置参数。', + 'Enables an extension.': '启用扩展。', + 'The name of the extension to enable.': '要启用的扩展名称。', + 'The scope to enable the extenison in. If not set, will be enabled in all scopes.': + '启用扩展的作用域。如果未设置,将在所有作用域中启用。', + 'Extension "{{name}}" successfully enabled for scope "{{scope}}".': + '扩展 "{{name}}" 已在作用域 "{{scope}}" 中启用。', + 'Extension "{{name}}" successfully enabled in all scopes.': + '扩展 "{{name}}" 已在所有作用域中启用。', + 'Invalid scope: {{scope}}. Please use one of {{scopes}}.': + '无效的作用域:{{scope}}。请使用 {{scopes}} 之一。', + 'Disables an extension.': '禁用扩展。', + 'The name of the extension to disable.': '要禁用的扩展名称。', + 'The scope to disable the extenison in.': '禁用扩展的作用域。', + 'Extension "{{name}}" successfully disabled for scope "{{scope}}".': + '扩展 "{{name}}" 已在作用域 "{{scope}}" 中禁用。', + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.': + '扩展 "{{name}}" 更新成功:{{oldVersion}} → {{newVersion}}。', + 'Unable to install extension "{{name}}" due to missing install metadata': + '由于缺少安装元数据,无法安装扩展 "{{name}}"', + 'Extension "{{name}}" is already up to date.': + '扩展 "{{name}}" 已是最新版本。', + 'Updates all extensions or a named extension to the latest version.': + '将所有扩展或指定扩展更新到最新版本。', + 'The name of the extension to update.': '要更新的扩展名称。', + 'Update all extensions.': '更新所有扩展。', + 'Either an extension name or --all must be provided': + '必须提供扩展名称或 --all', + 'Lists installed extensions.': '列出已安装的扩展。', + 'Link extension failed to install.': '链接扩展安装失败。', + 'Extension "{{name}}" linked successfully and enabled.': + '扩展 "{{name}}" 链接成功并已启用。', + 'Links an extension from a local path. Updates made to the local path will always be reflected.': + '从本地路径链接扩展。对本地路径的更新将始终反映。', + 'The name of the extension to link.': '要链接的扩展名称。', + 'Set a specific setting for an extension.': '为扩展设置特定配置。', + 'Name of the extension to configure.': '要配置的扩展名称。', + 'The setting to configure (name or env var).': + '要配置的设置(名称或环境变量)。', + 'The scope to set the setting in.': '设置配置的作用域。', + 'List all settings for an extension.': '列出扩展的所有设置。', + 'Name of the extension.': '扩展名称。', + 'Extension "{{name}}" has no settings to configure.': + '扩展 "{{name}}" 没有可配置的设置。', + 'Settings for "{{name}}":': '"{{name}}" 的设置:', + '(workspace)': '(工作区)', + '(user)': '(用户)', + '[not set]': '[未设置]', + '[value stored in keychain]': '[值存储在钥匙串中]', + 'Manage extension settings.': '管理扩展设置。', + 'You need to specify a command (set or list).': + '您需要指定命令(set 或 list)。', 'manage IDE integration': '管理 IDE 集成', 'check status of IDE integration': '检查 IDE 集成状态', 'install required IDE companion for {{ideName}}':