Merge remote-tracking branch 'openchamber/main' into requests-in-flight

# Conflicts:
#	packages/ui/src/components/ui/MemoryDebugPanel.tsx
This commit is contained in:
Tom Rochette
2026-07-12 05:07:04 +00:00
1083 changed files with 77081 additions and 33166 deletions
+168 -1
View File
@@ -57,7 +57,174 @@ const FR_MESSAGES: BootstrapMessages = {
loadingData: (providersText, agentsText) => `Chargement des données (${providersText}, ${agentsText})…`,
};
export const getBootstrapMessages = (locale: Locale): BootstrapMessages => (locale === 'fr' ? FR_MESSAGES : EN_MESSAGES);
const ZH_CN_MESSAGES: BootstrapMessages = {
startingApi: '正在启动 OpenCode API…',
initializing: '正在初始化…',
connecting: '正在连接…',
connected: '已连接!',
connectionError: '连接错误',
disconnected: '已断开连接',
reconnecting: '正在重新连接…',
initialDataLoadFailed: 'OpenCode 已连接,但初始数据加载失败。',
cliNotFound: '未找到 OpenCode CLI。请先安装它。',
providersReady: '✓ 提供商',
providersLoading: '… 提供商',
agentsReady: '✓ 智能体',
agentsLoading: '… 智能体',
startingDevServer: (hostLabel) => `正在启动 webview 开发服务器 (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `正在等待 webview 开发服务器 (${hostLabel})... 第 ${attempt} 次尝试`,
loadingData: (providersText, agentsText) => `正在加载数据 (${providersText}, ${agentsText})…`,
};
const ZH_TW_MESSAGES: BootstrapMessages = {
startingApi: '正在啟動 OpenCode API…',
initializing: '正在初始化…',
connecting: '正在連線…',
connected: '已連線!',
connectionError: '連線錯誤',
disconnected: '已中斷連線',
reconnecting: '正在重新連線…',
initialDataLoadFailed: 'OpenCode 已連線,但初始資料載入失敗。',
cliNotFound: '找不到 OpenCode CLI。請先安裝。',
providersReady: '✓ 提供者',
providersLoading: '… 提供者',
agentsReady: '✓ 代理',
agentsLoading: '… 代理',
startingDevServer: (hostLabel) => `正在啟動 webview 開發伺服器 (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `正在等待 webview 開發伺服器 (${hostLabel})... 第 ${attempt} 次嘗試`,
loadingData: (providersText, agentsText) => `正在載入資料 (${providersText}, ${agentsText})…`,
};
const UK_MESSAGES: BootstrapMessages = {
startingApi: 'Запуск OpenCode API…',
initializing: 'Ініціалізація…',
connecting: 'Підключення…',
connected: 'Підключено!',
connectionError: 'Помилка підключення',
disconnected: 'Відключено',
reconnecting: 'Повторне підключення…',
initialDataLoadFailed: 'OpenCode підключено, але початкове завантаження даних не вдалося.',
cliNotFound: 'OpenCode CLI не знайдено. Спершу встановіть його.',
providersReady: '✓ Провайдери',
providersLoading: '… Провайдери',
agentsReady: '✓ Агенти',
agentsLoading: '… Агенти',
startingDevServer: (hostLabel) => `Запуск dev-сервера webview (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `Очікування dev-сервера webview (${hostLabel})... спроба ${attempt}`,
loadingData: (providersText, agentsText) => `Завантаження даних (${providersText}, ${agentsText})…`,
};
const ES_MESSAGES: BootstrapMessages = {
startingApi: 'Iniciando la API de OpenCode…',
initializing: 'Inicializando…',
connecting: 'Conectando…',
connected: '¡Conectado!',
connectionError: 'Error de conexión',
disconnected: 'Desconectado',
reconnecting: 'Reconectando…',
initialDataLoadFailed: 'OpenCode se conectó, pero falló la carga inicial de datos.',
cliNotFound: 'No se encontró OpenCode CLI. Instálalo primero.',
providersReady: '✓ Proveedores',
providersLoading: '… Proveedores',
agentsReady: '✓ Agentes',
agentsLoading: '… Agentes',
startingDevServer: (hostLabel) => `Iniciando el servidor de desarrollo de webview (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `Esperando el servidor de desarrollo de webview (${hostLabel})... intento ${attempt}`,
loadingData: (providersText, agentsText) => `Cargando datos (${providersText}, ${agentsText})…`,
};
const PT_BR_MESSAGES: BootstrapMessages = {
startingApi: 'Iniciando a API do OpenCode…',
initializing: 'Inicializando…',
connecting: 'Conectando…',
connected: 'Conectado!',
connectionError: 'Erro de conexão',
disconnected: 'Desconectado',
reconnecting: 'Reconectando…',
initialDataLoadFailed: 'OpenCode conectado, mas o carregamento inicial dos dados falhou.',
cliNotFound: 'OpenCode CLI não encontrado. Instale-o primeiro.',
providersReady: '✓ Provedores',
providersLoading: '… Provedores',
agentsReady: '✓ Agentes',
agentsLoading: '… Agentes',
startingDevServer: (hostLabel) => `Iniciando o servidor de desenvolvimento da webview (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `Aguardando o servidor de desenvolvimento da webview (${hostLabel})... tentativa ${attempt}`,
loadingData: (providersText, agentsText) => `Carregando dados (${providersText}, ${agentsText})…`,
};
const KO_MESSAGES: BootstrapMessages = {
startingApi: 'OpenCode API 시작 중…',
initializing: '초기화 중…',
connecting: '연결 중…',
connected: '연결됨!',
connectionError: '연결 오류',
disconnected: '연결 끊김',
reconnecting: '다시 연결 중…',
initialDataLoadFailed: 'OpenCode에 연결되었지만 초기 데이터 로드에 실패했습니다.',
cliNotFound: 'OpenCode CLI를 찾을 수 없습니다. 먼저 설치하세요.',
providersReady: '✓ 공급자',
providersLoading: '… 공급자',
agentsReady: '✓ 에이전트',
agentsLoading: '… 에이전트',
startingDevServer: (hostLabel) => `webview 개발 서버 시작 중 (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `webview 개발 서버 대기 중 (${hostLabel})... ${attempt}번째 시도`,
loadingData: (providersText, agentsText) => `데이터 로드 중 (${providersText}, ${agentsText})…`,
};
const PL_MESSAGES: BootstrapMessages = {
startingApi: 'Uruchamianie API OpenCode…',
initializing: 'Inicjalizacja…',
connecting: 'Łączenie…',
connected: 'Połączono!',
connectionError: 'Błąd połączenia',
disconnected: 'Rozłączono',
reconnecting: 'Ponowne łączenie…',
initialDataLoadFailed: 'OpenCode połączony, ale początkowe ładowanie danych nie powiodło się.',
cliNotFound: 'Nie znaleziono OpenCode CLI. Najpierw go zainstaluj.',
providersReady: '✓ Dostawcy',
providersLoading: '… Dostawcy',
agentsReady: '✓ Agenci',
agentsLoading: '… Agenci',
startingDevServer: (hostLabel) => `Uruchamianie serwera deweloperskiego webview (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `Oczekiwanie na serwer deweloperski webview (${hostLabel})... próba ${attempt}`,
loadingData: (providersText, agentsText) => `Ładowanie danych (${providersText}, ${agentsText})…`,
};
const JA_MESSAGES: BootstrapMessages = {
startingApi: 'OpenCode API を起動中…',
initializing: '初期化中…',
connecting: '接続中…',
connected: '接続完了!',
connectionError: '接続エラー',
disconnected: '切断されました',
reconnecting: '再接続中…',
initialDataLoadFailed: 'OpenCode に接続しましたが、初期データの読み込みに失敗しました。',
cliNotFound: 'OpenCode CLI が見つかりません。先にインストールしてください。',
providersReady: '✓ プロバイダ',
providersLoading: '… プロバイダ',
agentsReady: '✓ エージェント',
agentsLoading: '… エージェント',
startingDevServer: (hostLabel) => `Webview 開発サーバーを起動中 (${hostLabel})...`,
waitingDevServer: (hostLabel, attempt) => `Webview 開発サーバーを待機中 (${hostLabel})... 試行 ${attempt}`,
loadingData: (providersText, agentsText) => `データを読み込み中 (${providersText}, ${agentsText})…`,
};
export const getBootstrapMessages = (locale: Locale): BootstrapMessages => {
return BOOTSTRAP_MESSAGES[locale];
};
const BOOTSTRAP_MESSAGES: Record<Locale, BootstrapMessages> = {
en: EN_MESSAGES,
fr: FR_MESSAGES,
'zh-CN': ZH_CN_MESSAGES,
'zh-TW': ZH_TW_MESSAGES,
uk: UK_MESSAGES,
es: ES_MESSAGES,
'pt-BR': PT_BR_MESSAGES,
ko: KO_MESSAGES,
pl: PL_MESSAGES,
ja: JA_MESSAGES,
};
export const readStoredLocaleForBootstrap = (): Locale => {
if (typeof window === 'undefined') {
+1 -1
View File
@@ -1,6 +1,6 @@
export { I18nProvider } from './context';
export { getBootstrapMessages, readStoredLocaleForBootstrap } from './bootstrap';
export { getCurrentIntlLocale, getIntlLocale } from './intl';
export { getCurrentIntlLocale } from './intl';
export { useI18n } from './useI18n';
export { formatMessage, initializeLocale, useI18nStore } from './store';
export type { I18nKey, I18nParams, Locale } from './store';
+2 -1
View File
@@ -11,8 +11,9 @@ const INTL_LOCALE_BY_LOCALE: Record<Locale, string> = {
'pt-BR': 'pt-BR',
ko: 'ko-KR',
pl: 'pl-PL',
ja: 'ja-JP',
};
export const getIntlLocale = (locale: Locale): string => INTL_LOCALE_BY_LOCALE[locale] ?? 'en-US';
const getIntlLocale = (locale: Locale): string => INTL_LOCALE_BY_LOCALE[locale] ?? 'en-US';
export const getCurrentIntlLocale = (): string => getIntlLocale(useI18nStore.getState().locale);
+8 -3
View File
@@ -3,6 +3,7 @@ import { describe, expect, test } from 'bun:test';
import { dict as enDict } from './messages/en';
import { dict as esDict } from './messages/es';
import { dict as frDict } from './messages/fr';
import { dict as jaDict } from './messages/ja';
import { dict as koDict } from './messages/ko';
import { dict as plDict } from './messages/pl';
import { dict as ptBrDict } from './messages/pt-BR';
@@ -14,6 +15,7 @@ const localeDictionaries = {
en: enDict,
fr: frDict,
es: esDict,
ja: jaDict,
'pt-BR': ptBrDict,
uk: ukDict,
ko: koDict,
@@ -23,15 +25,18 @@ const localeDictionaries = {
} as const;
describe('i18n dictionaries', () => {
test('french stays in key parity with english', () => {
test('all locales stay in key parity with english', () => {
const englishKeys = Object.keys(enDict).sort();
expect(Object.keys(frDict).sort()).toEqual(englishKeys);
for (const dictionary of Object.values(localeDictionaries)) {
expect(Object.keys(dictionary).sort()).toEqual(englishKeys);
}
});
test('all locales expose the french language label key', () => {
test('all locales expose language label keys', () => {
for (const [, dictionary] of Object.entries(localeDictionaries)) {
expect(dictionary['common.language.french']).toBeTruthy();
expect(dictionary['common.language.japanese']).toBeTruthy();
}
});
});
@@ -253,11 +253,18 @@ export const settingsDict = {
'settings.remoteInstances.direct.sidebarTitle': 'Server links',
'settings.remoteInstances.direct.sidebarDescription': 'Connect with a link or token',
'settings.remoteInstances.direct.title': 'Other OpenChamber servers',
'settings.remoteInstances.direct.description': 'Add another OpenChamber server by URL. Use this when the server is already running and you have a connection token.',
'settings.remoteInstances.direct.description': 'Servers this app can switch to. Import a pairing link from the other server, or add one by address.',
'settings.remoteInstances.direct.addDialog.description': 'Add another OpenChamber server by URL. Use this when the server is already running and you have a connection token.',
'settings.remoteInstances.direct.field.labelPlaceholder': 'Label (optional)',
'settings.remoteInstances.direct.field.urlPlaceholder': 'https://host:port',
'settings.remoteInstances.direct.field.tokenPlaceholder': 'Connection token (optional for trusted local servers)',
'settings.remoteInstances.direct.note': 'Connection tokens are saved on this device and used only when this app connects to that server.',
'settings.remoteInstances.direct.headers.title': 'Additional headers',
'settings.remoteInstances.direct.headers.description': 'Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.',
'settings.remoteInstances.direct.headers.field.namePlaceholder': 'Header name',
'settings.remoteInstances.direct.headers.field.valuePlaceholder': 'Header value',
'settings.remoteInstances.direct.headers.actions.add': 'Add header',
'settings.remoteInstances.direct.headers.removeAria': 'Remove header',
'settings.remoteInstances.direct.actions.add': 'Add Server',
'settings.remoteInstances.direct.import.description': 'Paste a connection link from another OpenChamber server.',
'settings.remoteInstances.direct.import.placeholder': 'openchamber://connect?...',
@@ -267,20 +274,74 @@ export const settingsDict = {
'settings.remoteInstances.direct.state.empty': 'No other servers added yet.',
'settings.remoteInstances.clientAuth.title': 'Connect to this server',
'settings.remoteInstances.clientAuth.description': 'Create a secure link or token so OpenChamber Desktop can connect to this server.',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': 'Device name (optional)',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': 'Device name — e.g. My iPhone',
'settings.remoteInstances.clientAuth.actions.create': 'Create Token',
'settings.remoteInstances.clientAuth.actions.pair': 'Create Link',
'settings.remoteInstances.clientAuth.actions.revoke': 'Revoke',
'settings.remoteInstances.clientAuth.actions.clearRevoked': 'Clear revoked',
'settings.remoteInstances.clientAuth.qrAlt': 'OpenChamber connection QR code',
'settings.remoteInstances.clientAuth.qrEnlarge': 'Enlarge QR code',
'settings.remoteInstances.clientAuth.qrScanHint': 'Scan this with the OpenChamber app on your other device. It is single-use and expires.',
'settings.remoteInstances.clientAuth.qrDialogTitle': 'Scan to connect',
'settings.remoteInstances.clientAuth.actions.addDevice': 'Add a device',
'settings.remoteInstances.clientAuth.actions.copied': 'Copied',
'settings.remoteInstances.clientAuth.addDevice.transportLabel': 'Where will you use this device?',
'settings.remoteInstances.clientAuth.addDevice.subtitle': 'Create a one-time QR code that connects another device to this server.',
'settings.remoteInstances.clientAuth.addDevice.transport.local': 'This computer only',
'settings.remoteInstances.clientAuth.addDevice.transport.localHint': 'For apps running on this same machine.',
'settings.remoteInstances.clientAuth.addDevice.transport.lan': 'Home network only',
'settings.remoteInstances.clientAuth.addDevice.transport.lanHint': 'Connects directly over your Wi-Fi. Does not work away from this network.',
'settings.remoteInstances.clientAuth.addDevice.transport.relay': 'Anywhere',
'settings.remoteInstances.clientAuth.addDevice.transport.relayHint': 'Works at home and away. Away traffic goes through OpenChamber Private Relay — an end-to-end encrypted tunnel. No setup needed.',
'settings.remoteInstances.clientAuth.addDevice.fallback.relay': 'Also allow the encrypted relay when away from home',
'settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal': 'Prefer the direct home connection when available',
'settings.remoteInstances.clientAuth.addDevice.create': 'Create QR code',
'settings.remoteInstances.clientAuth.addDevice.done': 'Done',
'settings.remoteInstances.clientAuth.addDevice.connectedToast': 'Device connected.',
'settings.remoteInstances.clientAuth.pairingUrl': 'Connection link',
'settings.remoteInstances.clientAuth.createdToken': 'Copy this token now. For security, it will not be shown again.',
'settings.remoteInstances.clientAuth.state.loading': 'Loading tokens...',
'settings.remoteInstances.clientAuth.state.empty': 'No devices connected yet.',
'settings.remoteInstances.clientAuth.state.revoked': 'Revoked',
'settings.remoteInstances.clientAuth.state.thisDevice': 'This device',
'settings.remoteInstances.clientAuth.state.pending': 'Waiting to connect…',
'settings.remoteInstances.clientAuth.state.viaRelay': 'Relay',
'settings.remoteInstances.clientAuth.state.connectedDirect': 'Connected · Local network',
'settings.remoteInstances.clientAuth.state.connectedRelay': 'Connected · Relay',
'settings.remoteInstances.clientAuth.lastUsed': 'Last used {date}',
'settings.remoteInstances.clientAuth.neverUsed': 'Never used',
'settings.remoteInstances.relay.title': 'OpenChamber Relay',
'settings.remoteInstances.relay.autoHint': 'Turns on automatically when you pair a device over the relay.',
'settings.remoteInstances.relay.description': 'Let your other devices connect from anywhere without opening ports. Traffic is end-to-end encrypted — the relay cannot read it.',
'settings.remoteInstances.relay.enableHint': 'Nothing is shared until you enable the relay on this server.',
'settings.remoteInstances.relay.actions.enable': 'Enable Relay',
'settings.remoteInstances.relay.actions.disable': 'Disable',
'settings.remoteInstances.relay.confirm.disable': 'Disable the relay? Devices connected through it will be disconnected immediately.',
'settings.remoteInstances.relay.state.loading': 'Checking relay status...',
'settings.remoteInstances.relay.state.disabled': 'Disabled',
'settings.remoteInstances.relay.state.connecting': 'Connecting',
'settings.remoteInstances.relay.state.connected': 'Connected',
'settings.remoteInstances.relay.state.reconnecting': 'Reconnecting',
'settings.remoteInstances.relay.state.error': 'Error',
'settings.remoteInstances.relay.status.clientsOne': '{count} device connected',
'settings.remoteInstances.relay.status.clientsMany': '{count} devices connected',
'settings.remoteInstances.relay.pair.title': 'Pair a device',
'settings.remoteInstances.relay.pair.labelPlaceholder': 'Device name (optional)',
'settings.remoteInstances.relay.pair.includeToken': 'Include access token (one-scan pairing)',
'settings.remoteInstances.relay.pair.noTokenHint': 'Without a token, the device signs in with this server’s UI password after connecting.',
'settings.remoteInstances.relay.pair.generate': 'Create pairing link',
'settings.remoteInstances.relay.pair.requiresConnected': 'Pairing becomes available once the relay is connected.',
'settings.remoteInstances.relay.pair.linkLabel': 'Pairing link',
'settings.remoteInstances.relay.pair.warning': 'This link grants access to this server. Do not share it.',
'settings.remoteInstances.relay.pair.qrAlt': 'Relay pairing QR code',
'settings.remoteInstances.relay.pair.showQr': 'Show QR code',
'settings.remoteInstances.relay.pair.qrDialogTitle': 'Scan to pair',
'settings.remoteInstances.relay.pair.qrDialogDescription': 'Scan this QR code with the OpenChamber app on your other device.',
'settings.remoteInstances.relay.pair.manageHint': 'Manage or revoke paired devices in the “Connect to this server” list above.',
'settings.remoteInstances.relay.toast.enableFailed': 'Failed to enable relay',
'settings.remoteInstances.relay.toast.disableFailed': 'Failed to disable relay',
'settings.remoteInstances.relay.toast.offerFailed': 'Failed to create pairing link',
'settings.remoteInstances.relay.toast.linkCopied': 'Pairing link copied',
'settings.remoteInstances.sidebar.phase.ready': 'Ready',
'settings.remoteInstances.sidebar.phase.error': 'Error',
'settings.remoteInstances.sidebar.phase.reconnect': 'Reconnect',
@@ -398,12 +459,14 @@ export const settingsDict = {
'settings.agents.sidebar.toast.agentExists': 'An agent with this name already exists',
'settings.agents.sidebar.toast.removeOldAfterRenameFailed': 'Failed to remove old agent after rename',
'settings.agents.sidebar.toast.renameFailed': 'Failed to rename agent',
'settings.agents.sidebar.toast.agentRenamed': 'Agent renamed to "{name}"',
'settings.agents.page.toast.permissionNameRequired': 'Permission name is required',
'settings.agents.page.toast.created': 'Agent created successfully',
'settings.agents.page.toast.updated': 'Agent updated successfully',
'settings.agents.page.toast.createFailed': 'Failed to create agent',
'settings.agents.page.toast.updateFailed': 'Failed to update agent',
'settings.agents.page.toast.saveUnexpectedError': 'An error occurred while saving',
'settings.agents.page.toast.savedManualRestart': 'Saved to disk. Restart your connected OpenCode server to apply the changes.',
'settings.agents.page.empty.title': 'Select an agent from the sidebar',
'settings.agents.page.empty.description': 'or create a new one',
'settings.agents.page.title.new': 'New Agent',
@@ -428,6 +491,10 @@ export const settingsDict = {
'settings.agents.page.field.topPTooltip': 'Nucleus sampling diversity. Lower = likely tokens only.',
'settings.agents.page.field.topPRange': '0.0 to 1.0',
'settings.agents.page.field.clearTopPAria': 'Clear top p override',
'settings.agents.page.field.variant': 'Thinking Variant',
'settings.agents.page.field.variantTooltip': 'Controls the thinking/reasoning depth for this agent. Maps to provider-specific parameters (e.g. Anthropic variant, OpenAI reasoning effort).',
'settings.agents.page.field.variantHint': 'e.g. high, max, low',
'settings.agents.page.field.variantPlaceholder': 'default',
'settings.agents.page.field.systemPromptPlaceholder': 'You are an expert coding assistant...',
'settings.agents.page.mode.primary': 'Primary',
'settings.agents.page.mode.subagent': 'Subagent',
@@ -533,6 +600,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.description.globalReadOnly': 'System-wide Git identity (read-only)',
'settings.gitIdentities.editor.description.newProfile': 'Create a new Git identity profile',
'settings.gitIdentities.editor.description.editProfile': 'Edit identity profile settings',
'settings.gitIdentities.editor.section.commitSigning': 'Commit signing',
'settings.gitIdentities.editor.field.profileName': 'Profile Name',
'settings.gitIdentities.editor.field.profileNamePlaceholder': 'Work Profile, Personal, etc.',
'settings.gitIdentities.editor.field.color': 'Color',
@@ -548,6 +616,9 @@ export const settingsDict = {
'settings.gitIdentities.editor.field.sshKeyPath': 'SSH Key Path',
'settings.gitIdentities.editor.field.sshKeyPathTooltip': 'Optional path to private key. e.g. ~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.sshKeyPathPlaceholder': '~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.signCommits': 'Sign commits with this identity',
'settings.gitIdentities.editor.field.signingKey': 'Signing key',
'settings.gitIdentities.editor.field.signingKeyPlaceholder': '~/.ssh/id_ed25519.pub',
'settings.gitIdentities.editor.field.host': 'Host',
'settings.gitIdentities.editor.field.hostTooltip': 'Token will be read from ~/.git-credentials for this host.',
'settings.gitIdentities.editor.field.hostPlaceholder': 'github.com',
@@ -556,6 +627,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.actions.save': 'Save',
'settings.gitIdentities.editor.toast.userNameEmailRequired': 'User name and email are required',
'settings.gitIdentities.editor.toast.hostRequiredForToken': 'Host is required for token-based authentication',
'settings.gitIdentities.editor.toast.signingKeyRequired': 'Signing key is required when commit signing is enabled',
'settings.gitIdentities.editor.toast.profileCreated': 'Profile created',
'settings.gitIdentities.editor.toast.profileUpdated': 'Profile updated',
'settings.gitIdentities.editor.toast.createProfileFailed': 'Failed to create profile',
@@ -805,7 +877,13 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.title': 'Desktop Network Access',
'settings.openchamber.desktopNetwork.field.launchAtLoginAria': 'Start OpenChamber at login',
'settings.openchamber.desktopNetwork.field.launchAtLogin': 'Start OpenChamber when you log in',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': 'Starts the app in the background without opening a window. Click the Dock icon to open it.',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': 'Starts the app in the background without opening a window. Use the desktop status icon to open it.',
'settings.openchamber.desktopNetwork.field.minimizeToTrayAria': 'Minimize and close OpenChamber to the system tray',
'settings.openchamber.desktopNetwork.field.minimizeToTray': 'Minimize and close to the system tray',
'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription': 'Keeps OpenChamber running in the Windows system tray when the main window is minimized or closed.',
'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'Keep computer awake while OpenChamber is running',
'settings.openchamber.desktopNetwork.field.keepAwake': 'Keep computer awake while OpenChamber is running',
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': 'Prevents system sleep so phones can keep reaching this app. The screen can still turn off.',
'settings.openchamber.desktopNetwork.field.allowLanAccessAria': 'Allow LAN access to desktop sidecar',
'settings.openchamber.desktopNetwork.field.allowLanAccess': 'Let other devices on your local network open this app',
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': 'Restarts the app so phones, tablets, and other computers on your Wi-Fi can open it.',
@@ -822,6 +900,10 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.error.savedRestartFailed': 'Saved, but failed to restart app',
'settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported': 'Launch at login is not supported on this system',
'settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed': 'Failed to update launch at login setting',
'settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported': 'System tray background mode is not supported on this system',
'settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed': 'Failed to update system tray setting',
'settings.openchamber.desktopNetwork.error.keepAwakeUnsupported': 'Preventing sleep is not supported on this system',
'settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed': 'Failed to update keep awake setting',
'settings.openchamber.opencodeCli.title': 'OpenCode CLI',
'settings.openchamber.opencodeCli.tooltipPrefix': 'Optional absolute path to the',
'settings.openchamber.opencodeCli.tooltipSuffix': 'binary.',
@@ -950,6 +1032,7 @@ export const settingsDict = {
'settings.openchamber.keyboardShortcuts.action.cycle_agent.label': 'Cycle agent',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label': 'Cycle favorite model forward',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label': 'Cycle favorite model backward',
'settings.openchamber.keyboardShortcuts.action.open_model_selector.label': 'Open model selector',
'settings.openchamber.keyboardShortcuts.action.expand_input.label': 'Expand input',
'settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label': 'Open conversation timeline',
'settings.projects.sidebar.total': 'Total {count}',
@@ -959,6 +1042,8 @@ export const settingsDict = {
'settings.projects.page.section.worktree': 'Worktree',
'settings.projects.page.field.projectName': 'Project Name',
'settings.projects.page.field.projectNamePlaceholder': 'Project name',
'settings.projects.page.field.defaultModel': 'Default model for new chats',
'settings.projects.page.field.defaultModelDescription': 'Used when starting a new chat in this project. Falls back to global defaults when unset.',
'settings.projects.page.field.accentColor': 'Accent Color',
'settings.projects.page.field.projectIcon': 'Project Icon',
'settings.projects.page.field.projectIconBackgroundAria': 'Project icon background color',
@@ -980,6 +1065,7 @@ export const settingsDict = {
'settings.projects.page.toast.discoverIconFailed': 'Failed to discover project icon',
'settings.projects.page.toast.customIconAlreadySet': 'Custom icon already set for this project',
'settings.projects.page.toast.iconDiscovered': 'Project icon discovered',
'settings.projects.page.toast.saveFailed': 'Failed to save project settings',
'settings.usage.sidebar.title': 'Usage',
'settings.usage.sidebar.total': 'Total {count}',
'settings.usage.sidebar.actions.toggleAutoRefreshAria': 'Toggle auto refresh',
@@ -1115,6 +1201,9 @@ export const settingsDict = {
'settings.openchamber.worktrees.setup.commandPlaceholder': 'e.g., bun install',
'settings.openchamber.worktrees.setup.removeCommandAria': 'Remove command',
'settings.openchamber.worktrees.setup.addCommand': 'Add command',
'settings.openchamber.worktrees.setup.waitForCommands': 'Wait for setup commands before creating or sending a session',
'settings.openchamber.worktrees.setup.waitForCommandsAria': 'Wait for Worktree setup commands before creating or sending a session',
'settings.openchamber.worktrees.setup.toast.saveFailed': 'Failed to save worktree setup commands',
'settings.openchamber.worktrees.list.title': 'Existing worktrees',
'settings.openchamber.worktrees.list.tooltip': 'Worktrees live outside the repo (OpenCode-managed). Deleting a worktree also removes linked sessions.',
'settings.openchamber.worktrees.list.loading': 'Loading worktrees...',
@@ -1372,6 +1461,11 @@ export const settingsDict = {
'settings.openchamber.defaults.field.defaultAgent': 'Default Agent',
'settings.openchamber.defaults.field.showDeletionDialogAria': 'Show deletion dialog',
'settings.openchamber.defaults.field.showDeletionDialog': 'Show Deletion Dialog',
'settings.openchamber.defaults.smallModel.title': 'Small Model',
'settings.openchamber.defaults.smallModel.description': 'A cheap model for quick utility tasks like short recaps and summaries.',
'settings.openchamber.defaults.smallModel.useDefault': 'Use default small model',
'settings.openchamber.defaults.smallModel.useDefaultAria': 'Use default small model',
'settings.openchamber.defaults.smallModel.overrideModel': 'Override model',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Open files in preview mode',
'settings.openchamber.defaults.field.openFilesPreview': 'Open files in preview mode',
'settings.openchamber.defaults.option.default': 'Default',
@@ -1493,16 +1587,33 @@ export const settingsDict = {
'settings.notifications.page.toast.backgroundDisabled': 'Background notifications disabled',
'settings.notifications.page.testNotification.title': 'Test Notification',
'settings.notifications.page.testNotification.body': 'This is a test notification from OpenChamber.',
'settings.voice.page.section.voiceSetup': 'Voice Setup',
'settings.voice.page.section.speechRecognition': 'Speech Recognition',
'settings.voice.page.field.enableVoiceInput': 'Enable voice input',
'settings.voice.page.field.enableVoiceInputAria': 'Enable voice input (dictation)',
'settings.voice.page.section.playbackAndSummary': 'Playback',
'settings.voice.page.field.enableVoiceModeAria': 'Enable voice mode',
'settings.voice.page.field.enableVoiceMode': 'Enable Voice Mode',
'settings.voice.page.field.provider': 'Provider',
'settings.voice.page.provider.browser': 'Browser',
'settings.voice.page.provider.custom': 'Custom',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': 'Server',
'settings.voice.page.provider.local': 'Local',
'settings.voice.page.tooltip.sttLocal': 'On-device transcription on the OpenChamber server. Models download automatically; no API key needed.',
'settings.voice.page.tooltip.localTts': 'On-device synthesis on the OpenChamber server (Kokoro, English). The model downloads automatically; no API key needed.',
'settings.voice.page.stt.model.parakeetV2': 'Parakeet v2 (English)',
'settings.voice.page.stt.model.parakeetV3': 'Parakeet v3 (25 European languages)',
'settings.voice.page.stt.model.whisperBase': 'Whisper base (multilingual)',
'settings.voice.page.stt.model.whisperTiny': 'Whisper tiny (multilingual)',
'settings.voice.page.stt.badge.bestForEnglish': 'Best for English',
'settings.voice.page.stt.badge.bestForMultilingual': 'Best for multilingual',
'settings.voice.page.stt.meta.accuracy': 'Accuracy',
'settings.voice.page.stt.meta.speed': 'Speed',
'settings.voice.page.stt.modelInstalled': 'Model installed',
'settings.voice.page.stt.modelDownloading': 'Downloading model...',
'settings.voice.page.stt.modelDownloadingProgress': 'Downloading model... {percent}%',
'settings.voice.page.stt.modelNotInstalled': 'Model not downloaded',
'settings.voice.page.stt.modelDownload': 'Download',
'settings.voice.page.stt.modelDelete': 'Delete model',
'settings.voice.page.stt.modelRetry': 'Retry',
'settings.voice.page.provider.wasm': 'Local',
'settings.voice.page.stt.wasmModel': 'Whisper Model',
'settings.voice.page.stt.wasmLoaded': 'Model loaded, ready',
@@ -1559,6 +1670,7 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputMode': 'TTS Input Mode',
'settings.voice.page.field.ttsInputModeSanitized': 'Sanitized',
'settings.voice.page.field.ttsInputModeRaw': 'Raw Markdown',
'settings.voice.page.field.ttsInputModeSummarized': 'summarized',
'settings.openchamber.visual.section.colorMode': 'Color Mode',
'settings.openchamber.visual.section.mobileLayout': 'Mobile Layout',
'settings.openchamber.visual.option.mobileLayout.default': 'Old',
@@ -1592,6 +1704,8 @@ export const settingsDict = {
'settings.openchamber.visual.actions.reloadingThemes': 'Reloading themes...',
'settings.openchamber.visual.field.macVibrancy': 'Window transparency',
'settings.openchamber.visual.field.macVibrancyHint': 'Use the native macOS blur (vibrancy) behind the sidebar. Turn off for fully solid, opaque surfaces.',
'settings.openchamber.visual.field.dockBadge': 'Dock badge',
'settings.openchamber.visual.field.dockBadgeHint': 'Show a count of chats with unseen activity on the macOS dock icon.',
'settings.openchamber.visual.actions.saveAndRestart': 'Save & restart',
'settings.openchamber.visual.actions.restarting': 'Restarting…',
'settings.openchamber.visual.field.themeImportInfoAria': 'Theme import info',
@@ -1617,10 +1731,12 @@ export const settingsDict = {
'settings.openchamber.visual.field.fontSizePercentageAria': 'Font size percentage',
'settings.openchamber.visual.actions.resetFontSizeAria': 'Reset font size',
'settings.openchamber.visual.field.terminalFontSize': 'Terminal Font Size',
'settings.openchamber.visual.field.editorFontSize': 'Editor Font Size',
'settings.openchamber.visual.field.codeFont': 'Code Font',
'settings.openchamber.visual.field.selectCodeFontAria': 'Select code font',
'settings.openchamber.visual.actions.resetCodeFontAria': 'Reset code font',
'settings.openchamber.visual.actions.resetTerminalFontSizeAria': 'Reset terminal font size',
'settings.openchamber.visual.actions.resetEditorFontSizeAria': 'Reset editor font size',
'settings.openchamber.visual.field.spacingDensity': 'Spacing Density',
'settings.openchamber.visual.actions.resetSpacingAria': 'Reset spacing',
'settings.openchamber.visual.field.inputBarOffset': 'Input Bar Offset',
@@ -1640,6 +1756,16 @@ export const settingsDict = {
'settings.openchamber.visual.field.userMessageRenderingAria': 'User message rendering: {option}',
'settings.openchamber.visual.field.mermaidRenderingAria': 'Mermaid rendering: {option}',
'settings.openchamber.visual.field.diffLayoutAria': 'Diff layout: {option}',
'settings.openchamber.visual.field.sessionRecap': 'Generate Session Recap',
'settings.openchamber.visual.field.sessionRecapAria': 'Generate a recap after the agent finishes',
'settings.openchamber.visual.field.sessionSuggestion': 'Generate Next User Message Suggestion',
'settings.openchamber.visual.field.sessionSuggestionAria': 'Generate a suggested next user message after the agent finishes',
'settings.openchamber.visual.field.sessionGoal': 'Enable Session Goals',
'settings.openchamber.visual.field.sessionGoalAria': 'Keep the session working toward a goal automatically',
'settings.openchamber.visual.goal.sectionTitle': 'Goal',
'settings.openchamber.visual.goal.budgetLabel': 'Default token budget',
'settings.openchamber.visual.goal.budgetAria': 'Apply a default token budget to new goals',
'settings.openchamber.visual.goal.description': 'Arm the target button in the composer and the next message becomes a goal: the agent keeps working toward it automatically, audited by the small model, even while you are away.',
'settings.openchamber.visual.field.showReasoningTracesAria': 'Show reasoning traces',
'settings.openchamber.visual.field.showReasoningTraces': 'Show Reasoning Traces',
'settings.openchamber.visual.field.collapsibleThinkingBlocksAria': 'Enable collapsible reasoning blocks',
@@ -1652,6 +1778,8 @@ export const settingsDict = {
'settings.openchamber.visual.field.expandedEditorToolbar': 'Always show editor toolbar (docked under the file tabs)',
'settings.openchamber.visual.field.wideChatLayoutAria': 'Wide chat layout',
'settings.openchamber.visual.field.wideChatLayout': 'Wide Chat Layout',
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Wrap code block lines',
'settings.openchamber.visual.field.codeBlockLineWrap': 'Wrap Code Block Lines',
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Inline assistant actions',
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Inline Assistant Actions',
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Show Copy Answer, Save as image, and Read aloud on assistant text blocks that appear before later tool calls in the same response.',
@@ -1784,4 +1912,10 @@ export const settingsDict = {
'settings.magicPrompts.page.toast.resetFailed': 'Failed to reset prompt',
'settings.magicPrompts.page.toast.resetAllSuccess': 'All prompt overrides reset',
'settings.magicPrompts.page.toast.resetAllFailed': 'Failed to reset all prompts',
'settings.openchamber.visual.section.followUpBehavior': 'Follow-up behavior',
'settings.openchamber.visual.section.followUpBehaviorAria': 'Follow-up behavior',
'settings.openchamber.visual.field.followUpBehaviorAria': 'Follow-up behavior: {option}',
'settings.openchamber.visual.field.followUpBehaviorDescription': 'Choose what happens when you press Enter on a follow-up message while the agent is still responding.',
'settings.openchamber.visual.option.followUpBehavior.steer.label': 'Steer',
'settings.openchamber.visual.option.followUpBehavior.queue.label': 'Queue',
} as const;
+150 -2
View File
@@ -13,6 +13,7 @@ export const dict = {
'common.language.brazilianPortuguese': 'Brazilian Portuguese',
'common.language.korean': 'Korean',
'common.language.polish': 'Polish',
'common.language.japanese': 'Japanese',
'common.revealPath.finder': 'Reveal in Finder',
'common.revealPath.fileExplorer': 'Open in File Explorer',
'common.revealPath.fileManager': 'Open in File Manager',
@@ -21,6 +22,13 @@ export const dict = {
'pwa.installPrompt.dismiss': 'Dismiss',
'pwa.installPrompt.started': 'Install started',
'pwa.installPrompt.installed': 'OpenChamber installed',
'shareOpinion.actions.shareOpinion': 'Share opinion',
'shareOpinion.actions.bookCall': 'Book a call',
'shareOpinion.actions.shortSurvey': 'Short survey',
'shareOpinion.dialog.title': 'Share your opinion',
'shareOpinion.toast.title': 'Help shape OpenChamber',
'shareOpinion.toast.description': 'Share what is useful, confusing, or missing to help shape what comes next.',
'sessions.sidebar.footer.actions.shareOpinion': 'Share opinion',
'layout.mainTab.chat': 'Chat',
'layout.mainTab.plan': 'Plan',
'layout.mainTab.diff': 'Diff',
@@ -29,6 +37,50 @@ export const dict = {
'layout.mainTab.terminal': 'Terminal',
'layout.mainTab.context': 'Context',
'mobile.nav.aria': 'Mobile navigation',
'mobile.connect.welcome.title': 'Connect to OpenChamber',
'mobile.connect.welcome.description': 'Add a server URL or scan a pairing QR code to start using the mobile app.',
'mobile.connect.url.label': 'Server URL',
'mobile.connect.url.placeholder': 'http://192.168.1.74:2606',
'mobile.connect.token.label': 'Client token',
'mobile.connect.token.placeholder': 'Paste access token',
'mobile.connect.token.hint': 'Only needed if your server requires a token instead of a password.',
'mobile.connect.password.label': 'Password',
'mobile.connect.password.placeholder': 'OpenChamber password',
'mobile.connect.connectButton': 'Connect',
'mobile.connect.unlockButton': 'Unlock and connect',
'mobile.connect.cancelPassword': 'Use another server',
'mobile.connect.connecting': 'Connecting...',
'mobile.connect.scanQr': 'Scan QR code',
'mobile.connect.welcome.scanHint': 'On your computer, open «Add a device» to show a QR code, then scan it here.',
'mobile.connect.advanced': 'Advanced',
'mobile.connect.manual.toggle': 'Connect by address',
'mobile.connect.scan.permissionDenied': 'Camera access is off. Enable it in Settings to scan a QR code.',
'mobile.connect.scan.failed': 'Could not scan that QR code. Try again or enter the URL manually.',
'mobile.connect.scan.invalid': 'That QR code is not an OpenChamber connection code.',
'mobile.connect.scan.unsupported': 'QR scanning is only available in the installed mobile app.',
'mobile.connect.saved.title': 'Saved connections',
'mobile.connect.saved.empty': 'No saved connections yet.',
'mobile.connect.relay.badge': 'via OpenChamber Relay',
'mobile.connect.error.urlRequired': 'Enter a server URL.',
'mobile.connect.error.invalidUrl': 'That server URL is not valid.',
'mobile.connect.error.unreachable': 'Could not reach that OpenChamber server.',
'mobile.connect.error.authRequired': 'This server needs a password or client token.',
'mobile.connect.error.passwordFailed': 'Could not unlock that server. Check the password.',
'mobile.instances.addTitle': 'Add instance',
'mobile.instances.addManual': 'Add by address',
'mobile.instances.editTitle': 'Edit instance',
'mobile.instances.edit': 'Edit',
'mobile.instances.delete': 'Delete',
'mobile.instances.deleteAria': 'Delete {label}',
'mobile.instances.confirmDeleteAria': 'Confirm deleting {label}',
'mobile.instances.cancelDeleteAria': 'Keep {label}',
'mobile.instances.cancelEdit': 'Cancel',
'mobile.instances.label.label': 'Name',
'mobile.instances.label.placeholder': 'Optional display name',
'mobile.instances.saveNew': 'Save instance',
'mobile.instances.status.connectedDirect': 'Connected · Local network',
'mobile.instances.status.connectedRelay': 'Connected · Private relay',
'mobile.instances.saveEdit': 'Save changes',
'mobile.nav.changes': 'Changes',
'mobile.nav.settings': 'Settings',
'mobile.surface.closeAria': 'Close',
@@ -41,6 +93,7 @@ export const dict = {
'mobile.menu.files': 'Files',
'mobile.menu.changes': 'Changes',
'mobile.menu.mcp': 'MCP',
'mobile.menu.instances': 'Instances',
'mobile.menu.update': 'Update',
'mobile.menu.settings': 'Settings',
'mobile.sessions.newChatCta': 'New chat in {project}',
@@ -239,6 +292,10 @@ export const dict = {
'sessions.scheduledTasks.editor.prompt.placeholder': 'Summarize open tasks and propose next actions',
'sessions.scheduledTasks.editor.enabled.aria': 'Enable task',
'sessions.scheduledTasks.editor.enabled.label': 'Enabled',
'sessions.scheduledTasks.editor.goal.label': 'Run as goal',
'sessions.scheduledTasks.editor.goal.aria': 'Run this task as a goal the agent pursues to completion',
'sessions.scheduledTasks.editor.goal.budgetLabel': 'Token budget',
'sessions.scheduledTasks.editor.goal.budgetAria': 'Limit the goal to a token budget',
'sessions.scheduledTasks.editor.actions.closeAria': 'Close',
'sessions.scheduledTasks.editor.actions.cancel': 'Cancel',
'sessions.scheduledTasks.editor.actions.save': 'Save',
@@ -329,6 +386,7 @@ export const dict = {
'sessions.sidebar.header.actions.searchSessions': 'Search sessions',
'sessions.sidebar.header.actions.exitSelection': 'Exit selection',
'sessions.sidebar.header.actions.selectSessions': 'Select sessions',
'sessions.sidebar.header.actions.sortProjects': 'Sort projects',
'sessions.sidebar.header.actions.sessionDisplayMode': 'Session display mode',
'sessions.sidebar.header.displayMode.label': 'Display mode',
'sessions.sidebar.header.displayMode.default': 'Default',
@@ -337,6 +395,11 @@ export const dict = {
'sessions.sidebar.header.displayMode.showArchived': 'Show archived sessions',
'sessions.sidebar.header.displayMode.collapseAll': 'Collapse all',
'sessions.sidebar.header.displayMode.expandAll': 'Expand all',
'sessions.sidebar.header.projectSort.manual': 'Manual',
'sessions.sidebar.header.projectSort.aToZ': 'A → Z',
'sessions.sidebar.header.projectSort.zToA': 'Z → A',
'sessions.sidebar.header.projectSort.dateAdded': 'Newest',
'sessions.sidebar.header.projectSort.recent': 'Recent',
'sessions.sidebar.header.search.matchCountSingle': '{count} match',
'sessions.sidebar.header.search.matchCountPlural': '{count} matches',
'sessions.sidebar.header.search.escapeHint': 'Esc to clear',
@@ -380,6 +443,7 @@ export const dict = {
'sessions.sidebar.project.actions.newWorktreeEllipsis': 'New worktree...',
'sessions.sidebar.project.actions.projectMenu': 'Project menu',
'sessions.sidebar.project.actions.newSession': 'New session',
'sessions.sidebar.project.actions.edit': 'Edit',
'sessions.sidebar.project.actions.closeProject': 'Close project',
'sessions.sidebar.project.actions.newDraftSession': 'New draft session',
'sessions.sidebar.session.menu.rename': 'Rename',
@@ -1207,6 +1271,7 @@ export const dict = {
'diffView.state.loadingRepositoryStatus': 'Loading repository status...',
'diffView.state.notGitRepository': 'Not a git repository. Use the Git tab to initialize or change directories.',
'diffView.state.cleanWorkingTree': 'Working tree clean, no changes to display',
'diffView.state.noLastTurnChanges': 'No last turn changes to display',
'diffView.state.failedToLoadDiff': 'Failed to load diff',
'diffView.state.loadingDiff': 'Loading diff...',
'diffView.state.loadingChanges': 'Loading changes...',
@@ -1216,6 +1281,7 @@ export const dict = {
'diffView.summary.changedFilesPlural': '{count} files changed',
'diffView.scope.changed': 'Changed',
'diffView.scope.staged': 'Staged',
'diffView.scope.lastTurn': 'Last turn',
'diffView.scope.selectorAria': 'Select change mode',
'diffView.actions.retry': 'Retry',
'diffView.actions.renderAnyway': 'Render anyway',
@@ -1232,12 +1298,20 @@ export const dict = {
'diffView.reviewDialog.title': 'Review changes',
'diffView.reviewDialog.description': 'Start a separate review session for the current changes.',
'diffView.reviewDialog.generateHandoff': 'Generate handoff',
'diffView.reviewDialog.autoReview': 'Run automatic review loop',
'diffView.reviewDialog.info': 'This flow works best when started from the session where the changes were implemented.',
'diffView.reviewDialog.actions.cancel': 'Cancel',
'diffView.reviewDialog.actions.start': 'Review',
'diffView.reviewDialog.actions.starting': 'Starting...',
'diffView.reviewDialog.toast.noSessionDirectory': 'Session directory is unavailable',
'diffView.reviewDialog.toast.startFailed': 'Failed to start review flow',
'chat.history.loadOlder': 'Load older messages',
'chat.autoReview.title': 'Code review loop is running',
'chat.autoReview.status.waitingForReviewer': 'Waiting for reviewer',
'chat.autoReview.status.waitingForImplementer': 'Waiting for implementer',
'chat.autoReview.reviewSessionLabel': 'Review session',
'chat.autoReview.actions.open': 'Open',
'chat.autoReview.actions.stop': 'Stop',
'diffView.hunk.label': 'Hunks',
'diffView.hunk.stage': 'Stage',
'diffView.hunk.unstage': 'Unstage',
@@ -1339,6 +1413,43 @@ export const dict = {
'header.actions.toggleChangesPanelAria': 'Toggle changes panel',
'header.actions.planWithShortcut': 'Plan ({shortcut})',
'header.actions.terminalPanelWithShortcut': 'Terminal panel ({shortcut})',
'chat.recap.aria': 'Session recap',
'chat.recap.label': 'Recap:',
'chat.goal.dialog.titleCreate': 'Set Session Goal',
'chat.goal.dialog.titleManage': 'Session Goal',
'chat.goal.dialog.objectiveLabel': 'Objective',
'chat.goal.dialog.objectivePlaceholder': 'Describe the end state the agent should reach and verify…',
'chat.goal.dialog.budgetLabel': 'Token budget',
'chat.goal.status.active': 'Active',
'chat.goal.status.evaluating': 'Evaluating…',
'chat.goal.status.paused': 'Paused',
'chat.goal.status.blocked': 'Blocked',
'chat.goal.status.budgetLimited': 'Budget reached',
'chat.goal.status.complete': 'Complete',
'chat.goal.usage.tokens': '{used} tokens',
'chat.goal.usage.tokensWithBudget': '{used}/{budget} tokens',
'chat.goal.usage.turns': '{turns} continuations',
'chat.goal.action.pause': 'Pause',
'chat.goal.action.resume': 'Resume',
'chat.goal.action.markComplete': 'Mark complete',
'chat.goal.action.clear': 'Remove goal',
'chat.goal.action.cancel': 'Cancel',
'chat.goal.action.save': 'Save goal',
'chat.goal.action.start': 'Start goal',
'chat.goal.toast.actionFailed': 'Goal update failed',
'chat.goal.row.aria': 'Session goal — open details',
'chat.goal.button.createAria': 'Set a session goal',
'chat.goal.button.manageAria': 'Manage session goal',
'chat.goal.button.armAria': 'Start a goal with the next message',
'chat.goal.counter.aria': 'Goal objective length limit',
'chat.goal.button.disarmAria': 'Goal armed — tap to disarm',
'chat.goal.button.cancelAria': 'Goal running — tap to cancel it',
'chat.goal.cancelDialog.title': 'Cancel this goal?',
'chat.goal.cancelDialog.description': 'The agent will stop working toward this goal automatically.',
'chat.goal.cancelDialog.keep': 'Keep goal',
'chat.goal.cancelDialog.confirm': 'Cancel goal',
'chat.suggestion.applyAria': 'Use suggested message',
'chat.suggestion.dismissAria': 'Dismiss suggestion',
'header.actions.toggleTerminalPanelAria': 'Toggle terminal panel',
'terminalView.stream.processExitedMessage': '\r\n[Process exited{exitCodeSegment}{signalSegment}]\r\n',
'terminalView.stream.processExitedWithCode': ' with code {exitCode}',
@@ -1720,6 +1831,7 @@ export const dict = {
'chat.queuedMessage.edit': 'edit',
'chat.queuedMessage.send': 'send',
'chat.queuedMessage.removeAria': 'Remove from queue',
'chat.queuedMessage.reorderAria': 'Drag to reorder',
'chat.container.returnToParent.aria': 'Return to parent session',
'chat.container.returnToParent.titleNamed': 'Return to: {title}',
'chat.container.returnToParent.title': 'Return to parent session',
@@ -1824,6 +1936,18 @@ export const dict = {
'chat.chatInput.placeholder.chat': '@ for files/agents; / for commands and skills; ! for shell; # for snippets',
'chat.chatInput.placeholder.chatCompact': 'Use @ / ! # for helpers',
'chat.chatInput.placeholder.selectSession': 'Select or create a session to start chatting',
'chat.dictation.start': 'Start dictation',
'chat.dictation.overlayAria': 'Dictation',
'chat.dictation.downloadingModel': 'Downloading speech model...',
'chat.dictation.downloadingModelProgress': 'Downloading speech model... {percent}%',
'chat.dictation.listening': 'Listening...',
'chat.dictation.processing': 'Transcribing...',
'chat.dictation.failed': 'Transcription failed',
'chat.dictation.cancel': 'Discard dictation',
'chat.dictation.insert': 'Insert transcript',
'chat.dictation.insertAndSend': 'Insert and send',
'chat.dictation.retry': 'Retry transcription',
'chat.dictation.discard': 'Discard recording',
'chat.snippetAutocomplete.action.addNew': '+ Add new snippet',
'chat.snippetAutocomplete.empty': 'No snippets found',
'chat.snippetAutocomplete.footer': '↑↓ navigate • Enter select • Esc close',
@@ -1859,6 +1983,9 @@ export const dict = {
'chat.chatInput.previewContextRemove': 'Remove preview context',
'chat.chatInput.projectRoot': 'Project root',
'chat.chatInput.branch': 'Branch',
'chat.chatInput.draftPicker.projectTitle': 'Project',
'chat.chatInput.draftPicker.searchProjects': 'Search projects...',
'chat.chatInput.draftPicker.searchBranches': 'Search branches...',
'chat.chatInput.worktrees': 'Worktrees',
'chat.chatInput.worktreeNew': '+ New',
'chat.chatInput.drop.insertMention': 'Drop to insert as mention',
@@ -1884,6 +2011,11 @@ export const dict = {
'chat.toolOutputDialog.image.closeAria': 'Close image preview',
'chat.toolOutputDialog.mermaid.missingSource': 'Missing Mermaid source URL.',
'chat.toolOutputDialog.mermaid.loadFailed': 'Unable to load Mermaid diagram.',
'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'The Mermaid data URL is malformed.',
'chat.toolOutputDialog.mermaid.invalidLocalPath': 'The local Mermaid file path is invalid.',
'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': 'Unable to read Mermaid file. Status: {status}.',
'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': 'The Mermaid URL protocol is unsupported.',
'chat.toolOutputDialog.mermaid.loadFailedWithStatus': 'Unable to load Mermaid diagram. Status: {status}.',
'chat.toolOutputDialog.mermaid.closeAria': 'Close diagram preview',
'chat.toolOutputDialog.mermaid.loading': 'Loading diagram...',
'chat.toolOutputDialog.mermaid.renderFailed': 'Unable to render Mermaid diagram.',
@@ -1897,7 +2029,10 @@ export const dict = {
'chat.toolPart.noOutputProduced': 'No output produced',
'chat.toolPart.output': 'Output',
'chat.toolPart.showRawJson': 'Show raw JSON',
'chat.toolPart.showFormattedJson': 'Show formatted JSON',
'chat.toolPart.showFormattedJson': 'Show formatted JSON',
'chat.toolPart.showNavigableJson': 'Show navigable JSON',
'chat.toolPart.openFileAtFirstChange': 'Open file at first change',
'chat.toolPart.openFileDiff': 'Open file diff',
'chat.toolPart.copyOutput': 'Copy output',
'chat.toolPart.copiedOutput': 'Copied output',
'chat.toolPart.copyOutputFailed': 'Failed to copy output',
@@ -1991,6 +2126,7 @@ export const dict = {
'chat.modelControls.noProvidersOrModelsFound': 'No providers or models match your search.',
'chat.modelControls.reorderFavoriteAria': 'Reorder favorite',
'chat.modelControls.reorderFavoriteTitle': 'Drag to reorder favorite',
'chat.modelControls.reorderProviderTitle': 'Drag to reorder provider',
'chat.modelControls.permissionLabel.custom': 'Custom',
'chat.modelControls.permissionLabel.allow': 'Allow',
'chat.modelControls.permissionLabel.deny': 'Deny',
@@ -2231,7 +2367,7 @@ export const dict = {
'sessionAuth.error.networkTitle': 'Unable to reach server',
'sessionAuth.error.rateLimitDescriptionSingle': 'Please wait {minutes} minute before trying again.',
'sessionAuth.error.rateLimitDescriptionPlural': 'Please wait {minutes} minutes before trying again.',
'sessionAuth.error.networkDescription': 'We could not verify the UI session. Check that the service is running and try again.',
'sessionAuth.error.networkDescription': 'We could not verify the UI session. If you\'re opening OpenChamber from another device on your local network, make sure Desktop Network Access is enabled on the desktop app and use the LAN address shown in Settings.',
'sessionAuth.error.retry': 'Retry',
'sessionAuth.error.passkeySetupFailed': 'Passkey setup failed.',
'sessionAuth.error.incorrectPassword': 'Incorrect password. Try again.',
@@ -2518,9 +2654,14 @@ export const dict = {
'updateDialog.status.downloading': 'Downloading...',
'updateDialog.actions.restartToUpdate': 'Restart to Update',
'updateDialog.actions.updateNow': 'Update Now',
'updateDialog.actions.openMobileUpdate': 'Open update',
'updateDialog.status.updating': 'Updating...',
'updateDialog.error.updateFailed': 'Update failed',
'updateDialog.error.takingLonger': 'Update is taking longer than expected. Wait a bit and refresh, or run: openchamber update',
'mobileUpdate.toast.available.title': 'OpenChamber update available',
'mobileUpdate.toast.available.description': 'Version {version} is ready for Android.',
'mobileUpdate.toast.actions.download': 'Download',
'mobileUpdate.toast.actions.dismiss': 'Dismiss',
'opencodeUpdate.toast.available.title': 'OpenCode update',
'opencodeUpdate.toast.available.description': 'Version {version} available.',
'opencodeUpdate.toast.actions.update': 'Update',
@@ -2596,12 +2737,19 @@ export const dict = {
'mainLayout.mobile.closeDrawerAria': 'Close drawer',
'sortableTabsStrip.aria.tabs': 'Tabs',
'openChamberLogo.aria.logo': 'OpenChamber logo',
'markdownRenderer.code.actions.copyTitle': 'Copy code',
'markdownRenderer.code.actions.copiedTitle': 'Copied',
'markdownRenderer.table.actions.copyTitle': 'Copy table',
'markdownRenderer.code.actions.enableWrapTitle': 'Enable line wrap',
'markdownRenderer.code.actions.disableWrapTitle': 'Disable line wrap',
'markdownRenderer.table.actions.downloadTitle': 'Download table',
'markdownRenderer.table.toast.downloadedAsFormat': 'Table downloaded as {format}',
'markdownRenderer.mermaid.actions.copyTitle': 'Copy',
'markdownRenderer.mermaid.actions.copySourceTitle': 'Copy source',
'markdownRenderer.mermaid.actions.downloadSvgTitle': 'Download SVG',
'markdownRenderer.mermaid.actions.zoomInTitle': 'Zoom in',
'markdownRenderer.mermaid.actions.zoomOutTitle': 'Zoom out',
'markdownRenderer.mermaid.actions.resetViewTitle': 'Reset view',
'markdownRenderer.mermaid.toast.downloadFailed': 'Failed to download diagram',
'common.date.today': 'Today',
'common.date.yesterday': 'Yesterday',
@@ -220,11 +220,18 @@ export const settingsDict = {
"settings.remoteInstances.direct.sidebarTitle": "Enlaces a servidores",
"settings.remoteInstances.direct.sidebarDescription": "Conecta con un enlace o token",
"settings.remoteInstances.direct.title": "Otros servidores de OpenChamber",
"settings.remoteInstances.direct.description": "Añade otro servidor de OpenChamber por URL. Úsalo cuando el servidor ya esté en marcha y tengas un token de conexión.",
"settings.remoteInstances.direct.description": "Servidores a los que esta aplicación puede cambiar. Importa un enlace de conexión del otro servidor o añádelo por dirección.",
"settings.remoteInstances.direct.addDialog.description": "Añade otro servidor de OpenChamber por URL. Úsalo cuando el servidor ya esté en marcha y tengas un token de conexión.",
"settings.remoteInstances.direct.field.labelPlaceholder": "Etiqueta (opcional)",
"settings.remoteInstances.direct.field.urlPlaceholder": "https://host:port",
"settings.remoteInstances.direct.field.tokenPlaceholder": "Token de conexión (opcional para servidores locales de confianza)",
"settings.remoteInstances.direct.note": "Los tokens de conexión se guardan en este dispositivo y solo se usan cuando esta app se conecta a ese servidor.",
"settings.remoteInstances.direct.headers.title": "Additional headers",
"settings.remoteInstances.direct.headers.description": "Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.",
"settings.remoteInstances.direct.headers.field.namePlaceholder": "Header name",
"settings.remoteInstances.direct.headers.field.valuePlaceholder": "Header value",
"settings.remoteInstances.direct.headers.actions.add": "Add header",
"settings.remoteInstances.direct.headers.removeAria": "Remove header",
"settings.remoteInstances.direct.actions.add": "Añadir servidor",
"settings.remoteInstances.direct.import.description": "Pega un enlace de conexión de otro servidor de OpenChamber.",
"settings.remoteInstances.direct.import.placeholder": "openchamber://connect?...",
@@ -234,20 +241,74 @@ export const settingsDict = {
"settings.remoteInstances.direct.state.empty": "Todavía no se han añadido otros servidores.",
"settings.remoteInstances.clientAuth.title": "Conectarse a este servidor",
"settings.remoteInstances.clientAuth.description": "Crea un enlace o token seguro para que OpenChamber Desktop pueda conectarse a este servidor.",
"settings.remoteInstances.clientAuth.field.labelPlaceholder": "Nombre del dispositivo (opcional)",
"settings.remoteInstances.clientAuth.field.labelPlaceholder": "Nombre del dispositivo — p. ej. Mi iPhone",
"settings.remoteInstances.clientAuth.actions.create": "Crear token",
"settings.remoteInstances.clientAuth.actions.pair": "Crear enlace",
"settings.remoteInstances.clientAuth.actions.revoke": "Revocar",
"settings.remoteInstances.clientAuth.actions.clearRevoked": "Borrar revocados",
"settings.remoteInstances.clientAuth.qrAlt": "OpenChamber connection QR code",
"settings.remoteInstances.clientAuth.qrEnlarge": "Ampliar código QR",
"settings.remoteInstances.clientAuth.qrScanHint": "Escanéalo con la app de OpenChamber en tu otro dispositivo. Es de un solo uso y caduca.",
"settings.remoteInstances.clientAuth.qrDialogTitle": "Escanear para conectar",
"settings.remoteInstances.clientAuth.actions.addDevice": "Añadir un dispositivo",
"settings.remoteInstances.clientAuth.actions.copied": "Copiado",
"settings.remoteInstances.clientAuth.addDevice.transportLabel": "¿Dónde usarás este dispositivo?",
"settings.remoteInstances.clientAuth.addDevice.subtitle": "Crea un código QR de un solo uso que conecta otro dispositivo a este servidor.",
"settings.remoteInstances.clientAuth.addDevice.transport.local": "Solo este equipo",
"settings.remoteInstances.clientAuth.addDevice.transport.localHint": "Para aplicaciones en esta misma máquina.",
"settings.remoteInstances.clientAuth.addDevice.transport.lan": "Solo red doméstica",
"settings.remoteInstances.clientAuth.addDevice.transport.lanHint": "Se conecta directamente por tu Wi-Fi. No funciona fuera de esta red.",
"settings.remoteInstances.clientAuth.addDevice.transport.relay": "En cualquier lugar",
"settings.remoteInstances.clientAuth.addDevice.transport.relayHint": "Funciona en casa y fuera. Fuera de casa el tráfico pasa por OpenChamber Private Relay, un túnel cifrado de extremo a extremo. Sin configuración.",
"settings.remoteInstances.clientAuth.addDevice.fallback.relay": "Permitir también el relay cifrado fuera de casa",
"settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal": "Preferir la conexión doméstica directa cuando esté disponible",
"settings.remoteInstances.clientAuth.addDevice.create": "Crear código QR",
"settings.remoteInstances.clientAuth.addDevice.done": "Listo",
"settings.remoteInstances.clientAuth.addDevice.connectedToast": "Dispositivo conectado.",
"settings.remoteInstances.clientAuth.pairingUrl": "Enlace de conexión",
"settings.remoteInstances.clientAuth.createdToken": "Copia este token ahora. Por seguridad, no se volverá a mostrar.",
"settings.remoteInstances.clientAuth.state.loading": "Cargando tokens...",
"settings.remoteInstances.clientAuth.state.empty": "Todavía no hay dispositivos conectados.",
"settings.remoteInstances.clientAuth.state.revoked": "Revocado",
"settings.remoteInstances.clientAuth.state.thisDevice": "Este dispositivo",
"settings.remoteInstances.clientAuth.state.pending": "Esperando conexión…",
"settings.remoteInstances.clientAuth.state.viaRelay": "Relay",
"settings.remoteInstances.clientAuth.state.connectedDirect": "Conectado · Red local",
"settings.remoteInstances.clientAuth.state.connectedRelay": "Conectado · Relay",
"settings.remoteInstances.clientAuth.lastUsed": "Último uso {date}",
"settings.remoteInstances.clientAuth.neverUsed": "Nunca usado",
"settings.remoteInstances.relay.title": "OpenChamber Relay",
"settings.remoteInstances.relay.autoHint": "Se activa automáticamente al vincular un dispositivo por relay.",
"settings.remoteInstances.relay.description": "Permite que tus otros dispositivos se conecten desde cualquier lugar sin abrir puertos. El tráfico está cifrado de extremo a extremo: el relay no puede leerlo.",
"settings.remoteInstances.relay.enableHint": "No se comparte nada hasta que actives el relay en este servidor.",
"settings.remoteInstances.relay.actions.enable": "Activar Relay",
"settings.remoteInstances.relay.actions.disable": "Desactivar",
"settings.remoteInstances.relay.confirm.disable": "¿Desactivar el relay? Los dispositivos conectados a través de él se desconectarán de inmediato.",
"settings.remoteInstances.relay.state.loading": "Comprobando el estado del relay...",
"settings.remoteInstances.relay.state.disabled": "Desactivado",
"settings.remoteInstances.relay.state.connecting": "Conectando",
"settings.remoteInstances.relay.state.connected": "Conectado",
"settings.remoteInstances.relay.state.reconnecting": "Reconectando",
"settings.remoteInstances.relay.state.error": "Error",
"settings.remoteInstances.relay.status.clientsOne": "{count} dispositivo conectado",
"settings.remoteInstances.relay.status.clientsMany": "{count} dispositivos conectados",
"settings.remoteInstances.relay.pair.title": "Emparejar un dispositivo",
"settings.remoteInstances.relay.pair.labelPlaceholder": "Nombre del dispositivo (opcional)",
"settings.remoteInstances.relay.pair.includeToken": "Incluir token de acceso (emparejamiento con un solo escaneo)",
"settings.remoteInstances.relay.pair.noTokenHint": "Sin token, el dispositivo inicia sesión con la contraseña de la interfaz de este servidor tras conectarse.",
"settings.remoteInstances.relay.pair.generate": "Crear enlace de emparejamiento",
"settings.remoteInstances.relay.pair.requiresConnected": "El emparejamiento estará disponible cuando el relay esté conectado.",
"settings.remoteInstances.relay.pair.linkLabel": "Enlace de emparejamiento",
"settings.remoteInstances.relay.pair.warning": "Este enlace concede acceso a este servidor. No lo compartas.",
"settings.remoteInstances.relay.pair.qrAlt": "Código QR de emparejamiento del relay",
"settings.remoteInstances.relay.pair.showQr": "Mostrar código QR",
"settings.remoteInstances.relay.pair.qrDialogTitle": "Escanear para emparejar",
"settings.remoteInstances.relay.pair.qrDialogDescription": "Escanea este código QR con la app de OpenChamber en tu otro dispositivo.",
"settings.remoteInstances.relay.pair.manageHint": "Gestiona o revoca los dispositivos emparejados en la lista «Conexión a este servidor» de arriba.",
"settings.remoteInstances.relay.toast.enableFailed": "No se pudo activar el relay",
"settings.remoteInstances.relay.toast.disableFailed": "No se pudo desactivar el relay",
"settings.remoteInstances.relay.toast.offerFailed": "No se pudo crear el enlace de emparejamiento",
"settings.remoteInstances.relay.toast.linkCopied": "Enlace de emparejamiento copiado",
"settings.remoteInstances.sidebar.phase.ready": "Listo",
"settings.remoteInstances.sidebar.phase.error": "Error",
"settings.remoteInstances.sidebar.phase.reconnect": "Reconectar",
@@ -365,12 +426,14 @@ export const settingsDict = {
"settings.agents.sidebar.toast.agentExists": "Ya existe un agente con este nombre",
"settings.agents.sidebar.toast.removeOldAfterRenameFailed": "No se pudo eliminar el antiguo agente después del cambio de nombre",
"settings.agents.sidebar.toast.renameFailed": "No se pudo cambiar el nombre del agente",
"settings.agents.sidebar.toast.agentRenamed": "Agente renombrado a \"{name}\"",
"settings.agents.page.toast.permissionNameRequired": "Se requiere el nombre del permiso",
"settings.agents.page.toast.created": "Agente creado correctamente",
"settings.agents.page.toast.updated": "Agente actualizado correctamente",
"settings.agents.page.toast.createFailed": "No se pudo crear el agente",
"settings.agents.page.toast.updateFailed": "No se pudo actualizar el agente",
"settings.agents.page.toast.saveUnexpectedError": "Ocurrió un error al guardar",
"settings.agents.page.toast.savedManualRestart": "Guardado en disco. Reinicia tu servidor OpenCode conectado para aplicar los cambios.",
"settings.agents.page.empty.title": "Selecciona un agente desde la barra lateral",
"settings.agents.page.empty.description": "o crea uno nuevo",
"settings.agents.page.title.new": "Nuevo agente",
@@ -387,6 +450,10 @@ export const settingsDict = {
"settings.agents.page.field.mode": "Modo",
"settings.agents.page.field.modeTooltip": "Visibilidad principal vs subagente",
"settings.agents.page.field.overrideModel": "Sobrescribir modelo",
"settings.agents.page.field.variant": "Variante de pensamiento",
"settings.agents.page.field.variantTooltip": "Opcional. Si el modelo admite razonamiento, la variante controla la profundidad del razonamiento.",
"settings.agents.page.field.variantHint": "Específico del modelo (p. ej. variante de Anthropic)",
"settings.agents.page.field.variantPlaceholder": "p. ej. high, max, low, none",
"settings.agents.page.field.temperature": "Temperatura",
"settings.agents.page.field.temperatureTooltip": "Controla la aleatoriedad. Mayor = más creativo, menor = más enfocado.",
"settings.agents.page.field.temperatureRange": "0.0 a 2.0",
@@ -500,6 +567,7 @@ export const settingsDict = {
"settings.gitIdentities.editor.description.globalReadOnly": "Identidad Git global (solo lectura)",
"settings.gitIdentities.editor.description.newProfile": "Crear una nueva identidad Git",
"settings.gitIdentities.editor.description.editProfile": "Editar la configuración de la identidad",
"settings.gitIdentities.editor.section.commitSigning": "Firma de commits",
"settings.gitIdentities.editor.field.profileName": "Nombre de la identidad",
"settings.gitIdentities.editor.field.profileNamePlaceholder": "Identidad de trabajo, personal, etc.",
"settings.gitIdentities.editor.field.color": "Color",
@@ -515,6 +583,9 @@ export const settingsDict = {
"settings.gitIdentities.editor.field.sshKeyPath": "Ruta de la clave SSH",
"settings.gitIdentities.editor.field.sshKeyPathTooltip": "Ruta opcional a la clave privada. Ejemplo: ~/.ssh/id_ed25519",
"settings.gitIdentities.editor.field.sshKeyPathPlaceholder": "~/.ssh/id_ed25519",
"settings.gitIdentities.editor.field.signCommits": "Firmar commits con esta identidad",
"settings.gitIdentities.editor.field.signingKey": "Clave de firma",
"settings.gitIdentities.editor.field.signingKeyPlaceholder": "~/.ssh/id_ed25519.pub",
"settings.gitIdentities.editor.field.host": "Servidor",
"settings.gitIdentities.editor.field.hostTooltip": "El token se leerá de ~/.git-credentials para este servidor.",
"settings.gitIdentities.editor.field.hostPlaceholder": "github.com",
@@ -523,6 +594,7 @@ export const settingsDict = {
"settings.gitIdentities.editor.actions.save": "Guardar",
"settings.gitIdentities.editor.toast.userNameEmailRequired": "Se requieren nombre de usuario y dirección de correo electrónico",
"settings.gitIdentities.editor.toast.hostRequiredForToken": "Se requiere un servidor para autenticación basada en token",
"settings.gitIdentities.editor.toast.signingKeyRequired": "Se requiere una clave de firma cuando la firma de commits está activada",
"settings.gitIdentities.editor.toast.profileCreated": "Identidad creada",
"settings.gitIdentities.editor.toast.profileUpdated": "Identidad actualizada",
"settings.gitIdentities.editor.toast.createProfileFailed": "No se pudo crear la identidad",
@@ -772,7 +844,13 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.title": "Acceso de red de escritorio",
"settings.openchamber.desktopNetwork.field.launchAtLoginAria": "Iniciar OpenChamber al iniciar sesión",
"settings.openchamber.desktopNetwork.field.launchAtLogin": "Iniciar OpenChamber al iniciar sesión",
"settings.openchamber.desktopNetwork.field.launchAtLoginDescription": "Inicia la app en segundo plano sin abrir una ventana. Haz clic en el icono del Dock para abrirla.",
"settings.openchamber.desktopNetwork.field.launchAtLoginDescription": "Inicia la app en segundo plano sin abrir una ventana. Usa el icono de estado del escritorio para abrirla.",
"settings.openchamber.desktopNetwork.field.minimizeToTrayAria": "Minimizar y cerrar OpenChamber a la bandeja del sistema",
"settings.openchamber.desktopNetwork.field.minimizeToTray": "Minimizar y cerrar a la bandeja del sistema",
"settings.openchamber.desktopNetwork.field.minimizeToTrayDescription": "Mantiene OpenChamber en ejecución en la bandeja del sistema de Windows cuando la ventana principal se minimiza o se cierra.",
"settings.openchamber.desktopNetwork.field.keepAwakeAria": "Mantener el ordenador activo mientras OpenChamber está en ejecución",
"settings.openchamber.desktopNetwork.field.keepAwake": "Mantener el ordenador activo mientras OpenChamber está en ejecución",
"settings.openchamber.desktopNetwork.field.keepAwakeDescription": "Para que los teléfonos puedan seguir abriendo esta app. La pantalla aún puede apagarse.",
"settings.openchamber.desktopNetwork.field.allowLanAccessAria": "Permitir acceso LAN al lado de escritorio",
"settings.openchamber.desktopNetwork.field.allowLanAccess": "Permitir que otros dispositivos en tu red local abran esta aplicación",
"settings.openchamber.desktopNetwork.field.allowLanAccessDescription": "Reinicia la aplicación para que los teléfonos, tablets y otros ordenadores en tu Wi-Fi puedan abrirla.",
@@ -789,6 +867,10 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.error.savedRestartFailed": "Guardado, pero no se pudo reiniciar la aplicación",
"settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported": "El inicio al iniciar sesión no es compatible con este sistema",
"settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed": "No se pudo actualizar la opción de inicio al iniciar sesión",
"settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported": "El modo en segundo plano de la bandeja del sistema no es compatible con este sistema",
"settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed": "No se pudo actualizar la opción de bandeja del sistema",
"settings.openchamber.desktopNetwork.error.keepAwakeUnsupported": "Evitar la suspensión no es compatible con este sistema",
"settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed": "No se pudo actualizar la opción de mantener activo",
"settings.openchamber.opencodeCli.title": "CLI de OpenCode",
"settings.openchamber.opencodeCli.tooltipPrefix": "Ruta absoluta opcional al",
"settings.openchamber.opencodeCli.tooltipSuffix": "ejecutable.",
@@ -917,6 +999,7 @@ export const settingsDict = {
"settings.openchamber.keyboardShortcuts.action.cycle_agent.label": "Cambiar agente",
"settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label": "Siguiente modelo favorito",
"settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label": "Modelo favorito anterior",
"settings.openchamber.keyboardShortcuts.action.open_model_selector.label": "Abrir selector de modelo",
"settings.openchamber.keyboardShortcuts.action.expand_input.label": "Expandir entrada",
"settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label": "Abrir línea de tiempo de conversación",
"settings.projects.sidebar.total": "Total {count}",
@@ -926,6 +1009,8 @@ export const settingsDict = {
"settings.projects.page.section.worktree": "Worktree",
"settings.projects.page.field.projectName": "Nombre del proyecto",
"settings.projects.page.field.projectNamePlaceholder": "Nombre del proyecto",
"settings.projects.page.field.defaultModel": "Modelo predeterminado para chats nuevos",
"settings.projects.page.field.defaultModelDescription": "Se usa al iniciar un chat nuevo en este proyecto. Si no se define, se usan los valores globales.",
"settings.projects.page.field.accentColor": "Color de énfasis",
"settings.projects.page.field.projectIcon": "Icono del proyecto",
"settings.projects.page.field.projectIconBackgroundAria": "Color de fondo del icono del proyecto",
@@ -947,6 +1032,7 @@ export const settingsDict = {
"settings.projects.page.toast.discoverIconFailed": "No se pudo descubrir el icono del proyecto",
"settings.projects.page.toast.customIconAlreadySet": "Icono personalizado ya establecido para este proyecto",
"settings.projects.page.toast.iconDiscovered": "Icono del proyecto descubierto",
"settings.projects.page.toast.saveFailed": "Error al guardar la configuración del proyecto",
"settings.usage.sidebar.title": "Uso",
"settings.usage.sidebar.total": "Total {count}",
"settings.usage.sidebar.actions.toggleAutoRefreshAria": "Alternar refresco automático",
@@ -1082,6 +1168,9 @@ export const settingsDict = {
"settings.openchamber.worktrees.setup.commandPlaceholder": "ej.: bun install",
"settings.openchamber.worktrees.setup.removeCommandAria": "Eliminar comando",
"settings.openchamber.worktrees.setup.addCommand": "Añadir comando",
"settings.openchamber.worktrees.setup.waitForCommands": "Esperar a que terminen los comandos de configuración antes de crear o enviar una sesión",
"settings.openchamber.worktrees.setup.waitForCommandsAria": "Esperar los comandos de configuración de Worktree antes de crear o enviar una sesión",
"settings.openchamber.worktrees.setup.toast.saveFailed": "Error al guardar los comandos de configuración del worktree",
"settings.openchamber.worktrees.list.title": "Worktrees existentes",
"settings.openchamber.worktrees.list.tooltip": "Los worktrees existen fuera del repositorio (gestionados por OpenCode). Eliminar un worktree también elimina las sesiones vinculadas.",
"settings.openchamber.worktrees.list.loading": "Cargando worktrees...",
@@ -1338,6 +1427,11 @@ export const settingsDict = {
"settings.openchamber.defaults.field.thinkingPlaceholder": "Pensando",
"settings.openchamber.defaults.field.defaultAgent": "Agente por defecto",
"settings.openchamber.defaults.field.showDeletionDialogAria": "Mostrar diálogo de eliminación",
"settings.openchamber.defaults.smallModel.title": "Modelo pequeño",
"settings.openchamber.defaults.smallModel.description": "Un modelo económico para tareas utilitarias rápidas, como recapitulaciones y resúmenes breves.",
"settings.openchamber.defaults.smallModel.useDefault": "Usar el modelo pequeño predeterminado",
"settings.openchamber.defaults.smallModel.useDefaultAria": "Usar el modelo pequeño predeterminado",
"settings.openchamber.defaults.smallModel.overrideModel": "Modelo de anulación",
"settings.openchamber.defaults.field.showDeletionDialog": "Mostrar diálogo de eliminación",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Abrir archivos en modo vista previa",
"settings.openchamber.defaults.field.openFilesPreview": "Abrir archivos en modo vista previa",
@@ -1460,16 +1554,33 @@ export const settingsDict = {
"settings.notifications.page.toast.backgroundDisabled": "Notificaciones de fondo deshabilitadas",
"settings.notifications.page.testNotification.title": "Notificación de prueba",
"settings.notifications.page.testNotification.body": "Esta es una notificación de prueba de OpenChamber.",
"settings.voice.page.section.voiceSetup": "Configuración de voz",
"settings.voice.page.section.speechRecognition": "Reconocimiento de voz",
"settings.voice.page.field.enableVoiceInput": "Habilitar entrada de voz",
"settings.voice.page.field.enableVoiceInputAria": "Habilitar entrada de voz (dictado)",
"settings.voice.page.section.playbackAndSummary": "Reproducción",
"settings.voice.page.field.enableVoiceModeAria": "Habilitar modo de voz",
"settings.voice.page.field.enableVoiceMode": "Habilitar modo de voz",
"settings.voice.page.field.provider": "Proveedor",
"settings.voice.page.provider.browser": "Navegador",
"settings.voice.page.provider.custom": "Personalizado",
"settings.voice.page.provider.say": "Decir",
"settings.voice.page.provider.server": "Servidor",
"settings.voice.page.provider.local": "Local",
"settings.voice.page.tooltip.sttLocal": "Transcripción local en el servidor de OpenChamber. Los modelos se descargan automáticamente; no se necesita clave de API.",
"settings.voice.page.tooltip.localTts": "Síntesis local en el servidor de OpenChamber (Kokoro, inglés). El modelo se descarga automáticamente; no se necesita clave de API.",
"settings.voice.page.stt.model.parakeetV2": "Parakeet v2 (inglés)",
"settings.voice.page.stt.model.parakeetV3": "Parakeet v3 (25 idiomas europeos)",
"settings.voice.page.stt.model.whisperBase": "Whisper base (multilingüe)",
"settings.voice.page.stt.model.whisperTiny": "Whisper tiny (multilingüe)",
"settings.voice.page.stt.badge.bestForEnglish": "Mejor para inglés",
"settings.voice.page.stt.badge.bestForMultilingual": "Mejor multilingüe",
"settings.voice.page.stt.meta.accuracy": "Precisión",
"settings.voice.page.stt.meta.speed": "Velocidad",
"settings.voice.page.stt.modelInstalled": "Modelo instalado",
"settings.voice.page.stt.modelDownloading": "Descargando modelo...",
"settings.voice.page.stt.modelDownloadingProgress": "Descargando modelo... {percent}%",
"settings.voice.page.stt.modelNotInstalled": "Modelo no descargado",
"settings.voice.page.stt.modelDownload": "Descargar",
"settings.voice.page.stt.modelDelete": "Eliminar modelo",
"settings.voice.page.stt.modelRetry": "Reintentar",
"settings.voice.page.provider.wasm": "Local",
"settings.voice.page.stt.wasmModel": "Modelo Whisper",
"settings.voice.page.stt.wasmLoaded": "Modelo cargado",
@@ -1526,6 +1637,7 @@ export const settingsDict = {
"settings.voice.page.field.ttsInputMode": "Modo de entrada TTS",
"settings.voice.page.field.ttsInputModeSanitized": "Texto limpio",
"settings.voice.page.field.ttsInputModeRaw": "Markdown sin procesar",
"settings.voice.page.field.ttsInputModeSummarized": "resumido",
"settings.openchamber.visual.section.colorMode": "Modo de color",
"settings.openchamber.visual.section.mobileLayout": "Diseño móvil",
"settings.openchamber.visual.option.mobileLayout.default": "Anterior",
@@ -1558,6 +1670,8 @@ export const settingsDict = {
"settings.openchamber.visual.actions.reloadThemes": "Recargar temas",
"settings.openchamber.visual.field.macVibrancy": "Transparencia de la ventana",
"settings.openchamber.visual.field.macVibrancyHint": "Usa el desenfoque nativo de macOS (vibrancy) detrás de la barra lateral. Desactívalo para superficies totalmente sólidas y opacas.",
"settings.openchamber.visual.field.dockBadge": "Insignia en el Dock",
"settings.openchamber.visual.field.dockBadgeHint": "Muestra en el icono del Dock de macOS el número de chats con actividad sin ver.",
"settings.openchamber.visual.actions.saveAndRestart": "Guardar y reiniciar",
"settings.openchamber.visual.actions.restarting": "Reiniciando…",
"settings.openchamber.visual.actions.reloadingThemes": "Recargando temas...",
@@ -1584,10 +1698,12 @@ export const settingsDict = {
"settings.openchamber.visual.field.fontSizePercentageAria": "Porcentaje de tamaño de fuente",
"settings.openchamber.visual.actions.resetFontSizeAria": "Restablecer tamaño de fuente",
"settings.openchamber.visual.field.terminalFontSize": "Tamaño de fuente del terminal",
"settings.openchamber.visual.field.editorFontSize": "Tamaño de fuente del editor",
"settings.openchamber.visual.field.codeFont": "Fuente de código",
"settings.openchamber.visual.field.selectCodeFontAria": "Seleccionar fuente de código",
"settings.openchamber.visual.actions.resetCodeFontAria": "Restablecer fuente de código",
"settings.openchamber.visual.actions.resetTerminalFontSizeAria": "Restablecer tamaño de fuente del terminal",
"settings.openchamber.visual.actions.resetEditorFontSizeAria": "Restablecer tamaño de fuente del editor",
"settings.openchamber.visual.field.spacingDensity": "Densidad de espaciado",
"settings.openchamber.visual.actions.resetSpacingAria": "Restablecer espaciado",
"settings.openchamber.visual.field.inputBarOffset": "Desplazamiento de la barra de entrada",
@@ -1607,6 +1723,16 @@ export const settingsDict = {
"settings.openchamber.visual.field.userMessageRenderingAria": "Renderizado de mensajes del usuario: {option}",
"settings.openchamber.visual.field.mermaidRenderingAria": "Renderizado de Mermaid: {option}",
"settings.openchamber.visual.field.diffLayoutAria": "Diseño de comparación: {option}",
"settings.openchamber.visual.field.sessionRecap": "Generar resumen de sesión",
"settings.openchamber.visual.field.sessionRecapAria": "Generar un resumen cuando el agente termina",
"settings.openchamber.visual.field.sessionSuggestion": "Generar sugerencia del próximo mensaje del usuario",
"settings.openchamber.visual.field.sessionSuggestionAria": "Generar un próximo mensaje sugerido del usuario cuando el agente termina",
"settings.openchamber.visual.field.sessionGoal": "Habilitar objetivos de sesión",
"settings.openchamber.visual.field.sessionGoalAria": "Mantener la sesión trabajando automáticamente hacia un objetivo",
"settings.openchamber.visual.goal.sectionTitle": "Objetivo",
"settings.openchamber.visual.goal.budgetLabel": "Presupuesto de tokens predeterminado",
"settings.openchamber.visual.goal.budgetAria": "Aplicar un presupuesto de tokens predeterminado a los nuevos objetivos",
"settings.openchamber.visual.goal.description": "Activa el botón de diana en el compositor y el próximo mensaje se convierte en un objetivo: el agente sigue trabajando hacia él automáticamente, auditado por el modelo pequeño, incluso mientras no estás.",
"settings.openchamber.visual.field.showReasoningTracesAria": "Mostrar rastros de razonamiento",
"settings.openchamber.visual.field.showReasoningTraces": "Mostrar trazas de razonamiento",
"settings.openchamber.visual.field.collapsibleThinkingBlocksAria": "Habilitar bloques de razonamiento colapsables",
@@ -1623,6 +1749,8 @@ export const settingsDict = {
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Acciones en línea del asistente",
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Muestra Copiar respuesta, Guardar como imagen y Leer en voz alta en bloques de texto del asistente que aparecen antes de llamadas a herramientas posteriores dentro de la misma respuesta.",
"settings.openchamber.visual.field.showToolFileIconsAria": "Mostrar iconos de archivos de herramientas",
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Ajustar líneas de bloques de código",
"settings.openchamber.visual.field.codeBlockLineWrap": "Ajustar líneas de bloques de código",
"settings.openchamber.visual.field.showToolFileIcons": "Mostrar iconos de archivos de herramientas",
"settings.openchamber.visual.field.showTurnChangedFilesAria": "Mostrar archivos cambiados en turnos completados",
"settings.openchamber.visual.field.showTurnChangedFiles": "Mostrar archivos cambiados en turnos completados",
@@ -1784,4 +1912,10 @@ export const settingsDict = {
"settings.promptTemplates.page.toast.created": "Plantilla creada",
"settings.promptTemplates.page.toast.createFailed": "Error al crear la plantilla",
"settings.promptTemplates.page.toast.saveUnexpectedError": "Ocurrió un error inesperado al guardar",
"settings.openchamber.visual.section.followUpBehavior": "Follow-up behavior",
"settings.openchamber.visual.section.followUpBehaviorAria": "Follow-up behavior",
"settings.openchamber.visual.field.followUpBehaviorAria": "Follow-up behavior: {option}",
"settings.openchamber.visual.field.followUpBehaviorDescription": "Choose what happens when you press Enter on a follow-up message while the agent is still responding.",
"settings.openchamber.visual.option.followUpBehavior.steer.label": "Steer",
"settings.openchamber.visual.option.followUpBehavior.queue.label": "Queue",
} as const;
+149 -1
View File
@@ -14,6 +14,7 @@ export const dict: Record<I18nKey, string> = {
"common.language.brazilianPortuguese": "Portugués brasileño",
"common.language.korean": "Coreano",
"common.language.polish": "Polaco",
"common.language.japanese": "Japonés",
"common.revealPath.finder": "Mostrar en Finder",
"common.revealPath.fileExplorer": "Abrir en File Explorer",
"common.revealPath.fileManager": "Abrir en gestor de archivos",
@@ -22,6 +23,13 @@ export const dict: Record<I18nKey, string> = {
"pwa.installPrompt.dismiss": "Descartar",
"pwa.installPrompt.started": "Instalación iniciada",
"pwa.installPrompt.installed": "OpenChamber se instaló",
"shareOpinion.actions.shareOpinion": "Compartir opinión",
"shareOpinion.actions.bookCall": "Reservar llamada",
"shareOpinion.actions.shortSurvey": "Encuesta breve",
"shareOpinion.dialog.title": "Comparte tu opinión",
"shareOpinion.toast.title": "Ayuda a dar forma a OpenChamber",
"shareOpinion.toast.description": "Cuenta qué es útil, confuso o falta para ayudar a definir lo que viene después.",
"sessions.sidebar.footer.actions.shareOpinion": "Compartir opinión",
"layout.mainTab.chat": "Chat",
"layout.mainTab.plan": "Plan",
"layout.mainTab.diff": "Diff",
@@ -30,6 +38,50 @@ export const dict: Record<I18nKey, string> = {
"layout.mainTab.terminal": "Terminal",
"layout.mainTab.context": "Contexto",
"mobile.nav.aria": "Navegación móvil",
"mobile.connect.welcome.title": "Conéctate a OpenChamber",
"mobile.connect.welcome.description": "Agrega una URL de servidor o escanea un código QR de emparejamiento para empezar a usar la app móvil.",
"mobile.connect.url.label": "URL del servidor",
"mobile.connect.url.placeholder": "http://192.168.1.74:2606",
"mobile.connect.token.label": "Token de cliente",
"mobile.connect.token.placeholder": "Pega el token de acceso",
"mobile.connect.token.hint": "Solo es necesario si tu servidor requiere un token en lugar de una contraseña.",
"mobile.connect.password.label": "Contraseña",
"mobile.connect.password.placeholder": "Contraseña de OpenChamber",
"mobile.connect.connectButton": "Conectar",
"mobile.connect.unlockButton": "Desbloquear y conectar",
"mobile.connect.cancelPassword": "Usar otro servidor",
"mobile.connect.connecting": "Conectando...",
"mobile.connect.scanQr": "Escanear código QR",
"mobile.connect.welcome.scanHint": "En tu ordenador, abre «Añadir un dispositivo» para mostrar un código QR y escanéalo aquí.",
"mobile.connect.advanced": "Avanzado",
"mobile.connect.manual.toggle": "Conectar por dirección",
"mobile.connect.scan.permissionDenied": "El acceso a la cámara está desactivado. Actívalo en Ajustes para escanear un código QR.",
"mobile.connect.scan.failed": "No se pudo escanear ese código QR. Inténtalo de nuevo o introduce la URL manualmente.",
"mobile.connect.scan.invalid": "Ese código QR no es un código de conexión de OpenChamber.",
"mobile.connect.scan.unsupported": "El escaneo de QR solo está disponible en la app móvil instalada.",
"mobile.connect.saved.title": "Conexiones guardadas",
"mobile.connect.saved.empty": "Aún no hay conexiones guardadas.",
"mobile.connect.relay.badge": "a través de OpenChamber Relay",
"mobile.connect.error.urlRequired": "Introduce una URL de servidor.",
"mobile.connect.error.invalidUrl": "Esa URL de servidor no es válida.",
"mobile.connect.error.unreachable": "No se pudo conectar con ese servidor de OpenChamber.",
"mobile.connect.error.authRequired": "Este servidor requiere una contraseña o un token de cliente.",
"mobile.connect.error.passwordFailed": "No se pudo desbloquear ese servidor. Revisa la contraseña.",
"mobile.instances.addTitle": "Agregar instancia",
"mobile.instances.addManual": "Añadir por dirección",
"mobile.instances.editTitle": "Editar instancia",
"mobile.instances.edit": "Editar",
"mobile.instances.delete": "Eliminar",
"mobile.instances.deleteAria": "Eliminar {label}",
"mobile.instances.confirmDeleteAria": "Confirmar la eliminación de {label}",
"mobile.instances.cancelDeleteAria": "Conservar {label}",
"mobile.instances.cancelEdit": "Cancelar",
"mobile.instances.label.label": "Nombre",
"mobile.instances.label.placeholder": "Nombre para mostrar (opcional)",
"mobile.instances.saveNew": "Guardar instancia",
"mobile.instances.status.connectedDirect": "Conectado · Red local",
"mobile.instances.status.connectedRelay": "Conectado · Relay privado",
"mobile.instances.saveEdit": "Guardar cambios",
"mobile.nav.changes": "Cambios",
"mobile.nav.settings": "Ajustes",
"mobile.surface.closeAria": "Cerrar",
@@ -42,6 +94,7 @@ export const dict: Record<I18nKey, string> = {
"mobile.menu.files": "Archivos",
"mobile.menu.changes": "Cambios",
"mobile.menu.mcp": "MCP",
"mobile.menu.instances": "Instancias",
"mobile.menu.update": "Actualizar",
"mobile.menu.settings": "Ajustes",
"mobile.sessions.newChatCta": "Nuevo chat en {project}",
@@ -240,6 +293,10 @@ export const dict: Record<I18nKey, string> = {
"sessions.scheduledTasks.editor.prompt.placeholder": "Resumir tareas abiertas y proponer próximas acciones",
"sessions.scheduledTasks.editor.enabled.aria": "Habilitar tarea",
"sessions.scheduledTasks.editor.enabled.label": "Habilitado",
"sessions.scheduledTasks.editor.goal.label": "Ejecutar como objetivo",
"sessions.scheduledTasks.editor.goal.aria": "Ejecutar esta tarea como un objetivo que el agente persigue hasta completarlo",
"sessions.scheduledTasks.editor.goal.budgetLabel": "Presupuesto de tokens",
"sessions.scheduledTasks.editor.goal.budgetAria": "Limitar el objetivo a un presupuesto de tokens",
"sessions.scheduledTasks.editor.actions.closeAria": "Cerrar",
"sessions.scheduledTasks.editor.actions.cancel": "Cancelar",
"sessions.scheduledTasks.editor.actions.save": "Guardar",
@@ -330,6 +387,7 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.header.actions.searchSessions": "Buscar sesiones",
"sessions.sidebar.header.actions.exitSelection": "Salir de selección",
"sessions.sidebar.header.actions.selectSessions": "Seleccionar sesiones",
"sessions.sidebar.header.actions.sortProjects": "Ordenar proyectos",
"sessions.sidebar.header.actions.sessionDisplayMode": "Modo de visualización de sesión",
"sessions.sidebar.header.displayMode.label": "Modo de visualización",
"sessions.sidebar.header.displayMode.default": "Predeterminado",
@@ -338,6 +396,11 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.header.displayMode.showArchived": "Mostrar sesiones archivadas",
"sessions.sidebar.header.displayMode.collapseAll": "Colapsar todo",
"sessions.sidebar.header.displayMode.expandAll": "Expandir todo",
"sessions.sidebar.header.projectSort.manual": "Manual",
"sessions.sidebar.header.projectSort.aToZ": "A → Z",
"sessions.sidebar.header.projectSort.zToA": "Z → A",
"sessions.sidebar.header.projectSort.dateAdded": "Más recientes",
"sessions.sidebar.header.projectSort.recent": "Recientes",
"sessions.sidebar.header.search.matchCountSingle": "{count} coincidencia",
"sessions.sidebar.header.search.matchCountPlural": "{count} coincidencias",
"sessions.sidebar.header.search.escapeHint": "Esc para limpiar",
@@ -382,6 +445,7 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.project.actions.projectMenu": "Menú del proyecto",
"sessions.sidebar.project.actions.newSession": "Nueva sesión",
"sessions.sidebar.project.actions.closeProject": "Cerrar proyecto",
"sessions.sidebar.project.actions.edit": "Editar",
"sessions.sidebar.project.actions.newDraftSession": "Nueva sesión de borrador",
"sessions.sidebar.session.menu.rename": "Cambiar nombre",
"sessions.sidebar.session.rename.save": "Guardar nombre de sesión",
@@ -1173,6 +1237,7 @@ export const dict: Record<I18nKey, string> = {
"diffView.state.loadingRepositoryStatus": "Cargando estado del repositorio...",
"diffView.state.notGitRepository": "No es un repositorio Git. Usa la pestaña Git para inicializar o cambiar de directorio.",
"diffView.state.cleanWorkingTree": "Worktree limpio, no hay cambios para mostrar",
"diffView.state.noLastTurnChanges": "No hay cambios del último turno para mostrar",
"diffView.state.failedToLoadDiff": "No se pudo cargar la diferencia",
"diffView.state.loadingDiff": "Cargando diff...",
"diffView.state.loadingChanges": "Cargando cambios...",
@@ -1182,6 +1247,7 @@ export const dict: Record<I18nKey, string> = {
"diffView.summary.changedFilesPlural": "{count} archivos modificados",
"diffView.scope.changed": "Cambiados",
"diffView.scope.staged": "Staged",
"diffView.scope.lastTurn": "Último turno",
"diffView.scope.selectorAria": "Seleccionar modo de cambios",
"diffView.actions.retry": "Volver a intentar",
"diffView.actions.renderAnyway": "Renderizar de todos modos",
@@ -1198,12 +1264,32 @@ export const dict: Record<I18nKey, string> = {
'diffView.reviewDialog.title': 'Revisar cambios',
'diffView.reviewDialog.description': 'Inicia una sesión de revisión separada para los cambios actuales.',
'diffView.reviewDialog.generateHandoff': 'Generar handoff',
'diffView.reviewDialog.autoReview': 'Ejecutar ciclo de revisión automática',
'diffView.reviewDialog.info': 'Este flujo funciona mejor si se inicia desde la sesión donde se implementaron los cambios.',
'diffView.reviewDialog.actions.cancel': 'Cancelar',
'diffView.reviewDialog.actions.start': 'Revisar',
'diffView.reviewDialog.actions.starting': 'Iniciando...',
'diffView.reviewDialog.toast.noSessionDirectory': 'El directorio de la sesión no está disponible',
'diffView.reviewDialog.toast.startFailed': 'No se pudo iniciar el flujo de revisión',
'chat.dictation.start': 'Iniciar dictado',
'chat.dictation.overlayAria': 'Dictado',
'chat.dictation.downloadingModel': 'Descargando el modelo de voz...',
'chat.dictation.downloadingModelProgress': 'Descargando el modelo de voz... {percent}%',
'chat.dictation.listening': 'Escuchando...',
'chat.dictation.processing': 'Transcribiendo...',
'chat.dictation.failed': 'La transcripción falló',
'chat.dictation.cancel': 'Descartar dictado',
'chat.dictation.insert': 'Insertar transcripción',
'chat.dictation.insertAndSend': 'Insertar y enviar',
'chat.dictation.retry': 'Reintentar transcripción',
'chat.dictation.discard': 'Descartar grabación',
'chat.history.loadOlder': 'Cargar mensajes anteriores',
'chat.autoReview.title': 'El ciclo de revisión de código está en curso',
'chat.autoReview.status.waitingForReviewer': 'Esperando al revisor',
'chat.autoReview.status.waitingForImplementer': 'Esperando al implementador',
'chat.autoReview.reviewSessionLabel': 'Sesión de revisión',
'chat.autoReview.actions.open': 'Abrir',
'chat.autoReview.actions.stop': 'Detener',
"diffView.hunk.label": "Fragmentos",
"diffView.hunk.stage": "Preparar",
"diffView.hunk.unstage": "Quitar",
@@ -1305,6 +1391,43 @@ export const dict: Record<I18nKey, string> = {
"header.actions.toggleChangesPanelAria": "Alternar panel de cambios",
"header.actions.planWithShortcut": "Plan ({shortcut})",
"header.actions.terminalPanelWithShortcut": "Panel de terminal ({shortcut})",
"chat.recap.aria": "Resumen de la sesión",
"chat.recap.label": "Resumen:",
"chat.goal.dialog.titleCreate": "Definir objetivo de sesión",
"chat.goal.dialog.titleManage": "Objetivo de sesión",
"chat.goal.dialog.objectiveLabel": "Objetivo",
"chat.goal.dialog.objectivePlaceholder": "Describe el estado final que el agente debe alcanzar y verificar…",
"chat.goal.dialog.budgetLabel": "Presupuesto de tokens",
"chat.goal.status.active": "Activo",
"chat.goal.status.evaluating": "Evaluando…",
"chat.goal.status.paused": "En pausa",
"chat.goal.status.blocked": "Bloqueado",
"chat.goal.status.budgetLimited": "Presupuesto alcanzado",
"chat.goal.status.complete": "Completado",
"chat.goal.usage.tokens": "{used} tokens",
"chat.goal.usage.tokensWithBudget": "{used}/{budget} tokens",
"chat.goal.usage.turns": "{turns} continuaciones",
"chat.goal.action.pause": "Pausar",
"chat.goal.action.resume": "Reanudar",
"chat.goal.action.markComplete": "Marcar como completado",
"chat.goal.action.clear": "Eliminar objetivo",
"chat.goal.action.cancel": "Cancelar",
"chat.goal.action.save": "Guardar objetivo",
"chat.goal.action.start": "Iniciar objetivo",
"chat.goal.toast.actionFailed": "No se pudo actualizar el objetivo",
"chat.goal.row.aria": "Objetivo de sesión — abrir detalles",
"chat.goal.button.createAria": "Definir un objetivo de sesión",
"chat.goal.button.manageAria": "Gestionar el objetivo de sesión",
"chat.goal.button.armAria": "Iniciar un objetivo con el próximo mensaje",
"chat.goal.counter.aria": "Límite de longitud del objetivo",
"chat.goal.button.disarmAria": "Objetivo armado — toca para desactivarlo",
"chat.goal.button.cancelAria": "Objetivo en curso — toca para cancelarlo",
"chat.goal.cancelDialog.title": "¿Cancelar este objetivo?",
"chat.goal.cancelDialog.description": "El agente dejará de trabajar automáticamente hacia este objetivo.",
"chat.goal.cancelDialog.keep": "Mantener objetivo",
"chat.goal.cancelDialog.confirm": "Cancelar objetivo",
"chat.suggestion.applyAria": "Usar mensaje sugerido",
"chat.suggestion.dismissAria": "Descartar sugerencia",
"header.actions.toggleTerminalPanelAria": "Mostrar u ocultar panel de terminal",
"terminalView.stream.processExitedMessage": "\r\n[Proceso terminado{exitCodeSegment}{signalSegment}]\r\n",
"terminalView.stream.processExitedWithCode": " con código {exitCode}",
@@ -1686,6 +1809,7 @@ export const dict: Record<I18nKey, string> = {
"chat.queuedMessage.edit": "edit",
"chat.queuedMessage.send": "send",
"chat.queuedMessage.removeAria": "Eliminar de la cola",
"chat.queuedMessage.reorderAria": "Arrastra para reordenar",
"chat.container.returnToParent.aria": "Volver a la sesión principal",
"chat.container.returnToParent.titleNamed": "Volver a: {title}",
"chat.container.returnToParent.title": "Volver a la sesión principal",
@@ -1825,6 +1949,9 @@ export const dict: Record<I18nKey, string> = {
"chat.chatInput.previewContextRemove": "Quitar contexto de vista previa",
"chat.chatInput.projectRoot": "Raíz del proyecto",
"chat.chatInput.branch": "Rama",
"chat.chatInput.draftPicker.projectTitle": "Proyecto",
"chat.chatInput.draftPicker.searchProjects": "Buscar proyectos...",
"chat.chatInput.draftPicker.searchBranches": "Buscar ramas...",
"chat.chatInput.worktrees": "Worktrees",
"chat.chatInput.worktreeNew": "+ Nuevo",
"chat.chatInput.drop.insertMention": "Suelta para insertar como mención",
@@ -1850,6 +1977,11 @@ export const dict: Record<I18nKey, string> = {
"chat.toolOutputDialog.image.closeAria": "Cerrar vista previa de imagen",
"chat.toolOutputDialog.mermaid.missingSource": "Falta la URL de origen de Mermaid.",
"chat.toolOutputDialog.mermaid.loadFailed": "No se pudo cargar el diagrama de Mermaid.",
"chat.toolOutputDialog.mermaid.dataUrlMalformed": "La URL de datos de Mermaid no tiene un formato válido.",
"chat.toolOutputDialog.mermaid.invalidLocalPath": "La ruta del archivo local de Mermaid no es válida.",
"chat.toolOutputDialog.mermaid.readFileFailedWithStatus": "No se pudo leer el archivo de Mermaid. Estado: {status}.",
"chat.toolOutputDialog.mermaid.unsupportedUrlProtocol": "El protocolo de la URL de Mermaid no es compatible.",
"chat.toolOutputDialog.mermaid.loadFailedWithStatus": "No se pudo cargar el diagrama de Mermaid. Estado: {status}.",
"chat.toolOutputDialog.mermaid.closeAria": "Cerrar vista previa del diagrama",
"chat.toolOutputDialog.mermaid.loading": "Cargando diagrama...",
"chat.toolOutputDialog.mermaid.renderFailed": "No se pudo renderizar el diagrama de Mermaid.",
@@ -1864,6 +1996,9 @@ export const dict: Record<I18nKey, string> = {
"chat.toolPart.output": "Salida",
"chat.toolPart.showRawJson": "Mostrar JSON sin formato",
"chat.toolPart.showFormattedJson": "Mostrar JSON formateado",
"chat.toolPart.showNavigableJson": "Mostrar JSON navegable",
"chat.toolPart.openFileAtFirstChange": "Abrir archivo en el primer cambio",
"chat.toolPart.openFileDiff": "Abrir diferencias del archivo",
"chat.toolPart.copyOutput": "Copiar salida",
"chat.toolPart.copiedOutput": "Salida copiada",
"chat.toolPart.copyOutputFailed": "No se pudo copiar la salida",
@@ -1957,6 +2092,7 @@ export const dict: Record<I18nKey, string> = {
"chat.modelControls.noProvidersOrModelsFound": "Ningún proveedor o modelo coincide con tu búsqueda.",
"chat.modelControls.reorderFavoriteAria": "Reordenar favorito",
"chat.modelControls.reorderFavoriteTitle": "Arrastrar para reordenar favorito",
"chat.modelControls.reorderProviderTitle": "Arrastrar para reordenar proveedor",
"chat.modelControls.permissionLabel.custom": "Personalizado",
"chat.modelControls.permissionLabel.allow": "Permitir",
"chat.modelControls.permissionLabel.deny": "Denegar",
@@ -2197,7 +2333,7 @@ export const dict: Record<I18nKey, string> = {
"sessionAuth.error.networkTitle": "No se puede alcanzar el servidor",
"sessionAuth.error.rateLimitDescriptionSingle": "Por favor, espera {minutes} minuto antes de intentarlo de nuevo.",
"sessionAuth.error.rateLimitDescriptionPlural": "Por favor, espera {minutes} minutos antes de intentarlo de nuevo.",
"sessionAuth.error.networkDescription": "No pudimos verificar la sesión de la UI. Comprueba que el servicio esté en funcionamiento y vuelve a intentarlo.",
"sessionAuth.error.networkDescription": "No pudimos verificar la sesión de la UI. Si abres OpenChamber desde otro dispositivo en tu red local, activa Desktop Network Access en la app de escritorio y usa la dirección LAN que aparece en Ajustes.",
"sessionAuth.error.retry": "Volver a intentar",
"sessionAuth.error.passkeySetupFailed": "No se pudo configurar la clave de paso.",
"sessionAuth.error.incorrectPassword": "Contraseña incorrecta. Inténtalo de nuevo.",
@@ -2484,9 +2620,14 @@ export const dict: Record<I18nKey, string> = {
"updateDialog.status.downloading": "Descargando...",
"updateDialog.actions.restartToUpdate": "Reiniciar para actualizar",
"updateDialog.actions.updateNow": "Actualizar ahora",
"updateDialog.actions.openMobileUpdate": "Abrir actualización",
"updateDialog.status.updating": "Actualizando...",
"updateDialog.error.updateFailed": "No se pudo actualizar",
"updateDialog.error.takingLonger": "La actualización está tardando más de lo esperado. Espera un poco y refresca, o ejecuta: openchamber update",
"mobileUpdate.toast.available.title": "Actualización de OpenChamber disponible",
"mobileUpdate.toast.available.description": "La versión {version} está lista para Android.",
"mobileUpdate.toast.actions.download": "Descargar",
"mobileUpdate.toast.actions.dismiss": "Descartar",
"opencodeUpdate.toast.available.title": "Actualización de OpenCode",
"opencodeUpdate.toast.available.description": "Versión {version} disponible.",
"opencodeUpdate.toast.actions.update": "Actualizar",
@@ -2562,12 +2703,19 @@ export const dict: Record<I18nKey, string> = {
"mainLayout.mobile.closeDrawerAria": "Cerrar drawer",
"sortableTabsStrip.aria.tabs": "Pestañas",
"openChamberLogo.aria.logo": "Logo de OpenChamber",
"markdownRenderer.code.actions.copyTitle": "Copiar código",
"markdownRenderer.code.actions.copiedTitle": "Copiado",
"markdownRenderer.table.actions.copyTitle": "Copiar tabla",
"markdownRenderer.code.actions.enableWrapTitle": "Activar ajuste de línea",
"markdownRenderer.code.actions.disableWrapTitle": "Desactivar ajuste de línea",
"markdownRenderer.table.actions.downloadTitle": "Descargar tabla",
"markdownRenderer.table.toast.downloadedAsFormat": "Tabla descargada como {format}",
"markdownRenderer.mermaid.actions.copyTitle": "Copiar",
"markdownRenderer.mermaid.actions.copySourceTitle": "Copiar fuente",
"markdownRenderer.mermaid.actions.downloadSvgTitle": "Descargar SVG",
"markdownRenderer.mermaid.actions.zoomInTitle": "Acercar",
"markdownRenderer.mermaid.actions.zoomOutTitle": "Alejar",
"markdownRenderer.mermaid.actions.resetViewTitle": "Restablecer vista",
"markdownRenderer.mermaid.toast.downloadFailed": "No se pudo descargar el diagrama",
"contextPanel.preview.title": "Vista previa",
"contextPanel.preview.description": "Usa Acciones del proyecto o el botón Preview del terminal para abrir una vista previa.",
@@ -354,12 +354,14 @@ export const settingsDict = {
'settings.agents.sidebar.toast.agentExists': 'Un agent portant ce nom existe déjà',
'settings.agents.sidebar.toast.removeOldAfterRenameFailed': 'Échec de la suppression de l\'ancien agent après le changement de nom',
'settings.agents.sidebar.toast.renameFailed': 'Échec du changement de nom de l\'agent',
'settings.agents.sidebar.toast.agentRenamed': 'Agent renommé en "{name}"',
'settings.agents.page.toast.permissionNameRequired': 'Le nom de l\'autorisation est requis',
'settings.agents.page.toast.created': 'Agent créé avec succès',
'settings.agents.page.toast.updated': 'Agent mis à jour avec succès',
'settings.agents.page.toast.createFailed': 'Échec de la création de l\'agent',
'settings.agents.page.toast.updateFailed': 'Échec de la mise à jour de l\'agent',
'settings.agents.page.toast.saveUnexpectedError': 'Une erreur s\'est produite lors de l\'enregistrement',
'settings.agents.page.toast.savedManualRestart': 'Enregistré sur le disque. Redémarrez votre serveur OpenCode connecté pour appliquer les modifications.',
'settings.agents.page.empty.title': 'Sélectionnez un agent dans la barre latérale',
'settings.agents.page.empty.description': 'ou créez-en un nouveau',
'settings.agents.page.title.new': 'Nouvel agent',
@@ -376,6 +378,10 @@ export const settingsDict = {
'settings.agents.page.field.mode': 'Mode',
'settings.agents.page.field.modeTooltip': 'Visibilité principale et sous-agent',
'settings.agents.page.field.overrideModel': 'Remplacer le modèle',
'settings.agents.page.field.variant': 'Variante de réflexion',
'settings.agents.page.field.variantTooltip': 'Optionnel. Si le modèle prend en charge le raisonnement, la variante contrôle la profondeur du raisonnement.',
'settings.agents.page.field.variantHint': 'Spécifique au modèle (par ex. variante Anthropic)',
'settings.agents.page.field.variantPlaceholder': 'par ex. high, max, low, none',
'settings.agents.page.field.temperature': 'Température',
'settings.agents.page.field.temperatureTooltip': 'Contrôle le caractère aléatoire. Plus élevé = créatif, Inférieur = concentré.',
'settings.agents.page.field.temperatureRange': '0.0 à 2.0',
@@ -489,6 +495,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.description.globalReadOnly': 'Identité Git à l\'échelle du système (lecture seule)',
'settings.gitIdentities.editor.description.newProfile': 'Créer un nouveau profil d\'identité Git',
'settings.gitIdentities.editor.description.editProfile': 'Modifier les paramètres du profil d\'identité',
'settings.gitIdentities.editor.section.commitSigning': 'Signature des commits',
'settings.gitIdentities.editor.field.profileName': 'Nom du profil',
'settings.gitIdentities.editor.field.profileNamePlaceholder': 'Profil professionnel, personnel, etc.',
'settings.gitIdentities.editor.field.color': 'Couleur',
@@ -504,6 +511,9 @@ export const settingsDict = {
'settings.gitIdentities.editor.field.sshKeyPath': 'Chemin clé SSH',
'settings.gitIdentities.editor.field.sshKeyPathTooltip': 'Chemin facultatif vers la clé privée. e.g. ~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.sshKeyPathPlaceholder': '~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.signCommits': 'Signer les commits avec cette identité',
'settings.gitIdentities.editor.field.signingKey': 'Clé de signature',
'settings.gitIdentities.editor.field.signingKeyPlaceholder': '~/.ssh/id_ed25519.pub',
'settings.gitIdentities.editor.field.host': 'Hôte',
'settings.gitIdentities.editor.field.hostTooltip': 'Le jeton sera lu à partir de ~/.git-credentials pour cet hôte.',
'settings.gitIdentities.editor.field.hostPlaceholder': 'github.com',
@@ -512,6 +522,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.actions.save': 'Sauvegarder',
'settings.gitIdentities.editor.toast.userNameEmailRequired': 'Le nom d\'utilisateur et l\'e-mail sont requis',
'settings.gitIdentities.editor.toast.hostRequiredForToken': 'L\'hôte est requis pour l\'authentification basée sur un jeton',
'settings.gitIdentities.editor.toast.signingKeyRequired': 'Une clé de signature est requise lorsque la signature des commits est activée',
'settings.gitIdentities.editor.toast.profileCreated': 'Profil créé',
'settings.gitIdentities.editor.toast.profileUpdated': 'Profil mis à jour',
'settings.gitIdentities.editor.toast.createProfileFailed': 'Échec de la création du profil',
@@ -761,7 +772,13 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.title': 'Accès au réseau de bureau',
'settings.openchamber.desktopNetwork.field.launchAtLoginAria': 'Démarrez OpenChamber lors de la connexion',
'settings.openchamber.desktopNetwork.field.launchAtLogin': 'Démarrez OpenChamber lorsque vous vous connectez',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': 'Démarre l\'application en arrière-plan sans ouvrir de fenêtre. Cliquez sur l\'icône Dock pour l\'ouvrir.',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': 'Démarre l\'application en arrière-plan sans ouvrir de fenêtre. Utilisez l\'icône d\'état du bureau pour l\'ouvrir.',
'settings.openchamber.desktopNetwork.field.minimizeToTrayAria': 'Réduire et fermer OpenChamber dans la zone de notification',
'settings.openchamber.desktopNetwork.field.minimizeToTray': 'Réduire et fermer dans la zone de notification',
'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription': 'Garde OpenChamber actif dans la zone de notification Windows lorsque la fenêtre principale est réduite ou fermée.',
'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'Garder l\'ordinateur éveillé pendant qu\'OpenChamber fonctionne',
'settings.openchamber.desktopNetwork.field.keepAwake': 'Garder l\'ordinateur éveillé pendant qu\'OpenChamber fonctionne',
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': 'Pour que les téléphones puissent continuer à ouvrir cette application. L\'écran peut toujours s\'éteindre.',
'settings.openchamber.desktopNetwork.field.allowLanAccessAria': 'Autoriser l\'accès LAN au side-car du bureau',
'settings.openchamber.desktopNetwork.field.allowLanAccess': 'Autorisez les autres appareils de votre réseau local à ouvrir cette application',
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': 'Redémarre l\'application afin que les téléphones, tablettes et autres ordinateurs connectés à votre réseau Wi-Fi puissent l\'ouvrir.',
@@ -778,6 +795,10 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.error.savedRestartFailed': 'Enregistré, mais échec du redémarrage de l\'application',
'settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported': 'Le lancement à la connexion n\'est pas pris en charge sur ce système',
'settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed': 'Échec de la mise à jour du paramètre de lancement lors de la connexion',
'settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported': 'Le mode d\'arrière-plan dans la zone de notification n\'est pas pris en charge sur ce système',
'settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed': 'Échec de la mise à jour du paramètre de zone de notification',
'settings.openchamber.desktopNetwork.error.keepAwakeUnsupported': 'La prévention de la veille n\'est pas prise en charge sur ce système',
'settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed': 'Échec de la mise à jour du paramètre de maintien en éveil',
'settings.openchamber.opencodeCli.title': 'OpenCode CLI',
'settings.openchamber.opencodeCli.tooltipPrefix': 'Chemin absolu facultatif vers le',
'settings.openchamber.opencodeCli.tooltipSuffix': 'binaire.',
@@ -906,6 +927,7 @@ export const settingsDict = {
'settings.openchamber.keyboardShortcuts.action.cycle_agent.label': 'Agent de cycle',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label': 'Faire avancer le modèle favori',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label': 'Faire défiler le modèle favori vers l\'arrière',
'settings.openchamber.keyboardShortcuts.action.open_model_selector.label': 'Ouvrir le sélecteur de modèle',
'settings.openchamber.keyboardShortcuts.action.expand_input.label': 'Développer l\'entrée',
'settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label': 'Chronologie de la conversation ouverte',
'settings.projects.sidebar.total': 'Total {count}',
@@ -915,6 +937,8 @@ export const settingsDict = {
'settings.projects.page.section.worktree': 'Worktree',
'settings.projects.page.field.projectName': 'Nom du projet',
'settings.projects.page.field.projectNamePlaceholder': 'Nom du projet',
'settings.projects.page.field.defaultModel': 'Modèle par défaut pour les nouveaux chats',
'settings.projects.page.field.defaultModelDescription': 'Utilisé lors du démarrage d\'un nouveau chat dans ce projet. Revient aux valeurs globales si non défini.',
'settings.projects.page.field.accentColor': 'Couleur d\'accentuation',
'settings.projects.page.field.projectIcon': 'Icône du projet',
'settings.projects.page.field.projectIconBackgroundAria': 'Couleur d’arrière-plan de l’icône du projet',
@@ -936,6 +960,7 @@ export const settingsDict = {
'settings.projects.page.toast.discoverIconFailed': 'Échec de la découverte de l\'icône du projet',
'settings.projects.page.toast.customIconAlreadySet': 'Icône personnalisée déjà définie pour ce projet',
'settings.projects.page.toast.iconDiscovered': 'Icône de projet découverte',
'settings.projects.page.toast.saveFailed': 'Échec de l\'enregistrement des paramètres du projet',
'settings.usage.sidebar.title': 'Usage',
'settings.usage.sidebar.total': 'Total {count}',
'settings.usage.sidebar.actions.toggleAutoRefreshAria': 'Activer l\'actualisation automatique',
@@ -1071,6 +1096,9 @@ export const settingsDict = {
'settings.openchamber.worktrees.setup.commandPlaceholder': 'p. ex. bun install',
'settings.openchamber.worktrees.setup.removeCommandAria': 'Supprimer la commande',
'settings.openchamber.worktrees.setup.addCommand': 'Ajouter une commande',
'settings.openchamber.worktrees.setup.waitForCommands': 'Attendre la fin des commandes de configuration avant de créer ou d\'envoyer une session',
'settings.openchamber.worktrees.setup.waitForCommandsAria': 'Attendre les commandes de configuration Worktree avant de créer ou d\'envoyer une session',
'settings.openchamber.worktrees.setup.toast.saveFailed': 'Échec de l\'enregistrement des commandes de configuration Worktree',
'settings.openchamber.worktrees.list.title': 'Worktrees existants',
'settings.openchamber.worktrees.list.tooltip': 'Les worktrees vivent en dehors du dépôt (gérés par OpenCode). La suppression d\'un worktree supprime également les sessions liées.',
'settings.openchamber.worktrees.list.loading': 'Chargement des worktrees...',
@@ -1327,6 +1355,11 @@ export const settingsDict = {
'settings.openchamber.defaults.field.thinkingPlaceholder': 'Pensée',
'settings.openchamber.defaults.field.defaultAgent': 'Agent par défaut',
'settings.openchamber.defaults.field.showDeletionDialogAria': 'Afficher la boîte de dialogue de suppression',
'settings.openchamber.defaults.smallModel.title': 'Petit modèle',
'settings.openchamber.defaults.smallModel.description': 'Un modèle économique pour les tâches utilitaires rapides, comme les récapitulatifs et résumés courts.',
'settings.openchamber.defaults.smallModel.useDefault': 'Utiliser le petit modèle par défaut',
'settings.openchamber.defaults.smallModel.useDefaultAria': 'Utiliser le petit modèle par défaut',
'settings.openchamber.defaults.smallModel.overrideModel': 'Modèle de remplacement',
'settings.openchamber.defaults.field.showDeletionDialog': 'Afficher la boîte de dialogue de suppression',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Ouvrir les fichiers en mode aperçu',
'settings.openchamber.defaults.field.openFilesPreview': 'Ouvrir les fichiers en mode aperçu',
@@ -1449,16 +1482,33 @@ export const settingsDict = {
'settings.notifications.page.toast.backgroundDisabled': 'Notifications en arrière-plan désactivées',
'settings.notifications.page.testNotification.title': 'Avis de test',
'settings.notifications.page.testNotification.body': 'Il s\'agit d\'une notification de test de OpenChamber.',
'settings.voice.page.section.voiceSetup': 'Configuration vocale',
'settings.voice.page.section.speechRecognition': 'Reconnaissance vocale',
'settings.voice.page.field.enableVoiceInput': 'Activer la saisie vocale',
'settings.voice.page.field.enableVoiceInputAria': 'Activer la saisie vocale (dictée)',
'settings.voice.page.section.playbackAndSummary': 'Lecture',
'settings.voice.page.field.enableVoiceModeAria': 'Activer le mode vocal',
'settings.voice.page.field.enableVoiceMode': 'Activer le mode vocal',
'settings.voice.page.field.provider': 'Fournisseur',
'settings.voice.page.provider.browser': 'Navigateur',
'settings.voice.page.provider.custom': 'Personnalisé',
'settings.voice.page.provider.say': 'Dire',
'settings.voice.page.provider.server': 'Serveur',
'settings.voice.page.provider.local': 'Local',
'settings.voice.page.tooltip.sttLocal': 'Transcription locale sur le serveur OpenChamber. Les modèles se téléchargent automatiquement ; aucune clé d\'API requise.',
'settings.voice.page.tooltip.localTts': 'Synthèse locale sur le serveur OpenChamber (Kokoro, anglais). Le modèle se télécharge automatiquement ; aucune clé d’API requise.',
'settings.voice.page.stt.model.parakeetV2': 'Parakeet v2 (anglais)',
'settings.voice.page.stt.model.parakeetV3': 'Parakeet v3 (25 langues européennes)',
'settings.voice.page.stt.model.whisperBase': 'Whisper base (multilingue)',
'settings.voice.page.stt.model.whisperTiny': 'Whisper tiny (multilingue)',
'settings.voice.page.stt.badge.bestForEnglish': 'Idéal pour l’anglais',
'settings.voice.page.stt.badge.bestForMultilingual': 'Idéal multilingue',
'settings.voice.page.stt.meta.accuracy': 'Précision',
'settings.voice.page.stt.meta.speed': 'Vitesse',
'settings.voice.page.stt.modelInstalled': 'Modèle installé',
'settings.voice.page.stt.modelDownloading': 'Téléchargement du modèle...',
'settings.voice.page.stt.modelDownloadingProgress': 'Téléchargement du modèle... {percent}%',
'settings.voice.page.stt.modelNotInstalled': 'Modèle non téléchargé',
'settings.voice.page.stt.modelDownload': 'Télécharger',
'settings.voice.page.stt.modelDelete': 'Supprimer le modèle',
'settings.voice.page.stt.modelRetry': 'Réessayer',
'settings.voice.page.provider.wasm': 'Local',
'settings.voice.page.stt.wasmModel': 'Modèle Whisper',
'settings.voice.page.stt.wasmLoaded': 'Modèle chargé, prêt',
@@ -1563,10 +1613,12 @@ export const settingsDict = {
'settings.openchamber.visual.field.fontSizePercentageAria': 'Pourcentage de taille de police',
'settings.openchamber.visual.actions.resetFontSizeAria': 'Réinitialiser la taille de la police',
'settings.openchamber.visual.field.terminalFontSize': 'Taille de la police du terminal',
'settings.openchamber.visual.field.editorFontSize': 'Taille de la police de l\'éditeur',
'settings.openchamber.visual.field.codeFont': 'Police de code',
'settings.openchamber.visual.field.selectCodeFontAria': 'Sélectionnez la police du code',
'settings.openchamber.visual.actions.resetCodeFontAria': 'Réinitialiser la police du code',
'settings.openchamber.visual.actions.resetTerminalFontSizeAria': 'Réinitialiser la taille de la police du terminal',
'settings.openchamber.visual.actions.resetEditorFontSizeAria': 'Réinitialiser la taille de la police de l\'éditeur',
'settings.openchamber.visual.field.spacingDensity': 'Densité d\'espacement',
'settings.openchamber.visual.actions.resetSpacingAria': 'Réinitialiser l\'espacement',
'settings.openchamber.visual.field.inputBarOffset': 'Décalage de la barre d\'entrée',
@@ -1583,6 +1635,16 @@ export const settingsDict = {
'settings.openchamber.visual.field.userMessageRenderingAria': 'Rendu du message utilisateur : {option}',
'settings.openchamber.visual.field.mermaidRenderingAria': 'Rendu Mermaid : {option}',
'settings.openchamber.visual.field.diffLayoutAria': 'Disposition des différences : {option}',
'settings.openchamber.visual.field.sessionRecap': 'Générer le récapitulatif de session',
'settings.openchamber.visual.field.sessionRecapAria': "Générer un récapitulatif quand l'agent termine",
'settings.openchamber.visual.field.sessionSuggestion': 'Générer une suggestion de prochain message utilisateur',
'settings.openchamber.visual.field.sessionSuggestionAria': "Générer un prochain message utilisateur suggéré quand l'agent termine",
'settings.openchamber.visual.field.sessionGoal': 'Activer les objectifs de session',
'settings.openchamber.visual.field.sessionGoalAria': "Faire travailler la session automatiquement vers un objectif",
'settings.openchamber.visual.goal.sectionTitle': 'Objectif',
'settings.openchamber.visual.goal.budgetLabel': 'Budget de tokens par défaut',
'settings.openchamber.visual.goal.budgetAria': 'Appliquer un budget de tokens par défaut aux nouveaux objectifs',
'settings.openchamber.visual.goal.description': 'Armez le bouton cible du composeur et le prochain message devient un objectif : l\'agent continue d\'y travailler automatiquement, audité par le petit modèle, même en votre absence.',
'settings.openchamber.visual.field.showReasoningTracesAria': 'Afficher les traces de raisonnement',
'settings.openchamber.visual.field.showReasoningTraces': 'Afficher les traces de raisonnement',
'settings.openchamber.visual.field.collapsibleThinkingBlocksAria': 'Activer les blocs de raisonnement pliables',
@@ -1599,6 +1661,8 @@ export const settingsDict = {
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Actions intégrées de l\'assistant',
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Afficher Copier la réponse, Enregistrer en image et Lire à haute voix sur les blocs de texte de l\'assistant qui apparaissent avant les appels d\'outil suivants dans la même réponse.',
'settings.openchamber.visual.field.showToolFileIconsAria': 'Afficher les icônes des fichiers d\'outils',
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Renvoyer à la ligne les blocs de code',
'settings.openchamber.visual.field.codeBlockLineWrap': 'Renvoyer à la ligne les blocs de code',
'settings.openchamber.visual.field.showToolFileIcons': 'Afficher les icônes des fichiers d\'outils',
'settings.openchamber.visual.field.showDotfilesAria': 'Afficher les fichiers de points',
'settings.openchamber.visual.field.showDotfiles': 'Afficher les fichiers cachés',
@@ -1710,11 +1774,18 @@ export const settingsDict = {
'settings.remoteInstances.direct.sidebarTitle': 'Liens de serveur',
'settings.remoteInstances.direct.sidebarDescription': 'Se connecter avec un lien ou un token',
'settings.remoteInstances.direct.title': 'Autres serveurs OpenChamber',
'settings.remoteInstances.direct.description': 'Ajoutez un autre serveur OpenChamber par URL. Utilisez ceci lorsque le serveur est déjà lancé et que vous disposez d’un token de connexion.',
'settings.remoteInstances.direct.description': 'Serveurs vers lesquels cette application peut basculer. Importez un lien de connexion depuis un autre serveur ou ajoutez-le par adresse.',
'settings.remoteInstances.direct.addDialog.description': 'Ajoutez un autre serveur OpenChamber par URL. Utilisez ceci lorsque le serveur est déjà lancé et que vous disposez d’un token de connexion.',
'settings.remoteInstances.direct.field.labelPlaceholder': 'Libellé (facultatif)',
'settings.remoteInstances.direct.field.urlPlaceholder': 'https://hôte:port',
'settings.remoteInstances.direct.field.tokenPlaceholder': 'Token de connexion (facultatif pour les serveurs locaux de confiance)',
'settings.remoteInstances.direct.note': 'Les tokens de connexion sont enregistrés sur cet appareil et utilisés uniquement lorsque cette application se connecte à ce serveur.',
'settings.remoteInstances.direct.headers.title': 'Additional headers',
'settings.remoteInstances.direct.headers.description': 'Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.',
'settings.remoteInstances.direct.headers.field.namePlaceholder': 'Header name',
'settings.remoteInstances.direct.headers.field.valuePlaceholder': 'Header value',
'settings.remoteInstances.direct.headers.actions.add': 'Add header',
'settings.remoteInstances.direct.headers.removeAria': 'Remove header',
'settings.remoteInstances.direct.actions.add': 'Ajouter le serveur',
'settings.remoteInstances.direct.import.description': 'Collez un lien de connexion provenant d’un autre serveur OpenChamber.',
'settings.remoteInstances.direct.import.placeholder': 'openchamber://connect?...',
@@ -1724,30 +1795,87 @@ export const settingsDict = {
'settings.remoteInstances.direct.state.empty': 'Aucun autre serveur ajouté pour le moment.',
'settings.remoteInstances.clientAuth.title': 'Se connecter à ce serveur',
'settings.remoteInstances.clientAuth.description': 'Créez un lien ou un token sécurisé pour permettre à OpenChamber Desktop de se connecter à ce serveur.',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': 'Nom de l’appareil (facultatif)',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': 'Nom du nouvel appareil — ex. Mon iPhone',
'settings.remoteInstances.clientAuth.actions.create': 'Créer un token',
'settings.remoteInstances.clientAuth.actions.pair': 'Créer un lien',
'settings.remoteInstances.clientAuth.actions.revoke': 'Révoquer',
'settings.remoteInstances.clientAuth.actions.clearRevoked': 'Effacer les révocations',
'settings.remoteInstances.clientAuth.qrAlt': 'QR code de connexion OpenChamber',
'settings.remoteInstances.clientAuth.qrEnlarge': 'Agrandir le QR code',
'settings.remoteInstances.clientAuth.qrScanHint': "Scannez-le avec l'application OpenChamber sur votre autre appareil. À usage unique et expire.",
'settings.remoteInstances.clientAuth.qrDialogTitle': 'Scanner pour se connecter',
'settings.remoteInstances.clientAuth.actions.addDevice': 'Ajouter un appareil',
'settings.remoteInstances.clientAuth.actions.copied': 'Copié',
'settings.remoteInstances.clientAuth.addDevice.transportLabel': 'Où utiliserez-vous cet appareil ?',
'settings.remoteInstances.clientAuth.addDevice.subtitle': 'Créez un code QR à usage unique qui connecte un autre appareil à ce serveur.',
'settings.remoteInstances.clientAuth.addDevice.transport.local': 'Cet ordinateur uniquement',
'settings.remoteInstances.clientAuth.addDevice.transport.localHint': 'Pour les applications sur cette même machine.',
'settings.remoteInstances.clientAuth.addDevice.transport.lan': 'Réseau domestique uniquement',
'settings.remoteInstances.clientAuth.addDevice.transport.lanHint': 'Connexion directe via votre Wi-Fi. Ne fonctionne pas hors de ce réseau.',
'settings.remoteInstances.clientAuth.addDevice.transport.relay': 'Partout',
'settings.remoteInstances.clientAuth.addDevice.transport.relayHint': 'Fonctionne à la maison et en déplacement. En déplacement, le trafic passe par OpenChamber Private Relay — un tunnel chiffré de bout en bout. Aucune configuration.',
'settings.remoteInstances.clientAuth.addDevice.fallback.relay': 'Autoriser aussi le relais chiffré en déplacement',
'settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal': 'Préférer la connexion domestique directe quand elle est disponible',
'settings.remoteInstances.clientAuth.addDevice.create': 'Créer le code QR',
'settings.remoteInstances.clientAuth.addDevice.done': 'Terminé',
'settings.remoteInstances.clientAuth.addDevice.connectedToast': 'Appareil connecté.',
'settings.remoteInstances.clientAuth.pairingUrl': 'Lien de connexion',
'settings.remoteInstances.clientAuth.createdToken': 'Copiez ce token maintenant. Pour des raisons de sécurité, il ne sera plus affiché.',
'settings.remoteInstances.clientAuth.state.loading': 'Chargement des tokens...',
'settings.remoteInstances.clientAuth.state.empty': 'Aucun appareil connecté pour le moment.',
'settings.remoteInstances.clientAuth.state.revoked': 'Révoqué',
'settings.remoteInstances.clientAuth.state.thisDevice': 'Cet appareil',
'settings.remoteInstances.clientAuth.state.pending': 'En attente de connexion…',
'settings.remoteInstances.clientAuth.state.viaRelay': 'Relay',
'settings.remoteInstances.clientAuth.state.connectedDirect': 'Connecté · Réseau local',
'settings.remoteInstances.clientAuth.state.connectedRelay': 'Connecté · Relais',
'settings.remoteInstances.clientAuth.lastUsed': 'Dernière utilisation le {date}',
'settings.remoteInstances.clientAuth.neverUsed': 'Jamais utilisé',
'settings.remoteInstances.relay.title': 'OpenChamber Relay',
'settings.remoteInstances.relay.autoHint': 'Activé automatiquement lorsque vous associez un appareil via le relais.',
'settings.remoteInstances.relay.description': 'Permettez à vos autres appareils de se connecter depuis n’importe où sans ouvrir de ports. Le trafic est chiffré de bout en bout — le relais ne peut pas le lire.',
'settings.remoteInstances.relay.enableHint': 'Rien n’est partagé tant que vous n’activez pas le relais sur ce serveur.',
'settings.remoteInstances.relay.actions.enable': 'Activer le relais',
'settings.remoteInstances.relay.actions.disable': 'Désactiver',
'settings.remoteInstances.relay.confirm.disable': 'Désactiver le relais ? Les appareils connectés via celui-ci seront déconnectés immédiatement.',
'settings.remoteInstances.relay.state.loading': 'Vérification de l’état du relais...',
'settings.remoteInstances.relay.state.disabled': 'Désactivé',
'settings.remoteInstances.relay.state.connecting': 'Connexion',
'settings.remoteInstances.relay.state.connected': 'Connecté',
'settings.remoteInstances.relay.state.reconnecting': 'Reconnexion',
'settings.remoteInstances.relay.state.error': 'Erreur',
'settings.remoteInstances.relay.status.clientsOne': '{count} appareil connecté',
'settings.remoteInstances.relay.status.clientsMany': '{count} appareils connectés',
'settings.remoteInstances.relay.pair.title': 'Associer un appareil',
'settings.remoteInstances.relay.pair.labelPlaceholder': 'Nom de l’appareil (facultatif)',
'settings.remoteInstances.relay.pair.includeToken': 'Inclure le jeton d’accès (association en un seul scan)',
'settings.remoteInstances.relay.pair.noTokenHint': 'Sans jeton, l’appareil se connecte avec le mot de passe de l’interface de ce serveur.',
'settings.remoteInstances.relay.pair.generate': 'Créer un lien d’association',
'settings.remoteInstances.relay.pair.requiresConnected': 'L’association devient disponible une fois le relais connecté.',
'settings.remoteInstances.relay.pair.linkLabel': 'Lien d’association',
'settings.remoteInstances.relay.pair.warning': 'Ce lien donne accès à ce serveur. Ne le partagez pas.',
'settings.remoteInstances.relay.pair.qrAlt': 'Code QR d’association du relais',
'settings.remoteInstances.relay.pair.showQr': 'Afficher le code QR',
'settings.remoteInstances.relay.pair.qrDialogTitle': 'Scanner pour associer',
'settings.remoteInstances.relay.pair.qrDialogDescription': 'Scannez ce code QR avec l’application OpenChamber sur votre autre appareil.',
'settings.remoteInstances.relay.pair.manageHint': 'Gérez ou révoquez les appareils associés dans la liste « Connexion à ce serveur » ci-dessus.',
'settings.remoteInstances.relay.toast.enableFailed': 'Échec de l’activation du relais',
'settings.remoteInstances.relay.toast.disableFailed': 'Échec de la désactivation du relais',
'settings.remoteInstances.relay.toast.offerFailed': 'Échec de la création du lien d’association',
'settings.remoteInstances.relay.toast.linkCopied': 'Lien d’association copié',
'settings.openchamber.about.field.openCodeVersion': 'Version d’OpenCode',
'settings.openchamber.about.state.unknown': 'inconnue',
'settings.voice.page.field.ttsInputMode': 'Mode d’entrée TTS',
'settings.voice.page.field.ttsInputModeSanitized': 'Nettoyé',
'settings.voice.page.field.ttsInputModeRaw': 'Markdown brut',
'settings.voice.page.field.ttsInputModeSummarized': 'résumé',
'settings.openchamber.visual.section.mobileLayout': 'Mise en page mobile',
'settings.openchamber.visual.option.mobileLayout.default': 'Ancienne',
'settings.openchamber.visual.option.mobileLayout.new': 'Nouvelle',
'settings.openchamber.visual.field.macVibrancy': 'Transparence de la fenêtre',
'settings.openchamber.visual.field.macVibrancyHint': 'Utiliser le flou macOS natif (vibrancy) derrière la barre latérale. Désactivez cette option pour des surfaces entièrement opaques.',
'settings.openchamber.visual.field.dockBadge': 'Badge du Dock',
'settings.openchamber.visual.field.dockBadgeHint': 'Afficher sur l’icône du Dock de macOS le nombre de discussions avec une activité non vue.',
'settings.openchamber.visual.actions.saveAndRestart': 'Enregistrer et redémarrer',
'settings.openchamber.visual.actions.restarting': 'Redémarrage…',
'settings.openchamber.visual.field.fileEditorKeymap': 'Keymap de l’éditeur de fichiers',
@@ -1784,4 +1912,10 @@ export const settingsDict = {
'settings.magicPrompts.page.toast.resetFailed': 'Échec de la réinitialisation du prompt',
'settings.magicPrompts.page.toast.resetAllSuccess': 'Tous les prompts ont été réinitialisés',
'settings.magicPrompts.page.toast.resetAllFailed': 'Échec de la réinitialisation de tous les prompts',
'settings.openchamber.visual.section.followUpBehavior': 'Follow-up behavior',
'settings.openchamber.visual.section.followUpBehaviorAria': 'Follow-up behavior',
'settings.openchamber.visual.field.followUpBehaviorAria': 'Follow-up behavior: {option}',
'settings.openchamber.visual.field.followUpBehaviorDescription': 'Choose what happens when you press Enter on a follow-up message while the agent is still responding.',
'settings.openchamber.visual.option.followUpBehavior.steer.label': 'Steer',
'settings.openchamber.visual.option.followUpBehavior.queue.label': 'Queue',
} as const;
+150 -1
View File
@@ -13,6 +13,7 @@ export const dict = {
'common.language.brazilianPortuguese': 'Portugais brésilien',
'common.language.korean': 'Coréen',
'common.language.polish': 'Polonais',
'common.language.japanese': 'Japonais',
'common.revealPath.finder': 'Révéler dans le Finder',
'common.revealPath.fileExplorer': 'Ouvrir dans l\'explorateur de fichiers',
'common.revealPath.fileManager': 'Ouvrir dans le gestionnaire de fichiers',
@@ -21,6 +22,13 @@ export const dict = {
'pwa.installPrompt.dismiss': 'Ignorer',
'pwa.installPrompt.started': 'Installation démarrée',
'pwa.installPrompt.installed': 'OpenChamber installé',
'shareOpinion.actions.shareOpinion': 'Donner son avis',
'shareOpinion.actions.bookCall': 'Réserver un appel',
'shareOpinion.actions.shortSurvey': 'Court sondage',
'shareOpinion.dialog.title': 'Donnez votre avis',
'shareOpinion.toast.title': 'Aidez à façonner OpenChamber',
'shareOpinion.toast.description': 'Dites ce qui est utile, confus ou manquant pour aider à définir la suite.',
'sessions.sidebar.footer.actions.shareOpinion': 'Donner son avis',
'layout.mainTab.chat': 'Chat',
'layout.mainTab.plan': 'Plan',
'layout.mainTab.diff': 'Diff',
@@ -103,6 +111,7 @@ export const dict = {
'sessions.scheduledTasks.editor.scheduleType.daily': 'Tous les jours',
'sessions.scheduledTasks.editor.scheduleType.weekly': 'Hebdomadaire',
'sessions.scheduledTasks.editor.scheduleType.once': 'Une fois',
'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron',
'sessions.scheduledTasks.editor.date.label': 'Date',
'sessions.scheduledTasks.editor.date.placeholder': 'Sélectionnez une date',
'sessions.scheduledTasks.editor.date.previousMonth': 'Mois précédent',
@@ -128,6 +137,10 @@ export const dict = {
'sessions.scheduledTasks.editor.prompt.placeholder': 'Résumer les tâches ouvertes et proposer les prochaines actions',
'sessions.scheduledTasks.editor.enabled.aria': 'Activer la tâche',
'sessions.scheduledTasks.editor.enabled.label': 'Activé',
'sessions.scheduledTasks.editor.goal.label': 'Exécuter comme objectif',
'sessions.scheduledTasks.editor.goal.aria': 'Exécuter cette tâche comme un objectif que l\'agent poursuit jusqu\'au bout',
'sessions.scheduledTasks.editor.goal.budgetLabel': 'Budget de tokens',
'sessions.scheduledTasks.editor.goal.budgetAria': 'Limiter l’objectif à un budget de tokens',
'sessions.scheduledTasks.editor.actions.closeAria': 'Fermer',
'sessions.scheduledTasks.editor.actions.cancel': 'Annuler',
'sessions.scheduledTasks.editor.actions.save': 'Sauvegarder',
@@ -218,6 +231,7 @@ export const dict = {
'sessions.sidebar.header.actions.searchSessions': 'Sessions de recherche',
'sessions.sidebar.header.actions.exitSelection': 'Quitter la sélection',
'sessions.sidebar.header.actions.selectSessions': 'Sélectionnez des sessions',
'sessions.sidebar.header.actions.sortProjects': 'Trier les projets',
'sessions.sidebar.header.actions.sessionDisplayMode': 'Mode d\'affichage des sessions',
'sessions.sidebar.header.displayMode.label': 'Mode d\'affichage',
'sessions.sidebar.header.displayMode.default': 'Défaut',
@@ -225,6 +239,11 @@ export const dict = {
'sessions.sidebar.header.displayMode.showRecent': 'Afficher la section récente',
'sessions.sidebar.header.displayMode.collapseAll': 'Tout réduire',
'sessions.sidebar.header.displayMode.expandAll': 'Tout développer',
'sessions.sidebar.header.projectSort.manual': 'Manuel',
'sessions.sidebar.header.projectSort.aToZ': 'A → Z',
'sessions.sidebar.header.projectSort.zToA': 'Z → A',
'sessions.sidebar.header.projectSort.dateAdded': 'Les plus récentes',
'sessions.sidebar.header.projectSort.recent': 'Récentes',
'sessions.sidebar.header.search.matchCountSingle': 'Correspondance {count}',
'sessions.sidebar.header.search.matchCountPlural': 'Correspondances {count}',
'sessions.sidebar.header.search.escapeHint': 'Echap pour effacer',
@@ -269,6 +288,7 @@ export const dict = {
'sessions.sidebar.project.actions.projectMenu': 'Menu Projet',
'sessions.sidebar.project.actions.newSession': 'Nouvelle session',
'sessions.sidebar.project.actions.closeProject': 'Fermer le projet',
'sessions.sidebar.project.actions.edit': 'Modifier',
'sessions.sidebar.project.actions.newDraftSession': 'Nouveau brouillon de session',
'sessions.sidebar.session.menu.rename': 'Rebaptiser',
'sessions.sidebar.session.rename.save': 'Enregistrer le nom de la session',
@@ -1079,6 +1099,7 @@ export const dict = {
'diffView.state.loadingRepositoryStatus': 'Chargement de l\'état du dépôt...',
'diffView.state.notGitRepository': 'Pas un dépôt git. Utilisez l\'onglet Git pour initialiser ou modifier des répertoires.',
'diffView.state.cleanWorkingTree': 'Worktree sans modifications, rien à afficher',
'diffView.state.noLastTurnChanges': 'Aucun changement du dernier tour à afficher',
'diffView.state.failedToLoadDiff': 'Échec du chargement du différentiel',
'diffView.state.loadingDiff': 'Chargement du différentiel...',
'diffView.state.loadingChanges': 'Chargement des modifications...',
@@ -1088,6 +1109,7 @@ export const dict = {
'diffView.summary.changedFilesPlural': 'Fichiers {count} modifiés',
"diffView.scope.changed": "Modifiés",
"diffView.scope.staged": "Staged",
"diffView.scope.lastTurn": "Dernier tour",
"diffView.scope.selectorAria": "Sélectionner le mode de changements",
'diffView.actions.retry': 'Réessayer',
'diffView.actions.renderAnyway': 'Afficher quand même',
@@ -1104,12 +1126,20 @@ export const dict = {
'diffView.reviewDialog.title': 'Revoir les changements',
'diffView.reviewDialog.description': 'Démarre une session de revue séparée pour les changements actuels.',
'diffView.reviewDialog.generateHandoff': 'Générer un handoff',
'diffView.reviewDialog.autoReview': 'Lancer la boucle de revue automatique',
'diffView.reviewDialog.info': 'Ce flux fonctionne mieux lorsqu’il est lancé depuis la session où les changements ont été implémentés.',
'diffView.reviewDialog.actions.cancel': 'Annuler',
'diffView.reviewDialog.actions.start': 'Revoir',
'diffView.reviewDialog.actions.starting': 'Démarrage...',
'diffView.reviewDialog.toast.noSessionDirectory': 'Le dossier de session est indisponible',
'diffView.reviewDialog.toast.startFailed': 'Impossible de démarrer le flux de revue',
'chat.history.loadOlder': 'Charger les messages précédents',
'chat.autoReview.title': 'La boucle de revue de code est en cours',
'chat.autoReview.status.waitingForReviewer': 'En attente du reviewer',
'chat.autoReview.status.waitingForImplementer': 'En attente de l’implémenteur',
'chat.autoReview.reviewSessionLabel': 'Session de revue',
'chat.autoReview.actions.open': 'Ouvrir',
'chat.autoReview.actions.stop': 'Arrêter',
'diffView.hunk.label': 'Sections',
'diffView.hunk.stage': 'Préparer',
'diffView.hunk.unstage': 'Retirer',
@@ -1204,6 +1234,43 @@ export const dict = {
"header.actions.toggleChangesPanelAria": "Basculer le panneau des changements",
'header.actions.planWithShortcut': 'Forfait ({shortcut})',
'header.actions.terminalPanelWithShortcut': 'Panneau à bornes ({shortcut})',
'chat.recap.aria': 'Récapitulatif de la session',
'chat.recap.label': 'Récap :',
'chat.goal.dialog.titleCreate': 'Définir un objectif de session',
'chat.goal.dialog.titleManage': 'Objectif de session',
'chat.goal.dialog.objectiveLabel': 'Objectif',
'chat.goal.dialog.objectivePlaceholder': 'Décrivez l\'état final que l\'agent doit atteindre et vérifier…',
'chat.goal.dialog.budgetLabel': 'Budget de tokens',
'chat.goal.status.active': 'Actif',
'chat.goal.status.evaluating': 'Évaluation…',
'chat.goal.status.paused': 'En pause',
'chat.goal.status.blocked': 'Bloqué',
'chat.goal.status.budgetLimited': 'Budget atteint',
'chat.goal.status.complete': 'Terminé',
'chat.goal.usage.tokens': '{used} tokens',
'chat.goal.usage.tokensWithBudget': '{used}/{budget} tokens',
'chat.goal.usage.turns': '{turns} continuations',
'chat.goal.action.pause': 'Mettre en pause',
'chat.goal.action.resume': 'Reprendre',
'chat.goal.action.markComplete': 'Marquer comme terminé',
'chat.goal.action.clear': 'Supprimer l\'objectif',
'chat.goal.action.cancel': 'Annuler',
'chat.goal.action.save': 'Enregistrer l\'objectif',
'chat.goal.action.start': 'Lancer l\'objectif',
'chat.goal.toast.actionFailed': 'Échec de la mise à jour de l\'objectif',
'chat.goal.row.aria': 'Objectif de session — ouvrir les détails',
'chat.goal.button.createAria': 'Définir un objectif de session',
'chat.goal.button.manageAria': 'Gérer l\'objectif de session',
'chat.goal.button.armAria': 'Démarrer un objectif avec le prochain message',
"chat.goal.counter.aria": "Limite de longueur de l'objectif",
'chat.goal.button.disarmAria': 'Objectif armé — touchez pour désarmer',
'chat.goal.button.cancelAria': 'Objectif en cours — touchez pour l’annuler',
'chat.goal.cancelDialog.title': 'Annuler cet objectif ?',
'chat.goal.cancelDialog.description': 'L\'agent cessera de travailler automatiquement vers cet objectif.',
'chat.goal.cancelDialog.keep': 'Garder l\'objectif',
'chat.goal.cancelDialog.confirm': 'Annuler l\'objectif',
'chat.suggestion.applyAria': 'Utiliser le message suggéré',
'chat.suggestion.dismissAria': 'Ignorer la suggestion',
'header.actions.toggleTerminalPanelAria': 'Basculer le panneau à bornes',
'terminalView.stream.processExitedMessage': '[Processus terminé{exitCodeSegment}{signalSegment}]',
'terminalView.stream.processExitedWithCode': 'avec le code {exitCode}',
@@ -1565,6 +1632,7 @@ export const dict = {
'chat.queuedMessage.edit': 'modifier',
'chat.queuedMessage.send': 'envoyer',
'chat.queuedMessage.removeAria': 'Supprimer de la file d\'attente',
'chat.queuedMessage.reorderAria': 'Glisser pour réorganiser',
'chat.container.returnToParent.aria': 'Retour à la session parents',
'chat.container.returnToParent.titleNamed': 'Retourner à : {title}',
'chat.container.returnToParent.title': 'Retour à la session parents',
@@ -1658,6 +1726,18 @@ export const dict = {
'chat.chatInput.placeholder.chat': '@ pour les fichiers/agents ; / pour les commandes et les skills ; ! pour shell ; # pour les extraits',
'chat.chatInput.placeholder.chatCompact': 'Utiliser @ / ! # pour les aides',
'chat.chatInput.placeholder.selectSession': 'Sélectionnez ou créez une session pour commencer à discuter',
'chat.dictation.start': 'Démarrer la dictée',
'chat.dictation.overlayAria': 'Dictée',
'chat.dictation.downloadingModel': 'Téléchargement du modèle vocal...',
'chat.dictation.downloadingModelProgress': 'Téléchargement du modèle vocal... {percent}%',
'chat.dictation.listening': 'Écoute...',
'chat.dictation.processing': 'Transcription...',
'chat.dictation.failed': 'Échec de la transcription',
'chat.dictation.cancel': 'Abandonner la dictée',
'chat.dictation.insert': 'Insérer la transcription',
'chat.dictation.insertAndSend': 'Insérer et envoyer',
'chat.dictation.retry': 'Réessayer la transcription',
'chat.dictation.discard': 'Abandonner l\'enregistrement',
'chat.snippetAutocomplete.action.addNew': '+ Ajouter un nouvel extrait',
'chat.snippetAutocomplete.empty': 'Aucun extrait trouvé',
'chat.snippetAutocomplete.footer': '↑↓ naviguer • Entrer sélectionner • Esc fermer',
@@ -1685,6 +1765,9 @@ export const dict = {
'chat.chatInput.previewContextRemove': 'Supprimer le contexte d\'aperçu',
'chat.chatInput.projectRoot': 'Racine du projet',
'chat.chatInput.branch': 'Bifurquer',
'chat.chatInput.draftPicker.projectTitle': 'Projet',
'chat.chatInput.draftPicker.searchProjects': 'Rechercher des projets...',
'chat.chatInput.draftPicker.searchBranches': 'Rechercher des branches...',
'chat.chatInput.worktrees': 'Worktrees',
'chat.chatInput.worktreeNew': '+ Nouveau',
'chat.chatInput.drop.insertMention': 'Déposer pour insérer comme mention',
@@ -1710,6 +1793,11 @@ export const dict = {
'chat.toolOutputDialog.image.closeAria': 'Fermer l\'aperçu de l\'image',
'chat.toolOutputDialog.mermaid.missingSource': 'URL de source Mermaid manquante.',
'chat.toolOutputDialog.mermaid.loadFailed': 'Impossible de charger le diagramme Mermaid.',
'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'L\'URL de données Mermaid est mal formée.',
'chat.toolOutputDialog.mermaid.invalidLocalPath': 'Le chemin du fichier Mermaid local est invalide.',
'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': 'Impossible de lire le fichier Mermaid. Statut : {status}.',
'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': 'Le protocole de l\'URL Mermaid n\'est pas pris en charge.',
'chat.toolOutputDialog.mermaid.loadFailedWithStatus': 'Impossible de charger le diagramme Mermaid. Statut : {status}.',
'chat.toolOutputDialog.mermaid.closeAria': 'Fermer l\'aperçu du diagramme',
'chat.toolOutputDialog.mermaid.loading': 'Diagramme de chargement...',
'chat.toolOutputDialog.mermaid.renderFailed': 'Impossible d\'afficher le diagramme Mermaid.',
@@ -1812,6 +1900,7 @@ export const dict = {
'chat.modelControls.noProvidersOrModelsFound': 'Aucun fournisseur ou modèle ne correspond à votre recherche.',
'chat.modelControls.reorderFavoriteAria': 'Réorganiser les favoris',
'chat.modelControls.reorderFavoriteTitle': 'Faites glisser pour réorganiser les favoris',
'chat.modelControls.reorderProviderTitle': 'Faites glisser pour réorganiser le fournisseur',
'chat.modelControls.permissionLabel.custom': 'Personnalisé',
'chat.modelControls.permissionLabel.allow': 'Permettre',
'chat.modelControls.permissionLabel.deny': 'Refuser',
@@ -2052,7 +2141,7 @@ export const dict = {
'sessionAuth.error.networkTitle': 'Impossible d\'atteindre le serveur',
'sessionAuth.error.rateLimitDescriptionSingle': 'Veuillez attendre {minutes} minute avant de réessayer.',
'sessionAuth.error.rateLimitDescriptionPlural': 'Veuillez attendre {minutes} minutes avant de réessayer.',
'sessionAuth.error.networkDescription': 'Nous n\'avons pas pu vérifier la session d\'interface utilisateur. Vérifiez que le service est en cours d\'exécution et réessayez.',
'sessionAuth.error.networkDescription': 'Nous n\'avons pas pu vérifier la session d\'interface utilisateur. Si vous ouvrez OpenChamber depuis un autre appareil sur votre réseau local, activez l\'accès au réseau du bureau dans l\'application de bureau et utilisez l\'adresse LAN indiquée dans les paramètres.',
'sessionAuth.error.retry': 'Réessayer',
'sessionAuth.error.passkeySetupFailed': 'La configuration du mot de passe a échoué.',
'sessionAuth.error.incorrectPassword': 'Mot de passe incorrect. Essayer à nouveau.',
@@ -2326,10 +2415,15 @@ export const dict = {
'updateDialog.status.downloading': 'Téléchargement...',
'updateDialog.actions.restartToUpdate': 'Redémarrer pour mettre à jour',
'updateDialog.actions.updateNow': 'Mettre à jour maintenant',
'updateDialog.actions.openMobileUpdate': 'Ouvrir la mise à jour',
'updateDialog.changelog.title': 'Nouveautés',
'updateDialog.status.updating': 'Mise à jour...',
'updateDialog.error.updateFailed': 'La mise à jour a échoué',
'updateDialog.error.takingLonger': 'La mise à jour prend plus de temps que prévu. Attendez un peu et actualisez, ou exécutez : openchamber update',
'mobileUpdate.toast.available.title': 'Mise à jour OpenChamber disponible',
'mobileUpdate.toast.available.description': 'La version {version} est prête pour Android.',
'mobileUpdate.toast.actions.download': 'Télécharger',
'mobileUpdate.toast.actions.dismiss': 'Ignorer',
'opencodeUpdate.toast.available.title': 'Mise à jour OpenCode',
'opencodeUpdate.toast.available.description': 'Version {version} disponible.',
'opencodeUpdate.toast.actions.update': 'Mise à jour',
@@ -2405,12 +2499,19 @@ export const dict = {
'mainLayout.mobile.closeDrawerAria': 'Fermer le tiroir',
'sortableTabsStrip.aria.tabs': 'Onglets',
'openChamberLogo.aria.logo': 'Logo OpenChamber',
'markdownRenderer.code.actions.copyTitle': 'Copier le code',
'markdownRenderer.code.actions.copiedTitle': 'Copié',
'markdownRenderer.table.actions.copyTitle': 'Copier le tableau',
'markdownRenderer.code.actions.enableWrapTitle': 'Activer le retour à la ligne',
'markdownRenderer.code.actions.disableWrapTitle': 'Désactiver le retour à la ligne',
'markdownRenderer.table.actions.downloadTitle': 'Télécharger le tableau',
'markdownRenderer.table.toast.downloadedAsFormat': 'Table téléchargée sous le nom {format}',
'markdownRenderer.mermaid.actions.copyTitle': 'Copie',
'markdownRenderer.mermaid.actions.copySourceTitle': 'Copier la source',
'markdownRenderer.mermaid.actions.downloadSvgTitle': 'Télécharger SVG',
'markdownRenderer.mermaid.actions.zoomInTitle': 'Zoom avant',
'markdownRenderer.mermaid.actions.zoomOutTitle': 'Zoom arrière',
'markdownRenderer.mermaid.actions.resetViewTitle': 'Réinitialiser la vue',
'markdownRenderer.mermaid.toast.downloadFailed': 'Échec du téléchargement du diagramme',
'common.date.today': 'Aujourd’hui',
'common.date.yesterday': 'Hier',
@@ -2448,6 +2549,50 @@ export const dict = {
'quota.window.premiumInteractions': 'Interactions premium',
'layout.mainTab.diagram': 'Diagramme',
'mobile.nav.aria': 'Navigation mobile',
'mobile.connect.welcome.title': 'Se connecter à OpenChamber',
'mobile.connect.welcome.description': 'Ajoutez une URL de serveur ou scannez un code QR d\'appairage pour commencer à utiliser l\'app mobile.',
'mobile.connect.url.label': 'URL du serveur',
'mobile.connect.url.placeholder': 'http://192.168.1.74:2606',
'mobile.connect.token.label': 'Jeton client',
'mobile.connect.token.placeholder': 'Collez le jeton d\'accès',
'mobile.connect.token.hint': 'Nécessaire uniquement si votre serveur exige un jeton au lieu d\'un mot de passe.',
'mobile.connect.password.label': 'Mot de passe',
'mobile.connect.password.placeholder': 'Mot de passe OpenChamber',
'mobile.connect.connectButton': 'Se connecter',
'mobile.connect.unlockButton': 'Déverrouiller et se connecter',
'mobile.connect.cancelPassword': 'Utiliser un autre serveur',
'mobile.connect.connecting': 'Connexion...',
'mobile.connect.scanQr': 'Scanner le code QR',
'mobile.connect.welcome.scanHint': 'Sur votre ordinateur, ouvrez « Ajouter un appareil » pour afficher un code QR, puis scannez-le ici.',
'mobile.connect.advanced': 'Avancé',
'mobile.connect.manual.toggle': 'Connexion par adresse',
'mobile.connect.scan.permissionDenied': 'L\'accès à la caméra est désactivé. Activez-le dans les Réglages pour scanner un code QR.',
'mobile.connect.scan.failed': 'Impossible de scanner ce code QR. Réessayez ou saisissez l\'URL manuellement.',
'mobile.connect.scan.invalid': 'Ce code QR n\'est pas un code de connexion OpenChamber.',
'mobile.connect.scan.unsupported': 'Le scan QR est disponible uniquement dans l\'app mobile installée.',
'mobile.connect.saved.title': 'Connexions enregistrées',
'mobile.connect.saved.empty': 'Aucune connexion enregistrée pour le moment.',
'mobile.connect.relay.badge': 'via OpenChamber Relay',
'mobile.connect.error.urlRequired': 'Saisissez une URL de serveur.',
'mobile.connect.error.invalidUrl': 'Cette URL de serveur n\'est pas valide.',
'mobile.connect.error.unreachable': 'Impossible de joindre ce serveur OpenChamber.',
'mobile.connect.error.authRequired': 'Ce serveur nécessite un mot de passe ou un jeton client.',
'mobile.connect.error.passwordFailed': 'Impossible de déverrouiller ce serveur. Vérifiez le mot de passe.',
'mobile.instances.addTitle': 'Ajouter une instance',
'mobile.instances.addManual': 'Ajouter par adresse',
'mobile.instances.editTitle': 'Modifier l\'instance',
'mobile.instances.edit': 'Modifier',
'mobile.instances.delete': 'Supprimer',
'mobile.instances.deleteAria': 'Supprimer {label}',
'mobile.instances.confirmDeleteAria': 'Confirmer la suppression de {label}',
'mobile.instances.cancelDeleteAria': 'Conserver {label}',
'mobile.instances.cancelEdit': 'Annuler',
'mobile.instances.label.label': 'Nom',
'mobile.instances.label.placeholder': 'Nom d\'affichage facultatif',
'mobile.instances.saveNew': 'Enregistrer l\'instance',
'mobile.instances.status.connectedDirect': 'Connecté · Réseau local',
'mobile.instances.status.connectedRelay': 'Connecté · Relais privé',
'mobile.instances.saveEdit': 'Enregistrer les modifications',
'mobile.nav.changes': 'Modifications',
'mobile.nav.settings': 'Paramètres',
'mobile.surface.closeAria': 'Fermer',
@@ -2460,6 +2605,7 @@ export const dict = {
'mobile.menu.files': 'Fichiers',
'mobile.menu.changes': 'Modifications',
'mobile.menu.mcp': 'MCP',
'mobile.menu.instances': 'Instances',
'mobile.menu.update': 'Mettre à jour',
'mobile.menu.settings': 'Paramètres',
'mobile.sessions.newChatCta': 'Nouveau chat dans {project}',
@@ -2619,6 +2765,9 @@ export const dict = {
'chat.chatInput.reviewCommentsRemove': 'Retirer les commentaires de revue',
'chat.toolPart.showRawJson': 'Afficher le JSON brut',
'chat.toolPart.showFormattedJson': 'Afficher le JSON formaté',
'chat.toolPart.showNavigableJson': 'Afficher le JSON navigable',
'chat.toolPart.openFileAtFirstChange': 'Ouvrir le fichier à la première modification',
'chat.toolPart.openFileDiff': 'Ouvrir les différences du fichier',
'chat.toolPart.copyOutput': 'Copier la sortie',
'chat.toolPart.copiedOutput': 'Sortie copiée',
'chat.toolPart.copyOutputFailed': 'Impossible de copier la sortie',
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -220,11 +220,18 @@ export const settingsDict = {
'settings.remoteInstances.direct.sidebarTitle': '서버 링크',
'settings.remoteInstances.direct.sidebarDescription': '링크나 토큰으로 연결',
'settings.remoteInstances.direct.title': '다른 OpenChamber 서버',
'settings.remoteInstances.direct.description': 'URL로 다른 OpenChamber 서버를 추가합니다. 서버가 이미 실행 중이고 연결 토큰이 있을 때 사용하세요.',
'settings.remoteInstances.direct.description': '이 앱이 전환할 수 있는 서버입니다. 다른 서버의 페어링 링크를 가져오거나 주소로 추가하세요.',
'settings.remoteInstances.direct.addDialog.description': 'URL로 다른 OpenChamber 서버를 추가합니다. 서버가 이미 실행 중이고 연결 토큰이 있을 때 사용하세요.',
'settings.remoteInstances.direct.field.labelPlaceholder': '라벨(선택 사항)',
'settings.remoteInstances.direct.field.urlPlaceholder': 'https://host:port',
'settings.remoteInstances.direct.field.tokenPlaceholder': '연결 토큰(신뢰할 수 있는 로컬 서버는 선택 사항)',
'settings.remoteInstances.direct.note': '연결 토큰은 이 기기에 저장되며 이 앱이 해당 서버에 연결할 때만 사용됩니다.',
'settings.remoteInstances.direct.headers.title': 'Additional headers',
'settings.remoteInstances.direct.headers.description': 'Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.',
'settings.remoteInstances.direct.headers.field.namePlaceholder': 'Header name',
'settings.remoteInstances.direct.headers.field.valuePlaceholder': 'Header value',
'settings.remoteInstances.direct.headers.actions.add': 'Add header',
'settings.remoteInstances.direct.headers.removeAria': 'Remove header',
'settings.remoteInstances.direct.actions.add': '서버 추가',
'settings.remoteInstances.direct.import.description': '다른 OpenChamber 서버에서 만든 연결 링크를 붙여넣으세요.',
'settings.remoteInstances.direct.import.placeholder': 'openchamber://connect?...',
@@ -234,20 +241,74 @@ export const settingsDict = {
'settings.remoteInstances.direct.state.empty': '아직 추가된 다른 서버가 없습니다.',
'settings.remoteInstances.clientAuth.title': '이 서버에 연결',
'settings.remoteInstances.clientAuth.description': 'OpenChamber Desktop이 이 서버에 연결할 수 있도록 안전한 링크나 토큰을 만듭니다.',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': '기기 이름(선택 사항)',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': '기기 이름 — 예: My iPhone',
'settings.remoteInstances.clientAuth.actions.create': '토큰 만들기',
'settings.remoteInstances.clientAuth.actions.pair': '링크 만들기',
'settings.remoteInstances.clientAuth.actions.revoke': '해지',
'settings.remoteInstances.clientAuth.actions.clearRevoked': '해지된 항목 지우기',
'settings.remoteInstances.clientAuth.qrAlt': 'OpenChamber connection QR code',
'settings.remoteInstances.clientAuth.qrEnlarge': 'QR 코드 확대',
'settings.remoteInstances.clientAuth.qrScanHint': '다른 기기의 OpenChamber 앱으로 스캔하세요. 일회용이며 만료됩니다.',
'settings.remoteInstances.clientAuth.qrDialogTitle': '스캔하여 연결',
'settings.remoteInstances.clientAuth.actions.addDevice': '기기 추가',
'settings.remoteInstances.clientAuth.actions.copied': '복사됨',
'settings.remoteInstances.clientAuth.addDevice.transportLabel': '이 기기를 어디에서 사용하나요?',
'settings.remoteInstances.clientAuth.addDevice.subtitle': '다른 기기를 이 서버에 연결하는 일회용 QR 코드를 만듭니다.',
'settings.remoteInstances.clientAuth.addDevice.transport.local': '이 컴퓨터 전용',
'settings.remoteInstances.clientAuth.addDevice.transport.localHint': '같은 컴퓨터의 앱을 위한 옵션입니다.',
'settings.remoteInstances.clientAuth.addDevice.transport.lan': '집 네트워크 전용',
'settings.remoteInstances.clientAuth.addDevice.transport.lanHint': 'Wi-Fi로 직접 연결합니다. 이 네트워크 밖에서는 작동하지 않습니다.',
'settings.remoteInstances.clientAuth.addDevice.transport.relay': '어디서나',
'settings.remoteInstances.clientAuth.addDevice.transport.relayHint': '집과 밖 어디서나 작동합니다. 밖에서는 종단간 암호화 터널인 OpenChamber Private Relay를 통해 연결됩니다. 설정이 필요 없습니다.',
'settings.remoteInstances.clientAuth.addDevice.fallback.relay': '밖에서는 암호화 릴레이 연결도 허용',
'settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal': '가능하면 집에서는 직접 연결 우선',
'settings.remoteInstances.clientAuth.addDevice.create': 'QR 코드 만들기',
'settings.remoteInstances.clientAuth.addDevice.done': '완료',
'settings.remoteInstances.clientAuth.addDevice.connectedToast': '기기가 연결되었습니다.',
'settings.remoteInstances.clientAuth.pairingUrl': '연결 링크',
'settings.remoteInstances.clientAuth.createdToken': '지금 이 토큰을 복사하세요. 보안을 위해 다시 표시되지 않습니다.',
'settings.remoteInstances.clientAuth.state.loading': '토큰을 불러오는 중...',
'settings.remoteInstances.clientAuth.state.empty': '아직 연결된 기기가 없습니다.',
'settings.remoteInstances.clientAuth.state.revoked': '해지됨',
'settings.remoteInstances.clientAuth.state.thisDevice': '이 기기',
'settings.remoteInstances.clientAuth.state.pending': '연결 대기 중…',
'settings.remoteInstances.clientAuth.state.viaRelay': 'Relay',
'settings.remoteInstances.clientAuth.state.connectedDirect': '연결됨 · 로컬 네트워크',
'settings.remoteInstances.clientAuth.state.connectedRelay': '연결됨 · 릴레이',
'settings.remoteInstances.clientAuth.lastUsed': '마지막 사용 {date}',
'settings.remoteInstances.clientAuth.neverUsed': '사용한 적 없음',
'settings.remoteInstances.relay.title': 'OpenChamber Relay',
'settings.remoteInstances.relay.autoHint': '릴레이로 기기를 페어링하면 자동으로 켜집니다.',
'settings.remoteInstances.relay.description': '포트를 열지 않고도 다른 기기가 어디서든 연결할 수 있습니다. 트래픽은 종단 간 암호화되어 릴레이는 내용을 읽을 수 없습니다.',
'settings.remoteInstances.relay.enableHint': '이 서버에서 릴레이를 켜기 전까지는 아무것도 공유되지 않습니다.',
'settings.remoteInstances.relay.actions.enable': '릴레이 켜기',
'settings.remoteInstances.relay.actions.disable': '끄기',
'settings.remoteInstances.relay.confirm.disable': '릴레이를 끄시겠습니까? 릴레이를 통해 연결된 기기는 즉시 연결이 끊어집니다.',
'settings.remoteInstances.relay.state.loading': '릴레이 상태 확인 중...',
'settings.remoteInstances.relay.state.disabled': '꺼짐',
'settings.remoteInstances.relay.state.connecting': '연결 중',
'settings.remoteInstances.relay.state.connected': '연결됨',
'settings.remoteInstances.relay.state.reconnecting': '재연결 중',
'settings.remoteInstances.relay.state.error': '오류',
'settings.remoteInstances.relay.status.clientsOne': '기기 {count}대 연결됨',
'settings.remoteInstances.relay.status.clientsMany': '기기 {count}대 연결됨',
'settings.remoteInstances.relay.pair.title': '기기 페어링',
'settings.remoteInstances.relay.pair.labelPlaceholder': '기기 이름 (선택 사항)',
'settings.remoteInstances.relay.pair.includeToken': '액세스 토큰 포함 (한 번 스캔으로 페어링)',
'settings.remoteInstances.relay.pair.noTokenHint': '토큰이 없으면 기기는 연결 후 이 서버의 UI 비밀번호로 로그인합니다.',
'settings.remoteInstances.relay.pair.generate': '페어링 링크 만들기',
'settings.remoteInstances.relay.pair.requiresConnected': '페어링은 릴레이가 연결된 후 사용할 수 있습니다.',
'settings.remoteInstances.relay.pair.linkLabel': '페어링 링크',
'settings.remoteInstances.relay.pair.warning': '이 링크는 이 서버에 대한 접근 권한을 부여합니다. 공유하지 마세요.',
'settings.remoteInstances.relay.pair.qrAlt': '릴레이 페어링 QR 코드',
'settings.remoteInstances.relay.pair.showQr': 'QR 코드 표시',
'settings.remoteInstances.relay.pair.qrDialogTitle': '스캔하여 페어링',
'settings.remoteInstances.relay.pair.qrDialogDescription': '다른 기기의 OpenChamber 앱으로 이 QR 코드를 스캔하세요.',
'settings.remoteInstances.relay.pair.manageHint': '페어링된 기기는 위의 “이 서버에 연결” 목록에서 관리하거나 철회할 수 있습니다.',
'settings.remoteInstances.relay.toast.enableFailed': '릴레이를 켤 수 없습니다',
'settings.remoteInstances.relay.toast.disableFailed': '릴레이를 끔 수 없습니다',
'settings.remoteInstances.relay.toast.offerFailed': '페어링 링크를 만들지 못했습니다',
'settings.remoteInstances.relay.toast.linkCopied': '페어링 링크를 복사했습니다',
'settings.remoteInstances.sidebar.phase.ready': '준비됨',
'settings.remoteInstances.sidebar.phase.error': '오류',
'settings.remoteInstances.sidebar.phase.reconnect': '재연결',
@@ -365,12 +426,14 @@ export const settingsDict = {
'settings.agents.sidebar.toast.agentExists': '같은 이름의 에이전트가 이미 존재합니다',
'settings.agents.sidebar.toast.removeOldAfterRenameFailed': '이름 변경 후 이전 에이전트를 제거하지 못했습니다',
'settings.agents.sidebar.toast.renameFailed': '에이전트 이름을 변경하지 못했습니다',
'settings.agents.sidebar.toast.agentRenamed': '에이전트 이름이 "{name}"(으)로 변경되었습니다',
'settings.agents.page.toast.permissionNameRequired': '권한 이름은 필수입니다',
'settings.agents.page.toast.created': '에이전트를 생성했습니다',
'settings.agents.page.toast.updated': '에이전트를 업데이트했습니다',
'settings.agents.page.toast.createFailed': '에이전트를 생성하지 못했습니다',
'settings.agents.page.toast.updateFailed': '에이전트를 업데이트하지 못했습니다',
'settings.agents.page.toast.saveUnexpectedError': '저장 중 오류가 발생했습니다',
'settings.agents.page.toast.savedManualRestart': '디스크에 저장되었습니다. 변경 사항을 적용하려면 연결된 OpenCode 서버를 다시 시작하세요.',
'settings.agents.page.empty.title': '사이드바에서 에이전트를 선택하세요',
'settings.agents.page.empty.description': '또는 새로 생성하세요',
'settings.agents.page.title.new': '새 에이전트',
@@ -387,6 +450,10 @@ export const settingsDict = {
'settings.agents.page.field.mode': '모드',
'settings.agents.page.field.modeTooltip': '주 에이전트/보조 에이전트로 표시할지 선택합니다',
'settings.agents.page.field.overrideModel': '모델 오버라이드',
'settings.agents.page.field.variant': '사고 변형',
'settings.agents.page.field.variantTooltip': '선택 사항. 모델이 추론을 지원하는 경우, 변형은 추론 깊이를 제어합니다.',
'settings.agents.page.field.variantHint': '모델별 (예: Anthropic variant)',
'settings.agents.page.field.variantPlaceholder': '예: high, max, low, none',
'settings.agents.page.field.temperature': '온도',
'settings.agents.page.field.temperatureTooltip': '무작위성을 제어합니다. 높을수록 창의적이고 낮을수록 집중적입니다.',
'settings.agents.page.field.temperatureRange': '0.0 ~ 2.0',
@@ -500,6 +567,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.description.globalReadOnly': '시스템 전체 Git 자격 증명(읽기 전용)',
'settings.gitIdentities.editor.description.newProfile': '새 Git 자격 증명 프로필을 생성하세요',
'settings.gitIdentities.editor.description.editProfile': 'Git 자격 증명 프로필 설정을 편집하세요',
'settings.gitIdentities.editor.section.commitSigning': '커밋 서명',
'settings.gitIdentities.editor.field.profileName': '프로필 이름',
'settings.gitIdentities.editor.field.profileNamePlaceholder': 'Work Profile, Personal 등',
'settings.gitIdentities.editor.field.color': '색상',
@@ -515,6 +583,9 @@ export const settingsDict = {
'settings.gitIdentities.editor.field.sshKeyPath': 'SSH 키 경로',
'settings.gitIdentities.editor.field.sshKeyPathTooltip': '개인 키의 선택적 경로입니다. 예: ~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.sshKeyPathPlaceholder': '~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.signCommits': '이 ID로 커밋 서명',
'settings.gitIdentities.editor.field.signingKey': '서명 키',
'settings.gitIdentities.editor.field.signingKeyPlaceholder': '~/.ssh/id_ed25519.pub',
'settings.gitIdentities.editor.field.host': 'Host',
'settings.gitIdentities.editor.field.hostTooltip': '이 host의 토큰은 ~/.git-credentials에서 읽습니다.',
'settings.gitIdentities.editor.field.hostPlaceholder': 'github.com',
@@ -523,6 +594,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.actions.save': '저장',
'settings.gitIdentities.editor.toast.userNameEmailRequired': '사용자 이름과 이메일은 필수입니다',
'settings.gitIdentities.editor.toast.hostRequiredForToken': '토큰 기반 인증에는 host가 필요합니다',
'settings.gitIdentities.editor.toast.signingKeyRequired': '커밋 서명이 활성화되면 서명 키가 필요합니다',
'settings.gitIdentities.editor.toast.profileCreated': '프로필이 생성되었습니다',
'settings.gitIdentities.editor.toast.profileUpdated': '프로필이 업데이트되었습니다',
'settings.gitIdentities.editor.toast.createProfileFailed': '프로필을 생성하지 못했습니다',
@@ -772,7 +844,13 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.title': 'Desktop 네트워크 접속',
'settings.openchamber.desktopNetwork.field.launchAtLoginAria': '로그인 시 OpenChamber 시작',
'settings.openchamber.desktopNetwork.field.launchAtLogin': '로그인 시 OpenChamber 시작',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': '창을 열지 않고 백그라운드에서 앱을 시작합니다. Dock 아이콘을 클릭하면 열립니다.',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': '창을 열지 않고 백그라운드에서 앱을 시작합니다. 데스크톱 상태 아이콘으로 열 수 있습니다.',
'settings.openchamber.desktopNetwork.field.minimizeToTrayAria': 'OpenChamber를 시스템 트레이로 최소화하거나 닫기',
'settings.openchamber.desktopNetwork.field.minimizeToTray': '시스템 트레이로 최소화하고 닫기',
'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription': '메인 창을 최소화하거나 닫아도 OpenChamber가 Windows 시스템 트레이에서 계속 실행됩니다.',
'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'OpenChamber가 실행되는 동안 컴퓨터 절전 방지',
'settings.openchamber.desktopNetwork.field.keepAwake': 'OpenChamber가 실행되는 동안 컴퓨터 절전 방지',
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': '휴대폰이 이 앱을 계속 열 수 있도록 합니다. 디스플레이는 꺼질 수 있습니다.',
'settings.openchamber.desktopNetwork.field.allowLanAccessAria': 'desktop sidecar에 LAN 접속 허용',
'settings.openchamber.desktopNetwork.field.allowLanAccess': '로컬 네트워크의 다른 기기에서 이 앱 열기 허용',
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': '휴대폰, 태블릿, Wi-Fi의 다른 컴퓨터에서 열 수 있도록 앱을 다시 시작합니다.',
@@ -789,6 +867,10 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.error.savedRestartFailed': '저장했지만 앱을 다시 시작하지 못했습니다',
'settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported': '이 시스템에서는 로그인 시 시작을 지원하지 않습니다',
'settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed': '로그인 시 시작 설정을 업데이트하지 못했습니다',
'settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported': '이 시스템에서는 시스템 트레이 백그라운드 모드를 지원하지 않습니다',
'settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed': '시스템 트레이 설정을 업데이트하지 못했습니다',
'settings.openchamber.desktopNetwork.error.keepAwakeUnsupported': '이 시스템에서는 절전 방지를 지원하지 않습니다',
'settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed': '절전 방지 설정을 업데이트하지 못했습니다',
'settings.openchamber.opencodeCli.title': 'OpenCode CLI',
'settings.openchamber.opencodeCli.tooltipPrefix': '선택적 절대 경로:',
'settings.openchamber.opencodeCli.tooltipSuffix': 'binary.',
@@ -917,6 +999,7 @@ export const settingsDict = {
'settings.openchamber.keyboardShortcuts.action.cycle_agent.label': '에이전트 순환',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label': '즐겨찾기 모델 앞으로 순환',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label': '즐겨찾기 모델 뒤로 순환',
'settings.openchamber.keyboardShortcuts.action.open_model_selector.label': '모델 선택기 열기',
'settings.openchamber.keyboardShortcuts.action.expand_input.label': '입력 확장',
'settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label': '대화 타임라인 열기',
'settings.projects.sidebar.total': '총 {count}개',
@@ -926,6 +1009,8 @@ export const settingsDict = {
'settings.projects.page.section.worktree': 'Worktree',
'settings.projects.page.field.projectName': '프로젝트 이름',
'settings.projects.page.field.projectNamePlaceholder': '프로젝트 이름',
'settings.projects.page.field.defaultModel': '새 채팅의 기본 모델',
'settings.projects.page.field.defaultModelDescription': '이 프로젝트에서 새 채팅을 시작할 때 사용됩니다. 설정하지 않으면 전역 기본값으로 대체됩니다.',
'settings.projects.page.field.accentColor': '강조 색상',
'settings.projects.page.field.projectIcon': '프로젝트 아이콘',
'settings.projects.page.field.projectIconBackgroundAria': '프로젝트 아이콘 배경색',
@@ -947,6 +1032,7 @@ export const settingsDict = {
'settings.projects.page.toast.discoverIconFailed': '프로젝트 아이콘을 찾지 못했습니다',
'settings.projects.page.toast.customIconAlreadySet': '이 프로젝트에는 이미 사용자 정의 아이콘이 설정되어 있습니다',
'settings.projects.page.toast.iconDiscovered': '프로젝트 아이콘을 찾았습니다',
'settings.projects.page.toast.saveFailed': '프로젝트 설정 저장에 실패했습니다',
'settings.usage.sidebar.title': '사용량',
'settings.usage.sidebar.total': '총 {count}개',
'settings.usage.sidebar.actions.toggleAutoRefreshAria': '자동 새로고침 토글',
@@ -1082,6 +1168,9 @@ export const settingsDict = {
'settings.openchamber.worktrees.setup.commandPlaceholder': '예: bun install',
'settings.openchamber.worktrees.setup.removeCommandAria': '명령어 제거',
'settings.openchamber.worktrees.setup.addCommand': '명령어 추가',
'settings.openchamber.worktrees.setup.waitForCommands': '세션을 만들거나 보내기 전에 설정 명령이 끝날 때까지 기다리기',
'settings.openchamber.worktrees.setup.waitForCommandsAria': '세션을 만들거나 보내기 전에 Worktree 설정 명령이 끝날 때까지 기다리기',
'settings.openchamber.worktrees.setup.toast.saveFailed': 'Worktree 설정 명령 저장에 실패했습니다',
'settings.openchamber.worktrees.list.title': '기존 worktree',
'settings.openchamber.worktrees.list.tooltip': 'Worktree는 repo 외부에 있습니다(OpenCode 관리). worktree를 삭제하면 연결된 세션도 제거됩니다.',
'settings.openchamber.worktrees.list.loading': 'worktree 로딩 중...',
@@ -1338,6 +1427,11 @@ export const settingsDict = {
'settings.openchamber.defaults.field.thinkingPlaceholder': 'Thinking',
'settings.openchamber.defaults.field.defaultAgent': '기본 에이전트',
'settings.openchamber.defaults.field.showDeletionDialogAria': '삭제 확인 대화상자 표시',
'settings.openchamber.defaults.smallModel.title': '소형 모델',
'settings.openchamber.defaults.smallModel.description': '짧은 요약 등 가벼운 유틸리티 작업을 위한 저렴한 모델입니다.',
'settings.openchamber.defaults.smallModel.useDefault': '기본 소형 모델 사용',
'settings.openchamber.defaults.smallModel.useDefaultAria': '기본 소형 모델 사용',
'settings.openchamber.defaults.smallModel.overrideModel': '재정의 모델',
'settings.openchamber.defaults.field.showDeletionDialog': '삭제 확인 대화상자 표시',
'settings.openchamber.defaults.field.openFilesPreviewAria': '파일을 미리보기 모드로 열기',
'settings.openchamber.defaults.field.openFilesPreview': '파일을 미리보기 모드로 열기',
@@ -1460,16 +1554,33 @@ export const settingsDict = {
'settings.notifications.page.toast.backgroundDisabled': '백그라운드 알림이 비활성화되었습니다',
'settings.notifications.page.testNotification.title': '테스트 알림',
'settings.notifications.page.testNotification.body': 'OpenChamber의 테스트 알림입니다.',
'settings.voice.page.section.voiceSetup': '음성',
'settings.voice.page.section.speechRecognition': '음성 인식',
'settings.voice.page.field.enableVoiceInput': '음성 입력 사용',
'settings.voice.page.field.enableVoiceInputAria': '음성 입력(받아쓰기) 사용',
'settings.voice.page.section.playbackAndSummary': '재생',
'settings.voice.page.field.enableVoiceModeAria': '음성 모드 활성화',
'settings.voice.page.field.enableVoiceMode': '음성 모드 활성화',
'settings.voice.page.field.provider': '프로바이더',
'settings.voice.page.provider.browser': '브라우저',
'settings.voice.page.provider.custom': '사용자 정의',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': '서버',
'settings.voice.page.provider.local': '로컬',
'settings.voice.page.tooltip.sttLocal': 'OpenChamber 서버에서 로컬로 변환합니다. 모델은 자동으로 다운로드되며 API 키가 필요 없습니다.',
'settings.voice.page.tooltip.localTts': 'OpenChamber 서버에서 로컬로 음성을 합성합니다(Kokoro, 영어). 모델은 자동으로 다운로드되며 API 키가 필요 없습니다.',
'settings.voice.page.stt.model.parakeetV2': 'Parakeet v2 (영어)',
'settings.voice.page.stt.model.parakeetV3': 'Parakeet v3 (유럽 25개 언어)',
'settings.voice.page.stt.model.whisperBase': 'Whisper base (다국어)',
'settings.voice.page.stt.model.whisperTiny': 'Whisper tiny (다국어)',
'settings.voice.page.stt.badge.bestForEnglish': '영어에 최적',
'settings.voice.page.stt.badge.bestForMultilingual': '다국어에 최적',
'settings.voice.page.stt.meta.accuracy': '정확도',
'settings.voice.page.stt.meta.speed': '속도',
'settings.voice.page.stt.modelInstalled': '모델 설치됨',
'settings.voice.page.stt.modelDownloading': '모델 다운로드 중...',
'settings.voice.page.stt.modelDownloadingProgress': '모델 다운로드 중... {percent}%',
'settings.voice.page.stt.modelNotInstalled': '모델이 다운로드되지 않음',
'settings.voice.page.stt.modelDownload': '다운로드',
'settings.voice.page.stt.modelDelete': '모델 삭제',
'settings.voice.page.stt.modelRetry': '다시 시도',
'settings.voice.page.provider.wasm': '로컬',
'settings.voice.page.stt.wasmModel': 'Whisper 모델',
'settings.voice.page.stt.wasmLoaded': '모델 로드됨',
@@ -1526,6 +1637,7 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputMode': 'TTS 입력 모드',
'settings.voice.page.field.ttsInputModeSanitized': '정제된 텍스트',
'settings.voice.page.field.ttsInputModeRaw': '원본 Markdown',
'settings.voice.page.field.ttsInputModeSummarized': '요약',
'settings.openchamber.visual.section.colorMode': '색상 모드',
'settings.openchamber.visual.section.mobileLayout': '모바일 레이아웃',
'settings.openchamber.visual.option.mobileLayout.default': '이전',
@@ -1558,6 +1670,8 @@ export const settingsDict = {
'settings.openchamber.visual.actions.reloadThemes': '테마 다시 로드',
'settings.openchamber.visual.field.macVibrancy': '창 투명도',
'settings.openchamber.visual.field.macVibrancyHint': '사이드바 뒤에 macOS 기본 블러(vibrancy)를 사용합니다. 완전히 불투명한 표면을 원하면 끄세요.',
'settings.openchamber.visual.field.dockBadge': 'Dock 배지',
'settings.openchamber.visual.field.dockBadgeHint': '확인하지 않은 활동이 있는 채팅 수를 macOS Dock 아이콘에 표시합니다.',
'settings.openchamber.visual.actions.saveAndRestart': '저장 후 재시작',
'settings.openchamber.visual.actions.restarting': '재시작 중…',
'settings.openchamber.visual.actions.reloadingThemes': '테마 다시 로드 중...',
@@ -1584,10 +1698,12 @@ export const settingsDict = {
'settings.openchamber.visual.field.fontSizePercentageAria': '폰트 크기 비율',
'settings.openchamber.visual.actions.resetFontSizeAria': '폰트 크기 초기화',
'settings.openchamber.visual.field.terminalFontSize': '터미널 폰트 크기',
'settings.openchamber.visual.field.editorFontSize': '에디터 폰트 크기',
'settings.openchamber.visual.field.codeFont': '코드 폰트',
'settings.openchamber.visual.field.selectCodeFontAria': '코드 폰트 선택',
'settings.openchamber.visual.actions.resetCodeFontAria': '코드 폰트 초기화',
'settings.openchamber.visual.actions.resetTerminalFontSizeAria': '터미널 폰트 크기 초기화',
'settings.openchamber.visual.actions.resetEditorFontSizeAria': '에디터 폰트 크기 초기화',
'settings.openchamber.visual.field.spacingDensity': '간격 밀도',
'settings.openchamber.visual.actions.resetSpacingAria': '간격 초기화',
'settings.openchamber.visual.field.inputBarOffset': '입력 바 오프셋',
@@ -1607,6 +1723,16 @@ export const settingsDict = {
'settings.openchamber.visual.field.userMessageRenderingAria': '사용자 메시지 렌더링: {option}',
'settings.openchamber.visual.field.mermaidRenderingAria': 'Mermaid 렌더링: {option}',
'settings.openchamber.visual.field.diffLayoutAria': 'Diff 레이아웃: {option}',
'settings.openchamber.visual.field.sessionRecap': '세션 요약 생성',
'settings.openchamber.visual.field.sessionRecapAria': '에이전트가 완료되면 요약을 생성합니다',
'settings.openchamber.visual.field.sessionSuggestion': '다음 사용자 메시지 제안 생성',
'settings.openchamber.visual.field.sessionSuggestionAria': '에이전트가 완료되면 다음 사용자 메시지 제안을 생성합니다',
'settings.openchamber.visual.field.sessionGoal': '세션 목표 사용',
'settings.openchamber.visual.field.sessionGoalAria': '세션이 목표를 향해 자동으로 계속 작업하도록 합니다',
'settings.openchamber.visual.goal.sectionTitle': '목표',
'settings.openchamber.visual.goal.budgetLabel': '기본 토큰 예산',
'settings.openchamber.visual.goal.budgetAria': '새 목표에 기본 토큰 예산 적용',
'settings.openchamber.visual.goal.description': '컴포저의 타깃 버튼을 켜면 다음 메시지가 목표가 됩니다. 에이전트는 소형 모델의 감사를 받으며 자리를 비운 동안에도 자동으로 계속 작업합니다.',
'settings.openchamber.visual.field.showReasoningTracesAria': 'Reasoning trace 표시',
'settings.openchamber.visual.field.showReasoningTraces': 'Reasoning Trace 표시',
'settings.openchamber.visual.field.collapsibleThinkingBlocksAria': '접을 수 있는 추론 블록 활성화',
@@ -1623,6 +1749,8 @@ export const settingsDict = {
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '인라인 어시스턴트 작업',
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '같은 응답에서 이후 도구 호출 앞에 나타나는 어시스턴트 텍스트 블록에 답변 복사, 이미지로 저장, 소리 내어 읽기 작업을 표시합니다.',
'settings.openchamber.visual.field.showToolFileIconsAria': '도구 파일 아이콘 표시',
'settings.openchamber.visual.field.codeBlockLineWrapAria': '코드 블록 줄 바꿈',
'settings.openchamber.visual.field.codeBlockLineWrap': '코드 블록 줄 바꿈',
'settings.openchamber.visual.field.showToolFileIcons': '도구 파일 아이콘 표시',
'settings.openchamber.visual.field.showTurnChangedFilesAria': '완료된 턴의 변경 파일 표시',
'settings.openchamber.visual.field.showTurnChangedFiles': '완료된 턴의 변경 파일 표시',
@@ -1784,4 +1912,10 @@ export const settingsDict = {
'settings.promptTemplates.page.toast.created': '템플릿이 생성되었습니다',
'settings.promptTemplates.page.toast.createFailed': '템플릿 생성 실패',
'settings.promptTemplates.page.toast.saveUnexpectedError': '저장 중 예기치 않은 오류가 발생했습니다',
'settings.openchamber.visual.section.followUpBehavior': 'Follow-up behavior',
'settings.openchamber.visual.section.followUpBehaviorAria': 'Follow-up behavior',
'settings.openchamber.visual.field.followUpBehaviorAria': 'Follow-up behavior: {option}',
'settings.openchamber.visual.field.followUpBehaviorDescription': 'Choose what happens when you press Enter on a follow-up message while the agent is still responding.',
'settings.openchamber.visual.option.followUpBehavior.steer.label': 'Steer',
'settings.openchamber.visual.option.followUpBehavior.queue.label': 'Queue',
} as const;
+149 -1
View File
@@ -14,6 +14,7 @@ export const dict: Record<I18nKey, string> = {
'common.language.brazilianPortuguese': '브라질 포르투갈어',
'common.language.korean': '한국어',
'common.language.polish': '폴란드어',
'common.language.japanese': '일본어',
'common.revealPath.finder': 'Finder에서 보기',
'common.revealPath.fileExplorer': 'File Explorer에서 열기',
'common.revealPath.fileManager': '파일 관리자에서 열기',
@@ -22,6 +23,13 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': '닫기',
'pwa.installPrompt.started': '설치가 시작되었습니다',
'pwa.installPrompt.installed': 'OpenChamber가 설치되었습니다',
'shareOpinion.actions.shareOpinion': '의견 공유',
'shareOpinion.actions.bookCall': '통화 예약',
'shareOpinion.actions.shortSurvey': '짧은 설문',
'shareOpinion.dialog.title': '의견을 공유해 주세요',
'shareOpinion.toast.title': 'OpenChamber의 방향을 함께 만들어 주세요',
'shareOpinion.toast.description': '유용한 점, 혼란스러운 점, 부족한 점을 알려 주셔서 다음 방향을 함께 만들어 주세요.',
'sessions.sidebar.footer.actions.shareOpinion': '의견 공유',
'layout.mainTab.chat': '채팅',
'layout.mainTab.plan': '계획',
'layout.mainTab.diff': '변경사항',
@@ -30,6 +38,50 @@ export const dict: Record<I18nKey, string> = {
'layout.mainTab.terminal': '터미널',
'layout.mainTab.context': '컨텍스트',
'mobile.nav.aria': '모바일 내비게이션',
'mobile.connect.welcome.title': 'OpenChamber에 연결',
'mobile.connect.welcome.description': '서버 URL을 추가하거나 페어링 QR 코드를 스캔하여 모바일 앱을 시작하세요.',
'mobile.connect.url.label': '서버 URL',
'mobile.connect.url.placeholder': 'http://192.168.1.74:2606',
'mobile.connect.token.label': '클라이언트 토큰',
'mobile.connect.token.placeholder': '액세스 토큰 붙여넣기',
'mobile.connect.token.hint': '서버가 비밀번호 대신 토큰을 요구하는 경우에만 필요합니다.',
'mobile.connect.password.label': '비밀번호',
'mobile.connect.password.placeholder': 'OpenChamber 비밀번호',
'mobile.connect.connectButton': '연결',
'mobile.connect.unlockButton': '잠금 해제 후 연결',
'mobile.connect.cancelPassword': '다른 서버 사용',
'mobile.connect.connecting': '연결 중...',
'mobile.connect.scanQr': 'QR 코드 스캔',
'mobile.connect.welcome.scanHint': '컴퓨터에서 「기기 추가」를 열어 QR 코드를 표시한 뒤 여기에서 스캔하세요.',
'mobile.connect.advanced': '고급',
'mobile.connect.manual.toggle': '주소로 연결',
'mobile.connect.scan.permissionDenied': '카메라 접근이 꺼져 있습니다. QR 코드를 스캔하려면 설정에서 사용 설정하세요.',
'mobile.connect.scan.failed': 'QR 코드를 스캔하지 못했습니다. 다시 시도하거나 URL을 직접 입력하세요.',
'mobile.connect.scan.invalid': '이 QR 코드는 OpenChamber 연결 코드가 아닙니다.',
'mobile.connect.scan.unsupported': 'QR 스캔은 설치된 모바일 앱에서만 사용할 수 있습니다.',
'mobile.connect.saved.title': '저장된 연결',
'mobile.connect.saved.empty': '아직 저장된 연결이 없습니다.',
'mobile.connect.relay.badge': 'OpenChamber Relay 경유',
'mobile.connect.error.urlRequired': '서버 URL을 입력하세요.',
'mobile.connect.error.invalidUrl': '유효하지 않은 서버 URL입니다.',
'mobile.connect.error.unreachable': '해당 OpenChamber 서버에 연결할 수 없습니다.',
'mobile.connect.error.authRequired': '이 서버에는 비밀번호 또는 클라이언트 토큰이 필요합니다.',
'mobile.connect.error.passwordFailed': '서버 잠금을 해제할 수 없습니다. 비밀번호를 확인하세요.',
'mobile.instances.addTitle': '인스턴스 추가',
'mobile.instances.addManual': '주소로 추가',
'mobile.instances.editTitle': '인스턴스 편집',
'mobile.instances.edit': '편집',
'mobile.instances.delete': '삭제',
'mobile.instances.deleteAria': '{label} 삭제',
'mobile.instances.confirmDeleteAria': '{label} 삭제 확인',
'mobile.instances.cancelDeleteAria': '{label} 유지',
'mobile.instances.cancelEdit': '취소',
'mobile.instances.label.label': '이름',
'mobile.instances.label.placeholder': '표시 이름 (선택 사항)',
'mobile.instances.saveNew': '인스턴스 저장',
'mobile.instances.status.connectedDirect': '연결됨 · 로컬 네트워크',
'mobile.instances.status.connectedRelay': '연결됨 · 비공개 릴레이',
'mobile.instances.saveEdit': '변경 사항 저장',
'mobile.nav.changes': '변경사항',
'mobile.nav.settings': '설정',
'mobile.surface.closeAria': '닫기',
@@ -42,6 +94,7 @@ export const dict: Record<I18nKey, string> = {
'mobile.menu.files': '파일',
'mobile.menu.changes': '변경사항',
'mobile.menu.mcp': 'MCP',
'mobile.menu.instances': '인스턴스',
'mobile.menu.update': '업데이트',
'mobile.menu.settings': '설정',
'mobile.sessions.newChatCta': '{project}에서 새 채팅',
@@ -240,6 +293,10 @@ export const dict: Record<I18nKey, string> = {
'sessions.scheduledTasks.editor.prompt.placeholder': '열린 작업을 요약하고 다음 액션을 제안하세요',
'sessions.scheduledTasks.editor.enabled.aria': '작업 활성화',
'sessions.scheduledTasks.editor.enabled.label': '활성화됨',
'sessions.scheduledTasks.editor.goal.label': '목표로 실행',
'sessions.scheduledTasks.editor.goal.aria': '이 작업을 에이전트가 완료까지 추진하는 목표로 실행합니다',
'sessions.scheduledTasks.editor.goal.budgetLabel': '토큰 예산',
'sessions.scheduledTasks.editor.goal.budgetAria': '목표를 토큰 예산으로 제한합니다',
'sessions.scheduledTasks.editor.actions.closeAria': '닫기',
'sessions.scheduledTasks.editor.actions.cancel': '취소',
'sessions.scheduledTasks.editor.actions.save': '저장',
@@ -330,6 +387,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.actions.searchSessions': '세션 검색',
'sessions.sidebar.header.actions.exitSelection': '선택 종료',
'sessions.sidebar.header.actions.selectSessions': '세션 선택',
'sessions.sidebar.header.actions.sortProjects': '프로젝트 정렬',
'sessions.sidebar.header.actions.sessionDisplayMode': '세션 표시 모드',
'sessions.sidebar.header.displayMode.label': '표시 모드',
'sessions.sidebar.header.displayMode.default': '기본값',
@@ -338,6 +396,11 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.displayMode.showArchived': '보관된 세션 표시',
'sessions.sidebar.header.displayMode.collapseAll': '모두 접기',
'sessions.sidebar.header.displayMode.expandAll': '모두 펼치기',
'sessions.sidebar.header.projectSort.manual': '수동',
'sessions.sidebar.header.projectSort.aToZ': 'A → Z',
'sessions.sidebar.header.projectSort.zToA': 'Z → A',
'sessions.sidebar.header.projectSort.dateAdded': '최신순',
'sessions.sidebar.header.projectSort.recent': '최근',
'sessions.sidebar.header.search.matchCountSingle': '{count}개 일치',
'sessions.sidebar.header.search.matchCountPlural': '{count}개 일치',
'sessions.sidebar.header.search.escapeHint': 'Esc로 지우기',
@@ -382,6 +445,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.project.actions.projectMenu': '프로젝트 메뉴',
'sessions.sidebar.project.actions.newSession': '새 세션',
'sessions.sidebar.project.actions.closeProject': '프로젝트 닫기',
'sessions.sidebar.project.actions.edit': '편집',
'sessions.sidebar.project.actions.newDraftSession': '새 드래프트 세션',
'sessions.sidebar.session.menu.rename': '이름 변경',
'sessions.sidebar.session.rename.save': '세션 이름 저장',
@@ -1210,6 +1274,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.state.loadingRepositoryStatus': '레포지토리 상태 로드 중…',
'diffView.state.notGitRepository': 'Git 레포지토리가 아닙니다. Git 탭에서 초기화하거나 디렉터리를 변경하세요.',
'diffView.state.cleanWorkingTree': '워킹 트리가 깨끗합니다. 표시할 변경 사항이 없습니다.',
'diffView.state.noLastTurnChanges': '표시할 마지막 턴 변경 사항이 없습니다.',
'diffView.state.failedToLoadDiff': '변경사항을 불러오지 못했습니다',
'diffView.state.loadingDiff': '변경사항 불러오는 중…',
'diffView.state.loadingChanges': '변경 사항 로드 중…',
@@ -1219,6 +1284,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.summary.changedFilesPlural': '파일 {count}개 변경됨',
"diffView.scope.changed": "Changed",
"diffView.scope.staged": "Staged",
"diffView.scope.lastTurn": "마지막 턴",
"diffView.scope.selectorAria": "변경 모드 선택",
'diffView.actions.retry': '다시 시도',
'diffView.actions.renderAnyway': '그래도 렌더링',
@@ -1235,12 +1301,20 @@ export const dict: Record<I18nKey, string> = {
'diffView.reviewDialog.title': '변경 사항 리뷰',
'diffView.reviewDialog.description': '현재 변경 사항을 위한 별도 리뷰 세션을 시작합니다.',
'diffView.reviewDialog.generateHandoff': '핸드오프 생성',
'diffView.reviewDialog.autoReview': '자동 리뷰 루프 실행',
'diffView.reviewDialog.info': '이 흐름은 변경 사항을 구현한 세션에서 시작할 때 가장 잘 작동합니다.',
'diffView.reviewDialog.actions.cancel': '취소',
'diffView.reviewDialog.actions.start': '리뷰',
'diffView.reviewDialog.actions.starting': '시작 중...',
'diffView.reviewDialog.toast.noSessionDirectory': '세션 디렉터리를 사용할 수 없습니다',
'diffView.reviewDialog.toast.startFailed': '리뷰 흐름을 시작하지 못했습니다',
'chat.history.loadOlder': '이전 메시지 불러오기',
'chat.autoReview.title': '코드 리뷰 루프 실행 중',
'chat.autoReview.status.waitingForReviewer': '리뷰어를 기다리는 중',
'chat.autoReview.status.waitingForImplementer': '구현 에이전트를 기다리는 중',
'chat.autoReview.reviewSessionLabel': '리뷰 세션',
'chat.autoReview.actions.open': '열기',
'chat.autoReview.actions.stop': '중지',
'diffView.hunk.label': '허크',
'diffView.hunk.stage': '스테이지',
'diffView.hunk.unstage': '스테이지 해제',
@@ -1341,6 +1415,43 @@ export const dict: Record<I18nKey, string> = {
"header.actions.toggleChangesPanelAria": "변경 패널 전환",
'header.actions.planWithShortcut': '플랜 ({shortcut})',
'header.actions.terminalPanelWithShortcut': '터미널 패널 ({shortcut})',
'chat.recap.aria': '세션 요약',
'chat.recap.label': '요약:',
'chat.goal.dialog.titleCreate': '세션 목표 설정',
'chat.goal.dialog.titleManage': '세션 목표',
'chat.goal.dialog.objectiveLabel': '목표',
'chat.goal.dialog.objectivePlaceholder': '에이전트가 도달하고 검증해야 할 최종 상태를 설명하세요…',
'chat.goal.dialog.budgetLabel': '토큰 예산',
'chat.goal.status.active': '진행 중',
'chat.goal.status.evaluating': '평가 중…',
'chat.goal.status.paused': '일시 중지됨',
'chat.goal.status.blocked': '차단됨',
'chat.goal.status.budgetLimited': '예산 도달',
'chat.goal.status.complete': '완료됨',
'chat.goal.usage.tokens': '{used} 토큰',
'chat.goal.usage.tokensWithBudget': '{used}/{budget} 토큰',
'chat.goal.usage.turns': '{turns}회 계속',
'chat.goal.action.pause': '일시 중지',
'chat.goal.action.resume': '재개',
'chat.goal.action.markComplete': '완료로 표시',
'chat.goal.action.clear': '목표 제거',
'chat.goal.action.cancel': '취소',
'chat.goal.action.save': '목표 저장',
'chat.goal.action.start': '목표 시작',
'chat.goal.toast.actionFailed': '목표 업데이트에 실패했습니다',
'chat.goal.row.aria': '세션 목표 — 세부 정보 열기',
'chat.goal.button.createAria': '세션 목표 설정',
'chat.goal.button.manageAria': '세션 목표 관리',
'chat.goal.button.armAria': '다음 메시지로 목표 시작',
'chat.goal.counter.aria': '목표 길이 제한',
'chat.goal.button.disarmAria': '목표 대기 중 — 탭하여 해제',
'chat.goal.button.cancelAria': '목표 진행 중 — 탭하여 취소',
'chat.goal.cancelDialog.title': '이 목표를 취소할까요?',
'chat.goal.cancelDialog.description': '에이전트가 이 목표를 향한 자동 작업을 중단합니다.',
'chat.goal.cancelDialog.keep': '목표 유지',
'chat.goal.cancelDialog.confirm': '목표 취소',
'chat.suggestion.applyAria': '제안된 메시지 사용',
'chat.suggestion.dismissAria': '제안 닫기',
'header.actions.toggleTerminalPanelAria': '토글 터미널 패널',
'terminalView.stream.processExitedMessage': '\r\n[Process exited{exitCodeSegment}{signalSegment}]\r\n',
'terminalView.stream.processExitedWithCode': ', 종료 코드 {exitCode}',
@@ -1722,6 +1833,7 @@ export const dict: Record<I18nKey, string> = {
'chat.queuedMessage.edit': 'edit',
'chat.queuedMessage.send': 'send',
'chat.queuedMessage.removeAria': '큐에서 제거',
'chat.queuedMessage.reorderAria': '드래그하여 순서 변경',
'chat.container.returnToParent.aria': '상위 세션으로 돌아가기',
'chat.container.returnToParent.titleNamed': '돌아가기: {title}',
'chat.container.returnToParent.title': '상위 세션으로 돌아가기',
@@ -1824,6 +1936,18 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.placeholder.chat': '@ 파일/에이전트; / 명령 및 스킬; ! shell; # 스니펫',
'chat.chatInput.placeholder.chatCompact': '@ / ! # 도우미 사용',
'chat.chatInput.placeholder.selectSession': '채팅을 시작할 세션을 선택하거나 새로 만드세요',
'chat.dictation.start': '받아쓰기 시작',
'chat.dictation.overlayAria': '받아쓰기',
'chat.dictation.downloadingModel': '음성 모델 다운로드 중...',
'chat.dictation.downloadingModelProgress': '음성 모델 다운로드 중... {percent}%',
'chat.dictation.listening': '듣는 중...',
'chat.dictation.processing': '변환 중...',
'chat.dictation.failed': '변환에 실패했습니다',
'chat.dictation.cancel': '받아쓰기 취소',
'chat.dictation.insert': '텍스트 삽입',
'chat.dictation.insertAndSend': '삽입 후 전송',
'chat.dictation.retry': '변환 다시 시도',
'chat.dictation.discard': '녹음 삭제',
'chat.snippetAutocomplete.action.addNew': '+ 새 스니펫 추가',
'chat.snippetAutocomplete.empty': '스니펫을 찾을 수 없음',
'chat.snippetAutocomplete.footer': '↑↓ 이동 • Enter 선택 • Esc 닫기',
@@ -1859,6 +1983,9 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.previewContextRemove': '미리보기 컨텍스트 제거',
'chat.chatInput.projectRoot': '프로젝트 루트',
'chat.chatInput.branch': '브랜치',
'chat.chatInput.draftPicker.projectTitle': '프로젝트',
'chat.chatInput.draftPicker.searchProjects': '프로젝트 검색...',
'chat.chatInput.draftPicker.searchBranches': '브랜치 검색...',
'chat.chatInput.worktrees': '워크트리',
'chat.chatInput.worktreeNew': '+ 새로 만들기',
'chat.chatInput.drop.insertMention': '여기에 놓아 멘션으로 추가',
@@ -1884,6 +2011,11 @@ export const dict: Record<I18nKey, string> = {
'chat.toolOutputDialog.image.closeAria': '이미지 미리보기 닫기',
'chat.toolOutputDialog.mermaid.missingSource': 'Mermaid 소스 URL이 없습니다.',
'chat.toolOutputDialog.mermaid.loadFailed': 'Mermaid 다이어그램을 불러올 수 없습니다',
'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'Mermaid 데이터 URL 형식이 올바르지 않습니다.',
'chat.toolOutputDialog.mermaid.invalidLocalPath': 'Mermaid 로컬 파일 경로가 올바르지 않습니다.',
'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': 'Mermaid 파일을 읽을 수 없습니다. 상태: {status}.',
'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': 'Mermaid URL 프로토콜은 지원되지 않습니다.',
'chat.toolOutputDialog.mermaid.loadFailedWithStatus': 'Mermaid 다이어그램을 불러올 수 없습니다. 상태: {status}.',
'chat.toolOutputDialog.mermaid.closeAria': '다이어그램 미리보기 닫기',
'chat.toolOutputDialog.mermaid.loading': '다이어그램 로드 중…',
'chat.toolOutputDialog.mermaid.renderFailed': 'Mermaid 다이어그램을 렌더링할 수 없습니다.',
@@ -1898,6 +2030,9 @@ export const dict: Record<I18nKey, string> = {
'chat.toolPart.output': '출력',
'chat.toolPart.showRawJson': '원시 JSON 표시',
'chat.toolPart.showFormattedJson': '형식화된 JSON 표시',
'chat.toolPart.showNavigableJson': '탐색 가능한 JSON 표시',
'chat.toolPart.openFileAtFirstChange': '첫 번째 변경 위치에서 파일 열기',
'chat.toolPart.openFileDiff': '파일 diff 열기',
'chat.toolPart.copyOutput': '출력 복사',
'chat.toolPart.copiedOutput': '출력 복사됨',
'chat.toolPart.copyOutputFailed': '출력을 복사하지 못했습니다',
@@ -1991,6 +2126,7 @@ export const dict: Record<I18nKey, string> = {
'chat.modelControls.noProvidersOrModelsFound': '검색과 일치하는 프로바이더 또는 모델이 없습니다.',
'chat.modelControls.reorderFavoriteAria': '즐겨찾기 순서 변경',
'chat.modelControls.reorderFavoriteTitle': '드래그하여 즐겨찾기 순서 변경',
'chat.modelControls.reorderProviderTitle': '드래그하여 공급자 순서 변경',
'chat.modelControls.permissionLabel.custom': '사용자 지정',
'chat.modelControls.permissionLabel.allow': '허용',
'chat.modelControls.permissionLabel.deny': '거부',
@@ -2231,7 +2367,7 @@ export const dict: Record<I18nKey, string> = {
'sessionAuth.error.networkTitle': '서버에 연결할 수 없습니다',
'sessionAuth.error.rateLimitDescriptionSingle': '{minutes}분 후 다시 시도하세요.',
'sessionAuth.error.rateLimitDescriptionPlural': '{minutes}분 후 다시 시도하세요.',
'sessionAuth.error.networkDescription': 'UI 세션을 확인할 수 없습니다. 서비스가 실행 중인지 확인하고 다시 시도하세요.',
'sessionAuth.error.networkDescription': 'UI 세션을 확인할 수 없습니다. 로컬 네트워크의 다른 기기에서 OpenChamber를 열고 있다면 데스크톱 앱에서 Desktop Network Access를 활성화하고 설정에 표시되는 LAN 주소를 사용하세요.',
'sessionAuth.error.retry': '다시 시도',
'sessionAuth.error.passkeySetupFailed': '패스키 설정에 실패했습니다.',
'sessionAuth.error.incorrectPassword': '비밀번호가 올바르지 않습니다. 다시 시도하세요.',
@@ -2518,9 +2654,14 @@ export const dict: Record<I18nKey, string> = {
'updateDialog.status.downloading': '다운로드 중…',
'updateDialog.actions.restartToUpdate': '업데이트를 위해 재시작',
'updateDialog.actions.updateNow': '지금 업데이트',
'updateDialog.actions.openMobileUpdate': '업데이트 열기',
'updateDialog.status.updating': '업데이트 중…',
'updateDialog.error.updateFailed': '업데이트 실패',
'updateDialog.error.takingLonger': '업데이트가 예상보다 오래 걸립니다. 잠시 기다린 뒤 새로고침하거나 `openchamber update`를 실행하세요.',
'mobileUpdate.toast.available.title': 'OpenChamber 업데이트 사용 가능',
'mobileUpdate.toast.available.description': 'Android용 버전 {version}이 준비되었습니다.',
'mobileUpdate.toast.actions.download': '다운로드',
'mobileUpdate.toast.actions.dismiss': '닫기',
'opencodeUpdate.toast.available.title': 'OpenCode 업데이트',
'opencodeUpdate.toast.available.description': '버전 {version} 사용 가능.',
'opencodeUpdate.toast.actions.update': '업데이트',
@@ -2596,12 +2737,19 @@ export const dict: Record<I18nKey, string> = {
'mainLayout.mobile.closeDrawerAria': '드로어 닫기',
'sortableTabsStrip.aria.tabs': '탭',
'openChamberLogo.aria.logo': 'OpenChamber 로고',
'markdownRenderer.code.actions.copyTitle': '코드 복사',
'markdownRenderer.code.actions.copiedTitle': '복사됨',
'markdownRenderer.table.actions.copyTitle': '표 복사',
'markdownRenderer.code.actions.enableWrapTitle': '줄 바꿈 켜기',
'markdownRenderer.code.actions.disableWrapTitle': '줄 바꿈 끄기',
'markdownRenderer.table.actions.downloadTitle': '표 다운로드',
'markdownRenderer.table.toast.downloadedAsFormat': '{format} 형식으로 다운로드됨',
'markdownRenderer.mermaid.actions.copyTitle': '복사',
'markdownRenderer.mermaid.actions.copySourceTitle': '소스 복사',
'markdownRenderer.mermaid.actions.downloadSvgTitle': 'SVG 다운로드',
'markdownRenderer.mermaid.actions.zoomInTitle': '확대',
'markdownRenderer.mermaid.actions.zoomOutTitle': '축소',
'markdownRenderer.mermaid.actions.resetViewTitle': '보기 초기화',
'markdownRenderer.mermaid.toast.downloadFailed': '다이어그램 다운로드 실패',
'common.date.today': 'Today',
'common.date.yesterday': 'Yesterday',
@@ -28,6 +28,10 @@ export const settingsDict = {
'settings.agents.page.field.overrideModel': 'Nadpisz model',
'settings.agents.page.field.scopePlaceholder': 'Zakres',
'settings.agents.page.field.systemPromptPlaceholder': 'Jesteś ekspertem w asystowaniu przy kodowaniu...',
'settings.agents.page.field.variant': 'Wariant myślenia',
'settings.agents.page.field.variantTooltip': 'Opcjonalne. Jeśli model obsługuje rozumowanie, wariant kontroluje głębokość rozumowania.',
'settings.agents.page.field.variantHint': 'Zależne od modelu (np. wariant Anthropic)',
'settings.agents.page.field.variantPlaceholder': 'np. high, max, low, none',
'settings.agents.page.field.temperature': 'Temperatura',
'settings.agents.page.field.temperatureRange': 'od 0.0 do 2.0',
'settings.agents.page.field.temperatureTooltip': 'Kontroluje losowość. Wyższa = bardziej kreatywny, niższa = bardziej skupiony.',
@@ -58,6 +62,7 @@ export const settingsDict = {
'settings.agents.page.toast.created': 'Agent został utworzony pomyślnie',
'settings.agents.page.toast.permissionNameRequired': 'Nazwa uprawnienia jest wymagana',
'settings.agents.page.toast.saveUnexpectedError': 'Wystąpił błąd podczas zapisywania',
'settings.agents.page.toast.savedManualRestart': 'Zapisano na dysku. Uruchom ponownie połączony serwer OpenCode, aby zastosować zmiany.',
'settings.agents.page.toast.updateFailed': 'Nie udało się zaktualizować agenta',
'settings.agents.page.toast.updated': 'Agent został zaktualizowany pomyślnie',
'settings.agents.sidebar.badge.system': 'system',
@@ -82,6 +87,7 @@ export const settingsDict = {
'settings.agents.sidebar.toast.definitionNotFound': 'Nie znaleziono definicji agenta. Nic nie zmieniono.',
'settings.agents.sidebar.toast.removeOldAfterRenameFailed': 'Nie udało się usunąć starego agenta po zmianie nazwy',
'settings.agents.sidebar.toast.renameFailed': 'Nie udało się zmienić nazwy agenta',
'settings.agents.sidebar.toast.agentRenamed': 'Zmieniono nazwę agenta na "{name}"',
'settings.agents.sidebar.toast.resetFailed': 'Nie udało się zresetować agenta',
'settings.agents.sidebar.total': 'Suma: {count}',
'settings.behavior.page.field.systemPromptPlaceholder': 'Jesteś pomocnym asystentem AI...\n\nUżyj tej przestrzeni, aby zdefiniować absolutne reguły zachowania AI we wszystkich sesjach i u dostawców.',
@@ -178,6 +184,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.description.editProfile': 'Edytuj ustawienia profilu tożsamości',
'settings.gitIdentities.editor.description.globalReadOnly': 'Globalna tożsamość Git (tylko do odczytu)',
'settings.gitIdentities.editor.description.newProfile': 'Utwórz nowy profil tożsamości Git',
'settings.gitIdentities.editor.section.commitSigning': 'Podpisywanie commitów',
'settings.gitIdentities.editor.field.authMethod': 'Metoda uwierzytelniania',
'settings.gitIdentities.editor.field.authToken': 'Token',
'settings.gitIdentities.editor.field.color': 'Kolor',
@@ -193,6 +200,9 @@ export const settingsDict = {
'settings.gitIdentities.editor.field.sshKeyPath': 'Ścieżka do klucza SSH',
'settings.gitIdentities.editor.field.sshKeyPathPlaceholder': '~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.sshKeyPathTooltip': 'Opcjonalna ścieżka do klucza prywatnego, np. ~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.signCommits': 'Podpisuj commity tą tożsamością',
'settings.gitIdentities.editor.field.signingKey': 'Klucz podpisu',
'settings.gitIdentities.editor.field.signingKeyPlaceholder': '~/.ssh/id_ed25519.pub',
'settings.gitIdentities.editor.field.userName': 'Nazwa użytkownika',
'settings.gitIdentities.editor.field.userNamePlaceholder': 'Jan Kowalski',
'settings.gitIdentities.editor.field.userNameTooltip': 'Nazwa, która pojawi się w wiadomościach commitów Git.',
@@ -204,6 +214,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.toast.deleteProfileFailed': 'Nie udało się usunąć profilu',
'settings.gitIdentities.editor.toast.deleteUnexpectedError': 'Wystąpił błąd podczas usuwania',
'settings.gitIdentities.editor.toast.hostRequiredForToken': 'Host jest wymagany dla uwierzytelniania opartego na tokenie',
'settings.gitIdentities.editor.toast.signingKeyRequired': 'Klucz podpisu jest wymagany, gdy włączone jest podpisywanie commitów',
'settings.gitIdentities.editor.toast.profileCreated': 'Profil utworzony',
'settings.gitIdentities.editor.toast.profileDeleted': 'Profil usunięty',
'settings.gitIdentities.editor.toast.profileUpdated': 'Profil zaktualizowany',
@@ -667,6 +678,11 @@ export const settingsDict = {
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Otwieraj pliki w trybie podglądu',
'settings.openchamber.defaults.field.showDeletionDialog': 'Pokaż dialog usuwania',
'settings.openchamber.defaults.field.showDeletionDialogAria': 'Pokaż dialog usuwania',
'settings.openchamber.defaults.smallModel.title': 'Mały model',
'settings.openchamber.defaults.smallModel.description': 'Tani model do szybkich zadań pomocniczych, takich jak krótkie podsumowania.',
'settings.openchamber.defaults.smallModel.useDefault': 'Używaj domyślnego małego modelu',
'settings.openchamber.defaults.smallModel.useDefaultAria': 'Używaj domyślnego małego modelu',
'settings.openchamber.defaults.smallModel.overrideModel': 'Model zastępczy',
'settings.openchamber.defaults.field.thinkingPlaceholder': 'Myślenie',
'settings.openchamber.defaults.option.default': 'Domyślne',
'settings.openchamber.defaults.option.defaultLowercase': 'domyślne',
@@ -676,6 +692,10 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.actions.saveAndRestart': 'Zapisz + Zrestartuj',
'settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported': 'Uruchamianie przy logowaniu nie jest obsługiwane w tym systemie',
'settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed': 'Nie udało się zaktualizować ustawienia uruchamiania przy logowaniu',
'settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported': 'Tryb działania w tle w zasobniku systemowym nie jest obsługiwany w tym systemie',
'settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed': 'Nie udało się zaktualizować ustawienia zasobnika systemowego',
'settings.openchamber.desktopNetwork.error.keepAwakeUnsupported': 'Zapobieganie uśpieniu nie jest obsługiwane w tym systemie',
'settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed': 'Nie udało się zaktualizować ustawienia utrzymywania aktywności',
'settings.openchamber.desktopNetwork.error.loadFailed': 'Nie udało się załadować ustawień pulpitu',
'settings.openchamber.desktopNetwork.error.saveFailed': 'Nie udało się zapisać ustawień pulpitu',
'settings.openchamber.desktopNetwork.error.savedRestartFailed': 'Zapisano, ale restart aplikacji nie powiódł się',
@@ -684,7 +704,13 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': 'Restartuje aplikację, aby telefony, tablety i inne komputery w Twojej sieci Wi-Fi mogły ją otworzyć.',
'settings.openchamber.desktopNetwork.field.launchAtLogin': 'Uruchamiaj OpenChamber przy logowaniu',
'settings.openchamber.desktopNetwork.field.launchAtLoginAria': 'Uruchamiaj OpenChamber przy logowaniu',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': 'Uruchamia aplikację w tle bez otwierania okna. Kliknij ikonę w Docku, aby ją otworzyć.',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': 'Uruchamia aplikację w tle bez otwierania okna. Otworzysz ją z ikony stanu na pulpicie.',
'settings.openchamber.desktopNetwork.field.minimizeToTrayAria': 'Minimalizuj i zamykaj OpenChamber do zasobnika systemowego',
'settings.openchamber.desktopNetwork.field.minimizeToTray': 'Minimalizuj i zamykaj do zasobnika systemowego',
'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription': 'Utrzymuje OpenChamber w zasobniku systemowym Windows, gdy główne okno jest zminimalizowane lub zamknięte.',
'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'Utrzymuj komputer aktywny, gdy OpenChamber jest uruchomiony',
'settings.openchamber.desktopNetwork.field.keepAwake': 'Utrzymuj komputer aktywny, gdy OpenChamber jest uruchomiony',
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': 'Aby telefony nadal mogły otwierać tę aplikację. Ekran nadal może się wyłączyć.',
'settings.openchamber.desktopNetwork.field.warning': 'Ostrzeżenie: po włączeniu aplikacja jest dostępna dla każdego w tej samej sieci lokalnej.',
'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': 'Dostęp LAN wymaga hasła UI pulpitu. Dopóki go nie ustawisz, aplikacja pulpitu uruchamia się tylko lokalnie.',
'settings.openchamber.desktopPassword.field.password': 'Hasło UI pulpitu',
@@ -704,6 +730,7 @@ export const settingsDict = {
'settings.openchamber.git.showGitignoredAria': 'Wyświetlaj pliki zignorowane przez Git',
'settings.openchamber.git.title': 'Preferencje Git',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label': 'Przełącz ulubiony model wstecz',
'settings.openchamber.keyboardShortcuts.action.open_model_selector.label': 'Otwórz wybór modelu',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label': 'Przełącz ulubiony model w przód',
'settings.openchamber.keyboardShortcuts.action.cycle_right_sidebar_tab.label': 'Przełącz zakładkę prawego paska bocznego',
'settings.openchamber.keyboardShortcuts.action.cycle_services_tab.label': 'Przełącz zakładkę usług',
@@ -895,6 +922,8 @@ export const settingsDict = {
'settings.openchamber.visual.actions.reloadThemes': 'Przeładuj motywy',
'settings.openchamber.visual.field.macVibrancy': 'Przezroczystość okna',
'settings.openchamber.visual.field.macVibrancyHint': 'Używaj natywnego rozmycia macOS (vibrancy) za panelem bocznym. Wyłącz, aby uzyskać w pełni nieprzezroczyste powierzchnie.',
'settings.openchamber.visual.field.dockBadge': 'Plakietka w Docku',
'settings.openchamber.visual.field.dockBadgeHint': 'Pokazuj na ikonie w Docku macOS liczbę czatów z nieprzeczytaną aktywnością.',
'settings.openchamber.visual.actions.saveAndRestart': 'Zapisz i uruchom ponownie',
'settings.openchamber.visual.actions.restarting': 'Ponowne uruchamianie…',
'settings.openchamber.visual.actions.reloadingThemes': 'Przeładowywanie motywów...',
@@ -906,6 +935,7 @@ export const settingsDict = {
'settings.openchamber.visual.actions.resetInterfaceFontAria': 'Zresetuj czcionkę interfejsu',
'settings.openchamber.visual.actions.resetSpacingAria': 'Zresetuj odstępy',
'settings.openchamber.visual.actions.resetTerminalFontSizeAria': 'Zresetuj rozmiar czcionki terminala',
'settings.openchamber.visual.actions.resetEditorFontSizeAria': 'Zresetuj rozmiar czcionki edytora',
'settings.openchamber.visual.field.activityDefaultModeAria': 'Domyślny tryb aktywności: {option}',
'settings.openchamber.visual.field.bash': 'Bash',
'settings.openchamber.visual.field.codeFont': 'Czcionka kodu',
@@ -950,6 +980,16 @@ export const settingsDict = {
'settings.openchamber.visual.field.showDotfilesAria': 'Pokaż pliki ukryte',
'settings.openchamber.visual.field.showExpandedBashToolsAria': 'Pokaż rozwinięte narzędzia bash',
'settings.openchamber.visual.field.showExpandedEditToolsAria': 'Pokaż rozwinięte narzędzia edycji',
'settings.openchamber.visual.field.sessionRecap': 'Generuj podsumowanie sesji',
'settings.openchamber.visual.field.sessionRecapAria': 'Generuj podsumowanie po zakończeniu pracy agenta',
'settings.openchamber.visual.field.sessionSuggestion': 'Generuj sugestię następnej wiadomości użytkownika',
'settings.openchamber.visual.field.sessionSuggestionAria': 'Generuj sugerowaną następną wiadomość użytkownika po zakończeniu pracy agenta',
'settings.openchamber.visual.field.sessionGoal': 'Włącz cele sesji',
'settings.openchamber.visual.field.sessionGoalAria': 'Utrzymuj automatyczną pracę sesji w kierunku celu',
'settings.openchamber.visual.goal.sectionTitle': 'Cel',
'settings.openchamber.visual.goal.budgetLabel': 'Domyślny budżet tokenów',
'settings.openchamber.visual.goal.budgetAria': 'Stosuj domyślny budżet tokenów do nowych celów',
'settings.openchamber.visual.goal.description': 'Uzbrój przycisk celu w kompozytorze, a następna wiadomość stanie się celem: agent będzie nad nim automatycznie pracować, audytowany przez mały model, nawet pod twoją nieobecność.',
'settings.openchamber.visual.field.showReasoningTraces': 'Pokaż ślady rozumowania',
'settings.openchamber.visual.field.showReasoningTracesAria': 'Pokaż ślady rozumowania',
'settings.openchamber.visual.field.collapsibleThinkingBlocks': 'Włącz zwijalne bloki rozumowania',
@@ -961,6 +1001,8 @@ export const settingsDict = {
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Pokaż Kopiuj odpowiedź, Zapisz jako obraz i Odczytaj na głos w blokach tekstu asystenta, które pojawiają się przed późniejszymi wywołaniami narzędzi w tej samej odpowiedzi.',
'settings.openchamber.visual.field.showToolFileIcons': 'Pokaż ikony plików narzędzi',
'settings.openchamber.visual.field.showToolFileIconsAria': 'Pokaż ikony plików narzędzi',
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Zawijaj wiersze bloków kodu',
'settings.openchamber.visual.field.codeBlockLineWrap': 'Zawijaj wiersze bloków kodu',
'settings.openchamber.visual.field.showTurnChangedFiles': 'Pokaż zmienione pliki w ukończonych turach',
'settings.openchamber.visual.field.showTurnChangedFilesAria': 'Pokaż zmienione pliki w ukończonych turach',
'settings.openchamber.visual.field.spacingDensity': 'Gęstość odstępów',
@@ -969,6 +1011,7 @@ export const settingsDict = {
'settings.openchamber.visual.field.expandedEditorToolbarAria': 'Always show editor toolbar',
'settings.openchamber.visual.field.expandedEditorToolbar': 'Always show editor toolbar (docked under the file tabs)',
'settings.openchamber.visual.field.terminalFontSize': 'Rozmiar czcionki terminala',
'settings.openchamber.visual.field.editorFontSize': 'Rozmiar czcionki edytora',
'settings.openchamber.visual.field.terminalQuickKeys': 'Szybkie klawisze terminala',
'settings.openchamber.visual.field.terminalQuickKeysAria': 'Szybkie klawisze terminala',
'settings.openchamber.visual.field.terminalQuickKeysTooltip': 'Pokaż Esc, Ctrl i strzałki w widoku terminala',
@@ -1061,6 +1104,9 @@ export const settingsDict = {
'settings.openchamber.worktrees.setup.loading': 'Ładowanie...',
'settings.openchamber.worktrees.setup.removeCommandAria': 'Usuń polecenie',
'settings.openchamber.worktrees.setup.title': 'Polecenia konfiguracji',
'settings.openchamber.worktrees.setup.waitForCommands': 'Czekaj na zakończenie poleceń konfiguracji przed utworzeniem lub wysłaniem sesji',
'settings.openchamber.worktrees.setup.waitForCommandsAria': 'Czekaj na polecenia konfiguracji Worktree przed utworzeniem lub wysłaniem sesji',
'settings.openchamber.worktrees.setup.toast.saveFailed': 'Nie udało się zapisać poleceń konfiguracji Worktree',
'settings.openchamber.worktrees.setup.tooltipPrefix': 'Uruchamiaj automatycznie w nowym katalogu worktree po jego utworzeniu. Użyj',
'settings.openchamber.worktrees.setup.tooltipSuffix': 'dla katalogu głównego projektu.',
'settings.openchamber.worktrees.state.gitOnly': 'Ustawienia worktree są dostępne tylko dla repozytoriów Git.',
@@ -1182,11 +1228,14 @@ export const settingsDict = {
'settings.projects.page.field.projectIconBackgroundAria': 'Kolor tła ikony projektu',
'settings.projects.page.field.projectName': 'Nazwa projektu',
'settings.projects.page.field.projectNamePlaceholder': 'Nazwa projektu',
'settings.projects.page.field.defaultModel': 'Domyślny model dla nowych czatów',
'settings.projects.page.field.defaultModelDescription': 'Używany przy rozpoczynaniu nowego czatu w tym projekcie. Gdy nie ustawiono, stosowane są globalne domyślne wartości.',
'settings.projects.page.section.worktree': 'Worktree',
'settings.projects.page.title.default': 'Project Settings',
'settings.projects.page.toast.customIconAlreadySet': 'Dla tego projektu ustawiono już własną ikonę',
'settings.projects.page.toast.discoverIconFailed': 'Nie udało się wykryć ikony projektu',
'settings.projects.page.toast.iconDiscovered': 'Wykryto ikonę projektu',
'settings.projects.page.toast.saveFailed': 'Nie udało się zapisać ustawień projektu',
'settings.projects.page.toast.iconRemoved': 'Ikona projektu została usunięta',
'settings.projects.page.toast.iconUpdated': 'Ikona projektu została zaktualizowana',
'settings.projects.page.toast.removeIconFailed': 'Nie udało się usunąć ikony projektu',
@@ -1413,11 +1462,18 @@ export const settingsDict = {
'settings.remoteInstances.direct.sidebarTitle': 'Linki do serwerów',
'settings.remoteInstances.direct.sidebarDescription': 'Połącz przez link lub token',
'settings.remoteInstances.direct.title': 'Inne serwery OpenChamber',
'settings.remoteInstances.direct.description': 'Dodaj inny serwer OpenChamber przez URL. Użyj tego, gdy serwer już działa i masz token połączenia.',
'settings.remoteInstances.direct.description': 'Serwery, na które ta aplikacja może się przełączać. Zaimportuj link parowania z innego serwera lub dodaj przez adres.',
'settings.remoteInstances.direct.addDialog.description': 'Dodaj inny serwer OpenChamber przez URL. Użyj tego, gdy serwer już działa i masz token połączenia.',
'settings.remoteInstances.direct.field.labelPlaceholder': 'Etykieta (opcjonalnie)',
'settings.remoteInstances.direct.field.urlPlaceholder': 'https://host:port',
'settings.remoteInstances.direct.field.tokenPlaceholder': 'Token połączenia (opcjonalny dla zaufanych serwerów lokalnych)',
'settings.remoteInstances.direct.note': 'Tokeny połączenia są zapisywane na tym urządzeniu i używane tylko wtedy, gdy ta aplikacja łączy się z danym serwerem.',
'settings.remoteInstances.direct.headers.title': 'Additional headers',
'settings.remoteInstances.direct.headers.description': 'Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.',
'settings.remoteInstances.direct.headers.field.namePlaceholder': 'Header name',
'settings.remoteInstances.direct.headers.field.valuePlaceholder': 'Header value',
'settings.remoteInstances.direct.headers.actions.add': 'Add header',
'settings.remoteInstances.direct.headers.removeAria': 'Remove header',
'settings.remoteInstances.direct.actions.add': 'Dodaj serwer',
'settings.remoteInstances.direct.import.description': 'Wklej link połączenia z innego serwera OpenChamber.',
'settings.remoteInstances.direct.import.placeholder': 'openchamber://connect?...',
@@ -1427,20 +1483,74 @@ export const settingsDict = {
'settings.remoteInstances.direct.state.empty': 'Nie dodano jeszcze innych serwerów.',
'settings.remoteInstances.clientAuth.title': 'Połącz z tym serwerem',
'settings.remoteInstances.clientAuth.description': 'Utwórz bezpieczny link lub token, aby OpenChamber Desktop mógł połączyć się z tym serwerem.',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': 'Nazwa urządzenia (opcjonalnie)',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': 'Nazwa urządzenia — np. Mój iPhone',
'settings.remoteInstances.clientAuth.actions.create': 'Utwórz token',
'settings.remoteInstances.clientAuth.actions.pair': 'Utwórz link',
'settings.remoteInstances.clientAuth.actions.revoke': 'Unieważnij',
'settings.remoteInstances.clientAuth.actions.clearRevoked': 'Wyczyść unieważnione',
'settings.remoteInstances.clientAuth.qrAlt': 'Kod QR połączenia OpenChamber',
'settings.remoteInstances.clientAuth.qrEnlarge': 'Powiększ kod QR',
'settings.remoteInstances.clientAuth.qrScanHint': 'Zeskanuj to aplikacją OpenChamber na drugim urządzeniu. Jednorazowy i wygasa.',
'settings.remoteInstances.clientAuth.qrDialogTitle': 'Zeskanuj, aby połączyć',
'settings.remoteInstances.clientAuth.actions.addDevice': 'Dodaj urządzenie',
'settings.remoteInstances.clientAuth.actions.copied': 'Skopiowano',
'settings.remoteInstances.clientAuth.addDevice.transportLabel': 'Gdzie będziesz używać tego urządzenia?',
'settings.remoteInstances.clientAuth.addDevice.subtitle': 'Utwórz jednorazowy kod QR, który połączy inne urządzenie z tym serwerem.',
'settings.remoteInstances.clientAuth.addDevice.transport.local': 'Tylko ten komputer',
'settings.remoteInstances.clientAuth.addDevice.transport.localHint': 'Dla aplikacji na tej samej maszynie.',
'settings.remoteInstances.clientAuth.addDevice.transport.lan': 'Tylko sieć domowa',
'settings.remoteInstances.clientAuth.addDevice.transport.lanHint': 'Łączy się bezpośrednio przez Wi-Fi. Nie działa poza tą siecią.',
'settings.remoteInstances.clientAuth.addDevice.transport.relay': 'Wszędzie',
'settings.remoteInstances.clientAuth.addDevice.transport.relayHint': 'Działa w domu i poza nim. Poza domem ruch przechodzi przez OpenChamber Private Relay — szyfrowany end-to-end tunel. Bez konfiguracji.',
'settings.remoteInstances.clientAuth.addDevice.fallback.relay': 'Zezwól też na szyfrowany relay poza domem',
'settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal': 'Preferuj bezpośrednie połączenie domowe, gdy dostępne',
'settings.remoteInstances.clientAuth.addDevice.create': 'Utwórz kod QR',
'settings.remoteInstances.clientAuth.addDevice.done': 'Gotowe',
'settings.remoteInstances.clientAuth.addDevice.connectedToast': 'Urządzenie połączone.',
'settings.remoteInstances.clientAuth.pairingUrl': 'Link połączenia',
'settings.remoteInstances.clientAuth.createdToken': 'Skopiuj ten token teraz. Ze względów bezpieczeństwa nie zostanie pokazany ponownie.',
'settings.remoteInstances.clientAuth.state.loading': 'Ładowanie tokenów...',
'settings.remoteInstances.clientAuth.state.empty': 'Nie podłączono jeszcze żadnych urządzeń.',
'settings.remoteInstances.clientAuth.state.revoked': 'Unieważniony',
'settings.remoteInstances.clientAuth.state.thisDevice': 'To urządzenie',
'settings.remoteInstances.clientAuth.state.pending': 'Oczekiwanie na połączenie…',
'settings.remoteInstances.clientAuth.state.viaRelay': 'Relay',
'settings.remoteInstances.clientAuth.state.connectedDirect': 'Połączono · Sieć lokalna',
'settings.remoteInstances.clientAuth.state.connectedRelay': 'Połączono · Relay',
'settings.remoteInstances.clientAuth.lastUsed': 'Ostatnio użyto {date}',
'settings.remoteInstances.clientAuth.neverUsed': 'Nigdy nie użyto',
'settings.remoteInstances.relay.title': 'OpenChamber Relay',
'settings.remoteInstances.relay.autoHint': 'Włącza się automatycznie po sparowaniu urządzenia przez relay.',
'settings.remoteInstances.relay.description': 'Pozwól swoim innym urządzeniom łączyć się z dowolnego miejsca bez otwierania portów. Ruch jest szyfrowany od końca do końca — relay nie może go odczytać.',
'settings.remoteInstances.relay.enableHint': 'Nic nie jest udostępniane, dopóki nie włączysz relay na tym serwerze.',
'settings.remoteInstances.relay.actions.enable': 'Włącz Relay',
'settings.remoteInstances.relay.actions.disable': 'Wyłącz',
'settings.remoteInstances.relay.confirm.disable': 'Wyłączyć relay? Urządzenia połączone przez niego zostaną natychmiast rozłączone.',
'settings.remoteInstances.relay.state.loading': 'Sprawdzanie stanu relay...',
'settings.remoteInstances.relay.state.disabled': 'Wyłączony',
'settings.remoteInstances.relay.state.connecting': 'Łączenie',
'settings.remoteInstances.relay.state.connected': 'Połączono',
'settings.remoteInstances.relay.state.reconnecting': 'Ponowne łączenie',
'settings.remoteInstances.relay.state.error': 'Błąd',
'settings.remoteInstances.relay.status.clientsOne': '{count} urządzenie połączone',
'settings.remoteInstances.relay.status.clientsMany': 'Połączone urządzenia: {count}',
'settings.remoteInstances.relay.pair.title': 'Sparuj urządzenie',
'settings.remoteInstances.relay.pair.labelPlaceholder': 'Nazwa urządzenia (opcjonalnie)',
'settings.remoteInstances.relay.pair.includeToken': 'Dołącz token dostępu (parowanie jednym skanem)',
'settings.remoteInstances.relay.pair.noTokenHint': 'Bez tokenu urządzenie zaloguje się po połączeniu hasłem interfejsu tego serwera.',
'settings.remoteInstances.relay.pair.generate': 'Utwórz link parowania',
'settings.remoteInstances.relay.pair.requiresConnected': 'Parowanie będzie dostępne, gdy relay zostanie połączony.',
'settings.remoteInstances.relay.pair.linkLabel': 'Link parowania',
'settings.remoteInstances.relay.pair.warning': 'Ten link daje dostęp do tego serwera. Nie udostępniaj go.',
'settings.remoteInstances.relay.pair.qrAlt': 'Kod QR parowania relay',
'settings.remoteInstances.relay.pair.showQr': 'Pokaż kod QR',
'settings.remoteInstances.relay.pair.qrDialogTitle': 'Zeskanuj, aby sparować',
'settings.remoteInstances.relay.pair.qrDialogDescription': 'Zeskanuj ten kod QR aplikacją OpenChamber na drugim urządzeniu.',
'settings.remoteInstances.relay.pair.manageHint': 'Zarządzaj sparowanymi urządzeniami lub odbieraj im dostęp na liście „Połączenie z tym serwerem” powyżej.',
'settings.remoteInstances.relay.toast.enableFailed': 'Nie udało się włączyć relay',
'settings.remoteInstances.relay.toast.disableFailed': 'Nie udało się wyłączyć relay',
'settings.remoteInstances.relay.toast.offerFailed': 'Nie udało się utworzyć linku parowania',
'settings.remoteInstances.relay.toast.linkCopied': 'Skopiowano link parowania',
'settings.remoteInstances.sidebar.toast.retriedWithRandomPort': 'Ponowiono próbę z losowym lokalnym portem',
'settings.remoteInstances.sidebar.toast.retryFailed': 'Nie udało się ponowić połączenia',
'settings.remoteInstances.sidebar.total': 'Suma: {count}',
@@ -1716,8 +1826,6 @@ export const settingsDict = {
'settings.voice.page.field.apiKeyHintUsingConfig': 'Użyto klucza z konfiguracji',
'settings.voice.page.field.auto': 'Auto',
'settings.voice.page.field.configuredAbove': 'Skonfigurowano powyżej',
'settings.voice.page.field.enableVoiceMode': 'Włącz tryb głosowy',
'settings.voice.page.field.enableVoiceModeAria': 'Włącz tryb głosowy',
'settings.voice.page.field.language': 'Język',
'settings.voice.page.field.messageReadAloudButton': 'Przycisk czytania wiadomości na głos',
'settings.voice.page.field.messageReadAloudButtonAria': 'Przycisk czytania wiadomości na głos',
@@ -1755,6 +1863,24 @@ export const settingsDict = {
'settings.voice.page.provider.custom': 'Własny',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': 'Serwer',
'settings.voice.page.provider.local': 'Lokalny',
'settings.voice.page.tooltip.sttLocal': 'Transkrypcja lokalna na serwerze OpenChamber. Modele pobierają się automatycznie; klucz API nie jest potrzebny.',
'settings.voice.page.tooltip.localTts': 'Lokalna synteza na serwerze OpenChamber (Kokoro, angielski). Model pobiera się automatycznie; klucz API nie jest potrzebny.',
'settings.voice.page.stt.model.parakeetV2': 'Parakeet v2 (angielski)',
'settings.voice.page.stt.model.parakeetV3': 'Parakeet v3 (25 języków europejskich)',
'settings.voice.page.stt.model.whisperBase': 'Whisper base (wielojęzyczny)',
'settings.voice.page.stt.model.whisperTiny': 'Whisper tiny (wielojęzyczny)',
'settings.voice.page.stt.badge.bestForEnglish': 'Najlepszy do angielskiego',
'settings.voice.page.stt.badge.bestForMultilingual': 'Najlepszy wielojęzyczny',
'settings.voice.page.stt.meta.accuracy': 'Dokładność',
'settings.voice.page.stt.meta.speed': 'Szybkość',
'settings.voice.page.stt.modelInstalled': 'Model zainstalowany',
'settings.voice.page.stt.modelDownloading': 'Pobieranie modelu...',
'settings.voice.page.stt.modelDownloadingProgress': 'Pobieranie modelu... {percent}%',
'settings.voice.page.stt.modelNotInstalled': 'Model niepobrany',
'settings.voice.page.stt.modelDownload': 'Pobierz',
'settings.voice.page.stt.modelDelete': 'Usuń model',
'settings.voice.page.stt.modelRetry': 'Ponów',
'settings.voice.page.provider.wasm': 'Lokalny',
'settings.voice.page.stt.wasmModel': 'Model Whisper',
'settings.voice.page.stt.wasmLoaded': 'Model załadowany',
@@ -1765,7 +1891,8 @@ export const settingsDict = {
'settings.voice.page.stt.wasmRetry': 'Spróbuj ponownie',
'settings.voice.page.section.playbackAndSummary': 'Odtwarzanie',
'settings.voice.page.section.speechRecognition': 'Rozpoznawanie mowy',
'settings.voice.page.section.voiceSetup': 'Konfiguracja głosu',
'settings.voice.page.field.enableVoiceInput': 'Włącz wprowadzanie głosowe',
'settings.voice.page.field.enableVoiceInputAria': 'Włącz wprowadzanie głosowe (dyktowanie)',
'settings.voice.page.tooltip.browser': 'Darmowe, offline, ograniczone wsparcie mobilne.',
'settings.voice.page.tooltip.custom': 'Serwer zgodny z OpenAI (na przykład Kokoro).',
'settings.voice.page.tooltip.openai': 'Wysoka jakość, gotowe na urządzenia mobilne, wymaga klucza API.',
@@ -1775,5 +1902,12 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputMode': 'Tryb wejścia TTS',
'settings.voice.page.field.ttsInputModeSanitized': 'Oczyszczony tekst',
'settings.voice.page.field.ttsInputModeRaw': 'Surowy Markdown',
'settings.voice.page.field.ttsInputModeSummarized': 'streszczony',
'settings.window.description': 'Okno ustawień OpenChamber.',
'settings.openchamber.visual.section.followUpBehavior': 'Follow-up behavior',
'settings.openchamber.visual.section.followUpBehaviorAria': 'Follow-up behavior',
'settings.openchamber.visual.field.followUpBehaviorAria': 'Follow-up behavior: {option}',
'settings.openchamber.visual.field.followUpBehaviorDescription': 'Choose what happens when you press Enter on a follow-up message while the agent is still responding.',
'settings.openchamber.visual.option.followUpBehavior.steer.label': 'Steer',
'settings.openchamber.visual.option.followUpBehavior.queue.label': 'Queue',
};
+149 -1
View File
@@ -15,6 +15,7 @@ export const dict: Record<I18nKey, string> = {
'common.language.brazilianPortuguese': 'Portugalski (Brazylia)',
'common.language.korean': 'Koreański',
'common.language.polish': 'Polski',
'common.language.japanese': 'Japoński',
'common.revealPath.finder': 'Pokaż w Finderze',
'common.revealPath.fileExplorer': 'Otwórz w Eksploratorze plików',
'common.revealPath.fileManager': 'Otwórz w Menedżerze plików',
@@ -23,6 +24,13 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': 'Odrzuć',
'pwa.installPrompt.started': 'Instalacja rozpoczęta',
'pwa.installPrompt.installed': 'OpenChamber został zainstalowany',
'shareOpinion.actions.shareOpinion': 'Podziel się opinią',
'shareOpinion.actions.bookCall': 'Umów rozmowę',
'shareOpinion.actions.shortSurvey': 'Krótka ankieta',
'shareOpinion.dialog.title': 'Podziel się opinią',
'shareOpinion.toast.title': 'Pomóż kształtować OpenChamber',
'shareOpinion.toast.description': 'Powiedz, co jest przydatne, mylące albo czego brakuje, aby pomóc kształtować kolejne kroki.',
'sessions.sidebar.footer.actions.shareOpinion': 'Podziel się opinią',
'layout.mainTab.chat': 'Czat',
'layout.mainTab.plan': 'Plan',
'layout.mainTab.diff': 'Różnice',
@@ -31,6 +39,50 @@ export const dict: Record<I18nKey, string> = {
'layout.mainTab.terminal': 'Terminal',
'layout.mainTab.context': 'Kontekst',
'mobile.nav.aria': 'Nawigacja mobilna',
'mobile.connect.welcome.title': 'Połącz z OpenChamber',
'mobile.connect.welcome.description': 'Dodaj adres URL serwera lub zeskanuj kod QR parowania, aby zacząć korzystać z aplikacji mobilnej.',
'mobile.connect.url.label': 'Adres URL serwera',
'mobile.connect.url.placeholder': 'http://192.168.1.74:2606',
'mobile.connect.token.label': 'Token klienta',
'mobile.connect.token.placeholder': 'Wklej token dostępu',
'mobile.connect.token.hint': 'Potrzebny tylko, gdy serwer wymaga tokenu zamiast hasła.',
'mobile.connect.password.label': 'Hasło',
'mobile.connect.password.placeholder': 'Hasło OpenChamber',
'mobile.connect.connectButton': 'Połącz',
'mobile.connect.unlockButton': 'Odblokuj i połącz',
'mobile.connect.cancelPassword': 'Użyj innego serwera',
'mobile.connect.connecting': 'Łączenie...',
'mobile.connect.scanQr': 'Skanuj kod QR',
'mobile.connect.welcome.scanHint': 'Na komputerze otwórz «Dodaj urządzenie», aby wyświetlić kod QR, i zeskanuj go tutaj.',
'mobile.connect.advanced': 'Zaawansowane',
'mobile.connect.manual.toggle': 'Połącz przez adres',
'mobile.connect.scan.permissionDenied': 'Dostęp do aparatu jest wyłączony. Włącz go w Ustawieniach, aby zeskanować kod QR.',
'mobile.connect.scan.failed': 'Nie udało się zeskanować tego kodu QR. Spróbuj ponownie lub wpisz adres URL ręcznie.',
'mobile.connect.scan.invalid': 'Ten kod QR nie jest kodem połączenia OpenChamber.',
'mobile.connect.scan.unsupported': 'Skanowanie QR jest dostępne tylko w zainstalowanej aplikacji mobilnej.',
'mobile.connect.saved.title': 'Zapisane połączenia',
'mobile.connect.saved.empty': 'Brak zapisanych połączeń.',
'mobile.connect.relay.badge': 'przez OpenChamber Relay',
'mobile.connect.error.urlRequired': 'Podaj adres URL serwera.',
'mobile.connect.error.invalidUrl': 'Ten adres URL serwera jest nieprawidłowy.',
'mobile.connect.error.unreachable': 'Nie udało się połączyć z tym serwerem OpenChamber.',
'mobile.connect.error.authRequired': 'Ten serwer wymaga hasła lub tokenu klienta.',
'mobile.connect.error.passwordFailed': 'Nie udało się odblokować tego serwera. Sprawdź hasło.',
'mobile.instances.addTitle': 'Dodaj instancję',
'mobile.instances.addManual': 'Dodaj przez adres',
'mobile.instances.editTitle': 'Edytuj instancję',
'mobile.instances.edit': 'Edytuj',
'mobile.instances.delete': 'Usuń',
'mobile.instances.deleteAria': 'Usuń {label}',
'mobile.instances.confirmDeleteAria': 'Potwierdź usunięcie {label}',
'mobile.instances.cancelDeleteAria': 'Zachowaj {label}',
'mobile.instances.cancelEdit': 'Anuluj',
'mobile.instances.label.label': 'Nazwa',
'mobile.instances.label.placeholder': 'Opcjonalna nazwa wyświetlana',
'mobile.instances.saveNew': 'Zapisz instancję',
'mobile.instances.status.connectedDirect': 'Połączono · Sieć lokalna',
'mobile.instances.status.connectedRelay': 'Połączono · Prywatny relay',
'mobile.instances.saveEdit': 'Zapisz zmiany',
'mobile.nav.changes': 'Zmiany',
'mobile.nav.settings': 'Ustawienia',
'mobile.surface.closeAria': 'Zamknij',
@@ -43,6 +95,7 @@ export const dict: Record<I18nKey, string> = {
'mobile.menu.files': 'Pliki',
'mobile.menu.changes': 'Zmiany',
'mobile.menu.mcp': 'MCP',
'mobile.menu.instances': 'Instancje',
'mobile.menu.update': 'Aktualizuj',
'mobile.menu.settings': 'Ustawienia',
'mobile.sessions.newChatCta': 'Nowy czat w {project}',
@@ -152,6 +205,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.actions.searchSessions': 'Szukaj sesji',
'sessions.sidebar.header.actions.exitSelection': 'Wyjdź z zaznaczenia',
'sessions.sidebar.header.actions.selectSessions': 'Wybierz sesje',
'sessions.sidebar.header.actions.sortProjects': 'Sortuj projekty',
'sessions.sidebar.header.actions.sessionDisplayMode': 'Tryb wyświetlania sesji',
'sessions.sidebar.header.displayMode.label': 'Tryb wyświetlania',
'sessions.sidebar.header.displayMode.default': 'Domyślny',
@@ -160,6 +214,11 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.displayMode.showArchived': 'Pokaż zarchiwizowane sesje',
'sessions.sidebar.header.displayMode.collapseAll': 'Zwiń wszystkie',
'sessions.sidebar.header.displayMode.expandAll': 'Rozwiń wszystkie',
'sessions.sidebar.header.projectSort.manual': 'Ręcznie',
'sessions.sidebar.header.projectSort.aToZ': 'A → Z',
'sessions.sidebar.header.projectSort.zToA': 'Z → A',
'sessions.sidebar.header.projectSort.dateAdded': 'Najnowsze',
'sessions.sidebar.header.projectSort.recent': 'Ostatnie',
'sessions.sidebar.header.search.matchCountSingle': '{count} dopasowanie',
'sessions.sidebar.header.search.matchCountPlural': '{count} dopasowań',
'sessions.sidebar.header.search.escapeHint': 'Esc aby wyczyścić',
@@ -191,6 +250,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.project.actions.projectMenu': 'Menu projektu',
'sessions.sidebar.project.actions.newSession': 'Nowa sesja',
'sessions.sidebar.project.actions.closeProject': 'Zamknij projekt',
'sessions.sidebar.project.actions.edit': 'Edytuj',
'sessions.sidebar.project.actions.newDraftSession': 'Nowa sesja robocza',
'sessions.sidebar.session.menu.rename': 'Zmień nazwę',
'sessions.sidebar.session.rename.save': 'Zapisz nazwę sesji',
@@ -321,6 +381,10 @@ export const dict: Record<I18nKey, string> = {
'sessions.scheduledTasks.editor.prompt.placeholder': 'Podsumuj otwarte zadania i zaproponuj następne działania',
'sessions.scheduledTasks.editor.enabled.aria': 'Włącz zadanie',
'sessions.scheduledTasks.editor.enabled.label': 'Włączone',
'sessions.scheduledTasks.editor.goal.label': 'Uruchom jako cel',
'sessions.scheduledTasks.editor.goal.aria': 'Uruchom to zadanie jako cel, do którego agent dąży aż do ukończenia',
'sessions.scheduledTasks.editor.goal.budgetLabel': 'Budżet tokenów',
'sessions.scheduledTasks.editor.goal.budgetAria': 'Ogranicz cel budżetem tokenów',
'sessions.scheduledTasks.editor.actions.closeAria': 'Zamknij',
'sessions.scheduledTasks.editor.actions.cancel': 'Anuluj',
'sessions.scheduledTasks.editor.actions.save': 'Zapisz',
@@ -663,6 +727,7 @@ export const dict: Record<I18nKey, string> = {
'chat.queuedMessage.edit': 'edit',
'chat.queuedMessage.send': 'send',
'chat.queuedMessage.removeAria': 'Usuń z kolejki',
'chat.queuedMessage.reorderAria': 'Przeciągnij, aby zmienić kolejność',
'chat.container.returnToParent.aria': 'Powrót do sesji nadrzędnej',
'chat.container.returnToParent.titleNamed': 'Powrót do: {title}',
'chat.container.returnToParent.title': 'Powrót do sesji nadrzędnej',
@@ -1029,6 +1094,9 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.actions.sendMessageAria': 'Send message',
'chat.chatInput.actions.stopGeneratingAria': 'Stop generating',
'chat.chatInput.branch': 'Gałąź',
'chat.chatInput.draftPicker.projectTitle': 'Projekt',
'chat.chatInput.draftPicker.searchProjects': 'Szukaj projektów...',
'chat.chatInput.draftPicker.searchBranches': 'Szukaj gałęzi...',
'chat.chatInput.devServerLogs': 'Dev Server logs:',
'chat.chatInput.devServerLogsRemove': 'Usuń logi serwera deweloperskiego',
'chat.chatInput.drop.attachFiles': 'Drop files here to attach',
@@ -1050,6 +1118,18 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.placeholder.chatCompact': 'Użyj @ / ! # dla pomocników',
'chat.chatInput.placeholder.selectSession': 'Wybierz lub utwórz sesję, aby zacząć czatować',
'chat.chatInput.placeholder.shell': 'Wpisz polecenie powłoki...',
'chat.dictation.start': 'Rozpocznij dyktowanie',
'chat.dictation.overlayAria': 'Dyktowanie',
'chat.dictation.downloadingModel': 'Pobieranie modelu mowy...',
'chat.dictation.downloadingModelProgress': 'Pobieranie modelu mowy... {percent}%',
'chat.dictation.listening': 'Słucham...',
'chat.dictation.processing': 'Transkrybowanie...',
'chat.dictation.failed': 'Transkrypcja nie powiodła się',
'chat.dictation.cancel': 'Odrzuć dyktowanie',
'chat.dictation.insert': 'Wstaw transkrypcję',
'chat.dictation.insertAndSend': 'Wstaw i wyślij',
'chat.dictation.retry': 'Ponów transkrypcję',
'chat.dictation.discard': 'Odrzuć nagranie',
'chat.snippetAutocomplete.action.addNew': '+ Dodaj nowy fragment',
'chat.snippetAutocomplete.empty': 'Nie znaleziono fragmentów',
'chat.snippetAutocomplete.footer': '↑↓ nawigacja • Enter wybierz • Esc zamknij',
@@ -1168,6 +1248,7 @@ export const dict: Record<I18nKey, string> = {
'chat.modelControls.removeFromFavorites': 'Usuń z ulubionych',
'chat.modelControls.reorderFavoriteAria': 'Zmień kolejność ulubionych',
'chat.modelControls.reorderFavoriteTitle': 'Przeciągnij, aby zmienić kolejność ulubionych',
'chat.modelControls.reorderProviderTitle': 'Przeciągnij, aby zmienić kolejność dostawcy',
'chat.modelControls.resetToDefault': 'Przywróć domyślne',
'chat.modelControls.searchAgents': 'Szukaj agentów',
'chat.modelControls.searchModels': 'Szukaj modeli...',
@@ -1216,6 +1297,11 @@ export const dict: Record<I18nKey, string> = {
'chat.toolOutputDialog.image.previousAria': 'Poprzedni obraz',
'chat.toolOutputDialog.mermaid.closeAria': 'Zamknij podgląd diagramu',
'chat.toolOutputDialog.mermaid.loadFailed': 'Nie udało się wczytać diagramu Mermaid.',
'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'Adres URL danych Mermaid ma nieprawidłowy format.',
'chat.toolOutputDialog.mermaid.invalidLocalPath': 'Lokalna ścieżka pliku Mermaid jest nieprawidłowa.',
'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': 'Nie udało się odczytać pliku Mermaid. Status: {status}.',
'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': 'Protokół adresu URL Mermaid nie jest obsługiwany.',
'chat.toolOutputDialog.mermaid.loadFailedWithStatus': 'Nie udało się wczytać diagramu Mermaid. Status: {status}.',
'chat.toolOutputDialog.mermaid.loading': 'Ładowanie diagramu...',
'chat.toolOutputDialog.mermaid.missingSource': 'Brakuje adresu URL źródła Mermaid.',
'chat.toolOutputDialog.mermaid.renderFailed': 'Nie udało się wyrenderować diagramu Mermaid.',
@@ -1230,6 +1316,9 @@ export const dict: Record<I18nKey, string> = {
'chat.toolPart.output': 'Wyjście',
'chat.toolPart.showRawJson': 'Pokaż surowy JSON',
'chat.toolPart.showFormattedJson': 'Pokaż sformatowany JSON',
'chat.toolPart.showNavigableJson': 'Pokaż nawigowalny JSON',
'chat.toolPart.openFileAtFirstChange': 'Otwórz plik przy pierwszej zmianie',
'chat.toolPart.openFileDiff': 'Otwórz różnice pliku',
'chat.toolPart.copyOutput': 'Kopiuj wyjście',
'chat.toolPart.copiedOutput': 'Skopiowano wyjście',
'chat.toolPart.copyOutputFailed': 'Nie udało się skopiować wyjścia',
@@ -1432,12 +1521,20 @@ export const dict: Record<I18nKey, string> = {
'diffView.reviewDialog.title': 'Przegląd zmian',
'diffView.reviewDialog.description': 'Uruchom osobną sesję review dla bieżących zmian.',
'diffView.reviewDialog.generateHandoff': 'Wygeneruj handoff',
'diffView.reviewDialog.autoReview': 'Uruchom automatyczną pętlę review',
'diffView.reviewDialog.info': 'Ten flow działa najlepiej, gdy jest uruchomiony z sesji, w której zaimplementowano zmiany.',
'diffView.reviewDialog.actions.cancel': 'Anuluj',
'diffView.reviewDialog.actions.start': 'Review',
'diffView.reviewDialog.actions.starting': 'Uruchamianie...',
'diffView.reviewDialog.toast.noSessionDirectory': 'Katalog sesji jest niedostępny',
'diffView.reviewDialog.toast.startFailed': 'Nie udało się uruchomić flow review',
'chat.history.loadOlder': 'Wczytaj starsze wiadomości',
'chat.autoReview.title': 'Pętla code review trwa',
'chat.autoReview.status.waitingForReviewer': 'Oczekiwanie na reviewera',
'chat.autoReview.status.waitingForImplementer': 'Oczekiwanie na implementatora',
'chat.autoReview.reviewSessionLabel': 'Sesja review',
'chat.autoReview.actions.open': 'Otwórz',
'chat.autoReview.actions.stop': 'Zatrzymaj',
'diffView.hunk.label': 'Fragmenty',
'diffView.hunk.stage': 'Przygotuj',
'diffView.hunk.unstage': 'Cofnij',
@@ -1465,6 +1562,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.section.files': 'Pliki',
'diffView.selector.selectFile': 'Wybierz plik',
'diffView.state.cleanWorkingTree': 'Drzewo robocze jest czyste, brak zmian do wyświetlenia',
'diffView.state.noLastTurnChanges': 'Brak zmian z ostatniej tury do wyświetlenia',
'diffView.state.failedToLoadDiff': 'Nie udało się wczytać diffu',
'diffView.state.largeDiff': 'Duży diff ({count} zmienionych linii)',
'diffView.state.largeDiffDescription': 'Renderowanie może być wolne. Nadal możesz wyświetlić diff przyciskiem poniżej.',
@@ -1476,6 +1574,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.summary.changedFilesPlural': 'Zmieniono {count} plików',
"diffView.scope.changed": "Zmienione",
"diffView.scope.staged": "Staged",
"diffView.scope.lastTurn": "Ostatnia tura",
"diffView.scope.selectorAria": "Wybierz tryb zmian",
'diffView.summary.changedFilesSingle': 'Zmieniono {count} plik',
'directoryExplorerDialog.actions.addProject': 'Dodaj projekt',
@@ -1996,6 +2095,43 @@ export const dict: Record<I18nKey, string> = {
'header.actions.planWithShortcut': 'Plan ({shortcut})',
'header.actions.rightSidebarWithShortcut': 'Prawy panel boczny ({shortcut})',
'header.actions.terminalPanelWithShortcut': 'Panel terminala ({shortcut})',
'chat.recap.aria': 'Podsumowanie sesji',
'chat.recap.label': 'Podsumowanie:',
'chat.goal.dialog.titleCreate': 'Ustaw cel sesji',
'chat.goal.dialog.titleManage': 'Cel sesji',
'chat.goal.dialog.objectiveLabel': 'Cel',
'chat.goal.dialog.objectivePlaceholder': 'Opisz stan końcowy, który agent ma osiągnąć i zweryfikować…',
'chat.goal.dialog.budgetLabel': 'Budżet tokenów',
'chat.goal.status.active': 'Aktywny',
'chat.goal.status.evaluating': 'Ocenianie…',
'chat.goal.status.paused': 'Wstrzymany',
'chat.goal.status.blocked': 'Zablokowany',
'chat.goal.status.budgetLimited': 'Budżet wyczerpany',
'chat.goal.status.complete': 'Ukończony',
'chat.goal.usage.tokens': '{used} tokenów',
'chat.goal.usage.tokensWithBudget': '{used}/{budget} tokenów',
'chat.goal.usage.turns': 'kontynuacje: {turns}',
'chat.goal.action.pause': 'Wstrzymaj',
'chat.goal.action.resume': 'Wznów',
'chat.goal.action.markComplete': 'Oznacz jako ukończony',
'chat.goal.action.clear': 'Usuń cel',
'chat.goal.action.cancel': 'Anuluj',
'chat.goal.action.save': 'Zapisz cel',
'chat.goal.action.start': 'Rozpocznij cel',
'chat.goal.toast.actionFailed': 'Nie udało się zaktualizować celu',
'chat.goal.row.aria': 'Cel sesji — otwórz szczegóły',
'chat.goal.button.createAria': 'Ustaw cel sesji',
'chat.goal.button.manageAria': 'Zarządzaj celem sesji',
'chat.goal.button.armAria': 'Rozpocznij cel następną wiadomością',
'chat.goal.counter.aria': 'Limit długości celu',
'chat.goal.button.disarmAria': 'Cel uzbrojony — dotknij, aby rozbroić',
'chat.goal.button.cancelAria': 'Cel w toku — dotknij, aby anulować',
'chat.goal.cancelDialog.title': 'Anulować ten cel?',
'chat.goal.cancelDialog.description': 'Agent przestanie automatycznie pracować nad tym celem.',
'chat.goal.cancelDialog.keep': 'Zachowaj cel',
'chat.goal.cancelDialog.confirm': 'Anuluj cel',
'chat.suggestion.applyAria': 'Użyj sugerowanej wiadomości',
'chat.suggestion.dismissAria': 'Odrzuć sugestię',
'header.actions.toggleRightSidebarAria': 'Przełącz prawy panel boczny',
'header.actions.toggleTerminalPanelAria': 'Przełącz panel terminala',
'header.changes.availableAria': 'Dostępne zmiany',
@@ -2080,8 +2216,15 @@ export const dict: Record<I18nKey, string> = {
'markdownRenderer.mermaid.actions.copySourceTitle': 'Kopiuj źródło',
'markdownRenderer.mermaid.actions.copyTitle': 'Kopiuj',
'markdownRenderer.mermaid.actions.downloadSvgTitle': 'Pobierz SVG',
'markdownRenderer.mermaid.actions.zoomInTitle': 'Powiększ',
'markdownRenderer.mermaid.actions.zoomOutTitle': 'Pomniejsz',
'markdownRenderer.mermaid.actions.resetViewTitle': 'Resetuj widok',
'markdownRenderer.mermaid.toast.downloadFailed': 'Nie udało się pobrać diagramu',
'markdownRenderer.code.actions.copyTitle': 'Kopiuj kod',
'markdownRenderer.code.actions.copiedTitle': 'Skopiowano',
'markdownRenderer.table.actions.copyTitle': 'Kopiuj tabelę',
'markdownRenderer.code.actions.enableWrapTitle': 'Włącz zawijanie wierszy',
'markdownRenderer.code.actions.disableWrapTitle': 'Wyłącz zawijanie wierszy',
'markdownRenderer.table.actions.downloadTitle': 'Pobierz tabelę',
'markdownRenderer.table.toast.downloadedAsFormat': 'Tabela została pobrana jako {format}',
'mcpDropdown.actions.openAria': 'Serwery MCP',
@@ -2393,7 +2536,7 @@ export const dict: Record<I18nKey, string> = {
'sessionAuth.actions.usePasskey': 'Użyj klucza dostępu',
'sessionAuth.error.enterPasswordForPasskey': 'Wpisz hasło, aby dodać klucz dostępu.',
'sessionAuth.error.incorrectPassword': 'Nieprawidłowe hasło. Spróbuj ponownie.',
'sessionAuth.error.networkDescription': 'Nie udało się zweryfikować sesji UI. Sprawdź, czy usługa działa, i spróbuj ponownie.',
'sessionAuth.error.networkDescription': 'Nie udało się zweryfikować sesji UI. Jeśli otwierasz OpenChamber z innego urządzenia w sieci lokalnej, włącz Desktop Network Access w aplikacji desktopowej i użyj adresu LAN widocznego w Ustawieniach.',
'sessionAuth.error.networkRetry': 'Błąd sieci. Sprawdź połączenie i spróbuj ponownie.',
'sessionAuth.error.networkTitle': 'Nie można połączyć się z serwerem',
'sessionAuth.error.passkeySetupFailed': 'Nie udało się skonfigurować klucza dostępu.',
@@ -2497,10 +2640,15 @@ export const dict: Record<I18nKey, string> = {
'updateDialog.actions.copied': 'Skopiowano!',
'updateDialog.actions.copyCommand': 'Kopiuj polecenie',
'updateDialog.actions.downloadUpdate': 'Pobierz aktualizację',
'updateDialog.actions.openMobileUpdate': 'Otwórz aktualizację',
'updateDialog.actions.restartToUpdate': 'Uruchom ponownie, aby zaktualizować',
'updateDialog.actions.updateNow': 'Aktualizuj teraz',
'updateDialog.error.takingLonger': 'Aktualizacja trwa dłużej niż oczekiwano. Poczekaj chwilę i odśwież albo uruchom: openchamber update',
'updateDialog.error.updateFailed': 'Aktualizacja nie powiodła się',
'mobileUpdate.toast.available.title': 'Dostępna aktualizacja OpenChamber',
'mobileUpdate.toast.available.description': 'Wersja {version} jest gotowa dla Androida.',
'mobileUpdate.toast.actions.download': 'Pobierz',
'mobileUpdate.toast.actions.dismiss': 'Odrzuć',
'updateDialog.fallback.updateViaTerminal': 'Lub zaktualizuj przez terminal:',
'updateDialog.header.updateAvailable': 'Dostępna aktualizacja',
'updateDialog.header.updating': 'Aktualizowanie OpenChamber...',
@@ -220,11 +220,18 @@ export const settingsDict = {
"settings.remoteInstances.direct.sidebarTitle": "Links de servidores",
"settings.remoteInstances.direct.sidebarDescription": "Conecte com um link ou token",
"settings.remoteInstances.direct.title": "Outros servidores OpenChamber",
"settings.remoteInstances.direct.description": "Adicione outro servidor OpenChamber por URL. Use isto quando o servidor já estiver em execução e você tiver um token de conexão.",
"settings.remoteInstances.direct.description": "Servidores para os quais este aplicativo pode alternar. Importe um link de pareamento do outro servidor ou adicione pelo endereço.",
"settings.remoteInstances.direct.addDialog.description": "Adicione outro servidor OpenChamber por URL. Use isto quando o servidor já estiver em execução e você tiver um token de conexão.",
"settings.remoteInstances.direct.field.labelPlaceholder": "Rótulo (opcional)",
"settings.remoteInstances.direct.field.urlPlaceholder": "https://host:port",
"settings.remoteInstances.direct.field.tokenPlaceholder": "Token de conexão (opcional para servidores locais confiáveis)",
"settings.remoteInstances.direct.note": "Os tokens de conexão ficam salvos neste dispositivo e são usados apenas quando este app se conecta a esse servidor.",
"settings.remoteInstances.direct.headers.title": "Additional headers",
"settings.remoteInstances.direct.headers.description": "Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.",
"settings.remoteInstances.direct.headers.field.namePlaceholder": "Header name",
"settings.remoteInstances.direct.headers.field.valuePlaceholder": "Header value",
"settings.remoteInstances.direct.headers.actions.add": "Add header",
"settings.remoteInstances.direct.headers.removeAria": "Remove header",
"settings.remoteInstances.direct.actions.add": "Adicionar servidor",
"settings.remoteInstances.direct.import.description": "Cole um link de conexão de outro servidor OpenChamber.",
"settings.remoteInstances.direct.import.placeholder": "openchamber://connect?...",
@@ -234,20 +241,74 @@ export const settingsDict = {
"settings.remoteInstances.direct.state.empty": "Nenhum outro servidor adicionado ainda.",
"settings.remoteInstances.clientAuth.title": "Conectar a este servidor",
"settings.remoteInstances.clientAuth.description": "Crie um link ou token seguro para que o OpenChamber Desktop possa se conectar a este servidor.",
"settings.remoteInstances.clientAuth.field.labelPlaceholder": "Nome do dispositivo (opcional)",
"settings.remoteInstances.clientAuth.field.labelPlaceholder": "Nome do dispositivo — ex.: Meu iPhone",
"settings.remoteInstances.clientAuth.actions.create": "Criar token",
"settings.remoteInstances.clientAuth.actions.pair": "Criar link",
"settings.remoteInstances.clientAuth.actions.revoke": "Revogar",
"settings.remoteInstances.clientAuth.actions.clearRevoked": "Limpar revogados",
"settings.remoteInstances.clientAuth.qrAlt": "OpenChamber connection QR code",
"settings.remoteInstances.clientAuth.qrEnlarge": "Ampliar código QR",
"settings.remoteInstances.clientAuth.qrScanHint": "Escaneie com o app OpenChamber no seu outro dispositivo. É de uso único e expira.",
"settings.remoteInstances.clientAuth.qrDialogTitle": "Escanear para conectar",
"settings.remoteInstances.clientAuth.actions.addDevice": "Adicionar um dispositivo",
"settings.remoteInstances.clientAuth.actions.copied": "Copiado",
"settings.remoteInstances.clientAuth.addDevice.transportLabel": "Onde você vai usar este dispositivo?",
"settings.remoteInstances.clientAuth.addDevice.subtitle": "Crie um código QR de uso único que conecta outro dispositivo a este servidor.",
"settings.remoteInstances.clientAuth.addDevice.transport.local": "Somente este computador",
"settings.remoteInstances.clientAuth.addDevice.transport.localHint": "Para aplicativos nesta mesma máquina.",
"settings.remoteInstances.clientAuth.addDevice.transport.lan": "Somente rede doméstica",
"settings.remoteInstances.clientAuth.addDevice.transport.lanHint": "Conecta diretamente pela sua rede Wi-Fi. Não funciona fora desta rede.",
"settings.remoteInstances.clientAuth.addDevice.transport.relay": "Em qualquer lugar",
"settings.remoteInstances.clientAuth.addDevice.transport.relayHint": "Funciona em casa e fora. Fora de casa o tráfego passa pelo OpenChamber Private Relay, um túnel criptografado de ponta a ponta. Sem configuração.",
"settings.remoteInstances.clientAuth.addDevice.fallback.relay": "Também permitir o relay criptografado fora de casa",
"settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal": "Preferir a conexão doméstica direta quando disponível",
"settings.remoteInstances.clientAuth.addDevice.create": "Criar código QR",
"settings.remoteInstances.clientAuth.addDevice.done": "Concluído",
"settings.remoteInstances.clientAuth.addDevice.connectedToast": "Dispositivo conectado.",
"settings.remoteInstances.clientAuth.pairingUrl": "Link de conexão",
"settings.remoteInstances.clientAuth.createdToken": "Copie este token agora. Por segurança, ele não será mostrado novamente.",
"settings.remoteInstances.clientAuth.state.loading": "Carregando tokens...",
"settings.remoteInstances.clientAuth.state.empty": "Nenhum dispositivo conectado ainda.",
"settings.remoteInstances.clientAuth.state.revoked": "Revogado",
"settings.remoteInstances.clientAuth.state.thisDevice": "Este dispositivo",
"settings.remoteInstances.clientAuth.state.pending": "Aguardando conexão…",
"settings.remoteInstances.clientAuth.state.viaRelay": "Relay",
"settings.remoteInstances.clientAuth.state.connectedDirect": "Conectado · Rede local",
"settings.remoteInstances.clientAuth.state.connectedRelay": "Conectado · Relay",
"settings.remoteInstances.clientAuth.lastUsed": "Último uso em {date}",
"settings.remoteInstances.clientAuth.neverUsed": "Nunca usado",
"settings.remoteInstances.relay.title": "OpenChamber Relay",
"settings.remoteInstances.relay.autoHint": "Liga automaticamente ao parear um dispositivo pelo relay.",
"settings.remoteInstances.relay.description": "Permita que seus outros dispositivos se conectem de qualquer lugar sem abrir portas. O tráfego é criptografado de ponta a ponta — o relay não consegue lê-lo.",
"settings.remoteInstances.relay.enableHint": "Nada é compartilhado até você ativar o relay neste servidor.",
"settings.remoteInstances.relay.actions.enable": "Ativar Relay",
"settings.remoteInstances.relay.actions.disable": "Desativar",
"settings.remoteInstances.relay.confirm.disable": "Desativar o relay? Os dispositivos conectados por ele serão desconectados imediatamente.",
"settings.remoteInstances.relay.state.loading": "Verificando o status do relay...",
"settings.remoteInstances.relay.state.disabled": "Desativado",
"settings.remoteInstances.relay.state.connecting": "Conectando",
"settings.remoteInstances.relay.state.connected": "Conectado",
"settings.remoteInstances.relay.state.reconnecting": "Reconectando",
"settings.remoteInstances.relay.state.error": "Erro",
"settings.remoteInstances.relay.status.clientsOne": "{count} dispositivo conectado",
"settings.remoteInstances.relay.status.clientsMany": "{count} dispositivos conectados",
"settings.remoteInstances.relay.pair.title": "Parear um dispositivo",
"settings.remoteInstances.relay.pair.labelPlaceholder": "Nome do dispositivo (opcional)",
"settings.remoteInstances.relay.pair.includeToken": "Incluir token de acesso (pareamento com um único escaneamento)",
"settings.remoteInstances.relay.pair.noTokenHint": "Sem token, o dispositivo faz login com a senha da interface deste servidor após conectar.",
"settings.remoteInstances.relay.pair.generate": "Criar link de pareamento",
"settings.remoteInstances.relay.pair.requiresConnected": "O pareamento fica disponível quando o relay estiver conectado.",
"settings.remoteInstances.relay.pair.linkLabel": "Link de pareamento",
"settings.remoteInstances.relay.pair.warning": "Este link concede acesso a este servidor. Não o compartilhe.",
"settings.remoteInstances.relay.pair.qrAlt": "Código QR de pareamento do relay",
"settings.remoteInstances.relay.pair.showQr": "Mostrar código QR",
"settings.remoteInstances.relay.pair.qrDialogTitle": "Escanear para parear",
"settings.remoteInstances.relay.pair.qrDialogDescription": "Escaneie este código QR com o app OpenChamber no seu outro dispositivo.",
"settings.remoteInstances.relay.pair.manageHint": "Gerencie ou revogue dispositivos pareados na lista “Conectar a este servidor” acima.",
"settings.remoteInstances.relay.toast.enableFailed": "Falha ao ativar o relay",
"settings.remoteInstances.relay.toast.disableFailed": "Falha ao desativar o relay",
"settings.remoteInstances.relay.toast.offerFailed": "Falha ao criar o link de pareamento",
"settings.remoteInstances.relay.toast.linkCopied": "Link de pareamento copiado",
"settings.remoteInstances.sidebar.phase.ready": "Pronto",
"settings.remoteInstances.sidebar.phase.error": "Erro",
"settings.remoteInstances.sidebar.phase.reconnect": "Reconectar",
@@ -365,12 +426,14 @@ export const settingsDict = {
"settings.agents.sidebar.toast.agentExists": "Já existe um agente com este nome",
"settings.agents.sidebar.toast.removeOldAfterRenameFailed": "Não foi possível excluir o agente antigo depois da renomeação",
"settings.agents.sidebar.toast.renameFailed": "Não foi possível renomear o agente",
"settings.agents.sidebar.toast.agentRenamed": "Agente renomeado para \"{name}\"",
"settings.agents.page.toast.permissionNameRequired": "É necessário informar o nome da permissão",
"settings.agents.page.toast.created": "Agente criado com sucesso",
"settings.agents.page.toast.updated": "Agente atualizado com sucesso",
"settings.agents.page.toast.createFailed": "Não foi possível criar o agente",
"settings.agents.page.toast.updateFailed": "Não foi possível atualizar o agente",
"settings.agents.page.toast.saveUnexpectedError": "Ocorreu um erro ao salvar",
"settings.agents.page.toast.savedManualRestart": "Salvo no disco. Reinicie o servidor OpenCode conectado para aplicar as alterações.",
"settings.agents.page.empty.title": "Selecione um agente da barra lateral",
"settings.agents.page.empty.description": "ou crie um novo",
"settings.agents.page.title.new": "Novo agente",
@@ -387,6 +450,10 @@ export const settingsDict = {
"settings.agents.page.field.mode": "Modo",
"settings.agents.page.field.modeTooltip": "Visibilidade principal vs subagente",
"settings.agents.page.field.overrideModel": "Sobrescrever modelo",
"settings.agents.page.field.variant": "Variante de pensamento",
"settings.agents.page.field.variantTooltip": "Opcional. Se o modelo suportar raciocínio, a variante controla a profundidade do raciocínio.",
"settings.agents.page.field.variantHint": "Específico do modelo (ex.: variante Anthropic)",
"settings.agents.page.field.variantPlaceholder": "ex.: high, max, low, none",
"settings.agents.page.field.temperature": "Temperatura",
"settings.agents.page.field.temperatureTooltip": "Controla a aleatoriedade. Maior = mais criativo, menor = mais focado.",
"settings.agents.page.field.temperatureRange": "0.0 a 2.0",
@@ -500,6 +567,7 @@ export const settingsDict = {
"settings.gitIdentities.editor.description.globalReadOnly": "Identidade Git global (somente leitura)",
"settings.gitIdentities.editor.description.newProfile": "Criar uma nova identidade Git",
"settings.gitIdentities.editor.description.editProfile": "Editar as configurações da identidade",
"settings.gitIdentities.editor.section.commitSigning": "Assinatura de commits",
"settings.gitIdentities.editor.field.profileName": "Nome da identidade",
"settings.gitIdentities.editor.field.profileNamePlaceholder": "Identidade de trabalho, pessoal, etc.",
"settings.gitIdentities.editor.field.color": "Cor",
@@ -515,6 +583,9 @@ export const settingsDict = {
"settings.gitIdentities.editor.field.sshKeyPath": "Caminho da chave SSH",
"settings.gitIdentities.editor.field.sshKeyPathTooltip": "Caminho opcional para a chave privada. Exemplo: ~/.ssh/id_ed25519",
"settings.gitIdentities.editor.field.sshKeyPathPlaceholder": "~/.ssh/id_ed25519",
"settings.gitIdentities.editor.field.signCommits": "Assinar commits com esta identidade",
"settings.gitIdentities.editor.field.signingKey": "Chave de assinatura",
"settings.gitIdentities.editor.field.signingKeyPlaceholder": "~/.ssh/id_ed25519.pub",
"settings.gitIdentities.editor.field.host": "Servidor",
"settings.gitIdentities.editor.field.hostTooltip": "O token será lido de ~/.git-credentials para este servidor.",
"settings.gitIdentities.editor.field.hostPlaceholder": "github.com",
@@ -523,6 +594,7 @@ export const settingsDict = {
"settings.gitIdentities.editor.actions.save": "Salvar",
"settings.gitIdentities.editor.toast.userNameEmailRequired": "Nome de usuário e endereço de e-mail são obrigatórios",
"settings.gitIdentities.editor.toast.hostRequiredForToken": "É necessário um servidor para autenticação baseada em token",
"settings.gitIdentities.editor.toast.signingKeyRequired": "É necessária uma chave de assinatura quando a assinatura de commits está ativada",
"settings.gitIdentities.editor.toast.profileCreated": "Identidade criada",
"settings.gitIdentities.editor.toast.profileUpdated": "Identidade atualizada",
"settings.gitIdentities.editor.toast.createProfileFailed": "Não foi possível criar a identidade",
@@ -772,7 +844,13 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.title": "Acesso de rede do desktop",
"settings.openchamber.desktopNetwork.field.launchAtLoginAria": "Iniciar o OpenChamber ao fazer login",
"settings.openchamber.desktopNetwork.field.launchAtLogin": "Iniciar o OpenChamber ao fazer login",
"settings.openchamber.desktopNetwork.field.launchAtLoginDescription": "Inicia o app em segundo plano sem abrir uma janela. Clique no ícone do Dock para abrir.",
"settings.openchamber.desktopNetwork.field.launchAtLoginDescription": "Inicia o app em segundo plano sem abrir uma janela. Use o ícone de status da área de trabalho para abrir.",
"settings.openchamber.desktopNetwork.field.minimizeToTrayAria": "Minimizar e fechar o OpenChamber na bandeja do sistema",
"settings.openchamber.desktopNetwork.field.minimizeToTray": "Minimizar e fechar na bandeja do sistema",
"settings.openchamber.desktopNetwork.field.minimizeToTrayDescription": "Mantém o OpenChamber em execução na bandeja do sistema do Windows quando a janela principal é minimizada ou fechada.",
"settings.openchamber.desktopNetwork.field.keepAwakeAria": "Manter o computador ativo enquanto o OpenChamber estiver em execução",
"settings.openchamber.desktopNetwork.field.keepAwake": "Manter o computador ativo enquanto o OpenChamber estiver em execução",
"settings.openchamber.desktopNetwork.field.keepAwakeDescription": "Para que telefones continuem abrindo este app. A tela ainda pode desligar.",
"settings.openchamber.desktopNetwork.field.allowLanAccessAria": "Permitir acesso LAN ao lado de desktop",
"settings.openchamber.desktopNetwork.field.allowLanAccess": "Permitir que outros dispositivos na sua rede local abram este aplicativo",
"settings.openchamber.desktopNetwork.field.allowLanAccessDescription": "Reinicia o aplicativo para que os telefones, tablets e outros computadores em seu Wi-Fi possam abri-lo.",
@@ -789,6 +867,10 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.error.savedRestartFailed": "Salvo, mas não foi possível reiniciar o aplicativo",
"settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported": "Iniciar ao fazer login não é compatível com este sistema",
"settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed": "Não foi possível atualizar a opção de iniciar ao fazer login",
"settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported": "O modo em segundo plano na bandeja do sistema não é compatível com este sistema",
"settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed": "Não foi possível atualizar a opção da bandeja do sistema",
"settings.openchamber.desktopNetwork.error.keepAwakeUnsupported": "Impedir suspensão não é compatível com este sistema",
"settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed": "Não foi possível atualizar a opção de manter ativo",
"settings.openchamber.opencodeCli.title": "CLI do OpenCode",
"settings.openchamber.opencodeCli.tooltipPrefix": "Caminho absoluto opcional para o",
"settings.openchamber.opencodeCli.tooltipSuffix": "executável.",
@@ -917,6 +999,7 @@ export const settingsDict = {
"settings.openchamber.keyboardShortcuts.action.cycle_agent.label": "Alternar agente",
"settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label": "Próximo modelo favorito",
"settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label": "Modelo favorito anterior",
"settings.openchamber.keyboardShortcuts.action.open_model_selector.label": "Abrir seletor de modelo",
"settings.openchamber.keyboardShortcuts.action.expand_input.label": "Expandir entrada",
"settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label": "Abrir linha do tempo da conversa",
"settings.projects.sidebar.total": "Total {count}",
@@ -926,6 +1009,8 @@ export const settingsDict = {
"settings.projects.page.section.worktree": "Worktree",
"settings.projects.page.field.projectName": "Nome do projeto",
"settings.projects.page.field.projectNamePlaceholder": "Nome do projeto",
"settings.projects.page.field.defaultModel": "Modelo padrão para novos chats",
"settings.projects.page.field.defaultModelDescription": "Usado ao iniciar um novo chat neste projeto. Se não definido, usa os padrões globais.",
"settings.projects.page.field.accentColor": "Cor de destaque",
"settings.projects.page.field.projectIcon": "Ícone do projeto",
"settings.projects.page.field.projectIconBackgroundAria": "Cor de fundo do ícone do projeto",
@@ -947,6 +1032,7 @@ export const settingsDict = {
"settings.projects.page.toast.discoverIconFailed": "Não foi possível descobrir o ícone do projeto",
"settings.projects.page.toast.customIconAlreadySet": "Ícone personalizado já definido para este projeto",
"settings.projects.page.toast.iconDiscovered": "Ícone do projeto descoberto",
"settings.projects.page.toast.saveFailed": "Falha ao salvar as configurações do projeto",
"settings.usage.sidebar.title": "Uso",
"settings.usage.sidebar.total": "Total {count}",
"settings.usage.sidebar.actions.toggleAutoRefreshAria": "Alternar atualização automática",
@@ -1082,6 +1168,9 @@ export const settingsDict = {
"settings.openchamber.worktrees.setup.commandPlaceholder": "ej.: bun install",
"settings.openchamber.worktrees.setup.removeCommandAria": "Excluir comando",
"settings.openchamber.worktrees.setup.addCommand": "Adicionar comando",
"settings.openchamber.worktrees.setup.waitForCommands": "Aguardar os comandos de configuração antes de criar ou enviar uma sessão",
"settings.openchamber.worktrees.setup.waitForCommandsAria": "Aguardar os comandos de configuração do Worktree antes de criar ou enviar uma sessão",
"settings.openchamber.worktrees.setup.toast.saveFailed": "Falha ao salvar os comandos de configuração do Worktree",
"settings.openchamber.worktrees.list.title": "Worktrees existentes",
"settings.openchamber.worktrees.list.tooltip": "Os worktrees existem fuera do repositório (gerenciados por OpenCode). Excluir um worktree também remove sessões vinculadas.",
"settings.openchamber.worktrees.list.loading": "Carregando worktrees...",
@@ -1338,6 +1427,11 @@ export const settingsDict = {
"settings.openchamber.defaults.field.thinkingPlaceholder": "Pensando",
"settings.openchamber.defaults.field.defaultAgent": "Agente por padrão",
"settings.openchamber.defaults.field.showDeletionDialogAria": "Mostrar diálogo de eliminación",
"settings.openchamber.defaults.smallModel.title": "Modelo pequeno",
"settings.openchamber.defaults.smallModel.description": "Um modelo barato para tarefas utilitárias rápidas, como recapitulações e resumos curtos.",
"settings.openchamber.defaults.smallModel.useDefault": "Usar o modelo pequeno padrão",
"settings.openchamber.defaults.smallModel.useDefaultAria": "Usar o modelo pequeno padrão",
"settings.openchamber.defaults.smallModel.overrideModel": "Modelo de substituição",
"settings.openchamber.defaults.field.showDeletionDialog": "Mostrar diálogo de eliminación",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Abrir arquivos em modo prévia",
"settings.openchamber.defaults.field.openFilesPreview": "Abrir arquivos em modo prévia",
@@ -1460,16 +1554,33 @@ export const settingsDict = {
"settings.notifications.page.toast.backgroundDisabled": "Notificações em segundo plano desabilitadas",
"settings.notifications.page.testNotification.title": "Notificação de teste",
"settings.notifications.page.testNotification.body": "Esta é uma notificação de teste do OpenChamber.",
"settings.voice.page.section.voiceSetup": "Configurações de voz",
"settings.voice.page.section.speechRecognition": "Reconhecimento de voz",
"settings.voice.page.field.enableVoiceInput": "Ativar entrada por voz",
"settings.voice.page.field.enableVoiceInputAria": "Ativar entrada por voz (ditado)",
"settings.voice.page.section.playbackAndSummary": "Reprodução",
"settings.voice.page.field.enableVoiceModeAria": "Ativar modo de voz",
"settings.voice.page.field.enableVoiceMode": "Ativar modo de voz",
"settings.voice.page.field.provider": "Provedor",
"settings.voice.page.provider.browser": "Navegador",
"settings.voice.page.provider.custom": "Personalizado",
"settings.voice.page.provider.say": "Falar",
"settings.voice.page.provider.server": "Servidor",
"settings.voice.page.provider.local": "Local",
"settings.voice.page.tooltip.sttLocal": "Transcrição local no servidor do OpenChamber. Os modelos são baixados automaticamente; não é necessária chave de API.",
"settings.voice.page.tooltip.localTts": "Síntese local no servidor do OpenChamber (Kokoro, inglês). O modelo é baixado automaticamente; não é necessária chave de API.",
"settings.voice.page.stt.model.parakeetV2": "Parakeet v2 (inglês)",
"settings.voice.page.stt.model.parakeetV3": "Parakeet v3 (25 idiomas europeus)",
"settings.voice.page.stt.model.whisperBase": "Whisper base (multilíngue)",
"settings.voice.page.stt.model.whisperTiny": "Whisper tiny (multilíngue)",
"settings.voice.page.stt.badge.bestForEnglish": "Melhor para inglês",
"settings.voice.page.stt.badge.bestForMultilingual": "Melhor multilíngue",
"settings.voice.page.stt.meta.accuracy": "Precisão",
"settings.voice.page.stt.meta.speed": "Velocidade",
"settings.voice.page.stt.modelInstalled": "Modelo instalado",
"settings.voice.page.stt.modelDownloading": "Baixando modelo...",
"settings.voice.page.stt.modelDownloadingProgress": "Baixando modelo... {percent}%",
"settings.voice.page.stt.modelNotInstalled": "Modelo não baixado",
"settings.voice.page.stt.modelDownload": "Baixar",
"settings.voice.page.stt.modelDelete": "Excluir modelo",
"settings.voice.page.stt.modelRetry": "Tentar novamente",
"settings.voice.page.provider.wasm": "Local",
"settings.voice.page.stt.wasmModel": "Modelo Whisper",
"settings.voice.page.stt.wasmLoaded": "Modelo carregado",
@@ -1526,6 +1637,7 @@ export const settingsDict = {
"settings.voice.page.field.ttsInputMode": "Modo de entrada TTS",
"settings.voice.page.field.ttsInputModeSanitized": "Texto limpo",
"settings.voice.page.field.ttsInputModeRaw": "Markdown bruto",
"settings.voice.page.field.ttsInputModeSummarized": "resumido",
"settings.openchamber.visual.section.colorMode": "Modo de cor",
"settings.openchamber.visual.section.mobileLayout": "Layout móvel",
"settings.openchamber.visual.option.mobileLayout.default": "Anterior",
@@ -1558,6 +1670,8 @@ export const settingsDict = {
"settings.openchamber.visual.actions.reloadThemes": "Recarregar temas",
"settings.openchamber.visual.field.macVibrancy": "Transparência da janela",
"settings.openchamber.visual.field.macVibrancyHint": "Usa o desfoque nativo do macOS (vibrancy) atrás da barra lateral. Desative para superfícies totalmente sólidas e opacas.",
"settings.openchamber.visual.field.dockBadge": "Selo no Dock",
"settings.openchamber.visual.field.dockBadgeHint": "Mostra no ícone do Dock do macOS o número de conversas com atividade não vista.",
"settings.openchamber.visual.actions.saveAndRestart": "Salvar e reiniciar",
"settings.openchamber.visual.actions.restarting": "Reiniciando…",
"settings.openchamber.visual.actions.reloadingThemes": "Recarregando temas...",
@@ -1584,10 +1698,12 @@ export const settingsDict = {
"settings.openchamber.visual.field.fontSizePercentageAria": "Porcentagem do tamanho base",
"settings.openchamber.visual.actions.resetFontSizeAria": "Redefinir tamanho base",
"settings.openchamber.visual.field.terminalFontSize": "Tamanho base do terminal",
"settings.openchamber.visual.field.editorFontSize": "Tamanho base do editor",
"settings.openchamber.visual.field.codeFont": "Fonte do código",
"settings.openchamber.visual.field.selectCodeFontAria": "Selecionar fonte do código",
"settings.openchamber.visual.actions.resetCodeFontAria": "Redefinir fonte do código",
"settings.openchamber.visual.actions.resetTerminalFontSizeAria": "Redefinir tamanho base do terminal",
"settings.openchamber.visual.actions.resetEditorFontSizeAria": "Redefinir tamanho base do editor",
"settings.openchamber.visual.field.spacingDensity": "Densidade de espaçamento",
"settings.openchamber.visual.actions.resetSpacingAria": "Redefinir espaçamento",
"settings.openchamber.visual.field.inputBarOffset": "Deslocamento da barra de entrada",
@@ -1607,6 +1723,16 @@ export const settingsDict = {
"settings.openchamber.visual.field.userMessageRenderingAria": "Renderizado de mensagens do usuário: {option}",
"settings.openchamber.visual.field.mermaidRenderingAria": "Renderizado de Mermaid: {option}",
"settings.openchamber.visual.field.diffLayoutAria": "Layout de comparação: {option}",
"settings.openchamber.visual.field.sessionRecap": "Gerar resumo da sessão",
"settings.openchamber.visual.field.sessionRecapAria": "Gerar um resumo quando o agente termina",
"settings.openchamber.visual.field.sessionSuggestion": "Gerar sugestão da próxima mensagem do usuário",
"settings.openchamber.visual.field.sessionSuggestionAria": "Gerar uma próxima mensagem sugerida do usuário quando o agente termina",
"settings.openchamber.visual.field.sessionGoal": "Habilitar objetivos de sessão",
"settings.openchamber.visual.field.sessionGoalAria": "Manter a sessão trabalhando automaticamente em direção a um objetivo",
"settings.openchamber.visual.goal.sectionTitle": "Objetivo",
"settings.openchamber.visual.goal.budgetLabel": "Orçamento de tokens padrão",
"settings.openchamber.visual.goal.budgetAria": "Aplicar um orçamento de tokens padrão a novos objetivos",
"settings.openchamber.visual.goal.description": "Arme o botão de alvo no compositor e a próxima mensagem vira um objetivo: o agente continua trabalhando nele automaticamente, auditado pelo modelo pequeno, mesmo enquanto você está ausente.",
"settings.openchamber.visual.field.showReasoningTracesAria": "Mostrar rastros de raciocínio",
"settings.openchamber.visual.field.showReasoningTraces": "Mostrar rastros de raciocínio",
"settings.openchamber.visual.field.collapsibleThinkingBlocksAria": "Habilitar blocos de raciocínio recolhíveis",
@@ -1623,6 +1749,8 @@ export const settingsDict = {
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Ações inline do assistente",
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Mostra Copiar resposta, Salvar como imagem e Ler em voz alta em blocos de texto do assistente que aparecem antes de chamadas de ferramenta posteriores na mesma resposta.",
"settings.openchamber.visual.field.showToolFileIconsAria": "Mostrar ícones de arquivos de ferramentas",
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Quebrar linhas de blocos de código",
"settings.openchamber.visual.field.codeBlockLineWrap": "Quebrar linhas de blocos de código",
"settings.openchamber.visual.field.showToolFileIcons": "Mostrar ícones de arquivos de ferramentas",
"settings.openchamber.visual.field.showTurnChangedFilesAria": "Mostrar arquivos alterados em turnos concluídos",
"settings.openchamber.visual.field.showTurnChangedFiles": "Mostrar arquivos alterados em turnos concluídos",
@@ -1784,4 +1912,10 @@ export const settingsDict = {
"settings.promptTemplates.page.toast.created": "Template criado",
"settings.promptTemplates.page.toast.createFailed": "Falha ao criar template",
"settings.promptTemplates.page.toast.saveUnexpectedError": "Ocorreu um erro inesperado ao salvar",
"settings.openchamber.visual.section.followUpBehavior": "Follow-up behavior",
"settings.openchamber.visual.section.followUpBehaviorAria": "Follow-up behavior",
"settings.openchamber.visual.field.followUpBehaviorAria": "Follow-up behavior: {option}",
"settings.openchamber.visual.field.followUpBehaviorDescription": "Choose what happens when you press Enter on a follow-up message while the agent is still responding.",
"settings.openchamber.visual.option.followUpBehavior.steer.label": "Steer",
"settings.openchamber.visual.option.followUpBehavior.queue.label": "Queue",
} as const;
+149 -1
View File
@@ -14,6 +14,7 @@ export const dict: Record<I18nKey, string> = {
"common.language.brazilianPortuguese": "Português brasileiro",
"common.language.korean": "Coreano",
"common.language.polish": "Polonês",
"common.language.japanese": "Japonês",
"common.revealPath.finder": "Mostrar no Finder",
"common.revealPath.fileExplorer": "Abrir no File Explorer",
"common.revealPath.fileManager": "Abrir no gerenciador de arquivos",
@@ -22,6 +23,13 @@ export const dict: Record<I18nKey, string> = {
"pwa.installPrompt.dismiss": "Dispensar",
"pwa.installPrompt.started": "Instalação iniciada",
"pwa.installPrompt.installed": "OpenChamber instalado",
"shareOpinion.actions.shareOpinion": "Compartilhar opinião",
"shareOpinion.actions.bookCall": "Agendar chamada",
"shareOpinion.actions.shortSurvey": "Pesquisa breve",
"shareOpinion.dialog.title": "Compartilhe sua opinião",
"shareOpinion.toast.title": "Ajude a moldar o OpenChamber",
"shareOpinion.toast.description": "Conte o que é útil, confuso ou está faltando para ajudar a definir os próximos passos.",
"sessions.sidebar.footer.actions.shareOpinion": "Compartilhar opinião",
"layout.mainTab.chat": "Chat",
"layout.mainTab.plan": "Plano",
"layout.mainTab.diff": "Diff",
@@ -30,6 +38,50 @@ export const dict: Record<I18nKey, string> = {
"layout.mainTab.terminal": "Terminal",
"layout.mainTab.context": "Contexto",
"mobile.nav.aria": "Navegação móvel",
"mobile.connect.welcome.title": "Conectar ao OpenChamber",
"mobile.connect.welcome.description": "Adicione a URL de um servidor ou leia um código QR de pareamento para começar a usar o app móvel.",
"mobile.connect.url.label": "URL do servidor",
"mobile.connect.url.placeholder": "http://192.168.1.74:2606",
"mobile.connect.token.label": "Token do cliente",
"mobile.connect.token.placeholder": "Cole o token de acesso",
"mobile.connect.token.hint": "Só é necessário se o seu servidor exigir um token em vez de senha.",
"mobile.connect.password.label": "Senha",
"mobile.connect.password.placeholder": "Senha do OpenChamber",
"mobile.connect.connectButton": "Conectar",
"mobile.connect.unlockButton": "Desbloquear e conectar",
"mobile.connect.cancelPassword": "Usar outro servidor",
"mobile.connect.connecting": "Conectando...",
"mobile.connect.scanQr": "Ler código QR",
"mobile.connect.welcome.scanHint": "No seu computador, abra «Adicionar um dispositivo» para mostrar um código QR e escaneie aqui.",
"mobile.connect.advanced": "Avançado",
"mobile.connect.manual.toggle": "Conectar por endereço",
"mobile.connect.scan.permissionDenied": "O acesso à câmera está desativado. Ative-o nos Ajustes para ler um código QR.",
"mobile.connect.scan.failed": "Não foi possível ler esse código QR. Tente novamente ou digite a URL manualmente.",
"mobile.connect.scan.invalid": "Esse código QR não é um código de conexão do OpenChamber.",
"mobile.connect.scan.unsupported": "A leitura de QR só está disponível no app móvel instalado.",
"mobile.connect.saved.title": "Conexões salvas",
"mobile.connect.saved.empty": "Nenhuma conexão salva ainda.",
"mobile.connect.relay.badge": "via OpenChamber Relay",
"mobile.connect.error.urlRequired": "Informe a URL de um servidor.",
"mobile.connect.error.invalidUrl": "Essa URL de servidor não é válida.",
"mobile.connect.error.unreachable": "Não foi possível acessar esse servidor OpenChamber.",
"mobile.connect.error.authRequired": "Este servidor requer uma senha ou token do cliente.",
"mobile.connect.error.passwordFailed": "Não foi possível desbloquear esse servidor. Verifique a senha.",
"mobile.instances.addTitle": "Adicionar instância",
"mobile.instances.addManual": "Adicionar por endereço",
"mobile.instances.editTitle": "Editar instância",
"mobile.instances.edit": "Editar",
"mobile.instances.delete": "Excluir",
"mobile.instances.deleteAria": "Excluir {label}",
"mobile.instances.confirmDeleteAria": "Confirmar exclusão de {label}",
"mobile.instances.cancelDeleteAria": "Manter {label}",
"mobile.instances.cancelEdit": "Cancelar",
"mobile.instances.label.label": "Nome",
"mobile.instances.label.placeholder": "Nome de exibição opcional",
"mobile.instances.saveNew": "Salvar instância",
"mobile.instances.status.connectedDirect": "Conectado · Rede local",
"mobile.instances.status.connectedRelay": "Conectado · Relay privado",
"mobile.instances.saveEdit": "Salvar alterações",
"mobile.nav.changes": "Alterações",
"mobile.nav.settings": "Configurações",
"mobile.surface.closeAria": "Fechar",
@@ -42,6 +94,7 @@ export const dict: Record<I18nKey, string> = {
"mobile.menu.files": "Arquivos",
"mobile.menu.changes": "Alterações",
"mobile.menu.mcp": "MCP",
"mobile.menu.instances": "Instâncias",
"mobile.menu.update": "Atualizar",
"mobile.menu.settings": "Configurações",
"mobile.sessions.newChatCta": "Novo chat em {project}",
@@ -240,6 +293,10 @@ export const dict: Record<I18nKey, string> = {
"sessions.scheduledTasks.editor.prompt.placeholder": "Resumir tarefas abertas e propor próximas ações",
"sessions.scheduledTasks.editor.enabled.aria": "Ativar tarefa",
"sessions.scheduledTasks.editor.enabled.label": "Ativado",
"sessions.scheduledTasks.editor.goal.label": "Executar como objetivo",
"sessions.scheduledTasks.editor.goal.aria": "Executar esta tarefa como um objetivo que o agente persegue até concluir",
"sessions.scheduledTasks.editor.goal.budgetLabel": "Orçamento de tokens",
"sessions.scheduledTasks.editor.goal.budgetAria": "Limitar o objetivo a um orçamento de tokens",
"sessions.scheduledTasks.editor.actions.closeAria": "Fechar",
"sessions.scheduledTasks.editor.actions.cancel": "Cancelar",
"sessions.scheduledTasks.editor.actions.save": "Salvar",
@@ -330,6 +387,7 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.header.actions.searchSessions": "Pesquisar sessões",
"sessions.sidebar.header.actions.exitSelection": "Sair da seleção",
"sessions.sidebar.header.actions.selectSessions": "Selecionar sessões",
"sessions.sidebar.header.actions.sortProjects": "Ordenar projetos",
"sessions.sidebar.header.actions.sessionDisplayMode": "Modo de visualização da sessão",
"sessions.sidebar.header.displayMode.label": "Modo de visualização",
"sessions.sidebar.header.displayMode.default": "Padrão",
@@ -338,6 +396,11 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.header.displayMode.showArchived": "Mostrar sessões arquivadas",
"sessions.sidebar.header.displayMode.collapseAll": "Recolher tudo",
"sessions.sidebar.header.displayMode.expandAll": "Expandir tudo",
"sessions.sidebar.header.projectSort.manual": "Manual",
"sessions.sidebar.header.projectSort.aToZ": "A → Z",
"sessions.sidebar.header.projectSort.zToA": "Z → A",
"sessions.sidebar.header.projectSort.dateAdded": "Mais recentes",
"sessions.sidebar.header.projectSort.recent": "Recentes",
"sessions.sidebar.header.search.matchCountSingle": "{count} correspondência",
"sessions.sidebar.header.search.matchCountPlural": "{count} correspondências",
"sessions.sidebar.header.search.escapeHint": "Esc para limpar",
@@ -382,6 +445,7 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.project.actions.projectMenu": "Menu do projeto",
"sessions.sidebar.project.actions.newSession": "Nova sessão",
"sessions.sidebar.project.actions.closeProject": "Fechar projeto",
"sessions.sidebar.project.actions.edit": "Editar",
"sessions.sidebar.project.actions.newDraftSession": "Nova sessão de rascunho",
"sessions.sidebar.session.menu.rename": "Renomear",
"sessions.sidebar.session.rename.save": "Salvar nome da sessão",
@@ -1173,6 +1237,7 @@ export const dict: Record<I18nKey, string> = {
"diffView.state.loadingRepositoryStatus": "Carregando status do repositório...",
"diffView.state.notGitRepository": "Não é um repositório Git. Use a aba Git para inicializar ou mudar de diretório.",
"diffView.state.cleanWorkingTree": "Worktree limpo, não há alterações para mostrar",
"diffView.state.noLastTurnChanges": "Não há alterações do último turno para exibir",
"diffView.state.failedToLoadDiff": "Não foi possível carregar a diferencia",
"diffView.state.loadingDiff": "Carregando diff...",
"diffView.state.loadingChanges": "Carregando alterações...",
@@ -1182,6 +1247,7 @@ export const dict: Record<I18nKey, string> = {
"diffView.summary.changedFilesPlural": "{count} arquivos modificados",
"diffView.scope.changed": "Alteradas",
"diffView.scope.staged": "Staged",
"diffView.scope.lastTurn": "Último turno",
"diffView.scope.selectorAria": "Selecionar modo de alterações",
"diffView.actions.retry": "Tentar novamente",
"diffView.actions.renderAnyway": "Renderizar mesmo assim",
@@ -1198,12 +1264,32 @@ export const dict: Record<I18nKey, string> = {
'diffView.reviewDialog.title': 'Revisar alterações',
'diffView.reviewDialog.description': 'Inicia uma sessão de revisão separada para as alterações atuais.',
'diffView.reviewDialog.generateHandoff': 'Gerar handoff',
'diffView.reviewDialog.autoReview': 'Executar ciclo de revisão automática',
'diffView.reviewDialog.info': 'Este fluxo funciona melhor quando iniciado na sessão em que as alterações foram implementadas.',
'diffView.reviewDialog.actions.cancel': 'Cancelar',
'diffView.reviewDialog.actions.start': 'Revisar',
'diffView.reviewDialog.actions.starting': 'Iniciando...',
'diffView.reviewDialog.toast.noSessionDirectory': 'O diretório da sessão está indisponível',
'diffView.reviewDialog.toast.startFailed': 'Falha ao iniciar o fluxo de revisão',
'chat.dictation.start': 'Iniciar ditado',
'chat.dictation.overlayAria': 'Ditado',
'chat.dictation.downloadingModel': 'Baixando o modelo de fala...',
'chat.dictation.downloadingModelProgress': 'Baixando o modelo de fala... {percent}%',
'chat.dictation.listening': 'Ouvindo...',
'chat.dictation.processing': 'Transcrevendo...',
'chat.dictation.failed': 'Falha na transcrição',
'chat.dictation.cancel': 'Descartar ditado',
'chat.dictation.insert': 'Inserir transcrição',
'chat.dictation.insertAndSend': 'Inserir e enviar',
'chat.dictation.retry': 'Tentar transcrever novamente',
'chat.dictation.discard': 'Descartar gravação',
'chat.history.loadOlder': 'Carregar mensagens anteriores',
'chat.autoReview.title': 'O ciclo de revisão de código está em andamento',
'chat.autoReview.status.waitingForReviewer': 'Aguardando o revisor',
'chat.autoReview.status.waitingForImplementer': 'Aguardando o implementador',
'chat.autoReview.reviewSessionLabel': 'Sessão de revisão',
'chat.autoReview.actions.open': 'Abrir',
'chat.autoReview.actions.stop': 'Parar',
"diffView.hunk.label": "Trechos",
"diffView.hunk.stage": "Preparar",
"diffView.hunk.unstage": "Remover",
@@ -1305,6 +1391,43 @@ export const dict: Record<I18nKey, string> = {
"header.actions.toggleChangesPanelAria": "Alternar painel de alterações",
"header.actions.planWithShortcut": "Plano ({shortcut})",
"header.actions.terminalPanelWithShortcut": "Painel de terminal ({shortcut})",
"chat.recap.aria": "Resumo da sessão",
"chat.recap.label": "Resumo:",
"chat.goal.dialog.titleCreate": "Definir objetivo da sessão",
"chat.goal.dialog.titleManage": "Objetivo da sessão",
"chat.goal.dialog.objectiveLabel": "Objetivo",
"chat.goal.dialog.objectivePlaceholder": "Descreva o estado final que o agente deve alcançar e verificar…",
"chat.goal.dialog.budgetLabel": "Orçamento de tokens",
"chat.goal.status.active": "Ativo",
"chat.goal.status.evaluating": "Avaliando…",
"chat.goal.status.paused": "Pausado",
"chat.goal.status.blocked": "Bloqueado",
"chat.goal.status.budgetLimited": "Orçamento atingido",
"chat.goal.status.complete": "Concluído",
"chat.goal.usage.tokens": "{used} tokens",
"chat.goal.usage.tokensWithBudget": "{used}/{budget} tokens",
"chat.goal.usage.turns": "{turns} continuações",
"chat.goal.action.pause": "Pausar",
"chat.goal.action.resume": "Retomar",
"chat.goal.action.markComplete": "Marcar como concluído",
"chat.goal.action.clear": "Remover objetivo",
"chat.goal.action.cancel": "Cancelar",
"chat.goal.action.save": "Salvar objetivo",
"chat.goal.action.start": "Iniciar objetivo",
"chat.goal.toast.actionFailed": "Falha ao atualizar o objetivo",
"chat.goal.row.aria": "Objetivo da sessão — abrir detalhes",
"chat.goal.button.createAria": "Definir um objetivo da sessão",
"chat.goal.button.manageAria": "Gerenciar objetivo da sessão",
"chat.goal.button.armAria": "Iniciar um objetivo com a próxima mensagem",
"chat.goal.counter.aria": "Limite de comprimento do objetivo",
"chat.goal.button.disarmAria": "Objetivo armado — toque para desarmar",
"chat.goal.button.cancelAria": "Objetivo em andamento — toque para cancelar",
"chat.goal.cancelDialog.title": "Cancelar este objetivo?",
"chat.goal.cancelDialog.description": "O agente deixará de trabalhar automaticamente neste objetivo.",
"chat.goal.cancelDialog.keep": "Manter objetivo",
"chat.goal.cancelDialog.confirm": "Cancelar objetivo",
"chat.suggestion.applyAria": "Usar mensagem sugerida",
"chat.suggestion.dismissAria": "Dispensar sugestão",
"header.actions.toggleTerminalPanelAria": "Mostrar ou ocultar painel de terminal",
"terminalView.stream.processExitedMessage": "\r\n[Processo encerrado{exitCodeSegment}{signalSegment}]\r\n",
"terminalView.stream.processExitedWithCode": " com código {exitCode}",
@@ -1686,6 +1809,7 @@ export const dict: Record<I18nKey, string> = {
"chat.queuedMessage.edit": "edit",
"chat.queuedMessage.send": "send",
"chat.queuedMessage.removeAria": "Excluir da fila",
"chat.queuedMessage.reorderAria": "Arraste para reordenar",
"chat.container.returnToParent.aria": "Voltar para a sessão principal",
"chat.container.returnToParent.titleNamed": "Voltar para: {title}",
"chat.container.returnToParent.title": "Voltar para a sessão principal",
@@ -1825,6 +1949,9 @@ export const dict: Record<I18nKey, string> = {
"chat.chatInput.previewContextRemove": "Remover contexto da visualização",
"chat.chatInput.projectRoot": "Raiz do projeto",
"chat.chatInput.branch": "Branch",
"chat.chatInput.draftPicker.projectTitle": "Projeto",
"chat.chatInput.draftPicker.searchProjects": "Buscar projetos...",
"chat.chatInput.draftPicker.searchBranches": "Buscar branches...",
"chat.chatInput.worktrees": "Worktrees",
"chat.chatInput.worktreeNew": "+ Novo",
"chat.chatInput.drop.insertMention": "Solte para inserir como menção",
@@ -1850,6 +1977,11 @@ export const dict: Record<I18nKey, string> = {
"chat.toolOutputDialog.image.closeAria": "Fechar prévia de imagem",
"chat.toolOutputDialog.mermaid.missingSource": "Falta a URL de origem do Mermaid.",
"chat.toolOutputDialog.mermaid.loadFailed": "Não foi possível carregar o diagrama de Mermaid.",
"chat.toolOutputDialog.mermaid.dataUrlMalformed": "A URL de dados do Mermaid está malformada.",
"chat.toolOutputDialog.mermaid.invalidLocalPath": "O caminho do arquivo local do Mermaid é inválido.",
"chat.toolOutputDialog.mermaid.readFileFailedWithStatus": "Não foi possível ler o arquivo Mermaid. Status: {status}.",
"chat.toolOutputDialog.mermaid.unsupportedUrlProtocol": "O protocolo da URL do Mermaid não é compatível.",
"chat.toolOutputDialog.mermaid.loadFailedWithStatus": "Não foi possível carregar o diagrama Mermaid. Status: {status}.",
"chat.toolOutputDialog.mermaid.closeAria": "Fechar prévia do diagrama",
"chat.toolOutputDialog.mermaid.loading": "Carregando diagrama...",
"chat.toolOutputDialog.mermaid.renderFailed": "Não foi possível renderizar o diagrama de Mermaid.",
@@ -1864,6 +1996,9 @@ export const dict: Record<I18nKey, string> = {
"chat.toolPart.output": "Saída",
"chat.toolPart.showRawJson": "Mostrar JSON bruto",
"chat.toolPart.showFormattedJson": "Mostrar JSON formatado",
"chat.toolPart.showNavigableJson": "Mostrar JSON navegável",
"chat.toolPart.openFileAtFirstChange": "Abrir arquivo na primeira alteração",
"chat.toolPart.openFileDiff": "Abrir diferenças do arquivo",
"chat.toolPart.copyOutput": "Copiar saída",
"chat.toolPart.copiedOutput": "Saída copiada",
"chat.toolPart.copyOutputFailed": "Falha ao copiar saída",
@@ -1957,6 +2092,7 @@ export const dict: Record<I18nKey, string> = {
"chat.modelControls.noProvidersOrModelsFound": "Nenhum provedor ou modelo corresponde à sua pesquisa.",
"chat.modelControls.reorderFavoriteAria": "Reordenar favorito",
"chat.modelControls.reorderFavoriteTitle": "Arraste para reordenar favorito",
"chat.modelControls.reorderProviderTitle": "Arraste para reordenar provedor",
"chat.modelControls.permissionLabel.custom": "Personalizado",
"chat.modelControls.permissionLabel.allow": "Permitir",
"chat.modelControls.permissionLabel.deny": "Negar",
@@ -2197,7 +2333,7 @@ export const dict: Record<I18nKey, string> = {
"sessionAuth.error.networkTitle": "Não é possível acessar o servidor",
"sessionAuth.error.rateLimitDescriptionSingle": "Aguarde {minutes} minuto antes de tentar novamente.",
"sessionAuth.error.rateLimitDescriptionPlural": "Aguarde {minutes} minutos antes de tentar novamente.",
"sessionAuth.error.networkDescription": "Não foi possível verificar a sessão da interface. Confira se o serviço está em execução e tente novamente.",
"sessionAuth.error.networkDescription": "Não foi possível verificar a sessão da interface. Se você estiver abrindo o OpenChamber de outro dispositivo na sua rede local, ative o Desktop Network Access no app para desktop e use o endereço LAN mostrado em Configurações.",
"sessionAuth.error.retry": "Tentar novamente",
"sessionAuth.error.passkeySetupFailed": "Não foi possível configurar a chave de acesso.",
"sessionAuth.error.incorrectPassword": "Senha incorreta. Tente novamente.",
@@ -2484,9 +2620,14 @@ export const dict: Record<I18nKey, string> = {
"updateDialog.status.downloading": "Baixando...",
"updateDialog.actions.restartToUpdate": "Reiniciar para atualizar",
"updateDialog.actions.updateNow": "Atualizar agora",
"updateDialog.actions.openMobileUpdate": "Abrir atualização",
"updateDialog.status.updating": "Atualizando...",
"updateDialog.error.updateFailed": "Não foi possível atualizar",
"updateDialog.error.takingLonger": "A atualização está demorando mais do que o esperado. Aguarde um pouco e atualize, ou execute: openchamber update",
"mobileUpdate.toast.available.title": "Atualização do OpenChamber disponível",
"mobileUpdate.toast.available.description": "A versão {version} está pronta para Android.",
"mobileUpdate.toast.actions.download": "Baixar",
"mobileUpdate.toast.actions.dismiss": "Dispensar",
"opencodeUpdate.toast.available.title": "Atualização do OpenCode",
"opencodeUpdate.toast.available.description": "Versão {version} disponível.",
"opencodeUpdate.toast.actions.update": "Atualizar",
@@ -2562,12 +2703,19 @@ export const dict: Record<I18nKey, string> = {
"mainLayout.mobile.closeDrawerAria": "Fechar gaveta",
"sortableTabsStrip.aria.tabs": "Abas",
"openChamberLogo.aria.logo": "Logo do OpenChamber",
"markdownRenderer.code.actions.copyTitle": "Copiar código",
"markdownRenderer.code.actions.copiedTitle": "Copiado",
"markdownRenderer.table.actions.copyTitle": "Copiar tabela",
"markdownRenderer.code.actions.enableWrapTitle": "Ativar quebra de linha",
"markdownRenderer.code.actions.disableWrapTitle": "Desativar quebra de linha",
"markdownRenderer.table.actions.downloadTitle": "Baixar tabela",
"markdownRenderer.table.toast.downloadedAsFormat": "Tabela baixada como {format}",
"markdownRenderer.mermaid.actions.copyTitle": "Copiar",
"markdownRenderer.mermaid.actions.copySourceTitle": "Copiar origem",
"markdownRenderer.mermaid.actions.downloadSvgTitle": "Baixar SVG",
"markdownRenderer.mermaid.actions.zoomInTitle": "Aumentar zoom",
"markdownRenderer.mermaid.actions.zoomOutTitle": "Diminuir zoom",
"markdownRenderer.mermaid.actions.resetViewTitle": "Redefinir visualização",
"markdownRenderer.mermaid.toast.downloadFailed": "Não foi possível baixar o diagrama",
"contextPanel.preview.title": "Visualização",
"contextPanel.preview.description": "Use Ações do projeto ou o botão Preview do terminal para abrir uma visualização.",
@@ -220,11 +220,18 @@ export const settingsDict = {
"settings.remoteInstances.direct.sidebarTitle": "Посилання на сервери",
"settings.remoteInstances.direct.sidebarDescription": "Підключення через посилання або токен",
"settings.remoteInstances.direct.title": "Інші сервери OpenChamber",
"settings.remoteInstances.direct.description": "Додайте інший сервер OpenChamber за URL. Використовуйте це, коли сервер уже запущений і у вас є токен підключення.",
"settings.remoteInstances.direct.description": "Сервери, на які може перемикатися цей застосунок. Імпортуйте лінк підключення з іншого сервера або додайте за адресою.",
"settings.remoteInstances.direct.addDialog.description": "Додайте інший сервер OpenChamber за URL. Використовуйте це, коли сервер уже запущений і у вас є токен підключення.",
"settings.remoteInstances.direct.field.labelPlaceholder": "Назва (необов’язково)",
"settings.remoteInstances.direct.field.urlPlaceholder": "https://host:port",
"settings.remoteInstances.direct.field.tokenPlaceholder": "Токен підключення (необов’язково для довірених локальних серверів)",
"settings.remoteInstances.direct.note": "Токени підключення зберігаються на цьому пристрої й використовуються лише коли цей застосунок підключається до відповідного сервера.",
"settings.remoteInstances.direct.headers.title": "Additional headers",
"settings.remoteInstances.direct.headers.description": "Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.",
"settings.remoteInstances.direct.headers.field.namePlaceholder": "Header name",
"settings.remoteInstances.direct.headers.field.valuePlaceholder": "Header value",
"settings.remoteInstances.direct.headers.actions.add": "Add header",
"settings.remoteInstances.direct.headers.removeAria": "Remove header",
"settings.remoteInstances.direct.actions.add": "Додати сервер",
"settings.remoteInstances.direct.import.description": "Вставте посилання для підключення з іншого сервера OpenChamber.",
"settings.remoteInstances.direct.import.placeholder": "openchamber://connect?...",
@@ -234,20 +241,74 @@ export const settingsDict = {
"settings.remoteInstances.direct.state.empty": "Інших серверів ще не додано.",
"settings.remoteInstances.clientAuth.title": "Підключення до цього сервера",
"settings.remoteInstances.clientAuth.description": "Створіть безпечне посилання або токен, щоб OpenChamber Desktop міг підключитися до цього сервера.",
"settings.remoteInstances.clientAuth.field.labelPlaceholder": "Назва пристрою (необов’язково)",
"settings.remoteInstances.clientAuth.field.labelPlaceholder": "Назва пристрою — напр. Мій iPhone",
"settings.remoteInstances.clientAuth.actions.create": "Створити токен",
"settings.remoteInstances.clientAuth.actions.pair": "Створити посилання",
"settings.remoteInstances.clientAuth.actions.revoke": "Відкликати",
"settings.remoteInstances.clientAuth.actions.clearRevoked": "Очистити відкликані",
"settings.remoteInstances.clientAuth.qrAlt": "QR-код підключення OpenChamber",
"settings.remoteInstances.clientAuth.qrEnlarge": "Збільшити QR-код",
"settings.remoteInstances.clientAuth.qrScanHint": "Скануй це застосунком OpenChamber на іншому пристрої. Одноразовий і має термін дії.",
"settings.remoteInstances.clientAuth.qrDialogTitle": "Сканувати для підключення",
"settings.remoteInstances.clientAuth.actions.addDevice": "Додати пристрій",
"settings.remoteInstances.clientAuth.actions.copied": "Скопійовано",
"settings.remoteInstances.clientAuth.addDevice.transportLabel": "Де ви будете користуватись цим пристроєм?",
"settings.remoteInstances.clientAuth.addDevice.subtitle": "Створіть одноразовий QR-код, який підключить інший пристрій до цього сервера.",
"settings.remoteInstances.clientAuth.addDevice.transport.local": "Лише цей компʼютер",
"settings.remoteInstances.clientAuth.addDevice.transport.localHint": "Для застосунків на цій самій машині.",
"settings.remoteInstances.clientAuth.addDevice.transport.lan": "Лише домашня мережа",
"settings.remoteInstances.clientAuth.addDevice.transport.lanHint": "Підключається напряму через ваш Wi-Fi. Поза цією мережею не працює.",
"settings.remoteInstances.clientAuth.addDevice.transport.relay": "Будь-де",
"settings.remoteInstances.clientAuth.addDevice.transport.relayHint": "Працює вдома і поза домом. Поза домом трафік іде через OpenChamber Private Relay — наскрізно зашифрований тунель. Нічого налаштовувати не треба.",
"settings.remoteInstances.clientAuth.addDevice.fallback.relay": "Також дозволити зашифрований relay поза домом",
"settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal": "Віддавати перевагу прямому домашньому підключенню, коли доступне",
"settings.remoteInstances.clientAuth.addDevice.create": "Створити QR-код",
"settings.remoteInstances.clientAuth.addDevice.done": "Готово",
"settings.remoteInstances.clientAuth.addDevice.connectedToast": "Пристрій підключено.",
"settings.remoteInstances.clientAuth.pairingUrl": "Посилання для підключення",
"settings.remoteInstances.clientAuth.createdToken": "Скопіюйте цей токен зараз. З міркувань безпеки він більше не показуватиметься.",
"settings.remoteInstances.clientAuth.state.loading": "Завантаження токенів...",
"settings.remoteInstances.clientAuth.state.empty": "Жоден пристрій ще не підключено.",
"settings.remoteInstances.clientAuth.state.revoked": "Відкликано",
"settings.remoteInstances.clientAuth.state.thisDevice": "Цей пристрій",
"settings.remoteInstances.clientAuth.state.pending": "Очікує підключення…",
"settings.remoteInstances.clientAuth.state.viaRelay": "Relay",
"settings.remoteInstances.clientAuth.state.connectedDirect": "Підключено · Локальна мережа",
"settings.remoteInstances.clientAuth.state.connectedRelay": "Підключено · Relay",
"settings.remoteInstances.clientAuth.lastUsed": "Останнє використання {date}",
"settings.remoteInstances.clientAuth.neverUsed": "Ще не використовувався",
"settings.remoteInstances.relay.title": "OpenChamber Relay",
"settings.remoteInstances.relay.autoHint": "Вмикається автоматично, коли ти паруєш пристрій через relay.",
"settings.remoteInstances.relay.description": "Дозволяє вашим іншим пристроям підключатися звідки завгодно без відкриття портів. Трафік шифрується наскрізно — релей не може його прочитати.",
"settings.remoteInstances.relay.enableHint": "Нічого не передається, доки ви не увімкнете релей на цьому сервері.",
"settings.remoteInstances.relay.actions.enable": "Увімкнути Relay",
"settings.remoteInstances.relay.actions.disable": "Вимкнути",
"settings.remoteInstances.relay.confirm.disable": "Вимкнути релей? Пристрої, підключені через нього, будуть негайно відключені.",
"settings.remoteInstances.relay.state.loading": "Перевірка стану релею...",
"settings.remoteInstances.relay.state.disabled": "Вимкнено",
"settings.remoteInstances.relay.state.connecting": "Підключення",
"settings.remoteInstances.relay.state.connected": "Підключено",
"settings.remoteInstances.relay.state.reconnecting": "Повторне підключення",
"settings.remoteInstances.relay.state.error": "Помилка",
"settings.remoteInstances.relay.status.clientsOne": "Підключено пристроїв: {count}",
"settings.remoteInstances.relay.status.clientsMany": "Підключено пристроїв: {count}",
"settings.remoteInstances.relay.pair.title": "Спарувати пристрій",
"settings.remoteInstances.relay.pair.labelPlaceholder": "Назва пристрою (необов'язково)",
"settings.remoteInstances.relay.pair.includeToken": "Додати токен доступу (спарювання одним скануванням)",
"settings.remoteInstances.relay.pair.noTokenHint": "Без токена пристрій після підключення входить за паролем інтерфейсу цього сервера.",
"settings.remoteInstances.relay.pair.generate": "Створити посилання для спарювання",
"settings.remoteInstances.relay.pair.requiresConnected": "Спарювання стане доступним після підключення релею.",
"settings.remoteInstances.relay.pair.linkLabel": "Посилання для спарювання",
"settings.remoteInstances.relay.pair.warning": "Це посилання надає доступ до цього сервера. Не діліться ним.",
"settings.remoteInstances.relay.pair.qrAlt": "QR-код спарювання релею",
"settings.remoteInstances.relay.pair.showQr": "Показати QR-код",
"settings.remoteInstances.relay.pair.qrDialogTitle": "Скануйте для спарювання",
"settings.remoteInstances.relay.pair.qrDialogDescription": "Відскануйте цей QR-код застосунком OpenChamber на іншому пристрої.",
"settings.remoteInstances.relay.pair.manageHint": "Керуйте спареними пристроями або відкликайте їх у списку «Підключення до цього сервера» вище.",
"settings.remoteInstances.relay.toast.enableFailed": "Не вдалося увімкнути релей",
"settings.remoteInstances.relay.toast.disableFailed": "Не вдалося вимкнути релей",
"settings.remoteInstances.relay.toast.offerFailed": "Не вдалося створити посилання для спарювання",
"settings.remoteInstances.relay.toast.linkCopied": "Посилання для спарювання скопійовано",
"settings.remoteInstances.sidebar.phase.ready": "Готово",
"settings.remoteInstances.sidebar.phase.error": "Помилка",
"settings.remoteInstances.sidebar.phase.reconnect": "Повторне підключення",
@@ -365,12 +426,14 @@ export const settingsDict = {
"settings.agents.sidebar.toast.agentExists": "Агент із такою назвою вже існує",
"settings.agents.sidebar.toast.removeOldAfterRenameFailed": "Не вдалося видалити старого агента після перейменування",
"settings.agents.sidebar.toast.renameFailed": "Не вдалося перейменувати агента",
"settings.agents.sidebar.toast.agentRenamed": "Агента перейменовано на \"{name}\"",
"settings.agents.page.toast.permissionNameRequired": "Потрібна назва дозволу",
"settings.agents.page.toast.created": "Агент створено успішно",
"settings.agents.page.toast.updated": "Агент успішно оновлено",
"settings.agents.page.toast.createFailed": "Не вдалося створити агента",
"settings.agents.page.toast.updateFailed": "Не вдалося оновити агента",
"settings.agents.page.toast.saveUnexpectedError": "Під час збереження сталася помилка",
"settings.agents.page.toast.savedManualRestart": "Збережено на диск. Перезапустіть підключений сервер OpenCode, щоб застосувати зміни.",
"settings.agents.page.empty.title": "Виберіть агента на бічній панелі",
"settings.agents.page.empty.description": "або створіть нового",
"settings.agents.page.title.new": "Новий агент",
@@ -387,6 +450,10 @@ export const settingsDict = {
"settings.agents.page.field.mode": "Режим",
"settings.agents.page.field.modeTooltip": "Видимість основного або субагента",
"settings.agents.page.field.overrideModel": "Перевизначити модель",
"settings.agents.page.field.variant": "Варіант мислення",
"settings.agents.page.field.variantTooltip": "Необов'язково. Якщо модель підтримує міркування, варіант контролює глибину міркування.",
"settings.agents.page.field.variantHint": "Специфічно для моделі (напр. варіант Anthropic)",
"settings.agents.page.field.variantPlaceholder": "напр. high, max, low, none",
"settings.agents.page.field.temperature": "Температура",
"settings.agents.page.field.temperatureTooltip": "Контролює випадковість. Вищий = творчий, нижчий = зосереджений.",
"settings.agents.page.field.temperatureRange": "0,0 до 2,0",
@@ -500,6 +567,7 @@ export const settingsDict = {
"settings.gitIdentities.editor.description.globalReadOnly": "Глобальна Git-ідентичність (лише для читання)",
"settings.gitIdentities.editor.description.newProfile": "Створити новий профіль Git-ідентичності",
"settings.gitIdentities.editor.description.editProfile": "Редагувати налаштування профілю ідентичності",
"settings.gitIdentities.editor.section.commitSigning": "Підписування комітів",
"settings.gitIdentities.editor.field.profileName": "Ім'я профілю",
"settings.gitIdentities.editor.field.profileNamePlaceholder": "Робочий профіль, особистий тощо.",
"settings.gitIdentities.editor.field.color": "Колір",
@@ -515,6 +583,9 @@ export const settingsDict = {
"settings.gitIdentities.editor.field.sshKeyPath": "Шлях до SSH-ключа",
"settings.gitIdentities.editor.field.sshKeyPathTooltip": "Додатковий шлях до закритого ключа. напр. ~/.ssh/id_ed25519",
"settings.gitIdentities.editor.field.sshKeyPathPlaceholder": "~/.ssh/id_ed25519",
"settings.gitIdentities.editor.field.signCommits": "Підписувати коміти цією ідентичністю",
"settings.gitIdentities.editor.field.signingKey": "Ключ підпису",
"settings.gitIdentities.editor.field.signingKeyPlaceholder": "~/.ssh/id_ed25519.pub",
"settings.gitIdentities.editor.field.host": "Хост",
"settings.gitIdentities.editor.field.hostTooltip": "Токен буде зчитано з облікових даних ~/.git для цього хосту.",
"settings.gitIdentities.editor.field.hostPlaceholder": "github.com",
@@ -523,6 +594,7 @@ export const settingsDict = {
"settings.gitIdentities.editor.actions.save": "Зберегти",
"settings.gitIdentities.editor.toast.userNameEmailRequired": "Необхідно вказати ім’я користувача та електронну адресу",
"settings.gitIdentities.editor.toast.hostRequiredForToken": "Для автентифікації на основі токенів потрібен хост",
"settings.gitIdentities.editor.toast.signingKeyRequired": "Потрібен ключ підпису, коли ввімкнено підписування комітів",
"settings.gitIdentities.editor.toast.profileCreated": "Профіль створено",
"settings.gitIdentities.editor.toast.profileUpdated": "Профіль оновлено",
"settings.gitIdentities.editor.toast.createProfileFailed": "Не вдалося створити профіль",
@@ -772,7 +844,13 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.title": "Мережевий доступ десктопного застосунку",
"settings.openchamber.desktopNetwork.field.launchAtLoginAria": "Запускати OpenChamber під час входу в систему",
"settings.openchamber.desktopNetwork.field.launchAtLogin": "Запускати OpenChamber під час входу в систему",
"settings.openchamber.desktopNetwork.field.launchAtLoginDescription": "Запускає застосунок у фоні без відкриття вікна. Щоб відкрити його, натисніть іконку в Dock.",
"settings.openchamber.desktopNetwork.field.launchAtLoginDescription": "Запускає застосунок у фоні без відкриття вікна. Відкрийте його через піктограму стану на робочому столі.",
"settings.openchamber.desktopNetwork.field.minimizeToTrayAria": "Згортати й закривати OpenChamber у системний трей",
"settings.openchamber.desktopNetwork.field.minimizeToTray": "Згортати й закривати в системний трей",
"settings.openchamber.desktopNetwork.field.minimizeToTrayDescription": "Залишає OpenChamber запущеним у системному треї Windows, коли головне вікно згорнуто або закрито.",
"settings.openchamber.desktopNetwork.field.keepAwakeAria": "Не давати комп’ютеру засинати, поки OpenChamber запущено",
"settings.openchamber.desktopNetwork.field.keepAwake": "Не давати комп’ютеру засинати, поки OpenChamber запущено",
"settings.openchamber.desktopNetwork.field.keepAwakeDescription": "Щоб телефон і далі міг відкривати застосунок. Екран усе одно може вимикатися.",
"settings.openchamber.desktopNetwork.field.allowLanAccessAria": "Дозволити LAN-доступ до десктопного застосунку",
"settings.openchamber.desktopNetwork.field.allowLanAccess": "Дозволити іншим пристроям у локальній мережі відкривати цей застосунок",
"settings.openchamber.desktopNetwork.field.allowLanAccessDescription": "Перезапускає застосунок, щоб телефони, планшети та інші комп’ютери в мережі Wi-Fi могли його відкрити.",
@@ -789,6 +867,10 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.error.savedRestartFailed": "Збережено, але не вдалося перезапустити застосунок",
"settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported": "Запуск під час входу в систему не підтримується на цій системі",
"settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed": "Не вдалося оновити налаштування запуску під час входу в систему",
"settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported": "Фоновий режим у системному треї не підтримується на цій системі",
"settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed": "Не вдалося оновити налаштування системного трея",
"settings.openchamber.desktopNetwork.error.keepAwakeUnsupported": "Запобігання сну не підтримується на цій системі",
"settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed": "Не вдалося оновити налаштування утримання комп’ютера активним",
"settings.openchamber.opencodeCli.title": "OpenCode CLI",
"settings.openchamber.opencodeCli.tooltipPrefix": "Додатковий абсолютний шлях до",
"settings.openchamber.opencodeCli.tooltipSuffix": "бінарного файлу.",
@@ -917,6 +999,7 @@ export const settingsDict = {
"settings.openchamber.keyboardShortcuts.action.cycle_agent.label": "Перемкнути агента",
"settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label": "Перемкнути улюблену модель вперед",
"settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label": "Перемкнути улюблену модель назад",
"settings.openchamber.keyboardShortcuts.action.open_model_selector.label": "Відкрити вибір моделі",
"settings.openchamber.keyboardShortcuts.action.expand_input.label": "Розгорнути введення",
"settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label": "Відкрити хронологію розмови",
"settings.projects.sidebar.total": "Усього {count}",
@@ -926,6 +1009,8 @@ export const settingsDict = {
"settings.projects.page.section.worktree": "Worktree",
"settings.projects.page.field.projectName": "Назва проєкту",
"settings.projects.page.field.projectNamePlaceholder": "Назва проєкту",
"settings.projects.page.field.defaultModel": "Модель за замовчуванням для нових чатів",
"settings.projects.page.field.defaultModelDescription": "Використовується під час початку нового чату в цьому проєкті. Якщо не задано, застосовуються глобальні значення.",
"settings.projects.page.field.accentColor": "Колір акценту",
"settings.projects.page.field.projectIcon": "Значок проєкту",
"settings.projects.page.field.projectIconBackgroundAria": "Колір тла значка проєкту",
@@ -947,6 +1032,7 @@ export const settingsDict = {
"settings.projects.page.toast.discoverIconFailed": "Не вдалося знайти значок проєкту",
"settings.projects.page.toast.customIconAlreadySet": "Спеціальна піктограма вже встановлена для цього проєкту",
"settings.projects.page.toast.iconDiscovered": "Виявлено значок проєкту",
"settings.projects.page.toast.saveFailed": "Не вдалося зберегти налаштування проєкту",
"settings.usage.sidebar.title": "Використання",
"settings.usage.sidebar.total": "Усього {count}",
"settings.usage.sidebar.actions.toggleAutoRefreshAria": "Увімкнути автоматичне оновлення",
@@ -1082,6 +1168,9 @@ export const settingsDict = {
"settings.openchamber.worktrees.setup.commandPlaceholder": "наприклад, bun install",
"settings.openchamber.worktrees.setup.removeCommandAria": "Видалити команду",
"settings.openchamber.worktrees.setup.addCommand": "Додати команду",
"settings.openchamber.worktrees.setup.waitForCommands": "Чекати завершення команд налаштування перед створенням або надсиланням сесії",
"settings.openchamber.worktrees.setup.waitForCommandsAria": "Чекати завершення команд налаштування Worktree перед створенням або надсиланням сесії",
"settings.openchamber.worktrees.setup.toast.saveFailed": "Не вдалося зберегти команди налаштування Worktree",
"settings.openchamber.worktrees.list.title": "Наявні worktree",
"settings.openchamber.worktrees.list.tooltip": "Worktree розташовані поза репозиторієм і керуються OpenCode. Видалення worktree також видаляє пов’язані сесії.",
"settings.openchamber.worktrees.list.loading": "Завантаження worktree...",
@@ -1338,6 +1427,11 @@ export const settingsDict = {
"settings.openchamber.defaults.field.thinkingPlaceholder": "Мислення",
"settings.openchamber.defaults.field.defaultAgent": "Агент за замовчуванням",
"settings.openchamber.defaults.field.showDeletionDialogAria": "Показати діалогове вікно видалення",
"settings.openchamber.defaults.smallModel.title": "Мала модель",
"settings.openchamber.defaults.smallModel.description": "Дешева модель для швидких службових задач — коротких підсумків і резюме.",
"settings.openchamber.defaults.smallModel.useDefault": "Використовувати типову малу модель",
"settings.openchamber.defaults.smallModel.useDefaultAria": "Використовувати типову малу модель",
"settings.openchamber.defaults.smallModel.overrideModel": "Модель заміни",
"settings.openchamber.defaults.field.showDeletionDialog": "Показати діалогове вікно видалення",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Відкривати файли в режимі попереднього перегляду",
"settings.openchamber.defaults.field.openFilesPreview": "Відкривати файли в режимі попереднього перегляду",
@@ -1460,16 +1554,33 @@ export const settingsDict = {
"settings.notifications.page.toast.backgroundDisabled": "Фонові сповіщення вимкнено",
"settings.notifications.page.testNotification.title": "Тестове сповіщення",
"settings.notifications.page.testNotification.body": "Це тестове сповіщення від OpenChamber.",
"settings.voice.page.section.voiceSetup": "Налаштування голосу",
"settings.voice.page.section.speechRecognition": "Розпізнавання мовлення",
"settings.voice.page.field.enableVoiceInput": "Увімкнути голосовий ввід",
"settings.voice.page.field.enableVoiceInputAria": "Увімкнути голосовий ввід (диктування)",
"settings.voice.page.section.playbackAndSummary": "Відтворення",
"settings.voice.page.field.enableVoiceModeAria": "Увімкнути голосовий режим",
"settings.voice.page.field.enableVoiceMode": "Увімкнути голосовий режим",
"settings.voice.page.field.provider": "Провайдер",
"settings.voice.page.provider.browser": "Браузер",
"settings.voice.page.provider.custom": "Власний",
"settings.voice.page.provider.say": "Say",
"settings.voice.page.provider.server": "Сервер",
"settings.voice.page.provider.local": "Локальний",
"settings.voice.page.tooltip.sttLocal": "Локальна розшифровка на сервері OpenChamber. Моделі завантажуються автоматично; ключ API не потрібен.",
"settings.voice.page.tooltip.localTts": "Локальний синтез на сервері OpenChamber (Kokoro, англійська). Модель завантажується автоматично; ключ API не потрібен.",
"settings.voice.page.stt.model.parakeetV2": "Parakeet v2 (англійська)",
"settings.voice.page.stt.model.parakeetV3": "Parakeet v3 (25 європейських мов)",
"settings.voice.page.stt.model.whisperBase": "Whisper base (мультимовна)",
"settings.voice.page.stt.model.whisperTiny": "Whisper tiny (мультимовна)",
"settings.voice.page.stt.badge.bestForEnglish": "Найкраща для англійської",
"settings.voice.page.stt.badge.bestForMultilingual": "Найкраща мультимовна",
"settings.voice.page.stt.meta.accuracy": "Точність",
"settings.voice.page.stt.meta.speed": "Швидкість",
"settings.voice.page.stt.modelInstalled": "Модель встановлено",
"settings.voice.page.stt.modelDownloading": "Завантаження моделі...",
"settings.voice.page.stt.modelDownloadingProgress": "Завантаження моделі... {percent}%",
"settings.voice.page.stt.modelNotInstalled": "Модель не завантажено",
"settings.voice.page.stt.modelDownload": "Завантажити",
"settings.voice.page.stt.modelDelete": "Видалити модель",
"settings.voice.page.stt.modelRetry": "Повторити",
"settings.voice.page.provider.wasm": "Локально",
"settings.voice.page.stt.wasmModel": "Модель Whisper",
"settings.voice.page.stt.wasmLoaded": "Модель завантажено",
@@ -1526,6 +1637,7 @@ export const settingsDict = {
"settings.voice.page.field.ttsInputMode": "Режим вводу TTS",
"settings.voice.page.field.ttsInputModeSanitized": "Очищений текст",
"settings.voice.page.field.ttsInputModeRaw": "Сирий Markdown",
"settings.voice.page.field.ttsInputModeSummarized": "скорочений",
"settings.openchamber.visual.section.colorMode": "Режим теми",
"settings.openchamber.visual.section.mobileLayout": "Мобільний макет",
"settings.openchamber.visual.option.mobileLayout.default": "Попередній",
@@ -1558,6 +1670,8 @@ export const settingsDict = {
"settings.openchamber.visual.actions.reloadThemes": "Перезавантажити теми",
"settings.openchamber.visual.field.macVibrancy": "Прозорість вікна",
"settings.openchamber.visual.field.macVibrancyHint": "Використовувати нативне розмиття macOS (vibrancy) під сайдбаром. Вимкніть для повністю непрозорих поверхонь.",
"settings.openchamber.visual.field.dockBadge": "Лічильник у доку",
"settings.openchamber.visual.field.dockBadgeHint": "Показувати на іконці в доку кількість чатів із непрочитаною активністю.",
"settings.openchamber.visual.actions.saveAndRestart": "Зберегти та перезапустити",
"settings.openchamber.visual.actions.restarting": "Перезапуск…",
"settings.openchamber.visual.actions.reloadingThemes": "Перезавантаження тем...",
@@ -1584,10 +1698,12 @@ export const settingsDict = {
"settings.openchamber.visual.field.fontSizePercentageAria": "Розмір шрифту у відсотках",
"settings.openchamber.visual.actions.resetFontSizeAria": "Скинути розмір шрифту",
"settings.openchamber.visual.field.terminalFontSize": "Розмір шрифту терміналу",
"settings.openchamber.visual.field.editorFontSize": "Розмір шрифту редактора",
"settings.openchamber.visual.field.codeFont": "Шрифт коду",
"settings.openchamber.visual.field.selectCodeFontAria": "Вибрати шрифт коду",
"settings.openchamber.visual.actions.resetCodeFontAria": "Скинути шрифт коду",
"settings.openchamber.visual.actions.resetTerminalFontSizeAria": "Скинути розмір шрифту терміналу",
"settings.openchamber.visual.actions.resetEditorFontSizeAria": "Скинути розмір шрифту редактора",
"settings.openchamber.visual.field.spacingDensity": "Щільність інтервалу",
"settings.openchamber.visual.actions.resetSpacingAria": "Скинути інтервал",
"settings.openchamber.visual.field.inputBarOffset": "Зміщення панелі вводу",
@@ -1607,6 +1723,16 @@ export const settingsDict = {
"settings.openchamber.visual.field.userMessageRenderingAria": "Відображення повідомлень користувача: {option}",
"settings.openchamber.visual.field.mermaidRenderingAria": "Візуалізація Mermaid: {option}",
"settings.openchamber.visual.field.diffLayoutAria": "Компонування diff: {option}",
"settings.openchamber.visual.field.sessionRecap": "Генерувати підсумок сесії",
"settings.openchamber.visual.field.sessionRecapAria": "Генерувати підсумок після завершення роботи агента",
"settings.openchamber.visual.field.sessionSuggestion": "Генерувати пропозицію наступного повідомлення користувача",
"settings.openchamber.visual.field.sessionSuggestionAria": "Генерувати запропоноване наступне повідомлення користувача після завершення роботи агента",
"settings.openchamber.visual.field.sessionGoal": "Увімкнути цілі сесії",
"settings.openchamber.visual.field.sessionGoalAria": "Автоматично продовжувати роботу сесії до досягнення цілі",
"settings.openchamber.visual.goal.sectionTitle": "Ціль",
"settings.openchamber.visual.goal.budgetLabel": "Типовий бюджет токенів",
"settings.openchamber.visual.goal.budgetAria": "Застосовувати типовий бюджет токенів до нових цілей",
"settings.openchamber.visual.goal.description": "Увімкніть кнопку-мішень у полі вводу — і наступне повідомлення стане ціллю: агент автоматично працюватиме над нею під наглядом малої моделі, навіть поки вас немає поруч.",
"settings.openchamber.visual.field.showReasoningTracesAria": "Показати сліди міркувань",
"settings.openchamber.visual.field.showReasoningTraces": "Показати сліди міркувань",
"settings.openchamber.visual.field.collapsibleThinkingBlocksAria": "Увімкнути згортальні блоки міркувань",
@@ -1623,6 +1749,8 @@ export const settingsDict = {
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Вбудовані дії асистента",
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Показує «Скопіювати відповідь», «Зберегти як зображення» та озвучення для текстових блоків асистента, які з’являються перед пізнішими викликами інструментів у тій самій відповіді.",
"settings.openchamber.visual.field.showToolFileIconsAria": "Показати значки файлів інструментів",
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Переносити рядки блоків коду",
"settings.openchamber.visual.field.codeBlockLineWrap": "Переносити рядки блоків коду",
"settings.openchamber.visual.field.showToolFileIcons": "Показати значки файлів інструментів",
"settings.openchamber.visual.field.showTurnChangedFilesAria": "Показати змінені файли для завершених ходів",
"settings.openchamber.visual.field.showTurnChangedFiles": "Показати змінені файли для завершених ходів",
@@ -1784,4 +1912,10 @@ export const settingsDict = {
"settings.promptTemplates.page.toast.created": "Шаблон створено",
"settings.promptTemplates.page.toast.createFailed": "Не вдалося створити шаблон",
"settings.promptTemplates.page.toast.saveUnexpectedError": "Сталася неочікувана помилка під час збереження",
"settings.openchamber.visual.section.followUpBehavior": "Follow-up behavior",
"settings.openchamber.visual.section.followUpBehaviorAria": "Follow-up behavior",
"settings.openchamber.visual.field.followUpBehaviorAria": "Follow-up behavior: {option}",
"settings.openchamber.visual.field.followUpBehaviorDescription": "Choose what happens when you press Enter on a follow-up message while the agent is still responding.",
"settings.openchamber.visual.option.followUpBehavior.steer.label": "Steer",
"settings.openchamber.visual.option.followUpBehavior.queue.label": "Queue",
} as const;
+149 -1
View File
@@ -14,6 +14,7 @@ export const dict: Record<I18nKey, string> = {
"common.language.brazilianPortuguese": "Бразильська португальська",
"common.language.korean": "Корейська",
"common.language.polish": "Польська",
"common.language.japanese": "Японська",
"common.revealPath.finder": "Показати у Finder",
"common.revealPath.fileExplorer": "Відкрити у File Explorer",
"common.revealPath.fileManager": "Відкрити у файловому менеджері",
@@ -22,6 +23,13 @@ export const dict: Record<I18nKey, string> = {
"pwa.installPrompt.dismiss": "Сховати",
"pwa.installPrompt.started": "Установлення розпочато",
"pwa.installPrompt.installed": "OpenChamber встановлено",
"shareOpinion.actions.shareOpinion": "Поділитися думкою",
"shareOpinion.actions.bookCall": "Забронювати дзвінок",
"shareOpinion.actions.shortSurvey": "Коротке опитування",
"shareOpinion.dialog.title": "Поділіться своєю думкою",
"shareOpinion.toast.title": "Допоможіть сформувати OpenChamber",
"shareOpinion.toast.description": "Розкажіть, що корисне, незрозуміле чи відсутнє, щоб допомогти сформувати наступні кроки.",
"sessions.sidebar.footer.actions.shareOpinion": "Поділитися думкою",
"layout.mainTab.chat": "Чат",
"layout.mainTab.plan": "План",
"layout.mainTab.diff": "Diff",
@@ -30,6 +38,50 @@ export const dict: Record<I18nKey, string> = {
"layout.mainTab.terminal": "Термінал",
"layout.mainTab.context": "Контекст",
"mobile.nav.aria": "Мобільна навігація",
"mobile.connect.welcome.title": "Підключись до OpenChamber",
"mobile.connect.welcome.description": "Додай адресу сервера або відскануй QR-код pairing, щоб почати користуватись мобільною апкою.",
"mobile.connect.url.label": "Адреса сервера",
"mobile.connect.url.placeholder": "http://192.168.1.74:2606",
"mobile.connect.token.label": "Токен клієнта",
"mobile.connect.token.placeholder": "Встав токен доступу",
"mobile.connect.token.hint": "Потрібен, лише якщо сервер вимагає токен замість пароля.",
"mobile.connect.password.label": "Пароль",
"mobile.connect.password.placeholder": "Пароль OpenChamber",
"mobile.connect.connectButton": "Підключити",
"mobile.connect.unlockButton": "Розблокувати і підключити",
"mobile.connect.cancelPassword": "Інший сервер",
"mobile.connect.connecting": "Підключення...",
"mobile.connect.scanQr": "Сканувати QR-код",
"mobile.connect.welcome.scanHint": "На компʼютері відкрийте «Додати пристрій», щоб показати QR-код, і відскануйте його тут.",
"mobile.connect.advanced": "Додатково",
"mobile.connect.manual.toggle": "Підключитися за адресою",
"mobile.connect.scan.permissionDenied": "Доступ до камери вимкнено. Увімкни його в Налаштуваннях, щоб сканувати QR-код.",
"mobile.connect.scan.failed": "Не вдалося відсканувати QR-код. Спробуй ще раз або введи адресу вручну.",
"mobile.connect.scan.invalid": "Це не QR-код підключення OpenChamber.",
"mobile.connect.scan.unsupported": "Сканування QR доступне лише у встановленій мобільній апці.",
"mobile.connect.saved.title": "Збережені підключення",
"mobile.connect.saved.empty": "Збережених підключень ще немає.",
"mobile.connect.relay.badge": "через OpenChamber Relay",
"mobile.connect.error.urlRequired": "Введи адресу сервера.",
"mobile.connect.error.invalidUrl": "Ця адреса сервера некоректна.",
"mobile.connect.error.unreachable": "Не вдалося достукатись до цього OpenChamber сервера.",
"mobile.connect.error.authRequired": "Цьому серверу потрібен пароль або client token.",
"mobile.connect.error.passwordFailed": "Не вдалося розблокувати сервер. Перевір пароль.",
"mobile.instances.addTitle": "Додати інстанс",
"mobile.instances.addManual": "Додати за адресою",
"mobile.instances.editTitle": "Редагувати інстанс",
"mobile.instances.edit": "Редагувати",
"mobile.instances.delete": "Видалити",
"mobile.instances.deleteAria": "Видалити {label}",
"mobile.instances.confirmDeleteAria": "Підтвердити видалення {label}",
"mobile.instances.cancelDeleteAria": "Залишити {label}",
"mobile.instances.cancelEdit": "Скасувати",
"mobile.instances.label.label": "Назва",
"mobile.instances.label.placeholder": "Необовʼязкова назва",
"mobile.instances.saveNew": "Зберегти інстанс",
"mobile.instances.status.connectedDirect": "Підключено · Локальна мережа",
"mobile.instances.status.connectedRelay": "Підключено · Приватний relay",
"mobile.instances.saveEdit": "Зберегти зміни",
"mobile.nav.changes": "Зміни",
"mobile.nav.settings": "Налаштування",
"mobile.surface.closeAria": "Закрити",
@@ -42,6 +94,7 @@ export const dict: Record<I18nKey, string> = {
"mobile.menu.files": "Файли",
"mobile.menu.changes": "Зміни",
"mobile.menu.mcp": "MCP",
"mobile.menu.instances": "Інстанси",
"mobile.menu.update": "Оновити",
"mobile.menu.settings": "Налаштування",
"mobile.sessions.newChatCta": "Новий чат у {project}",
@@ -240,6 +293,10 @@ export const dict: Record<I18nKey, string> = {
"sessions.scheduledTasks.editor.prompt.placeholder": "Підсумуйте відкриті завдання й запропонуйте наступні дії",
"sessions.scheduledTasks.editor.enabled.aria": "Увімкнути завдання",
"sessions.scheduledTasks.editor.enabled.label": "Увімкнено",
"sessions.scheduledTasks.editor.goal.label": "Виконати як ціль",
"sessions.scheduledTasks.editor.goal.aria": "Виконати це завдання як ціль, яку агент веде до завершення",
"sessions.scheduledTasks.editor.goal.budgetLabel": "Бюджет токенів",
"sessions.scheduledTasks.editor.goal.budgetAria": "Обмежити ціль бюджетом токенів",
"sessions.scheduledTasks.editor.actions.closeAria": "Закрити",
"sessions.scheduledTasks.editor.actions.cancel": "Скасувати",
"sessions.scheduledTasks.editor.actions.save": "Зберегти",
@@ -330,6 +387,7 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.header.actions.searchSessions": "Пошук сесій",
"sessions.sidebar.header.actions.exitSelection": "Вийти з вибору",
"sessions.sidebar.header.actions.selectSessions": "Вибрати сесії",
"sessions.sidebar.header.actions.sortProjects": "Сортувати проєкти",
"sessions.sidebar.header.actions.sessionDisplayMode": "Режим відображення сесії",
"sessions.sidebar.header.displayMode.label": "Режим відображення",
"sessions.sidebar.header.displayMode.default": "За замовчуванням",
@@ -338,6 +396,11 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.header.displayMode.showArchived": "Показувати архівовані сесії",
"sessions.sidebar.header.displayMode.collapseAll": "Згорнути все",
"sessions.sidebar.header.displayMode.expandAll": "Розгорнути все",
"sessions.sidebar.header.projectSort.manual": "Вручну",
"sessions.sidebar.header.projectSort.aToZ": "A → Z",
"sessions.sidebar.header.projectSort.zToA": "Z → A",
"sessions.sidebar.header.projectSort.dateAdded": "Найновіші",
"sessions.sidebar.header.projectSort.recent": "Нещодавні",
"sessions.sidebar.header.search.matchCountSingle": "{count} збіг",
"sessions.sidebar.header.search.matchCountPlural": "Збігів: {count}",
"sessions.sidebar.header.search.escapeHint": "Esc, щоб очистити",
@@ -382,6 +445,7 @@ export const dict: Record<I18nKey, string> = {
"sessions.sidebar.project.actions.projectMenu": "Меню проєкту",
"sessions.sidebar.project.actions.newSession": "Нова сесія",
"sessions.sidebar.project.actions.closeProject": "Закрити проєкт",
"sessions.sidebar.project.actions.edit": "Редагувати",
"sessions.sidebar.project.actions.newDraftSession": "Нова чернетка сесії",
"sessions.sidebar.session.menu.rename": "Перейменувати",
"sessions.sidebar.session.rename.save": "Зберегти назву сесії",
@@ -1173,6 +1237,7 @@ export const dict: Record<I18nKey, string> = {
"diffView.state.loadingRepositoryStatus": "Завантаження статусу сховища...",
"diffView.state.notGitRepository": "Це не Git-репозиторій. Скористайтеся вкладкою Git, щоб ініціалізувати або змінити каталог.",
"diffView.state.cleanWorkingTree": "Worktree чистий, без змін для відображення",
"diffView.state.noLastTurnChanges": "Немає змін останнього ходу для відображення",
"diffView.state.failedToLoadDiff": "Не вдалося завантажити diff",
"diffView.state.loadingDiff": "Завантаження diff...",
"diffView.state.loadingChanges": "Завантаження змін...",
@@ -1182,6 +1247,7 @@ export const dict: Record<I18nKey, string> = {
"diffView.summary.changedFilesPlural": "Змінено файлів: {count}",
"diffView.scope.changed": "Змінені",
"diffView.scope.staged": "Індексовані",
"diffView.scope.lastTurn": "Останній хід",
"diffView.scope.selectorAria": "Вибрати режим змін",
"diffView.actions.retry": "Повторити спробу",
"diffView.actions.renderAnyway": "Все одно відрендерити",
@@ -1198,12 +1264,32 @@ export const dict: Record<I18nKey, string> = {
'diffView.reviewDialog.title': 'Ревʼю змін',
'diffView.reviewDialog.description': 'Запустити окрему сесію ревʼю для поточних змін.',
'diffView.reviewDialog.generateHandoff': 'Згенерувати handoff',
'diffView.reviewDialog.autoReview': 'Запустити автоматичний цикл ревʼю',
'diffView.reviewDialog.info': 'Цей flow найкраще працює, якщо запускати його із сесії, де були імплементовані зміни.',
'diffView.reviewDialog.actions.cancel': 'Скасувати',
'diffView.reviewDialog.actions.start': 'Ревʼю',
'diffView.reviewDialog.actions.starting': 'Запуск...',
'diffView.reviewDialog.toast.noSessionDirectory': 'Директорія сесії недоступна',
'diffView.reviewDialog.toast.startFailed': 'Не вдалося запустити review flow',
'chat.dictation.start': 'Почати диктування',
'chat.dictation.overlayAria': 'Диктування',
'chat.dictation.downloadingModel': 'Завантаження мовної моделі...',
'chat.dictation.downloadingModelProgress': 'Завантаження мовної моделі... {percent}%',
'chat.dictation.listening': 'Слухаю...',
'chat.dictation.processing': 'Розшифровка...',
'chat.dictation.failed': 'Не вдалося розшифрувати запис',
'chat.dictation.cancel': 'Відхилити диктування',
'chat.dictation.insert': 'Вставити текст',
'chat.dictation.insertAndSend': 'Вставити й надіслати',
'chat.dictation.retry': 'Повторити розшифровку',
'chat.dictation.discard': 'Відхилити запис',
'chat.history.loadOlder': 'Завантажити ще',
'chat.autoReview.title': 'Цикл код-ревʼю триває',
'chat.autoReview.status.waitingForReviewer': 'Очікуємо ревʼювера',
'chat.autoReview.status.waitingForImplementer': 'Очікуємо імплементатора',
'chat.autoReview.reviewSessionLabel': 'Сесія ревʼю',
'chat.autoReview.actions.open': 'Відкрити',
'chat.autoReview.actions.stop': 'Зупинити',
"diffView.hunk.label": "Шматки",
"diffView.hunk.stage": "Додати",
"diffView.hunk.unstage": "Прибрати",
@@ -1305,6 +1391,43 @@ export const dict: Record<I18nKey, string> = {
"header.actions.toggleChangesPanelAria": "Перемкнути панель змін",
"header.actions.planWithShortcut": "План ({shortcut})",
"header.actions.terminalPanelWithShortcut": "Термінальна панель ({shortcut})",
"chat.recap.aria": "Підсумок сесії",
"chat.recap.label": "Підсумок:",
"chat.goal.dialog.titleCreate": "Встановити ціль сесії",
"chat.goal.dialog.titleManage": "Ціль сесії",
"chat.goal.dialog.objectiveLabel": "Ціль",
"chat.goal.dialog.objectivePlaceholder": "Опишіть кінцевий стан, якого агент має досягти та перевірити…",
"chat.goal.dialog.budgetLabel": "Бюджет токенів",
"chat.goal.status.active": "Активна",
"chat.goal.status.evaluating": "Оцінювання…",
"chat.goal.status.paused": "Призупинена",
"chat.goal.status.blocked": "Заблокована",
"chat.goal.status.budgetLimited": "Бюджет вичерпано",
"chat.goal.status.complete": "Завершена",
"chat.goal.usage.tokens": "{used} токенів",
"chat.goal.usage.tokensWithBudget": "{used}/{budget} токенів",
"chat.goal.usage.turns": "продовжень: {turns}",
"chat.goal.action.pause": "Призупинити",
"chat.goal.action.resume": "Відновити",
"chat.goal.action.markComplete": "Позначити завершеною",
"chat.goal.action.clear": "Видалити ціль",
"chat.goal.action.cancel": "Скасувати",
"chat.goal.action.save": "Зберегти ціль",
"chat.goal.action.start": "Розпочати ціль",
"chat.goal.toast.actionFailed": "Не вдалося оновити ціль",
"chat.goal.row.aria": "Ціль сесії — відкрити деталі",
"chat.goal.button.createAria": "Встановити ціль сесії",
"chat.goal.button.manageAria": "Керувати ціллю сесії",
"chat.goal.button.armAria": "Розпочати ціль наступним повідомленням",
"chat.goal.counter.aria": "Ліміт довжини цілі",
"chat.goal.button.disarmAria": "Ціль увімкнена — торкніться, щоб вимкнути",
"chat.goal.button.cancelAria": "Ціль виконується — торкніться, щоб скасувати",
"chat.goal.cancelDialog.title": "Скасувати цю ціль?",
"chat.goal.cancelDialog.description": "Агент припинить автоматично працювати над цією ціллю.",
"chat.goal.cancelDialog.keep": "Залишити ціль",
"chat.goal.cancelDialog.confirm": "Скасувати ціль",
"chat.suggestion.applyAria": "Використати запропоноване повідомлення",
"chat.suggestion.dismissAria": "Прибрати пропозицію",
"header.actions.toggleTerminalPanelAria": "Перемкнути панель терміналу",
"terminalView.stream.processExitedMessage": "\r\n[Process exited{exitCodeSegment}{signalSegment}]\r\n",
"terminalView.stream.processExitedWithCode": " з кодом {exitCode}",
@@ -1686,6 +1809,7 @@ export const dict: Record<I18nKey, string> = {
"chat.queuedMessage.edit": "edit",
"chat.queuedMessage.send": "send",
"chat.queuedMessage.removeAria": "Видалити з черги",
"chat.queuedMessage.reorderAria": "Перетягніть, щоб змінити порядок",
"chat.container.returnToParent.aria": "Повернутися до батьківської сесії",
"chat.container.returnToParent.titleNamed": "Повернутися до: {title}",
"chat.container.returnToParent.title": "Повернутися до батьківської сесії",
@@ -1825,6 +1949,9 @@ export const dict: Record<I18nKey, string> = {
"chat.chatInput.previewContextRemove": "Прибрати контекст перегляду",
"chat.chatInput.projectRoot": "Корінь проєкту",
"chat.chatInput.branch": "гілка",
"chat.chatInput.draftPicker.projectTitle": "Проєкт",
"chat.chatInput.draftPicker.searchProjects": "Пошук проєктів...",
"chat.chatInput.draftPicker.searchBranches": "Пошук гілок...",
"chat.chatInput.worktrees": "Worktree",
"chat.chatInput.worktreeNew": "+ Новий",
"chat.chatInput.drop.insertMention": "Відпустіть, щоб вставити як згадку",
@@ -1850,6 +1977,11 @@ export const dict: Record<I18nKey, string> = {
"chat.toolOutputDialog.image.closeAria": "Закрити попередній перегляд зображення",
"chat.toolOutputDialog.mermaid.missingSource": "Відсутнє джерело Mermaid URL.",
"chat.toolOutputDialog.mermaid.loadFailed": "Не вдалося завантажити діаграму Mermaid.",
"chat.toolOutputDialog.mermaid.dataUrlMalformed": "URL даних Mermaid має неправильний формат.",
"chat.toolOutputDialog.mermaid.invalidLocalPath": "Локальний шлях до файлу Mermaid недійсний.",
"chat.toolOutputDialog.mermaid.readFileFailedWithStatus": "Не вдалося прочитати файл Mermaid. Статус: {status}.",
"chat.toolOutputDialog.mermaid.unsupportedUrlProtocol": "Протокол URL Mermaid не підтримується.",
"chat.toolOutputDialog.mermaid.loadFailedWithStatus": "Не вдалося завантажити діаграму Mermaid. Статус: {status}.",
"chat.toolOutputDialog.mermaid.closeAria": "Закрити попередній перегляд діаграми",
"chat.toolOutputDialog.mermaid.loading": "Завантаження діаграми...",
"chat.toolOutputDialog.mermaid.renderFailed": "Неможливо відобразити діаграму Mermaid.",
@@ -1864,6 +1996,9 @@ export const dict: Record<I18nKey, string> = {
"chat.toolPart.output": "Вивід",
"chat.toolPart.showRawJson": "Показати сирий JSON",
"chat.toolPart.showFormattedJson": "Показати форматований JSON",
"chat.toolPart.showNavigableJson": "Показати навігаційний JSON",
"chat.toolPart.openFileAtFirstChange": "Відкрити файл на першій зміні",
"chat.toolPart.openFileDiff": "Відкрити diff файлу",
"chat.toolPart.copyOutput": "Скопіювати вивід",
"chat.toolPart.copiedOutput": "Вивід скопійовано",
"chat.toolPart.copyOutputFailed": "Не вдалося скопіювати вивід",
@@ -1957,6 +2092,7 @@ export const dict: Record<I18nKey, string> = {
"chat.modelControls.noProvidersOrModelsFound": "Жоден провайдер або модель не відповідає пошуку.",
"chat.modelControls.reorderFavoriteAria": "Змінити порядок вибраного",
"chat.modelControls.reorderFavoriteTitle": "Перетягніть, щоб змінити порядок вибраного",
"chat.modelControls.reorderProviderTitle": "Перетягніть, щоб змінити порядок провайдера",
"chat.modelControls.permissionLabel.custom": "Custom",
"chat.modelControls.permissionLabel.allow": "Дозволити",
"chat.modelControls.permissionLabel.deny": "Заборонити",
@@ -2197,7 +2333,7 @@ export const dict: Record<I18nKey, string> = {
"sessionAuth.error.networkTitle": "Неможливо отримати доступ до сервера",
"sessionAuth.error.rateLimitDescriptionSingle": "Зачекайте {minutes} хвилину перед повторною спробою.",
"sessionAuth.error.rateLimitDescriptionPlural": "Зачекайте {minutes} хвилин, перш ніж повторити спробу.",
"sessionAuth.error.networkDescription": "Нам не вдалося перевірити сесію інтерфейсу. Перевірте, чи працює сервіс, і повторіть спробу.",
"sessionAuth.error.networkDescription": "Нам не вдалося перевірити сесію інтерфейсу. Якщо ви відкриваєте OpenChamber з іншого пристрою у локальній мережі, увімкніть Desktop Network Access у настільному застосунку та використайте LAN-адресу, показану в налаштуваннях.",
"sessionAuth.error.retry": "Повторити спробу",
"sessionAuth.error.passkeySetupFailed": "Помилка налаштування ключа доступу.",
"sessionAuth.error.incorrectPassword": "Невірний пароль. Спробуйте знову.",
@@ -2484,9 +2620,14 @@ export const dict: Record<I18nKey, string> = {
"updateDialog.status.downloading": "Завантаження...",
"updateDialog.actions.restartToUpdate": "Перезапустити, щоб оновити",
"updateDialog.actions.updateNow": "Оновити зараз",
"updateDialog.actions.openMobileUpdate": "Відкрити оновлення",
"updateDialog.status.updating": "Оновлення...",
"updateDialog.error.updateFailed": "Помилка оновлення",
"updateDialog.error.takingLonger": "Оновлення триває довше, ніж очікувалося. Зачекайте трохи та оновіть або запустіть: openchamber update",
"mobileUpdate.toast.available.title": "Доступне оновлення OpenChamber",
"mobileUpdate.toast.available.description": "Версія {version} готова для Android.",
"mobileUpdate.toast.actions.download": "Завантажити",
"mobileUpdate.toast.actions.dismiss": "Сховати",
"opencodeUpdate.toast.available.title": "Оновлення OpenCode",
"opencodeUpdate.toast.available.description": "Версія {version} доступна.",
"opencodeUpdate.toast.actions.update": "Оновити",
@@ -2562,12 +2703,19 @@ export const dict: Record<I18nKey, string> = {
"mainLayout.mobile.closeDrawerAria": "Закрити панель",
"sortableTabsStrip.aria.tabs": "Вкладки",
"openChamberLogo.aria.logo": "Логотип OpenChamber",
"markdownRenderer.code.actions.copyTitle": "Скопіювати код",
"markdownRenderer.code.actions.copiedTitle": "Скопійовано",
"markdownRenderer.table.actions.copyTitle": "Скопіювати таблицю",
"markdownRenderer.code.actions.enableWrapTitle": "Увімкнути перенесення рядків",
"markdownRenderer.code.actions.disableWrapTitle": "Вимкнути перенесення рядків",
"markdownRenderer.table.actions.downloadTitle": "Завантажити таблицю",
"markdownRenderer.table.toast.downloadedAsFormat": "Таблицю завантажено як {format}",
"markdownRenderer.mermaid.actions.copyTitle": "Копіювати",
"markdownRenderer.mermaid.actions.copySourceTitle": "Копіювати джерело",
"markdownRenderer.mermaid.actions.downloadSvgTitle": "Завантажити SVG",
"markdownRenderer.mermaid.actions.zoomInTitle": "Збільшити",
"markdownRenderer.mermaid.actions.zoomOutTitle": "Зменшити",
"markdownRenderer.mermaid.actions.resetViewTitle": "Скинути вигляд",
"markdownRenderer.mermaid.toast.downloadFailed": "Не вдалося завантажити діаграму",
"contextPanel.preview.title": "Попередній перегляд",
"contextPanel.preview.description": "Використайте дії проєкту або кнопку Preview у терміналі, щоб відкрити перегляд.",
@@ -220,11 +220,18 @@ export const settingsDict = {
'settings.remoteInstances.direct.sidebarTitle': '服务器链接',
'settings.remoteInstances.direct.sidebarDescription': '使用链接或令牌连接',
'settings.remoteInstances.direct.title': '其他 OpenChamber 服务器',
'settings.remoteInstances.direct.description': '通过 URL 添加另一个 OpenChamber 服务器。适用于服务器已在运行且你拥有连接令牌的情况。',
'settings.remoteInstances.direct.description': '此应用可切换到的服务器。从另一台服务器导入配对链接,或通过地址添加。',
'settings.remoteInstances.direct.addDialog.description': '通过 URL 添加另一个 OpenChamber 服务器。适用于服务器已在运行且你拥有连接令牌的情况。',
'settings.remoteInstances.direct.field.labelPlaceholder': '标签(可选)',
'settings.remoteInstances.direct.field.urlPlaceholder': 'https://host:port',
'settings.remoteInstances.direct.field.tokenPlaceholder': '连接令牌(受信任的本地服务器可选)',
'settings.remoteInstances.direct.note': '连接令牌会保存在此设备上,并且只在此应用连接到该服务器时使用。',
'settings.remoteInstances.direct.headers.title': 'Additional headers',
'settings.remoteInstances.direct.headers.description': 'Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.',
'settings.remoteInstances.direct.headers.field.namePlaceholder': 'Header name',
'settings.remoteInstances.direct.headers.field.valuePlaceholder': 'Header value',
'settings.remoteInstances.direct.headers.actions.add': 'Add header',
'settings.remoteInstances.direct.headers.removeAria': 'Remove header',
'settings.remoteInstances.direct.actions.add': '添加服务器',
'settings.remoteInstances.direct.import.description': '粘贴来自另一个 OpenChamber 服务器的连接链接。',
'settings.remoteInstances.direct.import.placeholder': 'openchamber://connect?...',
@@ -234,20 +241,74 @@ export const settingsDict = {
'settings.remoteInstances.direct.state.empty': '尚未添加其他服务器。',
'settings.remoteInstances.clientAuth.title': '连接到此服务器',
'settings.remoteInstances.clientAuth.description': '创建安全链接或令牌,让 OpenChamber Desktop 可以连接到此服务器。',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': '设备名称(可选)',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': '设备名称 — 例如 My iPhone',
'settings.remoteInstances.clientAuth.actions.create': '创建令牌',
'settings.remoteInstances.clientAuth.actions.pair': '创建链接',
'settings.remoteInstances.clientAuth.actions.revoke': '撤销',
'settings.remoteInstances.clientAuth.actions.clearRevoked': '清除已撤销',
'settings.remoteInstances.clientAuth.qrAlt': 'OpenChamber connection QR code',
'settings.remoteInstances.clientAuth.qrEnlarge': '放大二维码',
'settings.remoteInstances.clientAuth.qrScanHint': '用另一台设备上的 OpenChamber 应用扫描。一次性使用且会过期。',
'settings.remoteInstances.clientAuth.qrDialogTitle': '扫码连接',
'settings.remoteInstances.clientAuth.actions.addDevice': '添加设备',
'settings.remoteInstances.clientAuth.actions.copied': '已复制',
'settings.remoteInstances.clientAuth.addDevice.transportLabel': '你会在哪里使用这台设备?',
'settings.remoteInstances.clientAuth.addDevice.subtitle': '创建一次性二维码,把另一台设备连接到此服务器。',
'settings.remoteInstances.clientAuth.addDevice.transport.local': '仅本机',
'settings.remoteInstances.clientAuth.addDevice.transport.localHint': '供同一台电脑上的应用使用。',
'settings.remoteInstances.clientAuth.addDevice.transport.lan': '仅家庭网络',
'settings.remoteInstances.clientAuth.addDevice.transport.lanHint': '通过 Wi-Fi 直接连接。离开此网络后无法使用。',
'settings.remoteInstances.clientAuth.addDevice.transport.relay': '任何地方',
'settings.remoteInstances.clientAuth.addDevice.transport.relayHint': '在家和外出都可用。外出时流量经由 OpenChamber Private Relay(端到端加密隧道)传输,无需配置。',
'settings.remoteInstances.clientAuth.addDevice.fallback.relay': '外出时也允许通过加密中继连接',
'settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal': '在家时优先使用直接连接',
'settings.remoteInstances.clientAuth.addDevice.create': '创建二维码',
'settings.remoteInstances.clientAuth.addDevice.done': '完成',
'settings.remoteInstances.clientAuth.addDevice.connectedToast': '设备已连接。',
'settings.remoteInstances.clientAuth.pairingUrl': '连接链接',
'settings.remoteInstances.clientAuth.createdToken': '请立即复制此令牌。出于安全考虑,它不会再次显示。',
'settings.remoteInstances.clientAuth.state.loading': '正在加载令牌...',
'settings.remoteInstances.clientAuth.state.empty': '尚无已连接设备。',
'settings.remoteInstances.clientAuth.state.revoked': '已撤销',
'settings.remoteInstances.clientAuth.state.thisDevice': '此设备',
'settings.remoteInstances.clientAuth.state.pending': '等待连接…',
'settings.remoteInstances.clientAuth.state.viaRelay': 'Relay',
'settings.remoteInstances.clientAuth.state.connectedDirect': '已连接 · 局域网',
'settings.remoteInstances.clientAuth.state.connectedRelay': '已连接 · 中继',
'settings.remoteInstances.clientAuth.lastUsed': '上次使用 {date}',
'settings.remoteInstances.clientAuth.neverUsed': '从未使用',
'settings.remoteInstances.relay.title': 'OpenChamber Relay',
'settings.remoteInstances.relay.autoHint': '通过中继配对设备时自动开启。',
'settings.remoteInstances.relay.description': '无需开放端口,即可让你的其他设备从任何地方连接。流量端到端加密,中继无法读取内容。',
'settings.remoteInstances.relay.enableHint': '在此服务器上启用中继之前,不会共享任何内容。',
'settings.remoteInstances.relay.actions.enable': '启用中继',
'settings.remoteInstances.relay.actions.disable': '停用',
'settings.remoteInstances.relay.confirm.disable': '停用中继?通过它连接的设备将立即断开。',
'settings.remoteInstances.relay.state.loading': '正在检查中继状态...',
'settings.remoteInstances.relay.state.disabled': '已停用',
'settings.remoteInstances.relay.state.connecting': '连接中',
'settings.remoteInstances.relay.state.connected': '已连接',
'settings.remoteInstances.relay.state.reconnecting': '重新连接中',
'settings.remoteInstances.relay.state.error': '错误',
'settings.remoteInstances.relay.status.clientsOne': '已连接 {count} 台设备',
'settings.remoteInstances.relay.status.clientsMany': '已连接 {count} 台设备',
'settings.remoteInstances.relay.pair.title': '配对设备',
'settings.remoteInstances.relay.pair.labelPlaceholder': '设备名称(可选)',
'settings.remoteInstances.relay.pair.includeToken': '包含访问令牌(扫一次即完成配对)',
'settings.remoteInstances.relay.pair.noTokenHint': '不包含令牌时,设备连接后需使用此服务器的界面密码登录。',
'settings.remoteInstances.relay.pair.generate': '创建配对链接',
'settings.remoteInstances.relay.pair.requiresConnected': '中继连接后即可配对。',
'settings.remoteInstances.relay.pair.linkLabel': '配对链接',
'settings.remoteInstances.relay.pair.warning': '此链接可访问此服务器,请勿分享。',
'settings.remoteInstances.relay.pair.qrAlt': '中继配对二维码',
'settings.remoteInstances.relay.pair.showQr': '显示二维码',
'settings.remoteInstances.relay.pair.qrDialogTitle': '扫描配对',
'settings.remoteInstances.relay.pair.qrDialogDescription': '用其他设备上的 OpenChamber 应用扫描此二维码。',
'settings.remoteInstances.relay.pair.manageHint': '可在上方“连接到此服务器”列表中管理或吊销已配对的设备。',
'settings.remoteInstances.relay.toast.enableFailed': '无法启用中继',
'settings.remoteInstances.relay.toast.disableFailed': '无法停用中继',
'settings.remoteInstances.relay.toast.offerFailed': '无法创建配对链接',
'settings.remoteInstances.relay.toast.linkCopied': '已复制配对链接',
'settings.remoteInstances.sidebar.phase.ready': '就绪',
'settings.remoteInstances.sidebar.phase.error': '错误',
'settings.remoteInstances.sidebar.phase.reconnect': '重连',
@@ -365,12 +426,14 @@ export const settingsDict = {
'settings.agents.sidebar.toast.agentExists': '已存在同名智能体',
'settings.agents.sidebar.toast.removeOldAfterRenameFailed': '重命名后移除旧智能体失败',
'settings.agents.sidebar.toast.renameFailed': '重命名智能体失败',
'settings.agents.sidebar.toast.agentRenamed': '智能体已重命名为 "{name}"',
'settings.agents.page.toast.permissionNameRequired': '权限名称为必填项',
'settings.agents.page.toast.created': '智能体创建成功',
'settings.agents.page.toast.updated': '智能体更新成功',
'settings.agents.page.toast.createFailed': '创建智能体失败',
'settings.agents.page.toast.updateFailed': '更新智能体失败',
'settings.agents.page.toast.saveUnexpectedError': '保存时发生错误',
'settings.agents.page.toast.savedManualRestart': '已保存到磁盘。请重启已连接的 OpenCode 服务器以应用更改。',
'settings.agents.page.empty.title': '从侧边栏选择一个智能体',
'settings.agents.page.empty.description': '或新建一个智能体',
'settings.agents.page.title.new': '新建智能体',
@@ -387,6 +450,10 @@ export const settingsDict = {
'settings.agents.page.field.mode': '模式',
'settings.agents.page.field.modeTooltip': '主智能体与子智能体可见性',
'settings.agents.page.field.overrideModel': '覆盖模型',
'settings.agents.page.field.variant': '思考变体',
'settings.agents.page.field.variantTooltip': '可选。如果模型支持推理,变体控制推理深度。',
'settings.agents.page.field.variantHint': '模型特定(如 Anthropic variant)',
'settings.agents.page.field.variantPlaceholder': '例如 high, max, low, none',
'settings.agents.page.field.temperature': 'Temperature',
'settings.agents.page.field.temperatureTooltip': '控制随机性。越高越有创造性,越低越聚焦。',
'settings.agents.page.field.temperatureRange': '0.0 到 2.0',
@@ -500,6 +567,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.description.globalReadOnly': '系统范围 Git 身份(只读)',
'settings.gitIdentities.editor.description.newProfile': '创建新的 Git 身份配置',
'settings.gitIdentities.editor.description.editProfile': '编辑身份配置设置',
'settings.gitIdentities.editor.section.commitSigning': '提交签名',
'settings.gitIdentities.editor.field.profileName': '身份名称',
'settings.gitIdentities.editor.field.profileNamePlaceholder': '工作身份、个人身份等',
'settings.gitIdentities.editor.field.color': '颜色',
@@ -515,6 +583,9 @@ export const settingsDict = {
'settings.gitIdentities.editor.field.sshKeyPath': 'SSH 密钥路径',
'settings.gitIdentities.editor.field.sshKeyPathTooltip': '可选私钥路径,例如 ~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.sshKeyPathPlaceholder': '~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.signCommits': '使用此身份签名提交',
'settings.gitIdentities.editor.field.signingKey': '签名密钥',
'settings.gitIdentities.editor.field.signingKeyPlaceholder': '~/.ssh/id_ed25519.pub',
'settings.gitIdentities.editor.field.host': 'Host',
'settings.gitIdentities.editor.field.hostTooltip': '该 host 的 token 将从 ~/.git-credentials 读取。',
'settings.gitIdentities.editor.field.hostPlaceholder': 'github.com',
@@ -523,6 +594,7 @@ export const settingsDict = {
'settings.gitIdentities.editor.actions.save': '保存',
'settings.gitIdentities.editor.toast.userNameEmailRequired': '用户名和邮箱为必填项',
'settings.gitIdentities.editor.toast.hostRequiredForToken': '基于 token 认证时 Host 为必填项',
'settings.gitIdentities.editor.toast.signingKeyRequired': '启用提交签名时需要签名密钥',
'settings.gitIdentities.editor.toast.profileCreated': '身份已创建',
'settings.gitIdentities.editor.toast.profileUpdated': '身份已更新',
'settings.gitIdentities.editor.toast.createProfileFailed': '创建身份失败',
@@ -772,7 +844,13 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.title': '桌面端网络访问',
'settings.openchamber.desktopNetwork.field.launchAtLoginAria': '登录时启动 OpenChamber',
'settings.openchamber.desktopNetwork.field.launchAtLogin': '登录时启动 OpenChamber',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': '在后台启动应用且不打开窗口。点击 Dock 图标即可打开。',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': '在后台启动应用且不打开窗口。可通过桌面状态图标打开。',
'settings.openchamber.desktopNetwork.field.minimizeToTrayAria': '将 OpenChamber 最小化和关闭到系统托盘',
'settings.openchamber.desktopNetwork.field.minimizeToTray': '最小化和关闭到系统托盘',
'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription': '主窗口最小化或关闭时,让 OpenChamber 继续在 Windows 系统托盘中运行。',
'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'OpenChamber 运行时保持电脑唤醒',
'settings.openchamber.desktopNetwork.field.keepAwake': 'OpenChamber 运行时保持电脑唤醒',
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': '让手机可以继续打开此应用。屏幕仍可关闭。',
'settings.openchamber.desktopNetwork.field.allowLanAccessAria': '允许桌面 sidecar 局域网访问',
'settings.openchamber.desktopNetwork.field.allowLanAccess': '允许你本地网络中的其他设备打开此应用',
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': '会重启应用,以便手机、平板和同一 Wi‑Fi 下的其他电脑访问。',
@@ -789,6 +867,10 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.error.savedRestartFailed': '已保存,但重启应用失败',
'settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported': '此系统不支持登录时启动',
'settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed': '更新登录时启动设置失败',
'settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported': '此系统不支持系统托盘后台模式',
'settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed': '更新系统托盘设置失败',
'settings.openchamber.desktopNetwork.error.keepAwakeUnsupported': '此系统不支持防止睡眠',
'settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed': '更新保持唤醒设置失败',
'settings.openchamber.opencodeCli.title': 'OpenCode CLI',
'settings.openchamber.opencodeCli.tooltipPrefix': '可选的',
'settings.openchamber.opencodeCli.tooltipSuffix': '二进制绝对路径。',
@@ -917,6 +999,7 @@ export const settingsDict = {
'settings.openchamber.keyboardShortcuts.action.cycle_agent.label': '轮换智能体',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label': '向前轮换收藏模型',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label': '向后轮换收藏模型',
'settings.openchamber.keyboardShortcuts.action.open_model_selector.label': '打开模型选择器',
'settings.openchamber.keyboardShortcuts.action.expand_input.label': '展开输入框',
'settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label': '打开对话时间线',
'settings.projects.sidebar.total': '总计 {count}',
@@ -926,6 +1009,8 @@ export const settingsDict = {
'settings.projects.page.section.worktree': '工作树',
'settings.projects.page.field.projectName': '项目名称',
'settings.projects.page.field.projectNamePlaceholder': '项目名称',
'settings.projects.page.field.defaultModel': '新聊天的默认模型',
'settings.projects.page.field.defaultModelDescription': '在此项目中开始新聊天时使用。未设置时回退到全局默认值。',
'settings.projects.page.field.accentColor': '强调色',
'settings.projects.page.field.projectIcon': '项目图标',
'settings.projects.page.field.projectIconBackgroundAria': '项目图标背景颜色',
@@ -947,6 +1032,7 @@ export const settingsDict = {
'settings.projects.page.toast.discoverIconFailed': '发现项目图标失败',
'settings.projects.page.toast.customIconAlreadySet': '该项目已设置自定义图标',
'settings.projects.page.toast.iconDiscovered': '项目图标已发现',
'settings.projects.page.toast.saveFailed': '保存项目设置失败',
'settings.usage.sidebar.title': '用量',
'settings.usage.sidebar.total': '总计 {count}',
'settings.usage.sidebar.actions.toggleAutoRefreshAria': '切换自动刷新',
@@ -1082,6 +1168,9 @@ export const settingsDict = {
'settings.openchamber.worktrees.setup.commandPlaceholder': '例如:bun install',
'settings.openchamber.worktrees.setup.removeCommandAria': '移除命令',
'settings.openchamber.worktrees.setup.addCommand': '添加命令',
'settings.openchamber.worktrees.setup.waitForCommands': '创建或发送会话前等待初始化命令完成',
'settings.openchamber.worktrees.setup.waitForCommandsAria': '创建或发送会话前等待 Worktree 初始化命令完成',
'settings.openchamber.worktrees.setup.toast.saveFailed': '保存 Worktree 初始化命令失败',
'settings.openchamber.worktrees.list.title': '现有工作树',
'settings.openchamber.worktrees.list.tooltip': '工作树位于仓库外部(由 OpenCode 管理)。删除工作树也会删除关联会话。',
'settings.openchamber.worktrees.list.loading': '正在加载工作树...',
@@ -1338,6 +1427,11 @@ export const settingsDict = {
'settings.openchamber.defaults.field.thinkingPlaceholder': '思考模式',
'settings.openchamber.defaults.field.defaultAgent': '默认智能体',
'settings.openchamber.defaults.field.showDeletionDialogAria': '显示删除对话框',
'settings.openchamber.defaults.smallModel.title': '小模型',
'settings.openchamber.defaults.smallModel.description': '用于快速实用任务(如简短回顾和摘要)的廉价模型。',
'settings.openchamber.defaults.smallModel.useDefault': '使用默认小模型',
'settings.openchamber.defaults.smallModel.useDefaultAria': '使用默认小模型',
'settings.openchamber.defaults.smallModel.overrideModel': '覆盖模型',
'settings.openchamber.defaults.field.showDeletionDialog': '显示删除对话框',
'settings.openchamber.defaults.field.openFilesPreviewAria': '以预览模式打开文件',
'settings.openchamber.defaults.field.openFilesPreview': '以预览模式打开文件',
@@ -1460,16 +1554,33 @@ export const settingsDict = {
'settings.notifications.page.toast.backgroundDisabled': '后台通知已关闭',
'settings.notifications.page.testNotification.title': '测试通知',
'settings.notifications.page.testNotification.body': '这是来自 OpenChamber 的测试通知。',
'settings.voice.page.section.voiceSetup': '语音设置',
'settings.voice.page.section.speechRecognition': '语音识别',
'settings.voice.page.field.enableVoiceInput': '启用语音输入',
'settings.voice.page.field.enableVoiceInputAria': '启用语音输入(听写)',
'settings.voice.page.section.playbackAndSummary': '播放',
'settings.voice.page.field.enableVoiceModeAria': '启用语音模式',
'settings.voice.page.field.enableVoiceMode': '启用语音模式',
'settings.voice.page.field.provider': '提供方',
'settings.voice.page.provider.browser': '浏览器',
'settings.voice.page.provider.custom': '自定义',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': '服务器',
'settings.voice.page.provider.local': '本地',
'settings.voice.page.tooltip.sttLocal': '在 OpenChamber 服务器上本地转写。模型自动下载,无需 API 密钥。',
'settings.voice.page.tooltip.localTts': '在 OpenChamber 服务器上本地合成语音(Kokoro,英语)。模型自动下载,无需 API 密钥。',
'settings.voice.page.stt.model.parakeetV2': 'Parakeet v2(英语)',
'settings.voice.page.stt.model.parakeetV3': 'Parakeet v3(25 种欧洲语言)',
'settings.voice.page.stt.model.whisperBase': 'Whisper base(多语言)',
'settings.voice.page.stt.model.whisperTiny': 'Whisper tiny(多语言)',
'settings.voice.page.stt.badge.bestForEnglish': '英语最佳',
'settings.voice.page.stt.badge.bestForMultilingual': '多语言最佳',
'settings.voice.page.stt.meta.accuracy': '准确度',
'settings.voice.page.stt.meta.speed': '速度',
'settings.voice.page.stt.modelInstalled': '模型已安装',
'settings.voice.page.stt.modelDownloading': '正在下载模型...',
'settings.voice.page.stt.modelDownloadingProgress': '正在下载模型... {percent}%',
'settings.voice.page.stt.modelNotInstalled': '模型未下载',
'settings.voice.page.stt.modelDownload': '下载',
'settings.voice.page.stt.modelDelete': '删除模型',
'settings.voice.page.stt.modelRetry': '重试',
'settings.voice.page.provider.wasm': '本地',
'settings.voice.page.stt.wasmModel': 'Whisper 模型',
'settings.voice.page.stt.wasmLoaded': '模型已加载',
@@ -1526,6 +1637,7 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputMode': 'TTS 输入模式',
'settings.voice.page.field.ttsInputModeSanitized': '清理后文本',
'settings.voice.page.field.ttsInputModeRaw': '原始 Markdown',
'settings.voice.page.field.ttsInputModeSummarized': '摘要',
'settings.openchamber.visual.section.colorMode': '颜色模式',
'settings.openchamber.visual.section.mobileLayout': '移动端布局',
'settings.openchamber.visual.option.mobileLayout.default': '旧版',
@@ -1558,6 +1670,8 @@ export const settingsDict = {
'settings.openchamber.visual.actions.reloadThemes': '重新加载主题',
'settings.openchamber.visual.field.macVibrancy': '窗口透明度',
'settings.openchamber.visual.field.macVibrancyHint': '在侧边栏后使用 macOS 原生模糊(vibrancy)。关闭以获得完全不透明的界面。',
'settings.openchamber.visual.field.dockBadge': 'Dock 角标',
'settings.openchamber.visual.field.dockBadgeHint': '在 macOS Dock 图标上显示有未读动态的会话数量。',
'settings.openchamber.visual.actions.saveAndRestart': '保存并重启',
'settings.openchamber.visual.actions.restarting': '正在重启…',
'settings.openchamber.visual.actions.reloadingThemes': '正在重新加载主题...',
@@ -1584,10 +1698,12 @@ export const settingsDict = {
'settings.openchamber.visual.field.fontSizePercentageAria': '字体大小百分比',
'settings.openchamber.visual.actions.resetFontSizeAria': '重置字体大小',
'settings.openchamber.visual.field.terminalFontSize': '终端字体大小',
'settings.openchamber.visual.field.editorFontSize': '编辑器字体大小',
'settings.openchamber.visual.field.codeFont': '代码字体',
'settings.openchamber.visual.field.selectCodeFontAria': '选择代码字体',
'settings.openchamber.visual.actions.resetCodeFontAria': '重置代码字体',
'settings.openchamber.visual.actions.resetTerminalFontSizeAria': '重置终端字体大小',
'settings.openchamber.visual.actions.resetEditorFontSizeAria': '重置编辑器字体大小',
'settings.openchamber.visual.field.spacingDensity': '间距密度',
'settings.openchamber.visual.actions.resetSpacingAria': '重置间距',
'settings.openchamber.visual.field.inputBarOffset': '输入栏偏移',
@@ -1607,6 +1723,16 @@ export const settingsDict = {
'settings.openchamber.visual.field.userMessageRenderingAria': '用户消息渲染:{option}',
'settings.openchamber.visual.field.mermaidRenderingAria': 'Mermaid 渲染:{option}',
'settings.openchamber.visual.field.diffLayoutAria': '差异布局:{option}',
'settings.openchamber.visual.field.sessionRecap': '生成会话回顾',
'settings.openchamber.visual.field.sessionRecapAria': '代理完成后生成回顾',
'settings.openchamber.visual.field.sessionSuggestion': '生成下一条用户消息建议',
'settings.openchamber.visual.field.sessionSuggestionAria': '代理完成后生成下一条用户消息建议',
'settings.openchamber.visual.field.sessionGoal': '启用会话目标',
'settings.openchamber.visual.field.sessionGoalAria': '让会话自动朝着目标持续工作',
'settings.openchamber.visual.goal.sectionTitle': '目标',
'settings.openchamber.visual.goal.budgetLabel': '默认令牌预算',
'settings.openchamber.visual.goal.budgetAria': '为新目标应用默认令牌预算',
'settings.openchamber.visual.goal.description': '在输入框中启用靶心按钮,下一条消息即成为目标:代理将在小模型的审核下自动持续工作,即使你不在电脑前。',
'settings.openchamber.visual.field.showReasoningTracesAria': '显示推理轨迹',
'settings.openchamber.visual.field.showReasoningTraces': '显示推理轨迹',
'settings.openchamber.visual.field.collapsibleThinkingBlocksAria': '启用可折叠推理块',
@@ -1623,6 +1749,8 @@ export const settingsDict = {
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '内联助手操作',
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '在同一条回复中,如果助手文本块后面还有工具调用,则显示“复制回答”“保存为图片”和“朗读”操作。',
'settings.openchamber.visual.field.showToolFileIconsAria': '显示工具文件图标',
'settings.openchamber.visual.field.codeBlockLineWrapAria': '代码块自动换行',
'settings.openchamber.visual.field.codeBlockLineWrap': '代码块自动换行',
'settings.openchamber.visual.field.showToolFileIcons': '显示工具文件图标',
'settings.openchamber.visual.field.showTurnChangedFilesAria': '显示已完成回合的更改文件',
'settings.openchamber.visual.field.showTurnChangedFiles': '显示已完成回合的更改文件',
@@ -1784,4 +1912,10 @@ export const settingsDict = {
'settings.promptTemplates.page.toast.created': '模板已创建',
'settings.promptTemplates.page.toast.createFailed': '创建模板失败',
'settings.promptTemplates.page.toast.saveUnexpectedError': '保存时发生意外错误',
'settings.openchamber.visual.section.followUpBehavior': 'Follow-up behavior',
'settings.openchamber.visual.section.followUpBehaviorAria': 'Follow-up behavior',
'settings.openchamber.visual.field.followUpBehaviorAria': 'Follow-up behavior: {option}',
'settings.openchamber.visual.field.followUpBehaviorDescription': 'Choose what happens when you press Enter on a follow-up message while the agent is still responding.',
'settings.openchamber.visual.option.followUpBehavior.steer.label': 'Steer',
'settings.openchamber.visual.option.followUpBehavior.queue.label': 'Queue',
} as const;
+149 -1
View File
@@ -14,6 +14,7 @@ export const dict: Record<I18nKey, string> = {
'common.language.brazilianPortuguese': '巴西葡萄牙语',
'common.language.korean': '韩语',
'common.language.polish': '波兰语',
'common.language.japanese': '日语',
'common.revealPath.finder': '在 Finder 中显示',
'common.revealPath.fileExplorer': '在文件资源管理器中打开',
'common.revealPath.fileManager': '在文件管理器中打开',
@@ -22,6 +23,13 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': '忽略',
'pwa.installPrompt.started': '已开始安装',
'pwa.installPrompt.installed': 'OpenChamber 已安装',
'shareOpinion.actions.shareOpinion': '分享意见',
'shareOpinion.actions.bookCall': '预约通话',
'shareOpinion.actions.shortSurvey': '简短问卷',
'shareOpinion.dialog.title': '分享你的意见',
'shareOpinion.toast.title': '帮助塑造 OpenChamber',
'shareOpinion.toast.description': '告诉我们哪些有用、令人困惑或缺失,帮助塑造下一步。',
'sessions.sidebar.footer.actions.shareOpinion': '分享意见',
'layout.mainTab.chat': '聊天',
'layout.mainTab.plan': '计划',
'layout.mainTab.diff': '差异',
@@ -30,6 +38,50 @@ export const dict: Record<I18nKey, string> = {
'layout.mainTab.terminal': '终端',
'layout.mainTab.context': '上下文',
'mobile.nav.aria': '移动导航',
'mobile.connect.welcome.title': '连接到 OpenChamber',
'mobile.connect.welcome.description': '添加服务器 URL 或扫描配对二维码即可开始使用移动应用。',
'mobile.connect.url.label': '服务器 URL',
'mobile.connect.url.placeholder': 'http://192.168.1.74:2606',
'mobile.connect.token.label': '客户端令牌',
'mobile.connect.token.placeholder': '粘贴访问令牌',
'mobile.connect.token.hint': '仅当服务器需要令牌而非密码时才需要填写。',
'mobile.connect.password.label': '密码',
'mobile.connect.password.placeholder': 'OpenChamber 密码',
'mobile.connect.connectButton': '连接',
'mobile.connect.unlockButton': '解锁并连接',
'mobile.connect.cancelPassword': '使用其他服务器',
'mobile.connect.connecting': '连接中...',
'mobile.connect.scanQr': '扫描二维码',
'mobile.connect.welcome.scanHint': '在电脑上打开「添加设备」显示二维码,然后在这里扫描。',
'mobile.connect.advanced': '高级',
'mobile.connect.manual.toggle': '通过地址连接',
'mobile.connect.scan.permissionDenied': '相机访问已关闭。请在“设置”中开启以扫描二维码。',
'mobile.connect.scan.failed': '无法扫描该二维码。请重试或手动输入网址。',
'mobile.connect.scan.invalid': '该二维码不是 OpenChamber 连接码。',
'mobile.connect.scan.unsupported': '二维码扫描仅在已安装的移动应用中可用。',
'mobile.connect.saved.title': '已保存的连接',
'mobile.connect.saved.empty': '暂无已保存的连接。',
'mobile.connect.relay.badge': '通过 OpenChamber Relay 连接',
'mobile.connect.error.urlRequired': '请输入服务器 URL。',
'mobile.connect.error.invalidUrl': '该服务器 URL 无效。',
'mobile.connect.error.unreachable': '无法连接到该 OpenChamber 服务器。',
'mobile.connect.error.authRequired': '该服务器需要密码或客户端令牌。',
'mobile.connect.error.passwordFailed': '无法解锁该服务器。请检查密码。',
'mobile.instances.addTitle': '添加实例',
'mobile.instances.addManual': '通过地址添加',
'mobile.instances.editTitle': '编辑实例',
'mobile.instances.edit': '编辑',
'mobile.instances.delete': '删除',
'mobile.instances.deleteAria': '删除 {label}',
'mobile.instances.confirmDeleteAria': '确认删除 {label}',
'mobile.instances.cancelDeleteAria': '保留 {label}',
'mobile.instances.cancelEdit': '取消',
'mobile.instances.label.label': '名称',
'mobile.instances.label.placeholder': '可选显示名称',
'mobile.instances.saveNew': '保存实例',
'mobile.instances.status.connectedDirect': '已连接 · 局域网',
'mobile.instances.status.connectedRelay': '已连接 · 私有中继',
'mobile.instances.saveEdit': '保存更改',
'mobile.nav.changes': '更改',
'mobile.nav.settings': '设置',
'mobile.surface.closeAria': '关闭',
@@ -42,6 +94,7 @@ export const dict: Record<I18nKey, string> = {
'mobile.menu.files': '文件',
'mobile.menu.changes': '更改',
'mobile.menu.mcp': 'MCP',
'mobile.menu.instances': '实例',
'mobile.menu.update': '更新',
'mobile.menu.settings': '设置',
'mobile.sessions.newChatCta': '在 {project} 中新建会话',
@@ -240,6 +293,10 @@ export const dict: Record<I18nKey, string> = {
'sessions.scheduledTasks.editor.prompt.placeholder': '总结未完成任务并给出下一步建议',
'sessions.scheduledTasks.editor.enabled.aria': '启用任务',
'sessions.scheduledTasks.editor.enabled.label': '已启用',
'sessions.scheduledTasks.editor.goal.label': '作为目标运行',
'sessions.scheduledTasks.editor.goal.aria': '将此任务作为代理持续推进直至完成的目标运行',
'sessions.scheduledTasks.editor.goal.budgetLabel': '令牌预算',
'sessions.scheduledTasks.editor.goal.budgetAria': '用令牌预算限制该目标',
'sessions.scheduledTasks.editor.actions.closeAria': '关闭',
'sessions.scheduledTasks.editor.actions.cancel': '取消',
'sessions.scheduledTasks.editor.actions.save': '保存',
@@ -330,6 +387,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.actions.searchSessions': '搜索会话',
'sessions.sidebar.header.actions.exitSelection': '退出选择',
'sessions.sidebar.header.actions.selectSessions': '选择会话',
'sessions.sidebar.header.actions.sortProjects': '排序项目',
'sessions.sidebar.header.actions.sessionDisplayMode': '会话显示模式',
'sessions.sidebar.header.displayMode.label': '显示模式',
'sessions.sidebar.header.displayMode.default': '默认',
@@ -338,6 +396,11 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.displayMode.showArchived': '显示已归档会话',
'sessions.sidebar.header.displayMode.collapseAll': '全部折叠',
'sessions.sidebar.header.displayMode.expandAll': '全部展开',
'sessions.sidebar.header.projectSort.manual': '手动',
'sessions.sidebar.header.projectSort.aToZ': 'A → Z',
'sessions.sidebar.header.projectSort.zToA': 'Z → A',
'sessions.sidebar.header.projectSort.dateAdded': '最新',
'sessions.sidebar.header.projectSort.recent': '最近',
'sessions.sidebar.header.search.matchCountSingle': '{count} 个匹配',
'sessions.sidebar.header.search.matchCountPlural': '{count} 个匹配',
'sessions.sidebar.header.search.escapeHint': '按 Esc 清除',
@@ -382,6 +445,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.project.actions.projectMenu': '项目菜单',
'sessions.sidebar.project.actions.newSession': '新建会话',
'sessions.sidebar.project.actions.closeProject': '关闭项目',
'sessions.sidebar.project.actions.edit': '编辑',
'sessions.sidebar.project.actions.newDraftSession': '新建草稿会话',
'sessions.sidebar.session.menu.rename': '重命名',
'sessions.sidebar.session.rename.save': '保存会话名称',
@@ -1173,6 +1237,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.state.loadingRepositoryStatus': '正在加载仓库状态...',
'diffView.state.notGitRepository': '当前不是 Git 仓库。请在 Git 标签中初始化或切换目录。',
'diffView.state.cleanWorkingTree': '工作区干净,没有可显示的改动',
'diffView.state.noLastTurnChanges': '没有可显示的上一轮更改',
'diffView.state.failedToLoadDiff': '加载差异失败',
'diffView.state.loadingDiff': '正在加载差异...',
'diffView.state.loadingChanges': '正在加载变更...',
@@ -1182,6 +1247,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.summary.changedFilesPlural': '{count} 个文件已变更',
"diffView.scope.changed": "已更改",
"diffView.scope.staged": "已暂存",
"diffView.scope.lastTurn": "上一轮",
"diffView.scope.selectorAria": "选择更改模式",
'diffView.actions.retry': '重试',
'diffView.actions.renderAnyway': '仍然渲染',
@@ -1198,12 +1264,20 @@ export const dict: Record<I18nKey, string> = {
'diffView.reviewDialog.title': 'Review changes',
'diffView.reviewDialog.description': 'Start a separate review session for the current changes.',
'diffView.reviewDialog.generateHandoff': 'Generate handoff',
'diffView.reviewDialog.autoReview': '运行自动审查循环',
'diffView.reviewDialog.info': 'This flow works best if started in the session where the changes were implemented.',
'diffView.reviewDialog.actions.cancel': 'Cancel',
'diffView.reviewDialog.actions.start': 'Review',
'diffView.reviewDialog.actions.starting': 'Starting...',
'diffView.reviewDialog.toast.noSessionDirectory': 'Session directory is unavailable',
'diffView.reviewDialog.toast.startFailed': 'Failed to start review flow',
'chat.history.loadOlder': '加载更早的消息',
'chat.autoReview.title': '代码审查循环正在运行',
'chat.autoReview.status.waitingForReviewer': '等待审查者',
'chat.autoReview.status.waitingForImplementer': '等待实现者',
'chat.autoReview.reviewSessionLabel': '审查会话',
'chat.autoReview.actions.open': '打开',
'chat.autoReview.actions.stop': '停止',
'diffView.hunk.label': '代码块',
'diffView.hunk.stage': '暂存',
'diffView.hunk.unstage': '取消暂存',
@@ -1305,6 +1379,43 @@ export const dict: Record<I18nKey, string> = {
"header.actions.toggleChangesPanelAria": "切换更改面板",
'header.actions.planWithShortcut': '计划({shortcut})',
'header.actions.terminalPanelWithShortcut': '终端面板({shortcut})',
'chat.recap.aria': '会话回顾',
'chat.recap.label': '回顾:',
'chat.goal.dialog.titleCreate': '设置会话目标',
'chat.goal.dialog.titleManage': '会话目标',
'chat.goal.dialog.objectiveLabel': '目标',
'chat.goal.dialog.objectivePlaceholder': '描述代理应达到并验证的最终状态…',
'chat.goal.dialog.budgetLabel': '令牌预算',
'chat.goal.status.active': '进行中',
'chat.goal.status.evaluating': '评估中…',
'chat.goal.status.paused': '已暂停',
'chat.goal.status.blocked': '已阻塞',
'chat.goal.status.budgetLimited': '已达预算',
'chat.goal.status.complete': '已完成',
'chat.goal.usage.tokens': '{used} 令牌',
'chat.goal.usage.tokensWithBudget': '{used}/{budget} 令牌',
'chat.goal.usage.turns': '{turns} 次续跑',
'chat.goal.action.pause': '暂停',
'chat.goal.action.resume': '继续',
'chat.goal.action.markComplete': '标记为完成',
'chat.goal.action.clear': '移除目标',
'chat.goal.action.cancel': '取消',
'chat.goal.action.save': '保存目标',
'chat.goal.action.start': '启动目标',
'chat.goal.toast.actionFailed': '目标更新失败',
'chat.goal.row.aria': '会话目标 — 打开详情',
'chat.goal.button.createAria': '设置会话目标',
'chat.goal.button.manageAria': '管理会话目标',
'chat.goal.button.armAria': '用下一条消息启动目标',
'chat.goal.counter.aria': '目标长度限制',
'chat.goal.button.disarmAria': '目标已就绪 — 点按取消就绪',
'chat.goal.button.cancelAria': '目标进行中 — 点按取消',
'chat.goal.cancelDialog.title': '取消此目标?',
'chat.goal.cancelDialog.description': '代理将停止自动朝该目标工作。',
'chat.goal.cancelDialog.keep': '保留目标',
'chat.goal.cancelDialog.confirm': '取消目标',
'chat.suggestion.applyAria': '使用建议的消息',
'chat.suggestion.dismissAria': '关闭建议',
'header.actions.toggleTerminalPanelAria': '切换终端面板',
'terminalView.stream.processExitedMessage': '\r\n[进程已退出{exitCodeSegment}{signalSegment}]\r\n',
'terminalView.stream.processExitedWithCode': ',退出码 {exitCode}',
@@ -1686,6 +1797,7 @@ export const dict: Record<I18nKey, string> = {
'chat.queuedMessage.edit': 'edit',
'chat.queuedMessage.send': 'send',
'chat.queuedMessage.removeAria': '从队列移除',
'chat.queuedMessage.reorderAria': '拖动以重新排序',
'chat.container.returnToParent.aria': '返回父会话',
'chat.container.returnToParent.titleNamed': '返回到:{title}',
'chat.container.returnToParent.title': '返回父会话',
@@ -1790,6 +1902,18 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.placeholder.chat': '@ 用于文件/智能体;/ 用于命令和技能;! 用于 shell;# 用于代码片段',
'chat.chatInput.placeholder.chatCompact': '使用 @ / ! # 辅助',
'chat.chatInput.placeholder.selectSession': '选择或创建会话以开始聊天',
'chat.dictation.start': '开始语音输入',
'chat.dictation.overlayAria': '语音输入',
'chat.dictation.downloadingModel': '正在下载语音模型...',
'chat.dictation.downloadingModelProgress': '正在下载语音模型... {percent}%',
'chat.dictation.listening': '正在聆听...',
'chat.dictation.processing': '正在转写...',
'chat.dictation.failed': '转写失败',
'chat.dictation.cancel': '放弃语音输入',
'chat.dictation.insert': '插入文本',
'chat.dictation.insertAndSend': '插入并发送',
'chat.dictation.retry': '重试转写',
'chat.dictation.discard': '放弃录音',
'chat.snippetAutocomplete.action.addNew': '+ 新建代码片段',
'chat.snippetAutocomplete.empty': '未找到代码片段',
'chat.snippetAutocomplete.footer': '↑↓ 导航 • Enter 选择 • Esc 关闭',
@@ -1825,6 +1949,9 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.previewContextRemove': '移除预览上下文',
'chat.chatInput.projectRoot': '项目根目录',
'chat.chatInput.branch': '分支',
'chat.chatInput.draftPicker.projectTitle': '项目',
'chat.chatInput.draftPicker.searchProjects': '搜索项目...',
'chat.chatInput.draftPicker.searchBranches': '搜索分支...',
'chat.chatInput.worktrees': '工作树',
'chat.chatInput.worktreeNew': '+ 新建',
'chat.chatInput.drop.insertMention': '释放以插入为提及',
@@ -1850,6 +1977,11 @@ export const dict: Record<I18nKey, string> = {
'chat.toolOutputDialog.image.closeAria': '关闭图片预览',
'chat.toolOutputDialog.mermaid.missingSource': '缺少 Mermaid 源 URL。',
'chat.toolOutputDialog.mermaid.loadFailed': '无法加载 Mermaid 图表。',
'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'Mermaid 数据 URL 格式不正确。',
'chat.toolOutputDialog.mermaid.invalidLocalPath': 'Mermaid 本地文件路径无效。',
'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': '无法读取 Mermaid 文件。状态:{status}。',
'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': '不支持该 Mermaid URL 协议。',
'chat.toolOutputDialog.mermaid.loadFailedWithStatus': '无法加载 Mermaid 图表。状态:{status}。',
'chat.toolOutputDialog.mermaid.closeAria': '关闭图表预览',
'chat.toolOutputDialog.mermaid.loading': '正在加载图表...',
'chat.toolOutputDialog.mermaid.renderFailed': '无法渲染 Mermaid 图表。',
@@ -1864,6 +1996,9 @@ export const dict: Record<I18nKey, string> = {
'chat.toolPart.output': '输出',
'chat.toolPart.showRawJson': '显示原始 JSON',
'chat.toolPart.showFormattedJson': '显示格式化 JSON',
'chat.toolPart.showNavigableJson': '显示可导航 JSON',
'chat.toolPart.openFileAtFirstChange': '在首次更改处打开文件',
'chat.toolPart.openFileDiff': '打开文件差异',
'chat.toolPart.copyOutput': '复制输出',
'chat.toolPart.copiedOutput': '已复制输出',
'chat.toolPart.copyOutputFailed': '复制输出失败',
@@ -1957,6 +2092,7 @@ export const dict: Record<I18nKey, string> = {
'chat.modelControls.noProvidersOrModelsFound': '没有提供商或模型匹配你的搜索。',
'chat.modelControls.reorderFavoriteAria': '重新排序收藏',
'chat.modelControls.reorderFavoriteTitle': '拖动以重新排序收藏',
'chat.modelControls.reorderProviderTitle': '拖动以重新排序提供商',
'chat.modelControls.permissionLabel.custom': '自定义',
'chat.modelControls.permissionLabel.allow': '允许',
'chat.modelControls.permissionLabel.deny': '拒绝',
@@ -2197,7 +2333,7 @@ export const dict: Record<I18nKey, string> = {
'sessionAuth.error.networkTitle': '无法连接服务器',
'sessionAuth.error.rateLimitDescriptionSingle': '请等待 {minutes} 分钟后再试。',
'sessionAuth.error.rateLimitDescriptionPlural': '请等待 {minutes} 分钟后再试。',
'sessionAuth.error.networkDescription': '无法验证 UI 会话。请检查服务是否运行后重试。',
'sessionAuth.error.networkDescription': '无法验证 UI 会话。如果你是从本地网络中的另一台设备打开 OpenChamber,请在桌面端应用中启用 Desktop Network Access,并使用设置中显示的 LAN 地址。',
'sessionAuth.error.retry': '重试',
'sessionAuth.error.passkeySetupFailed': 'Passkey 设置失败。',
'sessionAuth.error.incorrectPassword': '密码错误,请重试。',
@@ -2484,9 +2620,14 @@ export const dict: Record<I18nKey, string> = {
'updateDialog.status.downloading': '下载中...',
'updateDialog.actions.restartToUpdate': '重启以更新',
'updateDialog.actions.updateNow': '立即更新',
'updateDialog.actions.openMobileUpdate': '打开更新',
'updateDialog.status.updating': '更新中...',
'updateDialog.error.updateFailed': '更新失败',
'updateDialog.error.takingLonger': '更新耗时超出预期。请稍等后刷新,或运行:openchamber update',
'mobileUpdate.toast.available.title': 'OpenChamber 更新可用',
'mobileUpdate.toast.available.description': '版本 {version} 已可用于 Android。',
'mobileUpdate.toast.actions.download': '下载',
'mobileUpdate.toast.actions.dismiss': '忽略',
'opencodeUpdate.toast.available.title': 'OpenCode 更新',
'opencodeUpdate.toast.available.description': '版本 {version} 可用。',
'opencodeUpdate.toast.actions.update': '更新',
@@ -2562,12 +2703,19 @@ export const dict: Record<I18nKey, string> = {
'mainLayout.mobile.closeDrawerAria': '关闭抽屉',
'sortableTabsStrip.aria.tabs': '标签页',
'openChamberLogo.aria.logo': 'OpenChamber 标志',
'markdownRenderer.code.actions.copyTitle': '复制代码',
'markdownRenderer.code.actions.copiedTitle': '已复制',
'markdownRenderer.table.actions.copyTitle': '复制表格',
'markdownRenderer.code.actions.enableWrapTitle': '启用自动换行',
'markdownRenderer.code.actions.disableWrapTitle': '禁用自动换行',
'markdownRenderer.table.actions.downloadTitle': '下载表格',
'markdownRenderer.table.toast.downloadedAsFormat': '表格已下载为 {format}',
'markdownRenderer.mermaid.actions.copyTitle': '复制',
'markdownRenderer.mermaid.actions.copySourceTitle': '复制源码',
'markdownRenderer.mermaid.actions.downloadSvgTitle': '下载 SVG',
'markdownRenderer.mermaid.actions.zoomInTitle': '放大',
'markdownRenderer.mermaid.actions.zoomOutTitle': '缩小',
'markdownRenderer.mermaid.actions.resetViewTitle': '重置视图',
'markdownRenderer.mermaid.toast.downloadFailed': '下载图表失败',
'contextPanel.preview.title': '预览',
'contextPanel.preview.description': '使用项目操作或终端 Preview 按钮打开预览。',
@@ -226,11 +226,18 @@
'settings.remoteInstances.direct.sidebarTitle': '直接連線',
'settings.remoteInstances.direct.sidebarDescription': '連線到已在執行的 OpenChamber 伺服器。',
'settings.remoteInstances.direct.title': '直接遠端執行個體',
'settings.remoteInstances.direct.description': '儲存可從桌面切換器使用的遠端伺服器 URL。',
'settings.remoteInstances.direct.description': '此應用可切換到的伺服器。從另一台伺服器匯入配對連結,或透過位址新增。',
'settings.remoteInstances.direct.addDialog.description': '儲存可從桌面切換器使用的遠端伺服器 URL。',
'settings.remoteInstances.direct.field.labelPlaceholder': '我的遠端伺服器',
'settings.remoteInstances.direct.field.urlPlaceholder': 'https://openchamber.example.com',
'settings.remoteInstances.direct.field.tokenPlaceholder': '用戶端 token(可選)',
'settings.remoteInstances.direct.note': '直接連線假設遠端伺服器已在執行並可從此裝置存取。',
'settings.remoteInstances.direct.headers.title': 'Additional headers',
'settings.remoteInstances.direct.headers.description': 'Optional HTTP headers for desktop API requests. Authorization is reserved for the connection token.',
'settings.remoteInstances.direct.headers.field.namePlaceholder': 'Header name',
'settings.remoteInstances.direct.headers.field.valuePlaceholder': 'Header value',
'settings.remoteInstances.direct.headers.actions.add': 'Add header',
'settings.remoteInstances.direct.headers.removeAria': 'Remove header',
'settings.remoteInstances.direct.actions.add': '新增直接連線',
'settings.remoteInstances.direct.import.description': '貼上 connect-url 輸出或 openchamber://connect 連結來匯入。',
'settings.remoteInstances.direct.import.placeholder': '貼上連線連結',
@@ -240,20 +247,74 @@
'settings.remoteInstances.direct.state.empty': '尚無直接連線。',
'settings.remoteInstances.clientAuth.title': '用戶端存取 token',
'settings.remoteInstances.clientAuth.description': '建立與管理可讓桌面或遠端用戶端連線的 token。',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': '裝置或用戶端名稱',
'settings.remoteInstances.clientAuth.field.labelPlaceholder': '裝置名稱 — 例如 My iPhone',
'settings.remoteInstances.clientAuth.actions.create': '建立 token',
'settings.remoteInstances.clientAuth.actions.pair': '配對裝置',
'settings.remoteInstances.clientAuth.actions.revoke': '撤銷',
'settings.remoteInstances.clientAuth.actions.clearRevoked': '清除已撤銷',
'settings.remoteInstances.clientAuth.qrAlt': '配對 QR code',
'settings.remoteInstances.clientAuth.qrEnlarge': '放大 QR code',
'settings.remoteInstances.clientAuth.qrScanHint': '用另一台裝置上的 OpenChamber 應用程式掃描。一次性使用且會過期。',
'settings.remoteInstances.clientAuth.qrDialogTitle': '掃碼連線',
'settings.remoteInstances.clientAuth.actions.addDevice': '新增裝置',
'settings.remoteInstances.clientAuth.actions.copied': '已複製',
'settings.remoteInstances.clientAuth.addDevice.transportLabel': '你會在哪裡使用這台裝置?',
'settings.remoteInstances.clientAuth.addDevice.subtitle': '建立一次性 QR 代碼,將另一台裝置連線到此伺服器。',
'settings.remoteInstances.clientAuth.addDevice.transport.local': '僅本機',
'settings.remoteInstances.clientAuth.addDevice.transport.localHint': '供同一台電腦上的應用程式使用。',
'settings.remoteInstances.clientAuth.addDevice.transport.lan': '僅家用網路',
'settings.remoteInstances.clientAuth.addDevice.transport.lanHint': '透過 Wi-Fi 直接連線。離開此網路後無法使用。',
'settings.remoteInstances.clientAuth.addDevice.transport.relay': '任何地方',
'settings.remoteInstances.clientAuth.addDevice.transport.relayHint': '在家與外出都可用。外出時流量經由 OpenChamber Private Relay(端對端加密隧道)傳輸,無需設定。',
'settings.remoteInstances.clientAuth.addDevice.fallback.relay': '外出時也允許透過加密中繼連線',
'settings.remoteInstances.clientAuth.addDevice.fallback.preferLocal': '在家時優先使用直接連線',
'settings.remoteInstances.clientAuth.addDevice.create': '建立 QR 代碼',
'settings.remoteInstances.clientAuth.addDevice.done': '完成',
'settings.remoteInstances.clientAuth.addDevice.connectedToast': '裝置已連線。',
'settings.remoteInstances.clientAuth.pairingUrl': '配對 URL',
'settings.remoteInstances.clientAuth.createdToken': '已建立 token',
'settings.remoteInstances.clientAuth.state.loading': '正在載入用戶端 token...',
'settings.remoteInstances.clientAuth.state.empty': '尚無用戶端 token。',
'settings.remoteInstances.clientAuth.state.revoked': '已撤銷',
'settings.remoteInstances.clientAuth.state.thisDevice': '此裝置',
'settings.remoteInstances.clientAuth.state.pending': '等待連線…',
'settings.remoteInstances.clientAuth.state.viaRelay': 'Relay',
'settings.remoteInstances.clientAuth.state.connectedDirect': '已連線 · 區域網路',
'settings.remoteInstances.clientAuth.state.connectedRelay': '已連線 · 中繼',
'settings.remoteInstances.clientAuth.lastUsed': '上次使用:{date}',
'settings.remoteInstances.clientAuth.neverUsed': '從未使用',
'settings.remoteInstances.relay.title': 'OpenChamber Relay',
'settings.remoteInstances.relay.autoHint': '透過中繼配對裝置時自動開啟。',
'settings.remoteInstances.relay.description': '無需開放連接埠,即可讓你的其他裝置從任何地方連線。流量端對端加密,中繼無法讀取內容。',
'settings.remoteInstances.relay.enableHint': '在此伺服器上啟用中繼之前,不會共享任何內容。',
'settings.remoteInstances.relay.actions.enable': '啟用中繼',
'settings.remoteInstances.relay.actions.disable': '停用',
'settings.remoteInstances.relay.confirm.disable': '停用中繼?透過它連線的裝置將立即中斷連線。',
'settings.remoteInstances.relay.state.loading': '正在檢查中繼狀態...',
'settings.remoteInstances.relay.state.disabled': '已停用',
'settings.remoteInstances.relay.state.connecting': '連線中',
'settings.remoteInstances.relay.state.connected': '已連線',
'settings.remoteInstances.relay.state.reconnecting': '重新連線中',
'settings.remoteInstances.relay.state.error': '錯誤',
'settings.remoteInstances.relay.status.clientsOne': '已連線 {count} 台裝置',
'settings.remoteInstances.relay.status.clientsMany': '已連線 {count} 台裝置',
'settings.remoteInstances.relay.pair.title': '配對裝置',
'settings.remoteInstances.relay.pair.labelPlaceholder': '裝置名稱(選填)',
'settings.remoteInstances.relay.pair.includeToken': '包含存取權杖(掃一次即完成配對)',
'settings.remoteInstances.relay.pair.noTokenHint': '不包含權杖時,裝置連線後需使用此伺服器的介面密碼登入。',
'settings.remoteInstances.relay.pair.generate': '建立配對連結',
'settings.remoteInstances.relay.pair.requiresConnected': '中繼連線後即可配對。',
'settings.remoteInstances.relay.pair.linkLabel': '配對連結',
'settings.remoteInstances.relay.pair.warning': '此連結可存取此伺服器,請勿分享。',
'settings.remoteInstances.relay.pair.qrAlt': '中繼配對 QR 碼',
'settings.remoteInstances.relay.pair.showQr': '顯示 QR 碼',
'settings.remoteInstances.relay.pair.qrDialogTitle': '掃描配對',
'settings.remoteInstances.relay.pair.qrDialogDescription': '用另一台裝置上的 OpenChamber 應用程式掃描此 QR 碼。',
'settings.remoteInstances.relay.pair.manageHint': '可在上方「連線到此伺服器」清單中管理或撤銷已配對的裝置。',
'settings.remoteInstances.relay.toast.enableFailed': '無法啟用中繼',
'settings.remoteInstances.relay.toast.disableFailed': '無法停用中繼',
'settings.remoteInstances.relay.toast.offerFailed': '無法建立配對連結',
'settings.remoteInstances.relay.toast.linkCopied': '已複製配對連結',
'settings.remoteInstances.page.section.instance': '執行個體',
'settings.remoteInstances.page.section.instanceDescription': '核心 SSH 設定。',
'settings.remoteInstances.page.field.mode': '模式',
@@ -362,12 +423,14 @@
'settings.agents.sidebar.toast.agentExists': '已存在同名 agent',
'settings.agents.sidebar.toast.removeOldAfterRenameFailed': '重新命名後移除舊 agent 失敗',
'settings.agents.sidebar.toast.renameFailed': '重新命名 agent 失敗',
'settings.agents.sidebar.toast.agentRenamed': 'Agent 已重新命名為 "{name}"',
'settings.agents.page.toast.permissionNameRequired': '權限名稱為必填項',
'settings.agents.page.toast.created': 'Agent 建立成功',
'settings.agents.page.toast.updated': 'Agent 更新成功',
'settings.agents.page.toast.createFailed': '建立 agent 失敗',
'settings.agents.page.toast.updateFailed': '更新 agent 失敗',
'settings.agents.page.toast.saveUnexpectedError': '儲存時發生錯誤',
'settings.agents.page.toast.savedManualRestart': '已儲存到磁碟。請重新啟動已連線的 OpenCode 伺服器以套用變更。',
'settings.agents.page.empty.title': '從側邊欄選擇一個 agent',
'settings.agents.page.empty.description': '或建立一個 agent',
'settings.agents.page.title.new': '新增 Agent',
@@ -384,6 +447,10 @@
'settings.agents.page.field.mode': '模式',
'settings.agents.page.field.modeTooltip': 'Primary 與 Subagent 可見性',
'settings.agents.page.field.overrideModel': '覆寫模型',
'settings.agents.page.field.variant': '思考變體',
'settings.agents.page.field.variantTooltip': '選填。如果模型支援推理,變體控制推理深度。',
'settings.agents.page.field.variantHint': '模型特定(如 Anthropic variant)',
'settings.agents.page.field.variantPlaceholder': '例如 high, max, low, none',
'settings.agents.page.field.temperature': 'Temperature',
'settings.agents.page.field.temperatureTooltip': '控制隨機性。越高越有創造力,越低越聚焦。',
'settings.agents.page.field.temperatureRange': '0.0 到 2.0',
@@ -497,6 +564,7 @@
'settings.gitIdentities.editor.description.globalReadOnly': '系統範圍 Git 身分(唯讀)',
'settings.gitIdentities.editor.description.newProfile': '建立新的 Git 身分設定',
'settings.gitIdentities.editor.description.editProfile': '編輯身分設定',
'settings.gitIdentities.editor.section.commitSigning': '提交簽章',
'settings.gitIdentities.editor.field.profileName': '身分名稱',
'settings.gitIdentities.editor.field.profileNamePlaceholder': '工作身分、個人身分等',
'settings.gitIdentities.editor.field.color': '顏色',
@@ -512,6 +580,9 @@
'settings.gitIdentities.editor.field.sshKeyPath': 'SSH 金鑰路徑',
'settings.gitIdentities.editor.field.sshKeyPathTooltip': '可選私鑰路徑,例如 ~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.sshKeyPathPlaceholder': '~/.ssh/id_ed25519',
'settings.gitIdentities.editor.field.signCommits': '使用此身分簽署提交',
'settings.gitIdentities.editor.field.signingKey': '簽章金鑰',
'settings.gitIdentities.editor.field.signingKeyPlaceholder': '~/.ssh/id_ed25519.pub',
'settings.gitIdentities.editor.field.host': 'Host',
'settings.gitIdentities.editor.field.hostTooltip': '該 host 的 token 將從 ~/.git-credentials 讀取。',
'settings.gitIdentities.editor.field.hostPlaceholder': 'github.com',
@@ -520,6 +591,7 @@
'settings.gitIdentities.editor.actions.save': '儲存',
'settings.gitIdentities.editor.toast.userNameEmailRequired': '使用者名稱和電子郵件為必填項',
'settings.gitIdentities.editor.toast.hostRequiredForToken': '基於 token 驗證時 Host 為必填項',
'settings.gitIdentities.editor.toast.signingKeyRequired': '啟用提交簽章時需要簽章金鑰',
'settings.gitIdentities.editor.toast.profileCreated': '身分已建立',
'settings.gitIdentities.editor.toast.profileUpdated': '身分已更新',
'settings.gitIdentities.editor.toast.createProfileFailed': '建立身分失敗',
@@ -839,6 +911,7 @@
'settings.openchamber.keyboardShortcuts.action.cycle_agent.label': '輪換 agent',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_forward.label': '向前輪換收藏模型',
'settings.openchamber.keyboardShortcuts.action.cycle_favorite_model_backward.label': '向後輪換收藏模型',
'settings.openchamber.keyboardShortcuts.action.open_model_selector.label': '開啟模型選擇器',
'settings.openchamber.keyboardShortcuts.action.expand_input.label': '展開輸入方塊',
'settings.openchamber.keyboardShortcuts.action.open_timeline_dialog.label': '開啟對話時間軸',
'settings.projects.sidebar.total': '總計 {count}',
@@ -848,6 +921,8 @@
'settings.projects.page.section.worktree': 'Worktree',
'settings.projects.page.field.projectName': '專案名稱',
'settings.projects.page.field.projectNamePlaceholder': '專案名稱',
'settings.projects.page.field.defaultModel': '新聊天的預設模型',
'settings.projects.page.field.defaultModelDescription': '在此專案中開始新聊天時使用。若未設定,則回退至全域預設值。',
'settings.projects.page.field.accentColor': '強調色',
'settings.projects.page.field.projectIcon': '專案圖示',
'settings.projects.page.field.projectIconBackgroundAria': '專案圖示背景顏色',
@@ -869,6 +944,7 @@
'settings.projects.page.toast.discoverIconFailed': '發現專案圖示失敗',
'settings.projects.page.toast.customIconAlreadySet': '該專案已設定自訂圖示',
'settings.projects.page.toast.iconDiscovered': '專案圖示已發現',
'settings.projects.page.toast.saveFailed': '儲存專案設定失敗',
'settings.usage.sidebar.title': '用量',
'settings.usage.sidebar.total': '總計 {count}',
'settings.usage.sidebar.actions.toggleAutoRefreshAria': '切換自動重新整理',
@@ -1003,6 +1079,9 @@
'settings.openchamber.worktrees.setup.commandPlaceholder': '例如:bun install',
'settings.openchamber.worktrees.setup.removeCommandAria': '移除命令',
'settings.openchamber.worktrees.setup.addCommand': '新增命令',
'settings.openchamber.worktrees.setup.waitForCommands': '建立或傳送工作階段前等待設定命令完成',
'settings.openchamber.worktrees.setup.waitForCommandsAria': '建立或傳送工作階段前等待 Worktree 設定命令完成',
'settings.openchamber.worktrees.setup.toast.saveFailed': '儲存 Worktree 設定命令失敗',
'settings.openchamber.worktrees.list.title': '現有 worktree',
'settings.openchamber.worktrees.list.tooltip': 'Worktree 位於儲存庫外部(由 OpenCode 管理)。刪除 worktree 也會刪除關聯工作階段。',
'settings.openchamber.worktrees.list.loading': '正在載入 worktree...',
@@ -1259,6 +1338,11 @@
'settings.openchamber.defaults.field.thinkingPlaceholder': '思考模式',
'settings.openchamber.defaults.field.defaultAgent': '預設 Agent',
'settings.openchamber.defaults.field.showDeletionDialogAria': '顯示刪除對話方塊',
'settings.openchamber.defaults.smallModel.title': '小模型',
'settings.openchamber.defaults.smallModel.description': '用於快速實用任務(如簡短回顧與摘要)的廉價模型。',
'settings.openchamber.defaults.smallModel.useDefault': '使用預設小模型',
'settings.openchamber.defaults.smallModel.useDefaultAria': '使用預設小模型',
'settings.openchamber.defaults.smallModel.overrideModel': '覆寫模型',
'settings.openchamber.defaults.field.showDeletionDialog': '顯示刪除對話方塊',
'settings.openchamber.defaults.field.openFilesPreviewAria': '以預覽模式開啟檔案',
'settings.openchamber.defaults.field.openFilesPreview': '以預覽模式開啟檔案',
@@ -1381,16 +1465,33 @@
'settings.notifications.page.toast.backgroundDisabled': '背景通知已關閉',
'settings.notifications.page.testNotification.title': '測試通知',
'settings.notifications.page.testNotification.body': '這是來自 OpenChamber 的測試通知。',
'settings.voice.page.section.voiceSetup': '語音設定',
'settings.voice.page.section.speechRecognition': '語音辨識',
'settings.voice.page.field.enableVoiceInput': '啟用語音輸入',
'settings.voice.page.field.enableVoiceInputAria': '啟用語音輸入(聽寫)',
'settings.voice.page.section.playbackAndSummary': '播放',
'settings.voice.page.field.enableVoiceModeAria': '啟用語音模式',
'settings.voice.page.field.enableVoiceMode': '啟用語音模式',
'settings.voice.page.field.provider': '提供方',
'settings.voice.page.provider.browser': '瀏覽器',
'settings.voice.page.provider.custom': '自訂',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': '伺服器',
'settings.voice.page.provider.local': '本機',
'settings.voice.page.tooltip.sttLocal': '在 OpenChamber 伺服器上本機轉寫。模型會自動下載,無需 API 金鑰。',
'settings.voice.page.tooltip.localTts': '在 OpenChamber 伺服器上本機合成語音(Kokoro,英文)。模型會自動下載,無需 API 金鑰。',
'settings.voice.page.stt.model.parakeetV2': 'Parakeet v2(英文)',
'settings.voice.page.stt.model.parakeetV3': 'Parakeet v3(25 種歐洲語言)',
'settings.voice.page.stt.model.whisperBase': 'Whisper base(多語言)',
'settings.voice.page.stt.model.whisperTiny': 'Whisper tiny(多語言)',
'settings.voice.page.stt.badge.bestForEnglish': '英文最佳',
'settings.voice.page.stt.badge.bestForMultilingual': '多語言最佳',
'settings.voice.page.stt.meta.accuracy': '準確度',
'settings.voice.page.stt.meta.speed': '速度',
'settings.voice.page.stt.modelInstalled': '模型已安裝',
'settings.voice.page.stt.modelDownloading': '正在下載模型...',
'settings.voice.page.stt.modelDownloadingProgress': '正在下載模型... {percent}%',
'settings.voice.page.stt.modelNotInstalled': '模型未下載',
'settings.voice.page.stt.modelDownload': '下載',
'settings.voice.page.stt.modelDelete': '刪除模型',
'settings.voice.page.stt.modelRetry': '重試',
'settings.voice.page.provider.wasm': '本機',
'settings.voice.page.stt.wasmModel': 'Whisper 模型',
'settings.voice.page.stt.wasmLoaded': '模型已載入',
@@ -1447,6 +1548,7 @@
'settings.voice.page.field.ttsInputMode': 'TTS 輸入模式',
'settings.voice.page.field.ttsInputModeSanitized': '清理後文字',
'settings.voice.page.field.ttsInputModeRaw': '原始 Markdown',
'settings.voice.page.field.ttsInputModeSummarized': '摘要',
'settings.openchamber.visual.section.colorMode': '顏色模式',
'settings.openchamber.visual.section.localization': '在地化',
'settings.openchamber.visual.section.spacingAndLayout': '間距與佈局',
@@ -1477,6 +1579,8 @@
'settings.openchamber.visual.actions.reloadThemes': '重新載入主題',
'settings.openchamber.visual.field.macVibrancy': '視窗透明度',
'settings.openchamber.visual.field.macVibrancyHint': '在側邊欄後使用 macOS 原生模糊(vibrancy)。關閉以獲得完全不透明的介面。',
'settings.openchamber.visual.field.dockBadge': 'Dock 標記',
'settings.openchamber.visual.field.dockBadgeHint': '在 macOS Dock 圖示上顯示有未讀動態的對話數量。',
'settings.openchamber.visual.actions.saveAndRestart': '儲存並重新啟動',
'settings.openchamber.visual.actions.restarting': '正在重新啟動…',
'settings.openchamber.visual.actions.reloadingThemes': '正在重新載入主題...',
@@ -1505,10 +1609,12 @@
'settings.openchamber.visual.field.fontSizePercentageAria': '字體大小百分比',
'settings.openchamber.visual.actions.resetFontSizeAria': '重設字體大小',
'settings.openchamber.visual.field.terminalFontSize': '終端機字體大小',
'settings.openchamber.visual.field.editorFontSize': '編輯器字體大小',
'settings.openchamber.visual.field.codeFont': '程式碼字體',
'settings.openchamber.visual.field.selectCodeFontAria': '選擇程式碼字體',
'settings.openchamber.visual.actions.resetCodeFontAria': '重設程式碼字體',
'settings.openchamber.visual.actions.resetTerminalFontSizeAria': '重設終端機字體大小',
'settings.openchamber.visual.actions.resetEditorFontSizeAria': '重設編輯器字體大小',
'settings.openchamber.visual.field.spacingDensity': '間距密度',
'settings.openchamber.visual.actions.resetSpacingAria': '重設間距',
'settings.openchamber.visual.field.inputBarOffset': '輸入列偏移',
@@ -1528,6 +1634,16 @@
'settings.openchamber.visual.field.userMessageRenderingAria': '使用者訊息渲染:{option}',
'settings.openchamber.visual.field.mermaidRenderingAria': 'Mermaid 渲染:{option}',
'settings.openchamber.visual.field.diffLayoutAria': '差異佈局:{option}',
'settings.openchamber.visual.field.sessionRecap': '產生工作階段回顧',
'settings.openchamber.visual.field.sessionRecapAria': '代理完成後產生回顧',
'settings.openchamber.visual.field.sessionSuggestion': '產生下一則使用者訊息建議',
'settings.openchamber.visual.field.sessionSuggestionAria': '代理完成後產生下一則使用者訊息建議',
'settings.openchamber.visual.field.sessionGoal': '啟用工作階段目標',
'settings.openchamber.visual.field.sessionGoalAria': '讓工作階段自動朝目標持續工作',
'settings.openchamber.visual.goal.sectionTitle': '目標',
'settings.openchamber.visual.goal.budgetLabel': '預設權杖預算',
'settings.openchamber.visual.goal.budgetAria': '為新目標套用預設權杖預算',
'settings.openchamber.visual.goal.description': '在輸入框中啟用靶心按鈕,下一則訊息即成為目標:代理將在小型模型的稽核下自動持續工作,即使你不在電腦前。',
'settings.openchamber.visual.field.showReasoningTracesAria': '顯示推理軌跡',
'settings.openchamber.visual.field.showReasoningTraces': '顯示推理軌跡',
'settings.openchamber.visual.field.collapsibleThinkingBlocksAria': '啟用可摺疊推理區塊',
@@ -1544,6 +1660,8 @@
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '行內助理操作',
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '在同一則回覆中,如果助理文字區塊後方還有工具呼叫,則顯示「複製回答」「儲存為圖片」和「朗讀」操作。',
'settings.openchamber.visual.field.showToolFileIconsAria': '顯示工具檔案圖示',
'settings.openchamber.visual.field.codeBlockLineWrapAria': '程式碼區塊自動換行',
'settings.openchamber.visual.field.codeBlockLineWrap': '程式碼區塊自動換行',
'settings.openchamber.visual.field.showToolFileIcons': '顯示工具檔案圖示',
'settings.openchamber.visual.field.showTurnChangedFilesAria': '顯示已完成回合的變更檔案',
'settings.openchamber.visual.field.showTurnChangedFiles': '顯示已完成回合的變更檔案',
@@ -1707,9 +1825,19 @@
'settings.promptTemplates.page.toast.saveUnexpectedError': '儲存時發生意外錯誤',
'settings.openchamber.desktopNetwork.error.launchAtLoginSaveFailed': '無法更新登入時自動啟動設定',
'settings.openchamber.desktopNetwork.error.launchAtLoginUnsupported': '此系統不支援登入時自動啟動',
'settings.openchamber.desktopNetwork.error.minimizeToTrayUnsupported': '此系統不支援系統匣背景模式',
'settings.openchamber.desktopNetwork.error.minimizeToTraySaveFailed': '無法更新系統匣設定',
'settings.openchamber.desktopNetwork.error.keepAwakeUnsupported': '此系統不支援防止睡眠',
'settings.openchamber.desktopNetwork.error.keepAwakeSaveFailed': '無法更新保持喚醒設定',
'settings.openchamber.desktopNetwork.field.launchAtLogin': '登入時自動啟動 OpenChamber',
'settings.openchamber.desktopNetwork.field.launchAtLoginAria': '登入時自動啟動 OpenChamber',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': '在背景啟動應用程式,不開啟視窗。按一下 Dock 圖示即可開啟。',
'settings.openchamber.desktopNetwork.field.launchAtLoginDescription': '在背景啟動應用程式,不開啟視窗。可透過桌面狀態圖示開啟。',
'settings.openchamber.desktopNetwork.field.minimizeToTrayAria': '將 OpenChamber 最小化和關閉到系統匣',
'settings.openchamber.desktopNetwork.field.minimizeToTray': '最小化和關閉到系統匣',
'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription': '主視窗最小化或關閉時,讓 OpenChamber 繼續在 Windows 系統匣中執行。',
'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'OpenChamber 執行時保持電腦喚醒',
'settings.openchamber.desktopNetwork.field.keepAwake': 'OpenChamber 執行時保持電腦喚醒',
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': '讓手機可以持續開啟此應用程式。螢幕仍可關閉。',
'settings.openchamber.desktopPassword.field.password': '桌面 UI 密碼',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber 會在重新啟動後要求輸入密碼,之後會在登入工作階段過期時再次要求:12 小時後,或選擇「信任此裝置」後 7 天。留空可停用登入。',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': '不需要密碼',
@@ -1784,4 +1912,10 @@
'settings.usage.sidebar.field.showPredictions': '顯示預測',
'settings.view.home.cards.plugins.description': '管理 opencode 外掛',
'settings.view.home.cards.plugins.title': '外掛',
'settings.openchamber.visual.section.followUpBehavior': 'Follow-up behavior',
'settings.openchamber.visual.section.followUpBehaviorAria': 'Follow-up behavior',
'settings.openchamber.visual.field.followUpBehaviorAria': 'Follow-up behavior: {option}',
'settings.openchamber.visual.field.followUpBehaviorDescription': 'Choose what happens when you press Enter on a follow-up message while the agent is still responding.',
'settings.openchamber.visual.option.followUpBehavior.steer.label': 'Steer',
'settings.openchamber.visual.option.followUpBehavior.queue.label': 'Queue',
} as const;
+149 -1
View File
@@ -14,6 +14,7 @@ export const dict: Record<I18nKey, string> = {
'common.language.brazilianPortuguese': '巴西葡萄牙語',
'common.language.korean': '韓語',
'common.language.polish': '波蘭語',
'common.language.japanese': '日語',
'common.revealPath.finder': '在 Finder 中顯示',
'common.revealPath.fileExplorer': '在檔案總管中開啟',
'common.revealPath.fileManager': '在檔案管理員中開啟',
@@ -22,6 +23,13 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': '忽略',
'pwa.installPrompt.started': '已開始安裝',
'pwa.installPrompt.installed': 'OpenChamber 已安裝',
'shareOpinion.actions.shareOpinion': '分享意見',
'shareOpinion.actions.bookCall': '預約通話',
'shareOpinion.actions.shortSurvey': '簡短問卷',
'shareOpinion.dialog.title': '分享你的意見',
'shareOpinion.toast.title': '協助塑造 OpenChamber',
'shareOpinion.toast.description': '告訴我們哪些有用、令人困惑或缺少什麼,協助塑造下一步。',
'sessions.sidebar.footer.actions.shareOpinion': '分享意見',
'layout.mainTab.chat': '聊天',
'layout.mainTab.plan': '計畫',
'layout.mainTab.diff': '差異',
@@ -30,6 +38,50 @@ export const dict: Record<I18nKey, string> = {
'layout.mainTab.terminal': '終端機',
'layout.mainTab.context': '上下文',
'mobile.nav.aria': '行動導覽',
'mobile.connect.welcome.title': '連線至 OpenChamber',
'mobile.connect.welcome.description': '新增伺服器網址或掃描配對 QR 碼,即可開始使用行動應用程式。',
'mobile.connect.url.label': '伺服器網址',
'mobile.connect.url.placeholder': 'http://192.168.1.74:2606',
'mobile.connect.token.label': '用戶端權杖',
'mobile.connect.token.placeholder': '貼上存取權杖',
'mobile.connect.token.hint': '僅當伺服器需要權杖而非密碼時才需要填寫。',
'mobile.connect.password.label': '密碼',
'mobile.connect.password.placeholder': 'OpenChamber 密碼',
'mobile.connect.connectButton': '連線',
'mobile.connect.unlockButton': '解鎖並連線',
'mobile.connect.cancelPassword': '使用其他伺服器',
'mobile.connect.connecting': '連線中...',
'mobile.connect.scanQr': '掃描 QR code',
'mobile.connect.welcome.scanHint': '在電腦上開啟「新增裝置」顯示 QR 代碼,然後在這裡掃描。',
'mobile.connect.advanced': '進階',
'mobile.connect.manual.toggle': '透過位址連線',
'mobile.connect.scan.permissionDenied': '相機存取已關閉。請在「設定」中開啟以掃描 QR code。',
'mobile.connect.scan.failed': '無法掃描該 QR code。請重試或手動輸入網址。',
'mobile.connect.scan.invalid': '此 QR code 不是 OpenChamber 連線代碼。',
'mobile.connect.scan.unsupported': 'QR code 掃描僅在已安裝的行動應用程式中可用。',
'mobile.connect.saved.title': '已儲存的連線',
'mobile.connect.saved.empty': '尚未儲存任何連線。',
'mobile.connect.relay.badge': '透過 OpenChamber Relay 連線',
'mobile.connect.error.urlRequired': '請輸入伺服器網址。',
'mobile.connect.error.invalidUrl': '該伺服器網址無效。',
'mobile.connect.error.unreachable': '無法連線至該 OpenChamber 伺服器。',
'mobile.connect.error.authRequired': '此伺服器需要密碼或用戶端權杖。',
'mobile.connect.error.passwordFailed': '無法解鎖該伺服器。請檢查密碼。',
'mobile.instances.addTitle': '新增執行個體',
'mobile.instances.addManual': '透過位址新增',
'mobile.instances.editTitle': '編輯執行個體',
'mobile.instances.edit': '編輯',
'mobile.instances.delete': '刪除',
'mobile.instances.deleteAria': '刪除 {label}',
'mobile.instances.confirmDeleteAria': '確認刪除 {label}',
'mobile.instances.cancelDeleteAria': '保留 {label}',
'mobile.instances.cancelEdit': '取消',
'mobile.instances.label.label': '名稱',
'mobile.instances.label.placeholder': '選填顯示名稱',
'mobile.instances.saveNew': '儲存執行個體',
'mobile.instances.status.connectedDirect': '已連線 · 區域網路',
'mobile.instances.status.connectedRelay': '已連線 · 私人中繼',
'mobile.instances.saveEdit': '儲存變更',
'mobile.nav.changes': '變更',
'mobile.nav.settings': '設定',
'mobile.surface.closeAria': '關閉',
@@ -42,6 +94,7 @@ export const dict: Record<I18nKey, string> = {
'mobile.menu.files': '檔案',
'mobile.menu.changes': '變更',
'mobile.menu.mcp': 'MCP',
'mobile.menu.instances': '執行個體',
'mobile.menu.update': '更新',
'mobile.menu.settings': '設定',
'mobile.sessions.newChatCta': '在 {project} 中新增聊天',
@@ -253,6 +306,10 @@ export const dict: Record<I18nKey, string> = {
'sessions.scheduledTasks.editor.prompt.placeholder': '總結未完成任務並給出下一步建議',
'sessions.scheduledTasks.editor.enabled.aria': '啟用任務',
'sessions.scheduledTasks.editor.enabled.label': '已啟用',
'sessions.scheduledTasks.editor.goal.label': '作為目標執行',
'sessions.scheduledTasks.editor.goal.aria': '將此任務作為代理持續推進直至完成的目標執行',
'sessions.scheduledTasks.editor.goal.budgetLabel': '權杖預算',
'sessions.scheduledTasks.editor.goal.budgetAria': '以權杖預算限制該目標',
'sessions.scheduledTasks.editor.actions.closeAria': '關閉',
'sessions.scheduledTasks.editor.actions.cancel': '取消',
'sessions.scheduledTasks.editor.actions.save': '儲存',
@@ -343,6 +400,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.actions.searchSessions': '搜尋會話',
'sessions.sidebar.header.actions.exitSelection': '退出選取',
'sessions.sidebar.header.actions.selectSessions': '選擇會話',
'sessions.sidebar.header.actions.sortProjects': '排序專案',
'sessions.sidebar.header.actions.sessionDisplayMode': '會話顯示模式',
'sessions.sidebar.header.displayMode.label': '顯示模式',
'sessions.sidebar.header.displayMode.default': '預設',
@@ -351,6 +409,11 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.header.displayMode.showArchived': '顯示已封存會話',
'sessions.sidebar.header.displayMode.collapseAll': '全部摺疊',
'sessions.sidebar.header.displayMode.expandAll': '全部展開',
'sessions.sidebar.header.projectSort.manual': '手動',
'sessions.sidebar.header.projectSort.aToZ': 'A → Z',
'sessions.sidebar.header.projectSort.zToA': 'Z → A',
'sessions.sidebar.header.projectSort.dateAdded': '最新',
'sessions.sidebar.header.projectSort.recent': '最近',
'sessions.sidebar.header.search.matchCountSingle': '{count} 個符合',
'sessions.sidebar.header.search.matchCountPlural': '{count} 個符合',
'sessions.sidebar.header.search.escapeHint': '按 Esc 清除',
@@ -395,6 +458,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.project.actions.projectMenu': '專案選單',
'sessions.sidebar.project.actions.newSession': '新增會話',
'sessions.sidebar.project.actions.closeProject': '關閉專案',
'sessions.sidebar.project.actions.edit': '編輯',
'sessions.sidebar.project.actions.newDraftSession': '新增草稿會話',
'sessions.sidebar.session.menu.rename': '重新命名',
'sessions.sidebar.session.rename.save': '儲存會話名稱',
@@ -1183,6 +1247,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.state.loadingRepositoryStatus': '正在載入儲存庫狀態...',
'diffView.state.notGitRepository': '目前不是 Git 儲存庫。請在 Git 標籤中初始化或切換目錄。',
'diffView.state.cleanWorkingTree': '工作區乾淨,沒有可顯示的改動',
'diffView.state.noLastTurnChanges': '沒有可顯示的上一輪變更',
'diffView.state.failedToLoadDiff': '載入差異失敗',
'diffView.state.loadingDiff': '正在載入差異...',
'diffView.state.loadingChanges': '正在載入變更...',
@@ -1192,6 +1257,7 @@ export const dict: Record<I18nKey, string> = {
'diffView.summary.changedFilesPlural': '{count} 個檔案已變更',
"diffView.scope.changed": "已變更",
"diffView.scope.staged": "已暫存",
"diffView.scope.lastTurn": "上一輪",
"diffView.scope.selectorAria": "選擇變更模式",
'diffView.actions.retry': '重試',
'diffView.actions.renderAnyway': '仍然渲染',
@@ -1208,12 +1274,20 @@ export const dict: Record<I18nKey, string> = {
'diffView.reviewDialog.title': 'Review changes',
'diffView.reviewDialog.description': 'Start a separate review session for the current changes.',
'diffView.reviewDialog.generateHandoff': 'Generate handoff',
'diffView.reviewDialog.autoReview': '執行自動審查循環',
'diffView.reviewDialog.info': 'This flow works best if started in the session where the changes were implemented.',
'diffView.reviewDialog.actions.cancel': 'Cancel',
'diffView.reviewDialog.actions.start': 'Review',
'diffView.reviewDialog.actions.starting': 'Starting...',
'diffView.reviewDialog.toast.noSessionDirectory': 'Session directory is unavailable',
'diffView.reviewDialog.toast.startFailed': 'Failed to start review flow',
'chat.history.loadOlder': '載入更早的訊息',
'chat.autoReview.title': '程式碼審查循環執行中',
'chat.autoReview.status.waitingForReviewer': '等待審查者',
'chat.autoReview.status.waitingForImplementer': '等待實作者',
'chat.autoReview.reviewSessionLabel': '審查工作階段',
'chat.autoReview.actions.open': '開啟',
'chat.autoReview.actions.stop': '停止',
'diffView.hunk.label': '程式碼區塊',
'diffView.hunk.stage': '暫存',
'diffView.hunk.unstage': '取消暫存',
@@ -1309,6 +1383,43 @@ export const dict: Record<I18nKey, string> = {
"header.actions.toggleChangesPanelAria": "切換變更面板",
'header.actions.planWithShortcut': '計畫({shortcut})',
'header.actions.terminalPanelWithShortcut': '終端機面板({shortcut})',
'chat.recap.aria': '工作階段回顧',
'chat.recap.label': '回顧:',
'chat.goal.dialog.titleCreate': '設定工作階段目標',
'chat.goal.dialog.titleManage': '工作階段目標',
'chat.goal.dialog.objectiveLabel': '目標',
'chat.goal.dialog.objectivePlaceholder': '描述代理應達成並驗證的最終狀態…',
'chat.goal.dialog.budgetLabel': '權杖預算',
'chat.goal.status.active': '進行中',
'chat.goal.status.evaluating': '評估中…',
'chat.goal.status.paused': '已暫停',
'chat.goal.status.blocked': '已受阻',
'chat.goal.status.budgetLimited': '已達預算',
'chat.goal.status.complete': '已完成',
'chat.goal.usage.tokens': '{used} 權杖',
'chat.goal.usage.tokensWithBudget': '{used}/{budget} 權杖',
'chat.goal.usage.turns': '{turns} 次續跑',
'chat.goal.action.pause': '暫停',
'chat.goal.action.resume': '繼續',
'chat.goal.action.markComplete': '標記為完成',
'chat.goal.action.clear': '移除目標',
'chat.goal.action.cancel': '取消',
'chat.goal.action.save': '儲存目標',
'chat.goal.action.start': '啟動目標',
'chat.goal.toast.actionFailed': '目標更新失敗',
'chat.goal.row.aria': '工作階段目標 — 開啟詳細資訊',
'chat.goal.button.createAria': '設定工作階段目標',
'chat.goal.button.manageAria': '管理工作階段目標',
'chat.goal.button.armAria': '用下一則訊息啟動目標',
'chat.goal.counter.aria': '目標長度限制',
'chat.goal.button.disarmAria': '目標已就緒 — 點按取消就緒',
'chat.goal.button.cancelAria': '目標進行中 — 點按取消',
'chat.goal.cancelDialog.title': '取消此目標?',
'chat.goal.cancelDialog.description': '代理將停止自動朝此目標工作。',
'chat.goal.cancelDialog.keep': '保留目標',
'chat.goal.cancelDialog.confirm': '取消目標',
'chat.suggestion.applyAria': '使用建議的訊息',
'chat.suggestion.dismissAria': '關閉建議',
'header.actions.toggleTerminalPanelAria': '切換終端機面板',
'terminalView.stream.processExitedMessage': '\r\n[處理程序已結束{exitCodeSegment}{signalSegment}]\r\n',
'terminalView.stream.processExitedWithCode': ',結束代碼 {exitCode}',
@@ -1690,6 +1801,7 @@ export const dict: Record<I18nKey, string> = {
'chat.queuedMessage.edit': 'edit',
'chat.queuedMessage.send': 'send',
'chat.queuedMessage.removeAria': '從佇列移除',
'chat.queuedMessage.reorderAria': '拖曳以重新排序',
'chat.container.returnToParent.aria': '返回父會話',
'chat.container.returnToParent.titleNamed': '返回到:{title}',
'chat.container.returnToParent.title': '返回父會話',
@@ -1794,6 +1906,18 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.placeholder.chat': '@ 用於檔案/Agent;/ 用於命令;! 用於 shell;# 用於程式片段',
'chat.chatInput.placeholder.chatCompact': '使用 @ / ! # 輔助',
'chat.chatInput.placeholder.selectSession': '選擇或建立會話以開始聊天',
'chat.dictation.start': '開始語音輸入',
'chat.dictation.overlayAria': '語音輸入',
'chat.dictation.downloadingModel': '正在下載語音模型...',
'chat.dictation.downloadingModelProgress': '正在下載語音模型... {percent}%',
'chat.dictation.listening': '正在聆聽...',
'chat.dictation.processing': '正在轉寫...',
'chat.dictation.failed': '轉寫失敗',
'chat.dictation.cancel': '放棄語音輸入',
'chat.dictation.insert': '插入文字',
'chat.dictation.insertAndSend': '插入並傳送',
'chat.dictation.retry': '重試轉寫',
'chat.dictation.discard': '放棄錄音',
'chat.snippetAutocomplete.action.addNew': '+ 新建程式片段',
'chat.snippetAutocomplete.empty': '未找到程式片段',
'chat.snippetAutocomplete.footer': '↑↓ 導航 • Enter 選擇 • Esc 關閉',
@@ -1829,6 +1953,9 @@ export const dict: Record<I18nKey, string> = {
'chat.chatInput.previewContextRemove': '移除預覽上下文',
'chat.chatInput.projectRoot': '專案根目錄',
'chat.chatInput.branch': '分支',
'chat.chatInput.draftPicker.projectTitle': '專案',
'chat.chatInput.draftPicker.searchProjects': '搜尋專案...',
'chat.chatInput.draftPicker.searchBranches': '搜尋分支...',
'chat.chatInput.worktrees': 'Worktree',
'chat.chatInput.worktreeNew': '+ 新增',
'chat.chatInput.drop.insertMention': '放開以插入為提及',
@@ -1854,6 +1981,11 @@ export const dict: Record<I18nKey, string> = {
'chat.toolOutputDialog.image.closeAria': '關閉圖片預覽',
'chat.toolOutputDialog.mermaid.missingSource': '缺少 Mermaid 來源 URL。',
'chat.toolOutputDialog.mermaid.loadFailed': '無法載入 Mermaid 圖表。',
'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'Mermaid 資料 URL 格式不正確。',
'chat.toolOutputDialog.mermaid.invalidLocalPath': 'Mermaid 本機檔案路徑無效。',
'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': '無法讀取 Mermaid 檔案。狀態:{status}。',
'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': '不支援此 Mermaid URL 通訊協定。',
'chat.toolOutputDialog.mermaid.loadFailedWithStatus': '無法載入 Mermaid 圖表。狀態:{status}。',
'chat.toolOutputDialog.mermaid.closeAria': '關閉圖表預覽',
'chat.toolOutputDialog.mermaid.loading': '正在載入圖表...',
'chat.toolOutputDialog.mermaid.renderFailed': '無法渲染 Mermaid 圖表。',
@@ -1868,6 +2000,9 @@ export const dict: Record<I18nKey, string> = {
'chat.toolPart.output': '輸出',
'chat.toolPart.showRawJson': '顯示原始 JSON',
'chat.toolPart.showFormattedJson': '顯示格式化 JSON',
'chat.toolPart.showNavigableJson': '顯示可導覽 JSON',
'chat.toolPart.openFileAtFirstChange': '在首次變更處開啟檔案',
'chat.toolPart.openFileDiff': '開啟檔案差異',
'chat.toolPart.copyOutput': '複製輸出',
'chat.toolPart.copiedOutput': '已複製輸出',
'chat.toolPart.copyOutputFailed': '複製輸出失敗',
@@ -1961,6 +2096,7 @@ export const dict: Record<I18nKey, string> = {
'chat.modelControls.noProvidersOrModelsFound': '沒有供應商或模型符合你的搜尋。',
'chat.modelControls.reorderFavoriteAria': '重新排序最愛',
'chat.modelControls.reorderFavoriteTitle': '拖曳以重新排序最愛',
'chat.modelControls.reorderProviderTitle': '拖曳以重新排序供應商',
'chat.modelControls.permissionLabel.custom': '自訂',
'chat.modelControls.permissionLabel.allow': '允許',
'chat.modelControls.permissionLabel.deny': '拒絕',
@@ -2201,7 +2337,7 @@ export const dict: Record<I18nKey, string> = {
'sessionAuth.error.networkTitle': '無法連線伺服器',
'sessionAuth.error.rateLimitDescriptionSingle': '請等待 {minutes} 分鐘後再試。',
'sessionAuth.error.rateLimitDescriptionPlural': '請等待 {minutes} 分鐘後再試。',
'sessionAuth.error.networkDescription': '無法驗證 UI 會話。請檢查服務是否執行後重試。',
'sessionAuth.error.networkDescription': '無法驗證 UI 會話。如果你是從本機網路中的其他裝置開啟 OpenChamber,請在桌面應用程式中啟用 Desktop Network Access,並使用設定中顯示的 LAN 位址。',
'sessionAuth.error.retry': '重試',
'sessionAuth.error.passkeySetupFailed': 'Passkey 設定失敗。',
'sessionAuth.error.incorrectPassword': '密碼錯誤,請重試。',
@@ -2481,9 +2617,14 @@ export const dict: Record<I18nKey, string> = {
'updateDialog.status.downloading': '下載中...',
'updateDialog.actions.restartToUpdate': '重新啟動以更新',
'updateDialog.actions.updateNow': '立即更新',
'updateDialog.actions.openMobileUpdate': '開啟更新',
'updateDialog.status.updating': '更新中...',
'updateDialog.error.updateFailed': '更新失敗',
'updateDialog.error.takingLonger': '更新耗時超出預期。請稍等後重新整理,或執行:openchamber update',
'mobileUpdate.toast.available.title': 'OpenChamber 更新可用',
'mobileUpdate.toast.available.description': '版本 {version} 已可用於 Android。',
'mobileUpdate.toast.actions.download': '下載',
'mobileUpdate.toast.actions.dismiss': '忽略',
'opencodeUpdate.toast.available.title': 'OpenCode 更新',
'opencodeUpdate.toast.available.description': '版本 {version} 可安裝。',
'opencodeUpdate.toast.actions.update': '更新',
@@ -2559,12 +2700,19 @@ export const dict: Record<I18nKey, string> = {
'mainLayout.mobile.closeDrawerAria': '關閉抽屜',
'sortableTabsStrip.aria.tabs': '分頁',
'openChamberLogo.aria.logo': 'OpenChamber 標誌',
'markdownRenderer.code.actions.copyTitle': '複製程式碼',
'markdownRenderer.code.actions.copiedTitle': '已複製',
'markdownRenderer.table.actions.copyTitle': '複製表格',
'markdownRenderer.code.actions.enableWrapTitle': '啟用自動換行',
'markdownRenderer.code.actions.disableWrapTitle': '停用自動換行',
'markdownRenderer.table.actions.downloadTitle': '下載表格',
'markdownRenderer.table.toast.downloadedAsFormat': '表格已下載為 {format}',
'markdownRenderer.mermaid.actions.copyTitle': '複製',
'markdownRenderer.mermaid.actions.copySourceTitle': '複製原始碼',
'markdownRenderer.mermaid.actions.downloadSvgTitle': '下載 SVG',
'markdownRenderer.mermaid.actions.zoomInTitle': '放大',
'markdownRenderer.mermaid.actions.zoomOutTitle': '縮小',
'markdownRenderer.mermaid.actions.resetViewTitle': '重置檢視',
'markdownRenderer.mermaid.toast.downloadFailed': '下載圖表失敗',
'contextPanel.preview.title': '預覽',
'contextPanel.preview.description': '使用專案操作或終端機 Preview 按鈕開啟預覽。',
+8 -4
View File
@@ -1,10 +1,10 @@
export type Locale = 'en' | 'fr' | 'zh-CN' | 'zh-TW' | 'uk' | 'es' | 'pt-BR' | 'ko' | 'pl';
export type Locale = 'en' | 'fr' | 'zh-CN' | 'zh-TW' | 'uk' | 'es' | 'pt-BR' | 'ko' | 'pl' | 'ja';
export const LOCALES = ['en', 'fr', 'zh-CN', 'zh-TW', 'uk', 'es', 'pt-BR', 'ko', 'pl'] as const satisfies readonly Locale[];
export const LOCALES = ['en', 'fr', 'zh-CN', 'zh-TW', 'uk', 'es', 'pt-BR', 'ko', 'pl', 'ja'] as const satisfies readonly Locale[];
export const DEFAULT_LOCALE: Locale = 'en';
export const LOCALE_LABEL_KEYS: Record<Locale, 'common.language.english' | 'common.language.french' | 'common.language.simplifiedChinese' | 'common.language.traditionalChinese' | 'common.language.ukrainian' | 'common.language.spanish' | 'common.language.brazilianPortuguese' | 'common.language.korean' | 'common.language.polish'> = {
export const LOCALE_LABEL_KEYS: Record<Locale, 'common.language.english' | 'common.language.french' | 'common.language.simplifiedChinese' | 'common.language.traditionalChinese' | 'common.language.ukrainian' | 'common.language.spanish' | 'common.language.brazilianPortuguese' | 'common.language.korean' | 'common.language.polish' | 'common.language.japanese'> = {
en: 'common.language.english',
fr: 'common.language.french',
'zh-CN': 'common.language.simplifiedChinese',
@@ -14,6 +14,7 @@ export const LOCALE_LABEL_KEYS: Record<Locale, 'common.language.english' | 'comm
'pt-BR': 'common.language.brazilianPortuguese',
ko: 'common.language.korean',
pl: 'common.language.polish',
ja: 'common.language.japanese',
};
export const LOCALE_STORAGE_KEY = 'openchamber.i18n.v1';
@@ -55,13 +56,16 @@ export function normalizeLocale(value: string | undefined | null): Locale {
if (normalized === 'ko' || normalized.startsWith('ko-')) {
return 'ko';
}
if (normalized === 'ja' || normalized.startsWith('ja-')) {
return 'ja';
}
if (normalized === 'pl' || normalized.startsWith('pl-')) {
return 'pl';
}
return DEFAULT_LOCALE;
}
export function readStoredLocale(): Locale | undefined {
function readStoredLocale(): Locale | undefined {
if (typeof window === 'undefined') {
return undefined;
}
+3 -1
View File
@@ -42,7 +42,9 @@ async function loadDictionary(locale: Locale): Promise<I18nDictionary> {
? await import('./messages/ko') as { dict: I18nDictionary }
: locale === 'pl'
? await import('./messages/pl') as { dict: I18nDictionary }
: { dict: enDict };
: locale === 'ja'
? await import('./messages/ja') as { dict: I18nDictionary }
: { dict: enDict };
dictionaries.set(locale, mod.dict);
return mod.dict;
}